diff --git a/bin/steps/python b/bin/steps/python
index e04d66cd7a5ecbeec48dc5c3d20755c3e894f88e..ee4a8030493890861f6f67380035efed4afa336d 100755
--- a/bin/steps/python
+++ b/bin/steps/python
@@ -67,7 +67,7 @@ if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_UPDATE* ]]; then
   rm -fr /app/.heroku/python/lib/python*/site-packages/pip-*
   rm -fr /app/.heroku/python/lib/python*/site-packages/setuptools-*
 
-  /app/.heroku/python/bin/python "$ROOT_DIR/vendor/get-pip.py" pip=="$PIP_UPDATE"
+  /app/.heroku/python/bin/python "$ROOT_DIR/vendor/pip-9.0.3/setup.py" install &> /dev/null
   /app/.heroku/python/bin/pip install "$ROOT_DIR/vendor/setuptools-39.0.1-py2.py3-none-any.whl"
 
 fi
diff --git a/vendor/get-pip.py b/vendor/get-pip.py
deleted file mode 100644
index 46a0f9c75ba9042f1239b9bb23f1621b4e3aa83b..0000000000000000000000000000000000000000
--- a/vendor/get-pip.py
+++ /dev/null
@@ -1,22373 +0,0 @@
-#!/usr/bin/env python
-#
-# Hi There!
-# You may be wondering what this giant blob of binary data here is, you might
-# even be worried that we're up to something nefarious (good for you for being
-# paranoid!). This is a base85 encoding of a zip file, this zip file contains
-# an entire copy of pip (version 9.0.2).
-#
-# Pip is a thing that installs packages, pip itself is a package that someone
-# might want to install, especially if they're looking to run this get-pip.py
-# script. Pip has a lot of code to deal with the security of installing
-# packages, various edge cases on various platforms, and other such sort of
-# "tribal knowledge" that has been encoded in its code base. Because of this
-# we basically include an entire copy of pip inside this blob. We do this
-# because the alternatives are attempt to implement a "minipip" that probably
-# doesn't do things correctly and has weird edge cases, or compress pip itself
-# down into a single file.
-#
-# If you're wondering how this is created, it is using an invoke task located
-# in tasks/generate.py called "installer". It can be invoked by using
-# ``invoke generate.installer``.
-
-import os.path
-import pkgutil
-import shutil
-import sys
-import struct
-import tempfile
-
-# Useful for very coarse version differentiation.
-PY2 = sys.version_info[0] == 2
-PY3 = sys.version_info[0] == 3
-
-if PY3:
-    iterbytes = iter
-else:
-    def iterbytes(buf):
-        return (ord(byte) for byte in buf)
-
-try:
-    from base64 import b85decode
-except ImportError:
-    _b85alphabet = (b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-                    b"abcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~")
-
-    def b85decode(b):
-        _b85dec = [None] * 256
-        for i, c in enumerate(iterbytes(_b85alphabet)):
-            _b85dec[c] = i
-
-        padding = (-len(b)) % 5
-        b = b + b'~' * padding
-        out = []
-        packI = struct.Struct('!I').pack
-        for i in range(0, len(b), 5):
-            chunk = b[i:i + 5]
-            acc = 0
-            try:
-                for c in iterbytes(chunk):
-                    acc = acc * 85 + _b85dec[c]
-            except TypeError:
-                for j, c in enumerate(iterbytes(chunk)):
-                    if _b85dec[c] is None:
-                        raise ValueError(
-                            'bad base85 character at position %d' % (i + j)
-                        )
-                raise
-            try:
-                out.append(packI(acc))
-            except struct.error:
-                raise ValueError('base85 overflow in hunk starting at byte %d'
-                                 % i)
-
-        result = b''.join(out)
-        if padding:
-            result = result[:-padding]
-        return result
-
-
-def bootstrap(tmpdir=None):
-    # Import pip so we can use it to install pip and maybe setuptools too
-    import pip
-    from pip.commands.install import InstallCommand
-    from pip.req import InstallRequirement
-
-    # Wrapper to provide default certificate with the lowest priority
-    class CertInstallCommand(InstallCommand):
-        def parse_args(self, args):
-            # If cert isn't specified in config or environment, we provide our
-            # own certificate through defaults.
-            # This allows user to specify custom cert anywhere one likes:
-            # config, environment variable or argv.
-            if not self.parser.get_default_values().cert:
-                self.parser.defaults["cert"] = cert_path  # calculated below
-            return super(CertInstallCommand, self).parse_args(args)
-
-    pip.commands_dict["install"] = CertInstallCommand
-
-    implicit_pip = True
-    implicit_setuptools = True
-    implicit_wheel = True
-
-    # Check if the user has requested us not to install setuptools
-    if "--no-setuptools" in sys.argv or os.environ.get("PIP_NO_SETUPTOOLS"):
-        args = [x for x in sys.argv[1:] if x != "--no-setuptools"]
-        implicit_setuptools = False
-    else:
-        args = sys.argv[1:]
-
-    # Check if the user has requested us not to install wheel
-    if "--no-wheel" in args or os.environ.get("PIP_NO_WHEEL"):
-        args = [x for x in args if x != "--no-wheel"]
-        implicit_wheel = False
-
-    # We only want to implicitly install setuptools and wheel if they don't
-    # already exist on the target platform.
-    if implicit_setuptools:
-        try:
-            import setuptools  # noqa
-            implicit_setuptools = False
-        except ImportError:
-            pass
-    if implicit_wheel:
-        try:
-            import wheel  # noqa
-            implicit_wheel = False
-        except ImportError:
-            pass
-
-    # We want to support people passing things like 'pip<8' to get-pip.py which
-    # will let them install a specific version. However because of the dreaded
-    # DoubleRequirement error if any of the args look like they might be a
-    # specific for one of our packages, then we'll turn off the implicit
-    # install of them.
-    for arg in args:
-        try:
-            req = InstallRequirement.from_line(arg)
-        except:
-            continue
-
-        if implicit_pip and req.name == "pip":
-            implicit_pip = False
-        elif implicit_setuptools and req.name == "setuptools":
-            implicit_setuptools = False
-        elif implicit_wheel and req.name == "wheel":
-            implicit_wheel = False
-
-    # Add any implicit installations to the end of our args
-    if implicit_pip:
-        args += ["pip"]
-    if implicit_setuptools:
-        args += ["setuptools"]
-    if implicit_wheel:
-        args += ["wheel"]
-
-    delete_tmpdir = False
-    try:
-        # Create a temporary directory to act as a working directory if we were
-        # not given one.
-        if tmpdir is None:
-            tmpdir = tempfile.mkdtemp()
-            delete_tmpdir = True
-
-        # We need to extract the SSL certificates from requests so that they
-        # can be passed to --cert
-        cert_path = os.path.join(tmpdir, "cacert.pem")
-        with open(cert_path, "wb") as cert:
-            cert.write(pkgutil.get_data("pip._vendor.requests", "cacert.pem"))
-
-        # Execute the included pip and use it to install the latest pip and
-        # setuptools from PyPI
-        sys.exit(pip.main(["install", "--upgrade"] + args))
-    finally:
-        # Remove our temporary directory
-        if delete_tmpdir and tmpdir:
-            shutil.rmtree(tmpdir, ignore_errors=True)
-
-
-def main():
-    tmpdir = None
-    try:
-        # Create a temporary working directory
-        tmpdir = tempfile.mkdtemp()
-
-        # Unpack the zipfile into the temporary directory
-        pip_zip = os.path.join(tmpdir, "pip.zip")
-        with open(pip_zip, "wb") as fp:
-            fp.write(b85decode(DATA.replace(b"\n", b"")))
-
-        # Add the zipfile to sys.path so that we can import it
-        sys.path.insert(0, pip_zip)
-
-        # Run the bootstrap
-        bootstrap(tmpdir=tmpdir)
-    finally:
-        # Clean up our temporary working directory
-        if tmpdir:
-            shutil.rmtree(tmpdir, ignore_errors=True)
-
-
-DATA = b"""
-P)h>@6aWAK2mnzTaZDN}?<h79005;f000jF003}la4%n9X>MtBUtcb8d7WB&Z{s!+|KFd2buN%}wbgj
-<)yvgId%GzbAl(GXZhJu15M+zC*~pSgN>04J`|dY0e2B7?bXynQ$Ras29M1gaL7#l~MWf^wOHq8mi#@
-9j^|mZVYgz7ClB}D$kvvJ5*j1&hS-MnZ-qbwN-$x_!J}*~k&f9OBjVLzuYpL8*RadE0ZsKDq3z(=J9d
-&SXB_EAW*sHVI-=}APpU(clmZ_A7Z!*3VX%UxlbIux>=VJL6Hj8I}Woef23^|ChNOPu|ipZ=>$yB*|P
-!piGY-%RfOceX_0Vanc=CRot&!PzvAd<*)CX{M8ORapYE}5z`E+wueYCue=A^?r-Q<10390-BPzcgIc
-iZ#WmEHa@*$q$BwvH}N66Jao`mSPFSc4gM&e8S-CX2T^h-3nzT0OIeq+{v?)JcZ?NE^ek@vYJ?iOTJ1
-Q#aX!qay3jg5|>R~HFd<&A_I}x&yA{Cm8YVBH${0sa`0S~atB&#RJy^PT(Ydh-94s7jpRyHuMs*`?7(
-5;MG0Ia%Xr0$j2Ei|>ADit1gQZ5pn~gZb)J`xQ<4ZZSCD|7_!FS5MZ<HGTq&B-?!L;FFf-2;+i|U#Ey
-z)qc&HqO<?t8yb6RK3ZH?l@`<05dLF2b%58{?GHfIs@rxhooQFhrIx1*ml|B<!RcrEgpOZzn(iw$g*k
-0)%E)_haS!@RdRV(bJI@=J>5{1bO75yj7ZRg<{-*w`IkfwR4nX`!^UDaKO?<^vB^sgwXKLp{~o6xDwK
-dXlfX1ZG?@v~$oKZ3Lbland&3b9N{jmV#n<p@4jbyy?BDCv00j@;w~lBL`w-0lchuS*g`*&T5q^t{Fe
-_0Eo$^AWJL@wo6yncVu2TF&7267ErqeJ>1=0q0QB0$;#YtE;87~yQ{nXEPger<>7q9;A8z?<s*F{?2_
-JGNLflfrAn0=@mz7UV$DK;ix_OVhJ)X+`J9cjR6dGgjMC5~`vJP~_07dw5GeWa;`Z+H`fc*|{SW`XxM
-g3lv!~hF*%|!5j?VG0tmL!!ES@<sPE`AO)}oA8yFJmd*7jH(4YSYC+vtQ{-_b+VWkp+e>zoSQ?z$XeZ
-CZ&a>M}7xh0&;WfxgLK7ODmxP4T6X<aN2*ff~)X8&T0yOQfkq?$&QOvLhNiOERHQ0S&R3&|oFY%`<BO
-KqO!nPM$Danh2F}Ku<)~b`5y3<A$cY;}Ui)(j2g(S%MKOBCt$9rm1v3=aw(QfGPG!OXYQ0ti|S<6mdf
-%6ZXE!K#*edhOg5muhsWFuf9WQtikPDVk@ni&h}LU@1)>n!%FNRF37}AeSWe14r*J~zXzw_(CFZAb=a
-|Bg*XHD0?@SMg${u0JbmC_qW=L{Zquqd;G}ox-)r#%;E}QlNaX@HPy+^Rd108KkMBhaset|tslXKR=#
-e9)5SBxjOLL)g$l@rwi)LfH8@Jb8rX#c(BQQvmUx_^uLI45D0Pz$Y9bwR8DIXYEPQ?)g35fuJl&BlBm
-e{5Wq*X_G)IPHL@fdBJGh;5e69C`LqMYJ&Q^nQ6p;=b0C`zy4<tRzaGEf3w%|8JiUX4NBnC^gC&28Qj
-!}(v)yD&+LbO-rUgp9uznGR3G2d4qW9QW@DIm6_D<tXE8mNs<>CRXLV=Aprr@px?9n|7*|!^|vvM594
-TcbF%bVdFhvyFx`ojWP>JLBI{2ZFgqHBbs+nphvUi0fJZ~S2}!9<f91Fa#vf3^h~X!s3@~Z)po)@sx8
-K~wNP6iXm&w=PuLquR_rb@G&CqGqzL$)xWOSKoy6ayfUM2NlHlg@Ci(XLyX)lj^$#~!7w;|tGDF<IiX
-k%=vMgHI1-NZwL0?y3rWu-AJMTU~BFRtJw{Px(MXah^)M0c#J72UbU;zMh*jw}(R|N~L+D_1cGnVMlb
-Hnmp)0wiFCTjyHq#sXS-0Ut50(}_%Va?e+xCk9O{6#!PC?k*SAX^w|My+?<FU$$F<oa^AW8@9E?2(u~
-A_t>BI0E|W$+fsY`^}B@X}<-V8kvNF3>MS{=`z$TXv~Rz8Ad(1?XIjr98qpr!Xf}mz&uKd&RGD~S_M8
-OOihcjLvWZV<}7;oQ9y^hhChML%%W%60_2*yi?GqeUJ9U!wA&QsE%Q(21wq_`fLt1_-`GtIuc3Z<6!k
-U?romBm(lU1jVL$l_)o+ME3E(tuKPV`QY;EnCBqF4ZCYYhl-^qp_NnkdGOX3H9@Wstny7aMQ)~SsPfl
-KyDbv6}aP%5&}66nf*f_$+KqIig>t`ER1pRhF^!7^PvU`XphZC8`)c41#EUso?o!%rm<TX1sJ8~2TCz
->o02{EX!O$W#{I30ffd91cE&FBtg}_?zI-6`K%BYJ6Lya-;f!*ge6NuII<vNn=euK}%0yv%}}KCKl*K
-?6bM+FvNH7Z*Fcc?(UNBFRpGDBhQU=K*hQk)Wr9qY!rA9IoDda7J|~@*p>G^Z^pH_SAxMOgYm&Uhyb-
-{TTdM`Yq5IKQy*&YX~Omqtuv1<@DesYS-W*?7Xw=|^C7}oz!wD+|AP!497B9MV)x*?kf9Z|9L=erCAa
-IkmWWmWisLz(n+X=pTd}ogF;H6T8jxCU#cE5v6hU6KQO7=F=*<RPw`B`9352_46nTZ4qAjvpP65h7O|
-0`C6F;n6x;)0zxZqH5D~OOjqCNwan6nHH^<dQ6lJM=GR4tg3#*S@d*;H!LBVf_0??KTJv#`_*YIBY{a
-+HKHwFeLQ@iT_cNzP+$Z-qrtgYN1nOnkc2>Vped5dU0?BD{ZU9n6;s{bbN^Bfa?!@=<a;lo{A=1Aa>$
-9zjdLIza+zkOdI*KNP1})3UD&_pjN#F_c9xY3HX|mf$uMJqRnmOTpm08Eac!!q|)DC!lG&3XvGa*yQC
-h&3%q26^z)T+phZGQBKsae#1Zi*=;)VCdUv)5CO5D0QC<PV^A?A=$E0f5U8<|>R|)nLh3ZQO6x5wlPG
-2Q-1l^;@GsOzn21A-6m_`T5)IrK3&>Lg$nZDRJ!*K20(Qzmw|B2VoA^Ra=;Y1V{rO)OM(z{pYGU!R;R
-TnFTKOOk?<~Hz1!TN~N;>hKF!Tlu89gvDJL&8S?V+>Ua*6!&i3xw^3{xG#q>`j0e{uH09*Xi&*_~)hw
-xOG{L#in;XW+V&ve|}><}R-XPDgn@&GXhFE(O7YeGY$4r?38@K>4J5F=0O&zlSG^c*oQi9b4+q1TQi!
-?Y%de&=r<hXWW&(pteHFD9*bkJ(%Vj^}H=>$eGPl%$XH?!K^1%<B}`zLtUZ@WmTQh6#?A}VAR(wXWa*
-(c!h;sIb>H}kGfxf;Q!c+1>?q(!?+ZiS%3jh1f`fWo|{+1=p2q?I<3WyLpC%2TQFgPP2u5jI>jm&pDy
-2CzAMXI1-4wXf+aR~cL)Kch0i9T7ztB8h4>NWNlO8{G1>~~kJhzL4Gp*H)Htav!j6bpANJ}$aBNj)Aa
-(pGMa{!5dPL7p1Q^Oi!4<E%lPEwqi4c1J`(OG)-Z%YP2O|P?<0l{|CTHzFF^O~EFdcMd9vyPdi*`7|!
-I_r|SQQ;}8J3T_R;>*oz-k}gxq{f2WMl<)<F*{~Q~p+%O@mi4^TCd0XlZzP!cJ`nDw+bp$&qE_Q#D4s
-uuIy+1rHgSbaNq~V>6jxmmZe-7GuZpa>CN0Wgc&t3edgZwuX#hYI6pl7`3nu4vd;3XT?+ji-E2xofc`
-1*5bYG-<a32<hyduj}>8%%f6ks`8Mg;^3_8kRG9-@Wj>VIcfgO*1b1BH>C}#m@wmwOTOGE`Fk*D1uw#
-Zdf+KO9W1l2)S1B5{6m?Hp!e;MicJR2T29{Bw&L0{8v$BzX58qwtns&3oGNj%@u-j~zZj~w%Ufi1408
-3)lCVHMV^KJ`sG|(CAsoG*q8!Y@zlD*BKE4HUq4^Ft01|`N9x3|}~=Me73U~(|GhbZmb7ZGLFh9b`Kr
-W#|WzBb1^x}uvr$?@i}%rKiK1Bh%J+^oeqz}}z4c500JNiq)KcwaY$hvKz<3eAhF*U7h6SAgF^M>S@&
-RZpijvP2*T7FfQem|sI#w34aXq8*uG?1f-EN#6~8<e4W9o-E`6%VrafFR__T(T@0?DqUa!AIe@dwef`
-U$j@AQEeZ!Kp*8pUk&{`wFgd1mQPXcAuW(c72Ib_Be{ePX2~0va^*R5@sn-ntzsgg<)9+;Ykr%hR!o^
-FPuw3Ge9k`?Mj5S`kfcBCkR6Ji#n6_>xia{6VYHUK{!)i4TBQJp9g4kfciwAB1NWgpexBJ=>g)w*a)|
-p^=8QtTf7B<0#gycjNXH~G%PzF;Oe#kzL{$#8x$uKn=m=?Y|`;fK&(E?iW4e4sf0h}|Z6)XX$GZ?ONr
-Ed!--Y*amynR+t*Z57YY0D1$r2}?Qdvypk`0RqHbzyJkUUzfoUJ@S7<)2(7vOQiu*d1SR>LwlK1^7D!
-T#da#Zn|xu6Q~;?z4Ic-_s4oS)!O2Jv2naBT&R`k_;lIW&im2za1S_-+}q%I*c->sSd$=62U*PzY(O;
-TiADJM<Lf&_(3)f2H(}#pa@b&{U&WXnYg0Jw=wb;0<Z0Dg-0w(gCD9Fn{~C@BM|$D$_iQ?NT{gLHs%H
-?!<PIVQP_0TO>QWwBONCkkYOD4@K0$12p*Ce27U1NBefAmqL@|O-))u)<syZgspX=GH&TQO3@7D~^PW
-?SRv7M_l(8cuJ83kbB_&YU7#A#3`;pBw$9WrH1+acQCkLPnRANY4ZUQF1B-o}E9Cs={W*NoOuI*H`Kd
-|}bQoFu36U%GpbkC?yqX=!0JtaZ23Hbb0zv&HcYsC?_y76BTP0|Uzt_fxsrhP`?SKbbC<y+sD4Ut9&=
-&@#jJf}_&+47D#ToB@j?fC~c{4*Ir&*Hi7f;R_C&;DNh0Ka7Zn9UOKB+CAdl^P@*WWq9VG@aSB=e8W5
-V6wts=VD9tJG3P?kYk_9EFIvc0Q|c5@elUE^@<|9m+yEuMyZp}&7r@RTh2!}C_6nWiSU0SX7LK0&B>_
-NZ1;>+a`1$bM0mSG5!ynj;ja(QWFl1S1!PX7vPOT4}m~*Pm!84zw=VwhX3y&Y)Plh+5Y3|W8?8I1i1!
-uz~pVvuCD){wO{SWb_^~>KN`a&wvl1A7KPSrQ3>V$7LbJPBNRu<p>pLa5l`1wHuBw(e}py8`b{IqXvQ
-lBfG%T=<Z-@(0@JKJm%%%m2pqja;&zSX?Ru8E7A(+XlCwFOd0bgKj8xABMUPl3+n+v#G>28_hZ;P21%
-G1ApW=-tDa9aEO?RSv3_rf~3N)<<Y-0H1lM0O$%~&V9;Fzt>-Bn72J#>^X;>Vj;qYF-Q|4FfH&K&W8F
-*pqTonQPdnubk{a9zk_g9GZki#i~k=`O9KQH0000808trnOiM|mWitT)07wD=01p5F0B~t=FJE76VQF
-q(UoLQYU6D^u!!QiR@BI{(c4&u2#~En{j$9G<D748MktQK_Rrc+%vy=^T%Afb1?O$w;Gbm*jTC!0J+?
---2&>tB6LPlNBO;hh9ZachS)9m2Y!fHTg19=I-g)>-5)UZy*_yg#11e(nC2o%NFCruN3-zSHly^kvv&
-4T)DAYEvR0g_9P5B)m%Bk#ZkBv#&T8)v!gq=!%TaNnmBwC!^Pymm5=^JN<Rn{!lZ)-EX3r%TmZmyuv}
-Iq2EIAVrX}O9;_Idv9nDfM$qcya`0Xv2D$IGq`vX2r{8mm$6DPhuttZLgQ^Uy%a*4?%@DN!8+)$eF#@
-6`to|>e<-@X_TBwIZv^)H;@Wb1=4di?Plpn;|NU2C%)Ny8rJE~SiK$#S29>XbnQuoOn|gWaxXKSuO9K
-QH0000808trnOoAAT^+OE+0ER9A01^NI0B~t=FJfVHWn*t`ZDDR?E^v9x8f%Z+HuC%a3PMF-Ip-)%it
-C33j9#*j)@ZuB*hkyLVnNUnZL5(bm6W{eEAroOh7XCNByW1?;|wG#Q8UBgyoY2E1n-&T<fPbcS)PzMV
-^YotJ_??(io@TcuF{;#APA0DqSz8jS9MhjPAN&ZWg#lUma@p|ic|f5bY#Y}V!clDwS6t5eUkg;u_&vO
-3CZpIBNI8`$Rj;jnU;2zc$)xlTI90%6s38>pDe%?i$Ah8KgU7Q!em9v6q<z-b&gZe8sX?J6;;hLp6^<
-eq<GA;f+Y>*w7lU`0+AMmKgGQ4&<)?S#0YXm7P+igmZ_P~geb&}+`+8=;1N0SGsFz~mEgOysO9@Q&63
-kpsNrcVrzkGAC96nR_%uo5>ZHh5>AHnng3guHg@x7-muf**>I?8&CctUFKIJP`XO;YpXXSYzwydgL`3
-nB4rD7I+&3~;^!M8lGW<<?HMLXoE51^}B(zr-?D@7%eo4b>fvzwb4IlI2Tyarw_zQ4Hq>4KWq9~alRc
-ke!&UHnKdE^q1i<=w@pmgUv;*^i6MyBqrcZt>xio-VEp&e61;7c4q!CQNuKxHgd)S@VjPqFB#Jjw{X5
-|8NRI-FUc>k#4*21XczE1M<-b;6;h@CxZcB=#C4tDH?Bh{PF1Mh*A(9xYeB8PmJy-4=|3CfvV<Krx9@
-ZL5+o!=4=bD2zGF!oYxvnSS)|xaWy?wQb8cVzbJC9-fIbt;tp)m1Xche=PZ+Y2qvSl5}a)%jE4b#s*Y
-d32G<3(C9s@eM!I8MhyeIN+=Q<nPNaESQ5s5~t!5;J7=Z$qs~HSm_|t|+KR&`Nzjgd!qS%}q6QmHSm#
-)K1P*w1K@<Ngqazb8^&?+#T&NLb>ed?jDtd;=xpp}O{CQA~!0SKx?5#X!kcu+W}WgDNp&tUDbNG$;cM
-QKvRlzM<xW&mX$TZm6b&7&e=9C|+B%i+tHjg+S?+85SXB$1n<&JqI4BPPg_svy-SmFAtSArX`fDh#Rt
-YAg#ipl4KSXjUG@tV}EAN8z-~FT`_{A{v)X0+A;1Em97hMa{bNb(ZiBSgtl4JU8cpWtRO00><q$Z3c<
-9>?1ciq>6CZk-P(G=xV60eq0Wl57Qy7L})ji=`35W!z?kfQ>inJaT~+N4DxX$QZDD{vNKYpTMj;`-W*
->txUkkXWqB)O5N+mRFYk22U0BEn|3<$QX&zcpC|pP=ppRfvRb?=p_UNQ5(gP<PT%?UPjikELv<ozUky
-7(0fxk*o(6sCn2B1p_vMi6WK-m<sl5-1NiCTgK=}}i-jxl`)&X92u10+Q6n7vxoI3S6N=4fU$XtP0Z7
-t2L;>{*8re*{rJUG24%H=qNP-rRhE`YVMzLJ%TdrI3{P;9Lrdj!%hS+zDIwfq9K7$)TCdH&O@-Haww)
-o0Gm}*>6C$c^uQH0qB~^kb+c*105#>g8dViz!3NNX+O-c!Rn<P{At@h?vm+OY6?sqhWq65e##-EY@wD
-$9v@*5EJyCQWz|>~fy_i$4X;p5=$Zs&55n?YJVK~Qqhld5R}!_X<OL+(vUb!Bo>Gh4Vz)s@muF0@r3p
-Cr=tPt+$cn{Pfs#heA%7Kzx^0<eX|?Z@Z$q9#S<!6g+_E$uo~?;?I1X!S>GcSCx`y(Sd&cR1CG$CXbK
-KKo#&<k}xq_eGU0*CNz73uw^7a4`Rcv-ipoJg6IJsWjE>7NkXpwm4%nIRSS@;AR<kPeFci+00qmYY>^
-UJ_B$6K&DQ53pU0Mj!i02Ds)Mj2!PUItYM4-Ao)bq=9Wz69HK$jFk%5UapGf>*DARDgwp<j_GTd|9uN
-x~e4@S*00|T8n|HspU@n9a1Y`ch}QFv&(NF`b|&R_3yyc+~Brvx~>`|sbtHHQ~s1nbSbLkf*w9l;{~v
-qN`D=QAkZ9Ub;7CbW(T1ZWH^OyL9elheqc`@aFyq3nqat543r>%fW<N<+=u?;#U+0+w%{FEPpbNxXI9
-Z~f=0O3v*Eg5gj=vEsOzV4V2RH#y-~SfjAd)QqdYgV!@nb(s+MY4K_^942&k8m8`UG}#5AfX-ADzd+I
-L#3`!65Hq|_MLeczr&k*w&EX`{7g1?$R-a@<xpV6awfO}PB~MEB;8mjWhXbo|d)zm7e>fA#M<a&}!*s
-_g{-=FbQK<0iH}PN@O3ur3H*Cw%uhud{3nH{luE1LCcy`5!4P-xo0~5Bs5&R~xv8N~zYBGl;&Sw*64|
-I`<<YHV!_ffv!D|KsEaIl1|&Q^bsGX(}Ti*N>8T}!t%Wh&1A`CirZYqZHP{$SO;#{juT}~ULMrMECH|
-qpqWINxTPu=$+D<6YLAKTAmL)^nCoVE$plxMKGGwm>bDKno`C+i;Q%HJsJWpit#jM#6tw^~ECs{fD(W
-h_O^TRf`_+Db1b_Wa5c?bUGCh^CoMDm;*kIY_|3JICXh?Gir>Yj3*<$VCAf_?|zs~Z1)8WMpM3{cZj4
-DyPD2g>lo5&#)B^9UwA8`v6DsPF;wa8%fE01-Di%;Du8F%RHZeyCSiu>cY4_L{DZ)fD|X}7|%IVQq~z
-U+gmeYJtM<Zbk|?&H8fb5%dqCGKoOA-LQt8#910G!M`-ur2W2r&eYhO|dT5f+d{n(e^ZAMBWj7(m)LB
-q*$o~fyXq<hG-?CC@mXGtSzep{_pJjMjG(#*Qf2+Pg)G)t?2FL>E$u0#2%~LHCIg>tfYj%kM4?R2<^5
-(tT)=eaqzXUQ<xa~D#0Z%jd(z;kP**!sQ}jDZBt~4rX3A-KDO8EYO$qpKe<|5(ThvExVXBzojl-f-J8
-iEDOLJP3Jo8;9;SEp^Wx_AhQ2$wU0hyhqGZzDF6vMl?%K?;02=)6*b7yQ74!`F0nN++CPeL(BZ;(94K
-!2&S+<Ah3JQnt<@avb6px+vgwuhpOog{77Af}M*>LEYoTyF-X|Et*LewR=$er5XZ|RfJay^YEpAiVqN
-kL{+ICQ$<$PY};+tg6UD7IaO<%XR;dg=-GeDU)SXU7EOX3etM|21tqEC?Afggtc3F_1ZO)BtEEQ8_x5
->TD~Ix!v5!IZrssX1|31;OnJ@5A`HKBCiG%VmB7Loan>1;Uh7^B!2hWU{9}5LWTh3ZD1NG)wqU}Gkd~
-EFl1tpgkCY3A$1i+=U7!aigEZIJBIRC5Ps%4A!*MRr~elV99)fiVEI{GP86AAJiJk}{-xZ0&-crMiDZ
-#OttslVdWP4_k_){h7o*{3nND?BLQeil#-9_Zo$fQI=p3y!01((Pu=+vy#D?ETJ`q@is+0u@4iBef<!
-5TPV`+wEtMC7zyIW~@UV3MuD%QB0pY9J*F0?J8jdg*_gb9Cw3P~R_4#X2oxaP>Md)zWw+gbXf0QTVG%
-W)8UT(gDr_|KWY-91$<Z5ZjZjK7{}LIXbSZSk6;^X5R<IgPhx!#0u}Yvg}nbWP(ehgw8uP_;8$lr?JA
-J-Y{KRiXE;lZ<mxwNe)_4qt6hKeL3HZVxc2@QkWcBS&#~@5Da;z=Yhe43FoaL4lq{Z4*P{!0kncEudU
-QgA}kTwEZ*|+|3aQ{8tGEq-0kCh@fsb<O4SuhK<J3AC^Enlk!O`uDOw#<!FA;?2P2*jRYOp&4=Y^f1d
-W#$)q!e+I4KoSw70z+lzgMRB!J7{g4PNWQw{RmL-sz={CH*Kwx!d2k5p)Mua^gmS>8w;q^CVZIV_PuK
-p}xSo-4v8T^pw`wMgzw@04N*f7%HBvYuwQ8o~*DLPB%+KGl3_EOjP{$w|O#w&Xs_<KY(;FUu%!SL|Ex
-vvFQP1LJb=KHG+lh8&&gD)Xms`!a+?UIyADl=%;v&^C5*ys(%`+n*W*C|ANu54dtW}NpLKK-H76JkZ6
-4)}0qv*&C$*b|Z`NOR5OH+%mE|9tW*4@(&}i-G5(>}z8y@jx}4{JW^hwuZ81o$esnR0KCGpl$)lx!DH
-NPrtu2zsZYGU0IPN+_L>r?QoDSXMl!#J*4@3h=O8sDuZvP6Y^pVPVL8`2xdgV&wCAdyX2|Y7YrX!{!T
-HBuK)zpia~O&myY+Sn(+XaM)Zvs7uS@xW>YEzmijklN`3K@YG?H?&K&g6_E$pO!|L2zuqoA!kgd7QwV
-P*1uw`nn(`}h4p{QElzop|ABqxGHyag{bi!gzQu(A|IDN_7sZ(_N^Hl6!$m7}U)T8j+b;l7FOcJzV#!
-`bqIVuZE`qdQChFxYsQCTFqE3!!dAA|xb7-P28G#s=FNJk#s)`p_$9JGXkfk-W9%dEdlmetv+yi$d{L
-i6U#kJH!4pBFoskee8mCt`t3Y(MVZHmKBfcmS-ur;A-!)MTD^~IG8{T)=Lv!ay*!c_ug{H0Q`Gu2Xa+
-o_x7Rtxp4r`A-r{g<-<QufL$l(zPcB%{tHk`0|XQR000O8Q5kVetE>JyrVIc8;V1wA5dZ)HaA|NaVqt
-S-aA9(DWpXZXd7WBqZ``;M{_bBvtPw~`*XkvQelhAp)4bdnC@#UF=@-WpxDt1lwIm88wd=j2|GhJOkw
-{5vJ7)yWt~4CZ4Cm#Up;xQb->G6mbefBnbW|!PiDJ6%R;$&;R*Hrc#kSYIWJN)E(+Q~w-6&D_nicl@#
-f5vWPRf4-hKAYjeRv~>XPQ0gqokePrs7KXn%64F-+n8lr4}0@>I+NN@h&e8tgVF16@LuKc)Kg~sbgx9
-FmJ?xDNkOCcFT8G+mXB$B}Fp~Wa$NgpPKDxc`EFhV#{l`b_|LQ*si4wJdl0cq6B?gF<BhA)IF_PdsrJ
-5ii5EN2I?Xkw>3%+rtP|lOSL9DrVGtv!&_PxivP|oE-ngS$fanDPO>e3EF>d0V9&f1O$S_4x%&5)+b_
-jxjSp`#SW(tgDe^@!txvzOy89$#LpAVC{Q>2-AaSc%6}`@`jojb^??{KMIg@_|xfMAuxe?$odmtxUPm
-iC5Gtbd=%=(IL!F_nkby1{>)!Q|BP2~>Md;R+1h@ad>_;YD_b^@%0&e-%ylMN%Z=DU_v<jD1Y;Fg=6U
-`Lf#OqG%w2OfA?=66X$9}DDKc&^DknC!<NW`x{W0hpJPHSo#My_u06d8PN}-RykQ?Cytqaz)+_i=H-d
-{)}Np3tB4|Hbx8U>dLLM4+AU0VfC^l_%<(=SK6;@l90c?Qa>f|0saO1omm!cxF*ek%59@>1}1nGth+J
-1Msd&;{O8}SXcVHSY3LPDQ%S)rq=wKZV(YVz+mO(<A`R0Nc2fDpz~&m4HIDe25Xe<E!{w>kyVSELwP<
-(vDO(ek@2*LjTy0Ubt1GJ<=sV%(6uS0XI<q@z;9%K-*1eIJDo;&bdGZDEKtT}CsVU^5O^^({>F$2ik9
-$Mpg;5C4L5&vmt8z#cklxZcE%;%!#0_ooLS_T$lo#YQBvKjqiM(0h!&^wHI(_5)AzRW*(+8#sG$%w&%
-)}f2#?$%-HoxE#h<6RS`UpuZJFCd-eEf<)AQvi0lK)3=r`9a$_Ka3={?7Z|w?Jsn$~`1EHzfINWK>D4
-)v(iaZ@=_UB)R_9CbQjpMR&~YZ9bm~t&gpO3QhE$!EdgJXzLUFVx(oqn#2DarjLxZmWhchpe0)<HQEa
-isx&Za1qt$NzPNd#KzEXSYri7%Yw}8gDqwk&gIr=oAyn!sKAa&wO|436vI2(L)Hc9&W{*G?XO-YdR7+
-|`51?RQ*I2Bz6g2?^AVYeh1=u50J9rr%Af7T+khi7T)>a=0`J|z|O(s5!KQ-O38m;mkb6s1hBqCw8Vo
-xmkFv=0HyCh09j8vi=vg981#7e?x?T;Jkh@)#09We;izln~vMuuGq$CzX<+H;GgZ`jfJl<H{thc=gX^
-XbOcP1fj+Ex3jCr6*WE?{T5KO#N=oFL|XPEWJOc=6qt8TMF|fKr%n@F(*u&oB@~<KI7OgFLG^5I`?Y(
-d~tXC>ieXO>}!QYE3e&)KveJzONJHBzJ*L@@)6=i^MSW!b*{RaYwLaY(@e1X)~;-h9ypHR_G?!GYHxQ
-R*p~LSRx!+7fW9NPeGdo|K==Zb?Uj-2y@BjDr++aa?{LUJ_mCUmUyqxEewa)vCjjJHV8IA`>>wsEyTj
-XN4LBA`kk7OD2u}*C_7S+iK}yL=4OtrvvUm6zff208y};ukSmuS>^Bfq2!w=Gx&F7l@3WXs)<$x$JtW
-KV_3KL%LAI_5XGg$X2afg$%#}Qh4>{7y~pkUyPh&Mb`-AU1Rjyta&pXxTinzv>xBramP|BR~%Kt4)#9
-9qYr70JVDXZG;9hE`R)_cDqfY#h?6yc1!{TOe>~%BW%<&C!c_Y@hzElcEFq(_kIP4c({!_cNA>ZSXTg
-bv*zF8n;GaIG1(r{8!j`Z~)y&7g|M{AP-eQo_E({EMr)4WHQ%tnsOBQi$)a3LuPZ`fpT=7S*WISf0~7
-UJoh;6dAT2AnnNg$F?}NCo|O+SoDCb>(D%{|4T$OMO%-%qI<}EeAOU-Fx`B5?{Bk8~(?{HpPZTolALx
-~h4ekEGB^+nuztN+$g|ouM!EjswODsp@feAiJCS-w(0qM#=UahU@lU3FR&JVCd4rd-|Hp@%q`9dnP%W
-?_8G#v@Y^>E-Axr0LUmOIMXFYdHwB2NP5(xGP5()u7+2wX#BIe<oEFK|o&L9}7krz#UQvO?#=@r8FC%
-gn-W%MLvpnKAS*Ea#F}kV%m{T3k9Zj2{h7Mr9Q+3J;uYsoICoBTxw2DhMv?pLjrNf&-)XpMU*y`*ZQ>
-_8%XU*}=kDMH~!^iXB?OAB$Ka>}4-8oubWfQbvx<B1hVu%t-9&$SW3y(U>lrE1_M|+59XEw}6~?)uZN
-dK(>%XLM^cLMZP_Q_@SN{$e?IP^&YYj2%*y8^#bBIa{2Z%Bz*z!zZ?Js+R6?boixM_9FN9MilZlSjmQ
-BfW5hJI3+y_{h2$DNlUh6h$jPuGe#)6Yt-*Zi8Q6STZrtJ}Lht!*|3ayqDUjVW^3LAkk3T?z9TzF^$I
-V=G^dYY>JV;j^?^fCR?7Ha?c#$xhJ&k<VG*N*1#)<K)tYD7NvTr(*8L%^t(EYi|^K`NTfaXxla={bkQ
-73q92F-KLo>V=X#?>T_rjk4tOf&i!5U?}#A&r|#y$Ckf<bj>mP?PImQ!P)6iOkKLEH^u?8di@j(__gx
-JuN){Lh6rF0_LF#Y2ppQ(V-Vzy@LkK(1^0^0smK|>dmk*aseEutf2h_F0p0tfWV|W{V^QgF2VQp0Ayn
-H_cdr=EaV*kk11D1X+_Lc1=0l3ZJ^F*LU`%R3i%-LEo5%3!Oc|1N*ql<NLMu~hd{7|@=dYR!3!Heo?!
-tuH!vyYeU(KR6SED7xDzHh*FroPUbwdj3!+3XOT%ws!AUIy*Z=ST0=94RNV5pCD(K2E4nf#7+0|l0Yp
-9U}@|gIp11|Oq7DCD_!>*|2zq10o$+cGj@NgTZ?*A-16I++$ZGH}Fen;7hC4N#sfBS^<_%zExQQm<AH
-$Ae);eJ=MNAF1pS9FlP4L9dkH)GhCfN^`xn@nU};QZZSOPyv@pMZzf51jiru!U`l-77j%AH{g6PJaLx
-jhd#+OTu@pY2}*^s?vm0U|)DM&tW*5;cd_2vMHij6`IvP!PGJxf8E;My;8UnBxHqS6f-4&y6Zqc`Izr
-=AZV|wi^7XuPjvxkX5Zc;s>EuCkq-dvNLxKjBp~TRJ;D!wWAO_w(WfTNN;lTbr{-|_foStF!+EQWcLO
-vCH)zo$E1>o<yt=X9wunygYbp9xFO6QEoA`_4G)mX_!|K^~IJ&phCOO9te!C&nyrf%-JKMWN#V0O1nQ
-^}ZY6na1Um{fr$FQO0!-8BxRNxrGU)|vC$Xq~piT8NpwTg2*ce!^~C0_zXd%!V^ErM>{q!9X_OY+H-3
-;MtctH+E4yRLw_)37j)!9EMp*iLO>je7yBf{Y$$9TE?R5h`GF`9f0|pUo0#_xb3VLq{V;YkhvZ3y$pG
-df3G@Pob*}=X|})2FTov^msvGbCnSxJCl1cKBqv+^BnQSLNQnqlPzN?5nS$?N?LJq_Ees1G9LI;C=<5
-NJLqA}pA-b;|F~zSl4CA6WJkP*G7w_RZ8sg1ys_Y+0}RPL?jb`25eN}MfN4=M`o-49v$(<Exnx~UOO_
-^uxlm4Ka2NA55<=yZTA}u7a&@(osw`7@`AXph1Ac}0F_(9UyulFu9y=~OqaOb7(RU_iIT9@nI7Xa-Cp
-y70!(`CI9~=(GpenShpXaz@x~FPjzW|cLKT(Lvuc4i);l~MH{0N222b$Io5r6Jj%gn{QbwDg<Gq~iCf
-^Bn%`Qw>Dt*KiCvy(-<0A`r~iB7H<mF3>l_qhk0IIAm?E-mXf>1t&o*k4|U*~Ht!g{;lZOBVTThe>8~
-DM$l(*^W5fD077Tbc=H)-r|5sbL!4L!uavLv=d744R-pot|KFr@b@Cnl0p&?@*$u2%m7V0DFC;ti7rz
-x_PMUscvM%|V?6+B{|ni$Jw0%M{rQrIJ%cWXC4&WAHebF1@!!B_yA$AF6RN$8p{0jE{x5LwguwG0$eV
-eL2gx^s3}z~Kww8m@xUwe%8OW_!M}Pjd;AG!l{m+%Cg_d|Irf$vot08v^lLIifS=a@;Ow_2|bkJ?uW&
-gJj(DW)@!HP*;GoA3;HCf?xE%wXE=;HrSO9KQH0000808trnOiP(EA$}4709rr*01*HH0B~t=FJo<FZ
-*X*JZ*FrgaCyx;Yj5K?lHdI+2n7w<d$xLJ7k!5dHiye5neO0bx`QM$H@M!0K+CkvjVx(JDQVwg|NGU0
-lt|gJ)7`U&4KULdAH`x-v0f}jQ8Y4ZS*wL8t45cF5wci_Rb94~8IA7ON>sHjGF|0LtW~XqHliuTLM?T
-nx;bT$si~N^jrd(rHop_PFpVr4EgL18wc3nUc{!JPzD>jjm{u!k%0kSQE>_Sln-0*EZq`C(_;D7?s#3
-)w7MU#Izq;NEfZC|hTs2Qh6{3>0Q6>?UuIz8IQiZBz-ob00bOtyVjj9V=e@fdk>$1%kMcj-kX%Kq`oQ
-V4pkP;cp)TU8I1H<#&Lk>QcWuBK$fHe?ep^RP?$!HV-8JBgr5ox+?o3>VID)go*>qf}ADf6~bDSwZ6+
-_EjQrYv*gh5`OSuAF;eLE4Y&{6Gl2MW#%}-Oo2Sw^w&}>AR~RZ>F|yWJf;9x&WdYy9`h!(Zxc2c96y+
-0e?S~^+q-qWzp1SJ{8MNlV(kxu7NhWN;j|rnWyS=mbVMlcNb+k*M+RNQv%{Ow??H;Yo+o@zwD-5sD67
-l+nejYFE2C6B(>c?-(B6N7v~r6uF}iv+o>>hmR2>$*ynyy+vwaRYiZW1n|F7A`{DiD^xgU0yQ{m=Xar
-&@Hu6EG%(9f^c)Vi55lQRGDPfNs!+&oTu&V&6@QEzS`CnAl&;Xh&#B3%&RN4(3l!k<4p|gg?H7?{v#U
-xm<6_r>#sI8&-yeiEvddA*RYk-N5vN-e688eJ2<MNT$`!r!Ll(n4+Qtk#gEI#pGhtLzbSXc^;?LQNSR
-x>sH!IrAE0x^EHY<4_naj-CqrL0~G&;jnyB%N&ZxMVDNut_&)NdlSLj&9&S5gXe<6N^~3R@p;J3MbFg
-d8_k9%G$=^HML{x=h^$RP`wmfY9r^M+z7Zq>?>8z3=pD9sx9apPXU0Q6wm_)9w(myTja)do(fc!%r)k
-2uY^j`Rtr=x{=5Jwp6yMb-l-#|X{##NAbYT5+2#!n8L-wQfi&r5xB%*H+_=Yupu6J*?+q!tQVmMlxR~
-^ltbjn5Y?^u;z?h0+N^7tz;ar6KF=D3JQPEUH%pbqS@y|7Va+{FFcD#{rh8dYDgPlyiO`5FWcB15lIQ
-5y}k8#(Ge=!RRS}YU^kVjE2ozyH^g-ioe=Q?IH+V#xQHx7Zlh5<~4ZUi=2GPt%Ro}y*S9&+`l^0VKg%
-%AjsqmxczPJ;H)TIE#=6tPx?cfzvC$~&H|0d_o_;mCMud2X7s*lTch*lWU{XYt({EFk_&Vn9iQW&q({
-q^R-_EgHcF?byg$G711h!P=2&O0cF)-KuU1oq)3+WNws)RL`yGwk^mf(4^NLbb-*}M6HUlMlP!2QP*X
-$0W&WiWvx*Qu=msA;f;EDASO$_YHPAt33p7UBiMSa{@QB54<Mn<1dxaJe<BdGvdFh6*}!WJ^pc{V3@(
-(^xjpoWWz@_rGV8}N>$-Mo@mSbl)ps~n_T-EYlQZx#V5g6&o|onzd*hi!%#ICk3fmkyS=koN0F&>0Nq
-egw6)+C;ZrL_f+az{HRA*qtbOZhD)1i|%r{f0<tnf7cK{Oh4MG}t~e}nT5;{QvBKaL&Z@3lQkPVaoU6
-%jf0SvPc6fHA5$jKp6V2^txo;J3V#fMcd0NVfSJ3i?_rW^xM9nl*R>Raq>^eJ{m-pWnW}e*bnVu5NEX
-+%m9>+w1%5i}N2vUanR!E`&t-%uJ9ZKol5qL~Xzbv=a1Vw$!<DUtpfO(^Dt?_Xf-q9PP8HlFd5u$P(Q
-^1EMa46KoDPa7Qp74mscjhC&xWvcqTk5~Kp$eDgrQ7)@{|w<u@y9k9_s{jE-BRhOT)hec{eV*)JvmS$
-TiM4%q59Q#5Y-Bl{n%Po+MR|M^f_707$_=qa=6oaX!#eaUH{sdYcu@U_ABqCke)S5hkLzvo81AXSVF}
-8X~?BDpv{v<!^O}i0AyP2aWh7K$*uVl7HpP^7hcpD1}aA(w}YCN?sqOk=nUb!E10w%N_{8=8B4cLwy#
-Yfsg=^Fzfjg88JZHL2n+snL^!;OFcCeS^gUyv`R%pMeDjA-ue1(t&&%!hDf8`H<^AcIcGO?42QhI1a6
-*+S5~p<|#xv5-NX3YDx95u3*%c0_S>fW?9hdq{kVWDXC6dC*mAZ6I2A10O30fe-HMT<{<c?nnp1PXr}
-=P;Lv@G4nfSG(FhPGkAQ<)+piuV`2apD~_@Cgso%Fo9ca`6Q}LLQN@G_W>@lB$;FnzbOT{e40pzGEf)
-Q5f>pg<-bc1Bb*8*#ZZKybV}ru4@qbVFzd8O-#-Dunyz`G<+aLwhcXX#^2N6E_msU2po3}0ZY#bsk&%
-+y=354?5dMd_xf({~>#PQQaSNQLI0v<Rf5XN#cciL=}sruOA$0314cnw4Lcl$zA1HIdss+^KojS?5<V
-%}n^hA_z>Ff1Ulc>z8&at~TPgd@U<(cMe&y}SESFl2#{^-^bmJa`AffR%-a8|^sh4yg-H1gb#&R<(Y_
-?LMe2xfIy%K|%v`bM=$pXpcxisjjrG^TUMDtd42)3`X;3wXHONd8Fwe4%zhc?T-W6V2Ud-dQ;^JC-@}
-!lLQ9?W}qFq**0qs%o~s?xl-bqvU5Ayd6ERAxW{axwNzCJwvT<6T2-ad;5cl7j<B$nh0RIbT-}H_-~A
-ypXJi%#L4W4?&Gkfp%9euMDX{=`l~GSF^#Z-d0E#vH2EuTk^j0%9wM;vj9nnpsa$thbh#jR905tm)LC
-=YUiesOaVeVYvBFG+t{HZKsXi>$<8$-gz-ZJnGnmmdSRXk}*#2quL%M@E`)hz{>=HO%-U5>2xxj1aMo
-R7H}m>xIxYkkc4nv`Hj3^AtAH80Bt%7Qdv2EKT)nB}^7Fib#9V1SZkr-EbxN2E03s5mV7AoehK<e>-l
-wJh(%CKNZ8gzF`o0#qMx94e=F3$boCIccjYGSl8WkekCh-y;vQ&ejlEnM4pwK3N13W+AB4*RN?My#0t
-lD*9tL-2q06BH3w82iiH{-gyPP2At{7qeKBr;Ska7#}WF27}EHe8y^j*ABEte9S%gyf#_u%h;Gg={_F
-hhRW#s2c)!sd2VNX=gbsltF(YpVvuOj2{muCBzBcnTK-du<W*SUttxMA!C%qj#!_hm0_d%JL(7mJayA
-OBw@6Ug_I>HkdG}RA$v4snvrm_oz6aT1C+RApd7P=9O666mP(`)&t#G}l?Pz<FOMYY(9clY-<cS+PU@
-<iOKO$pQF66h}eE%^>rT_{^eSPMFDuc&?zXP3yvFK2CszLPLec`9pbe?R@%YYQWn>ZK>IEg+-<_XhK$
-eXCpGne*sR`u{wUhxo|bekm6R8ys?R(EW{E9POh1eewpgC=jlgbfJ)7s>rr%XO8T_PMh`9*m4D1c@Fm
-1DxB!5pew6}Zs!R$8f0)@`W4tT;koNB%1W@!HTc@iaZ8-BCGMx}SYi*_H=AO#heKN&U$_Nan!$h{=E8
-)PMt$VrKsGh;Zdqb-neEM}pV{018dS|-lf#qlg0m0QkJ6_OGVnNOhd@5Oe+-4L`LamR4S7!$f8lQ@i%
-aAjC5d8^xbeHLyvqoEGcnMOdcDVe8+R0;6eZr^qmSekru!d=?-L*hUGH-JMR+j>JBb#UoGvRGA5ECNo
-eO8-I#*7LUoP&@kpqf#n$gtR5vLtSFu6?G)|v8u&%mD>ezSiUCYS0grIBG++BZ28_N5fQe}CCIjqa|Q
-0=<q_cAw~EHl-7w*iZgpK;&Ir;dMgvN4#+&+Wg0BSU1``5q(&``V{uM)9_@_@ik@(U=MbB%*y)LUw=J
-C)dna_@<wXb-hjftgVpIu1C9_K#?5G4K*(<POJk*bXgcU397WhKXE+|+eGS@V6%XS*jxS4c;eLRait;
-NcC14F1tuD%-44P5&4cga*#Z>L$9i7;V1iSK{L|k40aW2m9uP$-(OZf;g&DZ0wGronVljGD)x>8LV-r
-tYGy=*a&%v!6j+<2?NM-|~<Te*|CGKfLFLI^5BQg$ob>ZiUsfCtgw6zt4Y(Ck4S5hW9mFlXH&+@I`S3
-#S|`x9U}@UCk|!^yOE58wTXIb+`|&>z{2W9%}pc=XTO_;;8%F2^09u>~n=;0nN_K!h)W;%pN=^*EOB(
-$iS2{q2QX;dwl4ijBX4zWjvV*`e(9}mgcjDnIwknQY&yqF4zorH9ny!=Ihj9a7DLR*pFE$<7!Vj781o
-1ah_$W0wu0A^w#1O_IbK5Td}Y;P-r^`=uO3Gfn`HD4KK*HoX=9t6wP0WHK6qlyp5kb;yNJ8N@nF|15u
-@`-^9w$M7%GlNK`h$lpD1J%OOI=S52+62ew(|ro#L&5@#c~pjvc}?bf8Q+S*N|^v;hq?D&)xk1lEAAD
-p9thl77p(F@MTZ!di8Q~c8k-vGUTyzt#P>B1p{R5wAh#{rN8*_*e1A@Dwl8%Wp?+OEW9Kud+5+>t<&#
--T45M3&v`LBu$yrwx3>s2^@G_R(eF+Z6;S7P66Ot^bIQSXT+beMckum*M$*3~wdY%0!2h4P*fiaI22h
-5C9rDioIz5;HY?5SU|O4D&5on#ToO6%RrnkIQjEI6T`U{@(91<*_@H5(caHKIOsn2#0K3O&qoJ)qJXw
-Qq`R|6o<ALb0tcV$j$4}9DAS}B-)9}>2v2hHvYGLueY_aJeObMgy{$lLxphm}dp2FLI!4EZiWS2`(_?
-rC^_YX3!2r+z(IBGj=pT;tZ=YnnYB^%(0)$Q<Tjko-BRc`}ujELx0i(vK;dA|<b}C8F{v7p9CaX0l=C
-jwWsb5oA``U*F8t>21BoRLYu+AC`0s5uN^oF7v>4WkH4L3j+Biphiv(AYf>7d$IAOWcUmIK4fDbuJ{?
-t0F>vY=i%Xkm@<5k3c{xB;6(FyF{!8}@o+ImGIK#pIf)r4w@}2A1`-V^q?)lE=;>Drp?{jhc>^YAdTA
-9DkgigJAM#P1>*;^yMgA7ZhS($O=jYFfr^2+SCo#^xCvxBL1{>kfvdQfv&h37h_k0mDXr;x_P(_>zt%
-8G_@Tmr%Mi7LOX8;^ISRUjOGPq@mc6!of&4{RI1kHLZi@ZZFUE%6Zqj)qv{R5-2#7w95X2j)mN(q$9K
-tP)ZlwRg0n-^!R*bVd@Ax%F5nDrSaj*Y_IJ@lx)X8fWk77g9V@Zxk<6du)}(Fmzq&dsCI7?Ljwj4$LU
-25NNH4M#&s^4}8&$7Vim!`a7A<4`fzqv#yM?J#o&zZ&nXk&zg$5JapzlvA!d}#38&_`RuJ($mIr#8XM
-va~o&DqgKNaVpL-m4Du<b$}}K8fldMC|JYD*x^8G@_}u{ZL$C>JU4#p1T2_HskmdNdNuBrUuZJ7r$Wl
-Rb7|$&SDB%$MLyu#$KUS0Jw83az`|1FFOfW`xkS$1dw9Bbwr&yYlgGW%v%2b&A*<?dA3kVlEmWGen^&
-Y6Gt&7V@WB?;KA6lyRe85&N#aU@!lAc{Z|}_zB13RKkftvg*W*NaCjW7JF%~=_Ax2}^>0u2n7Q-u(<E
-Uj8Z)C%W(l>!`W1&*$v+YAa6B(Wce$9T0o{P2+0sJ^n>xSkFAtpL@Y@y(Crwd6(-aI(wdH)EyMn?yEj
-6Ab-sxlr!;*Cy^4jJ;0`89>_jE;QSU&D6xnJ<UbIUmcx&vdE70W0%Ybn6t%Mf=8$2^rr7&$v?Z7AlR#
-MNhsby27LWNnGUhD3MoD!L<exR9A&X9P3|-)HP4&&z9cEU(<*>Js@Bo_n`ILarq4bxH#49X~*%Qj)En
-OT{PRJ`7>CQ}I+uS#+5pR#zdk!Nn8e1!I_`E_)b<kC?zr@MGiP2@|+){E)YM4*55xD?NQY74cj9&i6y
-$Yjv*IsrVS=K+--X5<E8Qn|ELG^nLb;K+s@1UgIA<&FDY#a@BvhdjGzK>f`;TsWQE9ur=E|IUg*H?i-
-&eFYX5f6}ujEub9M3M5)^U>MKJ1T$K&tgS}C!hw5`K4G;M=`a3$RMcUtv*z&$-7#-G0zJT3bv7k?gpo
-(z7nuSlZzQ8PC*WT-UZ%1Fg1u@p-!=euDY2iYH$?guHCz|)(SNw}diLj(*I%xOnV*-jCp2n3OdnWiDN
-R$5qP)h>@6aWAK2mnzTaZLR`DN&Lm005bN000jF003}la4%$UcW!KNVPr0FdF?&@bK5qSzx%JiDw7e_
-%8Zlk?##L4?xktE@ok!9;-uX@uaBlgNMcQqT7tB#rn$fU-Uk2zASFB5`<U5VPbQW~;Njun;e7*M)YV!
-f$)auAS|*9e*PE(tL^@Md(Ka&S?*|9^`Fxq1k8+*nMcg)dq0FPDY&NN~Uw>9rX+9U#a+#M)^L3rCWwY
-H#+qSZwHbvSjs(Nj{*V24aD;&*!+uAOTTyGY6ArB6kdV72z;Kwvlg%A%!S^X`g$1k3qCGTFIi4*azZs
-mczoy$!lPO0(px~}TupxO6np#bgz$+XEgadIuotg2&`-^T0eTB^9Miz1(y0XJ!_q)3(E#|eGEfA?Dct
-(B^A0O%)n1ptbJ4o@JjN@XCNma0h$pdmb@8BN8DRIPr<)jDnFtFG(1%4A`?z1hAw?cUL<npct96nP_W
-o2jVRO)ceA;QFLZqViwhOO``}bPH2$R#PJ1z|Sn5U$vVg%K@KMT~Xsi-sY-NQ_+?ic%9%9?ga4k?Xwr
-BKR!>M|M}hXS7)cMU!6_G9Om7w0fjltI8p6vQ&)4T)FhZmEX#S70sC3@ZksB}Bs`R1Q$zw-3s}lDp0D
-IwBV65-vJQJ_);7)aGLvPKz|*jyl1;m5s;W@Qtj&we^f-I|?){s0uV24BOU_=L{t$Ls0vpUtTl@@6)I
-*}pO^fdU$)ZZLH+8kFff(PWK=Sb6*(NW&sT9>b_4w$fhBXHo6%u}})A~x*v_M^#>$z<VAA39=urw?)F
-nxa~nAdTdrJF|97Us99l27>=u<*NgZ}gXaAlhbSx<7@_2!i{<r+ki&_Vo5Q#Ix70fYIJ1&tANL^{3?Q
-^xvOP#apR1K%#;DY=L+?2jpQ=%BG$t>HeWrQ@3-Jz}@hGI&5WGs=Uds<#+kK*-2rR6u<4mpQp&XRoT>
-4(E)~M&-mF+in<;7i$&~v-~ocs?*%+`g)Cy4zJ%{2g7(Ni)An{<)SG!SFLKyC2L}g9f?GNP34A_AG9u
-grF@o1)Pe_b&l>i0CQ!$2L32bcKs`!<*EPSW8VVAU?uYj-wnEJ8|0!~hfyu1oJI1<VX1~9O3_pN(5)O
-FP~8;d7D!fzKaR}>(!hN)^v62pXF(z7T@%5)8Sc>>Kcxe%>_ZI~{B2+@R9)o3)L-)}*<)TKxT@DfU+T
-5f=ypdo%~R+733>Kc0;v$RQJ><<>{QO+tv)}v$bVT1_4hY>8_Xeve^dlbkCctY!$=<iALv77d2vu#$~
-Ml17}pP1Is#Ays1P{=jlMFI%N^mKqhAOz)ib0KO>J|3_ou%IcPhvQtFGvo_#aw5jh-VoIBv4yg$lOX`
-~+dVykB8&Tt4Z3&h3=Ew>0RhO()>1bw7Zr$$LV{Q*<h3lQ<03E9!s&@Wy>5W!Ah`46-(J|BAo%2G!uc
-eEjp9-KbCs8oH`Y1uY;-$8vqId00__jpVftyL{kL#cABblac4(ydBgkI$f3V!AbyfDb?SBX_vjb@5Oe
-@&kb)#<bW)+P<*0r~zNr%WTB?DF-XoC(d`buk~0D}zlQv?DKw28m8MY^74skl8Bx95*9eCzI)d=qKPI
-D!Q}=Go|Cs)vXP!-T%%vzGU|v)LyT`;qLVzY7<D;GzOZ7<+5im_S=>;_n@oI0SS~%Y+}?j&8F604+Md
-r><_(yB9S}>zlkBO+;E|9doQxJ(KgJi%`rtLv<1#I=ns$Wd0DaPSAGPkOdu0{Bh6%1}&DhMH7v<34s6
-bankLNK8QYWEeAgVy6)i*V8Qf9fZ46`vNyu{XufHEAhsm~c_4Uaizo5#MOH~wjvKK`uO)h-@#{C>x}3
-dCetiBGJ($>xYurs-E?iV!Oh360--zhRRQ$e&PPG98Q5A_R3<d^b+-kNEMjxoJRq_|-Nc)SAk9yBF)Q
-gYe1G@4bM=|?-k%z?z{@3jdY<YtJ#aX-FsEFPQCBYF+o2phP(P)Z1bv&BDV~{M#mE5WmbjS4$LtAHFq
-)Le&U@7zOs&$%|)_{+UVGqP$`vuIR1W1)PNfLo}TucSHf$I$#J`A>_8orM0TU<x;IcNf--&A#mqV2;+
-cO3FG%{XAcJHW}+&!C6v`lEkOA0lXsUo@jIv;0vuWSfDL0LHVx-CMQbo|ao7*E5-A0B>GPbSU$*=#+w
-Pf1<~X`FmWGryh;|6$t!za(?*u!X4~P4+cnxYC#`OxS^@+8yAP6q4hKdrioT9PLy#vKYn~6z7!FoHl4
-s{{o={-g-3+<7%+j+6tIUsUqC7aPgL>_LhGPe<x0=qLO{b7Ss2z`FB|RxZyC{|HkgR$RaHV`{D0yh^8
-B``(|O}zV3z@`5<?=`u?D9SfM~>B$!<^*fGv*WOZR;U1BDW2{K#A29`9gF#VVWpOpTfXC$s?ZV}%c3z
-TSr)D++_mAkv*53&{G8ZO7Vo&eDMbXgJ@{0QFYpU=Uwm0RzoP57--5!FoE>+MSix+UJgQrY;K4sE@US
-iP=X07RQ;POcI1X?iyxJ6R&goz%zjD#UUbhN~4iOB>Fx<ntIFqv}r)qfPc5Dsw>>EE0`Vl+Fu<#2KXG
-8@ONn~m!Q?bU&J2K$TS*FdHUQxf&R`oT1P<lPUv+Ft=LnWsrcfHtDCf5s)=jF{si+W3y>TstVKFQLE<
-4e#hngx0^v(54$OL!mL!0FZXK#U5P~QIG_9+4xgvVQ-fYvt0&^JzpP>oVv?{@<p7_lP4tyLegPxq)9Q
-ZgRwq=E3Z=fjP!fK&&n^h$gn&4XlgN0`w4+P>XnR}pcr{aLQg_`3{fFTOU6gJe&9o%o<o`^06otK*y)
-W&-Q=%E7ZPdpTX@agci`&mc)WBofCy)nB}j68h1-MJG-Bs{zz3^*TQV~3w63xeJ4&EoD&j-D8Wm4yyB
-5t7<iq#0CozC_O(8<cX6E(ziemO*tRs<y@{dYtU2*;=+5ilRA`GIll}EVLffe^{qC#$3f9nDy*<fTvk
-zhTTnBN8P(p;xptD;=_Ra6-KdW&<IC@X9@O%;mj;G<-lq$Gn96YMCo;lL9zk^ZR2#a;pS@7ms+NEC%X
-FjlqHzvXfNghRud|De$`jlIs`IoX&qg7?Gf5BK{Gvlcn;2{L978D6Tl&vVOp|&4CmfyPHR2CtiV|P{!
-9mXBPX8jn$ARiYtG`LO)-Qh)Ab3%Z1S}PIj+BfPmnLR`paC_`nf+n5PrA0RP@R-keij3Jx-)H(!&NKP
-IHS1xknR!N4T>7L_9e<@?W!s>Ok%Q+Z3VsK~QMuSBjuU2F-3nohE#JM$v3c&cTyVu=kMq>gcO}6WGb{
-3cBwJy{)S(U*x0_oFuDuzQCW75upsjC2L%rDe}g0-LSXgfzr|>!CWhVvuW3Oi9sfM+|3u*n07hl`W}I
-Yo0p^h1XeQ5FiUeXl%j|}^!R-Aj8Qmz2V;$nJ&gLvKHK`GESJp++S{p8va#RcWvZIPA2h|Fy&<08^kZ
-PfIctGFw50(!ruA$T?mrY*MWv*XUMP;~!GPi9iXUo2o6Fk;O4&VnmM)~ts6_Tt5Ziw$D6InaCi+L%K-
-{cyum-{2Q~<$fPI)a$cq7?9X+V}r4BXWqX+e03b-E>RXr#>0oWfjbjwTPRI_CS({OOVdyS(c!P(}~hf
-2!Sppz-F!#^xlpFv8xR;>AoWP6l|YC37KV6Q`R4vJWsO8jz@Km>Bl80}Dul+1gCZww;wUZ|fR0y1bS1
-mO=m+=@h36kv9~sA=*${+5v?|DmqkiMh}32UO_M&S}mxT0vj%J)PkkPoj?+}*n!8x<vds)Ne?-ETv`m
-WT;Uoyu&@^s0Tq5xEx`%|!XkmXA+=!|CbDTgV>^k7FNHWO6>DHof9JjP7H0fVjggOXkflBHgmWGBq0v
-P2@^Gq3ds#fY6$ss#1X5@cWU+X|7TEwSXQ5=h&XuCXHUgx1bMzy15F{2D0OT(PIeDthKm~8B7Pk{SFZ
-gJz#Ni9EDAHv->Psn~(Ej@Y|FR+8?#Kr_g1mJ2t*1|u<23B<aX?(LL4dDtBV!cgu02fb3H;_n57G{mD
-f45uE^1Y^MMmNTmiVyRcw86YGZ<K4$+<^AYtgz#xZu2ca>aDl$~&^z=&4cUQ*rv5K1{+`0=R@Z=^<bo
-FzdJAD;2VwOLp-kcjj2jJViROEbZtLz%!c|8k3(Z)D`g4oMOjIHr2Uu#f!=T%jb&#lIe4kQfOJ0ycxV
-!tYOTetAEf%SN~k}-HXn3JO7aDuBZ0Tr4N=~Ta;*#gC3Pm#Z=^cc3nSo-x7A{G^e0jK1JuuIC|{kIrP
-F7F?9s2(F+(qd;a!a^6K@g=i{JJnqWI+wU9>eO};skq>>|B|D+!n<h0A#(_i;CM1hNHa6kb7zlt~21|
-y*K6g=#sj$N3u{f6{xWCGEa#WiJ<Ri&B`w*M0Pp1Vm7X6J6^pJWy5$S;}%6rp>HH9WgQIvm<%AMKnXd
-WY1WQiE>w(2fx>288>7s{wWFw>G0GM&BPz=L80mb-sCDOK@Ik7+ta!zl9~)3d%X+c4M!GOkIwqwF-xx
-!xpO6;Qu+mR`8axFcbyXOB)YxfHzbWY%h}&YpNzKMA@!qY#y5KWG1F)&;m)?BCYLag{>XHLh<QuOoDo
-%VNF9j@2U9R(QjF}a0&-&a0U3q`J80XTBfDye4y{a(S@gn--y=~e+&gh7mHk04T-b5Zehz)>Pl5>jI@
-KH>y8R9fEi?+76C92dL15EWt#&(0i+ZJHXxOg4@DqU1*<TI^;%XUMZQDn7C@_cksF^lI#{x(>bWeyLp
-nJJ#4h?&%5Ye<PLU_p6*yYBK3Gl+zu|*yZqO}Qq#&^~8!#3<`c!qse7vdAO-60EUd!54$HC6H&ga4U;
-V3XjvPe;-ogBqae&-Z{1UUqg$4D>%l4!YN6CdCc3YHK+(S>Z_Wu^nkD#q?v<$xo#Gn4bQ<s1nso$Iv7
-G5q6YACMZLWsLmkpgZ7roGB?DtL@o!0lv_l1!{GZ{-|<QmA-H3fI}jKng<7{#C(hd!V%vQ6L*~e&?3L
-})*VzRy$j>@Bsp~fFh!PnHL898lK`Fg0hBo#3P3fiG*7S~)vYXWf7a=3qIYJuL)`|BMbV4U^)Pm|?Eq
-wtS6+ksGg{j1XnZ?G56{eUV~kv!cHs#J5~vlfP}fER=tau9UCT+gF_DGxh7&~a73)xsA3YN9-@XKwSU
-J#cByKT9xp-`)uo<c|lZGE(<C@o3C<tJOEz63w4_2;_FmQpvaL%%qJ%SCHDf<aWx`qTmG&1N>F4KiP+
-1Z?1hnV>Je=@Ep)`n9D#i0hl=>`BU2(eFg$pl;jG?~jov#4kWYGTmJl-o{ru@+2gSKVb&u1S<L{vB<x
-H!V_L1{TUdQY;|fhog^=Y*7#Pne3zxnqL}0ZGEj}v#K&}E$(wMo{}a9ca3K)bd8p^@+zuY4lE08Te&4
-&y1mI?>#rWkzsuDIPr3N%;xOsuco=<?%uI6c^mH|LSePDB<2lGw&}$$Jb(%!a%}s}lMx#H<MmrEX&4_
-}WnD1-cuNYk-M+={DXqxyAH|`W9I)Nd^#wW2U09PV1M>(bj@&w-MxH@X~w#+d@5u4~Txo(7E-)F1S99
-S1a_vASFQh3yx|3px<4VL+_(Gr=sl3Pk30_9pPVLcXOJ>Iwrx#?x3GfE&H5(R>MEkPUr3t*{!Wa~=+U
-25foovAIRH}HA9tgChtJ)XqCcDN~B?Gu@{R6SkDG3mr^#d_8Y{&cV1D$6kve>@3%NhVnD5LRD(jo&hT
-kRpoX`wy{tWC4a2n8FHI6`oAHNI$M?G426+D54HQ;#a>sHJou!=ADx94!v{+a(q0dl;-1$p?3HSw#cS
-P=Q0}q^{;rE;nCR7m)JGLB%cDGZ<S;<9<_kQq<55U@%!`_H5k}mTJfa-JgKA%@X?6>x({)`w4(f5TQz
-bR4+iP1Gt6%%TJX|fQDA}cChC!cQ<2zYk3sQ3e1H1qAD$nBDo5gxxgO|L{Lx8Ky?rR|*{i$K87g2yw5
-=01v!lV3vPqS4Nl%P<KlZ=fs0>BDDM>~x$MtMHLH)n*XJDk*iF>#%S^%@8S)@7A9JhQuoJYOa-Wflm7
-!;)w04XD8x@~kUFca|*lh_e}pEx4MnYxzLTx)S~(8(Lh@x`#CHUKNC$Nv%GKL3?e=C25Uf*S;yoK6k~
-I6UnB=!@t)J^bZj^4DK&H&z~eY$>A5t5pg{h&N!gA~RCK45rMBs=5LZkYAxn0MXzGZ`=tbxqQ^ri-O=
-(`3NgMu!0iX1^fNz!jqRqOL7kYea`X@7=TEDAI#CI1w6-E&+EC0=^!R`Qs&5#lj=ui^;4Umm#!tA$n3
-Nm)za{u@|vbfNj~l7ZBObq2Fs=6lhI$QmSS&Ii$)V+=xEZRYg}2a3i=Xh_pqK|!Bba)keDKoDPc0j2g
-yK*789}S_rR?Vg_U~sO!o)36H8a<iCXD`Gh%YHj$!4AE%F693z8NHtP5YMg)i5fN{1&Vm#qt4wS4lHm
-820bk8?<l<>9XNp#f=W>`H-M@s6^gjSkw(&_T$gJw8s_6-hy`Na$wV93v{qUtc|=O2xGH;9abVY0Luv
-O5X`fp3ZO~G956|d@&6vWT^ARPB@ec-TrjX2o7#kIz^6acZqK=QA?*@yac@|p}`Q{tkngw7A3hpTFuZ
-wcX^u-0An-Qef`tVy=_hh+I!nx??L}?V}$=rg)tQMtne*HJdjI4d!um&eoK}(&#B`iY#lRrYj_$7w+9
-4|h`x&%5hjW9Lw|Lg7dl~6Ud5d#GQ(;)<Le=R7Ve<^5@k&(r%Si?`fR6*u5Lc7sv_DmH%GvmBcTIO3`
-S<bhh$m@2%{MRoQ?@^R^Y2(#@xEDFQFMmaZo4HmhCd#EIlqS5z^(QSYvhqB_Inda6>DCrKvpw|4ajo#
-WRc_xU*tvF7g`d8@#=Y(34I?Sp{Hbo#<l*V6>)7)ZN}DG&??5fOlkJS-#rnQ|w7zW*Dgk8v%Avjo$k%
-S5!kb%?zYWpNpsIa9uO+4O6B>cM@Rr!AcrXo^?ba-lU*vC73HvJaWsV&c_<iAvYOcc$QG~V_LLQC#U`
--xB8Ryw<bFWI%0ZLz$-JQmB5o}17;6TWP}buVsaTI4!WaGy1D~;JYOs@ZhS3Y;<-|A;l8owkWXKI|Jr
-f0R@IFqy}cTPW>c8J9;0&aKHj9h5z$vi;tTQk=;&y&8-$f}1OZvsg>tWcuJt{P;ema{DuyMH{_aLZ)F
-vSdcfM+YOR+}HU9&K|`9Pd)<UGgH;Z#>ToAiX&4qp&N6nD1djLS0nt|T#n9e?-+4GKqL7>W&Z<FTL6b
-Or2q>BgHWLc9YG#k4fmC|uS^H+}v=3aqJ{Z5yzw01R-~4j?vEjB$71Lz9P=XgSkL<fKGJwb%i{V$h{p
-kry~^$#E5|0#faI2LLl&x2d&a^!X@*jqC>n^gK|dgAs(`dRUyRbg3(~$nvb_^S0Jz{0;y-f01SxnhvJ
-=@wvILgvE#s0_*^hkzq+0226@|RK=t*3bIAMY{44oJF(pVP@JK=$$b=~52VcJP5~ZY>p&^!bO#t=sg;
-{3DkmHeULo}{B>lW_OPE7A+zS{AY$v(iG}|6s{{ETl9=yQ)ymgj-*DUscFh{C5lSvt@a0<s_`Afdp34
-<5@p7W%9j-IGJUxSHD9DN|5Wd<Sin)J$q8Hq|`WobYKcX#dqVPa@{<HESh6yz42X65|q&Yr_m**p6ku
-)f{e5HlYVB*mb`9mOQpX`?fmH@gs8RU67%fofUjC8pXyGXOWQ9SNuKVw8*ocsvMZNWu<8khZxjGM3w2
-V2I6vrwyNVm(G<`9g=4aP&TbITCzh52~@M6L5KV3fXILqMXlE#n{|s*%^d2mUJqMB3QdLu3CX{`v$Sd
-xYmI?62|ZRkuA4LP)E~bc3^tK<7Sl~d48+H~H+J7{L`SFpw6l^>?HfP*gc9^|=%%xQU~L0hM$f`<EQl
-e?w>!@7S|Z0<Wpl0;Us>!?(6g~MaPTiMss>AX@f1lkGFL+3j(Mm=^iWMkI^E%1?-jYwCO&-!$vJTS6e
-jjgJUB7h;d{cNdk|$DKLZhc<yGVizT0l~5O_}+4NY<%10VH!pnc%9%jB$GMq{@j*+m@rAG0fB@^88kV
-9FZ;W*BUvgWcrtZN|=O?O$>gWXk&uf^e!0RIrQG(SpCnTysteK{W=`-eiV|sV{dMYOI~Nd9~ScY^KYR
-b;&QsRmO&{2VlKE)7l9;QSiuz5*zS#vZgU#U>Eh^d8KH&PU9rJ_b!NQzca?kLw#gG#Ujclm}Q4~MK_a
-tgTH4Jx=9Z{rIU14)y-Hu^Z>cn@eN=G9mhFFZEx_u8UB}!{ftqE@`-@9q39)Ac8;9gNM5&_@!*a&rwP
-X2VHGEDjq&s@oc-Mn#IGeDTpeh+2cublQ6?2D5FIAs+X?r<9GFK>-;KWoP&lu4g9{0^1WvHm?5;(+qk
-}<xva4hTfB3r0c$iYtZvOj-mIg$_+ev^qo9OVd-3-VPu0Ktq;zMU!?xCtHG{<LPU}yK_2`{v1u2%~}o
-6g9vxI<?Z4cbnQ-o$&{g#G6y$wLJH?i@MZc8aqBzBL!0#_OvLKS$$39*(ZR%QuH(o0d4m>H<Ryj0e);
-F^opgX*nwS>)bQ8|2xr(?`ru6f~DUkj$qc2K6@|~FE?`N-jQl|--I=V+l|+9aJlaOaRGfU3?25f7TON
-%{mZk=gmyG`_1m3CGc7!O#Msx755Ofwhs~}l1$&$I1{b)G)ifNmBe%bQK963SV?VREVe8NA?yc1WEf%
-;ANT*+P4KrW8iW|TPiP$+fNpYL3v&b|!4MWk9h^@X<g=!{wAW5X>%YQi@Bg=WN?Q-Yx$jDiXUY!n~iF
-K{M2mAKy*Lv|uBYP9Yy*jiH$t9<IF79Gv*S6{~_V$#Er}hr-1PiLWEhz)laW=i=i-jY@1A%b&(kT0d`
-+(>kjYjX88?Za4f9=vU{-*(*fXrY-U+0;Q{uE(8h0_9S4xJ#a2#k&zQfrPgaS+pm?dLo{BTv%F^PFNe
-<X;j}R3H=_hRt`SkMzqR)zY_Loz>~<Zb#X33o{*ek<@mL&sA_deW#8fy0}IGWwR)?>Ksk7<)<zXr}V}
->X++dIJk;9ukXeLI2rm{>amn8)dn<Fweo@qMY9m(<Xr0E+ZBW<+tMJ4Rtjk{zh_CgzUaQudO84jTrJZ
-O1m2UVJ8U;jCbohU^#aN#1k8Lp+VsRya6fmQ5kV8HjPL-shq8q{ak?s$>;cM8Ud@P`p&7rE=dafs8qu
-$N{_HMd+`E{0OO`gtD{gZ7D5?-|Fs8sf!CdYr1$>AFgZZErTI;Hr@cFF%Al^ZHh$3p&J)3;9S18?o5v
-d_fJllLk+K-)Y+Bf-5ym3Ez?EpIzsB1JDv=S!m;%j*iMO^ZcG^KGSiQwe=vWMBQn;(5G`kDY6-@{MgB
-4?g|RN142Sw9Ffjk()|A;_GY=`7W(PygC0WZ@NMQy<V@XMjmqx4*uyo1c0S}eE#+?;_T(?pKw|5z`m}
-@Dk`eArhBjXRzD5M(Jm%A2=W{#jVHl?Uu&INp;W+Sp!>AMd?0?pOjF*N!?LjO1@Si`#~T4ew8Etz_Aq
-nD)QbUeCZ#=r0n}KvGpr~Ca%|E^K(9xjbAbMjo;?1S-&sL%ry}nuaXpxi6FsCqRFF`dXH1{t&6W#~sZ
-D})6?ii{M+5MR1gxpJ2wIrSn#PB7t(W`nf<JwLWt)2JT|LJ1s0UDdi8sX`9^!*Tv;?|MaN)*W*`j#cm
-UM-PnVen^zWYoEUR_m2E8hKK2lrms;7?CP9ZDc%Zn6_+S5kmqH5uNf<d$Pt(aBhlf!giDZlb%Rl<*jj
-(0MBll6lgfIa|UscLMoP*F(~@>5(HndZILF;EPdhfa8Qu^c9ZXk>5Yl{r>Op^dKHtioE;&WBa@lSZ~<
-=hW&cUZHs)?wYwDljo9KkPqArto`dP;CdT&NX@hHfn^5w@c(HtnENvtnH0fpWcHkcea9tSgNn#w0N+5
-UM`e!i;jx;5<h}VIlOX0$nI$&iB#&;d%!J|J@bJo}11D4FHY)c2hXO-$xz@Q(wX!T%q_mYLjsqef*ws
-8*i_bO?+Yp6bq-5aLH$6`$PSHS{}Kl)xw7m4@i6N9SJM|bExV{iJOV8&^bPV{ekjavU!E`!NkW%`7sr
-axe<KLwz;PP@B3)&P&3QEqzIBiN(&cmQwrwPsp&%<G(T=L5F@VSjxV_@UBC=cP`>W7@0N1ICCgYR-*m
-oO|38&n9B|fq~Bp_|gGg(~S9gdS?LGk0Mz6<#eH=3h18x`0R|nIW$Dg><%}D`RhLugw+Y5u}EI6w6k$
-Ar|VL+p725#rVT1DuH7Va9Zj47m&3jN@qJ*wPP^EW4rc^72YrK?;#pBU4B<z2cUVDmjCX>sjfW|o3ih
-J4(4NvYS}=>76|%qQdP5^BTqQ5KTVEK#{aaVouO-gO$o<B-ys(b9_Vd9prVjAXJ#}f^cs@AYmN+sWkv
-0VO4xdC+ih(=;h^w$>>xQhsss;}yt#iCdma+zj%llFv<dxZkf&g^)fw|?wgo+-}`B9niHEme5+?`O(c
-a<#T&mG0z#s;Akwh$>5w4;LA0eY{<oZU`Aj22B?cSP4g-Is5{pH8<q_lY=XLBp(zFV%WZzD3-7y4#^2
-40U_6v~RkkvAa8*^Hn?k&{n^ken+srvsi2h-7i=M4l*?cEUf4fbKJ`|mDEx~%Eml3M8kS~lb~A)>zo&
-SFm|s%^%V8MaW#)%9bBJ~wpjJ)9F>(*9hTEYuFcl3SnXXC%s}+XVGh|6B&y@+3j1vNj9bDvaCby1u3^
-tg7#77*x>Y*hK(`R~sxEW4=rRsKeQL3#S5z6m689*w>=#q^fb1=<{3MJ`oTE3y-NlrHMU!`;y1QKPlZ
-zy~V#wa8_bQGYE`sdC>WU&iX*OYbBV8rUH_`ARH-Kk1hy8PhKgn?&&SzC^2#Q<fNLS#j@>-WQiWk*JF
-503n;n?2Y6AX&VROs+NmmBl#Js2ih<`~}7gmYPj0_5TL8ZNmd?%G!E*j&!8$Zw_V5&{TLPk&2Lb+}tq
-jyIn!(8N-_e*-`^?z1q<&G(t$xl~<?hm3QDxtF4#pb+#4fPg>2HPBcck0~Nrv74&C@}+@s7(R>wIfs9
-I$1LXPW1x9Dr(zoD82s6H`uF~(|6a5IPLqF+iSKJ(2W__P@naBwc2Cog2C*k<umRRNjLk75E;cbL%6>
-=N1~xg?_-Mo9g$V>!S0eTIBHkcT;f2O1*J)IJwf+ny2w#@=k8>G3GpENsbe(o%r*@_X#5q1fv1u}r(b
-1hRbM4|W{Ai$aM^URoFE6Y5@^biyhkrpyDMq9rMwohO-P=d(aScmU!pgaYq$57#%X2r6#}l;8%{R@A-
-uXvcVrS0p>y$FQ>j=Vq!i)qw#XG3M{&QK!OEh{=Jbb^z%eb3hM4R)ad&GZpVh_rPsF-k^ore8e4em7r
-_eFq=>EIMB1^PO>&aXu5j^^90SlFiz=(|PIPNw10j=UYPP_bvI2kJ;{N@7PgZO|9!OjCX9v*!xqmcx6
-x@~TyZSBIn(3e0<6)flcPcy@M_aWrp?RkEmB`U?*F1fb%R#^g}j^r8K0m<ElZb?E0~?q3?}oUP_Pb-E
-bHB28J<B9fGuCAahsp<L!r?)OBBR1KADaRr?>w#$xTQkSGn7-GYp-Pzt9z<F<wo^f6AKIFR!De-6g#`
-3^n$O8`*-wB;^L?9OZn^6eFTY2c@7UO|h%-*v1TJ(=YbcHN?=zu@YpJzA-p7qCc8~+zjO9KQH000080
-8trnOul-Sn7ax90J$Fk01*HH0B~t=FJ*XRWpH$9Z*FrgaCy~PO>^5g621FZpgfh5R3&M4G9L$R<=`Z8
-?Apo4I!^X5Go^w^NWz!|H~=YG`|J001Efewa=f*tRaG2O0ve5n?$@uO%gf98W1@;uTjNFLRVvDjv(<W
-It5Os)d5~*$d3kxUayA!>#i}YRrxpvL^TN7P$fdVgRjNgJz6j%Vsa$Do=Idd}Mrtz_YgjIp`>}AUP_i
-Cf=wiCqDwA3__4=`%Lq_l~_ZJrzNhZA)pL8*I&bnda@@RG;@PdP{rB`H0sQNqdx}JG!d?~X`(&xcMZR
-=p+oifVF>|j8omD6S|bZc_k=oh2^7qgW)XZWr5rPIrbKL23LYg?Igc(jGX5_eM5!R<E62r1ImY>`M~Y
-$=vXtjLNet?)46S9^?f>aR*Wl`B)Wm%lrF?5}mEK1t_Q*xs|9Sl7FzLBb|U<vha4dD?krWiM7(LuA^h
-Y1@m}%9mdiCRlToIVID5TwJ9mP;ReYZj{KaFGW>MN;^qqsl+x|5_W~vV^|CAg$$<IjIQl>{gCM!o9EJ
-eYuT-KWhFCZwgOw0A_=o-6*>aOzil{LJr_5<9l7AHiHK@b+n*3}Lb`RuXtr1Q<kVK%%D=93mcG^Q*-H
-&Pp%iChA+ySKQqs{a$rM7&sid@S-_5bD%yjy%jZztfjgh%}Dq!MxT2^Ho1T<sX%`jgTL<TCDeac*GY%
-tlebR+$SC-|pqysxrS7l_7YcnAuUC@-9)*uV$KA!{h19Pt=d1Tef7SxMCjG^vd)7mJ}+*(zG67d=k-{
-JeN2e*5DvLly=2kH?S037?)ejRV7w_KL{);{_=+;!>xKdH6njQ2SSz%$KPYY9`dwx>Uh*J)U-%WIlT3
-7k0Hsh}TU`=EIi7v1nUbEExO6qUBNJRlO4!n{JSTqZ32aW67JHE^WFWj@TDPOLu%Z%+#wevAdj8C|O1
-fem8^ZpH`b8kLiGCtogTc_87o8cZpio-e+ereR*~!PiikPIu6OFB9i~V5-X`Q)Lo))Fqvldu31d3B?Y
-N?Fm`7qYim=nfobJ~le1(i!N7E?GjU}oeuWP~%i~&wiTy&rEceLp)k-Hwhdn5>wW-8n{k<4wcBdT5O0
-dEqGlp5_UZ@BsQmecfpz>H^6tMyxv}9vSE=gcirqIS9tKw#SAR!omYrq#W0V(Kxr6{)agA!lgd~R%{i
-b6=4MAO&6CRHdoJ6&$3;wpnT4=~^(V}?}a$dxS%5E(hL)t5R6AWd7SQD6czoMOTN(KGFs0ug1l$mE_j
-vW4=n2-Q;K6!!wGyl+-e2X%$oQ*J=w589+*5lxGr7S6;ywj9HtRemvE;*ZnoHCQ<f(|J2n%)oo?n}rJ
-LiTdEBTwzmu5{ILuvCL%f5yQqfx<uljpt1&BpBg*mzR(HpLv9guatS(A(q)>U>4YU52e*6x7xE*4gXh
-8EkQ|)1y~Ln;6LLceU!jCK3NewZ4yve?aSsvmxHi3b=P)l3o+K7C#)`8?czWKWc4<-;5JSo*P6rGae|
-6YsfR)a(B}ZE8%%E3f{_XQAoZZ@o&hd;n3Oh7Z*rGy;s|D!i0c5t3Th>BBfZ#k7sWmDw7j3NigfgJ_F
-Z@8fh}_cheZeL7+hw6P^}_#df~i1m1ob$W4UF41b+pbC=X#8K8{&Rcqv${HaD(4oWEQ}kUZV#*Ya>(T
-OUS<`VFgYB1K1c*A*mmP%8(_4$}qjwJT+)o{A=Qg$Xn`T*bw`H#;*d^?m%i3Ejq=vSF94FFr7eTl~5Q
-HzegJ9lcgj@)&dO~TZJUuDUd5sD<TN&5BSQB4d!SO3MzcyqmrT-%xg%^zqRvpc=<+>l~_+g$zUsh(yO
-jSui2tm`?3?;m(i6SG8Z(=d#x3B+!*t(*AR^$>)GX~)$Bwq`Nd`bH%R{Q-yliScJ}@ErxC@FeIL!jQj
-w;57P09;MzFj`RfL1zfXFCy0H~dUfPnjnr6<li+TY90{suQ;OVTxAK{{AWCh=(!_ng~QF}z`0G=9+8+
-8_^Z3vT?q&AV|n6*qOGgVcql;l#H7$V>-H$$UV09|}hB1#dOUke$h_BoL%aHhPP1dbVUjZCgeMmqItB
-X_U<@H^K?xDE78;$8D>puX^^VZ(^2{dBNpnDu%Z!GJx|;xfevILuK^{zdl&fuxDeMqylYf7-kZrLSL0
-O2Q`Lr9XfBbZ-imb8YwEt=uAh0(V1>#EY`M!lv&WYF1z>ZVryWij~sQ8iib#cua~Tb&^uBeIjT<pdDr
-pm&k84fIH;3rG99;8L|C?-o>m;qB~w*u>NWz_@s{cO>g&h5+xz+A=IZl}5Z{TnHU)Nxc2K`iXJJ^YK-
-K8Bln=dHC8OJZd<WgYkR)_N1$e&P{d!DF(66=hp|ME$wKfp57~HewNhoO3FRJkx#YvXi2$e9R_LeI4x
-Nj-Qb?EQ{8Jl3nQbo$axh1yHb-R0Vt!Y=@G_W*vbXxC%B~Kfn?l&DfedHK5A_{J~L1&(yN@iyY8d%z(
-qbaLGr{^tU6UXvxz;_!c{S}ey^xSM#0BZ#i(h><{CZWNYqhNICLAx>yDNf<`>V=<0p;hAqMm`c1<8vM
-yy*g3*{Av9x>Xwu*u^BsEQ`*%7Oc|*}_(COmMUg_Z&ou`G7rQ#3F6$8qn~FvHxZ?cStvI)5s|${>8;d
-#72UqYw`90c;EBe|et`o0bQ3FNPo?3EvHaM!TAl77a3JU(eeMK8GFNhwQp;e8lf-OYm2(4Z`Xx7hxGw
-EH;nRRF!HGRQ&v#mTjHx<`>bLJFRs2$yw3(i(5pr@NaM^}9qbl|O=WEAy*b)%ds@8L$T*{jd#r|vo3-
-^@SH#iy$`|G0WL|192q6dyj`i}zReZ*By>6BM8L{QB<Wdw#x~|MSc3-TeLh!~N&}NnPLmI-iPID)~UG
-f-Y~<4m$ODjs<!HB8M=jZ|tB1rs5-U;tm@h0}Po{PtdkVf{`OBfnZrxsHK1JTdN5um-`rMT-@t$g0+1
-5L`_A^+8uS>$UXmbRgFXG)*;miD<GMz!I$MG=V(D7lRRW`YFQ=uFo@@M+}@~17+EU}IZ?d*bJvLJ*Q?
-r%Y+BRhHkDYyG>D?mz5B`+RQk>NiXOd2DE0lXsmg~+@1HL5UDlm-+u9Q?^0z57%%rU^5}N}w?XBr{#Q
-iUi8{+1D(-|LzGwO_?pkE2pBWRLhy~QIf)iFohBHm}Si@xXcdZORRmp}gkNuQ+ZxqqI70bKCI%O8LG`
-MG~i8heN6h%Z`j_1r(FyLG~yVMnZ)g>^%IpferyRo6A#M|BMagF-V^NvK^M&78%*Op*;~nM0nhFL#P{
-5Q=@znxxj2bDeHG(PQ#Gpa+G}Pgf=V*5$hbB8DXY@;Usi@$--R$Isy)U_7W}ie4u!?CWlnXOEjW;fu`
-XC(>a%n|e^7A6e-~7(D~r`HT19BE6a*gQSV6WiV(MY>(j9Xmmc74)^x8^QRV#KL`vuQ(NIfw^dmA{4x
-z?w9uY{0|NyPdmc8h)aP(SCPzOQ9RDiyX^-~Q#Gfgj`|DJ}lbQ<>nItH#k!zzm^^;(^u2F0Ts#l`aNf
-uB40Z>Z=1QY-O00;n48F5TD_$B{fDgXcuoB#j}0001RX>c!TZe(S6E^v9pJ^OnbH*&x0uR!SfNXF#KQ
-ZDUPjgq>K)A*~;@n<<n`zb2B<bvX!$X#Z4X^FYV-`;uP4J;*Je0RLoS?vM?U@#cW3xmO6@V4G{WhGnD
-$aUVyLUgrwvw!n)BFd_ecd{J}21m=L-iX<3x$Aa~oXteJ+15=b@_AdYcb%N^-$zI4{kp!sE~{((=i<6
-#2#b2XmW!^et5$=k@{KII-F7W?>9UheSJ&%Szi9X7u{KYQDZeQ<vfFQ^`LwOu@@|`VEB)d&Zz||cd&I
-rimfLLhURFijWKc5O)bC}R?V9zvoa=6F^QM&|Zw0@e(ccfR-pHSKvh5rI>W$NdMZJMe>Kf%XFN#LCtt
-|lavNm`c9SQg?^2JIPvu#sv0ZIFbXt!&?*IhReRo!gzb@_{&;m{{k{Mp;*-@g3e#q7m@zkBie;^lX*F
-DByR`!{dCd;9Li*Y4Y+anNj5$ZaDRInI^t!dr<$EnZe{%I(S19~r4(JvH@aSU^KnH-oof!EL^{$=#wb
-vc(PIsRTUCw)<{XSGJbCTga_PI*gL9%eHIE`3^t5uDfsQT~$oPe*mt3kWC9OpRF627yFl0+vPxh@bP8
-!9xzq>xRP@HO}UmxgN(56t9G|V;F7<3h$-sZYF+1rZvWe77qfS-0HtL+gIS&kMEtC)`49L9pNS3)h+7
-1z>vIc&-pybRZLzJ~{`U0qF26Qoy_Vg~bS<JoU24^B)}I5lO*8?vKq2K_Ot%L4*?UG(MECSCQ(q4O@T
-hc=S9Mh`m<|!G2Wsj%?N%<zWeF|Ch4nBJvwv~%>P6GkO<bt}iU1@83v35GZjo>0(b3Ut27~}y>|9(9z
-rkhGJ+G^-sn^4a7%n&6Y|*V}tGp`Ka<&1Mm*ey-*1JMtfj2Y&`3;hGGrR(L7cZWF|Mtb~ySFd@^X2Oc
-1WUy9NWePnYG8U3v8vmS$V?EU<j?Q&8(9hJ|MM06D~GLEL+3@k6s=qUs}*%q0<Kyyx{&e==C|9P9Usr
-jE?e)9PkwIp7ytEqOwdLH{MZgAV(=;dGoGjq^!K`kS;1bUKAxQZOZF81cl^85=d-hu<CD|y(-KyWZti
-tmN%i58XxkMm36ZaF^L?uZlBr7Y&F>=O4|#@c0B?$UWI*k&=-p^WR5Y87q1a-bx2;g?m^jmOn4_|QU2
-9a&{{S1y`0R+<DdZA%tFkJ)*=*Fx^>Tt!fh8tFk@Q3$Mi2;866%LVGgT70qn`ZFdcmCgOJt<}JN8TKM
-rd&S=ogsX$US@<xlK>JmL@)=u{*>DxU?FgGmJ*UHeHFq7inDm@#!bcpC{svC;XpN_|N#uLAIooFfvd=
-gdFVE#8mV8x60d9Z~yS)$RNS1x3&{kcPrV%mAM`*@dl<J3&E7;n|YB7;Cl6$XvG(z_Mys;0`)uqD}Vk
-NV9!Ia*B_;~Uq)a*3TnR$pjIEHv!4W=)ukQ469LlRsxF)c$|VRtz~|c%$-P<_=t=T-DmuLb$>HS&gwP
-F0E3m<ao#!?!v8v8!!d0xv+ZilNLO38qzgq!QT*5cpT&ZB2aYOV4{%<4mszdo3*5P6$WZv#)C657ihE
-6V4RSEl{fRzf|q`tvT6rKr&200P)y+DBnKW_1jfRVe!MZQJ(u_*x=u-#NQZKk`}%RRB%Gb*dp0+ey!8
-G2UV(ryaUA}A2hW!av8ldoGj@z6}auGzJK-5G8}?K$ol#FrN!_0B-vlqf4M_S{Y{5NH7TkE+g03kZew
-Zw(Ws96#`%F$l%NbQkh@sh&zr0z@+O(jgZ>&~v~nU@iBjI<xe02K1V5f^MCOXTp;+1k(oW?zD4e;`^2
-rFIB<oG7uUr9@d*kG^lsYLYf&D$6{Vqd9$}~K%}e?R=ZnwD5HnqXbPDw?EE|3*9gRpqjU{~W4iisDHv
-I;%o~u|TcRo5bkG!tU$B0KkzA2Du>&9yG=OGQ?K-*1#CN!wZcCVOaa*p}L~kA_Gc<w;Vy2i&G2fMIKw
-?E8b)TVVi`Xoy3>KCItt|<MnyIVx9sy~|9;)GB3P+_lL*RQV?g2uMW4b`X)p{S{Q4<>C(Fk^g&(<PTu
-YT3<0<<5HKleT+YhiVQY`cfi(V#uGU^G^ID(VMNcxo#D4lVmD>hIkNWNG@jTx!;Vtzp~2Mvw#fiFf<0
-B(-7`v5kSx-l4S;z`;;Xgi=}y0o%cC-4sCd*E<~bnHa=yhN>S!|J&Gdkw@Y`fUXLM?b5mfs@H%4jd{}
-{8Fwr37vNkSY#K<*4vd`XQlOyD)}8XbL|o>ej%=htb=~YUaZv+v-WwZ&%QGG!Y-AOHKzNdOC8?D=Ko(
-AcF*_8R+B2uBp4>u$LM9vFov`4LG0EmVcV|jnFRxd$oM6CG`~h|e=%xc^4mc>*wtv8Zt9`dZ<P#q7fi
-RJazhs&10PWWniKv-fnUA!K!fPZZTgE2}7&E@j7~9yyX!w_5AVT1;lDAYJn(z%VBYZoK$^+mUZ6Mt$V
-~mb8gamN>Y2d0<ETucN0vkN+rK)8g8FupqVD=BcP`DQ}-n?m*Xe9v7KCfvtb1~x0s~l!EXPXO5DQrZf
--W9NIZRD!H4YV!(XxeFIHwydgZ>CTvcmeb1?XDvNGGSQWs`|R#<fu(kM{lLLg+&M?y(z7YkjR4ePvr1
-BTHxQld-vwT?-OgaGp(L$m0$l@aYi|Z^<3{Gwt%0I@J60Ygk<5rkRSvB@-2WXe>^k_B{h;TCP*3su}V
-(0Joc5}^`y)OBS^lFTT=p?utdVMAGFdZ*Rfii{1i}_xKQl+Rt{mWCWeEe@r^Xrt#D3SrJ1Xz5FlCo1e
-w)P)<S!u*w!7e(-PSvS`OJ7hXMv`3m`pTBguqD0E9FnNaw*W<W04aH1&fojT%8!Klq<fFopm3U*e8>?
-r*D+^36kr9pe^d8>DesmG53%2wCNGGJ<wU<3B!o`x=Q3*eP@Ygi63QtZJn#IIw^oN<ao+7l2p>t5h##
-2|bI*T=Q3B)6W(wK<6mnMU#+)C72*tTM9t8YmrB@J3aKXS+1A0Fx{}{ftIZdWj$<`%ubo&2C)#Je}iq
-g#f=Sk(6YSV;oeUhkhX^?9-{<<gcM)^0p5-;E?yzGxRpRAEbq5#v8jvQ8fA6yhD_nu93uMwto(gmu5o
-^|bfFkQ_?rW-zOkxbUKG*NRBB*2H;>?d-@N?q-@ia98M@c5>fO3PdV{_EdR@<9S&`g}Ur9*e5+rzgP+
--e~{T)`N!Whzai{dhg_AGcYO0~HdF)Te85vze!x|6BSf@)b$aB-;abPcosbGec2jLfm4GLsn#Ij=mzA
-}R6!d-JJEZz@Dj35oJ+%R^sLj}=(lbXIxG+o$%#0EwX(MvBWkMN)%?9W+QXxnN(NP>ehq#CmYjpW_$v
-2_`8Vfc(;FX`@yA=iggoObZsrtxcf?4mmR`WMrNuAXRQ*Y%`EZS?~9?Zu5M>&PBb%$_faE?9lB%j8Gc
-|iLxCNng+;MU=PM;HsTm4IS^FYAaNmWwqisOCRkydY?i+J!lRO)e6eV|>xe4xE3rS)QJ_y1%it*Pai{
-TvZ-#Mp7{nE!isVQ9Ct!yN{@nF8aiLIhHIC8jdWW=%&m;0pp$@j_6sj+uULji?q8srTJxIftHR5o!SP
-9R5Qz)avRS0Qb9Z&McF_e{^%(ElE`z;a5ns5Mv4TR;W4^SQ(oH1(PUr%JmPiMpNQHUYG74)N7F!6}O3
-h5n0br>K-pVNr)D`}r$JVez6jft{_)smtPr>tF8=^{?k8Z7JuYfE>%wQveyQ{UhmLRF;Sd%B~4ma=t|
-f2ctsAg48f9H(0a0c3f2e)R7ku^Lboj|lNl&x5u20n_?mY2tez+u`GOh<ki_4H~2@&TzZLEnk*s97B$
-dJmkRcU!iT+(dq}}gbvp#V-cAKevJG5NPLG@F^~dijgnNefIXxUEJA$@-tZ8-q;QgnmxL38lB%wz#1e
-4FOrvI?*EYzvu*2qBfLN&U7&MvM%I43z0u9e~NodW0ce5M0SF+I};b3q#k#BYtTX1*E)_W~0vWT#djL
-^`0WW{C*ig9eSsKH#5{h2ow)lCv|NSp_Wu|fSzE@guPDbbIu|B_{O6tc-)f{IS7^nlh_XSI71B{Z*Yv
-L4B*6qwT#64|E%f{VD5f079^S<0{B8jMdf1)QOwMXAg=N+MJG)r@t9jaDJ79_EtWXPLH<Yni}&d=2Uz
-t*qOeg!i`OmS8^QW{wXi#{zu<eVCp4RcLS#f<04Zi<sKtG}aBeUUnVhr6`v$31p{3V=@cQ0SH=Iguom
-W6N9u{l1NEkgXTfdb9xD~alTGcm&Q-E+n}pi9>5PU07I+Be+z7IM#%RU>mxF?vuQLHHRDUWq&lDTjEx
-d)ELE*YQbD@Bb>~?YQU7Bu!rcl(c6zwU<5ufWx#N!DF0-hHHfW`W6QAi}ConG7Z+OjQ1Myh(eVIZE{`
-~QR$OlN8j&2`F*tRw?Q;M)CTzSz2>d?VBWN6Nm7;1xhuEUj@CFbVZx3u<0Tss*!@ko3vfiG>)e2X?LL
-?-SY#Orb$%mQjw)pE?9T&(h{Y&QnNJ?cG3tVUmOFv9)A_z6$VpJ=V$3A^DJ*!noM3+XT&TyV<F)JioF
-=PP+-U5<<<F(igXy{kIKlQH-ZcVB_hwhE-`j3TQ*0SBraC=0T{wY$X%D-5p7?g_`qkbeq$L~%2j7`-I
-5ls0IX!g9Hf%u|o3p>+;SN9}JGTV^EZ3UMI%XAOlAj)qT$6LB)WoSyg=Mt53)r)rFst({i&3OK*^GIy
-({-d(S-f&*)nH^rhxCtEtmX@aA_m7w0{=(Hvoq{Io&(NpIz@kg%Nh1`E-;CvT46u?dvE^?2m$^06GZa
-qm^cgK-Wz##IIa~~$^QmAo8FQMSz(}c|lZP;bClfG)wHT#rc_M-%8kT<KM=1~_CF)9iiD{W%H4I60;+
--!_bfZA0hRb)prDB!51*2dIyn%!klEeudauYrzK&C2aeJ*Jti8ve;u@+;u6Um|vcIW!cCWz0}bB~^AT
->ZZ58sid8KA7Bq7o4Wy!F^WfnUAO$*Ag&R=sbqIsH#Z@w)a&$^eS+!7n1h$FN{F8Rv4u51Y=|6+DSkk
-?lU$`er0N)+=Qa7}*#53iB1l`|R|+*Sf;s_<?f-19C!$yDSFt`5TiM1Wi!^3QArFEI+@D3py1pg%ZnU
-<YZ-*d-mDJkrQ7#Pw@KBu8nh2}Bq61VS%W-h%?p`{oJO;+r>ke?JjMvJkt^g&GNi2YZttwsao?!*z<a
-3@ye}m<~W7=FpPOE3{^eUc@)BYKa3i2F0yu6YXg9xDeMn@i(AxzM9-F3iFK}nTHQ?i7s1PM11CIIB`t
-Yr2z#%d+ay=wxZao->H_o-7m$F>Ij#!=(U#*V92wa*PZz{vPaLiB=|KuJd&G&!1JSDIhcy)q<Os-(Od
-4lEESp{B9{m>mn9%B1a+lGs@)JY+K%yz^x*>Ih1nop9xT<ysX+5@0thnTvgRsK`p{fiXNNsn%%)WgzW
-vAyt+9#E6p^S_2$*vq8gop`}b!8aSBD3l&g^Ay8sp?<km~MSWrsntTS-4UIPJJNtbpN@GtU*Q8kvr&B
-fFDUI@RI}Duwp^*HrkFlkM?8uH5feumY+;c4cUMMz2cKgPXw*-$DhBfoEV-^t{xD9Pbh^-jgJ3-cQVd
-(Kk6Mw@FcLELK=hz0p87Lgn!m10yz`&!XE_P^203tSh@^o<X2M&I7gO#`YZP{aE0~lz$*JqU2`k6AS#
-SR-!HTrp1cXAXRxEOiZ4Q#28Fi-+8a#wD48@6F|<-7#>f6qkYhMZ2UFv+fq0F=Z?R&q6gUI#ER7zgwY
-So7l98l*^606LEUL6)L$kJh&U&<KebkDQUQfzMr#iKav-tXL7`F~yMZO5y1XAo*_bR>u{ge^YHXd-i0
-L+Th362B78=cG|LT{B2O#Dqs#X96oy&j#B|aJk9v;69FYsoEknxOX)H}Kd!$dSOHgd)sgcYqc?2q!oB
-Mal_er<%g2&2(;VXIfU*6i2(JY%Ki8q}L|x(ZMqWb$;2AWpqa)N(&l_#sL>`U+db))R*$KYA0GWco&y
->e_<^XP>4<PKUDTv{ARf4k3em!iBw=-FI>)K2@4a@SQa}~?p%jP_U2Vls30Y#lS>KW4t0}XtnLE9GEa
-_xYEKkk9!(O(d3;kjQ?d>A_%ZR<3Hf8Eng(najL{uD5SO221lX^m(;3?7LE(*Uy`ZrmZ*fq6EdA0>+h
-s0G8mj?I!dLfc6Tyas*o?8n_va5Xa^HX_q|2biFpYC5G(O%WE1WI9E3Pkl2mH4La<my5Dn?@^~m=E7Z
-ZBI*{n6H!<~6fxz2(s5ugTJ#Yh>qILG$4N597qw(zNU0H?oN3pjnq)IcesCLkCk{pTL=!Yh&#Sut#_@
-KSu4QTc!Brf(9UqEs(7_#jW>8}Q^+G}%dzq3^3pw9ikA{z}L_BK8Rw$;f8O~HMK{PuXCXOi(L|Kiz*%
-$}>-1n**2^>c4RSRVhx1XP)Z0MMEEl49>urzcYpYQD9bsV9Iq@#~hsyCxVMCT-E$2~$v_&Nv9jt^dAV
-J&?Y#O0BO#o3KO^Q~})@QF6!2|6sD<{oz?b}ad^!yX7jiW3mUm&14$ccR@U0eeR1DOR=h_OvLP89y8F
-v^~)QAfJGG<$;(mo>lpJ|BH?9<&(D92oVfEWs%31<Vbt$dz1|2bB3YghkEq#<Xln9YVTrfrHoeYE~eS
-$2hu^BpQJarNj!1-2^dSF4+l^mjb<1Hw~?rHMl%tY2AX5V;xdU=9jR|Tb2?zjoCdE_9gbjKjRS7#@AL
-N~+ZPAo$t;&Xq#(l7{gk03GHP(SwlWZ79)RCh=BUK4L#-RalW>71<56fVfPGV**@`o`55T-VbdlpcQg
-k!9P__-IGpOm2cij!|)&9YL<bo2DVx~_5j`YNXaEOA&f#TwXeJZU5-b}=9d)?$kptZbf_AKV0sz4$mT
-hx$IK`o1l7k8j+b}fUlO2k{+7U?Fc5hx<&AjQbsigVf^p_)N*r2G=L0Q#WYWD*LL`wpa`um+!`(&1}z
-dIhDFJQ!UThytMJdoo}s0-`?7XH3zhXA&^jeP3Ay!ZjS64#$>F<&4G7cxmxoiUfx8w23d_6Oa^Rkz+t
-28B0O!UgT(oiIHQ$(di5hRL9kf=7NGkFQ9|FEeWD*bC_s%7Fi%$nF1DN!pPKoC2hq}{^lBpmBUNg{(K
-r1N^65b65u#Klb7smzIV<#FjC06il##V1=F3=if+((ew`W(i$IwQ{cpQ^tB$ac4ae;|N&)XnG)KnMZ{
-d+I69Xv~81ew$Runsp#+ssm7RZd9)0r*o^JpBq4leQiLL-Ma(*+riJX*er`K^1d_<)R%KD?4Du7&*cF
-&OfXCH;lHnuC49Aa;;PaoKoF*WW1~iD&4znxGc}5JJ&Vj5%`b%3KBADcVM&^6D@8ut!7l@myA^wVYC2
-(7BW9zQ5znfuGrrFtkm6H%iv)(P!M>johEBtN>9^T@dtgxDzyA?nsC+!Ju0p>tZ(FyY8I8nXlQgMoyI
-1BZOs;d!UCYs8J{5LdsQ5t1cL1^2n+ZX%?`nqZ*WuYMztFNQeEQqeeBwM=8{>S{1uux5dY;7{<^>qyX
-4M&5zr0LPEmb_JG)wUc-sAQ{H#jdLG6?5=H_2LwfV(HeK{S|922Z&QWM70U$9SuWKu+xTnmO;S<M%5w
-DL)j_GNXD8mpBP!_vi^yegHAw|XANz+&=tims8a^QS%9=A14ELOL-zJF2~)RhRv=ZsV9qG$Ck1Ngn6#
-yw&`P0EWPCe<Eg79${W%FKZtwB2^v)l)(h_A_1}1kElgXF>ItccP)j#XcaM`qzvx+3UU`jzV-e6P4x(
-4;(E1(xi4DVoVyBfXN;r4=0|YvVqAaG?Hjh9q2(Y`pbuCl`kJmQKM~cn*iRLV83b9J^-zj`6@n}kO?L
-+dmJYttOga}cyP#!${g{4>eFK|^?(e&Z=Kn|4GB-kOO6{nv;{qce*S8NB!oUic|o%#*_Tms9ebP(r@h
-Z2=jwz1Q_6MG3Nn4M>21blDcq9nIWyOma#L=%u9_d5O(n{g7{Jx0GiJ1S`cNOq*DpgWbB~1?6DK&O5Y
-&M%8uuj@&GMocCG64oBm3idVB>TO2fbjMXi9qWdf<K8Bd)0?zn^W51p^c)XuOe>ToBI<HN)w4Ke{|Q{
-p{+e?5oSC(|^7CYWz<_H>jFjWCxDXx=7a+2f4OqVA<e@C#}$OGvQM&*TyP~p$!vZUO4jy!z(bsBpw`+
->vB_8Iq|q+M-qD{+hiXAREw?5@PW+C6W7$-PZ!D`)SpO0$Bw1x!A^bOVQxys0lk_noBWy*tR(jk?6;o
-<BP!8*W=jn_U0p49jhZLak~7tjfzz3AW8HL9qhW@o{<I{ni<RgnbvXXLSq(|oH`Pg-$pNA7`-LmpL5+
-*|5hD1zg8*RYGh#d{r-y?8H0kB7Cm=>t5hMgT<ea!r?2REjZvRbrvD}sd#u7kxNX;2Q5{K?6qFFS7OZ
-|ZgD%+8}$O6qUK*<3j$1i2ItTDVKEa?}#>r9zD`za=U4RPXD(V2xu5zXLi!H3lPB`OR_fYCPO7(6s95
-99S19MM)SVRsa5q|z2YxChCFuDZ3e=ZB0}kIiUjN*9A(Jha0D&crsb6irc(+8v4_C87A-X8rvrg8;pf
-T1EkWiw8EkPP*!(>IaS#qn{o;oK3!{+q;ve1I^ay%&a?(VfIV8O`I4%ObZ$=p6mD^YB-F!<hcp_`A5@
-eAnC(s_)`Jysq=0<2ZRrfwPZN@teJw87<JFc)#zi_J0BpUF>r7+&9N!>L4EBtny5kCHZ|sxRH<<(8eo
-Jpj`H_I=*t;fYH)wu0l;4|9(A_5?i~B5K9PxsiO6qoc#fiPmZS4fw7zHxD%YHf<DN^<|8zn`g~0k|rg
-Aw_NZmxaHBf?WcT$}G%hRV`@|^)&^Y7y~pY*PphoaB&8RI|rP&N~yO-;MPQXtb9RO-EHrh?{2cC!jv3
-*&OirE8an<(m&2`mb35;n3OlX1wCAc9AilIGr>m^uTI;h*D3NXH<&QUyR27K_c4{neMUNbyM%Qqmx)~
-vPF@%?Ay#V@Y&Tz*|U^y&Y7dKTGS23+1$S+M4Vn9e8uIf?he3srPQ4Q%>RRzjya#%zfDV@sh!|Lzd0b
-5>Lih9uvq2F2haRpxt-go8aRk+FbF7^NX_Hn%4}6k;r%`D$3xQSnkaf`Wbd3zOnj;W=PP8MP=+A&=cy
-0_C(2~k%1k_?=vxXu-g-nq!MSJmW9T7>2?)qnCfH%GGzpU<{>)V=%z_McpmdV;h&kE3^MS@;Y#3I_h_
-h#Z`|kIz-eA;|wRk9HgtH;L3Ggr>HA0S9r>o$5JalHM%VK(F>NoP-vv`ay^XV^7r~f+3uAYpi_ODN#O
-yR{4)vxU3*k-<dvs<q{=Rco`-jOXYR~cbd9Jk6FtJ^-K1KKKQES|=ovk&4$cAde#Q%_H`6StZ(9InYH
-LBcd*bi8L>SCj}aW3Pvka1<I=IX19*MoA-dL@-9X=N0)Z;N!f!-qpKyy;m1!sN}wu%E}wb{hXev_zRo
-sv<Cd+d)Pjy2>g|~gTd+GQE)yGiwF}DJW=*IzH<frNO`$7*DYvuQ*Sr!jOu+xzv9KBI76_}_-n=b6nV
-^gQppm@eKyM`G8h<Lm)!7Xvf>?j2{bd)9e1~?rx8qB^wK`^A&Jp&Ivk(zCa6MKeOUTLCzSyCOy^!lWD
-nYWiJ}!91j5<(11J`hi$&Qe6mX)KMp7=t(Qt-#=IKxa_hbhY%{1mV7-xzZB_vL~O2m?jB5ygE5RcVk0
-IfK8ab^yqJ`scIz)T;0adKbjx-m=f5pju;#<nn{%r_NyJ{FboUh}0W+x=V2TGz4#vyy_%);X>@6(I^A
-zJL4bP||rc&PqI^NI|qKnHPYsFe!VGqQIPaulBIPF6x4PUMvu+JqLqW6g0~bb=lY)ql)q|!ROqkDdve
-LrC5FSH%`@aI)_cEC-M#2Q5V-`#tsFpHByx?eXv(?qO!qah4ngWlHtWNm@@`0ayeAhhEAXd?G&nm*e8
-DSKbvG6`a&UolQ>19=g9kF@_fv6m(KNrUyx3116!6zMlY1bJIwqa+^AwQy!o&7ES;OFb;t_XX74Q|8m
-P)#NMs!(E;M`Y0#7!njrRt#AE@*~6mDua<A6keedck~fd?iXzdyq`W09mL7nM%>JkAR8h_iw`^^$_{A
-#P+yKRmxsX-1S&Nu6O)q9t)IP;x1+$DFUDa58e}i<{mr%&ks8EZPgMYm3!7^%xSrEueC}#Eu5+zT%B8
-C*<Os9TJKV!&C3B5c2TJS;CGL?0vlT<FM4>V&GxC-RaCTX@5h~KOHGCNGUE|rL!uky~a}w;(~y+d0wE
-#kAsVEg6mBhs6pBjjtb6!#C|TrL#DEB**E9D@3+a|kMmL*X}0YT5Wru5VnVc(IgO?W!O3)aPp(4FjNA
-9M--o1s_XlRUKkL#^XDn<q>{7TpL{DgX)Ve3m_x-%R>R{=9q~kAT74sL*f6A_NMmG%e?%@wFMO)nP(X
-b4s2&4x-(k9Q2k8!mrMnmZfC}2|MJ1m2E&yik`mF(ysAZM85opB<5-pOVU;<Iv`jDc!@ipH1DMHMF>U
-Fz1zB2F%j-c%EQ{!agPNNnR2zw*&4%r-errf9_MjQ*)>ExIeI3$uU#FpP095#OLYY!a}RC7upwW$Zvw
-V<Tk;c<MbTo)yBxlk@1nv;Guk_o5&SJ|t!5JYoLvDT(QUcrWHa(itx&xKk5}^-ve!W^2>Kqb~ixllNN
-q{9|&|12$j`&cwj5mL8ME;5pvlIaN0mV2w?FH-!ap{?AXJChGk8V4w{QCnM<rh4vXHUEZ~$ctv4+w%M
-}v-XijO{a$j4G0fxA>U1nPQFOK+=Q;p|=kNJ20WCt@2U}Kh>24B&oQZEuCiC2w+4BIB8)jD1)h0+{;`
-?fi32kn*#XA?@zIgVvxla|%W_TVi07i*QrB=*us`^&sIAx^ymm5C6PPq(lhc#m;S$_$D)s*4JjzWdHG
-Y0czN3SrUigRm_o2UeT!G1^+rD%w#Zs@Y}A$cLO*P+KjEx!9UG>7VvnF#KU4*UokPyc3fc!TM+^!kXv
-JWnK7j0l%THKf0Yf4De~jJf6>QB1l*QZ~w@@G;QaP;OBdf1)Kt8QGv*kV;p9)pw94fpH819&tz0X(Q>
-hc#c+pIcPeZ!VdM;Ym@PRfu{kM6qu8`IEa6P$L)Ze(u?s!`p&&jIy4ggxuOSa^hx0fX1(GY$37TagN3
-Qf;bmmw<}RnvXj**-Yqj2W4{HV&c7ayJFwb!;mnrF+5+$;lmrhXs5cI{$9llO$cJ$@kTY-)fNaE6UBJ
-?F1o>-qil!>Vc;Twc;Er$jX$=$AK?T4*^L`KBtu5oQGRrwC+Dr3?(eOBxR3MM73K*CCF{;XqqbBFwyB
-`M|691Zch4rGyZZAU10m@6G9GmOrPgxp?p`LBZVc+FU2iSw%zp$vzvmEV&Yki#%W`2Z0p;3R&u!I9H@
-_huVG<!=qXEePm*pr<>y{M*d<JZ~u&G&FF`)x|#k@uNH14DU?5mCEyk=R;sbqd|6jj1>pbPISlJTQzb
-y7`tI(rr?!3jodmNWx*#*HR{w)uFq7#`&V^fz=_afBQJg8R}r<8*GUIhvYX)A3)CW^samWs<9$EQ@^D
-Oas}9!cA2$B*Jzl;P73~qA+3JReR1bJqlTtR-)U-08h98p6a=X`;*m%7h;%UUG_P9;AeE}10b$tc*$h
-;i0t63N6KYhm`xi+POIV0>k{LU?06}ZcYieq*!|CfDM|MZ(DljF00JOAq6vqz6-KmGKl>6Lb0S^J@bZ
-En_2>IJm&`}~Fy_+lm@6};J!TS6J3F@YS2;Uo=Dh%&?w{@1SR+ZKaBoNU0Ia`#L)0~X))(#YGU)Y<zU
-pFR~Mj_Jh}2ts@_#bjV^sP|)Jft)7`O~Co0L#Zfp$=bh`SK%pZcXOYl)D6At5fa14j~}1j4GDfR@;wM
-+t#K*W08Q4t_j1#0+M9ROMXce(#y7E==kNF+aijeWyj3X+Hm9mVJ0tBLXUE5wSu10xS>0S8x0EyN_*2
-g`8eg}fHbw3IVe<p$@*B|-Rt0?PpB-1?d?2RwgId~yf)P3@*&6j4rA0n$PTQICk=ohw5affuP+mgL?x
-`ir{|f>T{tqRPoDLN)adk~h$U_lyR=j!fMtt_$&(%3)zG%{x*50a^A9!%`j*q)Z&1iAt%C(taQ}X8m_
-yd&TD~zzw&!2wgpG|PA&^RsXBG_Df|N1$sma4!7)dIzP9-Qzxn4jPm3KF~MP95KTaLD)ITpV@o%(-7E
-m@(o={u@5H>b<fI(OEx9Z-zeBe2_32lw^it6im~ZiD8NX9NK>g+A!)uAJuE&3eWNovY=Ux8yjitPC^L
-43bqfC0lLP(@a`o?w$SVP8GiAKBR;;=qkrJF?!7mTzbc~(JkuA9hy6Fyb*^p}Hv-MQ_pATyI`c_SXV(
-2!$p7s+^F>cz{t<}zq6ab8{|Ll<+0&PQ1Y*AILCh*|SG~&+KZdI}7UQ*BDg-hM^-g#(>s2;wGrGR=rr
-Ct7C?XsCd)DC2yCswNm`sDzR#@9_tm53PesnqOoq{8+Mnlr`8=YMiEdVw&T(e@YpZe&L$-Wt*h&AUPE
-Z>6<<Km6M@{s>ZuqVA>DMivlfGTv}*V5^g!}-nWl^&<R{+yV0rQrp0-%FPV8ljjxbByKyDllo3%64mx
-@`ONtosp%Np2Fh0iYxTE&s2LPk835%J%E(bwI2QE3W}VMF8}v8SD%iD{g`y%groN(rh^uBEL%LtbUd3
-gd{5a-1V)|cL4smr{7m<a)-8Mgu#=DvkH4=oe-A_uD-XwQYYs;sexLja{y9DUE&k`T-_d_gKmTX^&*v
-wnf7%qEkIyk`bcv^BpNv_8?8T4S9(vKCx^!^#{Udird72JbJkYaQYESxGb?@YZx`*b4lwD9&?PGnZ=p
-X&!EB&H(w)8z>hj?Omkm~@f96ciWB3ciw1;7LVw&w0BQqSp@Z}dwpx?R2&8k87Gj2_NG>ul!vdQIDUx
-wNy<`PB#cyu}NGyMaoj%l=NG?-k4`3d&^oOLj38>I9EoNIq{DCeR5!V~(m>GRi4Vyzji_VE?0UDCSXl
-npJFSL6-_*yu0&lNQX1^!6S4Ct7qU@m~M}5u3#$*9%<-qYc?408F5t&4ZTj)?C9v_QYgy;S;L^K`w8D
-k$Tv)Inle6!^~d2EjP-2zXZMn5UPbW!NJVb9+F=AcWy{&W*;GLHSCF-f+RONcEQ~wl_LZ3c+B||eHH~
-2iS56M%Oz;g7t+}d;+{W?_=|#tlldPv=>5njLICo&e0j(Hu%03fao?Pp=2$5*W%I9>+Hhn~P4T{*;$#
-Rt+YO_Pag%z?`?+Q86H$CRfwd{PUzLK|i1PBZ0r8-f@Shf_ZA@jX0x0aY#TBrLxorAvIMBi&XHm%^fn
-Znly`SJ|@(XrR6jCdkWJlDYR40DJ;Z_G_Hw?2745<jZk|8&Ktq<nKay>(Hxi@Yf~5P(-CP$jh`7HAEH
-71kwI3%x>PJ_no!&8pC83gA)Q^ZV3;6Z}PaEPAsg`ziq=UyUdD=HOZ-cl0Pkr&CscM=6xK?<T(h=4!a
-qhm$Af*x;3k`VTTaWByTwoH>g+Ok7~PK4f@`9O#bOet?E&^n)|($AEL__g8i-0qH|~q|Y5R^)IqQ)N<
-)?jtp2mOKMgQuX57`)zL}Z%}ELeiPm?mRGV?S191nLW2A4bA5N!LJq4IkKFLhC&n2&>ckZD_R?0WgXH
-H6^p?E|27AessfmOQ*uVQs4P6lJY=Z^Ze175oZPOv^dMFd>vgyHUH$1ic0)2Fd4b?T(yywyF=x7by>h
-c|CIc`P4M;?rD5M`zZGt%30o9l9sLz*k#9=9aeyvpFKmbiv(Uyc()+T;81NMYpp$b<47jYD-+0bHzDr
-bu^cB6_BD{lvebLz-PLajq>;NCiMSMO9KQH0000808trnOt%krnUM$p0QwaG01yBG0B~t=FKlmPVRUJ
-4ZgVbhdA(TQZ{xTTe%D{YIuDY!j@-ooeQ*&J!LGLrF1tCbQ|uLKAkY$R^CF8nl8WOl_Wt&MLsGw-&2C
-#1^@}BPW;p!jo8eHC$>dt)+)7m$cGw9m*g>#TsRy=En&qn6$gP<%SsBaAk{R1<HZvw{KAB9SjaGY>Wt
-+w}T4WiM`&wzs_}Zwlu_E*DQ543N>7UY?+g<x=q!r!s(L~;GA+eg3rD6S)cj#n3&DDO-t0HZ^4D#W1#
-#V3sx_rOPeq8>2#n>6E)UQ0OQOlaN;Y_Ra>FUGVn@=n3@u`N*#t7Yuj@;pOT}TaYqce6{*QNA0vbR!;
-+$t@FiT<`)e$3unV*Tvx)kk*GDy3vM%Xz*N8Qzl#tWTye^>%r^yj^DRFF*bW&G*aI>hdp3=*4mTkLY$
-M4co|4F#Ojg&qcvp%+^P8k6DF17vzUvb|;uojm{BK4(Y~51JN{!ZmOK5$P&*V_|_RUO`Z#5HceR`Tl}
-zy6ARXIRluYK%xe)9q7)VaNmG^3V@K66E%xd$m?meZX$0@1pRRt&#=CoWb-ny>`QB|0KAn4G=cIUE1Q
-3s@eX=otDa3{yG>DRUv24%v12Ci&l1_TMh!}oEPWt~u3JwZ_$15_g7;vnBne((?aAbj`h^p{0kT(5A$
-*Ny*#$Mjo)R{O)sH<93No#Dz;zK-T2ur((+WSqvZYXuzO}@&AX+T6bRVAx!)>H*_9;LPoFGcm3oB;7r
-AVn*7s~hYYK#CYt2+9;^iI{TM>(AIbUK+s^u+s-=1PC*<2OB$XxV1V#R$@O|@G`5l*vO}N+HXep>$)*
-fLK7OP7iGV@U|V5(JCijxBG{SC29ht>j0OYF<A6)QldMwNwp43geg_j-5dzR)NPE->THK1gD^6{Sm@z
-rdJazU`Yo(3jS*f-%CtJM-X?=9Xv~-0Qctb9zSL)pRc229DcdLN&j(JXurn0>%s89@Oh_{OGMbf^b>e
-7Eg;%VmcBFm<pf*l5K_>{}T1rW+_I2BLZ=)X)n2VZMn8ke8r^<Ro*^i8{7$>==L<Jm4cu3!%kgRcUFS
-OlowUH$xixnK`M)MSK0lphKgm`WX3A}!UwN};YZgdG*0Yl>S5Km4w(KK72k><3;zY1mGtog<F=Pr0Zq
-yIC!XExn~Pb_G{Jd&i%=(OOiN9h80`u5@*V@(mSNRKSel4vclEXhrW8Fc44DCf$gm>n#lXowx$ck^AC
-F<c(t^RYrHf<-8)=m#W%Aa7`+RLOSVeP3fd_fkBbVZ&vL01C|f7IsjQ~R6UJ@L<=+okMQ%1d6<pb3#1
-NKFXe+^b3$)!)x191ovP+*S<TZF(jSx+3)UEtqzdCIae;iLs=coX9m8<s-mHFx!z5*n`%+d9Ci-fCx*
-X{y-JTpbSfPZeV#Ghsv2p9D;pzbyq(e|KPhvL8izssW)4pQ0u1_H%WPVRsDc8v~a>u@_C>PF3>KcUA)
-$P(x`4sP4k0kyL^g&*Pw#3s0_`vKp6JV8VSz8mhM+#)_RHbw0nZ_AgH?k~LV*x*Q6~jbKP=7*)p$;f^
-O8vPl1{CbpF6d{hNxX}LO#e50rX{8$h41<7HJpk^Jfri2(j)W~XbENP1xm5y`7tv{CdBEanD&-^4TNf
-NC8!1SUn`%T$In-ob#o`~`H5kL`j7DW-(W+-{|z|l{|lYAbSs^^b5ju)*}O4&PKRkpg~FvN`qZl6x(I
-b?qhW+9XxqY?VCk|nRN$Pc-{#kHO+|iwt+r<F?2viau2Cs|gFBHbMT(Z)={!ntz-1tC-bJS57Ha#u#U
-Jn41yF?#2g(yV0{hV2EnbKD`O5Va-OBM-@*^JaFAnu(05R2=JEu58+IN;GQ2H>@-dydZCMVoLhE{1H3
-8cRdEmU{C$_#EPdup<c&0Kg0Cw<}itr^>)mS22O6&|%x)<2HUpYA7tC+;RitLou#8ei|t`0x_gUO}BV
-<0gH49i*rBlJ*wQTCN+qnRz~WeL(p6OVkFlb*vAEc(R&jZp&P63GvSp<0_<kpDftj<oq115<zjEZ?=>
-BFQLP2Gx`NHUTicJ6RPoobqJrxq)lDGz2wANNRR?1hTBXA0&X50(Pqq`Bs6kRE!-&;uF#oU|B}Q3>KJ
-UoscXdr^=Iw5@ZshbeUuT_bq}rzfnCG`*P^(4C$1CcVzWW#!qmna35~B81mA)+pLA$9r~x9HhPA^diK
-5Y@xRDhv<v&HHYB!#=&R`)3;}V7&P2u<iTfB{NUUEYo;dW21QBU7{7J7L|2=IiCFjwPT?uOm~_YueR&
-wu#Ra`p4;FO!sVo?9p0k~rX*hN|4c;s;uq(R0rYnRfk2d#mb4!h<v6pM!+M@500AX6Y%+QT}1h{kb`M
-3Ue<&NRU4Wy6X?Wk_`G>hvXeZP{F#pn#3s(0+q#R12NrI>vkLs4>PsM<wl};f_+e?!J)H3leSY$S#%l
-wN<0dEbp7C~&WO90(+7)0rXr=j(eekBK7f&nLeR$x^+?3Q6_wSE7PKB>7YtBo#>g~fu8EuhfuUpQL0|
-Fmz>nq?`NjCgik6bkk@^#T6jK#C*#k#o2-j$7O_yfpB0@{l?m~U$=!Pz?l)1F70sgfShCY;FA3Nv#Ru
-Qq+=o*>dYN*^TSK@)YF~R5a)cb@QklQ{_r>F613x*R5;9QIln6(Ivho{r7CVuZGHeg4*6C6S&zJKxbc
-hY?`GaAP}^0FyJd@@WY)ajV-ripW84N)+F<8JZ8{aCI)tA@9iF7q}%N5VaY&Y#6doi;!p4hk(FhaHVU
-M6DYf?~H!W?ie1MNx)`uKb_vaz8?c}D)LSE=tpipKU_!d-o0L&fH56?CJE=~zW`860|XQR000O8Q5kV
-e`Y438OAY`4<SGCF5dZ)HaA|NaaAj~bGBtEzXLBxad97M|bKJHO|NlM(dKwSOF-1KsyPBvSMOGZmIF=
-^18>fnf#gVu>SUi#iNlDjCzI%5U011*O*-m?z$VU)Z><hnr;HJ~*8<7jeYr%M)vim~avU^!C+12?KJK
-TT4&WcsZYdMpdtk>)VUsTa_I-Sf_v0`yNZ|X*gIA(HH7OG}^Rux%Oi&#HTCT3g-`>k46_Uk=Yxy%>sb
-D8maUZ|CQ&WgnX-cKgAS|3jsd^#FQk<aB~A|4V^*6f1D&y_0FF=Jb-RD7}GEH9GcPAFQs#je)%vdGzY
-Y(IMGQcGo3H?_>FsHMwz<!myVhkqwp1*I&bgj8h7U8+<lk-nBm-3kVi^vXphXUSxOk_p95tccM<)Ng6
-bkK>%LK%>EA5*O7&%vG|Ck^BiLk+zbV@RjFB&x6?iE$#lofCsB4shBgM7i;e0JFa~AKhPR%Rf!)Zz<P
-NnX|!P(O}1*jBo(7}1nK#rsv5zz_I6($wnVK}BmCk|f8YIM8lhEr?Ta8}KR0<TSK=2vD;V<fuE>QW1E
-0+l`cmc_{=xTt)-&;yxRc<yDXKmbE0NdWsbFH%AbBZSdCr!+;&rWj5Hw_7xh~f+xJ3n1W0}tjFX&WKu
-8|ff+bc^?%bo!RSQ%OOjH;Tey24Z9d!P9o-@N|w`jPeQ1l}f@^fs-M?XH#B^gc1~jk@#;M`8Gg!j1Jc
-(2-F<rzW!yHW_%q)KOPnq(waqtYY(`?iPY$3`|Cnf*w0ToLxLG`drA|U-8nfY8Cd_Z*AiTLEs8(Cu|V
-eSu>O!)$h*O&g89Nbpsk<U=r3;g2|kvB2lCw@Jv=O1zX9y(C{%**T_G|!fxR~DM8p}U6<AI&dvf{rkU
-X(-T^1%JAey25|2=|v;XSV{_rgLL$<GXZ$j-#Ll=%#{BxngmV*5}G8x4RHu#y^tgd$7-r(NN&<HhOIJ
-&2QwE-&9CIk=CcD<AUucb)jTqXm*jC!jLKL{ef?{zpb(0n-Xd=~`g8Sn&N9I`pjvKdcqLqIdw8(`z)g
-K9)bfJI+B)<1$j@OA}T35Xmi@t%rWD9|5z$otFF?=KkcP@zAdh`A6c;E@R&<TzY05Vy%IQR5M5azG53
-@mbbE)E&>p$F2omAdM4%2!f+?mgdCzanI;FvP7wvH4A@wrlT2<lDHxBo>gAUO=u$`N&%*0E52sakqfn
--=?o7^QYZ!5n})1q(6N+Nncq9KB;QG^_a45>f!CN5i^{Zo&3FYm1xB^PeGt6WVSqXnt0uz?hTan)|IE
-m?k5XQ(gI3p70eg<M?a^8<XtB^taoo%WJxv8OCYlS_;UhGMga84(=m(t@e`s=<6sd5dMM^l>KCb$YP5
-)6k9_?MN<Jafke|+PO&pf#SU(Hf}JYWKr*G0`UCFV&1ao7tsuci~>Yc1%Q69j!XBgWH5c>Cqz!;kURu
-Roo>eS3NK1qR(s{wy=3w$<Z``uOhR?DF+_{Qlyf=U-q4L9R0uZn*ofw>yW==5;NU9DXhH=o^opu@TBb
-y6PW<>;S?b`)#xi{p`^deI=1IHJy_5DF8sQ|9R{gBTk2K8nQHGtB^G|VqiYg`agZ^r9??dM{nD8bh8`
-E|J*Jqp`!3Tn1+$0PkFdduTTO~s6_Z)ga<A5f^KBnjBJQ$ngZpO_^535C=Cq7vWiucBcjI#`!nFl@a+
-UcaEVI(hx}oG@9^c}tAnG%mkx~C)NYJpMWfofhVoM8-OK!7ANkE>-aNz)ua4rQL(fSpM#*Bz6)fsy7X
-4x*>N8<j*HKrAOaOp(D2juC$c=Ew6?68}>DlG`Pk<^{Z!drS>HOV?_`~VXZ_Yp9lKZ7hmNs16Lsm0uW
-Cj65k3-yWNI{gS<RZt|&ht83vm%3n2zKRqYsj^fSFxmlIFi?}I9bYEL{20jenS?A_9fV_O}=4ByJfq8
-9LXe=X0dgy2n!-R4>a4-J7H6;_bEB?qds6i9V1hD@am|GlH{{4*|JRj3{_Y*oj5um=Ygn^U=0ZAPYn4
-_{QLeNp3Q+;sdaMJKJDGKYBRELu}_~q0m&8A!kynhCR2($6?w8Y-d;5sR+&$F)>ofF(2Au9(z%}g6}s
-7C2m1`htjCqASSY??zFC1T$=T5%&3TKogJUeRS+y*h44pi4JyPZXPgzF$0tHLl)Y2({cr9|o&k6%MI4
-ZnDCvwbTbYldON9Y1BNaz^`5kRyR&(}0}FHTGY1*&!<;ugCE1~ua$afJ*sP|r5Vw8N0RTVyx~n+h&SH
-u@S3dyEC6eEtUxh-jVRY$+h6#ay-ouEG8SPk+ZTTNP=OiE+2UG&8!H!)<0ok@?;0XrmH(4F%t6+=T2D
-G8H*%YC+FEfA|6IS1(o3ES9V;*itkK{1nQEgv6PNthn#WWnNW%ajEap7IEwhkmvF}dx2n7nV0*~i>Oy
-x_nS7+lHUnOj+jP$$S+^G^@fIO>e`6P*HxJ=BfDcc>SVACWI-!bO^NydpVR~(Am>Ter0DYt5WY0y0oq
-Sn2oQB4??lery~wF7y5JI7Lz>bkGBwA!35ef=UK@YR#wYChMyrrwq+zTg!3JXCP|sLzi{chJhI54M@e
-;r((Om~ahulvyVQgZKo&bA7CgBi+vwtVCrkbtWI$Gq>y}XsBNF|R7wb;R@oy+&}r>%dq<Z9ela8<cs4
-x%x3pEA@-25eT0TnbJfb_5(DoJD)P(JtF&7kRDVWF(**0Bb8r)Sq}bns{^=G7K5|pz8x`7l&+F+>1Mk
-jzUj%$eGW08CGy-Z!ZWnG+BtWhzv7|uDVct^YLN>t<DtHfb$o?`8fh%YS`YiF`PW=s3P^Jh#dj3*QzM
-1p23F#!o-)4P26aSH{|F9(Dx9^3WCGiytt=YSa?cUtS9%=N`k{MP=>>Jh=f*6MY@A>5OR|{cyXt@;Q%
-8IWNhF{E4f(GoF{0}l9@o9z{U@-^r#+FnG)|s0%?##4SS;*StHu0fOkbLj@bu1R5Og`nD1jYfV+cJ)c
-h9oLw#v<sOjnW<V{CTkrY|8%6rF;cq0l|ssKN(K#6ueBzG7xE)a4h`0j|FHBZ77vDv^A4xwdKlW1l{T
-_Fy++5;a(?;X)YUUZ&WT4r=&3*cd4snZtr1^|ytGcNJ^372iGxd0Zh?@pM%w@X0&2pP!FzlPAs(}WNP
-zKYJ@44uQxbWFwYEtEEJ1O}&&QuXQJ`CIfST;t<Sf1086WMEhfBEtrDvF-LmwxaikVB}n?_}A?Me>&&
-biSl()9_lnYaJm}sCa*<CbGl@SX7{H7A$sRd)2aMu-ogGRa)ZrpO!ECD9rbep{OAB2VeraRzn{u)Fix
-)@XhVKyI+}f>Q|@oIRi6_*V=@`P@tRy>80VQSw``G3)12(6&2M}g_D`@d58;sG+!Hc=*cN;G<p%%3=7
-d=Zg*<)xs;sKURxK(~fTC>bVO!C7kCYRUe_8JS6=`{nOOEx29X@u6L(U4p#=Z)14AF^-_v`7w0eS|w%
-uOc;?2jBr1mtt6fRJV7UP7LWVTK}4iUHTg49s0lzrToFhODBFjSOqrT0HQiyG>>5qJf$nN^L0mW!HPM
-x(GXdF6K-t74JikQdT59!+u09y3KkVpd~i#KDcfApLxJzte{|lzeKyo1a^!z@PM74|Lexsgz6>Boo99
-V@)m1zP@7oj1f8zcq2$7jAsUu)J|*S=Y!Fc`T6FpFu;1Ulp}hv9y7hPR*o9cvV#ZSs^LjTq$J=`y!7c
-XQcpTPTCEl?XO=ao|Q;=I$y0}XTJxu}ZQ9NG=zqiFU_9eFW@c#kIw6rXm4DSUs%g-US5mW_uBRH`r0H
-V-8<I6{bR5R%oGrAdwf7=D-0>bKl*nO<7caL{(kOVw*R1T0Tq%nSbV?c@ds%&w(YUXqKfa-wJNTVN)K
-v@{{KwA%A@80yfs1a=94FMVVjd+^+&Kle43fVq(QXRP?YHYw{4Y`O|K9OiONVBZobMQ8=3tO0XX;|*Z
-CZ`!^mDn{XhFL~WB;Cy#3boZDoPNKJ^}{xWZS3=OgMZ!DA$QP1tBIxFZzUoc^>x5<XH$r*U5V@mTeBe
->6t++@^DH(()51uHRX-RJsP+B4ZPh)K@w2LJ);ZM2E8U8F_>PVh9Vsjmp|<n&*#h<WCdGTs_J$WC?rK
-iSz^F4p1c)E%?K`4ALaXD{It)tu3{EAi4*F8{8}RnCrQHYY16Z144U~JeF`)nVzdWTFN@Dsw*VYFOPU
-_3JFLd5EQ|?-rw9upLI!nb1bce&;ekk3LQ3p%UOq<)FT-f%#Pp>YRPi^$}Dje{3O*X?&uaVZ_n~Vv-C
-F$~FL)LEdLe0%s|820c2K2qby^n=rz?Fb9E7RNwT!|1tOpmZ)or-mM)4hJ1%|I%o#pnrP-^wnIT<;y<
-3{iph!Mg@&`ze^8*$8wH?GI13L)Z5X_Rx$6yF;|W&rAt^J62z-+XG1OkOQ$Q>otPBg+sgd#$);=^=~%
-86iqN4nc#8t|A@CQGUrMPNH)^~jDW1!q{Uw8UtJ75=LzmMI7YcPj^Vh3_6i*)`kY~7g7mjT!y%hB_>;
-eXHxkkv^5%XzcszMz+b8|e?(D(Y^bF!`;g3od;2FI$genr4l_#pGs%`5SowJ&?KKblt%+l!BK9p#Ts)
-FF#x!uh0W?e1t_m?tpPYN1LhOR@49LfRwm1b)Y$FIM_e&HkfGe<|#P4_o@#S>!M%Tr5aGHJiYlzg8I3
-c_G8A=bIaXr8GQ>GwMH^HRsJaG{$6>%{KAP)h>@6aWAK2mnzTaZKB+clLb%005i-000vJ003}la4&Oo
-VRUtKUt@1%WpgfYc|D6k3c@fDMfY=x96?*RE@~4oSZ5^3#O0vSf?$cn<o*`K?%sc&H{~=dk*SuNM-la
-$-zgV$e|*xbmQj8iz;oXl@6}#yz&J;4p)D|;k!~n|(?GN?a5or?f)wOPjCwg*xH=Opv6lneL5sF-t#*
-JUmoD@t<JY2T;R{ep0|XQR000O8Q5kVeeVHITVkQ6p3Vi?o3;+NCaA|NacW7m0Y%XwlwSD_@+sKjd@A
-@kc>RbfY6l8lhdnsMCKCf3!ROeS&cCuHpJ_IC&Bq9)C@Q}n!^1old<^_PXH+LVZY!SdrPft%zPj^pGV
-=|c>U3J@SRky*is)M|2+O#P0auuXy7R<Z6$nd6Jt6*}!R;ri;^Sn&!U9e3Tx9Lh@wN2W_M-u?GtgB6s
-B+IVtYLz5Gz9Gozys3(=RSDl89m(@Wwb|x{f(Ff#=1%`qbzN5aX4#dCwyKIoKUk;Dy2$7Hwy0Jsz*FB
-=jr|pG({`<IYo&iR>#ogByU^>_{N9<`t=eptfT6y>PwNtzX^yz3^R!Xlf2Vud)kTvoRWkqnJ5?^KOmQ
-K#N%I1bs2f%5qVMTWpltJPoZP80tLnJPA9R_kwuYuI-x+E_Ia>iqm$tgBdf38nbqLdx$g2CYsM1WAK{
-6z5l>nNvpeu3s@VBj?9u{ib=2h9~D&bK8*Cq2rimxu}x~gaJ=q@et?9a#$uYf*fx>2*>Q`s;pDSi`K*
-hRHSJ<wU+v^W4w(k#{rYrnsIpZs+3`r_k7^5(^d|GM~)yt;gS@%F`=3j@Y<MQy)(_S-gvfiNu)Fdy*+
-V4XDGd|Ouw)ikp}0fNAnSq@!Tq+4XtENR-T>e^XQZ`xV`9<@rdWU=nb+h%qY^%{t~T(?neRhcx~yewU
-+b17j*T{JH<RkjH{?H6oR+ii)l6Pjyg@Gm}odjIj=yVqCA)gLe43>gLK2mBv5i#p%7rsG$1`zF10ags
-WQdbg{jR!!B_K$Rh6p4WiAPtrwNR%H$(&3{n|j`t|@#+&L+**aCZ%vW1s_9K!XiF#;*^I#g^uZ!u?(V
-s3pTwT6<o4kDY=KYJ0mp{I~fS2LZS@0x+8c0W&HRpPM$1Byore|S7NF)gsTNG*21jKVMQ(&jCn*UWT+
-UShf00h$uKp&n5)iNL?8WMIarnJm!Vw7N1BU4L|VtJXjNfI`ySkAaUa}Eo<1UlE&RUwT?Lob1QS{0<+
-4A+W}Oo=m~MY^%T&VrACRb5prqJ~0NYV<1jO`ZiWi0;T%5AiE{_mW=)-1DHVf+FAKtpS7=3GN(*XReS
-rk<kMh#F2)P7Wy|*AWjU@FdSCigywM+<V)ML0En!Dw^gZnVEnECEdPNW00NaIL`WF~SeI^Rdf}n*cc@
->(RH{qAn%DhaH#E30w0eyIixEq3T_~Dh)vyQ3vK#&V!1$yf>S`F03YJV5l?HwYu`|t!c}eVuFoairRE
-rd-ivt6tQ~3ABW!$vf1wh%LK`Af`?o|LH?k>-i+Zq9a7Mb$_(gqru(XtLVB~H$!D}YtjY3ty4kMD}Ax
-<wZ0wjxLo#5!*q!SBy7mC9m=Q%B)4xyD5i?w~otOUMpzvxBAj4iGG$L;1W=!JVobSP2MD*=^=<3xiNG
-9?+GnDyJkm+H?a9+bRd-ecrBhYf>I)Q&!C9U77!_Q*m$+ui_v+)e6ccU#(llBCCFZH2~+Dp7hw9V%4X
-$Di486HL6(tN&F;^V=MsO0xYo@SCFxkDUYKu&0wX;fOr9P8I%$l2*ADpUJ}8eKx7Jm0+z(6(ZIxn$12
-NV1r<t<OAI^Bcq#+00OmWA3T`!IDXxLPw2UFPp+4WQ^92#K0n!$QrZRC_Y`B?z9OIzhrzOdjm4Zc&1Y
-L=04?aS6g&sg(1j?=2&FpyUnt$z@R^Zj@M0h;-^x-x1gn1su!5Og%rvN-t8=5Crcv+{b4Xmd`{d*<Qg
-l%xHq;pu%p=i~JKm$|~AP6jz=fO2iGe9~)W`cr=hId0{VNj?9Dws6;10W7?7|Akf(!6%xSUF@Gi_<Nr
-2w6BepTvKy@-n>k0naR?n<z4fB0bN8$+1*2;37Q^7o=PgrQs#fpXNogPM<ydju;Szl1ZC4E?tqu8dw&
-Jv=&&6T6A^Z?ofbiVJhS5fKm!T{r3AAaCytHQ+R}mT@7zx-azB+7T$#{O}a+F6`*D@Oclk!AFF%d^O^
-=N%a==-t0kx$GE^H-QUGqjYoC3Oj49x-i-`IH^y~mdArB`~4EX(A8v!x*JQV81tbK=36tC4omakOPhS
-3NYm+(T6W9f&zZz>pac)6`{juID=H3ZK{5VX}6x_PGx&38`SdlJ|8TIAGSiG;#hpoMxR0Twm%>WaH$x
-Rd*KefI2TCjGpAcJ`gU`R?p{d-MI-&5iCCXz92B$P`D*B+yDXO?7X{naK)H6y~<^4jE3s(Ru*_68Z}|
-7xatqltosoD&|mU8DtZ&naqN3G|wIl*7Cs$d~oeO)3Xw1niYfnWgj8AB}wufDnxTHZy2Yq0*9rcQ~5G
-ov|p^?_F;cvqg1n`IUj1-p|6NwB_<bgi&X-b8=zlXh#J#`eUkbOMH<ry+wv1anbi=iz8_&yRnNbu3Gt
-Fw?<^qJ{jqUG9QdbzH3%w%2$9RP{TaNwA|n$Q6NhqutcuAcfOv-VE53O9?&9soSzzuy{&e}lQ3=O-K+
-n>=QF;KfJcE^tCf|*wuY)c&=OAx^d)+f#1TbWWgtks(N=XmLtY;q-j$2-K%I!W55dn>jl^yo_dK~;nY
-6<CxMx+8W?qH=WPt$s_K2`1Fa8s5fdI1Z)W)tGL1az}7nmMG2B7df8C<nP;x6}aOFcMJ+>&>|@VvtE@
-PWkI6H`h;ZB3C5Yx$qh}((!iC??{WHTA}cyXP^uhtLl8ptKAfqJCK;S4NSfBr@`-kA3S?vReI6pL#zx
-;uF4g_BtjFur0ALTs8shMf{wH;uyz(J^OD{$BzXOVZfUVa&w?O0t>@DSr^3>b5gR2;ku@D}MF<uWA#b
-|TV-IQT@j3nqsZ`_@SjXKK>Fd7Z^%E_2Ce!&ecsz7<Sxajjn-v#tqc~GkV2Tc;^64~+>!z*qZ8$xjdI
-K18Jwsd>FLJY>pjk9`A*)RrfM?f*X4k}`r~_**E8vab_rbTe>m^RgzyH(RgUrM3%%?1Mz)tO#ox&Iam
-#XPmFr5x6PQ8^7$I7Aww3(xo_02bBp?k2*9};%cFef@Z1y&I#JjcJ`3Cg2?{F_rOcG^~_{MfZ7Kh_-?
-R_K%jJ*Ej3>$F^fwV*leIQaSJpMwt<FW-ImiPZ#A?Mnr#Kj<}c74RTunt*zy<qbl0aXiS8+$EpGmU)e
-CsS=kmejg));*-#4H4zi0LJZ~@C=A$IIG<{YOnV&c5dKwKG|GFa9+a%2$P#e3=-L!4POT5(Q_y9wlkg
-KP3VIInHjJXZy+B-$<2CTdymo==sJ0sLByARXKJkInJZl^(I20HV_5J`+1;jn*=_)k1Mf=NO)An_3IS
-2R=R$ZDUNsYY&jaq#0VGSJg|H9|*e~;aS`SgSS{X_itc@&=DEk6F7;eGTx8VpST`b<vB6Kw6@062P9<
-3C+|_z@O(BaA_=C!khs!C(N{C=-d+6!a*KI#l!&Ks8rAv^8jBTCX*0HCo1CuyjQhtSa_PNE5LKl3a+(
-s>sNkz&jWznv~(>1TdZ?6QgsH5sEE1%1aMZyg+|ipgeae9n-@Q0a&s@7q~2H-t;S8)l~<A5%B<aI6rs
-s>**SXfxLB6<1-^<fv^7j$BT>C(};Mhr|BAQXV;TebcRLnlKDV$wE)Ae4vi!qX9d==6?S8S<9w1gCo%
-|UpgeVIGTsngF3&pmJm;BpU?wM^+tj-)bR0EaQKWo>K~qOPz;Fx-IiUak&l#=}B11o-;hc+eNE^_*sz
-Vh77JM*r!62sn85F66M#6Xm_cdxwb;G_Dfwxg<DIP0wiEYwd0A$BMh$YBm(g=ggx0fW^o0yz7X^R_BE
-t$TEPFrcS9qA4WWt!=oI+zDJZQDV!pdf8=T|r*0GqTy)+9spUv?Q>&y`J`A2t~Tb){+ZWjuhBHZ%#R5
-@A8pbL)Q}FB*LEfCfZkM^0{=xDZOZvx(%O*8Nb+~t>o-3#2?c8mvqltYl7Ee8&|ZY^?;TQvTwSXXKBC
->&*ZNzib8t14Y4`hPE|Hlp{)L}>T-L7{_ZXMZ;}QKdjJ$prGl*Yjk|tXSXsVkL#Rn!t&uv>KIqW;7-U
-AO2h}U<DO%Fr4C~2c!d)A-gcD*15yZ9no0Y~hbj8%?GzVwFy4t97bbQT7i1W|!`Mll98gq{G8FW<I@R
-Q0ppn}SXhP$m5=u7m{ihtRG)IL_@laxu$04+WEUSzPl$>{F~a385t_@DF%|C2tk)nPEyKm2YA!u-d+i
-VTKdwZ`EEFJ*g$vAv#3mFdlhraDp@u;bF)G_E~dLJV7EY<%L_y5f62H~46ot_3HkIT0&8`c})x51`lA
-S&*qV#ce`yJQ4d4KV?!b(7twBWBL7}+UCmHeB#wxb`LU8U(oTdXC{IWHP-@=dysa8a-$YPy&-!18<s}
-xZi{}8Viy@;+Iwxmp}xO!o@ZUHqaFmd25jWJOj4(7A{8vEjnY<-+v2rx*}ddxL2fo7AIud&NwznpAo*
-97EHrbstD3*e^y=yCy$$Y=^-KCaqD$z=hIoORNTP519tJ9}ivpsps!h>pzACF)O^51$jq}jzCbD73%t
-!veg%%Ef>vGl7ZwrQZfx(cRcdL+lfQmdUWF2~W?Uo@lk5Lipu&EayN`|YvW@DIEZaJg$IcyHf)9KWKT
-@$+}X27v7j?|3!m4AT+m@jiJ%>13<H|aJ&2TXpaw0VY2k-I&2A}qX@vAYcmYM}T=+<tP)Mx0nnR^9hY
-TSP^8ILfH**0r>9gB2Nsr?E;8d+sVRLenfWjX0!R6xDpL?09En=7UH?FZB%VV-Uf-9573{;vX*?w?W_
-|oIJot8*y#p#F^&hqUbU;CBoSqcYIHaSJTZ=^vz^?u^xY)7Po>{kI@k|7M}3`HTp|*v75LUib!9PQDh
-zTomkv$0X(pVg&e#G$z|eZTjZ_Jlux7UCpTbtW^5`?V-)IRX7a$Vr>Q}G7itWvA(H&^Ao@Vh;WQub1s
-VX;DLt{kzorL-j$X2~FLI>Wy}iW?*3V@SI%w^+IT{ZqZMmXZexTCOU*ANoE90P%Jgf`~SIoZDJ@f$61
-2^2+UC-<LEC{D>x}wduu#{ND-R-8cU>ZFBqP=b}hY21B)7h`AjTM+>G>Xw43sGL{v9--c1Fl_?S%Fh`
-NSNc`>K4qQuEdQ!R4cI97<aOCAy(v{;c^e1_wtiS+`;6az@T9_wKV*~WE!b??8Ia&FscaG2CxB(^p_p
-=AYHbyw@M9ghsYe9gZ4E7k1SObq;^+cD>rCm?y$k;Kb+slpi{I?M}T#uSu*0`r1Rx94d@7rKP%qdt+q
-SrLWpdQs^g5F&Co=~AI~CDe#qSuAndX3N&HC45g`Z&sp0Lq;%;<k+FO$1s<)fRi4WD-d7{w%XdEK;+e
-5HgE%RYfvlz3p0bQ94XzfzCm(A!61qJC4E-Zcz&__TS2-xtV?NG6$mZ{coBsj`7)?FSdEu#bTQUfIRG
-HvR$mLV*<8aJ1qeF`(cc%TtbvMe`L5tw+xYr_VAjiB4|M8R-ejqB(-17>mBwl%DcvtZI8u*sg84AAJk
-qy2ym2`waq4J>4ILkLBq)VN&IHaW2jbksVQXB<dHt`#id7%o(L1eW8K9_tn$n=UX`)eaOq`Z;;`UweA
-@bp*o;Y?e*lG!%n-9_(M3gdDh+@ec}%j<1r-pFdrFaBu(c;k|qN?&BXv;f-Sg=q}dKfHNWvaw9`vEvl
-i@UkFD!<Q`G(n2u1$QBeCOzedFuXxcy2(`-ero&{{cP#IaW?Q%VN)Qqju><U~~U71aSN9cRecH$qDgs
-G?{ShN}Y8w2(?vS(nMj4d*{NzfQ!Np`)Iar@AUo#uLj06^cZDxe*09&{;NAQ5vo?0Hp>gNyew_=nptG
-~qAapU55sh!zx?+D^Bou`7s=-A+Pf3~sZr(ym29PJ8W;b~HF>xUW=_lU=rm@Xz(x$#*x_$SC$hv$%f+
-%%@Mj3g`r&rG2UOB@`QVxV%HaOR~lts-0L;3-SBracIHi#!twOYUepHim(G2SFkdmq6jaHvhM6v<CFv
-3yg*=4!}?FrHesdH-(=ad!yyg#HRaJ3g;%s;gPYmn8XegW5de1EcBF`OV012c#f^jQa4)odIy5A$gO5
-wxcqPV7Yw@MBVNL%V%bNel_~FWh-Ed9~glvavpQ0wyjT3!H+D}y&E~4p-+5-CSTUEwV@=B>--L~82?D
-TX69N*2+`*XV8ZPU|jzC8tj->K&G>F=IAvDn1YBfyGxEWK8Z;_3vT?t;6t&QsibAr=y(<|c%iw{p^AQ
-<>1yQfVEF!tmx*wj)KX8N+>^xASgstJ=7#SB$=#zThsLe*4=~rvnBXb^wM`u!o|kzq175y#v9Y89XV_
-^*(P@Ai!DcSB>crDV(Vj?>tl|el6n9T*LueUiW>{U*(%ENU<G<4zm-KEvN_92Gd1rwzhDENHMBh3O4t
-!l2-RRJ`~9gf*jOjkSnmtE^cw-YVj{(|J~`oRPEbSvz8^e+%c+23)V$Qv)Pd-7<Pt_;-*_-hhgOWXkW
-Z2oNRbZYN%sPB=SpB$64dff=A51z!>!VBzQpwm~e1|$q<x9NV8HLyj&VG*i$?lNkP<5<>?3{+|+1VqE
-emDL0N`M>vmHd%K~ts84%GUOJxKI>KYh32%V2nePK${7LqU127w8}e0mTzxQ(Fz!r#4W6X49QP?Iwmk
-N$oOBSFWG$dzIWGM&VgHi;+bKkHS)!-c)_w!}XjQ5pC71w$cwkK75>>(e><fscceZ%zUZJUI)xc6stU
-d@^!Cai@<NJ_@<>kvUlPD0I3SLAe|cEb)OTTHcamljdcT$oht%FKNBH!`LW_`hc}0tf!$2?Pp+;`{)1
-oj7n4V{NK=l1OJ>#k%6KffQ*kqBw5s;^W8ZhaJ5y7JS{j}8;|Run6UbXcW^)=wr~qaHdGjh5tC?ZH63
-qzYdMWk>Ug}V0TT|}TJp}$Y^1RWT?+z?!sXHFiEmN=#8WYRP-|lFn0RV6Oh176EdF<l)P8Tnu#N+GM(
-uqYe{0_ba5oE7yNH7y>F9w13V85PZqI=$GKxkKSa$2n*x1lhJ_yLhDRrvS;Vu&7(m2~rs7ea7H2B7Ze
-17AeT@f59V8+FX;=<+twyt2xBh3xLYP3m6#Iw=QixxRQzyMk(-!Z`68In}+6Lb*Zs<{T%bc?k!+%5)u
-z<?bow5+em69|0=#NKG=&*CT0xbEa#niuYZcUcN9u;voU43BV3=6K88ca_uW5<F-k(DG9EeILf`1KCM
-X9S3iio@)`R!A-g{M?h&Y(dW0qJXZ0{g`w=}AvA>ba0voY>`e@PGR&D)$RjiXkj21y)NBzX?5Wa|<1V
-k!VWi5tnE(TIN{0m^OoOaG0Tf(SGjw`kuuHXFrRZaYvGImxW{=>Y4p`$M1RRh(beA(c+*`!TNQ8F4eo
-&hNVe&?%aKlktJAEAG1XS4#4m~M{L)`SBHUqZNVx|hxjLyUHnGT#S>y#sFiRmTu0-qxaGcTq_0;08UV
-~E`vjA?-JFr6IR3;yz#i?>&wK3w2o=XdWvUcP&K^_RauRT!J9#6w5|jFd>^Dn6mbhqJ^#$dB~=wsv$I
-^jxyKmxCtH)1sBKQX~L@_YP0=0scS7|4kzUWZh|J$O%5w^1|AYbRJGOy0^7qQ``#4(Vu6(x}g|!Ff+y
-Q673VckX!91ZxvXqygs1#9AFjD=&~wnqzhg+rw8=;>EhLkPp>~ZUHIrIyK{x7gfK+V-Ok0{=`QLHyIp
-nK93!_J49d5nU2wz`DrE7t+J;kj1B*26lu}6y1u%s@4R$i<ygBeu;jR}kUoYkqmRF2*Ms_~O{T~OmSI
-`U*Xa+5A;;`z2|I-@nx>VW0Ded77emH{J43wlO_zmbvb`U0ek$Z$@)}v;M8mAKoetq`zX6B$A{mVFiO
-<UjYY3nQ6(M5s7RH4M4<ui{~fZ`wwe14ia6b{fe3z%EiZG)jlI`Xte{KL;#_&NTZMbBBsyN#?b!PI7u
-z34qvXsFk>5{u+8>mL4ei}V?Fr279A$GV_}bw^tJU-N@ETMu%^NbCRiEaLTglvg}7m}xvBe364(0O85
-!j9G~p$v_(6s9wVdS<5)QtxjODK^ggnPnW(rA!Y!n)mE|4Y=&VQQauWO2%ennr+d$<ss|z2$j*9rJ#|
-L;_Ky2^=a5SRFQXevjmSj=-KPIrBnEc(eypH5gV8WB^Y0iRIz1yt&p*AlF7`4U66r^JWa9?KiLcY#9o
-~Sre0%lr#p~A>A7tkN?c(Iu){Sx5<N7vQ*@xsDr!dcG6T=ZP-g5~$o}-ZbTncpAImPYh0ethb7u}}=8
-Jzb%37ud`oTxe!$yK0u6Y4NEI7G}P<JZ?3BcM57#bEG|57W==h>e^FGL;+zko1qes)J}l46>%thN>~&
-gr*sPou*;YMfoPQV23dxb#<?g#EoqR!fW<_SVa;SDt<hZ*Q2}5QWNJoZ~u+&G-9!*0_hn$TIj6dKFHi
-9=~;D;<@N-=7!DgYjHeN8QzL;S{Z>K~54f~}fHQ*AKL@3oHv}6A2JJ()k%Y?|_9IPo{P|!?X{O=7Cd~
-@x@d%ftIAZ_PWdDlMS=8Vg<HD7~-=y`b!E<-F_m2Cv!F(ESAg=C~KFhN#_tcb;r*fisAh00;@F@j8`l
-oyJwaXP|b%J*?yUFLtNJD?Y1bz3@yE8UkR+Z!*;5-6zg(vzO*Goihz@z^Z3LQ!R9mjJ*VWS~BB6_E%{
-+ke?6a8z|t0j@B94pzh9G4WBSkx2AlyMSocZ(wjnh9XlU`=eL$eQ34fK(}%tLS#)2nzjjhNd@5FsO;3
-^%_ojQp~ovBtrS5F@6t?Ua6L79tAC|j}52&kPzx50Z?=vJt3(6iLdc|VXpuRp2Q~aLtZbsBGu`#c-VY
--rHd1t(U3{BD=eX-fuWJmkv%@9rITf$v6IdOQ73K~3Z<Q)yQ?nq5huI%J=~_w0M@c}8e@Mro%QqzQkd
-j9l)XMX`PScS97VU}C^n1}L}K@Xza4aWZu1!v(OYHLGTD374~LUZ$)EhmdNb3qf9!8YG^iTNFC^^pPH
-(5pyu)LXy=Q?(1JU6~r-y=54G|`)&o15}f0`ShH)lLk$Xs%Bsm05@gr$imq25TfUA%#jw1xyzLXJ}n_
-$bsT_r}ZXLr$DluxaHaV&WWK!b|&z&YjxVQ;(w4o49|7&(>-?R5~~57NmMR(=UW~rm<mfN3yxuojBdW
-APC<*#Rt=Lahq^5!+f3t++8RjW`Pq^Vi*Ir+8RvwP}L3kV)67r!<om7KO9*E9k~p&=<$#+$a~Oc<%np
-lmb6oBJvV8O?a;wAML*~!{VVP<D~t;yFzFhzs8L=yOvi|&oQ4UTP{k{9V*e04jh{yU!Fh`SZ_2ghYS5
-f$#(3`0AGgV2xi*iuH3IlFekK5=LsI4pAUr#vk%NwHfjJe1vaSYw3g2K~X2Bb5fya>&QPBS;Q(izB4m
-gn(5Qw)rO{PdrwIrFUY95<@7RWPBDRyv7&~diP?}Qq9u;qA{?wI8xLZaV}ZyaHe6>XGIiYi+)pd_cf3
-oH3dANi3p#%R-4JZOGD1j9Uq@cdV!G;R8W@TiG&8mT_tkWQdS-rsVaROIZVjaEKS2D6bRGR{_*(Pp-~
-b5!!I6t;7tJ#!A3@yQ!G;^TK`dTE)KR@D>_jDWsA?BUcmKo8*R9iVgbI*z1tWd1~@!r6mlb!wCD=88g
-zy)#_05lH9E&_$2nxuQM$I5-$@$N1n0dG~<)H_siShkSOPcJ=hj=k#d1!}6wbI?wG5?ikaZf%6$NX8y
-xDR3Fi)dPlnI)AdI}Km0S2%5vlow0q1*&*RZ7H9VKKs;ASV=?TSoXRHgR51Oe=QIF@GchRG}xS9-pu8
-L!_-%$1O_=_RFBOw?p7s$yUIAXx`hoTqs%^uGPp>7CpJ}gcJ<fX;hKi_W-olO%ol1`kp{#bIj0ef};W
-0Fkd1o`A-5@a1oV#d0}9EmFl*K+EIUlVxs^tVrXed;R=F4pkwAkqYYSXu`e4`I-2fMPWWzdB5T@rv-`
-KsB5!dm4l{enp2!FT`qT(-jKexx{Wa`dljD;)QXWVNWpiu-KIzi-ZreU^feX;mkk}Y&Cjh85r0*Q;0f
-`kAAWBuw#9P98T$BE+(Gah*<yhoI3*@#To-r8_rGqz&mJ|?4WWY4W``xq)#6M4XmtO-6^xHYgRud5C(
-7t3X^ei{DP!1{hcjG_*xN08R;w%WG@mV8i|^)W!x$6DMjClQu!p-owMjs#>U(=pk?Np_Q&(xBDT^h1$
-$AJ1d4rH+<N0DY+%z-$36ude<Ki?bBs|jx(^r3CJQs%mbXx$rOv{QwZe476uI^YA|>6`&~3`yKA&JL`
-yu|gY$ORNQOQx3^fox<%X$9)mq^mPc~xP)-!{aT5s<2dsUsN>d@4mf9RZV{p?Tg{73jIipUbMs2M(IU
-Eq8P#97_FM+oB2Jg$pPUyq<BOPQqKx&Ato>tD>5xg;&aRP(g=!4UqcbJ?TrJGLr~p{NcZp%zTokuLmc
-V91oo9*``A7fe>Snj)3+d$UDg`KdkK01oJ0(_rM?5H+}`5K6nDbf527j*a*N<+0mIvI#NDf!SRmBAR~
-;<tblTXbJ{tnxtaYqTdrB#bvjK-t0&F|z=$P_eV5T$vVHOdeVyo=*IyHeH@6x7rak-<g6b}$gT#Uuxl
-RM)be_6RfW02upCbo`27vYDWIOb7GZK6Zm^@Hx%q!#$$5<Xj_i~-W9uVoAQ-9_(ISx$h71RL2=@q8hC
-NGWgC1Pal)Mb}(Fd~U;YlBjK*M@sxejx9KIg7z?DJwD`t;{Oi&839aEWNu%ExW=$8z%F*01Z$NeLvM0
-q1!uSQDW#zPf?~%9LTV`b1H3ALJ?&NI>YVE8fH-NH;w&7YctSKy9ug=i=M^T`<wwEZ{m+1BwKrI@FsX
-nOM5sX89aMtR0s@bLvQ|5H?f1-`WSSaNNeTOHZPNnY8rHYoCnhnU0IU0t>Z}Nl;lh72M`Mq0-#TE&qf
-ly=`TivE^toG!7q9#8{O0w)1RCJhJBuvL3JxL|4N5#=N|{xQwMX><1-E6CipyH>c=CZ{irXYEZN7?Vv
-iv87}TN3$qCmyftnL{^ltnnMuk`J3m>5cJ_{E2*}2PQB#uTWta~-<>RvLY=#)e<Fz51j?A)NAtxRA0g
-oFUXg*<Q8;e@=IlObFge0m*DU(pI<Kgr{<9Zi9FT*~@xSA4=BGcW>WY`Xv2x#CIQ!9=094&lnkjIt`d
-A|^e-NFuuy4LG9D4Hl@w4aOfo8;<p;SoMZ=Y)D6kiP}aQuzG;X)E9<oe3+=Zj8NLOl^*`F6f>@#JN)P
-ffAZ%Hk27<s9WmvdPXd_l8jzAKPDr1pIa89S58*Zlz=B3hvT=8F(fOE(QL!Y2quw?Y)tsS9^lz~nSEl
-4RZC_J`MnjiAavZ?dh+Pj0lY=|XG1M5x)7Bk^j>8BA1HHSi3UjBGWK45Zb7xvW9oFbaAvpI<OzDi8(5
-Xy);p*3ZU=`v=kq!ubpe!PPac5FISu~WIW63R~-Y_G&Q-Hi?4w3g{igZN5UU@sklpR|fs7Ek6#ix}Px
-WT%Uk6N&XzIVQm8+$P1SQbB^f%?c0y@6`B9|(Og18=a?`oVY#_+JTK1GJ*(t3dUS{^HdGzc+K|En9N2
-mj&IuI1>|}Xrhji#|%%z?M?1!6K<>3iZh*({}y<dq45SN<%1tTH|Ji*!B3THP$#Bv`68!}L+G8S6FK&
-2Iy-PP58>Gy8|X@<kBO93aG%ogA8e%ClJKb&eFmpVOEr?gLSK6m!U#3`ne_Lk=0B){I8r3;<?ugP?@%
-hC{Y3w&nTprM%+{gGYi6(cywvb`pa+X*H^9L;nn^fLJUOJom~QSH1uZId1fH*)i0IOVMn4c>kG$f=ne
-;Pfb+W6`UaC!h^mH?J<}RwDP!y{m%-pcT?$<Oaldd%pTsf~1zw!3R^e<Yc?I-5?Df?J$Z@LA41CMXfU
-D44_*Y(ZJU0v`RX?a9KS$%)xu)R?I%fiV6<M;^i&@nBH9M%NSMyp#(J{W$LqQCslj0_y-u)Y2fyqugy
-UveKD{E$We>TR)3ejL;9#l3`_Gx@R&BbPBlg99_lV+U{c?5lAg)!Nt+g_k!<J<V;8fhhS*#Pl%c{vLO
-Y?*jY+qd88pVbRg}Pm9uc|GX*oMIwIHyugcc`Jb7T0UIa}x_8#W(v0z8cM>Py>7o0%<CqRxQlLRm(ec
-!(TdnC+M_oZ*bRrc@pU&s}iU*)=6i{&_`Ijw0Un;{b_qi&nd)duw$j?yK_z77_jzPJ`P7VOl-(t$qV@
-9h`n#pJ2_O~wzt<|!O^3_WU?s*-*IJx>p<o?f=9$I+`5^Y<*AbVzi&Vc?k!M<C<foepVlYl6jw7ykie
-gu7)6C}=8=Zwi`H_6cW+Y1A`4;BmNi#Fq!FswbQBDdT~4kKd@OU|Qo1vUzFLWdIEmeqZE7zH^uUDdZf
->jTsS?AYT4)`xlG>Tt`iP|f-l90S<95-_@-=zANoaarD)Bh`nI6}7$hU7Ld_x*xr<GHXxvMZCnAcFmh
-Fsnt4C(%DqipM4yY=K8W996sCyjmm5=(b$||pWGJ)iZY3vj}Dl;9Fk=J>a~A~bks$VE0`li)__wf?P{
-RjA~EVg8rQ?8S6pS;6~^;2P#~$`mvu<pysJp!6%7%U9{d_a#r1`z0L}7$8B1w<KbFV+kAa{kiFH-}Bx
-qx3=D1?`>r?pYBexa$(8iOa{{c`-0|XQR000O8Q5kVePrb}Y4+a1LJ`w-`7XSbNaA|NaUv_0~WN&gWU
-tei%X>?y-E^v9RS6y%0HWYo=uOQTi*`2Gj8@d4n`miD?R-o9!KG27vP-y8|Vnc}<NyYVw{`Z|rO12d{
-T@@@3iB0l;@Z59HWzsZFI@M+QEw!bwLOHR)pZHC+l_;shXKD*YPMD3rVd0JFEa8k7Em6tG;&KvC3)2c
-`8uB%7(I-!~l{!n3*Gj{SYMm-+aJG-^YSZgdtVt9m9I#Xh)ik}AYfVDJ?Qq1jdWUmK-<8ti5Yo9N>lD
-ny#+pX-o%5DtlO-vx7nbsT)BE01p2KHntQT_ajP5<<@q3aC>y<X^@w0JRCw)DBbvu_NkHn?fwlRP}jt
-U>uy7$I9v8`26i(1|ia9j6nsga)P?G(k~8d5t0ZwLSzK;^`()IITa0D`wYW#Ug>-YTu}T~!rX90V3+s
-XVSLb+iV`a0I(T_Krk=-3hI3NTg1EN(YznRw^CAbOHM0^6J%Jzg@n)x)d+PYve<Gy;nP=yOF*2E1`|K
-LA_#nrLt7up1VL1DR4n#jxuK3T8mAnZA4&8A!#^6svMoOUQ?yomKgyPKpCLLDx4uB@2TlL@8bAaqIMV
-V5^;bxPQtVSBG-4}OnF?4CzEOf04`~*WE<%7n!q!O6dCrda&>?Vrk*h)Wd(eRcQuiYU2sx4oR_L(K!)
-;ia>=`2udd$amv4RtiUVUZu#5jL#_zzcl?^SxL*SI>%ViR%L>q<sNZ}fZBG;rl)OZ76xxOKuR;U(d68
-i*%YE0Sdm<{8K3uyEN1%NhTX@8WL0g-5pM;`*5fl_EM$z=$2-6DXOH`IpiftT9*&b_#}sFbh!byk?>0
-=q5x*^=`ATv+<MC+FQo*K2+8!}Fhh&d~Xreb`0JkT1M^kqG>ZJ2|fbru6gEFWKj3U(yUXH_`(a-pTWo
-II>NGt+%`Agn#m(UGsb~@wp0p3kolm%-Ul71eMY+pDu$veJZH);!SXHWv#IXzmp($0v$5?mMH%fiGLo
-6caS;I@?-BHD_}(Hp=qFi*^cDjpjjbUq0F6h4&<;<gf|;>*BxgSsvF3FVs=JBmX#L`N$8=kr5D%NgU=
-(qMbCow(9P@XJKi`js1pR&py|tl{lO*^f2g)Vo6~pb-nbo_mm78JukS!B&WXElZ1e-Qqpe#-jxtv4hc
-6p7Wa=yc##dvFsR$YY{#U)0cEl~XK&I4kreQEWmWA&D?(Xp&Z_tVe@Tm7K#jYU8=uw-osw&7~RJYOF-
-72VCobDYfBjJ{INTng?WW^E_v)%^v4@1Hrl7$kTDX6D5o2)Vi4g`Z%PbtNMI%NEQ(itDnZpWJkHh-8n
-SW5?f*Cb0AOgv=Pbz1pFnx!l8Y&i`}9u>8V;|T2OLv*#eFLac@KxQV8f$YgZAZE$Y@Pz-qTX97qcCro
-Bslc9)DzkJLjXVN*I5Mk-DKn8xt=3kCf`fHig52US4>&%&iJW2OXJ(dV9H{JI9975DI1XBt>`_DuQ;w
-rsg33<}-b1@i6@e&_RI?3qEbo0gup9sz9?vQ^OMD19&+n|Qggg}1I97R%+iB@pJ6)DQ^!I~2lH!s0W#
-H&I!N(WZVOAkm%%1Xicr%z`VAs?P(`9fMJ9t2J4@fc+kH5Wt!AxU)%=p)S@_mFLE%sqoB7Mve)8$fpz
-qd{9W*wzrz;{x`<9VD-X3HWiWKk19^VT51-A$u0{Tq3*!Bqe^&aPW?vRwN{KR<UK^WcVYJlWtU*qJr7
-1q9>%ovgR|T%1l8Hxf^&>i(T<cn^Q&gzKnK8-;VHhi<AIg9oq|XY%W;sjz#xVF^R@Tw3FE;oglbrgbL
-R$%z4!AHV%%mZS2T!h>o?0K9te;t5s{GV0734t~{;rC`2AhL=P0uwYrYgYLG@&9RM7o0(XGXS$qcps6
-#?&oG(Kp~Hf);or@?RK-I=X6HKmTg;r!8~z6_uW?tNi~o<8ES=0~k@8zsQ-eVwXA+v3)yNiWc81lkGt
-0tt;M5!ddavdXmybWJse|SGD-C83x>pv&bgmIIVXlo=4VixSz3>Gl{{m1;0|XQR000O8Q5kVeg^8Amh
-!Fq)U{?SD761SMaA|NaUv_0~WN&gWVQ_F{X>xNeaCz-q>vG#Tvi`59z|v<*l1rw1NhT9-oL!GE6W7F-
-jhsoQqLe~Wki?iGbO_S6=G5+c>>KT4ZFd7835t@H#L4c=v412I33NC5`k@JN?N9Ag#_fI(wRv>Srn6)
-$qS_kUSl?j27zEL1m!-*Y;|II~*AK*W76+qo!Ww>)ZEtQq-q_yU+GP8F5?u36;w7AQ#4x$>V$Mz?->s
-OlwZo1EgBiQvNgVv^pCYc+9LIT`1YwW_T(Y5v*?=cJo&*sHz`W@+416yMM6@BN+z*C<&jvv(-CC`~Ie
-RuvlId={JqnU>+IM|1X&1z4!*m?{+|c!cP%<wXuvB^@?jmmx@{nJ%Gm&t)i>qg+ox?LGB6c(8u#iMBn
-F#m*wAjE)JT?qMHIy;UU8d8ih!b}b__2_n0up4vhh7>ct|zCrf02GL*t_cgnMWI`{PWJ%=JwM^Yi~O*
-FJJ6zJ$<yby|uNyvjzIW5Ag3MNiy;L^Uki}GT_%d6jL6%s1>ew2tS?hC?O5CPjUR)_JN3eK21_DZ2x$
-14AORHGU1bU5DoaPJ5DAcQGa{*6GNSna$ZO4w;3myfR4O)Al+fi`GCu-L`+=~kJ^1ta?mK*!uqlig1%
-*<sMmVEYaUAwsTV{;(d)52*4S#XM=iG5EZoHFb+_(*6hYLOc+-YV;ub4UZZ>PRS};KkGdYvyqmZ@Q#j
-iU+0xr76DepGlv%NjG1G9z<hV0hBR4k1G@M@0ZlbCMdyeY^H>z}x=<~Wfz;75)6NAKFJH`O%F&5WaKL
-iQqWf~2zPI0fZyG~eyK2LaUFp&4qCe*=aPHxf9oHRkAV?Cpiq%D+8<FFb)5V){>#4N+k?LA0}7ryD$6
-zydr$lP4cqObpBn^b9r0Y0k?aN^en`P8!i<=NSCp$IfAy&Km3RB*8#U#(~6GaYCHC?J)QniG&3M?u9M
-ZPr+bOIAdmg;Bp{ife<DQ&qt?)QT~|wSA0O8iQ$@zIg7!)m>AOMi5R3IXZ#jCFOdZ*>qVQcgQaIM4D1
-ae%BtlnY3nswdd<35qy!FFgK&nl!Q&n#fgbpM1Hup$zjr1g-opIgrI12n{at&c{uT=lQrc+m*aJ@5wP
-Hv=uXvKi5gVpq$fjO0Mjhe`ky9b#Vcr3jq!3bdAu&QKGz)XINThxwLv9L6vxc+6-^q|E0Y9doUYw#80
-Ng;gBAy|sn55(b*W#p>>#zn{79<{E+SC?qmPLTi7Uzrr`obVUBY~HoFZBgfh{~0+%h?n@gNs<Cg2XTr
-H&iwtHBP-~M!aDXk{QA*$@-pug(}v1a@nsUg*0oEn|e|*G87I4(Y!u*QIHf?uZ>H3_97;xD4rJ@qbpP
-LkYjGv{5bltm{S9e)M8Mbyz$hG6uG0|5aBbpOV=k*PXfsOhL5yJ2^twwr2-0l2q+XBKE`RpF#DqrAW=
-AT(eP-o7BR8N+=w&;QH`dNj`M8deH8I?_Zc`b{O{OKbdL5XJAn&8*^G>SQ9V-#T;N$yo{j}@oW2kt_o
-5clwNh!l$$Zc$u$4SvmvPE-eQ@Jm7Jp3;xtd5(zKgc^KyAPS{R2LtTVZTTbXBjCTEvqZ5nmzqbV?Hp{
-b?+y_$#Fm9Tl240fcYgHmsaQew`vB6r%uq7x0QTz+jhz`(xl)LJtHK+F{U-y?EC4{U_gl|LBLOjW->4
-YqLq1;<-hQQYAX8pGtB;@P<IjluMl-bm$bMHfloP1?hJ;qo;Al+}}UiFSR`Tc~G*BLO<<iaPbU`p3C(
-*3T`XN03A0JAWK`0fp0z$@2z1v2qN}B08e^{`<MH@7w4x(Eer#2k^quWMjng@Rg*Qa&S(=gk=?;=_fX
->^h4yrjlHF&xcy!F?-Qo%kK^t9^VxJPy^X~jo46h;|wkofexY+#8XRv<4Dwp{hJ-M_hqDUN9q+7A1g>
-+x3u?r{@>0?5Z!EKA(aPZ176gL#O8QerIX~bNzvdR&8$O3MdWvRhg<TW}OA(qGg6|kckzQ-H_OHS_E!
-LU$xAcnE{?JlTGdnS!#_kBpY30%(-4lKnv=$stB?CoD%;5r<1Uw!H2`N4jEBO^k!VGm%NOSvEN=>$JC
-dLy3nK;9lGZ2(A;m;v~;MMrsTfy+xmKcPHo5368JxEnte&`ZlOX<D=Sr_;-c5KPUDVnFBaB9#EH1I?o
-MHR{WAPW^86tSn=3f%zmb3ha&>b<0ufttwed9_p-MyA_4Yr<2R+>c3Eb1u}Z5BBNj&jn;rx1_}Q>K&z
-k#P_iKHoro3{GkCzW4|w(uglDr*m{Z@>i(ys*fJ<Z~eY1#lD3Z3I<G>%|y3jqi2CV1>zz)2Zg@M`uo9
-K~Dj%jTr<e7Ol`!Oq@Eh038N#I);55rhYSeDcdPhNFcNpFTs3mv*ny~4`+TW^)iQJE~2B!JUj1Vq08d
-oGq8mqvF>*Gsrh5n7D(_953P%=C%a?iVnrr^Rd>dqMao01vy}i&%`nbC7`YDK-uU;OW%g0PC$6(it!!
-DsIyf`iZ7$Q>zw-A?$uZ98|03CI%lNKUE2kJ#ow6PQ@~Af>is57qA?f9h-2b1FGh}*?)C*a`w|MI~3#
-)Sw_f{ENzmA7%gc7HG*R?^2If$BziNReLKLnDpu2o@8JCO^!zM?eE;vk+p?JbTF`Bcb{b~afF5HzW?>
-*DWy*=Pzs&MD8iI_l3LZq7r4(rWY3U`Oss+58OQnD&>v<BYzc08A&ZM-z$KF*a_|}aPXG|M#4;VC?wB
-B3XKhsbNT2C6e1kLxWIOH6>G=HWFmQ12Am%!$NCFFXz&CK||BsUI!Un`25nP!=TWTXv^T#)$)&{NG&)
-3V1u3ntsTx@Y)J{bbnZ4TI4)?kFp!4;cIbga0uw_(M;b{(gTwWl338+K<*&=^(2NW;c)R?(xC-+40Fw
-%lpUcD~t4*&CP-k3)-9B(6l$pOIq031i{~Fq}yVSLS)YSxq?*rxYB})Rw-G%5ms2#;#Qbi&F`iQ_L*h
-)p%3;@gCA-zDeqhN!Ey|HKb<h0)mG?*@x*W64o1ZunCW}jMDC^YW$KaDtgmi#%?ZZL{<k34yWo9c00t
-!YK;hS32(T!KDz~y_8kI$KxuEyk>sqZHRa|x6kg|9CDsg|S9@UDayYj(Ip%zsY)#|EPAbMA2T&a;#<p
-f{eN-0pKc8GT5`a>(^Kh_Fa)UJSB!9N)$iD?kwH{5!Cdb0vqKH#JWob<=QNjettUPacNm{U61ROt@QD
-uxzY=K$lvF)@S3vGY^vCR&PB%bH!-*7rH=W2?6GS>W9bQu1>eB$d45ksR(1aa;k2Gz#U$ewKCj1Gq0e
-Y}F;9E1}9~9<$OEYsx>ebI%l{=q@rHjkqMSV1;;@es?eszEr^sn3tXrAbg~yu#qt642OTHIArv}Zc`~
-p6rjtKO|_#$BHGYfexhdiOan)lqHppZHYz??-GmPc?KE8m3zm7b5W#7h7}r6vQcSq|F~xcc@fWX?6r<
-o80tH#(E$~km#rUl^nbOZIj452#?VgI?f-v;D$FR7exJAfFJ+tmJ{i(`^IC0;f@NOra@))F4_q$u}rZ
-URK$=S*I*{)8HY2=eJRJ6%*a8+xYAhT)f02Lj^I(i`&1X$8=x~YE@;U9Fu{I7kEX`fvCLp;VTNUCk|D
-WtSF+~;vNl_tOK0k(tvgBM3j+IDr5mg~QRt{vs0P<(pJ?u)P}FnmCw4@mR@i5A&9FU3f%21Hxx&@_aR
-Q)L92Yw!0EHmat}SA(o5{wD+0Hl_mg#ED>yZjWRscJWUZzB-!4_1r6%C4%>eWr-Bw+10RY1Am{p%TDU
-pKub9O77!d<qhSLYG3;)T7XnVeUP?+2@hQfzdYTDFlStXL5buJ4mS<PWNn}*>wBYAt(TqyL-AitoyZB
-duk-EXSyxiKkYbk0$b<~@!a{X9%Tx<@<uKZ|nu7hSW`d+D_xCqfLL33o(C9tWw(e=&5LvQ(t;K>iMtY
-X*)v22L`M~Jfgx#fX~U}F~W$cGq;(Swzbj`S~m3n)PS65lu;VzOQjR+{vB4avh{1_VFpC{x8zy6R`F_
-=jxVycb*E_L$qneUbWX56Nw(KiRj<S&i(6Klbgs*}a#Gs<O*pr!oFwKbd73vK=4i7nY;#G(X18G-)qs
-$+^RVPwo{LnX9|Fw&o&v?FSLn^3IRBS9x>u+v;8@bNN`^5-pcTeWu*^r|CPTt{U~<pzSPKE>pHO=yP>
-lCH8XR%qDS(XvHC)C)fh9YHJ(tr%(&-OU&UQnWV#^+Q^ogFg<)A-HZ7McVe@KFM~lyZ+OUav}x^mw3$
-*{DLnBN{4anI06=|w6$haudj6co94kroY*g0-#US6`jZ!a$y$$Dxmk4k8B1Q-XwMX9QG64LTLP6_91_
-hHP1fpJ<flC4=$})1y!_X{HXY2pVHzM|LD0i8oL8;R!k0~9ohoJ{zGJ)K^aE9H?+QsURP}Cm(_jkFT_
-4BqXJ_8~3D%^8GazFD~j+M-f7e62U+B<mt>ebQNW$$(8=v6L2?3nlAbWhDeyspNF-GdZ#8zsLePw5`r
-PD2s%xZ6QZv18JdR0>r^9Ne>on?YWX>TfBJXTKo!Ji2Xwz^!>jTL^#-vQ;`AV$9xjMsRK3=je<C-GdF
-iOFWF3>5Gq<gFYEi@fkLLcRMeB;)z<$1-2YFTL>k*B!OVdrWP2s*e1Ou2I;J^OK?!Y%@glRZ^FIoMJ`
-lv``q^s+?Tk(-h)d`f_^uxLtRhRZv;_0<b+z&cy>VFrERO)nP?IOu2knep5+NdEmKcxz_(`J09s>*;w
-Bo!-ax%WXiRUBLDAH9e8|S$HD}{sH0}op^T%FXdPuXDo#yPPBk6kdUL%R`HKN0uK=GyrcU*rI{3RId{
-qT76>C@-==6>wS9#Zci={Z!2q3q)#LF&0yu80Ttx~AuB`|;!XE@_!Cw$bJW^<(Z`6)~_i%O+~+G@GKl
-i+s+T26Ok7?#*o%tlvQuqw#Ues;p6*z;E%TNbH2@9>uYUs~W&k)(V4PE7O)nXQNgNDj#E3&c~Eqp}MU
-cM~yMRGGCG(x4*wTG44FRGZk+CurT}e(;<kUgmZncCcqBu>ELz4A#4k`Hn$%s9qVDZ<%Wo-u-@4&NB*
-0JLi>e9ngght__MR2j-D@zoG*x)#SxQ53rJ}_l35%ncScDbA&a8}*ln+F1x?E~#udO0j@Bqg$eRWbaH
-(%W+TU(5B4sZ_xdGm;6<t1?y2S54M&3fF_u^Q$da1HdQNhlrx(hSs?zwO=dmodP9WsCI$>29`l7b6$_
-K*+V)BU%-i~Y+NY@KZv9Ge7if8$V;8+E_l%H}t7xRR0TXoo&I>s;=i9USFD=Bk_WXH($J^zgj@u~g*L
-z~TU;b$rpg{Pp6<;0YZT$WG-uRKl5uF6}0wLsg8-m<UzU8qKCT2jz4(o!>!3S@q|eMAY5Z$3GP}nG5`
-E!pQOg&FhMwePs<I(gphVlD@>K#p1KL<!05^V$@_fE(f%B5F^T5f)R^lva+VmRdp53l$;8Z3<?r_f)u
-)Hnpt-h_hk^HkYMJ9tSC)+>MB^{Zqn91FxyGu{*vLl7V#yWoNV8tq=K(g1nc*D6Ax(gv;*YLG3Rs!dm
-hJJ&3a;R{XjjXbChS{CR*Yv8y%|=h38eRPLEUC5Id!gN;aW*sd9?x3*e06cHH>-6v7~BIIwzptb_-?8
-`Kof9{1Jtj=SD;vV4haFkQ|iE!;h4%iYwoFfHNo>G&n8p@9074ByFJ_MLRtcdUT}@?4J$TQsTJw8id5
-bAk(eAL8fB{+|>!6XFhWzpae<!;+N+EOw<;U-^C|{x?ud0|XQR000O8Q5kVek-@;OAR_<(&6NNE6#xJ
-LaA|NaUv_0~WN&gWWNCABa&InhdF?&@ciT3Szw58SDtAwmD>I3^ZF<_eJvVk+zb1BG>~wc8$;q?`S*$
-5hOH%%5Hvjw02LOT~D9MSF-t9ZR*Ty7)!C<~H7z}_1;%T<H&6A61DRv$`{%QdK`&t|&IlQ0BdFMgrfq
-0gT<-CxwSk7aai*hQ(-Xa>qKkCas{3`Pz$>w4wd?W%a&{dzh{l5T&+iWRj(XE(grC1gcKqQ5jB&ihgW
--J$_NakXk%@%1A&Bsz)C*_oyQ9wcf@plCxJ1-+B9YOg8JWcF!A}R^tX<06Y4<BA%UxyJP8fN*$!;}jZ
-51$=AJvcf!*al>&_^Wv;i$dh`AIl_%Zl2$YXaTs4qjSJ8jjlzOi|8Vk@U6@c*XukflljF!6xpP_j&cc
-5;-o0^<a}Ay2&FND{@MkARMA{?_fEv&Nmu-^cXD_#02qHgJpK9j)v5UF-piMJN2iAeC*t^}czS%ae|U
-O$d<0KFioK)1i(d|p_6I@&nV=bYv&a#DKr%rR${6W&B4rJMNyZ2j3pq|E$r$=IzgR{WQe0$LGM__t#6
-sq?q(DX%fL;tx(qxvDQAuwaoeDdhZnxVxg*Rts)Vu8LOaQ?z5o}<+D@p)Y5Dw3h`SM2WYgz#0zF6ehR
-T9ghlgy#WjM@{?dA2N7b66#|s)(c%`4Vu-=D>sHcq$^m7&r(51U&1^fa%FxZs#(JiHVGfI0UKz4p&NA
-t>&OFhb3|eq0Hqq@F+@4pbLDxl0;ZJlXIp8b>ziuInCxhq<eCa%%ik3T-**P%lUYCwn(EAL5C@#KC)3
-i6IcZQ8VGoUJ<;74GwjJM198%2qBJRQL$Nnsh0VDfM>8qratvY+<+t<#)r?W>d>MWvVhKVrj!^bk`3w
-@k8C6hx89qT0fI!J{$-<t?S%xi^9Y7$vkSKAXI4ldmTE^5O&_Y8K9ui>Z&%`w{C`EqUb}U?q1od4tzY
-~5<*dQ0uBCFwXE)^;<>R*L#*f}YaG##Lz<X`~czgaZD72^mrom6$2pm>ZCQv~D_rb-Mt(Doek9CU~@=
-uEW)TCtSk@s~S0;#;&X1(=uf<wX%L=sVdLDuYG7I~$>dbdZyE8AEmH0Qa)I6j`DF0)DH%id*yYw*s+I
-ucxWJ(GO{M0pfOHzAeu|ez12P06ifS3t&P+f6%?WEYPF|Jrc)Wf7lW5%cBHj<dDD|<aw3{y;t*Mxxi;
-2vj#8}?;gGHh1`q42Ho#>I-^%dhkpYD_2d5GOR+0@4`n&-bw<Z0qn8KI4)#tCMqu0yj`p4(;Mc4Gl}s
-h@rq}5_7>d(8ninZcaY>4bnl;C!(&TqENi>!m?svhoE8_{GJOSM%IjG<vG#pTh0f9j22Q!Yfl{~Tq2$
-T3s%s`4WG?GKCwIzO$w?px3lmdrAN-gkMy=sEsgP<v#SuWG;8jK=J+W>(H9=p!LxLy`cQL>-K7=)sz+
-NNfQ;z)HFN?zfcuyb_$^7-Dg!~Z(iM`9lC1Nq*)zYEcfiG`1K0_L(@=5re85FVCJi}R80CJe-&Lh(lv
-(rTu?4G%S$jzrQ=LCt3;KPYmN7WBZ3%6yT7E>wT@h9IkXG)`r2AjAW4On-|5Q-I9~0{}ZX1+2`s>ny)
-4*fb-Yd@56h^77|{XX5MdN#`znG$R)XW}cw^o8;MyK9K`82h)$xz!OqMZE?L1b!cl9n~Z#oDotorluy
-Cc{lk;fm&Y~6GGDwbxEY8i;SKRYya2_3k(KB)&gRI-7GjDZm*_gkxZlwYYAXjO@buv56rO)QczFT{z1
-TZFJ$QKp=;Sg)-xdG_Y<GLX_rur!-G96FrXPe`{Wn4Xd$9%YPEMbR{`bM_H*xsIo9$@(cPJ6}>60uXK
-qMDi@ICyZ-|M@WpBp4KYdjrjV6AQQYHZ(Jf6;%vJ$f4`SpQW1Q~%!>j~{An7izdpE<lulSJyC&5QU6#
-bjdCV*-cP8{0X>QVR!<lF+#mqp2IX@q>$(h_$^o$Gq$K#nVdPVeB+WT3<FzfmG3~$z)_iqrUw^HmT6j
-hGs1rFp5{xbhE^Qs@!ywZ0)^kL9WV17h0WuUkT+W{!OJ5sXJ<hYQzHZIyAD8BV~MZ&;9rwMC4hf{RVP
-^r+ExrZRCx=ktJ-I0pqGaevE}c<7J6P2aJ?kCQ^22MnW8cf9MLo#p*Tjj>pE%FaLQ8SVTF(C1mSbKqM
-j~iRn^^ITh|m+m9cDsMtTyBB~KhJKN!1?at};GOKfJK#<?c~+||KX-W1Axgq~U<4LK8Zp`#oS1e6L3$
-2ck@n%|J@6lUHmZ=!LTqI1vlIFbhK=_fR=E@<*V5C~k6E%Pxd<TRSsdgHkN@V%sVK=#QD$H`<ONjMoB
-M!9V+RuFz*I}3P?m7;N;6*!$q%Vd$NE@@<7DuKYvq$j96_XMmzP6}`uWH(WWFbw;OMtjg0PJ3Z4QK+e
-yMwh@BJW2tvxL@8uk09~DXGUCEI0G&sfTM6`O)W)ZYDr@e!9!FcF<;Kk0X-0~MYdR`QSPA`@Y^;M%xW
-=G_-$-*w2eyQz;Af!{ZYY^cDpkm!^5<3yUD~*JowS+si%k9ASfTO!h+}pY+{Ypbln<ghr6I~1+gxn8F
-`$ImpIwQDY+I__!4JQ2_8uI1#>_No-*Qv?y-%S(X^y6p^8}qh5`OlqC@5rId7QmV6RQ<ZtdqjulP~ze
-FKz#c1+|Rz;~DD%Xzu%D(K=BJ@O|WLd~ardgM>&E13@{Nb%1=Z?EUu9RpXg!jygrkH;tcX(D5Apv|Wr
->5)Gb;Fek~oV+?YPy%GNaw2mu{#+qjfJlIOQ<d-$EAhu@7X6-8UD=~Y8%cCLtmgLMvDSw)TgIeuROl%
-_GB&y^@&?S!d8T0;@S_dm0_k81h@a&AG^-Uz&S#?qI>47#GbncW!*lThAAkAvITwKUP{u%j_he15;P2
-vuToYE9E}=RDdF8^4>T`JJ&ohwcq@w$CdeoohG5GTO<8$?B<B0=On#xr1=Y@V$Uy~Y7UnCVz^Qc%@BK
-1-|D*n;z$<$MmDaJfNm2R0{^_9Gg6QD1~ED6Mkd9*QyDa7~^BeC4fiGJj-H)vB(p!n<GK!7Uw`fxR)>
-flddczYUMNwkS7NPGb!JzEV9dm2-6xDO^ajw!$Z<;V#Ew}8D+4B;}kNuo`if6`|B7VRcP)u2tFDwBoH
-XLG5IVTyyaHppP67ivZhmcEo2mF8F%TVr-V6)gS$6SncC%+E&JDcgFMWtYo^m?knuWxHiFjq^I=_7=m
-fEj4r`c~SD<0JuTtIiO#gVHyLhe1>Xl;NZ246}4gvMxN576rhUeDoRqKGGZ{#=G$_%C~wV>gFaGh++q
-aCUle7WIFowo27ubDZxnHHLm|qy)&UV4I(G_mveZq~CV1B1?m-Z#Qh+Ci?&XZ=YsTIZXJm`0D5N{!IZ
-R`rJeLy+WYS<<?+LtMC(00&OSQ+yR53OA4>&qoOtWPg(_qftE&7A=+w17IPkv!*jKIK)j2FkVEJYrcu
-m$-1@KweGnkL6$xlki4$acLR#bFANZKB^|nJ==Unk>}ICN$H<p()o~Gz!ZNQxHt)J^T%@3Y=XGguDU{
-C}$;^Tk{U~WeNpONxjd16ni8xWB`mGjLO@DrhP4T;KBAJnncmO8QxUOM0T;&63cTX;~Fsy*cP!$U*ij
-m|1WZRm1N5TCNY&*DriReeQ_6*_>~?rI>5>o#<BslRF=29KjK`r-7~foX`NFnrc3Cpaff+&WxK>Ut>$
-LkX*4xss}2$jg8+INiULnOS>;{^GQ0>ym;EV5soVE9Q|3$6iUx+3PeUW+i5B25;etjRXz?U`96tW)(U
-&543QE=2O*IX>G2*9Iw?4>zE8A^=eTe<`QCxi#V%uY%G1{}Sf%k*>7!&Urd4CJvB3-}h0xA+rV!N3ST
-gZSCv62ceULKsD{(W>G#E``}PZp>oe<URaM#K$x6TYcIWGWd=3A*2^KSxOn?V!wczty_)UDrS(1d9Gj
-6u@mW(!0`BS@ubrEQLkQYGG)nDA!pqV?jQ-5i?8X9y?~t4H*~4^-1`s+xJ7QY?i5*pg)4BPi2u%3`et
-+D61XOs(fKt2W8TpVCu>9C|P8E)AC6+lTIW_#hpxtIEYcO$W(DJT%k@l6C#<L=vVb!N3(RG-LsY)!c;
-MWF|Jz4vHf!s4#QlQNpgcLu6dH>3G|4JV-?_tQt*TdaZ7rDkY-t-F=WCRktR~0E5K8F@lCixL%Oo}VC
-nl-sBsHrY^w@Gf{%vT1Y~B>x54F*JWJUjSODcBaMpApi53GJfnmjP23;2-w(^!;uknDSpiY9U3Oq`pB
-}NA|;VMZCJ<V29W>d>;62%uCp)@rO)Vb4WWW}g>I43}qdQjII-NB7U%Wwq^5du*r#~g|RxLPRFX47rO
-6bDzQ4v&vUn@x4vpuFT#A2`Lapw{UFf>_w3aSU{AAYfTaftCvVsu|JdEv_6LbxW?#3?>TZJ!;uSF%^x
-#3Y-*|H$!UuKx;Yp-evZ?VW@rb3eT3otUhw_nB|OWBb>h$!M%=Vp7pU=^jnq>1ZXh+bG}T{c*Nw~WPO
-ZkuU%21QX|ir6t%j(I+pTPx3OIdrB=8Wj*lxT(Ij*Y{6G{cEzrNtW-W_s!gq_en(H+hZNzn|ac574-4
-@nt5N<W9E3BPWNgiy}YL0EuiO}`-_3{x~7lLJnU*fFXE+kSDLlL@)XJzCwvZ6_F!wOs8He&_W_#;_SY
-hSUVkl=>I|2KHipt$CRt+gAmf+|=mY@eAEwdNHg!28H!;z7qAZ~qtap+W5`nd4HnER_QF7SUK*eZfGv
-l}Lkud&k>X!7jbbFix{VrnfkX>R9EPaV){`-9?ng6iVdfNX+d-XgD1O4qgClX2c_%yP$Hq&|h7o?)1i
-Luv!MNR_Y^8=;AzL^f1=DwX{@fr?B8aO1|tII;(|D`+bgc6dDPLC3wDRQSsO#5Z%N5(X+!}YOa^P5Mc
-oazXk}V)_uRVGX5u+r!R}kGFwnuu1?W^$QeHIL#X+%0u)ZmS^6EWW~>k>mK!BRdKS83&D~5?tH}~$y<
-U@<_mwtRa~tEQX?B_kqFQ^>tzuF~yM8mgqpXxwxY~G<^%=IAdgc-)Hn&z2A+nSJDKQ+FWm&T#)xG)V>
-(SSL?uINuX2r@vdmdwE!E!uh{n0twn7~b;!YCEcKB>ZQ%c9DOp>aWVt)#WGf<rL#+x7CiRc8_UhAKR%
-XGa@MjdV_oNo0vvEDSwWZGHTbkP{)Rf>j&D3s=Z@CDJ;h1l0YG@u;!PX=hF&bHp_rMOzM>$6(EAU6Z#
-$<hL};71Qi`t^>-|<XOp~a_YlS&8D$u!=d0beI0ESDn(TPdP!WRiPpd9EJOJGBz)BJmHl8SQwK{$$Um
-d%PG$az9s_=LLDN@z9K%ArT9Nk-GH9f*6sKOesA?8t35t?cz}{QQXNK0OU&}FYmV@z^63hTCC$L2z4J
-2E`0~qa~0_md#J$68vY{%**#IHC=t9j`yvd~TwV>g7Cln9)*q*qanYe*JC{)ET16DiDJyqAo`nh=QX@
-5D#WCY$g+ZhF~(w|c&*#A5xd6Jevwt;LKA-A4*%yCbQ?%P6X@S6R6noo2^0y*6<xEu&Zub!3G$-6JZ~
-=3!deg`w4mW5XcH+icet5llOcq&F0Z^*~33oDs>^p7m~qj*sIOCkGI3UefMbWvdGhMk~qHpo(_FtC8+
-AlFJho`*4!^fB~5n%W^a7v4LDm!6u~?3HkdUKt<o`{0CFf1MJ>}&r6}Ex}rZ87^kdtW(X8hX$Wz1CbW
-r0+B4?0#Cc&Xmo=gpB+t%7z`k#Ph<kN3SQjq^j5|?5s_On~`;u;Lz3#?clsAB-A~>6DdwNkXYutOP^q
-CEf!%vUJxmS+2+X41vKR`47Rhj<>m`uMgIF{jF<-xbH>Hh_xE(o8|>Nf>ooJKHDA)4Fi_Ca?3n;e%8_
-h0BOD$V^{Q9IviI}13g7Na=}in`%ybi7RE_C=bVM=3zYqY<qANQ@xHBv^3dBtq912JJGbQV*m2g0@7^
-GILbw)F>58;8+>%$H~$prcfmBf46q(7eI4V!80Y<N;rMxnBqU&LK8Gg+YBXtKP{#etQ8yWhYONWhPH+
-wtq7JTv^ou<Z^B!cshNVG&Izd~iPiZCnA)JyomHBng<?_X1^52v>>9UzQX*TCluLCa#x<p?>NE*+c7V
-VWHFVa(xU5ZV37ifa6W0c9P3v?F#+CDJC{E2McvRsMHyMehN#>vrUy7$r-AU$G*`-QQA$T4$U1^*aNi
-iBB_eZ0kkm;luxWFvbbQ#MLK%;Guo+8$ujacpWJOL2bR;z+aO>I@x2FVdhwZp4U)r$yMLh4$rEw}+z#
-VKs&@pieQ#N1=0d2^%LMwgAnF}4y+A8!8p$C7u)>9Z)j4mWS)W9#RFuFx}0;2AVkAh)*D4h0OOa2%-5
-pnh0Iz#78~4-98#7VmJ7InS~bhKZ*v<0SG(z8bN_n&F++4+v_^p=}FI3ndff_5srYX*YhPmPkO;<ha^
-8#lHn`df?K<Om%#%TqkLYDn|obSSO4lv9%ExWe;1kbBb;9G+ke9w|TQPS?`sk*>ghr0WYDDE$%bkycN
-`XZ=qCX7A)OhP^@*!`#%2IX}r2Ed~oMKH6LK$(8R|Q7s4ubcx=O+SmO6XJ{emg!xY{NFQW7UQ?{lv3!
-2p`^JcBHw1z+4`MSdv-gGq2G=esdJk`~pG|859en*RPaZL-<Mtps-JWpZ7@>tU0=g>tMtCzIU<>xy>w
-gA;v*qDMIdTHNmg&2K$asH!v_7cw+sxuEa(aW3h@a*uIP8~WMa+>bp!(+9>jQyO(-V|X@j%X39(A!LP
-KvMV=cQeK>_(?Z@+A<VOqu6Sv$Y@a%(F-y)00N4<Wr_Cp-*sT>`_X+hPcZDQvD>R@*EGUo*vz?D<0%Z
-{V;sYUT8-r&c@Th|RaDLaDlI4LLbmIKZd~Z-l-PBBG-SY=nv<3lA$BGFElcKseH7Hdd(=k1-k?Y1p;6
-ykXt>wI^IMh+p3h){MP7$Ca^lSZir-(z()|`Vn2g*=YprrK4C{~qvnwmFNyrq$=-qp#2~R|_)=Epn5&
-^KwjVZs%<*s|cDoTOhbuu&7_HtTHnCtj=n-k)$Tg3I(-#z+M{(c}D<$NytyT|^rE?air?X(nhS+M)=%
-a)QJGVZ?nGZgN3^%-W3d4^B?o3oKNnQbZQcCM|M+qJfGo{m}K;W;yc=4N93VKqcIOGH*4TH~3V>oKO<
-cxXV8B{v5pZg6&r_sA3jE}Qs|O~GFy#mHTQY_#P!g-Su{LP8wi1PN4jKTTQhsVMG895f;5%s}5aD+NQ
-px7Z5+TlL-wi&TevtjQ7FoN%;E?jsa!w$w+b1WGy+bO~`3v@oT@`g3LAlQ^V}!9hO+%aulB8T3SNAbO
-)-zgAaqgusSiDebn*pZ%&sc3ZAyQ$!HcJ*p;>NmXO$YuMXK_jtZl?Kfi5J;RqQAKfo9e7fB#Y<w}&d!
-~pvjLpJBRqgdEp(b%>E9Kd+>&jcp#@%}pbd_k}Yns|?6DCTkaXkWPYD3nyRP=I*o3i=DbgMIICAM5)<
-VAW7;#Jy(qoC^4QG_{c0JO2$q*MB*Gl_TWrc((D4PT8q$)wtd=6<tqp?|&*U~S<4s)8%0EMj?0UNsI)
-k@aN9;jcw}odo-Pli(`%$A^IWS^xoFH;12wpj11rdcNVRDIfaeJYQ)q<JYt>qHR#F+oMisT<^nq#Jx|
-WhutoWHuu){8jWdb+`xM4G78Vj?b*7HB375{2fWy1B1tB64D+L+I$xl<uaaCgm`pm*uqL)r?S2h)NXb
-YK29;6U>BRQ=Bu&O8ulP8yOq6Lxr&Rt$(5#vFAMiqw!4nUs!H^Gys@=c_!s5MtSZqcI)t^f~Z4SDE;R
-kRN`PiVaRu4l_SBR&^y=fHCV1Vbf1g3VwZeM(-%i1rkEh)Rm6TfY#xOQc}OFEI@18@?5x?4l`?>v{$W
-pj+6l?(fj2*>NJH&!*W?7e&RUIgzRzwetvpv@VS4vfBQMYVBtO{m&9#)kA$m`>Uoh^1WfuC{yM*{Cwc
-t4-?&D!Ahnb&hidZ3b5rymSXcav^W(r?KKetnnB9H{tj6@Au{pXYd3Dji(aLd<|Gg?*psl#vrb0HpQ-
-eb0xH*YK0ehwp<iJb5vHcU<2Wi)d9t$ty8N<W^zy)hwEG3?k+_29e@5kR-T3Z4TQzb>GdI^I%Z3Wy^r
-$sqqkO1Ya7Zwpr^GBb@iUMCNON$Pbb&-L;CsH>St}k*4?}5+bs7n-E*>?Kcsg%Z|&I3rSweSeLY#Z$&
-3Jfbmvqy_PS1aCe0(-VbFKoVq^a|>!R6sa}SKN62$M^AG0B1^SRsFDqcT#RV|y26!HC-xy431aGX$HJ
-x*|E1|a0s#K-jGy2qTvyDdR7rAWJ;8J|kH_m*eH+ikXlKQhS-(X&;$8Ehrfrph<B^ES)dwt}m9cAwf6
-92lrmT#q*y*1u}m*>yavs+1KZbQd|+>*Ggchga?lC9T|LTf)a^ywk@G6yJ@*TXxx9*ZD&Tw&BKv`_NX
-m!<$ggty7WDw_x>$P;kRd3HL!kPoFm-qNkcyZE3*ZA;3*ZZYAeOY)&x1K8b!}4?aLYDNbT~&p{He%6>
-v(d34gi;;gp&wrg(3K14NFQqJd^d>Z1lCBYLW_e(WTr#?^}SJKX#La@Tr{Upnl+)hIzD}~NIFu@_bGa
-uh;v7dU?-;*rwqL)le;zm+nn}Kfu+=&R$QZDZC_ZL=Y-I^E8AVQ4;9ACA7=-6rvsLQ=~YNzsl()CJX&
-hD+a)Cv?&2`gH7^#Uug(qk$AvAFB=W~uT}9Kr{3xyxyuEia}PVE=t$VS`TM08iP&I%0-r9-L$D;F7a~
-bWRo}c)vRRar+xi?4i{EQZ`{VmJmLbOfB+kQScpQ`c*1#C_qHF*M;<d=EML`LQZa+MI0&~UQeMBI*Da
-eEYhTe`dF;$zym(n8lkB@2I|JPf^q}SuCqMGyr|-gwu%!oINl7<fH`R~uwc!iOLd4uEa|{Wy!?q7r8B
-0qol-Xe>O999?;haUf6gt2JK+;fk7Qh}dUVI4Vp}q|fb^0g+y3U8ul{5EaZlgOBK=)Ts*CC<;8|n;1I
->3{AD{$OETnSF_NB=%(^o5Enx49<$qv6i&}Y%<i?Qeg87+*wX+|BuZVqCYBsaLBJ4>%rj=Tje2*Xg{d
-Z`Zm##B-|{StRpkfem6rK(`7@XA56Yy#5w`q5hq#P6uPB6YH8pae)0Yd|z995dz=0`YR*gfUSkuz6uE
-W0%>bq%|}=9f+H(M3{V5EI`UmCEW#^y^^;gEV5)?4oJg_sZ7&titQk^k%pM(cP=HKl>%mfcE31q&?}+
-SA60H6ZX@}}GNZjlK$i1pd|9MXF%_~HM+;0#!OaI_=`Q(L)#<vPZ8ALSC~rI>eg@LU_w*$xqBfV;q{I
-#!6u89#OUiN__SLQgsp-Y5M%U`fT9+tWm0UxU$;F(yHpI8P)%7}ddF7N9>bUYGul65_fDf+0<PztS$V
-SAwx7#zUYK~Z!191hMrmrDcqW~%l#AENuvn7dFe%aGM1bSuUY*|jWzws=9lSO@fsgq>hdKY}4-Ah`PQ
-YY86tQkFEq2mL03ioo<T2wA6Y@6f)0c#XIJ>KVR&NC6<ktqYg_rMGUpFGl6XG^vK$#Ojuo(+VCb*9gw
-4EUOwzGqw%)&an@GQx@Uv@jC9+5h5AzyHrc@TS1Ek^L`#PghN%Dw=6Herh=_nKO@Qg~PMJv8oQ~MbHc
-S9u99%Z}36Y+Uq>9&V~ndjnu)%eExDo=P&zQ67^$|tOA;Et){(|nhT)oz&U5!_yNFhOP34MK~c)Wm>@
-Z7zt5aB6%0PQ9wwpWIR1AD6K&x6x9^nt3~t(ZhIwE;8;9+vBDoq3&}pl(=3kK4Uk^*pVkc_?$1u-Uzo
-LwxZ@V_M!xsmQGBVHIGFFB*!5FA=fSWFc)I(n+D($SvMsa@O+FM<q)ee)3Q#Hl{f-h~~gbVG8M|DnVc
-gZwPqX&(ffj7C)o)y{hre`qf->R-mt=1p!JQ<=^JXPX^DnR>ld`(#%dQ-c6?$&VUt@v(N1YZusSDq1#
-uaRE4%OXHT2P8EPd-{&HuWEm1AfDV;`<u4A%k6&svF-LZn7I1*zS+!Gg`}ESwNzVpKYsq|fv(M#OPYU
-~DJ(kl)D0LQnL_o+1b*73e_S)-c!XF)JB6GlZk=4tzsoBPN{#(*=DoglJBLlT6B<atE?-{tF<WS7#VE
-=At8QyZF~sJUMw%sa$JJII@MYccBtnI}6(@Li*-YQoJ}Y?e+9P@22<G^P+B+^O+$qlH2}^#SSX<k^5q
-B1JNN2R;MM(zffw-pap!k8#gC&*c3zcXmrn*YX97d^OVJO79EUdcO+D^+;uD{tMw&44u>$0IUyzT8u-
-t5SUxiZ@RwROHO%Xlr9a%FX7Qojl|gYZCIBc!{$u<phN0_NK*1;L%o;+=fiOkVRr7I*_$mP+)GML@e;
-az5SHbG5ZEc@c1}Zt4ZTT_Yg8$jtE4=DDD`Ki-Dan5(P%!|DuTM(&DrcYCV@Filr~_E*!2Sp0vD+XUX
-~lrJ?MdhGRQtXeC)4UJ2|e8-SVoaD8Qgf5r=ibs{?rMgoQW-w)Ro}`%BiV3MSujNBIN^`5QzJ}O=q{P
-4+lR<Lu7eP0u@O3Ezbus0@zL^qqzY&TthT)9woY(P&Gm0f<3pI8oxyY^^^)e&~v0ILFs4sTccjTDD-m
-Fo(<ht9`{gX297=XWfkuim4i=0t^fd#b3d3V*$(st<hyPLhzEw)AqczXhp)B@Z-rF~Gl8cm&*s%~o0=
-Oby;q!K4vVXfFBtI=+)dq=Ice=9WD`mC2?EdSL<U$qBOQ+bsm8?70kTO3yndk6*UyW{`35#L!|^K>77
-)ry)aK!@2be6HLvowaT}{_6G{I*Hqym@q(#bMoxqgzcXPkZlp!GYrwF#@W1As*!0bXJOd%5Is}XmJJe
-<MTog)2;GwuzR@aP3uFYjMvBNOC;#s*5>*Kl)*s@kv|PEQ9g62IQ=10iTBbUmZ)Vdz7uk3|W6D+O<?d
-hr2Kw~i=oFqY7=5ts3<`~w^wi+>aJc>WZPh~Ef?Kn(wiNXTf->9}>MmBk8}2A`=2tb7XyT2v?DgPFg^
-brXGNpDr(SRCsYm-m2jh&6!c)YHSTGZ67>$E`e4U+2(C}Ok5Rb6{f=ya5lLY?OM0o8p#Fn+7PBs1LEj
-Vm>z<1F`Sc5y+=#P|oQ1Iz=T(Ys(o`?f}-zEv<R;4{p5(m<ErKltI*PqiXZ9REx!9l0rVQi4I6>9-i_
-QE?y@m?4A^3yoa3r`D6mtmJ{Umut6crL1J6gW%+4X}52ILL^3dO{$Xp-uCuy1(@1__2xJ0X)4pjZugk
-uIaMmJFsZz(@7=0KG-jOWP_hx;dZ+M!#!*WZI&4+(ojz0ouS<Z(5b>$xLXnVW-uNYqm$O9?@M#oyQXM
-Xl@BVo}Uib(PVdrIhZnN&<+pu~^xZEQCz32^USM*wyjY#TE_0~?ORl7fviMN_#+H72YRV5f5U*#5zJW
-DP?J0kv7rWz*tW(XfDx;m;-f(L-GHqdh4XoQM28maX@*0Rq308mQ<1QY-O00;n48F5VA#HIylI{*MMI
-RO9|0001RX>c!Jc4cm4Z*nhbaA9O*a%FRKE^vA6eS3Esxv}T}`V<)HdPv$7MN%>?E0(g3$4+$4#GX6j
-B)jW%c$#EW>X_{2bT{?LX76X;s>1ux&88%KJh{Vr<FQGgP$(1%g+k$nJ@zVF-R8-~Wyyy9{xkN+EW23
-5>^z<JcJ>(iKAFa85zkneu^)bV!`A66&RGPt(lSpb>oUvP%ZogYmvLJ5c6N4mcVDu3RFqw|K%&<%kv{
-+7>gWLe7_nuPCad)#Dw8aQB9lDIZ&{MEA8yObECmYhFOx$5P_VUVeVWHn86T{&Pw{~w5))+>r87p<qu
-DHviy|&|@T)W~ue1D9!TH+RndjM(jmPtKxz6M9m?g_qmY2|{WSY(5@ggbXJX#bxJ3HbR{G!Y<_)2_Hl
-=*sE?(B@mS8-lI7l6tsYYlq+-r!kl2PF0?TdtsUlLV;UviUllVo!^m@sxfTCuun@Z&z^v_1f@{ZfB>=
-Z%=j@d@9SZMV4N4cH*09yeiq-Xc@oG^DO7JR#8#-G=Nj6ExJ}w(=H2t(ziekdd()cB{1*}|2~<sN$da
-gTOax#+36|kpD?y3hKwDuB8CAelW9TqXYpK7CL-f9qrZ%=K)7xATZcD~pFD=KNU^b<cu~YBcc$=x4^3
-~KuA=Fu_N4XAA6i{D=^)2*P|^u18Pxn37B{MfZUUqMU-s0Og%se+l54#wMUz{f6mpCI?XozXB~c36X)
-rHjt$sq`wkF9%%jh0*(^vndzFdjUAYo0+Aea<MT9i>bjoXu}uCG`fs}gUcjsJP^f*p6*6KKK}F#HM=!
-|bdWlmb;0H~}q<(~I)b@2Ss}tWm*Oy;wjQc}w{9k?ucy&*`!ktj|DB;$LT{Y{(uzW`{#tR(X^Zv6#}m
-7zeby3svF^uyEPBWZ4{wq!%&Cymj8f|1P7F;f&htxbhKnr1qVI_VM<4$#`M0Js36TdoVn{599y&pWAT
-`<-3Z7Gd4O>|N55oZ|2TN_D;@S&EMOsJYTLBv@*mqnlSAST9V7Ch+rOZ%Lc<*j=5Y~LS6Q-DosHB8|y
-OAo@va=OX$aSmbUQE{1Z-uVec8czKrvj%p{9%lA;WlB1Nm6_~s)q+5#>sY*Cm5N*U)4u%Z@>-ZWdMWx
-Hb!9F8=~lqMXSQR~;*$wmX(hUt@+G{Ha~WxP5a*i#I@V`su#BxKZ~0{!dyGJ$nH0Ud+dy5ZX-Ud&jcm
-61I;B{I<dbOB`9_<dGJi+4FJ{7HK8=j0|y+u7tF@l;yj@wixIWkE|J$WDympW?*|^pVC3t6o8$%gdN$
-@JG(5S9wyv`jJ5~at8{Arc+cOj~69S#ASRuj(;AH#rJ=US#*^pGrqKvs7vH;oCyZmB%Vg#G{9J}Sr!+
-lDVIQI5o_f#^b$D9bLh+BmfglBYhRY->g3>Hvc4#KEAEqI`Ncs}6zh1<?;j02S}lmLb`dY;UEZxugE_
-Ec)KBBe`ti?em~k)^@M}-B#LJj=gO>s?$!^Fo7hI?8BJKo8VagFTlRq4S`}A*7-M<Byb=f^?$nPE%@_
-L6R64}LHgFUU0nJ9r(O-3)OJ9-aBw;6_CV!YeLHb|4mb}WH>mXW(7pM11-&VTsp(f6<4{_*{vp!vfg{
-(GeU4U43*STFf5;IGkQ%^kJ2{;TK+?NjJmMqfj7xSgP#23jexk?7IBL6ChLm&>U5bRV)QCn3n9sFT%L
-wAB{>)ui4>pMaATwl=s%gKay2MUhOR5DxstEio?nNM9H;hQ3sfkLSz$!k8tZjT81#kQDv~`VL(p0gcJ
-dGxj<mYfYQ1EH_5a-fh9I?iTDWE7q&kB8g|elOzkS2(SpiGX41R;gDS?i-kdFf;^{10=An=X(G0ClUv
-lpXuT*!KYpYx8(n#sQb{q`*bih%{gdP(>!PtTs_Jn&L1o2mKNg*NO#3O|C83og<^qTq2>|~)GPoCYcI
-1H3f7SlN&|-s8HO$;`;`@rWr?OpN-HbU%d%n8XMxUoObYQd>FKBo9UeQ||{Ap-S|JI|N7HFE{(P|Y(x
-ln*8l^SR1S&y}B0^flfaGR}(KlHvLv1x7NhE~NC*s#Np<v4<sWA2cEI%1D3H0Jj$_J}E=?daYZ-PoFQ
-py_#frUG@eF%U5eEnA$X)AICvzK(x+%OJShXc=VW<(D)JZ#fTgEYv@@Gz>x*+gpVmdzVWhLLRvFVV7A
-^GT2HKu!KrJHrbB1VXgSgHstfR`pei7rNO^CTOv5$!j|A%%jc1n?k{gZepRl;xs;zA1LKP?W<_`t;3S
-(ZyeDa1{a!OfE-Hv?78lbz;p(G&AyjABZkNe)y@<4|#r%eOP2TBkE05VEDw1imfbDREoAgPN@=!f!!3
-5lV>WrYPM;_EhnpeR`L%VkFY3S#*XrHUSdrWIJNt;gWt0NvR&Bhq9i)a4i{xM#`7cos}S)0MibHsQJV
-cNi|$#tncNiOzzxV6J5lCoinr*ayCbVXxIPh<~`>0U9<P>m%W$){kE*lo^d-4s0MQ&2VpyV5ki0B)~n
-UYA+MU{YMfYJ6;46zE5tR(rv5wXhv^c?{cDIWvmeW$&&)7Z%yIt7)Eo?aH|w?#i5N*U_$0n$caAW-$7
-aS~I%0)&RfF8NJ&`4n|*oC`W22#|12e<v3fR<f6q`#1#Ayl@ZvCQ4KQy!B_gQXN5~v8ppGECZ&Uv*{O
-M4s2b}L>2~Wt$buho(9a!q#)g~yxZQUtEH+shGa$l%;bl@{!~}-#QNC+BP{!EccTyblB%R3^iU^Y{??
-DUW4U~c<t%!eK$9Rqa8dqdFHUu4ALno#brvXXty|mOXsLNn#fY>4_$UQPD3CBQI{$ChfHysOBLR;jRl
-u?qROMs&?Px69$U$A<X#uVUcOb&!#+)-Q@)>ArlF#1eCaFVB-;3*8~P1#O_>y9dwtoV6_eGIkgjp2uH
-cs2U_6E?7;cKpDA$akrj^{Z?)S?PFTWPamUSLYmSFi@0<fZ_V_KjS>Z6PKc$u9p*ZA@Lu2Kwn{buG92
-84g}WWTdRyqjVCrBJ%)~8a7cOe6Er}=s`S)vNb3Y#(3@nrUK$Ni8<>=UOw`$_=DbNio7ZrMc`hm0$42
-t_JP`+8;@`_8ZR2;{(9zX@2}<8GAz8N12Az&HFU5MfjPm54u`{QPA=88KlPnCgK^j|r^mqY=EZwBsqL
-;64A`AfQZk?T-(d24ZF=NKlT7&1qUcU$bYjwJcM6cIlwVxn~!66XobedCPY;TrLVRa}^*ps*Ke*E*x@
-6Z4D>+#?IbpHPJPd~hT^;(hoVD95J&j-V&z%~p1I2axu91hH0Rg^pI9~=%_osS{)Ch?ybBT*AH6}E<C
-+_NSyCm;r}Vg1Uz73JAr=8#Z%HOgdv+eiNzb(A*Q_LST_V}`+A)X2n8LYjvZPf%hJ>~hd6w-s^w`owv
-(jG0IU(liX`Gep;*M$RbEx}fByobP5;+d-~GYf^TCNjU(V9PKVfz71*9sgDtL5tDlShp33fAa=0F_D0
-00u!y|!9nZN@!_sa!GF+}P_7z*Q?-I*0VyOKHE&|zIxh9E!S2wx)sG#;9>5-CZW(*cO7Ip~9{Ft`R<_
-CNlnhw?OT+6X?s?XLK6R}ojC)`;luVn?xr!n!l)42%M8u_(Gb}c_o!{mLPeoC`z3JVFUipLc##z2!dI
-)+7Y3_kokxq)>>yBxU9(1paJk0KF2NXLS{=Q#<w-iuRJ)L5TIySS*;cnOM1SMqAwP2&?-5*2^@1~cIK
-bZBYRoW$IbX$KmElEkR7cyLz-D%rM}6F+4GOtwnZ(rqe&;AMbAiay!P@4p|vd;9t)+nh{5p+0H%X|ae
-_g<2@%f`|WLhY)gyzt6H22G8<reQ{}?c;b8%w9q>RM|HZ+bKDj}M<$DG`pH|h4V4?%nrf|cqn2?(yc$
--O938nu537pe`skEBsx13_$jhq2wIcffeZjFE;va|j$I(a7hBIRTDi`!4wG!ip@>z?^Y`vIa&<~@M(P
-Dx7j)do({0^OXC?meUN+P2XpU3uxkDX0hlb7b!MDo}woTHFdQME)jtPWeJ74E7r)SJR&#>}i3{y&ec5
-LrBPR-!%jhHU9Fh7B&?e`jO*2O0?U`<%^8v7UhTp%M7M|IaWSvet<+L*@6qRkmtt?I_l;yW}O{&z}6J
-QG!y(usf%+$=*ebUMMeVr((#ml;x1d_S_WJKgg;dd84|eg-PNY`q8Ga$No$b!5DTtT~lB{P_@d<;)UO
-uRYHja<B;jh>CPVRQ>0G@yO1l2&J^nfaVD4LE-OAIs}+6)je)}knrd<*HhCxrwZ%kHgGb1>*=;G%D_m
-}hw&^us&;aWT@5Ptq9{Wio|HZeos&krMrx2|zf@3*ha81F{cE5(UBECtny)3~?Z<1%xY>MlGtZ~K(c|
-Z6`e7L($(zTui{z{;><#PWUnCJns{YsRwf)9?5?CqvPHl%JdQt1}qr`ixhRo6s%p9VIw+NjwZhmA+Pm
-GQ&C4n&GbZ$K(&IbmkK0YUd%obKqcStd7V(WS?3kurm8XxTn|6n>WR4`K8^e3VI*JdkI_hs=u(PIN~L
-&kFJwY1k{rm-o|ESG)!I?}z=t$KKfR$I&zK+;RE&9B#SdYt@wu8Sa*lp0skw%CPGT5!_M^tMsfaFZS2
-odn<|^6iLsN3Q4B=UPCnz$CjFME@DrJq{Ko?zcMjOjvP7CI%TMloP2l#2%D#fu`yfa3J0zNe9=)AFfw
-he-*PFT0ErIm@;I~#O;bcr1=gU%QtlFgx}A1zY*dk2C>D+!Id??R;`HL1k~;&N!+kP$L7j`#Z#4?oI-
-v+<L=jx5F<C;o;xYad-(vo_dGf?#`V4-7jwfX_S@3fYlnhVlF0bQQo#${RaHEJa2xXo|yD=LiNYr%>!
-0+VIH#eT^bQWPIDjk8(lKDKQ%@02zhv|aHR;Xm!!LN!%qUTYw+=*;kk)gii`54fDyl&T{;4$#beH~Ek
-GFir$I&>XhVJMtmcffoVOpmxuic8@}v&#tdELllSBb^1#3ocNs0j*p|w>@02@Sk|pgB54k!vq{X_>zc
-CqZBXS(YNX%8=kPCAYiCYfxC+}%8HJd_#6mrO<)jCbh3l7X1lqXSlC&uVHW1uDo@Zgg*N?=ma&=v8L^
-y+HvDTIP^33TeUzF++GyO+36k?yN0*$OJDOTJxmn$*IR8NqMf&Z)6^qV^>MEWiEXB16tj)8B@yF23i~
-oTFi}Ui9>sO51jMXBWk%3ywjZWyPM^VWvy`aMgC%|Y#vLf`Ec_vFw4uR2Eo)Iou8^e}2=P{aOHRhG7S
-;UYGP38?uDx!Di(mchawyJo_ajJopTV-V30*uiC4=y}{2~mT6_x2|yYSFB-8SJvSchR#=G9GxSN!v4W
-!gmM5XJ9n?y}@p$=Wt|EpgX8g42mb|K34BV`6_BPY-ZT+4^C#2<CBwy4K@G2<KCn<L)PeDLuhs+STki
-ARwj20DhErbgF8se0{8N*N6@{3k}uOtX-=_<r^!5tXPBke#-)kZ?i#m6Dlf7DVe`Jk^fI1)q6`ZuQGR
-zK@+=3~7_~EXFMx4wcOT7I8-DA^{jfe0N7be@iAQSr+qEcE9kL^3=%h~MB<TuCbUGpK&P1Vb?9pHquP
-Hu${Al+1`L&$&`faN7ar^6z98Vt!4_+4yD6CKLJ2czz_NHUnPN=j8%OTeCq*CDTnzTY9^&MACC2M1C5
-F!w0Drh&ul}Oz`%azCkGF`1gojVP(A*rnf*A%I*+T38!!nus0cQZZqJVlmY*yeiGp5jeyrDKk{m#Yx}
-UEbye5*Z3IDX+1gBEv=-H#?w#AHCr;Qlh#(>7FLy1u=-Sk+D!`OQBPG9<#r*w*3Vx3cAO2^5UhqytwS
-Ry!hXPi?%H)0${*yI>PGJNsCkWMI}?2Ky5(-z$d^IH9?o(cWx}c4YGHFKKKdd7p~SNPv=~M@3DYsg{M
->SpKmd}sR)ix36o<1rN^S^X<Z@=m&8_cLw{(@Eeon=sSy?llw<oYn>vgMCIY|4{?XAGom_!JRaJm(l`
-Pz*12D}E9(b9C)1nQAPgZpf!O(tHa(-~Yj;-RexCF)uBb!a57;xz-idK%F{0N6aWCepAEpg+^z(nH?*
-BS9vzzll!PjKX2QPpRwH8V1g5tan_zKRyfOr-+StQ7x1M>pUR<#G{;7}b@<(HSyox~`CS1yVagn{9^p
-yVwlarq*Gz)`CQs3<X=Isc`cf*;;JigmSV(E<R89on|Sl6|^^#RUX_}cv5q1MsOs8_F|9GJ&na8yT)y
-fm?P}T!9Mx`*YRS3|1H+g%9@|dU0)`k&*0$1U4u%I;Za?jLP>$C!0#kbFdVj|=0rr^XdnF7qu%(t*RR
-h1{PO$pcjtdRfB#bt@5QgsMK9Y`Lx~@nnia}w*E1~RZN*4(be5`mBBEK9gL4N?gb3PwjOb`CUW6>p{r
-kPm^mi6yb7Jv-1{|13>em5YL?bIECWLTgEY04qFsnJ`(frzHm*TWyn*9*v6#EKvZIP(EQz}!vQftMMD
-0Id2IK^m*fpYcNbC;VdmZWI(=6!z4z#*Dm;y5b}fL$-f_O3BE0Y~d#@VNi@fCo^dCzZpX+^jl1gBadL
-;x+@tQ(lA8EMcWwXX}D&2W%(6K<(4IO@UhY2VWOE7|=8*m6Q@i+ZVx7ohVIjHsFd1FSMy4(3f{OFXyD
-G(mTcN2(Vt-ay#fh89X^)N)yB;N%Jg5`|qc=&;6zP)L1Jx$U`2_)>8@e;72zF!UI{J@wm&{Ug)gb(Gg
-7}P};V`n?@+}CA)}ITDjG+wV2(MCIeq`Y9c?rureN#l;@jZ#F<;d0#~=`rP3<GiksXbR1ksKc^RIyky
-9=doS*d)Nmge08Vs1K(QZpRcnV3C=pSC*rTADoTBC~G<9eo}<}j}!EUmj!1NkD>K{G^-CA!QT?#(T3r
-dfR~?IoGkp9*4RuN6EJG`ndn_qN2paV35)c4S`VT{z-*GnB>z1+7ZH&;?yReiJRg#iMWc*iR~^PFIce
-#j1oK_|R$O1U7VZ0Mz3%l`pD-!ZMEdArMAu>8387lnM$5Ms2$2Wlu@2cJSpL^v*+%+eY<*Rt`bQ_~d6
-#1S96`fUbOPZ0-lx#M^b1Mhx_`{V4B{0@_sJZ+M)6w%#-KwiwE4@@~zZaCEG7O)9BP_A)9iE9v5o?aT
-P4ZPzymxF>O8LTzhy^MK*KmPN^oyBf-a-)5_!ec|DAtcnI4s$jrc_7ZLR{bLK>$7wXZjCmI3SE6k|{@
-~F}Q+HBRL^#+DZz5fE;)=kb-XC#D2w7I;h@n+m7nC<ZwRq%QB1t%@zJy*28w3z35C8{5tjY!)U9Jx_Q
-zJPaKZx!r6AZl!2XoZ$BUOg)heQ3>Ylx<5l=gBNb$MJ1ZYZb30w9!4K4F8drs)_op6<v;Th2!s^!API
-YLS54G5F<rW%P)$|L@i-utLzWrJ79X7wQ|XKbWNI94hh*EHP+MK+~<tw>k%7awB{hc^YWKiaH@t%PiW
-0F&eH*5=-eigv+%#7Abf$g4pNh+G@D-)jG$1l8Y9`131U#=j(Hnn{($Tek&%OAF7>cFQYt6Ak;EN3Ct
-Gpi`tf`#tXYbjr)GzJ!s{wvVJ$}isZCHsFhSq^M_sRP(m(zX?48wuzTCh{$-_AW`FltwoHTc%_;|Ck4
-1~?=(b>U96eML#5@3RLEzVy3L6){8};r!%}gcHt<U0ULFWNU39ezvn^HcE(b#t8W{bw$dEzewdtMo%j
-hexEVd@TU3*ei2we#0eV>Hp>!wlDok;F(k9<+#o!SO<HrNymu&^dYq=cX#P$-9ptDxe2wo4YW-H5Kp^
-o{b4_JX}Rr3pU36^2!7(uZ}y-ZWLxL?IP%6Rm-c@vJCi5_;QsdWiQ;-3i7Yo1;o=18Q^vD!VUI61X#y
-AUN`Pw-&6@qw$VsVvhah6huhr0J2_r8-BlcH*Gn`2`gH7Go4B!;q!MmT2E1$9DmJwxB~;r`)d+6Yl2W
-y*rqcD&xVYu-SKlgx5w$m^LtJrdmtVUJnV}k6$o8xEC%7}J;?+?&huJ-G_D320=<z8xU1aIEVZVJTZ^
-$cLG(0up=iPGyCvcA~vs@tj6(#m`5?@AFNw$WCW}0V3VF7O{p{vfC3$t-^AW3J*RWd`EZ35~HKtzO+N
-};>iG~tI?f*Q%-ez~Q-gf~qkXQt>iO^yusQH%8~u3p-HjF;I}Y=VG^oC|`Z${F1OHv$rG5I@|z3XUJF
-Kj2wGY2XgTv9lw?;=_vK1Hw14imQ9VgPz+rqSOJG(zE(i_YaYJ1qjQ~g<z4NVCka+M3AW<b$l><Zru$
-R_ZAz-&B)L8MG=ymSz+MG`fkFjr5}(`xcm^xKii`G5tJWoQT`aphp(~rdcB53j{E)o$;rXtp*3873Ix
-rclSYWc-nP3*cBgYqwc>KBi1#AS0L*HO$TCUSg>dWY(<tn#tmG!5Jru5cPL~|`eJDB$5BTX!ZrQ=iau
-_+apWz7@Ziw5g>ZEU2H8EDVh|AdWu<@7|ja@i2Dnch4Ho5ijiHEvvXvZfWG`fQ<R)`n*GEat#Cb<x}X
-E4s@?oy%~vH(rxSQuLz;ob<oMdaRSjE~|ecSl1TM>7HA&v*rn^3ks27A@`cM2vvQQ=OYjZI(4fBXVff
-5t-qC1$RSR<<W8q+5<I&S`47;L+Nu1m;(b;f@4(_1GR7GN2){hZ!cc!jgK3O#*YX`54|5WKZ5`__@SF
-_UL(WmMg}#F3@aOPclY?&!^wRevkOoqyu(Q8UU}T2l%w?pU3R3)jlQK8*9hpLBbawWEjeT*I7yiDozU
-}7u#VB>4qSi;ep<!g1Sfehr2hz;{-_$Y-~F_?G{P~+figS6;{-i^G%6_5y5a+)xF0>alWaeWT<;}QPo
-Bz)<u)N!*Eg%(*jKzHrKfoi8TgThby>=nl__GPfcHMZLj#Tpp`WO-5QGh%+Xb-=Y&qhhCmO>vi9#jLD
-JuFs0N@vo2MyHnh;n`To{lKs`EHNNySvv>s`oJjN69;_NYZUyy2%?yMFJg-Qv!UN!Hz{$Z2bv}zZ5wm
-`1e2H-&;-n9{a=^KS6iqTwT<ZUIJmT`hJF7V7p?CC>-~Af1o07FG4c~rpCod<<0A-crm*k#l)dzzJy@
-9z2G8(r+I|*0xDfmYp7~jb^5AHa`tc0C1l~W{;v79Jvt4APd8Sx>gZ8A+pb4)7@%IwAl^mftO}cEbI*
-*5A?Mj}pC#hIspzQI3QM5EW8LF;@ifonoqTSZBf}5-y|uP{#?!a^91QMl^1In2US!v_NS$~cYIxihJc
-rmHY$SKK1-XISrN-x88#)*|<=dh|RQ;?$bzNJ0(Rb3NEF6SDaFPGKPm3hNb4VNr-`X25hVc6&n306{t
-A$R>D7juAjiW(%50EdE3T%Qvx)dVFE-<jGK_?_Y2%=6XLWDG$6lD*8QD_vRH?A;3nP80q!W<`=d%b)L
-=*t{9&rb(<{pwo8;Z89`?;{6DP&>YP|3`+4e8z!50s&kDZzNT>bhxC+$g141Ov0(3|DdY0ov<M4?cq?
-p5`eq)KnZ+OPg0O5^qsEoL?a_QL8pBGK$z2PojaTIx*J(2D*s+*v{cC6_Ei*SeK@2dURy{~d>fo6x%E
-uEMKWsmb_@d1&7Jysd`Qg}MaJJ_3YX!xTxM~Rpj!stJ6BYMhbN$3Bd0A9Iu&r+?P7^gkGUYx(Wt))5R
-m`k?tv=1=E&6U&{k0<g}>}O%$u&kzE=Zg@_`Q-P=Bpg4gB5RyB}+mM8HR>0mB80UZcV86Vjmk$)U>)h
-!D3Bzmm3`VS=a}7FSPrE$+OlD7df^oyzD_U_SA$Y7obChFNW>gfhBJ<qd--+QnYD9988}nK2(j&!uW3
-OiY|R{+F+T;EW8Kv;bQZ9;Ykohumq<DSK-6bU%Cu66Vvx;P6?rFQ8H_DU37LHyG1A@JouW3OsQduNYA
-*dbU|vJVrffhd6(Pk54giH%Ov%(vgk~<^}ydi#rwR(;+Z?Wx7#PV+^BOo6bnbi<)kXDAsNNV4kBho5%
-%Rq_XB*SOp~O=X<)(XuG#Ig<(*S+{%z*TaxVB5^?eb_&gR=OpieT&fddi5D2!;`ymEIvy+niaLX^O4v
-uP=!4AC|&th{mHjf9p;!y~9b%ZUd=@hCfsA`hJx^&njPf&E9rxkf*1{xEh5LQ!R596n50VE$Nn14^TH
-p4&IN#<aId@Ivq=e@Yc<1vWQ<}e@W*MFS5ugv*43+1_I(i*Rov^v&$DwRv6T}-Tvu7f6*-8(Fmu2I&9
-+xJ`s&mL$QBp|Y{a2<4Ixo`SL^($4i{#LJ3o0m_2RkC#nsleDh0!u7pKnR8*8$c;S9=*2BylYnt(;U7
-@Wph}a_VO(YBv6?ECcHWORLPQ-`lULHE-A)KMBc_FF$6dl7p06Zsnk3)bw!+C#e6+i_3_@%M&k#jAzQ
-%o?J|5|I6ylx2zs~O@$*w0vmf8QV#C8{hiuq;Mob7$lP245N6<Y}1i|#-u;XCW^S0^ol=D}dmfOCJil
-{7edD_}?1lI~Y+yWoBRv_atoYEUUG{scgU?i+6(Yq?6^z5`^AUm6cvpJ2}3w8b_r2tZyF?^{>=!A5lD
-40Yo#5@mc!}(SV!=yl4ILwsX<sDQ>SLHXwdnm;_dmzPo@$aj6!SzHg4$YSnqDkN%=da(tQLD@S*Anb2
-rmd$EG1VD<v5L_%pfbgYLuKD_AyFi^TSsKII<bO!d>X^PIa=ItokjxtMBx5{RfO@qPh5<ThR+9gl$q|
->mQvFd>*Th|ldGtVYlWsy3wR_GiIzfaqP}~X`GJII`+`v#?I)|NqkV#kjTZZPe32B034_Oc;@6S)>m3
-Czd$yg_MXfrKUo5i81~sjf_<FKPrVl7^bn?Hj&{Zy=mROCz)~Uh<Za%q<N_P?w&qhI_1|<{J8kiG#cN
-Q_j_kP+N-ck3gCb!Z*qh_tS%(B%antFF7s^u9mS;u(~`W~9+(`+i(!@F8j)!uftR8(^iCH{KU=HV#=L
-;}ATr+7AU1frngy$SSVBrpU9gCrb;QHO4g@F0;yP9h>Ig~@tl#=wuDzc^S*^p!gLXGiqK9((=s8s^<X
-JQpy03d*YghjaUID4xfivq4L2GBrpokRGzfkAbtl9)17%?H}L&NdtyDpoIARV4nRGA5tjWt^Qzmc=UA
-i?D)A%<JjZ)859A>w_8iPSt71`qzWOf=<%~ukk@>@P=}?0F%GUpFqwje+3E-AQx`gUgnta-kE3J!qYr
--!;k&_e_--(S@A@AFQx0(HsnJov^n3Lp1hEy-)4|9Y2#j}zM=^=_u0VL?h#k=1C0cbs=^7vW!Yng-up
-G1j)Hg;BKE>+xR7XI*$uGj#A9Y~=;R`BN@cTi0LyIGVHH`8L+j>yeaKzf8lnnn6RJV9+TcHk%@UuuDu
-%qNWrvNkMCWceLZ@dbPXn9U_wqq8QFp4TGP)6tNFnSx&|Jm;FXm_jHGO{hJ8}p}cP;x@6&{v*hE+FQt
-!Sv#!Mk+c~+zecVA5&$alJ$Ey1vvOh5m(Gt2*yq`O=A=$9t3QbFN5_x6ys{_SyUsBhPYz>*29zBf?Hu
-nB<HgX;o0|pUPt6hEd%#Y7@ymiJrLbi!R&_X)pl4<M6a`w*;DK78V{h7Q`0!5&MB9#P#>Tr@z9|;7tP
-S8iFfGNZ3@=j2<TML`12oZh*LeKaqx7W?<N>>LOXpaXmw?lAOB&KbMoFSEb#h$@b=JIlNcZK$cdhUB0
-?OsS7MvelK#^3mI4=JL~jDo3$M9$>!rNW$OH6~n8nLgd26Ocsx?qZgC44Dw|e%4WxTh@OLj17b=0i=-
-PZ!(AK$g+?cm*$9B;UISf^EZ7p5&E9YUCIT*V9jh+-M7_-t4q2rOUUyQ1li2Mg|Da^mR1mkm4j$mmTQ
-sws`Ght<}c@o7MR^=HB>4!{c<G6OGt37dK<=uU)M%~zyd<(H>~86$R@Oab2dHtO%_eW{3W)kl8t6<wo
-;wBCQ{_i%CiSU(MP*8+oOsURx6XxMssW7iBD{tdCV>G4N8G`)-v_7FVbF8b9|x<JtG80g(R=XR3(Gs^
-LyuW~(~_gof95vx(RL*q_5%pYiZhpwU&%q+P;2U|ZI!WFN+>l~$CH)D1;=C6jua%rZ=RA5^JzU55znO
-~gX_DM;E#Yo#AB~a6VSq>acm%EdczvF<X;_@9O@W%6?Ng?Lg89NNh;bjRVVO$Q4QF%B)$XN!wD`yd$Z
-+uH#3LX9SMSOw5F<Fn3;^@!>Um{7v-k@)if0^D&!$%39usake)FnQM`*?|OMLb5aUFX=Jl)yozWwbCM
--*Ichb4_O%&K#l=-$XQfRNlAT2vT)x*Se?l2>X)9|KK(m=dy%<HU~!c?u<R-S3G3@KJ-80A%Cmi3Xhd
-SlWr3i2cq2$qql?kU^%n!jzj102?k@6A$Uh7fZjdA;vI(%)r<w(ET4;$ztmaw09t0{BP;KD;x%lY_a{
-lIbdQWXcRkgZ0h^JNxZV7z6%*;ak(*;gS0e3uHQ*@_TLCAchuP6K{4{M{d+QWmZfZ|j-~6G~Ws?qQR?
-t&+KlWy4A|Cw+T`KWExT}GtD$Am!nwU9f-U}l~(uXh+q>{o06shoRjbNGK)}olzzQcmiP+ODE9lYCBh
-R7O;z`}4|>e(g+SHWt<z*88g&Xx4vhKO?hQu2+4ctkIbKj@O6zsd1(Wcr5}zR`NK0b@OQoGKO~VuM^;
-{1>&`tTI(Zv-m>%b${?NSQCZnP7oIkZu7&1#*2!fHw)=aL;Y|e9!Pt$pI@Jp&?P)@%}p6*$xriS!k5(
-_-@F?151+Eb-qXry&e>I42roorsKAGl6A(?MiLhy5mT1d)4v|}4FGOuc-)gZ{tddpaDxM>>2#GQ(!fW
-ouMYPw0LEljWD56BPur8xCS*;g%c%<UDdLtNDJs8@;Tb^Kw#^dWa`UG7Xk6RX|T?Hm^a1?!$A}>}cn?
-eUTVu|v?T<1U7w>)XzOZegV5^vYswDTaHcx@d6oleEzgS-QMNmBlHI2;a!!>7-WpLX2%N(Kubxu68lj
-2zUoflG8%o1NfY%Bs>^2LjIL##_IESb#ro?JI|`=ksKmP~=mFgYi{q+(4<_nJn!D2<7#tO+i9|BIZ4i
->1AE$!uT*k4HBRU8u3c9jd~=2iuhxW9)Sw}`O06-v-32hs&`~_KDjbY7ZH^UKaVnO>TgYe0%!*xBlE@
-a5;lfQ`S6YTJo6+rCLz8vEw1X>SJ(|oe5WAZ?<wTlKzu(|Qj&&zV^>we9#T-sHsM~!VIW!uEdtRNH5!
-IW{*ub49wh-DHt||8#47*l1rKH0)lgeB@D<PgPLedrZ-WQ``Yb(!x^{KMXG%6U=o4n;7tY}c`)|#&c-
--_ID}U$6&flqb@ag`d^32E(Mc`8ORJY|V)qnT2l6o=0tZhqCVHTOVyc3k1=#IMHyM20yJlOWkl{`=K+
-oU`Z*`#;i9Z13W6{SHda^d9X!@;vb^Tg*$g;%XK(D+|nlFHL(v<=uS8Ff|Ckc`os!rQKv%~zLgBJ=VN
-4-fly)D20ifognJxrv&VmcsMlv%5+Gs1Y$O24nklE-^z*e_ZZZ8ohH;;Uu=np$j>?j^}8!+pB2IcL1f
-yv@u+?W8hT?Tr;(|rDl!5_2Ez#DOY0a-h99W7PE?ogs5vXXQBH~ekX7bB}on(lHoLhW`bxcY>oCn=Si
-m&Qwa~1I660pc|iTDyb8)W6};CcLnB3(SHYR4@W(h?@!haWi18F^!*G32$wv1RMup^M*Fw_YMt05QW=
-!dA-Uq6EjH(V1(BdNWo>1*83__w%1c8N5osse?nsb$~9j)qF?tDQg;3kf6Fm!0uQ3a~b%Wd^=U~W`}2
-Cp*g$<qWf%<@Ks379Nf!EU^J?`<sh_`wuEGhU}Y(lUZ?L}d$+RQN#_KIPz$D5FntAuu+|JffpTv8kQX
-gX_JJ5WI&rY94@*;$09fkTb$wJ#&Pun$5<t;=!0kgZbh<WBIq3J)UKc`5Cs8AF2_%WyFEdd2o2#5e*F
-^cHMx!BWds>3_`$@w3`i7?Nc8rJn(nVmf6pINc&`C84x-BOdMKh>y4kD{;kqUTUD@TMg})V2AYHG7Y}
-6tKMx51y{+<tgZ1B!BLmdm@J{9OY6th<DxhDYO7W#cpvUX@QsD&p3wh>iVHZ3xKqrNRt)_Ev!afKfhC
-(GXhrsooA?CI0jt7$#j$NBDD602P*?tfI55d%RQ7`$ug1!ZLt`N`cvQ|pD1xKjY>k~G7rnA@azkBQzN
-g6EHx`;(;G(Jmhpj^u=c|P%_x#lBeS^7;I4dqecUdcI0Ip=$vgsuP)!c;vh#r+Rl*oSW=`H$`ahz%fF
-^P`!ETu}~69`M13Qf?V~2LcSd#C*fE7AqTta_-qr$ue0)`Qp}{d&coe<u3=$ZG)PUplCq`i_GRQR<{|
-r_ramAfa%*Vn@0&<9xdI2DX>geu(}bF$wYd?*9r8VG%hwE^thYEcuw)00bjixhnfIX<wySb;x4_~H7{
-d+ZhIhK0+Gi69psTG#5&O#CKEGMo^ltTtHdtp2ilE{>^c5Q7&=85iY3ibdhwmj2?>YitkWov9-u#YaN
-OZwFIMUTk#>k#4Ka^w-?~S_DR+5kFGMYmN4cvb-y=@d3-w%>3Qgbaz1u^%mx1;W+Xek}CZT6Y$X&`vo
-JZ?LDMpY2aD^R&r_a4kI(__99}d<y>2xSGI_T746?xRDziD>Z87}|%jyp{{em=jPIvOnqDJe)S*8rq7
-#9bgDGVeIh6b<8OMk*q1U4e8pbG?FHzNH*yT+DP8Dg#TZbdz&YV{zCR{qn+I^4K(VZt7vATFZ286pY^
-*sE+Iyw}C3+L00s~Ze$P4#?3N5kpei7<3d;S1GwmSkDE0Lg5lj9b<F)?U?;9sq38b%Uq|3D;o>$^T17
-&)u_;2>eAv8j-yKHIyN)9CvI%^g5U!~4ZQvQnZ%)OpzVs3~Kf@P#f=^!H^G+I|y@*TPBJg`_ZvF6(HI
-%RHQO(Yx_7ixV((2nUn<*eJaD@^Ewux^xkYnv}KWeZ28j75yv|<h&cUsL)b7uLYym^k@b&{BzhBOz!S
-=>aV;QR^A6r3uJwKZ_@@2=CO!64T3W1IO=^<b-%s5=g)a_?_n#ohN_0#|$dLPJFIx6J?jQ5ZJdgGZ{t
-v6EXl?XLFwz0nbF2Mz}P3Jf746nu@ej#QXdIR8N2u19*W<T0aj$=*M7WbSJVqvx>u5FCu8W9uE+dew%
-{_=f1<Sk>`T0NhH$;gP7M-X(BTFWhEq@yI$(iU?*;E1_BS`<lsaxWu4A5wovVWgIb96?+D|hY>F|tS%
-*D4}E%cZ$qKMv%d4pU(IV8HH8MF<Bi-uKkf}gsi(E2o(_6AbhV8R`-jN>;BZ5+qrO&}sxo$vgujVMMa
-8{bFCWWOO|unICy=<|SbM2oSY^jLHc{vPJj8CyPzM%cR1J$Ux&ti6=nKGNjQAHJe2bBXZ}F$s|MUIp_
-v2UZ{_^%clss17Za}<v`G;5Ey?zr-rmzNycxVV`LNqARF+8A&$vT~08ZZ;1F9<X78!*Iw8(@h0;5S&1
-1|w-&{@oxAcqnS5F8^<FiMtBEKv8S*Pz2tlQq`<9JgRnY@Pg4V1709+kJ%T_PFhw(?PY3po8D+D@PRh
-)vcZ8Lf~8yFTTksnPS3bgGF~R>ST=I#?mxw)u@^?Msw>RAsYf%xvC4+m00NqZQlmy<(r-@l-k#h0g-f
-1&fot%7QQqQvmg_mpgRb27<B0$$<7IpkiQApl#gSHz()BCuwgnMkaQ7iDN85oCAkkZ8D_lBY2HAE+q%
-gSM3nDVqiK7mc!K}}@iB_vPoxuk9h7OS1iuJQIHW=aVyMOZrK20jCx<;iMEd;G@3CL^;<5R-KvC_roo
--WezE|OrV6yl%6;*sxlAs3h3lapO_KUZMfa3{#11nM{wfg&Ks554FZ1sgThA6*Wi{$wUCf5v?9!JZOl
-M%CI|{V*d$kKHT%!51wIhQP(T-$eN?DPU_H<ufTc7)-iH2@`OhfP2_FIcf3ZD1?y}7ojKMGsbah4+}l
-aF-xX&yiXVXBbKk}j0&Y1^JzGNdaU@AfZEJ-ef$E{W)|OoTo43b{eokc_)lO!w+%`AF%DsB`HW3IhNG
-#v(MtGz-N9EORYfdVlu)paGs?1TXps33*2HxyM$#>8$uThpnj|s4Ok@JQ06)pZ<z4>#=IT})woJ0C_+
-S#xGx4CM)kjHeku@SlZ^<3#lU<8e!(otb!_Kocok<}LTFX-b+QAQX>7aX>;Wouq=ALi4P!^{~<AD;;!
-Bbn!3|{xypjzYl0gY3w?w>OMMPhl28VZCpP-xTl!f3(z&i6N3n_zY!2^<E}vj8fH{M0CwMkPYA|NR6U
-#Gls*l!L$5%rS3Ow8U87<waK8<@eG!f1y5~{D<!I$;p2N6hqjr;Cisn+G?bqs163sfJ{O!LMLpZ`wBi
-P(#r)$^j_)Ag1XMvcf1|y!XV%<gkEfZC-3QXRlHYByfVqP|HUDeNG9}}u$xb*<|#~Ge21qfF{?!Sx?R
-}8ml87yTr>oY>WIV>ocs<ke)B(aQer)b1FzdP1HeIMe8&|<kMAu%r1UFXwT<TG!R*5qvJDS6xgT(1)0
-&|5q-ss**V=@B4V>E^EN<6b4mie>y-A<dx#M7XY+~U!I=m7)3cG#fB5~J9_9PJ05CmSl0CPO5`t@Hjd
-|}Qv=}2`#3~_qwu`P)@9`~g%yR82O_!Kb?UQrvgUk>?Ba7*D5{`VT}JF#ct<tm^cYlA1cg$IDZ6KvcQ
-1CJlvdl+~?T=Imzqcijfiidm3Dpb7Bh+wCK)h2pfaOkwsSioCo+OT^SD0ZMk1~s!wUkOT`!5!>uk7_r
-xNB4!P3yb1=Qvm$cHVWSJ4JH3x?qg+en=sehU?-}9Zla4(j=DLEJ5S1)7RK6~w}m@tdC{2E3l$OcOO!
-OUHdu^LOrV^{t3@=GJ)tK{3;yg%l3F-*1*~Q<jz84i?eEHzSt3Yo;qER^;+v6AK;D#W2HZ)#Od%vhe3
-7K7Oq?m@{z<*6&dpA-o?eP)o7WTGd}$<IPGM?cvE7qhj%Xx>#ND-3p5et3J~^cbW)g15e4^0}(>Abgl
-sWFn(p+O{TgqGAoPgj^s>1q$kr~gj^<)uK2xlzc5;a~v_sZ}y0=<ZDs9#r=)>Yh(N_|8fh{1&7o5*q7
-*HQc=QYC{hhM^{(RP5gZoFnU1F_fQ5;m$>t>SB1Pa8vlJMdNSR1KjXuXhWi}V(z^G4<P59$0Z&Z&Z7!
-I>xzMPzG+rfcGmmOju;0|qUsc;POzYJrqvI2$IAuvO7S;x+Z8=}66}5xNxJE<_%tgY6W>||lbu6dB4$
-sG1uk?JDD4N#f)B0M$B^y$5bo|ts6jlC^XLTnV_4)Zd!?pgzq&J=2lhmMp@&{9lGgWk0s9QS0xS?eoo
-x>HW{uOAFNODMd&4FJA!wvHM7F`R@<!U)B)Pbd*p?s!^<)UWFrQYw6vhu7ao0l^Y`sTf<;GBqfN|~8u
-6@S6S(&!6!D($-XEk(1DC1A;nrDk3H36H|delE0(m9Z`(=v6A9~21>jNo){PHsRAk3NzgrU5YdPO;x*
-heL!b`?wPzN4@dfGdYu8jc%Q^Y_G()@V3QMATThmZ&v(r1b;|3mCwF4@m6Y%vhSp|G4WE(fvZP48G_%
-xz-syyr_X5s(z51(^hH$@>JClgMojDwf1#_aXDYs&7nOO{?%7!bWmaIVuKw1jZk_zw=H(byR$%~E0~S
-K*G>=$$`PtQzK!mvT6nJpp)sQxB0la$n^!bQhuc`-L#jU2wWERtS#(`FQd?yv7l)9|d@`d3duM#l<yt
-*3w8bDW7wvfmrybtK==(B;Y8Uq--DXf>7&u~-tAulW{akqy3{@`RbIX*dQRb3oZg^z|$kNVF>qoV;V`
-opKshsRGx&-;hZkB^=|9gLnH9uG%PM}7A^x5@2B)r7d)80N3?YGb(gU2Zm3-fP^nCjAEEdJh;^j9i&@
-e#3G74ac<+j_c?SIIdqAsAXgj3~r4jyrp;s^Vt`MxXeET?Cn?fbhQcUYP?<GiOs!wQH$vMRpCFHcgz~
-TO}!2JW2F#^1kCPzgn$G*A-v5fK|=(XbP+|RSRu-pO4OU7Vd1y<Cbt~?^7z?vJ<I+As%pIbEFX#wTn7
-|K6P!Ni;5toyUSptjYM{9pH&Zkgt7!OW@ci&I4Cmp~0e>QQbjLwOAvPV<Um?u%wog@mS(xW9aR0Qt$N
-kga-uYIaZQl9Tev?Y3`E}qVZz+ZbXwp&)gK8+gtE2G}v+zSoU<7Ok1cn!E+V}Ih7s=rr_9%5F&#r3`Y
-E?8wacu4KR7Wh8Z;BTZ4u_Pz$1fLDfJ>&{fqw{NL0wUxYYJ8JEfLKz3uzeL!Go17UQXf}#$S0+XlwH`
-W3n!aw@pR_w))dWLO54I0JldZ9$VckBC{;!TWt_-l#AU}B)O2|)t1HhnGiaH78Tm|pB#W#o5}zANXQ>
-6_Tkfb3@oe%i{|L4V-JRpP-xcuukZ*~4q=hpl-WF6Z-{7;s*cL+NRMd4dGg+@z3<khY+n(1vxhYl)Cv
-qMCVoV?P2I>{-M|e7Lp^fCJIx%6-f_R<&LATwX+fFGAk&wIGMDY%5z1Viiaa!w`Gy`=AenFI%-4=&-c
-Zy^3cqq7^SaTphU)IJ*hUT&V-&zV-%e`AbpCb1m>c8t8;tqCC5*W-!oR_o+hl%&F|UR(R|jJo1LMEJm
-|G}iwG91IFy<BGUmHUS1tVyNS$b*HxI?fawAl|fBMDf3whhWYx+f^ROv|GkzY{B~MPeVB=f}7$JQyIH
-(*_{+(BU&yu0&(k6;4j(n}OIX=+CRb*me0id`>q0(XRk$hrT;tN)H0lF4^0(iE?4uC5zR$7xKvGGvr=
-qMPfWL$eFd6s|i}jrFS4k!-I3z;|Gd$>;a&wpD7?w^+$bG?-G9#X!j9aXSMLt9V!}4eOvr=mmQ6!4*h
-sg5N>5f8s)Ue!k;mxMK&RGT7vvl=d=Wi+X54Kq&mDyAm|wD@3J^8*10$)yN)^J1D%F(8M=b!Cj<^kHc
-+|fGT$b0$Ti$dxc2~b(lX0Z4ZH0TLMj{bkMEwKV^Vn-;PDFLVc_xWs1|t~fBx*y<C~L_(2#AH-P1T|R
-gEsI)~4Fv)n`Q@{|XVsw*v^j56XA*k?|sN|BV5{m27?k2(O7727`eWf~-v>`!_`hw{l#A6X@505Z<I8
-+f0yO3?Ur%9`tkIMD35{*MT>CUgCdYk|7=wY<r@~BIdOy=TffjmM1IkVB$4(Cfk%TG1!>O!?ECL^H1b
-e@Bf&s@iGETZ96kC=pE?D`)1>;HkoE=Z|AAYt8_RUx=c3t1W|T0%_rU{+|n~aT>RE{uzgb(()cZN?CZ
-)L3u;x*8mKMM<L!zz1pH`Q2zb3yn#ad|++6oJA-Nk>=6$Sk+!&HwSLNFn7fIdxeZ$Wbfq`B9!E+a>T$
-dUUdm|Sy+}RzT91IWZOAMjRQ8hD0XyVX?b9YJ&kfEA>&8Nijv+4qRl<J|)Yh_Om_90o-c2Y2Ae}BYfT
-v_j!et#Nj4}Yj0n<HM}(5pGpKU6juuK99P%~w@5UvJ{}O~0a_Z;m$z=*?>?@Z23xFRRp_uv0x@cdT<R
-7k6Hpg`NKoP)h>@6aWAK2mnzTaZJ`y86y)00090E000^Q003}la4%nWWo~3|axZUkWMy(?WMpY$bS`j
-twO4IV<3<qvo?kHqA)Ko(J?>ji;#8BEi*><{9CH*Q6d8L%wm7zLcLStV|9fY49ls>uDpjh5l6YR8nR#
-Y+b~%P&QEmi(Tq>}VK79P};a3Rb&8o;#7&E1K{>Vh{xOWUwCRSWZUgW?fESX>r8+a6Pu2^crLNEr!0+
-MAc9+?fQfH>bk$%HI&^e!G$%yUG87!nLgwrYt$vRJ5>STHnCA(pa8c#MdU7Rh?Wauq9zxZoL+2xF-wg
-QHpHbJW*?QWj^xb0FPT1utAJi?ss5q!K(K6dM6}o@DEk^4J<=e8sCM1faQ)1iO}42jyzRsz~{Qz8MvV
-Fy;Co<8o<3$_f5qt<YAIFkw0QVKu)L0wl{a!r)Arikl1xhHA!0B~hy?vUKd1WwGkkgH$cnBFCUi`=kX
-@M;I9O50)sBk;9_Mvf_mbOt6QX>XM&y1L=v-B7P{InJ&!qJuehyZE~TGlue^6m0ZSH#sjNB42PHoavr
-zp6O@ZoxFR?<q%4FEzFYU8NoMTAEVztroX`bt2GcP3=8fDD962+5KeFM*i^joq1ZWXDesl}LB{=>qeD
-(a1U7@(YPeXS$gCGR&YC7@Ukqw?doLrAQ{|j88w;x0>@vgiGp`$>DtpGiDR-qv9l^YJnD0D8oi5K14a
-Op)pAzvc215+oAyy5l431NC2PJ@|?sf;RjKkz;OGQ^1PmFq_X%m8KJe!~}-jh)Fvhjp&8o>1pH45qiC
-_hlSa2;*Qfa#3~RVy@1`#5G~D*x|(Su51`NSI!q#`v!;=YBQ5*1#vTWwE|;1_&1Eaz^B57fggqVYGd_
-bR0G_2GuH+u^k$fL1#uY$7>X!Izd%Ewx9=J(YDc$gXhQGTGy1uuQYSHToeAR32%_yW==Bx?7x%SfVub
-q=_=;8v(C;h$%JW_?$#4!pAX1z$DaoxAKkUY&|EbrbNGV&ue2!y9&F2<wwS^7uaQsO8diV5_O0<LO;S
-0!EZjrVRpW&?0&?90l8AO|sxk41eI%TgV?kQa2vBJ$S6`TRO>VbslkA;Gh^b}4S%zllh#HI^Qi4Ep+m
-Z!Cty(X+w;HYYL=%@$0l8nW|YOu9%U8Xo8t!||aA;yO+Tje)7z&V)DyZa^`6#R@5zsPZP;hX-ruXDj6
-gN5^)WjGO1nlS?B4^F!cPS5-aX~JQsc7v_r62tuUH|##g@WeLo{{3gT!yh)3f<4=ivscxmL>(WrN@+J
--GQ|~J)jiiB&vCY9-G);XoM1Gj$gs<=A>lx8=t<T>7^3dZ?)NlzAMa~rgMsBzIV3S<k*OiFTh$K>XxE
-vtY}c$+V1;$asJ7Xmx0CFkEJ~|mO@^j6GOoq+Vk#wr&dyUzRDoNGy~%8g)sGD)FH1bzjSdeV>K7Vxd$
-r*#OAYlO_S=DwRae@%VXAnXvh=^@clJNzch<@exu>pGJ;QmY&LgqAeks=e!Zow%E8A3~Dm9mzSZpXiw
-kp-;wBLpy^ezN#jC0sBWcV3Sn_HuXWs)88qMjf2&<l9W?B3!MOyTvVwbZ-KO4kY7ZxwMQX+zyT*&6rm
->Hc1ipQr7vZunNKva`VLLp{dr@^2<QmugO|BHD8-WK}I)n080;9tgT%8g2G#w4E**I;_f7A9?e+4VEt
-1#*1z3xX0mJJ`JPDvfSmea;8b$9;rBs&?8=FRBnC34jQqxGG|W5!icmMo83|2d#_#*vZFGhUc0%CQcJ
-cvK}GDUwXn80fZvE~tAlZjw7Uk&1H<g?ZD{B`J&{(QZUQ@<#9w*5!X<6*wU1m*#E+d!k9Ce#zkRsVB0
-SvKE>ye4ziHWu;r}~njYO9)y-bn}ZxO^u{E)F~Z=TalpncZR49jF|`RhH10|9s8*0;+~x;+fdX5UFRZ
-8Oil*QZy3|0#$r{an&ci1UP5T5Gp&hW&2P>XxT#ho8>%%P!<jCYLb|x{i`c!%h92YJ)#{X|;P%rC7IS
-9~W~dDfah$)epl~3OWY%*fK}`9#3r&bM_{Q70PxU!}+-}>HPyxO9KQH0000808trnOu-;@j_S|=0IO>
-Q02lxO0B~t=FJE?LZe(wAFK~HqVRCb6Zf7oVdF*|Af7`~f=>Pf@2z`AB+8`~;N!louTUnM9-N=@Yq%`
-S~RsJ9nl3<Yl1AvklMg8n|9{a|Eq->|B=bkXFMFP9CyR);iv$OMf5KQvXY@7ts`7|!dG`r|c=W7qv9t
-1o2bY7$vmsJoBJHf{K`qS>ldjIPncpJ~g!ErBmJ^XH#76}!8n-r6@EYmy-(lWSAisWn_ToiFuC8H=fF
-Onq4&x7G*TwEkkP~}0K&4X!Dlu#i*tKu|+mH|#2453*pTU`R6GC!|w;v#|KqaZHJe3-@nF&O2;*(AxT
-xWX3C({WM;VRZ?830g;@POC!=jgojAq#3|V0{JSqNvq3zRs}^;Rz*5QC=nDIj%Oq8hb%BoC#h%!0T4b
-)1UoBX9N5<g5tyFi--HG?ot=%-@-hM_qZGlP%_?|Y;^SeGVLcelle`GZWIRR~DfFI3tb0ghpdA1*Mbu
-UTS=9E;Wj?XT1E@Nm6&W;}jA+m~ppM#npA0L8gB8y6@i@PMAwsj+D8+G=n>2yP@HRfnuM-*+&wG|v&|
-~fi&c;+vvUpWq#xR64#5-dTng?9R#<&XXMOgtQq%aZFyr4$i@%FeA-|q%T2d|EQ+CJP3_Kt$LhX;S#d
-%62EXl)<C?^YE2w0Hdd!H>rQlsMdebNu(<;8n2w=I_A|dv9JM#&>^yd$@aa6dW7|d#~T_@9n;fg1t98
-`#-+id-GlJ0&2cFI1cvrUhf?P*y96gQUKfAg?g_5$m`w1o$ukn_KUs!z2m<}!K=OFHwg6=fZYz>ZXX`
-+?fkgEeHgs`@$l`z(Jpl1B>;Z2_vY0hw6ptq_subk2wH}x!S3JSXK?iW_WnLKxBVlG;gI^cbMW@>hkM
-_Be;j;&u>W!w9=_Ox-fh3w-{r>M{2f=~{`TJMD0sR3di%Rws&@cz4ymB%;ZNW1(j#bb8~(R*ym#;hak
-F#q=J*hPB5sZk4v$skpZ1P+qhR}R?+6j|>hJ&>K*U0w0|Emz-|R9RL^}2yV5r%FLO7Nmk9Ku`UhZ!11
-GFQoZcZgm?%H4gi*_&wwt{zStyXJI@f*p2y1~vEmN?K165J$#1vn~s1)rxGlVS298NzA`WL4lWlL>rZ
-TSNM-flLt=P-B%887yKT?sz&a@_2ZOaEC<#523V%jK9isGKIPlbhLI|_J~%iBIYFnbUaQzJekMCp#m5
-orDG{z3`pEXaxojn1;CvGlfg9uP=cR;t>|t>!91U>jq<DwYc1iGJ5J&Px(vT>f^rTV?gK2^f^lGu7@M
-2K)$kG@8jS!Nu@^QX)}W8q=?GB^9PO-#3u3WDf$!=vuCOcAcSH=psfrmgj!T6IU}gpIlJOiD_}e+mPS
-#sn`#xdr69>=)mc;tlcoMX}2lfU`=%>6GkG^OHA@mrz{sn9XglNG6V0e>YZRfW2tc=GqX133x;8{Ex;
-h>V_`4_D_;N@qtbX*0qDfAL+@81I8(Om>z_EVVPcznl9bN_Zb8{GxTIKdsF4A#Q^+xFx3v$xo*VwWHH
-1_OXU7(BlVa$sw51)aM90x4B>jZ)yFz{Rr*7$xpRvnuZbhOU#MqA6R`9WZNkHaFMS0{EO4z^yfD0(Ai
-oM6AHZ7>}oyamnQ#NJ5tg2mHheTU3O8zzV|3A=m8$kAqg!f`8qIU$hwRB~AlWa^{2HO<`QHzhCm3R`)
-ruSZbt4b9hAK=GUE$SY%?JVRxL)a4$5s6**?Bsi6BjIBC<Pb`-QD{D<D)moM6<43|j?)(v7%ZS8_aBu
-aqNewhKXp;$bM&&IG%@^%JPhvi^LJ@3LKjN=TabiPI;9%S((DaDqmmnaYgbl|r(J#YV`ttg@FahLXQi
-DnLyayG6?pcLLsi==|R7UrI2Ruoc%WgzZZ;~OBmA#kQMAgAFFi5#UHTJ<Fo703@2bQhK!i6*dIiM_<x
-n&<+GCp0RkR|yeA_PWLeFJXKrAeH$fkqCuZ1nf=3+DE#s=F@Zt8}~f8PCj7mo695%Zi<xFYL$GbcwHA
-DFaVQ*-$hJJ2qgk44)an@V~`3^5);CNq?Vf$M1pu+=At)}8U-;%;&%{40aHy7;M1fU_Bz<yFS8sGBNi
-fcU~-m>P~I5k6I$rBtH3q`3lkS0Z8fcpUcc90Z|TR!=_KJ->wgLk0F@-uuJ<>e_Jbdfcd#U^@XNg5LL
-}=7K{t3dttP{Zzs?W|y)vH_!vvVuMbgWX>N&J6mNs{Cji}=$iLZ*}T&{Zj3KM;U&t!3ww^Y@6DZheLl
-+jpKRaK}+2E?Lc9JPWn9w$UC>d}-|xBLauHB8Rp;gxzYpC%>uas)zk1&EQ|l)u;3s$#yWx!9n(#Dyn|
-9q#7<F8MG_rd6;<&vuI<FN_*o!Qgvb$AN2fUY0v3MzFPvUcw4Mj17$6jV&sm3UJP~a2>4z80$3w$B$V
-UsN+qZ0g4{{6Q`|LR`9Cm;etuRpapAz7LL0bqd*X1@DMoC!}49$3LXZbLAH@gtDT^ObPa2hX!2yO4Lc
-OFuALb89dM5ylKBmc)O;j%BzgpguJTP@?Pc^UpPa!agI{qJ_;(k?7y3JyR`YhW)_z6oJQ=;1<KtI(0k
-lZazsryFoqRl-5UB5pd^W`|M*I5!dpA>GkE*z+_=o7vTKhFhEw9p|q!({;`psXf?Tnf{$dZHNbzUU=V
->~~|hWvfX@)vzC5E`-A7clBwnm2fh@93%EySo{%9Inof>jl-WtscFKt9Wdb6b*^3KovV839SxM@_c;o
-pTxSD@8j=75Hw+Wuaob1Q?pt*OfHfSSnB91ogUME$u$L1`G-R5(QHax$M47aRg$SMJ3>MMBn4~jpO86
-=eRm}P3Xu3!0sOC|$R+C6+9XY6vkAdx(L#Uw^I1w&K&IOn=VfvnUx=Rv(<BqWhDX(Woa``*rUy9@0W$
-6QD1o(s=lT7#6fY-}Jp2Cm_5Lm#7pplxo1qe6yC`D*J)OERM`vRj$!qxN2)6!9vs6NddEFXvg@beYmf
-vJUpdrE>4Kd-h5VS9o4~&4d_GL908}Q!8*Rk7^u~=GTy$r_YGQb~Mj=(1IRe}QrJW+%A`)BhfEDEIj?
-P@0<t0!-Z<T}k~B~ondp|QqTj*z9Y*?9aiIh$Q<4<(h#Nd*qZD9ESVs9xc(ECvDGVKPd@+M&$^MJ~d{
-be0Vz0Zd79b5Ze&L-s{70fB(#spQ`vr418nve)EOJSTCX5~gThV70s$yNjtT;_QN7>SeMfekiol-bV{
-lV_=r0!+exzP_wB`0w`l`OW_KErWqguT7NNyEsPLVq!%f0qhk<;fJ-ve3&|DJ>^%JdJT2xH+fXYuCI!
-LMffqs30#b~y!alr?r;J>&e++nWKxq(|VZ*7CiQFe(Q>bQeW({#4lKTiWpLb3+pPsJ0{rli46tU}^te
-*y3Tfx({^gO@<yvYq-Z~r{ldvnaidz1J>nf{v4t200jqZMCP1wBM0UKa2G{$&6&cqIymQw^TmSfoYa6
-NdugUtC=9fiA`K6$zn2Af5?fm=BS$5NQw;SKTfyUWkgg8J4q21c&Af4rzHo%0^fXFhu;uVl<%!UMDD0
-XLCGsjUy0Sp$d!-keQ6jq-pplK;auAGkE-gzVOiCxW?lRK`QTPDFNirmqkA9rgWM?a>g}5$9P$oM-13
-ZNW%fc{*lQM#FjJx0eRjF_Mi&xl3YwdM??rHQ0AN=oyY08<WoT`LG5PrFG?_oVG!n1*`%O-38XTCQ^{
-xIki*A2QCyyXehU%;T_Qkg6AJ-0Kvu5!9a70}L9f>fp7%_=sP8~^Da<FzutVxcBpNaBNO-4iV9RUjxh
-3W?jqM42F^C~or5LTA8aQ+CKuS0<0kSV+<d+3fnJj|j<G{qhk!t1)MA$1*UBJPJr8?|s&(~22Pxn^Hl
-l4h)$FK`zC@>3cyTF0=tXboNwBj$4N+4h2K7{eKKTO7`Z-<kHpu%>?0;=BwY?3>|_J2HhH+uYSW5FIQ
-B7=>F<9Kp5ii2u1Xuo?mYX^@5*e*j@Ghqe%<z!>C+du7e;O}Y2hb#jyaOkW=O^{GIK#9(M7)U-&@Uj6
-52t|V6bDzXqPU)36I1C1&y}^J_F0h`@@eGa%u@>+lWJ7`rDJI0-CKiMoh^Pp)<G_B9`?PxHbevY9LG?
-B2uJx=JPeH&Mg)r}U_z#VaMbx2A$E7~Ck9jB$j*?J!mRJwh1{X=jV!$z+6LE)uKVdkhVUrG!IAPfDU~
-6l{3t>J7NjZ$6Ae<m$F(_E}yYw*lk0^K+1<&EIk7^(~+|zA=I5FeoVZ9z5<azGn3Eq2<LKv1aPN5*?5
-i>`1h8&dh$yq+eX>0$-^JlGh?KYnYbK?yVc>8hrxczOLxiQTgG!a}>0kAF<S%P?)mugx%dZw|B2%uq|
-U(;!5HX0et7*mOZfmUfuqT5`J$}?=S6tK*i&{hq0<l#PKjw?V;;pN&I3*Q8POCYWnm%}t2z*!(EP=<k
-ZXuZJ09KBdWu}^dkH6Z<sr(b^c^`HLyO>0fax%`H{Jq}viFLqw;zKYL=FukocbsE4Tq8pE??AqY0L}{
-CAgDen!v(Z`85+gR&>b=j?EF2OxhloYdM^y|rg(2Q7885X~sUy)-Kk<d?n<hCFR|NH=gv3>`X<U8sNM
-69v0@WU>Tq*Y`y3s^_g!>b$UsT0x1~-YJ8;^rW<Ggw#G-`OQSLVT0l1ynU5>Qm}oVS|^Hjm_d9+#wl0
-BS2!7`&D!Kypi~!5}1MW)w`JK8P~;aBCd|mhxf?wGI)fx9MwO5FFO%K~car{A+HuP!W}<Si#{gSOwp1
-QA_oAQx@oqy<5vm9w6{<BMhqneqkP#p#+Y~E&+U=R<1$=Awld7f2C>Vt0Ij+T4HKS!y&HEX<`d#8aEk
-T4vk?#aFXWY;t8cPx(G_o=lY@u(T#kNwi!#85ZHRB7^wI%DS~bgU+3wl3{d0%0CI8x_C*%M$|r(4AHz
-ws1YVcp_0#N3+{<|TEBFNrDx4-g#tM8P#K2#`4gIwc+cD(Tf!H-PfyK0k+2|>Om+(fW)yu)zoK()JEw
--n>8}PXnzL;VoK1B9#mK0L$tQRCIlpP?$eC$9NlCJ4KFsMyWH*k|<BZEaSYzZ|KsDWcriwD>W{NgFU4
-b}RK46--&;<1Ja94>6Z@KE#3qil5=fWzziK$g8-)Ys+k+!bELDezNUj0mYgi?~WnSZ4F0>DI$C2vHaV
-p)Yti0wFcT-fTV`p((`}{&r9q`p#+@KcV6<k=t`dz4#&MrDOC6?~@jEi4O_*QdgS9#noOmomCoD5j{+
-bBY6OBJ^$ia%ULwLcqK9vS7MsNi2j5!948(Ci`|WHq!6-oyd$DTWr1-4roo9rUO7#MXi&jYhyRd;Ef2
-(bT;j@pDG;`0p|2bCt*yftxlI%Xe7U`c^4ZCz(ZFd`n^N~<wh}4GCk7BWM0DKgljVAd&}nE+{3ykFr<
-tu2qTpA^acHebc@N|ns27r~OI2;DLrWZWAw-KF^jGf;)n$?2WPF{*=MM9_o^St2kH<pFw|pE~jRAie=
-lvv>`>DKEU@1mpi_HbcAG+2?A+v+0&o?msu!WoUMN+gn)-^SXtF7A6$JwV*<Z^f$381i>c05l7bKVSY
-?^->Q2eBlsl#X3oU#FLPG`k;Ql~!aEMIF}MZ(T9JKJ&i51}B^BTLi_@zd?-l6~#h|#2d>l(ILs%iI+C
-h424xVuA(T$go-nnWNOaP$}FE{qi=zK<<rs<rPIkI8KH6Bc;47!=e8vD3`6(%J)ZZ*>6N;Mw+r5(K}a
-PBAf>qRoW~Mpvd{asv{xNLho5a{quxOMe0~S#!LGjb?*NohiaJ_xE3Sq{IyxM(lJbnv!kKg!qeVfS1+
-xq<SaBD)B18)Vo&=jDCDd60og*CDNP6&3aY8vvrYkZUs6u-V^gbn1$gu#?wY3|h`rz%GRAk2F0|UgK%
-RvD|eOn1H3+_v8+tRBCYINm>L{^X~(Ymw4J;{s3HA>Xet1Zvy&QZc9NZ0Xrrfno$97*d=<E+Iys~ojC
-!o;i<Tc}b9vC%LSC?Jb08r2io)t=qgO0qoB-<S_v473bz!?`3qGOK(iv7tod>69~T90a8R0?kXD;;jf
-^Y#$DK9cwaZ7l(pGG<Yk4XL(t#R#43EKAjgeOu1wm?<sx9?HWsgy~?$W0j#8GS#XC^g=y6@%xB{fVgw
-Fc1ujQeRfTL_V#RwlHm-T`R<CvzHVYi%B@muMol5tRUmH=f89XdeboDo?6g%b}GG1{VoS(y<W@~w@an
-dlS{b;)3j;xwZ=~ztf?BiXE*F2(bS|5e1ev+Qn<z&CSgfBx?Z~as^2;CQhs5NJH)2It&tW80n!$yLf^
-dnl&a7-SFm0ECVvg{T{jll$-q^Mw>Br#hSvr&~a3Zt4MQn9Jtb=lsEw6o#P?KsIo0lIV7(S?ADsR&;E
-eZYdE5ROCk<)nXlr!19>ib`-Z>h+$9FDS>r2Gj*CCAEbD=seWL?!*bJE-Oi?V#^ScOy#2#&O=eq0UWm
-GNen_12)*qmZLPs@KaYc^`V){3E<XjpD4w?rLFz$}{4z^{Pl)@niNW2>0SR!<03Pe-cE^kt)Zm%{)es
-<+BpX|lDXzVYHGz*=ugixIO9<_M^UXI;`WsK4_RWTHt)NLz2&8+SZQ+9I_@q!gB6pt)Zo-Ab1P~IIos
-NMh0@Xs&6lB|Jxi9%S5Ngw#HX*6q^uEWavR{chr2eN;o)T$>hm}QTWCODa9NAiAUfc1?&w)8YHX}v!;
-=TA2{HMR6zCP`@Pn{{kD{iR6Ror)S^ju=YeUGE3R{&SNs*N5?92dsbiD&d!=2bk_Vpd=c{~n|20>#ZY
-gQtDt3H1n$3LC~VTomvKKw7+%`8<dNz~+a1XK{u26$)iMS&FZ5iTmOfj*Prp;xT<UcSQUCRzQkSE$P=
-fi4x|<0?P^(5ihQu(XozGsE3{dxF14k3)yOOs?_!HzmMAfzQ~OXd~WHl4$f&GmH6=J;0;vSG-s4xEg>
-5(dR_xFV_kex0oYt;6J+10m%qL97NIfXEfIb36`_&ieF6Tp3ZQVv$n)P=;71lvceF-jA6??VojMrN7Y
-$8(JK40MqJGs2*S;lPr3K<>;%CQc#8tX_0i1}hr#`I0yAj)_;-ApifM5WucrNLNjm{-V(D-oEMIn};i
-D~SQCV~@$a0)H1FPI1{69I4cU`UW7D`H8Z96XTb;y3ZUl*^oMiTTivCo(oPqPs+?wHVG9kUReI4Kwsj
-D=PpIN9cE=44(uYb%bx8pwTR#l2N-Iot$<&BlOdb2J5MUA7jeZ_fsEmUSxhC{<cl=rlEC-K{dTihZg~
-}hi2?yCtB}#!TE{%UJY5N1-Ve+EYj4Z2D*R>7Wb{DjBM<*?vH=?tcwhPNak#ih3taA?cvdazOFhGaxe
-9s`o#8=HgDEJ8qtX$D$yUc>DI~SJMygPM;F3Z_x3J-s1K^v0`e+o;iTI?brI;F8v((hh?C$N1wP~m*G
-5M)_~6vOs&Y|w6$RI;?ZO5!ucHQX?Ra-**_*3VdFP^@p&3_r7193C!IR6$wZr0PXHe<d#E`o$T}8&kH
-uiuflzMROYhb}df6OSFmh&~NTkilHFb!`P@hy053NPegBkuK#Nk<#-Ro6+n0GX3H+InrF#aHNV(Ka`N
-7CmdpDnjBW8tdaRl~m2x<bvHaMPGH_UP=q`S+L%)7X**DxaakXIFZ;Y!G7HDI30vp4cLHt#9DIOAXU8
-+@(r7YJxY6`Y)GwkoGTMisV8jZLbuWL^uuf_n<FJJ+C>{qaaMU;_#|fJz<P=T&DP60AL!xqm!SuDSpP
-jA+o)T99AYV86d`GNBRmF>M=;(U1W7iVpfH$(Mi&+^b)yt7rN*UVHwH(%P<?+MyzeZ!xVPy~utIZ5h}
-*i-V1ypk=T#k*CJ>liLvN~XXB$@s*E-AdvC=upN+Ine_<wIr*vj+l*QChF7fQk~k6~3(c>02m7j{NkY
-_3@MWD|{BO$b=(Dw&sc^)W2V%eW+4O&f(#(2})U%eG-jz1+q^TMeVvc72l<;%mOAXw-L8Z6r;idQAbk
-7oIy%1)Nt}BW&0u0s+6XsDU+sLG7e~AAF1RFH4#|z)!2yI+WTxMg_Teqiz^Z7VJ4I^fOdF6jsAedmn;
-48_zr12o*o#LTAfF+sCve;4Ep4Fee+MA0IicF15$z#|vAviAW*UK=3DHcB65u#qWgO1ug#07;b18mxi
-B1xDER;sjn<l2nK8_qPq;Eulg-aHTS`6NZHPmd~4IIEjQWOCjPLjyK*9a&kl>eb?S#dYX}WoXa$6K>!
-U!OA<y*ZACC}B3>FQ0hM!sh-cgFj5}q`DZ=t&o@nyd-W~Go!<LUW~A|aj4(dfXu5e@?KXkoL5ah_kXs
-We;fux^EHUeSAjgH%XFiP#F(5XJCtXRhr()*Rs=r}<RM9gon~7ydlDy1{P^2D^tOo^g;EIdH^X09_}e
-IAMf97k0ugW^3nm9GBHyN88CAv4K?y-K;JHcn`z8BcMCC*ws7e)C7YT4H*|Zx7gFp9r;`#{-BXey9_~
-xDIgVxX;3$F@^QqjQb1*>yOOP`7Bm=WAKGC_x71dHlKR9|Cciej5^Jgl`Kar*AB2-!nA42s%Hg8pc8d
-nC0BHoMZjqG*$gJfQ!$)Noywau3vnCFM7ECG$wgD(co>Jaof>s!e>MhW#?uE33ivltUifQq2UwdLsG}
-o$Ml1f5jv3@{aBOxQuBby7%B3wtU#P@T`Gd<K-u8tMjdeGl^8a&<Tw>qfGr2Cz9zSnt5cRCy9rOq<Y@
-n~dvT$!U-p<Sy<tIctImW-WHGIpmxUd8hqmJ3_^+b?$a=|a`pP0w(!zGI%Z{X%z9Tz_@kqwtSteuJ~>
-x6k46+q^o2!-C*lKH_AJx6_O~uoC6c>Y^}26u61i3rz$>m{^H`B+{DHS6sA)^oA)XV4s3$t5)f(kdro
-4T1cebfO@bQK*6<p)OEZ*@nDDC-ELlZd7uVRJ?En~>GF6(@SoiQ<`o*fw*^aS*XKm~kl<gk+_+xl=7p
-`tl%h6lF<D;V0MOJgk;a`@9R5PHulB>TjraFg9dqR7O@rzQ>Tz(-XjBs58Jc!O9AkfBQ2|sQqg*`Ej<
-_XDxdMsM<egBlQ-}D+jqmgw>_Qy`%?vL`(SyDhj#*L*LKo7!2vHr$LVv?Tbg9}XDX?^4F$)zljSSGz>
-m*~KD7Ddza3MH`u>lP^){^imHtn4m0BlA^m+k@*7qDY@Oz{eoTM#2$N|D9b#E#NQim~H>--&$=F@XD=
-EU{$2TWA<WSp96aGzQQ$XGT{ylQHWtQxi54IBwA~v8OrK9R3=Y`K&<C8qy+31Zxo1<CS2^s@9#j!`Xn
-0<kD+Y<(xpFMK>w-GWeUl41jwiMWr;?xES$Id4#?@{w1(SRZ6m56#?;rSex1krXcKR{X%A)<}C80yFb
-yh6(q6GEJZoHI+<bDWCre?HU%_?&*AHeoL$EaYe69f)T96gHUJP=i2p>vGEqPvXPvwkv(<%4M+`6;UX
-ChgY=O*aQi!e9l%2JR%e2p1T_^u3`uNYGW&ddH`eRGGPM9!H<-+-1u0lL{HY~pF(MU!skZTX95h^S9Q
-E6c)SDuVn`LA9^Cg_!x)G(h+XBFGUW8?#S?T8&hL|g<qrpO~~j0?lBttm$7001qOs|EJ4=p>%f1)W@g
--c!g*OG~%^5!j1@FTeb9rL`scjwEByQ}Us5=&4M8Sx8dJFEgo-Q9({W8)5OO&q13wA9}R?%Ls+X%(1i
-if<@8_31T{=BUyA~5G(>RhGhpQv!q5USYn{xFQpfOU3s|^p2&+E(r+mSR-StFh+;Etx7oE(G}Uwhb7;
-!xs6$xe@@n)xC`aR~_vgX*sx*WXdc|+>#i+a*pTEBvkIMI>t8(1-l7(|U%rq1Qi>}L2rTBPD(%S-&#3
-5pVP*KmI;~_>a_UbCN_=`nI*Q)52wRonE$XnBMi*A_cIa><%WU<q`>+@c-^f84tGQ80!Vp|?*%Hyr(D
-15C0uyFsjJ6$)y!(yLmQ$rp9UCnCPCh2sA>qvPK!V^Nlm*r$|tOWaxQ2QjKS()_)$d+oXIW6EJ)Mz4I
-+y>y7o;A%uPSSy}@vv#n<^j-*F3SOt;!Rl{&GVkE6IO!wF+a4M!9K|AD5pbGII345c}r9}!JE`Z;Rdw
-~s)z6s12P45Ugv&rz5(tv4HxI#=%=EE>$)APp|r6(>bE5InIVbEF^#Nn5G&X$V!0+GAhTS<2CWE7KXO
-azCD@xy@n9RO8irYP%}pI^o1|GVX&RK-XoW;?$#j-@C6n>imTTif`!C+_-~?bI3W_+3DtSvD;LzzPJ#
-}RCtR}AKuDtrfejx6c;<?b3#adg2o=xQBSdU~z@!V(_j~Ox6w5$}hp%rrQTnZNvvU^(1wj-)NC(~$(r
-mI_8?D5w=L5&BBdMpF5m2%pt8)RAJ$?Kh(PuaL3wRtBmD}a33HaZiREFYjbujE^0GTmyo&8}fu63gzL
-;Nv-@)<kVr!MaFB0M&D1nkg9--gn%(mI)~|XOG#vT$Mc)GDgoH+$#E4qdUSnoFwP^>VksC@vPL?Ym!3
-_4Go^<R#*$dj>4+e7?J=OiR>mi0e}=?Kc{f5v}bkgemNdpy${AE{!8B-1=@okL8T<-uerDsk~aZk#lH
-@&)g|wGy!W7cK+NJWtY+jy9~&;v<}7=JUow>!E?UwjQpmE;*v(VNFzs1El<_o01E9#brTD^67M@A*j!
-4XNM<wzg2YentV6kqE&VjI}7wSC;V)3A;k{TKRvWJI{Rve7yn*0O+tFAcf3|>WE#=@I$;c8TPKQ`6^h
-WK86EwG}zc|~X~&r(wV7iyrJDP^$=x=q^WC!|kaLIZLy5x-U?@9@O&<x?Jh*yd>z+_qr^?M)EjqzB-a
-9eCVEM2N>&f1Mt(^C3MYP#c}oyQPC42zMYw@-NvhXfer?t%fybe&h@spTRKYD3lkY=)M@d>^JuM&ehn
-Otjck_Ev1D9Hp9G%{kkK{WI=)ZFlh~01<3R{moX;!p(-{#atzP+WuAG)j*sb{v~;G}aPU{6%_haQ6@F
-Cz_vqjatgj-4lm4%<bO>AmT}^{*=2npSX3%=t$BPRjZ1{l)#h<h=@b^aR&bx|h_L1}uE#1#mbSK-)&E
-v&UEACjvStLdd&G{Y_aH1cJ?l{qX7wIBI4RrOCCQl6lzK#a$r)2-YoZ2U%+t(d^k^zYKI3T0Dsr$-h>
-*Rk2Cn(ie$2=PeTwCT|ByX?8t2sNAOq3S~JKj7seoYD=t*s+|vjYPZwwwxGMN92$Zl1m@e^RHA=Nwh{
-E_ERbA1=eMZ=nVtE`NT#FU9ClKCI#k!y9*m(^6uD{Vnp8<qNf}+G@dq<3LZa<<<P2O;m<2F;@`<b?+>
-eDWN0107LszrX3bnMy!HlLobxc5%(hU5OFcTp`EuU8CvqR-evkp?U10yES*D184z7{>Sulb70pte!J?
-0?GtjWI<U_R&o4|OFuusweeR&+TV2oy@222tYPf>w9t3;_1`G%M*5vd88@+c|OBGLB@!t6xNYTYn`T6
-UCn^{%-E#{A4u62L6GzSGb=lb`8)TUWAjO)j~JO`n@9z^_(eQ078$aUn{1)sA{;G;%-(6V0y6+>_Sc@
-$PE_QQ}~D0w|R04tBX`tw`2^U(Z{CalcDv+(-z#`U=oFQ7_tsYO-{L`xL;}NbqkYs{1UuBb(7xPSO>k
-9m<c5ZejzPRESxv4$3Ci)hnuH(W(2cHgBdL9Ne?N|Hec25BmY#dtav`JYo{#jwpPOX*U$J;+|D9p4C%
-&_=EhcN`4B8MRY!JxYD_Fqj&hS1us9|DDm>M*t=WxSFi#1{fEi;MLwE~cx7f3c~<*Ceb4Qj#Y0>QU}n
-M%6E9hvCOo~mf92M*CwBWLFKgg_PwMPX)=*rRwU7Y7(qW>-{%p$X<Z^aqa5f=wN*9b(Z7;4P3?eRfYc
-HcjXI-H8>xH8Bl{*5?m?nFEA>w&D){0H)2~!Xf{s|PC5e-muNYx&yhfotvfgnq~_=V-F&n@Zsc|sDZ8
-HII1`HndXE9OH)5w1#yl)+U8`}<U#M_FbAY*ppkC|d7E_+MB3ga0`y4LBT^$$$g0%IY%jSJ-~g?#SGq
-*q}%$T5lUefDS}Lf{-$|g*Ct(vUXF?TAgNF)87JyA%_H2;j72i*{vXu1m)w4q}B0s5)&6$T2j^ZRa89
-+gsn8)*a-Ules^P|`xHLGgN=>;3#YfH8lAz_X`2u9q|lbci>X#N+iba^LgT5juAMauI@k<0He9-Zher
-Pz=b!5KUo`0e8U;i9de}NTQ49g=tmZ1M3->S=*6s%2d84cd?|K%GTFLm@;1^a;LwOx545DMlo+t>M3t
-LiLHI~JVBlLL6_LO^B2Q%69$*MYBkGg#~6oBYyBOu{ex55p%%^b;WUz>Wu$+X=@+vjO@iJ2gP!*SrK2
-FCd^jW4pi1STe(z>vPjB7adnt7OR3iq26!J%T=KZVyonMh<4V$iN7Nxm$PI?!C-KUMu9wBBzT;yd$%<
-YHH0)y>dAn$E3{Qi$Thm^1ndEY(;`w>Y=enmuwXkf#OsIIQ?9Ni!(yV@pBO}Zo^ATHC@7+eay1+E^C`
-b)Lk8u#bX^=U)^q)cXxPj2NL$5Z5OBkrPTxHSqejJ<f?-%9j1OwD?EJ;qK+c2LCogs(goog^qAl5`!_
-xlEv<*;!?GJZEH?wXwHAV3*bajBBU;ulimN8u3^(e`iV>WkT7!h<>*6(2qUag*>2ZINwa8+*-vQ4Aaq
-XFp<)92ObSdFNp{*g#=BAI$wSy&=Y!!KUuy!prIxoSb5!cnqhwBE!J9D-2WEq2Oy~~hXP9Ba<H~FiG2
-x?JH$Yj%r(#Z21rmh2hZkW?goQ2QUK|vMQuKDh2XCF>+9p1-(_$>ge=3T0oa0EHq<X=Yyj)c7o?vy*X
-+}54Q<LucSN265ijnaM`z9Os9{$T`MDt4udwSpwu=&7b?=k5jJkGGdqHQjvjWRwrf9w%Jw<;BI5r%%S
-|SrHfWC!#7QseNFB=`7tzg?`g8M`%1pz?0@3_k5ONEOC)B+7S~0+gOzw`;7p}LqR*lJ(p_32Ha_Tpgw
-yht3DQ$WG?8?O6(hAGxbPAVwXlx_QBvhi-R~ii^B8lEEq<kXk&f76ZO~ETRsp1rQuCF0x|5%^`(0@fN
-wkMgOhgcQP4iCJvsrT!1fN^f<Gs1%FIg%g`tCZcMNE%DH_{-eCIbeuxP^Gm+MPMrQbt)bH0b=m68sx#
-tBB=uJU0%Hgphh90G<1GEh?tarc_Zqf~KiwPZ{|A49SZB(<oP&T$1-VWUd1cJZ{R6x$64ZX`K#=n?&J
-1EHHCJgI<blIw;A(j9;i7{AhN+t*8@Zyg1`U$c*H3f$Ug+h{gtNp5&1TzHpJx59*<i;h5UCHpKy<dr2
-vn~enKke7)S^@Ay1{p8@YMl*|&28B*$AYeo~f`>Zgt>HCQ!l^fUuV<9l@HK3jXdY4|7Z^;VutHfv6~6
-r)2k1}+)Kkcaphkca_GPMMdLGQ6VPww46f&5~5cVp-5~h`*jfS%El$>NeFZk~882#NSt*`)v^T@h|J|
-DT><W;h1rSz4SU?OvFAu^&QAEp!tH9jk)C!Lx517V#dz%>$1@F90n2@RMCT66S*;D}=2?>SNM4K{uEt
-nt<JJ2rX6W>D>e3Vo48B+pb^!a~nXO|*0S?0Ead^E=_CRL(9g_%zC!Zpr>ADU}amglDA3xlWTC$LUGV
-MBU9W64$$eH!<E3pcE5IIiEFfG-Z;D)3FDrW6dDSJ}$@gXVBC$QhTtKaCrg`(930u&uMHnhC1DDQ1%K
-CKS+XWMFD#y3K|q??3PoZnP2L2kRrYPgAo6x5Ted?ebJ-YW@1{$TLWZ^eN9dwr|iU{L7kpd$}k)OUjG
-<qL2CVY+6s*BV(6cpL$P?g)Q_c5fu~Cug;WW=E#pGZE&F=|9Vgt@<NhX><UQEl?!3iM8D#@O=|@PXFO
-##`g>WZBS6mr`8WBqO05UHyN_0UOwqDcyMGIztPgSItCrb+U`8HmOnQDa(N0CUo7@F%}HrJu-WcH(g_
-BpG&GcwF;=rAoh?sYa&y(hoT(isB}0jSP5i0*TGj1RG@Rx3HZQAT^q5QzT{-5%()QsmSy+BCZ|lx=0R
-@z@0a$T)EV-L+rlT}%NB?X`h>K{??QNp6m%xV_;w7eXP63~MwarKz+hb&`YybW=__?vbY$;rzN7^$C~
-xm|5b7bchYf5M?y@cswpK(O7$w40DcChCaDPI-z3`r%A>_%y5vDaDB!_TFoVkftdtJti2{vRAKD_l?V
-|Arpf$(nAm!%vy_phFXN2QZYp!VDxjbYi^e`wWi*beO{y9SgCQtGCp{Hx9v)CKwQcI7ne#w&@TNe0MP
-W^kc&!jdAR`UOEOc|3!f~hX_`Uqo9~hj6AWoUw<Ou=aJgsY6+^$=hE$T=q9Jeu*$;_}z^;J*LCCaws+
-~8qIH|^K<V8clLK9CIW@mA3Hy|wHFbpORfAQ98;0J`H+1cuUxqt``J9u|37cG1Bc_AE50{T%eVm{?_U
-t<@-XDVa(dl_xxFo==EI`Gq)SW4^!y69+2WQM{%tW$G)DG;YLE1)ui5qSX%K#W?*n38)?>!y2P_z|jf
-iV9I%kcBTT?Cz~6mxO0V1qp!>)_3VR=nQI5YB!*WZ^?z&K(NsQADQBTOqcO56ly?*p`l`1M9V18pGnv
-xd1OySYVcEo@945O@>m5Z}#ZE@+!r!55UzeU2aHK<T{YhLPN)`TkzHxN9t;h7M+wYw4Z*TaalhA?<QU
-D0mbbhp-^G0bH4Vg%+&cf;}3jA0kIHkAKRz3Q+vvAl9$_knFsY9^^6$_iqc&?SN&KkyN5<RBIyi7_Y;
-Tya&ypcHox&J`!Kr{_42C=xkL<$4i7a;NKzg^lP2->(X+mX7Oyh%jH-86&43`3X#V#XCFY!h|SwLtfE
-fA7ui;N{+{S1_utMN@mPg6%hd4|Wb-?gl&GZ@>9&_b3W>|F-)k_`g3M9mDh2uXo=Z9|Z@8!HfOvH$M;
-%DDq<W_@`Ycb^QHq@MibtV|ostUdl1xi=FNL{owc@c=h9(onY_H(H=DN)8Y2px4Vat(VN%U(u>{T^#T
-0c+kN>3d<Y6M*Z~Q}Ti%tu(NRP*jR%N=0q0T1DM9lP1%N`7>0kZR$EtZl1J<<3dN)t+&gtJap>^NRso
-5zyrZ?=I4cq1ldnVNBI-%c6Vd6IrM(K#OUa&ohsF(Sy5L*uBHgkfi(uYixjV?D>OnJB4k4#NMD-f6}E
-Sn)2!-Sn0pK!W}qw;bhrWV>fwzfP3v-tkcKP>#f2@72fo2z5Y2jCe#d`j{No++uu4@VXBiYxeOv}@#^
-i)Bf^79<;x0vLFXAbQ#Z%Os;@U_#PoS)R9ks3QFqTF*?*^qeJoYZ}ecB4UM*RNAb^91MV!EyQ=N8o6p
-gy-rVp;1wlSf_8B7_M#M^xQ-aJf+W_gVPWn{dq$p5sWYi1`rJM%iR>uRQZPm<PUgdf3Y$b=)M@DD?yK
-z|_m2lZeZP0SI{@~3c!cN;-evEqcLkRLQQ|Bw6XtuB$o$I31A6~gRFbDdR<S5f26DkmK12R=nZkOWLc
-N_!=u1dhyDcZ@!n|BLfcA=Xl$4gb>P7+K>dWro9yHb@zY+Q!1*9$F++C~$v0yYf7u%O!@!1fYdY4^Xr
-osEGF^2II;f>%G-83cV_y^wOA1JceBUk4&CU3k7JzQk>D1lyjk)`M9FwSg#T+4gffPR?V%DIsHj05#w
-nAv^v6P+=weu_#nM8Q6V<sO$m;;|yMlO&o=V!mr$GMpiLR*Gw4kXFVsl8xbDBP^@N0w~%l<udeAv2u(
-^O>6>?XqnoCW0~l)Rp;L!uH^D?l4^<<X4S0a;87$jjcXTBs&86lwf_kiVPrgQ3JPcsb|46ZA@2~CY+<
-TTE832g{j!XKi({HgV!8gb+^jj1DT6w8iSsxes{)o4s7iA#chy;TmE||Ep%P7#aL*PNx*W(du(Hb88I
-d@0>0<sw?0~Z=3N&`>fXu^$46UuE>79|l+4~-czAf`#N<274uF|RIaIOeTMQ8&c-Y2~^7jYuHE($9qA
-C+M0txV!MtKxSjQ>{Sbqtu8E=!cid@Jb%`$H{rs6`9!$M{02cnoN)J2F6W2%C>kH8L;Zz4^!%iZ^l`6
-@>VW!KbeflXvSLr#-Y>biIK`tz=B4b)d`+7b(VTdhhY*19uk>|;?Xtbeq*VP;y~K1!j?ZNFKoX+?hal
-nOE>mfZ{XN{Wjl4^4$1jY(Yg(7Eiicq-CL09!f-a3jbU@SPJ)n32!LRH*y9C5p|087!T2}m1P_L=H^Y
-&|)JK;taeHYRSIFBUVNBEp6kq2lT2GDOkQ1Y{CY5r)4vBQ@z+RG``?#3fQrT*5(62d4p!9zxed3ONXL
-r{Nq#FoMF!2MNZSDPG%HkRc(j=?I)vfLa(M7Dtq%|0{n<k~yFy=*ik&?|90TdGJCq-&TImiqpC^U_D=
-dl@3s0R3kt_B?+s2}uBBkX6~(1aE|0qaqJed9~qd6Z{K>xY&X{_Bs2?`h=qBI9Z|gr^$eZ@M$;t0Vb+
-^+V8KUk|?ia{Y&3<EyV<x0c#hf7RbukFZh{eEro|Prru08(;tV%coy``PJ8Yo7}Y%)FT<}+~Q@DKn4Z
-%CLx#~!xR6M8+iPDC^VPJaEhx7d(|`7l=<G-h~2%}jIoHNZ6@yWb+fcI<o0ewHaZaSNA7mwv<VP2`zV
-E5PD7kW%SD2v1lyfVdxb?5Y}CA@!!wuOLV$6X@dXs1c$4>#yp5G^r)_w#qeL|$@W`&rGw{=9xZdA*+U
-xZ?L5RsN0Aay;C&Eo3OE&v-RlDirZnW77p{6Csu657$C9hhk?OGgMUj|-h8&xf}L}<94RoY3T7q!$}x
-XJSvu6)~L@J3@U1=;cW08fWn$TKO46F_f|$9zp)*2UXJ^i?FZ_Y65SpA}Th3bTYGOwVSO9=X_Slxo}x
-Frn%0&B5{RCX=yB2^BoTHTbBuUAY^k2paOO0!Coak4HK6BtYpYsbk_yir6t~ZPKCK_ae@gK<TjbyfNK
-GBG@Y<A)%0Cu!>*^=@e~B$1z3-N0Sd@n-)PY6s*7JGio02p5sJ0f|Rz`j?d1D<T|B58>pv@KWKwV!I@
-iFr-d9l<JJvk?$CfL+BJhmva!&BHKK#NXY$+g6*3a(W1-yEYHeD_#73>3IwscY+sDa|06@piT85s)-T
-@oO^|^emtUxEp4eet7;IP7-y_aO866q*xJ#smN!G%sXU6r`AxUKV&XxTabS^P;Bam0VrtlN-X_9H4<9
-Owlcd9Ikxo#EG4V{)Odd;Gm-?>@?Na1G3as9)U5PDf{A`$9v#OA57xdz?_Krk08$J|nL{QarKkSC14@
-JGZI>cles5e~LGbwylvkGgi3?Ym}Dw(jTn`rb$7xXJ<g|iV;bt)2VfYkSHPuKrD_~&nOp%Aey}>5GNP
-nb*{Ul>JP^T17y`+!82SH1JWRSLg0uAH2Yn%G*Vr%d*irOiShIXl0(0>P+_)E-|7bPWG0}f65jAJb}m
-|~8nt}wx{IgYp7G1u^Q9ZDDfEhs_R)D}xFRgsTy>=RX;P3t&Tju~kcJ+HbG_GEM>KILWY2yH^{sh#e4
-cSc51cimX6Z;vThw~@sd9W3GmBd{o<z^HutZbH2nF}fow@IvQ_>Lmf*;5qn17nj4Hy^<9^7D15n~3r0
-j9a#viEVJ3_eTL07vLfK(WIUcs$N;IwlA-17r{?3yK+#pTh&6X~S7rkBs%U%tV+*41XCJbs7(^;tR$D
-x)bl)4#iT)P;mDcj5OyV>)rE=lp*Q)oGo|+Xu5vIonIzTyTp`_r6Ct7s76l0b7AvJokgIj5!h9TUX=f
-^NLT_eajVJV0KJlLQj8J?L@~+}_I;2+2St}K+A_6m?Ecb8sg@+Hv?kWoi5Q71iM`%+IOht6IZe-P6Nm
-CrnNG|yX+enY_VHyBk2tniJVp%$)|R)_T4?-?R@U^npQ*KFT)mn(HGMv}O*MT!yJ0nbR<y3B&qt_>md
-IbOc;){7oo-i5pqw1UB3jBJLm`w|azX#en)%J5QGcY8>{IdcAkfJsWd&d=;}KucX88>bCgLD#Oqd^uV
-0<QU+TRdgp7#A0HchuGm?Ouqd*t(Lcy4FQ@oHs7%0)_nX1!|(iEl}edq<&lue}|!+_==D^)hXp*2Yre
-_7qRCN#pLB{rkBuj~-S{c*zlWLoj%{xO;~GnpGB}{qZN`-SZG#h(CQcb}%U_&4q6&?3us`h$(?{0y{1
-sUTi(e?)DxNqTsGFGsN>P>s~S)h|vxf;Qg3U7~mZjj$ss|WeJfPnX=TG<G*wFZ8=UMG(N$*N6Gq!vey
-0gbfF)_*dS6@A}(O$8{?8+><a91pp}d!yz{t%Hc<cs34l*GEV_`f8lmGA7SRq26q-Jts*N(8OkgHqBF
-FP@InoNsG&Lx@_16D&w-~4_7^ET+sCmoaE!DFK+ov^0i|37XRO$<?Z?(vaLV7hLq>@VT9uC+kT8(>#>
-fOCIjeDfRtgBy__V)hzSk{M{JVoFJV@)IV0|}xrZC6GrP^-Ye44M|AH>}jyJG6%hF^vX@conl^v+f3B
-BNmW}qkyAb!jKPfNH+KW_?@`zQsQ~b+CS@vI!$q<iTLG+s4U>f3Et-LdKn308vnO&bXZ-ll#PVkUIA@
-3BX2w<i$et6fCHE^kYSsQKziozu`LASI~MC*f%L?5X~Lcuf-RbWjN>u6U?oM-xvL#@13v9;`Hr_vDL&
-Au!z@8EMj<>yZtz4}Rmo&Z8g^JaOy>?T5nfMA_y!;voxfHgE9u*z>axghtXT8M#z|M{=d)ZK8R0NoQ7
-Rp(sL#&!vbwu7A!48zihUpg9xr0}y_(!&nb@3Xi^*+(HY<C0*@shJ>Lj#=s>`H3#9R3a&7NJu6SfN1@
-9kN)>e-ea_(9&Fv!@xCkM(ukXdvx1OE*7Ao1@uef{Qm1+O5zXYGdu@k?Rs<cx1Cbe|O07PyUdONBPhQ
-fFrbtOD9C$$Ts4P*AXl9+{t#wUV~~|G}(Y}R4{mb&Fe@H0DYX$p(V+bM%P9$&l)!WOjp2lEQ_PdJ4NZ
-c@x<)HdSn8=7@3I4J&<p_*mRZ4o^(-E>cq&v0!RO<d45FdQVzOb1E$^yBlLd;f1MUN`tj&hNj-j(@5I
-B)rY4qZ!~@G2Ox|^G$!IKWEz}7faD--QV`LM7;mBIJ+@<C`Y5DrLBEHLI59JnZ3?J*2>?*p$nrRdYgi
-T6qr(8{s@0d@BHY}CC3O!>QO!=aSCdO*hOL!5B@q2<ONJz)#3)XFt8#%n?Vs-%^du-&HLTR03%J9QjE
-4tg<PGpgZ3rcW5ZLhaTB(r&>g&~tuMCRqbccx69`yw`Aq7E7Ad7WpQUBV-*Qy-gThZZSqG<f{@N}3}y
-rZ5sq8wHK#R-2Zb)!?}yG=4-|wm*;edg*`aijZiujY)F~0F9?ei{k!QtsO6-KVeu3mQ!DEmcDJ$stJ4
-Kv8-&~F@@^F$i1zPM9R1=$4Wb5)7!23)xBj{P*e3GWruoHa^JJga`l81YNNad0qFy=+ld7pfD$?9&Ff
-s_uvwZ-)iqgTyf62&bZQpXZvNCJ^dsT;$$(`^9kx^S)e6-WQIZjVJh~M=%jryh?!Q~%N9|a(4GU=p6*
-`uFR_tP4P=4WQ!z(<=&u81u@Kg62^>d;7u8q&JF7CM|evkF=Io85|%Q|RY1K#7r;<H0ClBb96^H!wrt
-OEnBa3JWfcp&IE)3Q1p*rek<9I68Pj0k*xwIlqZ9QA%Rg?aiDrmAMxNt4akdM2lxW%7hXfF(sR_SG<l
-aYhi{V4!@@NEZ#1U@JV?)!fm9c0VISTJlHkx3x@-(fLW0Loe7*a`0nzhFYFv#HVk|tyvCQ`Na`J9K(0
-4W=G;wV+F1PH3zbY^OKtj9m`CSQAObPDsiO`V=M%Sbk9&MvcP+QmL|}M^_3pjRQ&{sP)c_!R0l<-@;+
-oJ06i|^bc2v`K~W-5LtpmTybL2Wgz(rTIIBwOuTn0kLhbu1(F<9P>H$X?92BFZNJf~9(!U)DYI&8O=M
-97+kz)}HG?f18L-R+|he9!$6B^z2m0N|D@N;i^lE7D_Db;72u6)HXECifuxY6J_p|5#U<{nS;DJB32#
-f6Kvrwd6|gYuFsem;V9Rkiz(uc~$r61Lghza_0Y{1HDu41@EO(gc~|c1OuCvm`t@75(|&OxB@95&l58
-U5xULjL9$3s?y?86H)V7mczov{)eua2Rh>o(<mN7gpV<*z>8$c30~O|mJE{5L>Q7Qwume!;kEFjzBaE
-J`Dz3WX^XfT=rs^L&>lH3LcaMwn+q%a(Oa$%cD_}`=ps~l?*R0q;x*kN16K5KMqOaNxdBL381CzEAO4
-Cdv<qOQ3p~x7tVhB6sYD93D@>#@8oa{8crMMOg>kBd46>$HKDX-5IOqznHwl^jGA1x&m|2L_i<m4o2S
-g_0YjN{j0e<mjIzPu~PVzQXCOnGCra_}ziKr|?f40k%@Ar<Q;Pu`S1`0vXQuTs!Vc`{vw-FPl(WE9^L
-YeI*S)W0_u(_a?Ri16Aw+t4@ovt0JxFF0tmo#}~oj)w<GZEDZqN^cVQ=@)N_SHBC$t$tdTruvcfSEQh
-;0FTBrfa%k5)je6$;?|SwA}(GS}L?h&}dHua|$29FS6QORe3^VYK$dTZ!IL8QusIi);|?ySWQjxj#=N
-w{H-o01Xw%`bl{}d!4@NJFtyOa$G^?W`2NjfW)`QsUMw106#d8Ky1HKr24CAZmm_NPlsNHe@Q4J3r4{
-sG=+!RoAC|R+e=xk$$c;uo1ZiZzapL+Lf3|Ip7;+i3L`yAcmV%xwDSC;HMz~>2a^5yExU1nRFwQU1p=
-E<~DEC#N#bk4yQbvQM{X@n^lIB1mH+4yJjb(O_pH~Sf4kzfhf$?U?$%o*gh%qi^*`ZCxu%A&*9=uvcO
-e2;G3~4fnM`G7WKEUo?8PS}dK#g=1R~$oPgeE_))!@;HC#OK@Cd9KG7(G?f$%(R&LXl!ErG+Q+JCFmQ
-1!M)s+M^q|69|tCuM?QfyAC{}v|7r_Q8D{zkzc2y#7(D2mZS`gW&~rdC?5(U0&ezOgiBFLQfa44ZWWm
-WkAr*;B`5-q7PC_GLU7g{Afg5qcEDjC!t--HEnMS_3Ma*pg**#;$CSu$nj|CGuF*J){ObVkB8?)T0SQ
-Kgjd7hE_^}D^5=E5~5ZC2?pd-vH8F>Iem$*wvOerI-QuUN%NfY2apNSL-(ur{{ssZHVoH}w%Za>BpoF
-`;Y9bs)t{V#?SOwbLDgR7F$Hy#RwVCT4v_iU!n!MH1X=S~j`1$c%bc6M&3<$RcvFKG+c9UAt)wu)o9$
-XnDc-31fY&aKtlopd$Aa_sd(kbCI%C;LLsMmZ^FMmb^HTC~DbmPl(@#O0-!lCz{#&gCpExXn|n56vJ<
-pz%3M=R74uCu&xj)~VmFItXg>>b}>Y7fy`Hm`zPPqQ$Q0Yz%gX78do{yOBMB!)Qc)_j^eNHPO{ozpip
-+eJ}W03E~c*vlt~TBlsR0@`5rq6Gq^*;|AYkjmL{aOzhGollTo*)ye7t_+3_WH9HpPM0Vs%nadaF<OP
-{q;T~YKih?{7?vcDz8qq0?CNE(fpCx$S#jxpy&xBZrHy9s^y2Se|dtv-CON&HDnSeIa!gekMpbC`b+s
-h`wym`>Uc;{APPCKiIM#utkTpyVW$?OiH3~g_DT6VJ$tn#~#F%Wi_+_C%?agmPGVOoikZpl$3V5>%FN
-#qlG-Ct63AwYeO>R3hwFZUwH;Ibk`6Q{)?za-ni#ze0RUmkT!_SiIYADbg4mR#SpXfxxyhagKCIey7o
-Zv>JOMV+jSW247Zn|V1(QXqU`D0}=#n_%4JYe_?>!8A{PU6bEqGe5zkVdObNGwnBWaP|Gcm^E`1ho$L
-`ssKK-em=jmJgJ3O4{va$x0((@f;0-PTJGT5p(%0`QtQ|#waL^l&8FH&X{DYWvwJ{*K$A$4(s7saA+Y
-l<b=p~ACaUaR*NZiS2Q>ycYR7Fm#!x%P&l&u`ZA4<lj}u>ZX?24`Qdoxtaf@KR%LGGSCTg>4^UUV%l&
-oOX(Fi@al=`i+CCRvzR(wcnzg*F{J@L0;c2UM+biK61TyLqbJ(Epo{@`j_Od~8y&tl#Juh)%Z<rMi1v
-hQW>#|VZx6sj_$5NMi5dx|bK++S>D^I=%C-LmPV9%0&Z-MXR`3u=zgON9d@b(K4k=nsW5Ky_}!>i3dT
-ax2M?H*O9FLD@jCGyc9HP>q15tM1CNP$+?eH_0iJ_=Aj>GkCrI^I-4IF~|yloN+u|EV~@xzEERyv<Mv
-U9d!K+c40|MXC98&AmczNh)z%~k$KAT(noF}pWqQ3Pj!h@P}BY|Q`{@KJGXk2n%Pn+ClHaQgdYk!z;b
-^(Ys-F<Q#eKcw+}`;w*o~JE|3zdU}y><$B1{BGg1MPXI~Z&@X%_BBwBjnF}ow>p2*7ZMZ^;ol3p!@gW
-khGK30PfqrutGMVPMy#G274;g}LjLuQq*XHm4=RyiKMKksim9hal`@2}3Ee)$zVxq5&8=RbWjzItDtk
-G}cypITO3k@S`zI9XLFtq_q5VJ=F@r^L*K-02w$K)~=B9%B>jp#6wv;BnCYNBdC-;JWm{qd2Ws;hvyZ
-Y<-`tMXj{4vjR@63je@Q9fVhV`j3CqOUsXF(EHAXu%r<8cuArAfm9zx!lGmF$8PQ)w{3sizRh{)l<l^
-E`(El##hdTCL0N2<|0;9$WL?C5?*!#qL4uNe%xt$NXBbXiTeg>%tp3c{aPDD3t-J#CP*?Nl!!(Zjrlq
-^5wls0KE(68ZR|9$v=RehB`0}`Z57K;}BNA2aqu&BTX|@-TXl+c7f}c6YH_<Vk#ArnejkTZ?Vjo*<E{
-<?MZf>06j+YNtez?75Bfw8Hl3jQUQMeq;@-8ig(LgN!YlU1Tyh6dOM47}d!8U8wD$MG`Uh}9C(lWr^9
-f^J-NSPKoF@Y_~H7e4W;2I>GO=7JgHq)HZxMS;B&$@fm!0g;Q-G`=CG!d!gFtrGARiT`0!y~0lCAz_V
-GXtl|j#3mCL#Kq{Bw20Z;*d33u}H5dMRyWWSrLb#J&A<OU$m}^Ctt@}QxW74c_Pp{$g0C3h+oE~AYBF
-qX6P&pQKHP-P3dRPqeX2#L6rsXAA##;B%_=N;m~=zFzktlNz$v*YMi+C=^lX<z`0{;QHUuX&<(8#)NP
-<TXOxzx@<WB%BpxNf#W*k0d<Msh*<`}TLUhkm&M4&HJTI<#W>oaIzNqMLptZe{Vi)|xtsR^P2hiF}-P
-&tx?K|1p5x4eY&I;xuXbr0T9b5A*G+gCd=rk=KVA_LSOHO!zw1k-$P_ihlRn$U?@mBI;OfydLFw0QKj
-1(mir;5uRg_L2r0UgCI<L0=;?{Ru@S;0cBZcv@=%mUjTDTbg=H>MEhs&{I_2^~G6GSb4MdC>MTC<ABG
-QqS;zN4#y8r+yDnk5jyOV>)|8rklqCUmu(_*zhXlYSFM`x!}ohWI5Q6*#8WaRQ29SnzDBcqmF|`C+(o
-1(VQ*)NMR38P{Q%%-fXpc@AEX{C}1eDM}zY*^0q95dZr1@AKP;Yu!fiS&@MFwjms#a6(%uUv~iboS93
-m>>hzc{ljJ@lHf++^=!I*h7v{S(_pa@8DUt{o%QQ)=ZdDJ+SY?`4lqq-=P^>c2Gzk3*Y|=B#(>LVAd$
-{>V(8hS2-*EobUy~vaq-F=7nnmp(9?;N$8nAZ99>GW3WAU4Stg!P*a6OAYT9^g|<(MqkD=0&Q`n{jTB
-lGunIh<McIMmxNT8I~TK{sEX2BeK`U>r+q0skUo{EHCjc|+2yCig7M=kFw_R^<C8@dusY^be+CFb!D3
-btf{w7rihP(UdoDlpNu~5;KSkH@F5C@?DZ8oM?Qaf~ph5Ag<rTF(WWk)fDr%lr8C1x_~h-L!c%ccA$-
-@`0|(J7c5um3=Q&9&wy4NuW@r*k0~69ytcB}rYK_{YjliZ(SnLt$oQ$HqNuZ`+8g{#F{SDj943;3b4q
-O$wtCUGn@_r5{H5hE3FZq_25a@023ja&a*pD^L_)qzP%OnvnegK*M)Py5P|eVG@QYSwIR`+PxY7w8eo
-;RZaC+i_Po*1Tw9@ohf-MRg)`Nwt!MiO=`f;Qx*4bE64Ty#=W2li!eT56<kLfmQ^jxo2UxP*<q`@E_j
-g-3(@6-*e5F<zsr&5CZ;{dH8Xkm8Mi4M2+?QC>+*TZ<RsSyX7vSC_0Pr(*3hf5A04h8pbMH0um5;r`t
-L{{EnFN%cRP0Rx!bhi~@1{?R`7xtaRWda*5UT1udUm`3%9)01tw+O;ZE<tY2+@^IcPOq1p<g8Zs;+-B
-L#YXrKy}>VEG!U>Y%=08hl(pA?QsG&ynL^dGNrsXj%%)H&?rF{f=C*hf7kCd>_V7#C+KDrftosZ#CNl
-6p+5%wU%7>-LlLBK-Q4mOKuffOth!V>D#H~fVdr{)ztqq%L2@$}`s3)Fn<KgWjFc-vW&@op`@p+aE`5
-&PR7(XKSe!{L1p<j;Ph%flZ%>Q09&qIFfMpzt_vom|TSDx*zn(e60AH`iOMKi+akblhZzjkfIkKTad4
-;%sZ@hs$D?X~G&eYJQ0SndC|w7^5|)>ivuHkQ+Uzs3H@SnM&L)hTDU&Rqrto?1E04D|!Oe;gQp&`N$+
-d!Le*10`3RBr-Q!%F2K^*yzge))Hbhn_>#65>6{)w&vZry`7|41Y#+09tD7nSBvCghQ$nTSG?*#7+RU
-2Iv|8ofQV?l!}C>Y-jsI5cpimWM4ruesH)J<I2ETh{dH!T`buRpK*j#;e<elEc}DL-eB5!}&cgzod!Q
-E-t1>|WI141*mKy(eX83U3NlL|=xt%h)5w7Fw#zxn%=)D^hi1D<!c*Gh^e<2K&oK=BPFtk}x4FxKL4x
-jDOKG+Bxu1P^@bNHZLvgb`L`%Dr~z7;7sN;k`&uhk^u`-B(|Qt4ziF%H>SM}f$P!&yNVxn)lnS>u_{$
-crN)FAKx1n<6#r;++lvmHm^ZYXzpuOb}L^!}wrn3H}9#UO4y5A9#kQD*7ntD&P4%E!YPB9ZJC@)M=wT
-os-Rt+PRSmqR(NYD~E!)E;h51zN1t3^bUP5am=LIkhPlIFgvmZr|5;T95k_q{wM$rw1)W50-DZA><89
--S7F3#dZgNWytsSbskD$)d)YtrP!E2VQBZv*jWXRWv;GSDL0;b&M}Y(&40TUiwb&TuLEGAt+Z<J~{jh
-{1Dg4tB;Xz6`_Ug?V&Eq2DXWz^r;W29cm_A_Z-o`t&>6U?x;F(K;-16VhX|kbdTgrh=HcKwpFq2#@Tb
-86`&cq6Bl?kS8;4NBsZjx8s89IL?6h8tj*M6DBW8~)SMrf3_8#f0E%fq6a+S>bwfv;m{fLpA0S~iA5q
-bW}y8qCow6SB}%q|XB!#mwhRR<wXY%MTW09d5VpG2vXg&@H$%4rpN2+iM5w%|j4|dA^RD_`6^K0Vtki
-P7w0xBcm^!d$rTR8VLSsP`q)5m*Ym`W##@fjMo+F;g5B8Glcot(cOyDC&Yd(V}i(wk3IbT)}$RJ74a)
-v)_)xI{sjj;jqYW7z0We&e;oAx&E}tn{9Emy|Ka1O`yWk9`=Iz^O8*5@dQdD|%AaR)|5(faW)sgt{zq
-*s!_<82bpJ=wT1LmVKPL5GFsX>>rB`mBWrF`$&;Mpq&qMx?+ImjO8~|oq<h@vRuK(GznBU~pb~bOAQ`
-JE%Bbzk4gEm5n{IYnGY>^JG!GHELFRI~;?a9c{F{uu9NO&}M6yYq;Xl8pnmL?-?{o}E5*h7snHcQH0H
-gIA?K{U-uMGS@ZqxK!;n~aBKFi4tDw~;&Pu&RKIbgVJr3GJfq{IPKCKID_Ms!+Yk!68c{l*2yf=e=9%
-H~K(DjZB(u128wjD6V41lA~v1G;CqNS{-THfoV=3x4Nx*xiTM?$uP^EM4}DNG{Q9jnQ($8j)8ERlM<K
-*QK!dPaiI>)s4CL2Dze4gq<EdPcnuwiQo{2jpH-;5&xK0e2`hE?E#m5YMv5u2&X*Qe(yCCw9gb&cj7q
-k7Q|-{g@ckYKVlYQezx9a5Nqn8?basme_L5_B@vtxt9=UD9z-|-(8C*l#)L|GMxq?b@pP?YS$Y_^=Ov
-EZYWO_P!Plg^27zroGJh38|Fk4l^?=$UlM4mIs@^X@oW_WXVHsh?5X9=0gvRz-90~zV=cS|&=Cat6lk
-GCKlww(&Fmc_9tnW?Tq2?C`lIAW<WPxt{a?;;%u+zZ<+6YoPS*WmK5TK*bTM5ipoV5k;2wHRJ<!#|lt
-R~WPvTV^qh>4C~Ysyiso#El}x&Mo=F+?8y$8si<IAUrwiZnOo%NL6Ttg_WwP=Y%;Tu|~s?{%0!CP$Jc
-FR@^(botM2c=zakaHTlqZ5y>vsVX%VKCi3B$SzRdyH-i`jVbZ(kVRFHV&~vg!@+jwc2(<X@fx(M!<q8
-tW({Yc<lvnuc3DtKZfup|LzHv!q#!cl2x3V1~RsdY-YbkSo>C}okL3Pf?@%!M(Bh|A<Pl9oI^?uaus1
-Q9^#0k+;hbkswcvQ{D$qobiY>h`jo1d>@oLCc=8>D5m2bc=kIyfm0%i^vmEbk6kj$S1@ty@C+A&Gv-V
-)dQ4siLu+5e%_S2c4j%ysq)ymqwx+xs1q9gr7w+<eL1cF6%`qv?do?3JZvSiPLdR@sM?zP?2!F^er&8
-uof@~GdB+f($?L@g*6a-k}~ud!&{QF$Qq{whhMA?$wiR?OSx+p&^n&ct;GA}?5Pak<M^T$i2Qe&lp_k
-ahb`(*dlX&|TM${yi2<^Nv{X>9xz?hT$^tb#Kz|@dqLzVax3uJJ)PkR$Ixw0ERDjlg3tW39{J4h)IzM
-Ixn((}JGjh7#Q#0Y@GtfL48@A(_wc@j3(BF6(e3<_l{P~-8qo?}Z<TK`e&0aSWD*<QE4c5bc)bG?w;<
--ze6+Ct5u=56xPXXkYHpp5!R26AW*A6k%FYNTemz^jGG3Lo;pOW@&e&y+3z1crOvwvP`B!IfrM$+#ib
-~Zj?EKu1QO#kUhqv?NzO@I9<O@CEu`fG#Gj`fkMyv%Ph_7IOLkmP7KWCK1^NM;TrBR+P6A;^FE#CeQf
-{AS=y8Kz2jL6OG6+&k`i=z73Hsff;Px)fP{lsmUKqdP+oi$wPvUIgVh*IV!m%i=lpxy0(T?0NVMQSv-
-`1{itXX=$|!y6PYzdWf1#`Z=-NCUN;>R7RwZQ>o<cRGYGLgls!T<wh-|qS2IFs~2pe`C^ufxU9lBldw
-gK8A4BqVIZLcm$ONnb<xU?_%fZ~g)^#w9Mu?yGsj!=(m)nP`%*nrY&?m}l*5W*pxgq58CW#LzocjrnN
-*=#p<WCNj<!xdNi<`~W6e2J2@SMXMvajU^{t;a!|fM4FMGWnOpbp$hpE9W#20PJl}s9U^+o&i!hJVbD
-r(8Cc!dMqU;whFPnT$FPY|`1#yOcTs>1=FN}YU$HhmpPs#ed9V&y&6!uvyL7vA}lrS_;`Z49ptIa3X$
-{bM<UR+3Oq>^u4EQPZdEi>UYNd?tS%qqFDM$!U|IvV-j^#fM=sOa#e6@nIaZA%{|>ZVJ*q$J|tjkzR+
-Oq)yD-noQ}A^u)Rx;Lt=M7b#H-zN6U&{>>=C@MnnGECL0y?iC>;3z98Z@qT0V*a{&Sghm>ISb*RxUYd
-(kI?6H?Kus&0B2dv<kRLTNis3jfwJJcU5d7$?hqgf6i1;9sZPme551TQfMhKVY?F!_gGeC|fxwUYdO|
-r0#_*T*CpmzAYe$cA*#BF+ER!vh_vmoio{=+ZZWM|1QO->Eo1G<F)e|k=0a7dtZz^0{Nl*|#)?2CTYP
-R;kz2ADH0!YwR6h|5Yd3~*qLgL2Y#wzgQiV<0C>nvf%aq56Og5VwRmu5~>GXQIn`E>TezUxw+3-`ba&
-&68r{ST<=@{j@GiWHQ670Q*O7czX)o>}QmmgpGLmFS8WsFyXWt#MuY}h-Vk5dc>Pmd@J>u!FRc+N%1}
-seVj_OF=^w{VUc4E@}nqcXVwnG=U<FrKN1%UV~lhq;(QnWo2$3JR4ZL$)c7OkZpvQM<%hxkvBxo^&4e
-MbW#?$2TQp44g7OoB#*J4xW|)dwp}8$)9Ho|q?LYGR59Z`9WFE1tw|K8tR8&Z<o>qU|Jj^cKD{73EWg
-d;UjzKPUu4~YuCFnGAWA8Gy#XAcxl*nn89V6BZN-iBDR$Ak&_Jejrq2FK5CR6c_PVwT#O+3Qvdmy?H+
-=XE&mI(|Pb)rbwBgj|;82=c~BRJzpY|s-Hi8L^sT8Ir73bP^XBZdI}Pg;L;%!tc*a1+nX2wH$06>-iC
-h@qAy-VM__BkGd<yZ17}gQ@|HqZTC2n0W=EvYi&Xu$FL8^E)pt-?;FQEmYiALqILmj>84gY?KZ;S(FN
-sEUzV`0~C$OAzB{bx7=Myv7|L{sskX(@SUmIJ4vw(co^X;m4&M0X)uEY$#*D{Q5Q4l9$&@cOnmEf6t-
-w0`iO5X3B0I*psg7)7LT`gtRrK52sH@afmNe?W&tvnoDE1sM3HF60h|lF0iIE^9*_zebe8~7D!R35<B
-&~3Hh}~~p-he>Vmi`Wk{6kHZL~-V8_K#wEebV-kz^~xvjD9~?A^|-IUG81(`Fi}z%X(~#08zPc5p(7U
-m#})EY{F21q$n`NdNA@zH<YyNhl$5fW($(J$`Lj4ag7o55t~n5Ix0e+wHbTuAOD5I1#tpuId&)u=9AT
-DZiSgYF&T5^Kl-FsGj8zv*ExYYluP*nIhCGeBE2$NH(5&07*^t%Aop5x4%()3P|yV#c2t}M+*sq(TaX
-$D76NyS41*jv_1p&F)-p>U*Y<Y|6iVJleFZVesJ`{zoYabt>nqF-K)3M?fIvp%5%=w=d1Lz*Z;ED|LP
-kb(wyy<7Rtxt(W>O?=9kc@JFpXYaJuF|SV*olQa$PVVBCXrePnw=4<BzltpUClDc8yPgdRCi1>XHqDL
-1=__Iz|_hlYQ(y|?er38R(lPhB1RmmPQP_oC!F6))`5ZIQr{Teu=OAvgFfFpK>b*rax+N3&kLF{q8Ea
-XB?ErTZh*cLC&`dcDoyo@7XC%59NlU3h{);sIjMPAewQR<auHr{y%ps0PCLLbX8~U?g<h^6)rLuM#?v
-!HTXOfFx@Si<Zo=&DGw$Gos6uW~=z-DL3W2*$d6Y9TH*@->6WuY`beDM3f;BaC4Uw*e=?=#`Jz>@Krv
-uG%7(@=-46=fg+beDO41vQ*qwu74$3YaOgD}mX#0KZcoUX3tE)Y=vE+NaLGCvBuGP2?z3V9D@oXTDn%
-+!UL_71fWxS1;bb=qyGho6@^f{jt;Cgf2ag!416UHPdE)EJG7I9;qGXn4^_+=~5Ix03aN72}tj%F(mG
-u%#+^G-a4%+bJ&76R6F`WYi5(x`zA;N#^<503h?J!?0J-mxCNGvg^9-aq6Jd$k5bBV|MR!_M6Ca1&P?
-VY83&&=NEaRuylD`<tUwvV^>J1vLKr-@KwzQTe!548{)S~Y-B9g#=`>36*~utAqR)1=24xEhjg8|5*X
-3=qIr)~Pz(eus0>z`rz>`#1qRkQwMQa7LvT?+_Rb4|O`zWaUY0oIw02a+@Z;$z7~?_jR$m`}5B3+vB~
-1H@dS>@iX^U>B{8?Q=}PZTdxbaB>&|T<XM*@!;oSP6n@(7gJ!W35UyG7bH}r5DZRHi-Rk-p?i%L|KE`
-Oup-;yzx2f$jl<J06&E^?ZvIHa|_RSY~c+*|w6Oe|KCADoSDZxtTj@0Yg!76*|9INVkM%nl}!5vWLZ&
-?##;k0v9$sI!$pryl{gGWc~_z;h8;(5vayno-QF}H7yjTqhh0b8Q7&Q0bdp0g%`UV5*9p~xQQ@uZtJb
--yh~`z9x=2>*CRwg?hjXs}swofIECR?*aoqZOq;*LbZWNl{Enyz6iMn9*QJXGVi<IrqTm5mb*>PE2}~
-3wwo{86IDl*_nSrr?$}%{-G&Q3Q4{>Ip!HbTkx22ezKuWY}^Z*7T@$wU7I6YXrGPaOE>i<KT}CN>F4R
-{RnPPM(;&1LrTA=NrIsEWX7I*P<y}Cpa$b;3BO;TW{o5TVFa{nbBf$3T`d7)EY_Jrs2{~#MJ>*32;@p
-Qj00(TZjFcuq=H**=Zt({ONrB3A`||0swG%PuqniI8FC;OHB@2lOW6K2PDX_1yhZ*G-+?i8NiXcPF6T
-KkpHq7|JVwcv-aiL#fhB<V_iAea6VccFGEcpqkl%T@$p|#jHcV&M<5wU|--(Vn9k9zr1yY;YawS$L-y
-$&O?)5Kyl>5538Y#HQCg~Qf7Osj#9<NF7}+oYfjD3nrohU4Ajqh<ku0N##VBvmQh7UJO1IIkXws_D6L
-C>3XJrF#+VMa+uQH**Lfr<Bb8^8jz7imE$Ii{T7Is+WAL3(N{7@4PHiG8?AFbe*RoWmU#03s51#fc_c
-$bz0<Tj`10oGDaBEQLFPI1^@Dqvy-bi2(8t!wbc)VSsk%i-Djg5W`XW>T;~BHP+{IK3uI)h$4}iu2K)
-Myy|&av*eEOZ9>JnMZSUa-`GT!RDqtU`rV<(+f|tS>b(F?c0-((Mr5Fx&SyyspMP-=zDW6R7enw?)mm
-K|0U>c(t%KfF4p0_%}Jyn~dN^Q!{Z96@0Q}|5!x}A*<vhjQmp7k^=i4GGMoI1b7q0kSy(pnBZ_^{P)-
-$fj^5`KsCEnq@zwk_Qr;{29Db(8B5|ClwMjNb5?Q$+Ts%eHtlN@cDuY*ONhQE%WO9YGaxQ@az3TiuWv
-E{QDM$)NviZAUe6LJOm$$!o=RTFQC5ViJR=mvIKYEYe|#G0+DsTHvk!)6zW}ihb}-hBIBTb4&YWGB0%
-;nH!`UHCePKTaE?3c&MZj`fZ3ME7XQ>t(tJMc7Hj<F9*EbeYO4L{_)_4-M{~IaQJet^ZoYW5v)*&+VX
-L0@PAsS(N3ex5CwYjw>ZY5#C_dlk%bD;r)Hr7l_3hKKUSmheoNxB=N;Dnm!gUo@$V+8c;yh!*6}YDK&
-&E?$k2sWd^PDuKJ(0zeB~hpnOdls)bx*9S@xnc3ztb1>Ibgf@5hQ3)*xz{=g<&6C~;{`1_(}N*Ogdep
-`=q2OXw3)E>tJ|Z`X!wNGm6`c6GCsN2A8if_5<+qzk><Uk=d|xA9)0kvB--$H{gymXDV2ywE;*M(#Be
-izecCn}CniZ(v>WG(Zy($GCM!iq`s0B+N-vvED~)GGcH-C;QhDFIb11`APMOd{9W_5HLk_0$*GLe>j3
-441v`ji(p}IRoDR`i91RQdFpSH$(v;Hh`r5mr=pZ@XcNR)-B|j-tI17Eogs~hO!X$^gW_lw0*G>6ASm
-WBF$&%s9M{TnBmulJ7Ve>S`As`ex?^wcynfm0I3n3_G78{%urnF;*IUYo93G(yx$#Hu^7JL#$+N1!sP
-3FEgZn|+XOD>1`7~XPGm@Gb+Oy9Yu1avQ=S--Hq%>BJi<6wTtEAP&WG;HLK$?;&Rt$aIk|Kmz`JR%*=
-h;E;zd_QgdmXX8gZx--W-n8Dd=P(~WhzSrz&T10T1smP@3A7(Ddpo<#K$ZJr8T|RQm7q4n%73d(W42P
-ah72+`b-4)y9jCj0s-y6LCYj*A05XQ-5*`YMJht6Wkv=z<=o0SFI(h*)>2wTtuP`m(%yyxlwo3XpjS$
-mnwCmsZv>kOc5ZdY?t+S3Xs52Rd6!Z$LWw~sg5GqMIT1yQ5!<0z`on9{B8ENd!s@w|cE$a>jwi*$L=|
-U+2OkrM`7EngMW!c%H*>?3S7eJ9x33r>i_Pw7SC)3Z=C)17SX9dm{-f2lq-4V<$hXx_Z(_t6pf)2WM}
-fR#&q|sJvvq+&Vef2=`X-UNY;_YLi(I4`QbCskgo)oas97nI#Tq~DM`MpoBah<Anf*tdm%OpXafkqRs
-@HI+=Mt#RG%qz9n6U`GV-S67`*;Wb_ucmP@ps>Co93c!^c!9BXDZ38IXr1w&)cU_aNE{nXm185C*PdH
-)3(GCK5ARdwomVtHT<*Nu<vHgff|Ig-eyyrg}yPVofQoaADD<;1vAGDm^p63%qoa6x<gz>%E@ve@c1^
-2@vT1JoSsuvG*vY#&Vv}{&kG6Q%P3fx2E3cIu{RGSXSaLaukX!j)T`aso6tSFJGrbE7c{y=C5_)pMbd
-|bMX?V@Cds0d8`gRgdD^XAqAt~WHK@)$gG@rI2UL0HLoKIZ<+0L)Dv?4JfYFdjK-7Lr#cD%$a+`3SXI
-l!qEmAmBScBGBn0sPdMo-K+c8n8U5~$CQZPJ8-s?%On4kjojC3G2q;Rt?Br<QVPlZSg6)d$k?XhzCn7
-(p5A&0tb{i>kk37<@s5?YG?01D1AIPM7_*e(5>ux(&wr+(wYUIsA~(g7wyK`N#9)&e-Fi@6iuQ<6Jw-
-xk4<F8;Z=Qr}goO+9#TYoi3##tDeCUv8IPx>nc+GRsL9-W<Jp{=cmOtqly|y7J{-Ri7ymf0X><82&k{
-k%S2|<ekr0~urmNJG$G`X07se_u1@hS@Pg2}nFC2iT^@QN@bzjwnw!^uAx5+lv3DiQifN|B^<u3#?6q
-(`Gn<@1L6CkUp$;NZm`Xjt+(RS@06AY&mpztqrPhq|6>(%^fI(tgA4Cj>!$3u$XYfMUZqq$w=UYqvMu
-kcVD*kX6aIj2joNroDl3a()FNp~$S+0b3r;|uJfJ0);Jv982<K)vkz$E*8al5Jx7ZgZ|WM=n<b&_6Ol
-4}D=!^ofrk``xoZgFY^K<V45W8;e0k}(@4F*UK#C&i>CVB!u75rF4yG={&)O**jx0vWRI{%u*r*#!sl
-5p7z=m?CJDMFZ+wW|b89aRUgIkq9M4?PwntI<M5TMS9nWI8(B>A+i8G*-`wfoNnA?t951QP%6xnhLTc
-Dnw<p!Z8XBxTb;XJaF|RII>d>rh75QnV;ak2mAIDI^TP)bjEw}7n2WFo?2v1mPmi5g0DSw-ea3EpVA<
-N<-WFGet<iRo;4=zQH5cJAgu&V<L3u|U&<vVuZ==SCl6)8V52mrFY-eS=CpeZwk~{#pDB>$?bz~=%kf
-X3N<A~6DC^6Uh6lcw#4HaDhv8WH5`?nnY?@m9!OYS@8z4Poc`QR&6{`oAe&?O3goFx@ZxgB<S`)FrxP
-f%Zf<ImlVufD<qE*!2i3OimwAMx*OGLC2TB&mkd-3FV%xYVK%v`)EaLn6E69CnoX<SZYf%Rb84<*-Pn
-=&dtKWB3Z-VtnVet=2gX5oiE=;6y*B9(0-%i4P>_FgGM}X)`WpJs}qH6lbLZ<+ZZj-+21vS6~0>&)>A
-jNrs*>4}q6mc<QkySA7tX=B2I7FrKCrdOsn7{+bjyLZpnKxMdZnVbj+?Ty{WktQe9~O%?^>H&qTh))D
-YBFDv$1C!K;}vm!$1%RbR7v1Gd1V@}q$n~n?<4Jhp$I`BEnZb~xg7)eOFuffXWSR)Zp<CKhi*bHZqez
-1*oi~z3$PV}O+_qU(-cV52sxt={Bo}n#&nkc7?%<ZEc=`jz>>jCe-qB%{CR7dTDTdk<ITt$q(gc?_Ec
-)~;lcKfY99Zk2^Bj!r@C6)@}EfGe*YSgb<{%M&hiwVQIOO_o(D+}ppMOYc)`qr<}pg}5SO>ni`e`=g{
-0bITEH>O`NZ;bWAvUdj{XrpC>{M}GY+C#|S7LIi59)k__QnaLgFDNQnQ@@wS<Z~OT52vvaV@NeM!;!i
-pB`pJ-tJd9IpD1iPdiADMmn>wU*`gFzg$xNG*cM2ohNSh=>0lek=(?gHakCV?(h3&ETeVK78Jj=B7x(
-Cn-S^-Q-iRvkhh=zHWe2afe;(|;IbO5Z3d#pdTA@Oo_p;;s-m5z@Lmyi2?`^}hOjn~=37XZ(@77q`@S
-k<jVlJr19-^c?w#d1*`t%*S*VeiS)QKEyYrP&r+(+D7o(3Dji5H2w<ZYciEKeV!eru4Fusg!Z{37{qh
-&wSGFw}v1QVuH}kzKGM+h(l~4@>ODBkaYyMxBKH35%r19riW6B<8mIEE=<g-cGbircy6*??1HFXX1As
-r=&GS?8^sTwBDVy9$QZz(=)54*Ns?ILLf;GB~2AXQ#atugX71!2qr}^{S0bViIbuh=g)L)h7r&KNvnr
-ynmXaW&Gi~WIDVv+l>D%QPIyYA>d+ew%}{prE{c3M4Q>4{^wPfC4o>R~&b>zd#NPXq*Q8wBGPH|Jwb@
-AAL$#}$)ZVP{Huj}@A>h=Z_!a5qb%PubkhI~l5@mI>j0=TiHmu8ZYJ}=(by?&$+E3ZtmXP^Eov!HpGj
-rE;!Zx^oEZ0X#)RuIEJ?EjQk=|!8tF_p`TF{_^#`JvMZj>IPb)wlYog&dz;@OHl^(gB7-8K7bm-xK&Z
-Z1WSQhbHr(T(wG>n9q9Pzy-gFf<O+T${L3#D-R;{8lB72o31iE{{+;^Cw#;!J+f~OaE1b9Kgxumms6`
-dcAs#gr#ZKof{vr)A1a2zHs>iJ@sAZm_vsx{-@3GVHrIXcZAlEJ^OX-y}kRoyIZrA;r4)<U)*?&)=WU
-^j)G)_RWB)|nvPY}LTSn&sq0GF=9>y}0!l^VDUUvvV$z|9BF5^@FS7Jkov9$rP(xS+Z|Bt|hTTs@&N6
-Oq&oDJb$jJwthKj9NXvZrl#vk>J70o-h;a}c9qcj2-l>V+0i70;}U12a4mX(yLkeXs}Y-S^_jv6iVFf
->y(!}KDI@S=6{xO@7SccaJedhbS$3{?z<K-b0E*sFOG7th~~Zoj<ibn*8D26PDz-i`jk4@U7^{4}&l5
-1`TW&ET@CrkhWmkc&uuofPNe{04=sC%?=vYA#4TPd2{()6;Lhd2*TGbVqr2p3k~8w_S8r>ymD%OA4f}
-&_|VBoXu|B6*Je>Ggs3%$>F}fU5~!J3wK`sw)670mw(xTpHJ^P;m<q2{k;F%{$G9;zxRIrZSQZt{p~M
-%{M%6w2^n#8xJ#)+w>U?rAw0HDw!8mzD%FWTeUgX^!3l9n>#zl_9CLtEVfsaB&ZxM&8=^{gqz%-5Je&
-i;=tbu)ILEYv9B8DQmc8I8VUt`zv{?L3&@IRIMK#TI9A_$%D3)dopOyKGql#cRdRClzV)}&ax*p49<z
-|2yiHgQROhRH61?#M7B{wJP)P0?t7CJc9)dn&b(N--Nn<_#$!#MBw*9Nir;lyk#GT?f`!8pexv!?GzQ
-x+6M9;XJ_NK$tx^Wa-5e&y(KUvLqR`-JSU7uzd)z2k?&%p2;V28yDld-ig5XiMX_amw_pzVlVpxWx!U
-T-M{LZ%@4WdV!j&uDzonQ9?iR;l-?e(&aW$cN9`_j-iI-=!3&uk!Yc&ru&yGwEXc<KEomTUWefY2jNc
-@s}~%ANBRYc0HbtR8LvS|a;;VDBeK<h=k$Us{0gNOkHQ21pIo68$_W1W<bU}3$>P4v`9DV9HwNby_su
-G<OnR6op%nAhSbTCtLG(XoIncK-e>COMVpV|@cjXbVq)A$_wD=2vbd0?TP+c&!t(|Me-vQpMA~aH@Y0
-GceriJAM-9H*PyUM@;AyZA+HQj9kc2W)nWNpcSffGoL$Mw<9eLlqtU*tZ(q)R~Cr5UOkr^&GGC8&f|>
-@bSl@mO@FOhEXf*dMA5GJO`|#6=+<BZjNKM49*KKlj@u2uTf<TAhV`(Sg^ya4OHoNt~IX%x^9evQyxp
-l3fgj%GAkGIWToSFt^dfETh^w9{7TGYL@WjrHpAHz>MnQ#7)#@qyPM9dXV8zUDD72F<eXrThCRdb47<
-{e_$`dg!MXU@h;6!sb7gX8<}a4!=2mqy9xtM;Fk=)kSPI0X~4AFW2<xx9}S0{UvRs%)^odM985U&+%I
-LXgmaDb*a_R?^8M&MXvzH53OlW!9FN|gw+#l2TkAOaFz_^Vd)tnz+1YB}-PIb`0KA>Jy)}E$;%?mC)j
-LxDGWK<%g?$i<Z>!y^51#9-hyZ3$t(IJBumpLTIGCvgojy5f*MPN8Pn+J0aV{ufcIW@K_oeM^+(^RT{
-VO`uI&4}^T9oY^ilnS8+Zn&B*j`)NIVgosi)=|9^BOj3S+O*~{jCE>0gWapTh1}ha3(U@4HOCmpin5(
-VX#ri=xU2D^Uc&vG{;j{`G#2PW?wT4eTDBXZIvg(8D$l<qGB2N*<^Url!Lb5)Px7=Asn4~EpP^HwnSr
-ku)?_+UBIy%?`AO{#^pt7147xIW5<5y5V~<mDl!EYMwGB1)vfXgpD)>cg}F#Aab^2z(VnF)F3sYuduV
-jHT~Hu!N{C)A5V5@~@@I)Qf<Cg`(i4)?#%)k)DYZzp2@ZHg5gVo?z}Wc!gE0w$)RhrQSSqfjX>~!1fq
-d#8MU;fHqgQU}HH#WMW-Yq~yv=#XTheaf%H3?Ia)rBA4w`?2BD|>MAe>Qt{OREE`N8uSPbqeK>&eT*y
-@P{A$Ixm0ZV`XK)%p2uakn_G2QPW!$h)ex!x}n(FS@Fg!vRAbtRL%v@uO5%09M860;OJWEYEYP>9w&U
-VU9*e(|<qWNTUa5l|;L~$%8|h^_?g#Ay&TvT49{zdV{{P9T%EK0R4{XV!<Pm)7h;&+}nkpl}QP}!wx3
-?hm6DV%*%G1Ve&NF$wty_Hz?F}qnw(<HL_EjV+lQ{L_aug*6FyZ38iZ{e3<2(q7r1Q43oMMP%EiduQ>
-?%E4viDky8-XYjLaLMW=N!XxzJ7xUHATDK?sL{Hl*rSgxe3Tvbu|kxEJj)6zUySxf0@DF0p6Yzv|nSp
-fh!-2#0aayci>@9(3RW5wG7bCiJm;9Wjb4wxJr8&1_}#MhKj3$sp1^xA5M#G&KTC9+U*1DvGt#)Pp^n
-Gpg<?owe2`hP@0{}D|yWL0ub`11Rr=nm5fbn-(b>z?9CKiZ1$pX%L%ayd|`(c)64T<UajsVSG5R+PF9
-KE;jYq8Q|}<f7=&?mbc+YymNbMI4~HX;Tli$xgwLA_nE%9pR@uT2^fn8ZF7yD=iV22^aH|xO%ThYDZ_
-=?cEyce^<gQFta_J0=s85VVp{O^*RTDkg__u4Q+Ms;QgB`t(BV3ICra%ovh!uTj1$Q{IovdLW{8i(Sp
-iu624xHXU|6;?;k3(i_bp*-@az63ATJdhr1X}7YLqC4<wX%P*&?d1t7Hppi3gTj&dN6>G)mVr(Ej*hU
-_yCd=vg=ItEZ<WxrHRIq7@07A5~sf~I{$|IPeEtDUZl*CskGrcIs5wBKZeDgMai>^#>wtQ7WXr2~$bX
-Hdk~LK?O60j72`^}Hxi{kMZ685I4uznmsTdoz0QF!}E<){@QkgIcBHv5u9{k&x@*H?E4`pf>&k0P4$C
-hR{Fd{u6Zf2}Fr9U0xE2qIjE6?DiTK<aF!sR)76%JU_(1mHj_xQzS|0KVBfWAkDj?dhDWrp)ywr@^K5
-&y^Lz7Em)mt_&b<fL(`5ywOIzb09rlkNftBAbuq|^YpK1!bXwW)`br}&P^)sb(P(+1VA-B}b%W_Yx<#
-*GY|(EfGfBOd9(vSy1uS@d@#+gQR7GP-bG+9O(7@NJznbOi7uNLEor{ZQE)|ReS$$C2dZX^fZE!fM;E
-G>nqiA6a)aekf;S)!oDmZeg3ITU=Dcs%9rYY>_=*!Q}{M-Q6V8N`<slto#(2>#Dx@bOCLO)6ynA8&^6
-r`hBON(2c@sW_XP@D;R?{dsKmWfyj{LYP_UyF{8W=BWUqoYyn8d};L6k`<{&xG(`0V`3`QR0Y4HV1)<
-HlnV;p{ta2kxV8JI8eeh)5DE!PiTV(QaFd&8vJi7s%^h{wZAK@2Wv;O8a_VUd+a_Q(c^<>?$aqf-GA*
-qJ*B75oU+$txrBN8MX>`UngM}EwF=Rs>|~5xS|tk)6@-3Yc-JBzbz6aj^|wH;k{2+QCHk@KB7K3qMx5
-ZW|KhiUEPa>Rb}9mR#kyfC*)qe`0UqsQB3dhNq|35%trkqyLi~4<cs^N}SmehgM&(wvLDQR6go;n_!C
-F<CsB*;eI{zmUAJjh9eWl`RauP+kp{<ft&#k^fu)ZDoX0lzuH+<Ud-gqfjh|S!qAI68{{qbNv9C;X4#
-V=3$?^0#KCgS$=2n1?JZ2a)=WQd|!dP2S?(`+(^@hp1Nbdu}rcZ<%U02z+=C30H4myi<b)9p1t5vzNe
-(S!*uZf`MT?pB-}cJgZ<CXA%%3T?~WBo#=i%|Z)s*HF9(wMuCQ;CcBu7N%Gpv5%}%SFXlt54~1is4Yh
-2RR%8S%>T&gWE95F;VgC)-3AZEL}zB;O1R0<(Is~)h9t-xd_-!8Xo+Z|cBuW1=X5Pm3)-H{vI`y_j=^
-WB)YQmGqR1;F3RbPFmn@R`xzh8R43i_++<_G>UYtLwK#VwBDS*+;1OcY#x*U%8Bs<GTBV{g`l3}Ne5X
-}Bm!a_EnEwclJ+1W7^O5GkC_xAQUL){=3cU$<B;~M*K_}$5zDNpa^rPyOrm2EgF{aCOhU}4$0$t@mR;
-?X5IK*OtlR0zI2#di(Y3=q5IZON>yQ(404&#SV=4dEtH-F8p}Z?|t964Z|g;1b>!N+_v%w1npcgg4$s
-F{uQ=xRvCof;C2#H<lw&$o*A>5&g7?=17UBqyB9y3uP3%!h*QzPyvF=RH1=`g_{gery%+3U!EU6<pd<
-=A_<RKNv+oK^<;tJSDn1g!AB=>XO}A}FiLmjbS^CIB_a?$oaM003Mz_El$JS~3a8{*&<PhcF?*{Vmp*
-nrGY|Satp1bdvOw+=7!Qhsw>bAuK=BTIYjiP2X0x+=Y8)vz&@_d-2MYayi7kb0hJ+&$#cY7ia!b@ZD>
-YhNH-br;K5cS(9MhR1x6AZyX=*HIbk!{Bwx`AR!u9-na}8C0ceU!DmF1uc@Ma8$VwbKgUs50plW0ZVn
-8Fh3Wqp-Cb|fMk`*-ML%o1VJd$BrD_`!%sn~fF*NzI0Eyqsl9!FhCY4d|Sw@A5Gv_$Ws@C~OvR4jap)
-FaaVlx~zC{t+Q+uCLU|K(*#k(oju8vQ(J*?O3^p9QV?Ho4pw?kO$zkeHJuN}Q(T2nOK=#4&-|`jw=eL
-%d#1XlSUSfE4X)nX;^}_IKoyY2>%@3k;=#e&E4SKj#kp}%Zo;>htTQ9923MGqp!pBA!jJ@k^#zYBR~L
-76)pg}a^0&F7mhW$?uBTOOAA)Pn^zGJG+%jF27U1En3JoR0J}q9QAF)RLJea@XDpku=!PE0Mb`D~G%B
-&M;3~wEZ`3cvC!Eq{Z5cl4Ac%n?OfPk==XU)lUjG3bB6b9)O*g>&e6^d&M15&5&GKyWVW=~lv^LpaXT
-@An;Yinq$8|t2ABTUUPo*rV<7jGb_5Y8U7VWJ<E0Z%kQYrX3O<Iz$OJKh<%t3sZ$u(^-qRv@EB<Vjb7
-R(rq^GhPL)=LiVHx~$L{`F@Snw#s`O##%eTYa2b_C)0GoH^M3wyT3xx!5|jsVJl7u7@9EnRB0iDQ(q%
-GOegVDDyb<Ga-vw!-?E@t9jC>CqsPRfELle23<~7y4vam2^Ze`3`~KB5<FiW1@}~<kb%rL&B7C)Ly>G
-1(2z)0OW+5usi>k<B`{j}{wRBn-UB+YW#$Lj)?H6s^CjG14(&-A=z|;3LXbf!vywca^Mjr$1Vd~Z%4>
-p-{;vSlh-i^^>AW(JegnLPCjyf_kHG8)k<7nlb%MPN-2h4NYFm-=y18==`x!_hjNLfD0R}QAfA?SS)y
-_rv_=RQ}!oGS#ui8Q?E-iG<Fzm;gaA&s0re^w@kC5!B*M5%-O=tAGZkH&B%>{iAsIC>vxp;fit{pObK
-cMD@Er3g^IzfFV%B~!5xCW|$s(&T{$Svo}Nwn`rpri7^1xO0=m7p}NQTWUH1&NIr$V0~}YuNPXOMBxM
-XkWbn_X>x)=8R5S^1-Z}<lU~wy@+jkV5XE`oa}Z{Km|`9prKU=GA4j2IMgDt1X(Gm~vX|%xpz$Don_Z
-yHh<$!Jt#dRtI&wWj*R8r6P(Kzvr#wJAJJF`k9e9oG$Zcig*ykT{h~Ky~BMN7XClk<^YOq~6OY&8Pxu
-775p0U-yRh@ozGOrH7sd+k=<!){rN9(}kMaN-jABXE#Y>Q4A&xqklx8^>ttShV=oVxb;on-?Dyy@R|<
-U}{OkO!}OWBI2Tw<;|%8l{CS(iiVDa72G?>1|vd;Cn)%?A~CY^f5c7BNkukFJ!kabOP%_E%AHDxr>})
-Fe9SEOaDHE6KA&5Id(S2A$lJ=C16O`$>H)wa+YZnAo?aW=UMOV>#R4Yl<0BPk^8v8ngl)~z)fhyVxp{
-IrN~7>WXXJjD9A@~++4iYyyN?8OqMj|bk9m9w*SGaa;=PYZ6-Jy-*!Ch!&D_uwn9Nc3QsV~mvSFM9h@
-*=R(ift3_}it%X+o?dL4xH2_L&{4HD}YRcnfBiOSneO0`1Ewivn$brx^Q>`LM8yF!I>OPQA>zt917M`
-XMg36`Xryefxd(NR$2THdcU5(6f#;a7NK-lu2q^H|CQ6wfP5iyTCPiz&L>U})DZzZs_mU<su*;F;Tsn
-Gf_unfMXYc{3YNV&Yt4CI=LV_tNPZoVxDadwYT3e2oT8dgy-3LiH6fK7_Jtsf>PQZY%Syd@{O$=BSjz
-R-^0V=v7^2NsLO4%zqqMzbhC*IC7P=t6rv4bt}5B7pfI*D_X!Boh6iZE-fOMTo@&hGS+vwF(e5^4S*w
->(ig&V2J|m5-x)~V{YwdMnl-huP~<f%5J%GFkLOcdYNnu!awxJ+sKIv$#2A%~;!O8IZf7zPgVY<MU4e
-RbmvjPwVehoJj>~o;LMfI+?ve?qz(j+NwX6Q1Mk612FVHMNS1iK}YPbyX5Or44qM`Uwf(1_Y>f}ijQ~
-|82Q>oyG!)Yu6^EegSZ<-4g9_SOmxQm=W!z}=$)(Vl%G#f;-)y2qb-OT9QCs}1TtpK;6bHP@m7GK^<E
-Y#;y%T;-kKXvrTzrX-c8d{~Xhb`}Ib{UL|AlBRZj;P~{E#BgESa{m+o6TlLO;)vrT_1W@P_6sQAE}e@
-RG`rso#Z=?z754gD;9dfBNwDGP)MK?w7V6ZK>2;FcfkD0FD(zCH`6ATu<_aoN51p+v+`(j9`EI9EC2{
-|CY`C{N}`05uxd;1|DULn`hZ8ITBN*&_^gx#Woi_XYS*>ZA}PEqN%U1RHpd7?k9^z)@myP$wXrKCXWL
-{F7h|cA=6m6U??P?93Y!o^rTiU?M`vi8tQLVzA~A=pb2a(<XGi|75R=zzeISGa098%R@;MYl=@UO`>(
-9|X-47}unjfx5^%fc`+ed!*00!k+FW1_e526RH_QUp95v6;r4owOr>&HpdsdI7u4s})uB)aky<jd*Gf
-~1L~QeLnXGUn*=hB9WQTiIs{7d50U?SQ-lnr-i~$$RAN!g><#NSm*v94#of0CJnO)xq16!D88GL<$v-
-KmogLQ2JU;oM3^g#pZ5?AYp;PBMj7AP>ji{V266LNc>QK)z)DBrnpsE9k}93rbU&qq!Q{(wYN}Mu34j
-Hq-|w}V-?~>&7lO(8Nj=zmxdj}gW`NVMIVO}FjY%$?P$@z2`jzfUgxV)E-t!i0ia_Lg?0w%@T8wc@3*
-4ndkhZgl*ZZIO+*Ns!2MCBAg=bJPnN!y&v2@->MU2(S$U>2)mEDAwx~Pf-BA&sM6gYNn1me98dM=pyT
-S*F=CZ;9Cc26pPHi+c_tohD<8P(2{9Q)MHJSxAW0xv-o%iGEA7Azb8EBE{`$rT5f4)6IP<QjsCgE!d)
-?WYpZjvl(fDn+5{KZl%KB2})ex(YlNv~Hom0m3ov=n=_NQzyHE@;moBvA>D$|u=5y{Z?=y;q-8?gbn{
-D9s07M9p1S+~t2tGOyIL&1bA}hWUjiWAB{928~v^W2^NAIvr4{-?U?oGYnx^>e*)$<n09ck3fGTf&Sx
-UcfK+EC@Du=gvrM@6Mp_9wSTPCF4zbeu$+M?#!hFbMUs3(MgB>Y{A5(BHu90yYxJQu+kc<Vr<fLVwqO
-OUEDrkgSt1hRXMtE4M#fgUHSrKZDpvMq5DtZS@n;hful^$>Y9aAy+B?5>V}gXt+|VCqbon`L3BFuK8t
-jb+6cz?1$IH{W_WJ3Q=;iCZ7e73W{{Hmf;N@SVA6`Fw`XYLK@YB=i)laWq9Xy5ad;9+rkxP2?`1Q-bz
-7T12i}Q4nbyb>J1@q1S{<Qb{X|(_R^*+=-eEl52!<RRQd#|IvJpJ3=4=-OtFZU1eUjb>MEdn=#s{`jP
-{o0}cRi^ovp9+AJaWOJg@CViSfg+z9<AC>MD^O4B(qiBe#IKmD2yjF=1CM?YK>8N*14)?tSAj76pu(m
-Jd{T3E5lY+&(=Up7Q1wVgFs>?77;T&gGlvO<&SPRqNufO^QfMEP5!qBudD`|9H3KLDIv_zWb*wp`;27
-`+w+c)BF9lh@v~g4|aT@ZmA%YBtX&|?z^U)!&=_1CE9uA|T0glu}Vp^+dNCO$QH#U-}y}1#prRE*cJb
-JWYtHX@u+K)DpZ``U}hNnJN+}u#$%=D$In;XePx2BJJg(CjuJ?hlC4#pGVYWR(7;y0>{U#Nba&N>?#_
-#nYQ07_;UYdUR;$J~0LuIN=0HGELOd33qupxbo2c;}Aa^_vch>_69~@WxmjzdYLT$??-uml}_3hrX$z
-#ZONIr0^>Ggm_e<!#4pkFv{||>bRhcLPJcu$jrOQop_Nu^E#sERNbM?CUwA)PlIylvuV5eFianU93YT
-a(<jhoi9inn1ky;ANTjOY>^K`Xa6*3iJ6SmSR!ZeSZHNzw0JI|&w|IIrA;+8s0-_+W{Wj;bpd`I<-iN
-MYZ{Tbc_T}--cQmK>GWQ^0<rqX3dp82*nU({rO@>tkrZhabw~-G|5dLwH5cG~L-x2q9YBr#8z>H_I^o
-_dsk8C<-GfKac7P#K0Z%jUIp&112LahQ=qFJnoCQuhGEpBRkC(x~O`O-3Qt;%M@$$<{PCLe+r-j8<NC
-Z%;d6anNTUBrx;EJG*Gmn1#WJ*;{0Hp?bI>X^jd+U1ygvV^DS8BU%mlV*+Py2fTbIE&Vo(djg$1n16O
-F+JDAsN1~31)HI3_}*B(Uh#4*+ytYokIEtYv7jCSKXznvb;+<=XW5LH74oUD;s)7*q6`i}_3fN0(Bj;
-qAuJhF0T4!VAv}0r0Zu8lm@o|;S4NLsz^=@jh{6$8feZF;n6tw<oIH~1v%RVsN>N&=KZA{@_M?I>Q!t
-xFugqJENIS-9T%5B`+V9iJWj@l$Q8c3|aG#5M=;jKi+RNx1FTTB0AxeQ1TE^?>M{vXK26qd^XwCQ@OF
-f4$r41Qt*yi0)7*Ni6orlxtcpYMzP23v=)25#O3Xt^Y%K>|v=d+j(V_PlZAylv9j!ZTvO%WxKKem$U%
-l{~;+{hK&=F`zRP3Rj(uTVNGUFG^S1+cJ!cG<N`Itn?x`KSmMi<G`pT=#yJKngNsk26f{f3jS8Oj7g;
-O7oQgswfi-*bm#pK=2>$6cYC8Q%26!R|fhh<OGt&DxSYysE&Jl(v_+l1S{P^sAA9y#8&gqSX8IN0mRm
-V$+TCf<;yk9lX7X#WrWJhX90QE`oP1$%t-XXTH<-*HcxqrN79dl@yYHVt62rrYP7vcD}L`<XK74~@DN
-vop^#oKzLVi<gtFED#33kLF3LA)OT$pCMxQdBZYL(ijZt15-5aACb{<|a3PWfIa{?;dtOFMLAdn!cHy
-3CWE;!ZvVxd*8V86?L;7mIr#=2i!`6Ns4y^j^1Zc4BfBq>d?+xNY`DY7?p#9l6>uM#{ZEN*><04g@q?
-g|9?)X*wRBdaI@`k4xv`1mqJ4o`YM7?0nk=ULjfS*ldz6TbXq(ZJe!v?7qLZ3`;3(Ks{dLrqEz6^)l9
-YaRDd1SIFw8hV$`IZz5gdzVe~(_C99l8Y#3=E(Xbbd0BgDybq(5**#Ck8+d_F4D_F(GaReqxoRKazB|
-aF0eJkYfKBu*mYo-#`Gi`m}oEgj7=v+_{ylhW$)5pO{86n3aBrHmCv~;z~FX7!F4&X0Lzxe6RUP*=L=
-x2y>2#QDi6P{qq~8NDQm}*m!lo3L-8J7*)Sh*J*v~eR0!qfi-l$|@Ung`y%z-hU<({%r?VPVWdp)$XC
-DG5ZVbsrkf7QtLwbh5@sS0;su^K<|FcvN-L<TgjOrHTVarmN`@vL%gnTic?Tv266JUPpOuHhB9fk#5!
-Xdb=-<><irkz-<6?_5{)Fl>ur#=en(fA$Br<8L#i*$Z&mzQ#wCFU;mf7O@Ux_sn(W;_?q<rTBIh0iaP
-gLoXhczH<dG7Jdk`lvpOF47S>^h~DXNqR;hdD*<MSY=_ktHT7;c}77_<|72IH9ARDTlY8A+dinm*?C0
-E>jfN*UE{#pjot3Aa61G3K&s7ueQ@I$DIsPR9j1z4@+00E!K9}<f(49gfqIVjHbl0Z#LNM2)1g*#cSp
-J6Ou%f!*KFKg#qpR5IZ;wQEvW*sg8mIl`f1k2v#y5lFaAQ=Bj}42OzFhR3bR|<mT2SeY8{fVi*bu0$L
-QuJ|5p@F3ufxj8Nu|*>!#?GB)F(kGEwhJBDvtqzFL-Z)}kTi*#K_sxXZ+7_sC8!Dpkh?+naGz6PyU}0
-;6|igYN_|TuiXb;5Av}=7@W2#R`l#P$n{jH!dHo5G$RwfQvl08U|=7#xbD0<ev5+l*_GMR%0yc_>Bl4
-0J=zqVS<cc^V0eAa<PvweyT5b4Pf6j06#oRu!XHKPz-3Xn*`sH+ISx3$D(i^L{hG@zGJKS2jke?o)W7
-W_cMz*M`gJ;d4P4a1#@n2S#Ze|d4hqEQI5l)K;k~uIiU*4ld91lKpi$POj4{+ZL&1fEXP~GrOmRTY+{
-xVH6Lo~#oUxB1(5ArH(Y>t$CO6U>M%#ke-P&M`WN(y>5OQulvRoZT`;;B&j)=pdIb<u3=}prK5A1-5C
-PA&->?s>WX3<vxpUD;)3P5-WoS&I^*Pc%IywhS8|iuJ@f4xkQzx=!cD2KRRm%9XPC2ImXIhu|9Om8#v
-Er_>@0xcmWqdquJQ9U@9vK^Fj^L`%BrE85<GfD@;OyZx$^o))G9XgFmj>XblwEUO{es8%(2+fKytleY
-LEIiK8XZ^AhSoDhETYl9C~hZ>Mfe&n^v9H|tHtV8tF@YBZSCC_vtVsTB3Td2zh9yH=Vr!E8~;|^I4bg
-Cj_GA!y&rrqYw3EW^Zeo?jj&@3oMud2{%0lCm9yABF%RxS&AmWfoy2TQRZWz1`74Voe~JTir)r@eue{
-K^FXn>*=lC9<{F3!%&WZVCJRT_D!*YTNdl%gW;d_MZks^oaY9*S5!5|y$YHQFJ<JphOByLCI*3goncC
-A^iq%^E4d~YEc(dS@7+GsB}&PDK$Ecldf9CzQc6kSd>XR=&TgoO%`Z7urg4cRKCnBJnF!GUc=XVK_Uv
-!9>kv*_1+0;h$+ys(WtRImOyPY0+QwZ<$^IOOJ!+$HVJb{>(CpogK}bR7S6p@$723;@7tSEn^t^&rbA
-tp4%*6?MTW(%yXV@R9Sxg8;SGA5tKGuU>nj-Q3vNXfLXqkLU^#fjDoz{pRbh9yOgufP2N&!;)UOJ)lq
-q4<FSX=`YZS0RC82KXmJdx)JC?^t1W-Z14HO7CK>;5>%ovM48m0M~wv22>>5zljGdhR}E*4Rc}Ii=MA
-mwa`-fDX7BAu6()2GbZ)|IplsDdFBM|{M=Nnh<GIRC_c?aBvQp-D%#?1p+v(lMA&z1`fe{QUX)N+0xc
-@@k!j5O98^GbXtkJLlI>9E7H6bOS8>nXtazT9VEC*r%l)|=4oyVU|q*zU!c=I-&9FAAmo@rkv5gb)(6
-WX8g?hM_^VYgF35{MnmLDnA79;wac-7QjXkJY>QES;WZGuJd=`c_}4i4?(fn&&;5P}8RNO<0Y+!5lVN
-=VU=^4~`Z<Zd~ph>ZsfpX0*iPr!pdzCk#4Ja7)}_G#V*GU^iwZG^BWGxY<<x26SiGXc;_7w;4PD&Dnx
-kIT1u>Y{*mq5|@)4dCDb-1Y=HR%{ku?8G&tYJR}c?hLVNyv-6qGsui6QA2Jb2$6;D%G*Q7_aZXd{**Z
-EL6{W|SMX9oz;9(NzsUb2M3@lxX*>^ZboZsLiI~^-Ud~m2#-~s^{i}K{wj4@TQpDM&MIR1^NxF`7{&&
-&A??|Vpr^Smg~rQ<c1ZAR_r|AFwf3H$pUpRcS%SJ9gcZ?`e|Nc1EtdefX^pDg}dMbQ(yY<@Y(+&Csp{
-H!<4M|@rSk!4*>K|aBdSAZtYC;0k&L`Q7YxXhyBvY2JVs5ecE^AM)`^Oe{AZy!<|tpe6|-a|@EvcUi;
-NMX(~Bhtb648}aJ55{L#qk1C%wEfTn`t`T)_Q!mLDOs@K8%C}`Yle$+U{4^nk~hF?jCMSuOEsv40Q&H
-2Uq-YHcu`1)H&0)|3#)y*5_(fs2CCVH!7Ou_TUxb%Q{Zw&2b%dr@J3QP0#pITZ~}KpgG4n}%ZUP@$)v
-eO-p7-JQ-Q4<aLT*E&aeTQsEXsaArs*}4)=z9qBELcYzNK1)rEWB%391X`(ieqj72s8#-K|)c}MRq(9
-1-1ZHF;^;{_8H)qHg&wf$o{iJ=T*D9$P{x!z_ottqu}GSGb@>%s_9ybK(>pzIK#Gox)ft`*t48`eNdE
-U#h^>%+<h2`wAdLIzk!_}N=Br4~JNL$C3a_HS(Pgo9OE{rPZGX>nDD#ZCbV)N04?mCGGpepQ!#_6GSa
-vEG|B8Mdm~hA3%<1>-Zc#S5VOmf=AH-)|ohx{8m$_u5iMQp1Q453BGNJVhhE6k@mo-##qiuh10ufBh}
-uPb`b{<Et_(idFD+RVM@wGo4r!a=0^Jf9rRKa9(<NRQ>^K7w2=0S?VYoBuZ+aALWyz;t+|FrNvP)n8n
-oIM#F07A2-o?>LQMxP{2h)b%#z**bx78%cS}U>(+M-M7Zw@EJO&DlB-s+6XBvuBMlme{KdswX7E;f6b
-o6%eLjy(6_8^(D_^27&GPO0$~Z4pv`}FZbfqPiuEVb!BQJ9bQzQ%<+Bgl^N!isVC%OUq%2=b=a2IwiF
-K)zcc0l?P4cQJuz1rR}Gz}^Yg2Y(pl(NRzBS;cwij-}&tF#ND)?&wJzidaRKb*57^d{J^&=@S~m$qD;
-p!tuIyTtjWRHM@11wWN>3+SaDw<=W2L<z#G%&$}3beW9Kk09E@c*Vy{u5rcd%X+O~{C;1x6;<lC@Uw<
-7DODt5Jx)kMbTK1@%1Ruj@%m2WYLBZT)N9EW&zs6Xl`L4xnkSJxB@A#anx=S*dg?1Cq|GzgLXYP&d%N
-MZj4Q=e6MdXLsgU(g=J}wHM-HX^;b;V=0MAG!o8@PS6EjHNR!8&hE%@))DalGaUoEI%1jJh#>BsJ`0s
-ShFNcpZVj6skrn|cDrb<9aW3)?i=V%FhidXY~1D`>@3N!T8t<}}s!>8ZmeS?QrwWP_9pC#X7UcTOo?u
-<}$h8XmxFj^^#ChC0hmU_RjVKh57GQ=^7hee_op_Po3^!1>;e#uuYRxvfB-fa|dOg@Z3Dysu$aOmno5
-leX&H+a+W57jS6Xie~9sysZL8Ng^hLWg%0-M6L@@P(3&pkKdx*TQBQpxQNm2OF>p1`ES_RpHx{19dFM
-`SBCncsjLbI;1S_wj>F<)b9&LIopgH}s$NAW@E^}=I^x1{cTTD@7={ej0fnqg<<TgX5E>2$O7whkNiM
-+H*%MN+^&(u&Y{LWRGbEvm5Zj8P=R|wx0BPX*lpPOd_T_j^U}3xlc`u(~FkZCqA=;~uAu!>yDMef#m4
-+<b>)3Rg*TDXG1mvHo!I^V>5+vV_9b01p#Y7@YrP(>)JeiK6KSMS4Z?Y^p_#oG~GOW2~iwvCWq)elkF
-Qzh4W(tSEEH&N`jGXDr@~8}S4yZUiC@7_CD4h=3zlRcy42tvo)Nkgu3Dip^!yysqmHVb5CPMHiV+G-G
-+=K8D$*C0ze86}t%7OV&`7amdzP#ZrVIYcutrWCjmLAFanVf`Xf{6K1Hin>MD=a@da0bS$L=3pGi?<4
-krl*c7*AHJJ>9_tlSpl*$b49=P)m^`D;>fI>zEz9?r>JLFzmm)I$M$Y@*XPdh=L?}7dQtW@#v8z`$h9
-h3gNZXgIf3EEoeNnv$OsrcllU|2xfiGNK{U*U<0;1^1QyGIXfn@tt2;%d_Ket>@%Yd<ctuS%`kkn&`1
-Ol1lS)L*^Uooxj}Op+nJYHnt1e{0iYV}+dJS8!=Ef9kYH%4?I<iwGg4}3?@b=cAAR;3KvX$Q~fJ$J0^
-x}*JLZeW22QB>iA--n7=XP9vDH;?B&P&6r@o-GlDi(z{GUKVs0O{&k2{hr505^yr_0)*TCWe%el+<0X
-GETUyh*2*3L7SPVu_nU9E;5)=A@#Ud+UUz|!6Sxwj)EX`wg-!SgnpSOCmRciWCVd0>zL~KY@qWvGZh|
-RYRj9%UhFf;&<-3U!lRL$NCZF2&*tNK5e58zzf)p0Ok!pFhCazB1NN(D@83%VzW<?~_J08`K2pT3Uu$
-^A&31u5E%3F0bD0;&d}9i;sW?_~49Ru&8cJ}3*6#HOsGDz5+-XW{Bls)J(MSWlN*HC(f5*a@!v{$9MR
-lvuvS$5mepJ$;Rr=d1^;0Wn_!vm%Bf9CwTdpZu)R8b#+_;xkp=Isd{<;-!v^O6BKUme24SgH9g`HXr^
-+#$3g<~!&vQ;cgxq0dsNY+cdN!O8N3xiQ0*{CAmwq9^bg=yA=m4_!q@_*-Z9XAh89L@^NUgI6uf0lT0
->zWu2T76w2be3;PED_<g{o#o{ixSi?4>aW<>vq#UMJZ5H5?`>5shcG|u*&$nDn?UKJVonV6_X)&(?Q&
-F-~}fFNWh3Gkgk61@45YKpo_`CzPjdm$-=ItqDWeZ-L&ALzzrex#tK6mC(&@+PX{}E*u$@{OTjob@r4
-;4Nqh>CDqllItByhVc)>7O!2pZuEsLF*R^PA`6lqMRwkp;V;TSYgzk#wVYtpcS*wSe0KlotX5w5SPul
-UgVYFx|ZTDha-eO^{UPdi|+Vbc-37e|dMRldS<R>qu<dghg|(}szX4`G4!X_OH_iFIRDH#p1bC`yx)q
-`k3$`Pel7J|!=#6#tyi_OY=ccMlH(9-oDHd=erZACr%b;zEcn<Jx8U$+Hap$aT)Ez`i}!)B6bqroZv*
-PL1!8o6^rrao#^jvY=-e{~iZudZ|+Lps|j&Ekv103u4pk6gFp&kYz9uc5&z6C3#7C3=P0$6v6su*gx5
-|HA_$C=;x$N<%-@kop9U~rGsY3z42f^9BJ8(blik>jur|8w_<tyTRXE3$nx@p97>?#d<s=g=F>qssRe
-QVjbc8nDcd2Drw5hV12hjMy|gdJt>`Ptc1Xbnh3BmWMsQU0KQ&irG1(G4h*YkD&N=v6iQMzqxXHH>5u
-UE)8C+da1!36^gxp6<;wyq$)Gy3<1UvvS=)+RT27RI>F4hPZ<}}CT*JxohpH2Ag0AB^0(LS}ujZ!-fH
-fcc}Yg8J1`L4MtrHbd6t5eh97dub!mzt`?vuU!*z2l=@e?=SgBG5`8zl*IU-ucT-ymB-A*yrBzGjF_t
-9~8b@K24~5TRs7GAGS;%bW$69q{zcQp?IS*WP1Z*ffVh|y<)kh%aooDWvyn@$)#3K&@5X`Ls8y4anAf
-MTPJQJc>=F+-^oA_!i%WPO1EV<7fLuVeoM&*Hp=QdQZ$Tw)ivxfEQNPAN@`zmse|Q`eB`$(K(IoQ0X4
-LFY!!+-I|1Vm)3pwQL|>P#9Ol2~v-6jyr@*f<2666dEFI{Zp+qr=Tl+YXFazCL9Sa4ogh@zuirnj+^2
->sH>aY{7IcFFT64irk&D8aWND$SOX?(F0wUKkiqUYwV+j%0Ad1p^Di^8U?L>b#&pi4{KlWx`kkObRUb
-Xu!8mr04V8Z~{U(uGYxK_h9bD8bTl#&flnEH!hYi(sWqEjjL%<-TG(pOPM;mV%_4M7^YMWul8pY4D=o
-Mf5Rs(*;U`A_xL!NWAF#o4Bsx?DpJz!%dQVIzx+heg2sWe-?Gv?9ZoKXH3yN;LR_n17(R?Y6a8FC<Sn
-ADbi$L0j*4eLjWdC!74+#mr=Guig+w4_&weX^w>&?2}y~SecufC-IR0Xht#A_J2BsS=38H=1?9=ECtt
-?6-O+*M;Dd9Xybh@JKIudz{QkAJuJVR~6+R|_(ctnWG8M<CUgP!GX-YdiPIu`)Q6v=Ga8%5vD*X#3r^
-NUZs2RiI8}$}#(%i#gHaj2p_o0S=IgC(9UkFSCh%oG?=u8xg3gz;2n`<wTxjlTL+bfbmGOM^TW&l37F
-gaT!PBFtND<=&Sr7LBl5#szU=5ff>4WZXmep2iMRLW-ll~}0Lcd#_x{$%n5bm|T1ldLyp8yFnaes(fH
-J2N*xdU#tbbn_h0M_k8&hHfyh`Gl`C`UWhWOZa59|Dm?KiwA&=7{>DtJbq1-;I7$Q`}qeIzqHHiv5QZ
-y6DUi~bz$n0$rn9Rday3*x2_wt*7X7udt+p_Gdy~*<4zdE?d{sN6W*BFx$<7*eJ>(wpG%Pv+=Og(nxp
-}(j(<>Q=;qab`vWI5r#J^NNmaK$N5d(Q8@oL+Lt#3ERh4x<_yU_lbE+8Ukbb19Nw$B{$7ya)i5F!(Kp
-2NIt1Y~^$%D83Uy7(0^zlFV(+8#me||ZwRq@{4T{C4WI!;pu&KQ-jfeUXWQQT2Q=s+^)tAF@kD69U3;
-&2xGa4pWZ+uPdaEsQ|~<d^{l{nKCG4ho@r>F7tUcJI_<WT$q0{~F($q<hmdIgYrbp0RrJ)ZClf#gF`l
-qVi+4PV>Q*6V)CCNCk2CfoCRS;i}3T$Ke}#zCP3CZPS+p90vN?blSquRIpdo#Aw|$BXbu?eixX--D%@
-!M8V-Ttc0v&21(H%Ho7Q6BVWs(8Uk6#&Wm@C8U=Xf-G-ELwZnQBhA^|2Zg-0kn((&ag(;-vy@(bre3~
-Kw0>JY?0DQC~C{f{8J0_*6pop-i)mLQkW~)xLMTUa^>zzAmch;h_!T2N{MCaK6HueG@;T&|8-6k*wJl
-v@zwM1o`%G`T?J-7ctpoFV-YT@xU#rV|mk8Ub{tOQJbzfK|{NLS%|cLHRR*3nVNN~oxCr37?z5Bn|~x
-iPI1EKg9iPdKZU<wZQ&>`wE3A9fPh1CV%p53jq9dwTc|9^pPewMDOSa|Gtew!u`-Gab<PI3+iEWq&~L
-39gm^O`vkoY3)G%9pCI-<VCi;9fE2vkWl8PLg6N~EV*D$bEl5n+`It#X_}mzBt3K)Ro5aZi_I)I_k=(
-lfO($1r>iABE$f&XS&og@+TPyQ<HuY3`&&<*Y(0Hy+jO6MT)ID?`#`PzApPiiE$V33Flri~=m)9<2eD
-G@S0PmryS0@9tDBq?4EG71u_h{_y%$l586)Nu?r~N@4T3W#A_cgy2=pB`yP9Ks@xAFZz0~U;))JZwIT
-pwZ*1Q4{TJgL_4so?H-%+&+IxCYIjXwQhTp@Yws2tM?d-Dg#O(ibK{(`uJ3Nxw8&$7V)8lzbMB)6%Wn
-gy}Er|~M?u<B^{2s%ZY=njRhU}gJ61bxBet{-g5@(M*<<`p{XKY1+_=M<=q!eUJ>^&#7j>@}H=`|}=B
-aAZ2odY`I=>I`x9I<0R;=}FY<N7-rJ-e9J@Nc(;$CuKEHHVa8`B;M%=Jsivos+?c|!plU!skb-k@TQL
-f7AsVshnw0ZfbDDSSeS|oXn#z4F>^Ux-)PrM!s{R%p7hfQ_G1)MXQ*e2Hif)bNgTTj+}1pzwKtYfO)e
-hlg>vO}Z4S*+e1=+Y*#ZCTik_o0sX??r(I;X=J0#!r?2Y<y2j|c6y-}lqM;UdWgr@H0bfYR35Gsth=j
-Cub`h~pnucWvpcq7EcEF|?!+KuQ(nq$?dj|Uh*z<Hnc9a04e$nJViNON^Kz2q%Jibt`*WnIwHvdel5a
-&;rBo1jBF-cTL5QC+do?&$#8*(g3xL&XxTA}J{iaVj5FIa}mO;4T1QXv=;BKNsT`RCDTdw7JtsvQ<Sy
-iQm1NX7BRxyl^sBF5~l~5-Z9JTD#M%haNrJ+3R#VW@8VET*F*bbJ-j({wJz+0WZ-2i4md)RbdF1Ms+k
-5NN07WV=Y&2kyo0&T9V#EbU7ciP$@Ey<?vV@qzF~Cg{h31uM87SnQN369KrCWlxyo!)GoBQ+O=zzHc{
-6^Pd01Ufa>F{m$G+KUYI~csX7s>z9}D?MA%nan@Y`Tbt_0#{=QMWHexA(S4PwQtiaH)2`OUtKR8{c-H
-2;F8S6wbSdQdEkfPsCaof?`5n1!~T@4?MPX$MtT#{b>aQvEvFq@Y68HSb&UxCpDSm1sMTLV@%^RH2={
-9e`4iDrH%cm0`R2^9YHBAcmD2XP>ExoRDGtDY>g8OM*Au_hd$EMBApfgFw$v9cgHD-mxIFPjL4h100S
-u{?e-3Gf4)3jbjSE;)X4PH=K*ri3x2C4f#2sHJ@1J41FU{-Q`_-9f1X3CD6nO)4r*Q{ofFn5rYR8i}g
-<6>|lAZg|aYa*b>=(kXncIKT@Ao^RfWvk;*Ub)>_Ei<?#gEERIkhGRjIalH~uMN|EL6{Z2~%&GFlj>I
-g$-YT;7ZkWpfvEU`c2=*YvGNRv`>2$NAmrk<Ra87vtIvt%U=Sr;zUHcaxM<tkW6#c8%ihgcdaf$*XOl
-wE*tR`+p@XDqI?F`UHyq9!Oia}bOuPYB>_jT=PR7<A#H~e-+Z)Y{956a(4iG3g(zdVgmSwn;_vH>hK9
-VTL4a1R|T{4z`Z=REJdH7pZ#K^YyRg==-BcAA3M>M(tq;SrP5E%bS*4#q&oV%Aiaj__5QDNgAmhG+HB
-=>Sb(pg(7@>=0i!b^|a+7;^&22K+kx8yXMO?0SYRT(c+i3A95_b8vc3>E@4W20~mSjo_bD2Zw-0*`Yw
-H40SJw)A!)0p7nHm0aZ<x(O@;v!vQbhjE<gu<oBa%;t^ig(opnJxll-hhd@#~ZDWwxVg75%rwU@pXW5
-9%c>r6gFBUUjt2!z=zskO(r>YReIcXI2TvA#@CzCtsny_1R2M>j*>1$>j1@Fy@Z#1fP0>cSL)*=sVn#
-8qj__~YXbar=uM+sK*E;R?ffc^JLRrEk*0*<w>R6(ctbeb3Akv9FL((3}Rb$Vo#+H}d})pMi7)gA+!_
-GT3A?d@znh#qh6?Crt#-S%eXg;S?fe~c&f9kR{dWXrt0J@aVu0Y9Qb+w=(Dic-6}qI=NC5mF;4B;6vz
-Q08do8mU8anw)G!X^X7tVv=`H%nvDZ6y#&!Rx>4A6t1MejW;&1Wc`Wo9@Gx3`wBh9SwbiDDs&0W70{D
-tEkj46!HoEFcrqS{@Wk#}nYe8*yqK+sWm?4q*1Q%h1_2;~#T2dQhyh3`L3ji5JelchPnS|4zu>(?(ZV
-lr?YW9`o=(r^WSx$IL2!+cZ6dpPX(l+0a@A}t5i6WOZ!Sl(^!;BMI@&vfR5i%nWrLl~hNcVIF)*4X74
-eHPCmmE=AcuZzDD^4Eb;_e{I%uitjixwj_2v{@f!}m;d(c9r|4YIiMUFwEDZAd@IxZVE#(F-*Dy#&w(
-C`CF;0G<`EUaJF+htq1a)c)u-I!-$43M?U)JHa;Ubi?VNt`F11C~oAH-beN$?_>M=fF*J9L-*ao4nqV
-Y%LIr*mi*@Z>_moOQPD9a+iuaj##B6s>>lCP2meglH!gXM>3vhz!6<ei=7?(rM<HB(*R-BtfS`RsMfh
-#9OLz;u307Yg;A6j7IoM_>R$6Jocuj}G@+(hi!u4+rWYq)_qc++vNn4+iyWsEfRoq*#jnCQRxSvz1^g
-^z4LqsVfE^boz@Z^X!iIWyK(nx=Tx*}kCH`DVsKsRB3uX{DQA9?&V|67^DG6t3f$51T)DWC)r&1`k?m
-wQxw6eiOzRCf3*g4xA6!1M-HX~HNCyAm%5}+xn)A*Fz(4bJtMO*Rf>!jpEml!8H(xZb2EEG!Wq5^XOL
-vKimZt)cpwyrO`dUR{UA=;JTi!EcAcf58*YrFXfLpPC-Nq|B4MA;tyH3oO~dMPQzYNC+h7^Dg#OaZsR
-=Fw1JVe`)98VKRUjvUHd%?4p+$`D<Qaa_5Yy}f4J{mL7uKeHFn?RW%HE$!Mx|GKZVjrlEh!HJ4uvv-k
-W1ReD#gf|AS!qXBR=&Tj4aVk>l+2WrFgg@G&DC`Fmu1jy}s!g4kY$`(KjRaJAi#8?WFo0zaME}+vKC3
-$X_+C6W@Bwm@z^VO(NbcAw5D$%LXMl;Vwg&v4Qmst$GmJ)a2=Jecrz-iI_5^1wRMkczJg7C81jEoHf6
-9N=DJ)o@TuQZN+&^by)d5&v%GyAgs4Lebj(Yf)!ygYg+HW*V&usX*X?j5qs4b3lK#C0m7Cj200z(OK%
-6QTalKM1k%oLr#Ca>ce>V6rUAGHag3WvG9w4*Xw9ChwcaU1k@VSuUrsqI3~68iVKmjZ16gC2`(d(t73
-fI@k{YBfy4%4KU^YfS^vNU51UPq1r=AxHAIE?~+p;R2Of8gm_U1UE$7q!nOkR#n+)V*)~xVmcm{qPGA
-o-i%Q$4(QZ%hsoya;Da}9ZBGhE4^P9aE=lw(vmHz@Vj_o^L1myMHHV!fx*|eY?jq$gCPK$)0|<_lwW5
-TotSYKKQl@AfTGQ8ts6mXjPj(}a=K9fgzKi79zMt<#+xOw=2=|8p(@eyVB9Cbb4HDN*YDq2kgL`2#cR
-2p_2IGPhN2trh6?B-M6){wG1$z`x@Py^@0tSLRJSSUVXt+PBZ!QpG{s_v|7eR*`Xr5594b&?;?|6WSm
-!7r9VBGtW<T~hqy6mg4l_)66>uk#=1J6c%S>1e>*CMivAD6^>L&ys&Q#`J9HBGz3x@yK!Y~6t?3&Qi7
-(L3lFX$b~IzyMT-EZf<hVZVybtmU=1C7%H3<A7oX_W=Pmd>hl*LJzYJHZd7b;=0#Py|Gn#0nODLYBM(
-U@yA9q-0(`~PWE^|;G*32Oda0T=A$#~(Y+N_Y+v(He{3zl>V-+vNR^fHd~eiu?+9T(8JW=m2@XX%G~n
-ZWM588I{rER<grpa2jD^`Ms~)oG;ogvoM%G{D)|fmnGK%`3%wCx%^L7UuipGk$Jtg`hUB7Yx2}aZ^n-
--@1e&NQPa=EIxiU7DHo*cX;IEFFX6b90Fon$a;3a4^Lm&MDgLOD~>xQ(7?Dmt$he2p3NV-7cr0!S|JW
-r)+7y=4Ex_Tk>+-D{f|M{gSGrP&aWC%F5o2`@w~qa)^FdIH<+>V7Nw4RU(EiOxsPL|_LJsg@u7QuI&T
-n-2zWi~cXa@VB?W{L<ds-1K(`X4M3@Qaay2Q5!*m^!Z3g)Sb>Z_=X#ScWw7&o8Lmi@NV<Lafw%xhtLX
-~n)tMHC#XVgFbL?cnO=sg#x)v!`mM?-PF@adr2r7OMP1GshwB^V6cW0p%n%E9%^Mdwqo<7HPfK0(-02
-Zp)6r{S<>-&`hL%A@DtPrv7Bxjw@ux8HBU2oH`Gud-Cc#Vejap)F>@Qhd6f#v9zOLfIH$|ZM9i>j}zh
-bWznxv7s?@jP#xO3dR*ZQyZpTCbA|B7ll?dxW=cxaKmb=tt;H2lA?E)|+!MIt~x+W5Zn{%^;fjpny$^
-K`HI?0CJl80vhK_s*xWwuo#E*sp$CKiYU-ZzS!n&?if`__8-Ew+M}WebZ(-?XBbF8v@OOumbCl?ke(o
-YM*FKu9&>E81b%xlIW7=hjh3*(2wJ~rf?fWi5tu>YIyo+{q*Ab{>vv%0TX0cr2aKAY9w+(X;W*`auIK
-#_B4A8?Cx!*jYqW!R;^QWlK$3yW>USj{^N0Nl$`;aqJrGAP^Ux!u`AiAHl24MVg9e0$vH{Rw^OWYOc<
-t>+D)a=R0lDt#cLULv%pJ{($>v{52TOB)9Lu4P?uw<`Q>xU6sbIk>Yd}d15l|nY43C-e8RDY6Zg1=VO
-E;EQEh`#{eJcJH{aIECDZ1wwq$zJ1HfnJ`7dt=!_j#1&uKB6zq@#U`D?i5e|53$;+p@}Rk=3(<PmiG!
-Qk~HlIh7@4Ek9Zb0sTEs2X{pk7g-`o+q$2ZyX+^P!Faf%m-tB8U<<Lw2NS|ZQ5N=G9ySB7^WHXW~3}w
-`T_+Kc2Z-ug~xefS5d6<9_)WOYF?v~0KObwHv-Vkv-i~y_dnE+-q)|A7^=VDY{SX>;ylMKn(a60U(|)
-b&=7f1u)@aswY6)L0~9sP<Uq=19)K!ZX(>CfS$>ia^4X;Z;b1uKQI_vTIBqB$Hy$p-(NdZxHmO`LwZ%
-$$GJZ$V4q1mnPP}Q<Cz4_y)#k5tfS=8JEkVjl<)~vaR~SfKDa*(6%Q~t55yD>cAFy1y|K&o`%e$**n?
-3SOwxWr?(GwTW6E9{5B|XxPxr%Z38p5`T))BE?l(-ZA20PPwTWKzxi#wC4USGB;yzn+hnWy46gzPd=H
-#9<{g{)26hgDr~nZ|?-DaI4no9&MW@hE%_U>9)Ze6DU>9N%+R>rAtM&hx48WuqLB%2S5@QB|-t=TJZ@
-E2mkCxt>k)(@R7ORypNT8DS`%!nHpJcrm@gLJc&~^RDv3?)nB|&2b{)#H%JG+}%E2f{q-4(V)fjQzmC
-9j$^7r%$%^4gy_#m%BK<mRVGdoXHVHZnai)IL`zhe5oi_KgABzeZk;mlJoo^|-%)}006aOi-4lfOcK1
-4NTvzIr{5X+Sr%M<b<*0+<LXGPPfk>^X(u@0h(TlyZFeC{HV{+aarSj@VStN~8FCwM+V#NUp`{+6rKG
-=K+=Z1$7HV*$9&q8>P2MYKDt<g94Xrc4&I0uN18s}p@1JKv}e=$#}Yjf&N04L@EhyH|$xJod`D04KtO
-DtGEQ0GfGwQA)cts(m~Dq|lYJ7d|*#opOf1ChB-UHa8uj4$*a{a4a(Q)-;~G<uR3c(8?8RX0>!vAE-v
-h7y#dB;}<=L3<%}7WN<*3W1?FZokhfl&%FQmy-6IZ8e`v0$B`Hnnd?f8)aaDBd0UFPEe!Hfu2)}m^xE
-=olv)A+_A|BUv6w<Db;$;+jQFR>*Fc4iD=M7Vx4(nFSJkD3f$&v;%gbxE?Qt(VEVqH;2=XrE3b0)rUh
-HVgRIo`5*%x9;>wJ>P(F$9JZ1zF&KS(vF%#xU%^jVGUHD>h97i-y12FDdi<JGM@?1?RBB{wFgzjM<7V
-=n`2TAqK4c_5&afLpXptYv+(P381irCKxzOfOt+tKD`l%~<MXVFF)ZS<pd>Xd;xfvax1E(}CCU6}NkD
-hUK_9}T!hHL}CY=q=Ez4~v{H`Oe2O^@hQ<TF<o*xmi9NWI^Nt(NoO*do{WvyX-HVW#2c;9@b(%!w?Qr
-@^&fa!yy!-m^I{WOoHs?c=|RxASE^0vf)H6Tl?!I!fmbnHT>9o^a#G;(+BY5E5Ub{5W7?V@$Yy~{6Ei
-M{P5)EkNEZ3%hzN{i+}#|^7Wgi(z*Dv5Tiqk_<2DGJjGgHo<=Vn)*AhYV1LkH-!Rz6m#k!d17M-b-vO
-*2Jb?1VmM$l>S1s}|oIfMYhxwKa9*_j9y6y<`ScL+9z^pvWW|S|7IeA?N0s-1NL+yV`)l{gLdc(vLSt
-jL6ED8lmO{dg}PNK`*kz3Lvy>n+iL6b(~Dq|Lrb;?%JCL6|V`3_Juev)AlJUr1gf|3ts^<ai<l6bIL0
-yfx+EC8hOY5HzV)9B!XxmD@10Ns)(Uf1YEGrkzDj5ek0`y{kE>EBJ!c9Fc+Q<1%E@J?0Vr^3#WMDK?K
-yZb-a87t0>1Yp!nbUmwYVNm};m*wf1d(*^wb4o8Lfs?g*mti`&@t~nLz)};7OIZ<}e!}zr$u5z}n=Tl
-K2s~Y3e*)KqKGc?-l<)w<<)|nhg3~AT4{n(2wQh6EUU0^iXad0hsY{&x$>4vb)TfmBzDJfLjoJ+ZsSE
-=o?YnB*q)%kT;~M-+zmH0boD6A%9gWgt$_`2;>W&6$vByx-A;?yFdcT%vFPIM9Bp;Vmpz0D~sWN?Mr+
-%MI*DOxEwb1BU?eYPXdcAjoItsK%P%4d{)s5JqbbQxo(hT6hfc^8vqgB>=3%q`-vGj3t*Zq=lTrv&*I
-1_<1txQB6ET?+_WV|ovh{|>>f5#=d`c}e<@88yI#^{?^gZ1v)swK4uuqIg!=K}kRG{kk&_T6F^bvLSR
-303{IOp#Il6I;F?YFc-7My;z?4pM<vYByGO6H`=c?p*7eO3l+vHwjv+2)VplwAj{MMXZOXbXv=Daw*|
-W9O~L_F_CflNjXKg`IK&nP@rc@$AR}KBlUfWy^}IRu5Zu!ySVx=)$lk{#?IRy#!j=-o!a?qHrcv=-)z
-9Gi~McQjRPAQ)^^RC?fdC&gl}QfKg+i716V8OuQ{YP_IRN%KZP+{ub{IELbTbO&7nu8i8M)-U4k>JwL
-QTU2l?o&Hj_@R{S;Mf&;{<>F4Be89X&0d=MXzANEiPao_pm_mcOnFbxn?<(%f$E?b57>2l?A9sv*H^7
-zOEK6rn*ygERx20feK%Q^w)KHBxt4Vfz8Zs%82D(r**p^yn$JQE?=)W6|7=mJEAH2V=#qNDD0{39nvj
-fBRfZ?QbitG>X)#$j`-T#oZTDsJmXIsrbPMIkSRhz5yaAk8`2{E>#n@Fs9>Ba_=6_4BQH<=|Sl_p=T-
-|seg5#(v4g7wK2ynbSh?oXjI!`EUwjko7cJP7McOWa|h*XcGw0iPA|!oSs5)sOSXYj-(mEHX}St0i@G
-98I(<r0L&tpJptY#bC!E!FAb~_npC`Kt$?Yf4|8G~T*)bY&89{|Ykzwu)($5(j*m%}B!W1o)iTu*US>
-%1@G&;@E`CKkpzb>W{*LP}fSys1dIje#LDLX$K?bN1dTwZGkPiE~^ovEDQoHIm?(7k)tCS`Y`GOv%ko
-|vo3G<tP8I~Rd-=_G)bu>FV~Bs4bn?tQ4yIT$wKeK^96;ed}mbc7^4V=S+)4TdJB9X8lx3ohciri*bD
-*G5Hqi@^dc1GkaTtIaKjo@g4Va{$ID@rOo@o!Q^er1vy`FU)~;R&y1w1a*V0$VLJs$ZDvBMH>1sjtb7
-Tq)*Dul9xRG`6>H~=@0^^H1nu`*HKI;j`>!XvcX$y8#=tu0nJHr9lO?(^>D0iy{to#?S1wh$gDzhYQV
-z9E7hyVL^kzieQWQ<-@E^}ckt8GYvm@jBqZMXY>19Gz9MeBpTFC6p1gsfBuSxEE}C6VvYp!5H1F4T+t
-I^lBWgz*+xJT#oWkkk97-n-qD}a(owO^;?~*3#9QV30)eV&^KQd#8AK5u5nZSQR`2e2R+&lmylfjcvh
-u!3yUCUC!MGPFx23{6S3E5&7pODMYyYgYn-3bIOg<chZYiY&6GeQgEb`_~!HMC8RBc>35^DOPNv$BEb
-N-H=Sf_8|ay0{j1h`c8D>QrY4rByt-Tt>Z63=Zp^r-=xFx>Rp<LRPE|8Se(EW(jNBxCwFbrKPQgxFTt
-7WkK1JNM@GRoxmgW#I7bsd_Xg3kS{DWBs}W#@TpEk>8c=12_=xUFnwF0%<c8dPW(1`$4XrILQ$;n&2d
-Q=?8j(7RU9ABcu8u`;Tk~630s%d>W$e=0tQhs0iCp#%_#Ju#b8w$b}3Ym#p{cmsA3|q1r}k`(SVMzys
-3N>BrReXJe-&wa}<sxuI<3^7aWNfD!u(rY{*?gH?hdNL5e2novLo{D38NfNVDu9O}pcW8Zz7APQC64v
-~SQdgW|p7URWseBfVc*8Sa`T9y4@!|4Gb*Gj}xU{)4AmetMes&^6#hg%UG6HQ7@+auCiTmXtp0zDVt_
-yfK>6H`*D$9L&ChA77r$zSFxT0s8FQq$s&`d*i85+SUF{+uN!e5O?)I`wsp~6A_sU>aOn=>STa6U`DL
-ZPsI;11XRZo$%wqO^1Tlh@K$6P&b7^!cxOD>D~d5%!*_MGV%)sc<JQ5`XNQu9>F2MX|L~W?5_8K(aPo
-Me%w}RTXn0C4xZ}wIrDq+$34F);r^j`W|EKP=M!iuH?ZL5R)3(mQ>VOXnhnQx=%N#&AzVit@)~ZlC8?
-vuAN1f(qkiD!=eiG+7lz<6w*+PA`F3tA4(VXH)sFSFQN=**UO+4DrISq4bj(a(UUu&u4+{VsMrkjNUN
-%4@yI+n3P%?X1}_s%-<mr9mC6|r3b@9`PBCX*0|d|aQz(OhIiQSj)tP$etKY%{jcMHCmANw5gG!3nP+
-!jHpXW?R~6RAg+(CKeiJ-qnso2u=idgFU5~D{Ydp7i7|lnbM+6kG>%b$A5gqQ6V{U9NQWUv)*|+%8Ma
-6u#WK>o=g)X*ea)Jl6#3)|B7BK#hKF+6}}2btZ7Exv7?#x{vD1{tVoNzXOakOwd)8DzG^%H2v2u({L*
-O?)cGHM>#$0OiHHNk5m7uAH#eHVNX_)`xIO{JJzGS>S9Rj?gcsguK0M5(Lui_2=mE@ETEHrUEVJWA!r
-o|xnPCrfFmG~U4@H(28fWUpcY<}|L@<-x=B2Q<Q74(c)@JjqRC{GeD9G{@{)owgM4*+b?qlCC#_nCS!
-c0KIB6j^N+iyLr56H-~u$`BU(%^E$I&6v_Gkhex9>EwTPSGB8ublv=N7nG5VIjMNpy8`v_NXB_&*(}+
-(iKWcEfqyv7^`R}g5e}0bF~?-rgRtQk97vy|KM<Qo$g(-{_B>-T}&7=FUtB<jgiu-iiTa*tdov7WE8V
-2b_dXHiAH{y(Wof)JRasVG@{T;5O*4PIUDaoauY?yE%~Gf;pps7)}dm$7$WZgOF=dWWQ8cbrsAm>evE
-2WU}jBg(>Mj90`~$Iq@zA)4eK<g9C&VGXKTt>G6%tUKUrTJJDM5*NEt+wYQP=>%n;5ZQ!DM+b1-721v
-OU?&`4Zq;BI`Xj`J(7H_;Ij*SeUT4Yx|nM&0#$(R~ylHf?E~wH1ZeqvrC$#{r4fcCFeT@6q~$dtbTD!
-lQ=wthw22w%g7l00bOsj?r?56AlAgAz`{rbUKfcsJ;%BJHQz0_u$J{$H&4b&TqeCYdko%HEabBIVev<
-v5AH83;%4lkB>|C#HE<bXsD{(?abzSh0z`-<gkZT)_Fy7dCqu@jNl2$ks?SSZ>B;rS9=@fMoYYHZGsm
-6v4*oA#h8mCX*4=p53OS_a&cwV1Hv}_L|I#JE~hl$m(e!t3@m8hElS1g3e&}RcA^I*eT?0(C@~K4?UC
-A@$!lb@O6@^v2FlVE*LWkO&1c8%f?CUAw!*2EH{30;=BjMCep>_DB$EiIQ^=P6oFm56K$EW_Y2fW_J3
-G!IE9<E=$pW$ZW%P+>D%IlS%h*h*^+?mt_+*NA!aY;b$xqBifgcS5fdO#F4Hao_LX(fd6@9qXvsKZyH
-A+3;UR0%0UV_v5s)*Qfi|F^@;|H)U`?zjqqf4r?sgeAY@m~>isZYUZkfoJqL>0aG_*fXXVPoM#VH9sR
-IA#-COychc4YB@+c-4!AHoF_GmNhg3ws*t_uXS#=yx=$}bSW2_<DRpjJ~C)au8K_HYIg2ei!ZerSDgl
-2yrlxiXig(0qnZDP3;iM1ZvfLJ>(}Cco9p)`s8nKbt83V_A{Uy(@#EL<LeRh88ZM=0S<;9);boP_w|p
-j5mO1Kh+!iWB4nawo6;+c4b6>=6EqC(<aV)?Kh1{k=85s{j>i1IVNO_`ke_vT$hIb4onY)8zfzA?i+E
-8~IP6Z5}s+9%(>3A~H`Cm@w7(Ec$9b{;Uz!vzfaka1tRbeISwfOt3&d;@@(b4qi==chL)oKm==je#uy
-g$BrFT-;*8jXAP#(KS0FNG6v9R2&_Ii9=7fDk3E;%o^fwK}y|7ns!R%P^@m)@$|JVoX$E0fWguKNmr+
-s@C(Z_Rv9}l^d#usL}VRj^6O&epc#i_aLs%$%Hsy%`F;J^}Uo4HKo{Q^&Z74;y7|UwYa7XW8r&)vfh$
-I5GBA&A{*LkC)DoB&hFeW$@Ok{iGYzG!4mmcW5AK#1AdYAAXGYuMzu0j1<GrhCTv&+_SF(NNgW5YcHQ
-{S)pG|mhq@sZ&#!5W6jyDianpvBuU1KULs#`AFDdgzhuoq`98{|bvV$7{iSOtFHeiJ*2gd@J6GZEV$Q
-f3`R+0=Vxbwb>u%VI*Q{S{5UE-^w1q}8|O((=X(Gbwa2^AStG{lo^c9CTxfi%H$(gB-Dq>kP6Ps-qI|
-AVE}wUgRF-6TkrAenffGEc=T(|0yRM7;9xCy5SSz!^}HI4}`rY`KY8s=5p(SRZLPVvDsz+fO=dLg$pB
-G|(P3F}|m=gdD;+=B&1}{b7ccj%Z(dIkhIEG9QkOAfv<e!8jkdGlEUrNM0|c<zk&HQ@PKIEQ*_oMsJa
-twpLxON1!@AGscHj_qHl*0v#$afdJ5XI^(F~NW$oJFb3)~8<v;cS#Qvla5N*f&qT;2&cO=1in#A3Eu-
-sjwO&WxMeB71KLhz>O8QDKfedut#E<gOT<2CT(1TZduanpChwk(zu~y(FQ7vvr(>L5Sx_B*&K_cufQU
-8FBs@HXACy1T7brtpA%q|DnK2NWP1llzU-<`<AHLl^`TBFL9Q*|Y-k(XWh+@VWh59Ls}X|#b>AOUxd8
-<<D+tRUNdB1a`WLkN8V-w1R^g}jX2o|iSQ#dtpLWnJ2l%cdncMGfwb`+Za`NADZahcaF|Q|tS?o3L3p
-udhpmOW=X#-PyQ%4$=(G_H+CjYzN)`=q=_zs&CYzFTdo{m=>x2Z9P~?B1r!C1ir}`iD5N-SFUo+y2vH
-K+8gUWygh^$09Qd0No?dCICLm*h(UBC;@Y7KT2IvO#^jC!Ti#tVHEa|OHnNNE#^l>fh7Rl~99DeuSVu
-V6x@xCWhhMnH-pdH-cG&#VNDwSelnJC>Qc};3a?zR!57E%suC%qQKq)Ad=&cA%uI(D6m_fX=mQy63x{
-4SIcPyM>sU=Z@Q4G7uDtN4BMnIerl|bM_743LuC!kA0JgjW9RC%KN13XG|d8>Q)mw>ds@cgeo6c-Q<f
-6q1M>x}EVYZvh3>9f6`4i3A2{mb*ir``R(?7e=I=qQ3!?9P4`2dQmwjKxL(P_@2Bkb&dnvXH<2@%{Nc
-y$JW<vyJ)USOfa=FCC3hPu6w&$b{&=>Gb*YOqc)-|Lq8}qPncaQf<T@t*FyXmW5$WM)#CN9%?rKX6a^
-fh54?PT}m-&F7NG#$ea`c+7(s3GMG7@%X;v_Q3!6*qTfh$E128e<XcjQTe{4&G^@krtG66g*-OAW)5d
-)$S7!akgK_U|e1d=9%;2zvL&P@+T;dJpmC`>J<lG3UJN&aK1K}uK)MAl1j&78-fPMJvsgeq!pWRFaoH
-91dO0FbXb%8ZlscY^r-(t&QRVmS^DotlncP~cI-AQIFVoU@=rY5&$Gz*r3+Imd+B4Vf-jLpr?jl*=5o
-@EYsD4mzna%|3}20e^&_gs!+DZvCOSe2ShnVUI4)p5HxCqG;5fhh29xP3u-j>m(HqFs>^Jm(a%Waq>~
-rI)v*Np?BrfUQp3r0<wd(ZYre<-Vf`tw0ZUnx&|t1aW-I7CvOLXJ>*-9zSU-Pl!Es7?r3gjRg96qsEy
--<nMoQ=Sg)SLkjrio?>u4?Zv-3V%wgy3!${68yn)u5AbAfQ<isrJTN~VJFPr^9H+@i(sP=6{8+Zd#r9
-%Ph&(w-+x~-1|AB3G-+X)GAOK5x7{5<0{p&=^({OfHcvMgy<F$t$q?|n*%QdnSbwn!0Vm5U7y{l7T%O
-y9Gi&ZKJgK;>DJb^Pe?$5P8`j@Xu0OraK)vMwF9l0lHTcbhy04iY{ocP^sN^1{X{)&A`0_)1)cWQJQ7
-U6XPQ1pJP(+Idbp@v01!5Wy;QLl$?2N`NZ^{wHzw!Iz22KtpG;FSpKX{*72!%jM6xhRCo4&tI3b%z|A
-GE}*ekeqe}MTX=4d|>o8R`^12q8M2n9!@i)ov7l(YsA&vDA#CB`1o6$Fbrl^UD}>uY%}q*Q;+ey`YZl
-v)Q_E#TW-lteXmXF!<@{-8yj%UrH4P5hkKj+jK0vn58#0Wju7q$BuZF5ejGwGrHp0xr?(Qqz=0IT)Bu
-9rBNMY&SEou?0QnFjiwwwoBg8%2_hmEnCrf&QoGH|o_xR^>m2Md9k&#*Se=YR^*_p!k*v;UAY_NBp_1
-?b9vMF!PrKoUtoJZ{vWms)&Dap*L*XGmxF|J^WNt_5yhB^m+`NfXpC7ovbxTG;qC3hDW#E<aHdj_+A;
-5p~zAf=q81Fc&3bdZZY578fX0(6L={pqDvvl<e;nV(cpXcZDH>6m!gN+%!>_hVgi`BA32JH`AY+?k(7
-`R$K3v>D6&k&aVbVcYM%^U|9hn|?OtCEXlFbJZPb#ULn($&?fYUK}_q*U1TDbDD6X-`dd(!yf6>r8@u
-O^A}H^zCib*Smh~!ouMKJi#u_|jc=WSsEdSGPoKVyyu>FZFm{OwFbcp=8l^=5^q7n4KfQ49$n`l(WMC
-L7gAAR2LT|?}4t!0(+P|c&PWc?;msfOLkA(h#Nuh<DAPg4;k^s2-p`+~$(Emg%xb<>bed(YQz2M!4o^
-#Ggmoc?N;~vp4^eYRE-<;$qqo}ME(^}_f<9%<V34i-v;h%5t>nVOc<*%p5uqrS|Z>VP4#xf_TSo3Qv{
-WX@pla4N5s`y**b>Bu1b39C|f)Z{CJBm7n6_}-Gb<F94PL5AOAevqNm`);2%^LrjPvY7c9ByDG4=2&+
-q~Pe+Q92nHH63g$sqb!o8P$&J2#C*phzCP6iD&9x#^1l%&gkK89cW#@Quzwpwp(wrOI**<dad!DwE9p
-dO3IMQV1OJV;=OG%7QugH=*+3`NKuud64YFWPJu&ZK8;j-dvQDL2Ptx~Kg(t@x~Spr2IgDJXY~TpwU8
-<1Sw_)HicH@fN9?UQpJJ<1yhCkL9P2t9qTglHONAdLPbS|fD3%QdG}u^h7^Uyhe1HxfcbvPkfOXORqk
-CjybMN>HzkP9^Y-?~N?%kKBO#6V;<-ni_RIX{D!l4Y#x%clytyU|#cmKL}=MIv=wyoRT{-W9J92G}zj
-_-ZnZ0^eOB$6*}0|8JgP#c@U1gbAjah-}*TF{Sj?kn3AR-&UnRKrPgGI)avzKrhu`(%oAG`i~id^9>n
-`dBFU@2^0T`-E(ap}1ieRc$s9^WJ3gDFbvBd1%WKTVG!|W-1<@!tvmPGgGVqg4e(`V*LxuFAr_6BX??
-V&`^&O&H!llCBc}Gj?IIjJH6I&h^+N-tIfc*N@~+pe_CV{H02Sr_TrmYW}&Jl_0`nr_LxrqYtaz}yjw
-{TuRlhQUrTCAudntYPGXF@^DG@==VFf|rq7{&HRikN8=bp`yi9jI#e+aKV0wm$swB-4ZF#a&tEsG2qE
-)A*S~+6zt7)b@45fk;2B?jbZHN&P4e2SK1f{EYb4z%+co;b{j5%Z*cB$R(uN>`|;B*b>E-F*6*;aH7*
-eu$da`Z^fWg_*UO=Y}8(XN^p?Mg+_AX8O%1slo*C&`5ILeFFEdYP*@i^fy`4p;QC^A+M#hDK<qtqK}%
-vNv$hN{U0*QO3tn^virWX_~-tY7^{Z<?&=_g-P;k&89g;#T^z=j0U&lnpbSAFT2+X5EFY<Y~x@4UG#F
-+qEOge(l>9zvo4n~8efGu490X!x?}S6HVPPM#C+d1@zO@w4E^yjRRi`iBeZ_p+ut6hy{>x5SUi9A?%{
-SmdH1mN_$z$;m3?e5dj96+H(zbEp;R9x0U%I}@i$u2WV`I}%CBbmFmvAG1B>Lrho63W{$zVT&-?Nr&9
-SDPzBtFWLlaL`av}nlK_Pz1&d`VB=R6KJo}Bac85&(xynB*j7?{de*dg~d-PGCOh4PgX;oN!S1re{z0
-$O2=Rqa5zM&Yl}_J&f_p#Fer=tSgf)JHMk;4nA_wn7=uFDLFDfvYqJto;Y;{(}dt_QUq0Z=GjfwKg`h
-%?B>ztl4(;-)=sLQjbq>r^{q$_ebrcNSCsxpJ<T7eJd9B<k_<u5qQc=X;I6%jMwgcx0lTa_aEM*<zfE
-bx=t@@o(fhWaWj<KOOVWmn0zln9#xGvzOBqtLNAfg3AKC}!h#+<?GxTARb&&tG~I9dUAbG-wy!n61s)
--1TnBzg|7Yi2(|x(VprXIJI_iNa;xD!iJy_p-Aj-IluR}kbTva#c7CzFg#r<t9>~ZV&=yQm3IEZaNl8
-I#m1A#Y>98l#|DA!zPqa}+wi>=e#XnpMht6JE?f4(jI`LQjztG?6r@o<*gjh0#mS9)AurB1zJ?Ir1pF
-RsXpC%Lxh)#9y`dUW(AtZih~z7A7C;fmDJFjp4$<u*wOk}cAlzj2#tR*5F<+A)oKslZGgFg_!xx8+0z
-K79;w;xt2|JmFHX0-XbL=qB~DE>xm0gVK@=WsDgvn@a4Qq+TYc*8=RY&9tBO@?knyik}--#Hs-5o%QD
-N_ecG8$DhvW^Q{n4H_TCo)mhl2lEnrqQP;~EZx-Bc1QhztbR_l7ebjf}u%4iWZoOtYsh>Eh+Bu)C>1I
-D?hagO2I|>XA&uYCcjK~CMrJxNTr3Jh{!wVuMTR5@~QpQl}${%Z?lQ&=L&APn6K^p~CKh$?p8xU(%Fq
->tnIPV=zQC&Z5nnvnL#Y8Ak%Au1h;CaL<=EH{0Ta^w1GyJG^)W27EG?Qk#UNFa>Iee^gF%qK0$i^rQD
-E}8c%LWFWm!vwY2T+YW+0$eF<BAY>9yPviRCGi|%`dA4K35OjaSSxPkOpg!(XJU?jX(f3?JPR>$GsvN
-<vo~tgYo#Sb|EuvMzNvhRiyrLmw~It)15`(O{-sQyLS4qGv5@RPsSsfp=wtmcOS!{3>xJ*_kDTn<j|e
-oaQ>|<ZJI=4v|(0QT7_J=#71gr*<}v>&U<(zgHAvKY^+x>0Ymf%^r^b|L`Jw_w2#`%3)@Uo*@la-P$&
-tq#+#2i8_h?@SDWz9!(((-KE7&yPyc>sC!5!e_^7qKP~*dcYuQoMVQE#D?y7u->BK?M#{U5m0|~Yz{=
-06dS<oeQ*97xbh>2kRsiEzMPP0O0P_1?`<WyIx&2VZ9!0S<5-@*;eK5N|jTFxf`5TWwT>ra<F1xujKh
-On%Scq93Wt;)8x9P_i)DoWvkTozYD5qbPRE<A5L1YRGv*@cn=YEy6q|4?kvXsPrZ@eKC%Xgm5wwWu}}
-k0{W^Q}|Fn<wO*n;N33J2@jUO`G^A}dlhW|Dnti&u8KA*Uzkb!m7T=sCYrFzXkxc?+@l*}=?M*Q#XR1
-;jyqee=5fP&`2E&V+kMpd;Li9T_x61h#iQu``z`VRC^i8r&(n7qhC3r((W(pYXTA9T8|{hn9-FVz6SC
-=%y4Lt~INPb+{d@E7uz9y%6Sg#(_24Ivt7fwN*n-Mw9i_k?U9`%&g<tIXkgVH_sA=^pAQ=tOD4T+!&X
-fZ&r&cBtdJP9!nBW)3@!s_4TIik1x?iFR0MgL_%Yg)iqFvofg)948Rp6FKlHK!OQQ?~nFln|~Yk&Lgw
-{X&JK4?o<)so5yKOKj<G1g4rter#;+KuDj(9(=}H|w5`O6FboaT2%ck1{kUjX;bNd4j{%;PySQF3!bj
-ooR4iez$rw{b-O-rq*{dJF&uryRh=KCv2Ume|YyVTX%oly8EVe_w@Fc0nN|FO98)p_T}L8a)qTaTWMi
-XyP?G~`-r7MLla&evxSS}aPz^|qi^B=EqHXpl|qfm)sjS;50dE7xBMTx*x1<kZCB9mvUKFAN)hw>SKF
-6aI^8|$!{*h1O|6NKVC-h+@a(8>9`(~pegLO2N2b^Jn+VzL#Nru>lb7&m4u{Qt-^h>tG^<9+$H+yea~
-K`tgY)rx%1^ead_J1bGSvlo!l|d|Nla%<>`3E#d^P)Z_a9eyV!@YN-&3W^J|eQAe)7_keLXxs-x?0LK
-(H&~e_X9MH#W9lu3b0K@Ct@=K)N8p3dV7m4+gpUMVU$f;I9<1Q%RrSQ9i-R%!wYo|Dk?ZS9Ue^sD7=;
-i#pi~f##d*xG8@FiQ$CcJZf(`f(&YDb(irwcJsaZGy{M1#~v2YWUEV;y%Rc>S<^zPm${0BouPQKfcZN
-Y$Z9>5GT6vP?Pz7mIuDcQvQ-`>u{)iPhtWlLLg_I1IlJsF<Ed+m3|GOdjSAKX`TBtKcDfAYx6I^84fc
-~+KbR%t@QG(4Pv$aRh2c!(_h0~}1AIBOvm6+c5d$OV^_~2j_z7$YwtZ(;pbVXy0t4vX+>Pob!r3THh7
-|SSOwfsQN(U)tvbJEUjtbnHH42=OXG7~Imz#eru(?|Ib2W!-!%BNW)kk`Qk$IxF5nI)?3xR}eM?R~8S
-L7P6SnbQ_v+OduENNtdR?&jR*eeQq67SA&uZ0;%sR)gSIpXTE6(#v7USzTta^6DIylcsF69mXE>}Cjv
-#EFE!o%}TFcF|0%+r{`CwQhHq=A&-6wxv|I*&yr92siu*Q(GmoH}jcGs1ZYEX9@?4V+rkq!XcK-r^+P
-~buiuk(v^DS!F)KPxY=AO;P043wHC#~qh-j>-#)jJ!`|>9D}zQIqe;TIg&NKz#-~M10>ZFd3Pp@9MXv
-I)0o5Oxx~4m~*&hR$x>L~~Q%H7)`H<?3x=q8~?#=%mXe`CVP-}S9C(dR&FUUgIEqZFKyO@dQl!m+y`*
-EagJCuVyI-w#{q|kc9ldRvT7;!`6T94s{)rxm9wpJpN^RHp#c@(r6M|N^Yk*hzRQ8Eyd#lTeIE=TuxO
-MmnCH?6<@{U87MySxVPsp+oLDZ(<Wy?J`@bpNo%@*KPeY){Z93Ra_DI|cxk)h!V8B-(qtFPqRY?-br-
-;>o~SyG3@Q3XsZfYvFSb_V$v;kCXj<)sf4h)t{#W$E-lR?DNo+03^}lB=YJf(IFPzlyLG9d$GItfbgs
-Q_fJ6tHpTz80JsYj#vPEGv5_ivJq(bs4dEk*x3F&X^UpscBJTr;z--cyqLvvM%84hfMjX=@$I!*MYw?
-X(T!R&h%1y0vmRk${cDS!*)mMd&FuAcHePgswGelcrgyvv&6B8K1_x}S>O9KQH0000808trnOkf@djb
-;G=00jd802lxO0B~t=FJE?LZe(wAFLGrqc4cm4Z*nehd3933Zo)7Oz4t3Tc1SwWO6-WlXY7Pf6u>PWA
-+3^tK-$O8Nz+nkEQi!_-gBOxOP9WL0XkpM5c$Ux_SBDIYr6e}I9&soqBx;L*f6#3bvV^}@8egF=Oa0*
-FDR92$e>bXSrkWX;OcdYvRoIyt9N9BTztjc8XQ(Pw8zfX{R6fKgWCQKiQS@1cve^Aoq}BDY6&z}YdQy
-w1+r0;As<+Sj570mTv^sk_;*J(p_WW8Cm=Nwf_yBLnX_6+QF5bpm*5a5OoF_Fr#p}b&4FzVLUdvYwhN
-r<_2JB2CnP^~wTA3jz7Qq23L7Fu0|!SY2dS?wn!#H^)(35jU`iEu&-BX0Og1*$gV>dmTcaCnSsZa4Hz
-_`9Y}<-#(}`KP|8!cgQA)*FDcEd4C>8Z6B?c;A8?-V`PP_J2!rKNupH=hkFhWPzcC|~z(tO1ep68v;X
-kHM8K4*;4u1xXx_w8R$O9KQH0000808trnOd)%`3eO1u0Q4pR02crN0B~t=FJE?LZe(wAFLGsca(QWP
-XD)Dgy;}co<F*z5-G2q){4hD^Q=D9j4%u8ZyGzkvZ89WjZ^i8(&=M8%PL?#1ieq&B-}fG=FQi1-xgwi
-!xLD-l=Y4;Cq<nNl-WKIf@Q1Y`XN%J}ui?M1$SvKGABrqtVsdl@|HzL#X1Qbusd5-3YR$++Nn`j^&&<
-g$Oh{hj<Sbl}012k`)O7Y2gxD1o*#K@{C{jrV7+jK+XN<6?n3am~oW#YZ%s9<sMz&n7HJ=(KM2uf+jA
-ErIkW*Mt!c%G!5~^yU*GiS=CnwwOHl$kEun-R?nIV%WKVH4PyuQ194FcB-e$F!{B@yi36&IlFYDZ`Z0
->yL%VrFzp3PI?DU@)f&6nHDR;`zgz$Rbr+Dj32fTq?m=m2&LWhzDBR1Yj|mlj+4Bxw@N@zg^s2-OUl?
-{nh;sH$UH#_ZPRf7uWY!mv`jmmb|^Wes^_$b#o0*-;;~$U&-IEuHVfG18V^v_EZYg0L0{INtS4{-7)5
-fkQPQHS+ba?JO<VBhl)Nh@=!c7k%LC0WMac5dQ^gd3BqK2!xdF}XrNa(nE=Z|C?bHo*i2GUY)Hw=FnV
-M#pe4d-$)6fZxs%OT#W$?|E@;eFH2yr9OpcH!+|VbUD{?~4z|tJU;~zV<2GhL>&qz`*ng2<VHGKr<Tl
-8TVPJX)hXY~H!>Ygmg>EfF=-+XoY=d(9}o3Ir8ti&!jPN;a0b8>u~eBRE^Cj>sz=~VxH$Kpaz1;VFQ9
-;4=<GR07pisp(_#iTaEEkdE$iq$6;E4}!;k_x&Z2LGIth2)4pGXewEhUH3<l1gcUX&(Ygc1}LC-L?>k
-clDSIjUr&is?^3^6_8ioY1PrM_19oVs3eax;|UlrSM*6Q<0;8l9%v0_WC=FZYhs#Zm=b2<!{TFYHvFJ
-rw}O_D#0X?T3UlqGRtf?jL<$LW&P=nkWJ#0;$BkQBuh<`ux)OP-b1(~0s33&});gDSy{2W+%~~^!+^u
-Scie-`wmHdBc=f>zusS0TjXAnXi9}_u^PAG8{@tmtD3M9+Y`9M%2RZ%XliySt9E#=C5^^--Al@V2nZA
-um8)n>)SLGpxUbT>wY45O4kv1BiWsYlU<=a!)DD1F+y7>bQxm~CL52$EhX8^oDyANB%5iH2FM9a*%gG
-R3h>3mep-7#C0HZB*ou**>AN9HfN30XU9|htc1GeNQ3e$9#k3aKBp)5q#nh38Gcd&La%9Fd7LNDCA#b
-T^gH)?G^EK!j2J*anjMIcZ!9>!i@Wo^;{3I3rqv1(X2rSsT=p9bioTy9ga0T1nVaEA=0P5aMsK?XuUJ
-^K!<7Ki0hdiau^aF<kUWNPTNOxfM@&Q<Ll2`<lAx`AsKS@6CUKMJ=QifUanr(^(cINx@>g(W(^NvyU8
-wfkI4PayBk6iXcE@YqU(0VWD;31=+Jl}q($vabb>V{MuIdSKDOig(;g2ND5ATac32_qg?XZPvQQ7x6c
-wnEtR2*w`+pQ(19-r3(H`6e1uW2#cOWdQVH&@Tug>UZl~7V^3GIRw=o}ikU62O7;h8=gq<FOHG@IFc<
-sMcK42}m%m|j5x%npVIhLSfloQZb4-CT5N)Vf)Hkm<D-PRzKK*Kh9**YTrX70HaT(siMy3OB%b`tsD%
-FXCG-9b@dTrvm}T%itFY<8m7jX}tIi#PU?EFOtVzKPJvIvP%cpvLo+hm!2Nau6p%Yc7a}dv#V3>aCX(
-K-0Z?ZC%ep%4o;|T3x~HW%Gy_W>S-GHs2F*umu8A)Te_1#(4I8+$nVD)4i0LCK8o>lXK1lttajwG#Zb
-GFNuLEwpSw@}n&LUS*QB-LIeUbf{-t`i7`>5x&+E3}7@W>PcPtxjUv*fNf<e8kWN&}012EE;Cr}H8R4
-v6uS|`xybb5!yTx08Ng$A*Saq{hQY!?oj>jwPP2h9<IG|Ij{->a)u;(w+o-a!$4ZG}&IsaI*uz^Cgz&
-K`x$(V^8dFHALiIsM)hcrT_wK@mc;3^r6KL99(EpB9TwBy0P7L8}{i3^<{iqJljM?{LxlE2g%LK@p?z
-+DPdWv470!B(^usmlxTfkICHc3Gk|{*9drYF_U`7=ebGa!P#%_Kfuj8y@z}B%W2<!ug#Em-0(8fHHJw
-i?Y<fhJ3;7Buzb_5W{&kSXf%5mOa60?YOZDNl0AAteMN#Xg05LQCc#(<dreMfGk1H@eE&)o?rzY^vlu
-wv+6K^#gVyGSya>3!{tQ~=F{r)98)@#25!YjYZ}%KwM=UeG;AIVL@87j;4T)u}da1qu>sC4~&w-`)qO
-w-Xbx~!ByRtcS+Dma7bTE7^t!vtFO=Z^$^bMdF|7SVcaW%bY_(-#geK`HtMeeYD8HF<nyI8Zq<#OE~w
-Fc1l)kg0$pZAYzmJM`XM!JqH306Y^wIvB~AjJQI8N?jkSy_2ExE?(1YRnp6FQPMC^+1{7oqMy>FUdvS
-QKfm%7j;hh38=m0-t-%r4>_n62Kr9I0VakDlNQ138B(a#kSVIvyYc6#KI@p{xD#;0Q0uv?@g^KF0$(5
-6<FvQSIpj7dnw^vT3bc0#!5=JhK4bKoYTRI+kx|X(2+v)hfO${bxJSR8ruJFO*c?I~-)+NrO%>1=z~;
-^+OXg%%Df69ts-$_<O(pX(G-S3<hEX!iSa-F4p>rujAzJTG4zD+j;<7t*ewiD5UhrNq`Xx8>ct+|PqG
-F>%$BW_xX;sjFU+H7`VqRkpCDajG@3VTvi4N0n(F^%rjd_Jdrg?eR<Z1iv3>P%r$VJ}F6PCxcgzBl^8
-B<*oF-RzZbO0~+-Z0~@92iC_&}yW-5F6;W>Xg-m*E*{-Yw`C9xphQN7+#y`t2XFQ*LD9@#Bn9?2M$Rk
-a1J5Z6N@Wc6SfMp_1k?3XqXR+l9Nn!QAh6?ftO~jJ2fca`(D;KOn}yT?j&wX+1&e9YoxusHMT`-IA+$
-rFX64H>$m^0zR;?()v|fm;$5XZ?s(sz1lrEUlg*1-gyxCnNNus|WNuDxD~4V(wI%eb(xl#=0>}H(dG?
-2XF+t2{RTBOb3Z|C_o%=s5KF+OZfF8toJUh^mbSFO(L{@kTR*E`2E#E%F2sP@oc7;4Azb$^B6Rqv}zw
-+Nsf1idaW?sEB_G5lJ4L=n;589us)YOq$1+HqdXDHVf;}={E-w#RAahkdB^o`dpdr8?ACp)y9@`Nb>C
-~6q;=9gl196s<z48*EDTr&_Y8g?RDa(hl+sdkSxo>U$mH<s%(`2eQ-=-SI+KKU<DO9KQH0000808trn
-Oqp0sT1XuL0Fre801^NI0B~t=FJE?LZe(wAFLP;lE^v9RJ^gdrwvxZ=ufQqOG4-CxOPsWGlc_sZY^Bj
-Xf1Tts?d5qm6bV_ZDUu~f+j?*Af4|)YK!Tr=<#;j?0qiaoi^XE`!R2r`{G0`0kOf?@Rh+WN6rQ6y=EX
-i|+1kxmnn!}g5xd@IYxp^4ZsfDK!{Kl+c*RcRWSa(e>x^06h#kLv^ZI-E?+5mQM}NAT0I+z*QxQjlR{
-(v@(@h{m0AvEe);#6QExSwIDC7Q^ty0ceykg$kP4D=aWieE>WeMT4c$v9Dgsi#1T(Sjn0Gq9Wkcd~=q
-nmQ#%oQT`0v9MUKlbtsk1{vI8dpIGZM3pAXTycU7>=kKpSvN@19q`g7qZ6yTAYIfxX9ALLn>nc^1|Fl
-K6G&yYywpWqLVlTkORWGfOa6aW44L?V1>V&8kgkDFc9l8^8+Nl%rnRonCbBdv7jyg3H>2>h^zq(>>+A
-#$ss{uJqZdnQ=$@>^SF*T)z$>a(<)CRsFo9!AA{(q)<3zIVGbg!;xLRKr4B@XfbA0RsrzoA)Lq68oSG
-!NJ&H5nSn`2=k(6Dmip1ItL$>5fa!@tM*{!rHMIJ;3dJwoFOX8F&t+&>eOnjQM#ns1~FO&I{%@*u>e)
-ZezY<k9qlLe%QWA<fs^XcmI4Fibz<nrbZcJ+}>F8^Tvm|dQY+4T48`E;>hS92gXySP4|O(A!7d3yf&Y
-<Br8`v91iS2yf@b}_pFvNu;$r6M+)E|A>Cbbk5?l9La!^V!WGV<7c$c5{hzKVHq*gk4YOH?z~v=aV_R
-{ye|FT1<h3Ga!69yZktZdZriC%NrZ&g*-O>4H9heX>xv!l>xQMXK2G5xn!qT*MH1szka%5pRUf&rjYq
-z3fxUToKIzC(6rO@$?Rgx&L$U=U#En11$3~52q<}EUp`GS6YHG7ztfx9)g?CO^y>0v4#_dJb$(MIf0-
-?&V>X%37ATgF^Q#MNCJGjCu80g^UQQ()6neF900h&Y7t?|yJDX0<f!YF*WkWT%Js7M~P+7-W<yoF`$6
->(+H32kE#32k1N2Uh@mA}d(FN@<)=!^g?O(i1+WpuMR)oHOUin49O#bDq#ZVrPuh1yQouwk^=PfL~cO
-G4Jqj?=rJhk*6~<)EVy?~VQDwf!3GA++bS;Hx|&QwlI!P;oaEoGEx1?W+}-JydkmaeHw6$1#uq&TLIG
-h*t5}*SGBCgdIci+wS7GSp2TF{QdDQ`}u@fZ^!K22t>AG0Q!Ew;1A7Bbmx!+5I0N5lplZ<zT;_80BKp
-^g<w;QZ2Xn^8Gp(sTT-FCWe~aPR_89a8A=%oE+)S(X8$`?%x>H#5&Vk}cqn))S4&rLnbppmh1{_)j_y
-V+JX*x0>}2~Ci*Dd?)ZjXg0-WbsILG$LidV#N61o}m>Ba^tm1Y7>zcu{ReQ<{($v^(RV*f4YNH=_Rw*
-sxdU~i9sbSCTqs+0t@!Lr`4pMGL*-;CJz?2Y8G6pAD|%Z|XV#$Z&JAxA5{cEJRr{Nj~GB4Gb<qSMz~N
-8qEAjmj!XI_!5VCPNP#7bW=T^A!xckb^c`Fx{+-7U{o~!<dYi;<YHw(rpzMh*-Z{qfwE`pFEyq><YAV
-1+&UDP2;qR@(LvMJxHjMxl=|>IZ0YSzT1n|k8f+Vd>*pjVE~gXT;F%Vcd*dHjM0lw5&@rQ;@8~@^irf
-P!tso55rSfd?I0C05%8;tO9SM9JCKLmirft^sn4Wwl4WBhb)1QD8kD)rU4d<)4CvGhC}%~bjwbF%x&x
-!@Xw(q}@f8bifgh<B&bj-q?HLzdTGJ1y7vOVcN-@UFU>E-|)5bh#BL0|ocf3Rcx-c3O0~1`TJj`&QAq
-fYParnTkkwF^dn-NRnvYxR*9MQOl9^!i#VU8oPF1uST(RBge1pc`=7+HQ7f+q$(7t9&VeTV~Jpqr~ij
-bL}+Yl8WzQAznGekg!^lv$9#1Y_66Q>a-76_A$6F&fbr9g|FXfGxu#0c=BR)R$5QMF(DhN9JEheJVS1
-M=wIBgy3^W{PE;6jw+p+!?bA`L?!DZyP#5SggLhuc|aKjj>Mbx1PhhQnAs#E&{8bpk39q30EA{34b_T
-NvtvqdwZW&UjB0v|y;lee69y%P+oQP;ZkS`aB4jywI1{CYf|s?7CF-coHRV=^tLkkz!N~;8aQly3>ST
-k~j!u@1E$o>}D&5uvX61g6Hm4J8CC<-ZhYAC{b$G<8;Q6)&_jdrqCuw2Oqrw!f9%S_!R8hy(gGb!f1x
-I8gQ{ZUkOJWxchJa;T=rcf1(}0$_fgEEElE~|Ab)Xf4^_gQ0)quvEe83#6hen^wFOuzpv8edq@rX6|j
-!8$2z5a2DP;Jy@?{tv|Al>F}Ak7CswJ?HzO>5ACsjF%>Lz7mpdmEXyR_|_50nsJZI=?$jSz&)VjhTj2
-qd?oCjWNz`X^RS*vIw3o0PNb$*3t*zb!R~P7!$SuK$w=YwOXK|Hxlc`nh2h397KY41i<gbmA&#iY)Of
-xVp%UBg&bWeoS3ht*Kc1RvsDoJKoZfz*o8+}BxicaE^+H&1C^sIOw`a5FSe%aALJHL7{b&V2-?U}>mu
-4skZ^B{26YWuXoV81)8p~fpsFzUQT!OGVl*TF{y(EObTEx>qs^f)`x`7AL!=~(3eoK8d^CLpOpC5o>i
-k-=`gb<8hw#6~g~cP*XfTA%T7@AE+MGk5S5sLB_G^0`W74L&<%8j6w!2wvRR9Keb&ip6-80?Q*oF()-
-TJbv8dkY=|KQsehc0yk!I>OoRBR1tL`Y=^e;(8&iZh0l=)rD^)Noc1<@qh4eNGS7*Ek|vXc&@dZL6_l
-cxEFjUaK^r%4INwU$)5T^FRa<?gV<=qCsK!p|y3XBn$tyIbls}PJoV-a^b_2W45iWYM9i-QW-gca1z(
-Mckg<7K$}kdn@bv5nuFR0a(@%SecjcxMo}c~a-IGKz&KZXtYCrHG40@jG{GRIDQ@42gnLXHZ9!(SKvw
-4Qt^JMxmmDqayC00jugRcl<k}U5ciPcw<htR=1=r0`N(9ACm0o$w>myUj=C3?R@gyKH1&bmnCJOGG%=
-U1Hdd?pJBZt{wD@UC$hh3|cz%)`5ah`h0iKo^eIf16g6-C});1o09N&6hCeOqIyC54`4d?QTv+n8oCl
-ZH0VUNA(-C)FKWF7>74$w5WtHg0;4%qgKkeXY(cA=muap|_x&w%HZB<CR1Z<Nrm@Xxxgw3PNZs!Rswp
-Oe}NAhtW(0C5(FNrL}Tl{5A+y6E#RP*+Dyql01`34#k^XftZY@?xRz{$%jsAP+!zS4s1ym&c;pp#iRi
-6r-KA&pZDk^P%O&-Wo}+R_M<P`@yn-W7k=tScYKEop9&!P&_#+H6IcsLIk>`LIaF(!cVyP7fQS=*H+4
-Vv+Q=5?23?q99r7pVuRP8OJqciuP5p}b_#lfqu+8C98%iA*p9N3P0*^G#eD>ln<g~5W$tr@MgQKfa_4
-A&nl0S`HruIO8`i6?|uVBZhPyqPTO~S#ga4y^5V>W7#X40gsc33KWm@RFC_2Ot1+$DJ6LzeE8($_NGj
-*x6qu0)<}9ei$s^OqavE|Q}gp79rcY|Lr{cl>;_**e)e<t~lsdb$eGMq-_12~2YFeZc>8Q^_DEa5O>!
-i|w*_2L&O8fsZw0(Sf=N9Xun;6fR~^dJ7&#kz*GiokYsM_;hn|eqE#pJ?ZWk$$S_<4VvRh%VkL$Cf~S
-0=xhR*^*1@_3RFTQDBr%AT}&^U*$8fz;5+C>anwN?e3&lk6{H;%;1OAs@J%I$2olf^LU@W-CG??^Lxc
-#ZjS#|qy1BVt@bp1;TQi5cL&#(sjniLeRfI;yE(#0sJ*zlvdAsO%*MWC0=Q-mskxy+1f8{(UnE#=NHj
-tDjsnSb)Y=sfAch56X@=obRH=~A~Ff2xot;p`l6+*BZ_1FXE_<<Y7Wb@97Csk&vvOaXY##55`2&pC+1
-E!CZ@KT)Ue68;bmDbv>$yMNb36frv+(|uY@>hZDBbWu`aNNirjgGm!SlK;+s~?R8$v!NYz32*#kR4e`
-Y8qu`Zx2Vlq@f;)-i>+{2sjAi)LX}~veMc8DdwE&oW|~|!Iy#AU&UsFx0=cxIi(!kM}1Won7z`!uc~N
-v{~{$_#gS6RkHwQB5O>T$8g;{kfVJQ<R@!qR(;woBHW^U;&8lm6c3;)+ZrSbB_dE^3j>+j7Nb6-Y?I+
-T9vR#8v7;+BpBgt{C-%C<MXp%DBO|p+zZ&?qQX}pZH(pjk`6=P;@8?C2Jm?oa#w#W=MLC8d(>!R>QZJ
-PW2;(UI6T26F|P&w7z;(ayWXOBVT$B%+GqF{CIv0~r9c8Lb>E)4<t?eS3V3N^PX{;u~b8e9UNa+w|Vs
-M>Nn7?@{-4Vvnnkv^3z_hIDetGZuM9@17fBjo{Y`)*{h4P=`;`x0X)RRDKzi&{nlylx_odkj9BCz`me
-RL>g><oU`;bt|c%b;Hr1oi8fYj15P|=_Vaz$Wsj{a?Bxj$X*p~+w1e7>Hx;GmqDe1{dcR#i=WdK2sJo
-%8wGQH4xW5=IJ#u^FYyxG@DOBxfyGbi-W`biXB<QaqMGo}#T6*-199`{B{k>K!F3mVKZRA_AI(X^Ts$
-8)j}EL<As$+73JYu8%zi#9Nf#C=>GnX}tkC7>V&;{JaqqSYFlso0Hfnx+wo)O1h-YE!9gGeT?&cutLF
-lHupO2m5&9vZQ=ZLzk&ZNC|x;m})P9iN6Z8;J4Vzy6>y?hNiroSE2+z!uk)bw(duiNgXnz>rOJ7-+-K
-)>0HEB)EZj7wSj&$yrG=hLc_eBA3V8>qNPawzU8tZ!hX-o)`@txxS*M}0x1U2of4yPw_??m>D>n7w-2
-&ewDGRw+xD-d07tOK*#{P#cMzdYf`EPa^wfnyctlbysEXuf2d5Cp>CbKwU-W86UX+Vdx+M-l4-gNZ^r
-y{}KXt(2JdW4B)NmzXKnjjx~)#@b7q*r16v5ihnNlTooVE@+%VBS%B9Yx-7^J5@>(U_{s%upX|pcH}b
-;+I|6CVxlio8l#V<NxlUt`3vpoE0Q+hC5=Lk{{e=y=27~Yzr~bv=H=*$*$kwXA=G+Z82hp4?MV7i=2J
-H*HNuI4=+Q@H0h`Q^WP}1!?3-H+TTQu<7P@)!oJEmTWzjz4&+_QZV{>%73b-guzA&t)wT~vIj7|CwF%
-u)eV$|1!c4w``g$_u$0<;fw~;Jwyo-)D5A8+qFoQNX!#>nyi;C2|*jyZ_qd@$BcpD(r)NScTi`#ddM`
-TtBvO9y>kRnxJ?2vKqYZ%@$<#@MlF5N8fPsQxmLvv@&;pmlnjSkJek%N!8JzkAUlivEXa)Kn^8<?-;)
-Xx7(8~(YwY%hphG;3=;jo(IAm`42KQ|pFbY7^7Raes<d~H2nF995}MHNF;N~ueY;^{9BfrbMp>}`;Fu
-#4PT%EqpS{l0Iux#lg*|nyq;QzpmH7Rd*Td<vmCx+uZvAT>NbXd@YEN{N+ogz|?>>SCou=H)ICC4CMp
-x}c;(9u?4HtZ~#20k%9=^UNUqbDD+Zut0^YXncl(ca%y={L`z3z|x)t-2ICkFA<JhmrhIqOMWIpFt3F
-6;wgmmRe)foj(xk)GE?)s6hGM}%=SW=GU+d{E7hkCG{RF6kfLK2zDd6?{*nCS}Fu$hscn5o<MOfE!_W
-k`2DIQ7WZYuhuhZ1W}fP$f-K$6?8ef)Pe`hsYF&op;Vd`Ro(^Cuc=pRE#Jr4@oswKwIVcRvNr5hFLRu
-)&weYaTA4MBKw7!CCc0zxT{>jnF>3XAgz_-oban8h7zgimV?-8*o*ZXrl%bNzGJL`^SxAuR66GnE<tk
-C2O9*@mL>9wSwak}07DATmR2AkfjF)bxKvV)D$~Tp&O$avh*wz9l!pE)#nCZ3_6p5}TR5Ci+V5V`(F7
-(0mAMnD2gSW0R_zt~m`;-k-_g_Nq8T~JZO%=lmvZgTzG8@TQqXGT^(K?pNgXe~!yQH^d^<z){8U){XZ
-C30?TMIiKw}G7@x(4?+FBMu&Z)o1j*I6S9IYV@ye3QoV%^y=w^(#_&w2bq}cXZ?sOJy_}PzAEHJ(}7a
-iL2fNJ5hmdE+~m}VQFC%ysk}RsK6#(D4Mllkwl-B9VneQLsbuMg{{=O!C?!3t=&;?Y6(mKl|czcFAzd
-UCGu5$#890<y{_fd5?u!?C#`J>t7BAU>G$~&R!@h6PE9W2)3o(~F=K(%|CMJlrkg5d7_W|A`&99Swz^
-{q5Wqs6rKy|*P>@DNP!YB0{c!-HcialIH8Qc3vFgT<twao6fnmg2(M-cu$CS3M2MqvfIEKmV#?wGG+|
-m+uqbis-3xG!Jo^OSPuYLdR{;|#80Uh5aAc8RT8Otar$ZmWE)<z+qi(|V8NT@daFc8^pd<kXZKLq>{n
-`O#Q>I`Z)APuo}Xh6$Gbi>PX6N9+!MxbJVuNt)7okHSB%RYHtmq={0N1oLo65Z&JXLX0fHhN><&d?Cg
->W~8F8J$vqAWmW9w7_ApIM)+0D|`#^3uP=UY6BTIUk2)Q)2)qHAWb@wr5%)1+jh|+PEBLmN7DlKbaWq
-BCkE+m`qWd;qyJU1e%n(;(-JMMmibTE@=};J#QQ?g_ixNaTi%L685mD*jSd6+PZ>HYNS5ZFjLH^7*)f
-I%lri=o*Iv+%HT?O*aAf0xTGbSqXozwQxTgAG7bt`KT3y+VeEvj12TeGDK~M<+&>8@rO)i6&Qu?J$go
-tgOqM{FosY_Hsy2lt;D9uh`Ce5aQ<!*>Bay?Ia(&{dBC0yg1TlUildt=-vmbi0zYkkh|_)|&H$V`R}j
-2bLKUAURI=E{?=Mn>4PqP^-F*6eA!YEi~3_9ag5-BfxW82>eMBi{|d!D35L0Rf)XdWXuX;Ek5BQ=Wvb
-$F20}pZ`1>GyH)E3{aq894<UJ(c2e=mdb~^T4Gk&2Bmk_vW0^<^&$W3>s!+l7b<8i^VOII9ccOLYj8V
-i=w$J7GF}$LXt-AK_Nt99hmR3^WNK|iK@Ht4bya6pb-71nX)nM~+2?8FUYc0gy5$)CRAiQgWY|J-K#T
-I6%JGe?O1au_sWm~xocNoY-U&Go;*;uuS~w&L+K|G?s$*B`GMamEWd@C1wY{vK&Kk@~fIo51F~Zf!Js
-kboGe{o+O#7d5+N`m%L``X9mMvSN_sBSSt&y>Gh`cPZMhz5L2jT4oj&=Z}0LySV*|KfJNFrdclM=_um
-PQP$5^PX2Pt<Tr?&g5Z&|4Rd3diPzv8NK%z$H^a$}=v*qhlQFa<kYrBa;LxO|e}9t5n61f~f$vO(|^|
-F<EFNDGDbN++OJ=MFk40B6ho@kg4*L4y5a3aKfeHa>Fj%LAoHT7&W%~xMzVl@Rvym)0v6{)8dr_S;IS
-su$O+xKCKiFlu>A#Trm{#i428&JbK?!AChx$$JA2v@Y#{x+Iu}`mw8QDm`YYl%bnN~Su#qJZDsW57xB
-4A#pVdugJNS04HB3`vR;Eh5JS0LGQuuVC>6P3{W8B{peh3nW6nqX@q3YNLoPAO-3;^`ir8=ODE8a2{X
-=CSt`cBX61I~#p#U>@0E*HVnIGp_#R36%tEx*oTiw~gPbF~6cQd!PwS(~x!DJb4k0H?52x{FDVi`fCQ
-!GhV0A8_~j1`64V{j&12au1B5whhI*B+6Ki5Fycohi%UXa&OuiH%Td4Q2?T&b}hwjj>8>&676UH4Cc$
-=sZUlN`&kTWp1H44Te@4uQz^VL3=2_+A!=AHU8*@j=}m^QK&Ki07icoMUQTTdvJl;fBJ~whl)bM>&gc
-?jpm^#;E5@)hBg^p0ib11GzC!O=O)doF(=9L)RdD*ib|AQ{U?V$Zh@*38RT@6iwq+%BCGiA23G}d9~$
-A;BEQyhPOpMDT8@Bwwj4meb<2t5o-IdC_h>m(BAeajt{CKk2n=fA<HiMEePw`>%Sf2`IS({*)~HGrc{
-dwbb10CV^p1RzM(s^u0!*JU_YtW6Tc+H-HyQ0_5)645L`LL&YxvJ-SRH8cc;0|u!@jV7B}pXJN(m^m4
-7R4a$>B;^Eh^fCmrAY}C?_1~h+wSyf=AG+shg3+MRT4AS`?Yg3@}rbi_8WphVh{+U}Mzj`20lv#9LLd
-Bj?W(HS?A}{mz-#oJPTB_fDg$Fc<6ktc!U7PX@9Cl?*kPD29Y2HJsX4Jw_7DGXYxW-l6g&$MSSs4ndq
-Z=_F7^>mRi{jjv1Ly&IJt%VX*$!ovR(j8h2ftl%!<{z<uP|1zIkUr*=GWU-k2dWj!-S=28P<cW`;Cu%
-|Ze0?^#nJx^u>q;>Sbo~TrRoO4-U~R0c8v%Y59Tr*&oNl(L=N7kzHA1Q?mJENAs&6u+mb0`%!@$9GWM
-<(LbT|1!<pqY~+79Nc!!>ecTvnhKzMTr`pURk#I<S9?%eo|VBl<SOdvckUc;%i2K6g=lz`AbSd#r_GU
-@2M!eHy-K-9!EW3nKg)l{(s0pC?kEd7{fhwCf}=$}ygG6(KiYQMImzp(hQ_sZ3I<N}_&Zi06Qhj$?VD
-(DB1D>?cK2f*gO;=9&^sc{hR;faVqf9yHpTbiu%w9c3IhlJMInlyfv@)@aQB{eP8PEft38$>=v~lh3_
-aZcC#G>Bv=mtgF8xO%1Oe#>Q!I2a6H%<)EZEaknv6n)#`SFqVgS8lEiFk>gN-;~Z6eErQ<H+d|+j7eU
-wil^$-ZgA4aGsd`|DE<IwRB|dn;Gn&Z)W7HG^0UT)=9MyfP2HYde$|+y9fEo%T`&0^7UV<7cQIif~vL
-Ia1CT#$uipY;6Imdd|cgi5$)_ql3=yzgh3ymcp0&^&S%0p9d$mByG;-?r?#9IMQ0meu!mV89)vzhl6z
-v!W3D6c^Qb<lCVNtDorY4tmHS}~!|??Sb&gKZxxo}j48gdqj`5(w^0Qqb`v3Ag&gAVuTkC)ErCphZAi
-aL1Jmvm;f}k#tk*7fsq6%HMENt~|<LdU}C*ZiGa^cSSw}?z85ysPZ=i*1r>g;JLZrTB^~J?kg=7Yh(}
-Ecm1?<J9I4EdVbmGCq*6+Z$Qe9IANi?S^6%;|9!8c02fq%CAF$M%Cpt?|8-Q+Tp~4)-!8=PHW^o6*TJ
-AFMVw*vbuKl_$lX4eWaMoMbo}(U2UXZ+yw{gtfaW~WS?UTj5g`L?fP>Q$n{l2S7fjW>CJ#rhr`HTa<D
-;74^SdA35C$O=QgMY5!xYO1&+P4wKeAuuoZ|HO6LJTzW$5mxZA1_h`EnrFgyU_wQPVE!GP{W5?+EUu-
-kSCh<#+lt(~39t3l2$C68|?h4d~9wE2gd|!l;DNDuSn$?+Bo!4I;Xn%ePD_UXsRuzY(_T2{!^-YcxI)
-S#uynZh*XHF7G{-vAorH33;T#oO9o1)&dkEAs>Zw8o$(tq{(E*8xEkZfX*+RYGjo9M@mFF_(kaFikDx
-3uY4Np6Hob(C~62{X2%Z{a3S8aNhHNG)DzE8fBTRGC3R+l-&-^Y!dPBGo8&A@Cut}ns0A1V^YuuB9>y
-yT-*QSDp{{ys?%iWc40=U%jeaq@#ppjx5iDpJ(l^NrVo=Ca{01kUS8GX;sV%;MXIe#N0qIh=rQt_~$)
-JEyZ2`82t$R_$?O*w!hH`k+CUH7rHaqNVP@Togr7eOQosQpo3?hsyK1TnDBx8OJgDgr-jtt+pu?Lk3Z
-Bk_4DlROK2LBIGO9KQH0000808trnOaNA_I<5c!04@Ol03-ka0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^Q
-Y%gD5X>MtBUtcb8d2NqD4uUWcMfW|$q#JgPu3VXDhzk=v1DVtT8lclmi^SVo1QHi)|9gM(M{8Z8ZK-6
-RgnMv9U`cTIiKIqLMyV%u1TFz#{6OMOsf7oybJwoj$)%RZ1U>r(JPs5?z7UPlTC1wUF=MGJI74w0XW@
-Yo*%uknfUaK%WpZ)sg>7e8ni;=IVvZK!V2(#~DwO&SFq2>iB-^V0XI2AW7}CCRUC=77fAsrqj@1`XO9
-KQH0000808trnOxjdNr2_&004N0j03ZMW0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gD9ZDcNRd4*F=Z
-=5g?z4I$v<$#e^&V3~gX;L+ZbX7H*vt_|7SOwd)O``VKcl^b&P10}y&%Bv=^PZ8j(bkhm4}(-gRh_J!
-iIIl!XHdPiL?(cRUkf<zUL#m1x)D09ywwvEy)YiuvfGfmO}U$t`k+BPl=3^-`Pky4qV%55gTq2NE7b`
-*7-8Mo_Qnp&49b5GK?GGjoQMOz7@mco&AuY|q&5t55AX~V&1rV`<@3|mCPGG``Y^aHBC<zsLCp6lPMd
-8b(f1{u>zX`%0M8vbC$%cWi<a$MGSUbM&ngmac55)o!@-NewMV<aIfENZG08t*+k;k{#0ZO(&dY8SPv
-iqHWKr$_dn`QHESvSBJgrCX&Hnnj-WBq1L)<@@Gbr)i_}LcJ#^eaM=$BQoY9k?9?TUWU^U&ea?@T*og
-Cn6R=4rjy33-h$nYKRSJ$(A{K)fd2{w8QwQnhZj^K+Z{%F{EQSx7}gB<fi_#WONGQ{4)DaR-tpSLB=c
-2}Bg}0~>_JfHPV-$Yh+s22nyx$FU5TS-TtqSFP3`Jx#s1@dX-|#gxY&@u)#u`hACTpwOY=gJrfml1}1
-f?S9ZNaYEih`WTm||26M<?sw5VD;mADGPoE2g8oxB2qp)wAP4Q!LOt2jI#`9HIagu^&Pm&nn)6^B=XI
-)$E;iL)P)h>@6aWAK2mnzTaZFI=sVr0l0000I001KZ003}la4%nWWo~3|axY_HV`yb#Z*FvQZ)`7NWM
-Oc0WpXZXd6idDZ{s!$e$THEt{CDJfzjgjR3HyquXh`;4F@cTdpHb+Vl#;l#quP%x$M`El5AO)<#aPp)
-Uim4<oA)H*tro>6Mbz!EtvbUZ|hPE!PR21m*Pws*5t)2)RmCAguh!*TIIB&jRvVmr}WEq`}rsLty9ZO
-QEMqU2iXff)A9(<{&O#9zV;#?SgEa8x435<E|NA)Xod3~El(eD>8o2>EEXlFN{x2t+{pshR!<9p5364
-(XBE|~J``urM^P!VAqsT%ZTb1jcDW|Y4==yHY+sgttrk|Lf;}k;Rx@1`nF79F6YKZp4^hL~ii{q+Sb(
-Mnwb{xxDdH1RSm)<VDUb}^{RiZn#1UG_lxF3ez&(`*wI=uXr%RUtYq-VKWr>uniHUHP`+!6JK^<i}@H
-Q@9BIE#I7D;+1QQE&RyiAadJw^V>tFaoT$ZQakXzb3wxlO`kHcHJ9z&K?gcES5PQue3}uY*WH8-=CQQ
-Kl=O2@>z#z4PyXqBx<wXimN;AR2SqeL(W=g*+p7MNPCo>sUK`!n8L4-!ZjVn6*`Nz)-a5-kd4bh+0|2
-3y>P1GNznRohRKw(cUFjF=VqL%TF)c<<m5IRpGbT#K7cU!dlC^|ErM|+$}QnG-0&_-OAdT-?fYnvYF3
-wWF%1<^N(pjg)4GX!K=kc`HtX1c_Ih~vGlO%qg93Erj_lCdxFhLiU!%CVWiw=vJ=hQ2AdIN6YnOe6Lr
-N5@{|{yZaRN~vnF<f!dt~|X*wooXvF5)*cyl(B|W0J&v}^0kCZEzA^y+CoMnDTo!yn3=?Q!EP!6U6w9
-0()+|CCtw@0SPg>g<y4YdslaBhT^tttF-aX6EW&`@ivTz(z8kmZYaVXhKtp@XP8%m1M`?#Qzz4Xv+3A
-5<6*)#S_$M@<|XdLBgvc7V!Q#`0>jAo?VPQfwc!+*I+5>(h(o$XR~P`t=Fx?Xq<qzBf#|J~YG;`_bFU
-m8QB?CNJ+Few_MqN4^3%w}|kOzJdWv<0j-~OAkXUwD^{yMVg#})(Imvix*g;i5)=gd_+Jgmzd3~p-(4
-56pj-C@`DZQ0Pbz7Iw!y43q!I=Otc|0YF;QhhnYtV4D<;T9fCvu#Z1_Jnd&~O2r~1$-8!A!A`+bT4To
-@4h!d#@+YYhV3v}7geZCKyCn$yuG2L=%+9FJmx)shSSf%=CQ-O!)D<*g776vFn6Y7mnitTuCeC-56nw
-0{9WCjyw%e8=n0T+gCWM)jl{$+`PN1j>P0eO6Q_yHTGgw+hL5;)NAJVsb*C@uZXG-?TfpBtQ<r_lN`F
-wtcdl%hfy5m@AT*A#E**j<f$oh3jE2or%97q3BpU+7f@!@&E8M{i+VzQE@S_;JdD<SCyxk%z`I-YUf`
-bQtIR@yKE>1dctF^cMqH(x&hGuoAX{L|u;HrX!^hkTaINa{U4WQ0*D28weJAbDSnFA#-Io=%vRGf8WX
-*D$RM6HuQFq=ck)K`!@t`nV52O`X!`Fd2H(wROwb>2a%%hWJa>!P#+M`O^~d_`jq(Qu@|$1v>iuQX%}
-v~kxgR@Vsr>};(Kk%;bDFgyOGgA@N>Mv2n93dZ$^%pu{ZSmcRO5c@jXk)h1K=H=f7y0OU<i^vn1H)4z
-Di#l|miuDeW)X5YB5sI-{wHb>n>Ug6^g))#T!oxN;P&<a3t|v(|T@9N)(f4A;QC!cL2GxK|oQ_ldoZZ
-(?*b18ObJ8Gr^z1ERq$)tb{&kATQW2j%eNjY-=vCt`Hqcg(Ce!R{6Q1yD-^1QY-O00;n48F5S!s>bjv
-0RR9N0{{Ra0001RX>c!Jc4cm4Z*nhVVPj}zV{dMBa&K%eV_{=xWiD`eol(7RgD?=@{S+rABBeY)qzwI
-8B1KV$?#Q)|;Kta<K3YXl-o0l?11uG-2N2wSzs|BuywwOwDt`L+4^#w?uRExG0MoP<8+2scaoC6jq-~
-9r>@0zaAc5+DQi~`n1mhkWY<xI_Hj0dQGMo#Mu}Bqsb6ZVpOzi`~-m8-kLRlFjJjsa9NhKeAtTsXbA6
-A1SQXbJ(YdGPV2XH$<nuu`lwEOXjI$w>rIK{2uQ`!#y0M}@d@L$Tx`Zypbpq6vq^S*FJL*9GxY2>mr&
-QMw2)ccRr>h|E>G(#E}mWzaK-zS@xjkF}mqdOk>W-r$T)gpDljT}W<>|5*&EbjQrP(7L)|IZ8-UCS@b
-FHEr+D6Y%y;Wv6yrDcvj3e6Yh9$Md~fGhD0P)h>@6aWAK2mnzTaZD{dEi=6U004Xe001HY003}la4%n
-WWo~3|axY_HV`yb#Z*FvQZ)`7PZ*6d4bS`jtb&o*{!Y~Yl@BI}4FAB1YH^HNz7m?w8)GlJQTSA)2{P)
-hep@Q}h%FFxu`b_Uj2i-X-SI}sTbj-wSLZC`m?WtXuYKLt=G1&I%T9x%1{0TW{W5BQpdkWWx;1fuH`}
-^<!3@+#TAR)<$8`dRj_WJE2Q%u73JA89E?DIkUPc=qyBq$XpDMI9grE?R=Q6dFz2#Kq1Pzy&q`x|ki?
-?#5L6?PYd6-=9&0+%?SjeT~$!jCpz=49F#A5cpJ1QY-O00;n48F5U<V7cB14*&q*G5`Q30001RX>c!J
-c4cm4Z*nhVVPj}zV{dMBa&K%eV{dMBa&K&GWpXZXdDU9$Z`?K#|Gs|(Pe!oX%dYI$fv;!4?WIlv1W21
-ANv|J#?t+%MyQ=l7Ncqvj{qHw3BqdUhjolUp+yaU9Acw<w{${8k2xgymg6)*5vh@0x@oZbxsoLd|Rb{
-P2!Zu~i8Y$QvJY}``wGmRuXcoZCG{-S4E4SOU*xK7#*sGXlqDXjc?^T+M*`_XYCUTx;QKQmKGV`+HwG
-;_gVy%9g=}}c$MeAE2QPxqrvQ%{wtELw1%nL5XyF!XWrYgM^uhUo=0#VFk*qs@NFD~$bc_~Gm@+|$W9
-q`FMsAsbo?n>0`+-@)03iY0zh3j>}bFp48X0snZzJnpPh~hG@(oBSP@N*bm{(N@$&B4|4#o6MU@bD1s
-@%FC^xV!wBuEKxerFnJ`M))@Xdb31qv?$h1ordslaW-S{19|^|k0s*_7i}c)#1!nV7F%)8wy^Vpr3HI
-cRUonSo_)*84g2`^f}Q;RtJ7#kRPYx{5J4`Mj5lhB%6?eFifXrHAmJKrHZ|YoqEHLina_&lg#K>pvZ*
-AD0d}ICt9VCaBK<tngKGh*Dp;r=UcR_mnt7Ke-Q~;f^0d4B>I&r%XIx4~YP%>4RhL-?8Yr)S5wYq-^9
-r}FM7`m$V5($NfKoTsT$$XJO_ngShJ=AZ7p024&7j!V>$FJKdL2rUZI*iU`S)cZ%=KC*zLn>n>js{*#
-#7S}!wUXzwlTbOJrP%Ijn4?iAE`;(@%qjm)~yGloEsqBnJv(!S^prZ<pT7ZblYp{tSIX|j5E1pon;v@
-d=Ia*H=t4d`0+i;F|Gx8B$%A!8^LbG1BC+|K#W@H{TXJ3KTsKHhG|MhPaVCEU9v2mLR5NlAB#$*Wf2A
-+itK^$YguNE!VSCwSE+&bEGzFs65)<v<!3Tr&uI6ZN0{}_%|(P0YDZ5k2QZ|)Zb$XG$4&dJ;uDw}90u
-Ls19m|+nSilA6pG)oYY1ZrD~uXAZVEkEYvUce79e`z%*TiW5!6J1B;A6gM_>#B{>3!=G&+usk;W&Lu+
-!71ooxJKtwlomVZ2CK@J$f?Ql>?C>1gh1fttVv?R+pNP^Ot~r1zW!XNQLY{O!c`++AtrEKfn9qq4_pw
-L^gEj+w0?1aG3&x;xc&p;Qxzb^I{yy%RhUwe+2!y{1^(89Fm_?JTo03ZH}MN!%QSNJ;XRXRzm%l=YY-
--E2e+4ggm*YUozTXmoKP4m3ct|Nc)Wv^ZYt#o_s!m|7X8=B@?KDafo$tej&;Fg*J<>5=p2coyA_o1z3
-FRv5a>%gc7gRU`pasBpfVFNQPLD62KEDePT(@A0Ra3bN_tJ?8tg3K!PhNSyb`3{o*G1n0q$y;xi=24p
-s5x{%w=1c`fEy<mSi*Yh`Nk>GTH=G7Rx<utP);(<P=$k8Z2IJnQx`8hp)6hEzbpy7pmVLtcyUG$wr&z
-|`XmaL7V8s{)~6VCBbQ{pzE0v4-E0ARS6R55X%O59k{`OlJ-a9!U)$nNv=mS<9o`$6mbl=9kKiNU}y7
-{PV7Lk-!YL|ix9aQ?n5Z_q)TiUk<;U4G`vj`+fHF}u)M*sx35z~RR7ZvoD-vQa1jjmb3dNCA_gEFc(f
-KuS9X0GE62T9hlz5%L$uzH9j#`e=w6f824&0y{l08)DZF6$DX{^jyvrw&&mToZqkb)~-)!AdWBF$5&{
-YM^9x7X0Ks(z~JWScd>TBEL}?A5;4y$s*|w0V_2C`b7=wJonYueOqQ5Nuqg3u3B~Uj6QcTX#1ztvJ0q
-10LEb(od|#SfLV(9?dJ7i8uQTz;&0g$8e8cW`0^J0iDCPyEeDKf~>m`oo$ja`bgMtuucp|NtE*<^{01
-F9>Zsv|tQVVrPFnj5E(4b@kTNBCByiK=|b|0<Occh~ozZG5hI5~Q;v=d<GX`YKD1=yKAMC>OJL0Qa|L
-!uBc2e7F^<0zZD3qKfKDbBQM`uZ>?lG2$Eg+h&f3Dqe8#(<bWO_8zEVD^Im5LUqcB4-{Tt25`8QPC^`
-^Qf`}0Fnx|iOPC=xKnv{Sa0IL9iO~7kQ$1uPNSF6aW~u5e3l|6Kz*Y)VPmz>u>y^pumpGxJgfkUcQqd
-=*&##7!}wVvX`mGXY^#wCWQ;Hs%m$1_<QfHv5b_sSjYNM3jrit~%Pklj`nrWZMt1=WW#5&zaM=nidk8
-w6%so2hHxJ2bkWNDN1-LBMJfNEm;$IZmqGwT_y8%C=_J+%L=4J(OKGq@#Y0qsicZ7i+VyA*d&5^}9J)
-MF;7)O!+{iC#^egZ{drl5@jd7QWG0-BRe(Ig6S3+4=gppi}h=%}IOOm$1q0-_<*I)j0Jtoos;w~h|&f
-@i?J$JTs^U!2IP7aI$n!xi6Ibx$q%sPIvgcc4q`B1QP0Q=t*p=WWA@UT^cT598VfQ)t1eR;~ja9W>C?
-h}JQW0cpr+A!IUSVMWVL!Hx?(jo~z1(m}|?31{qCinyaA>p_UmA6|brW1k^<2@FA?dq|c|PQ@*l2Uo`
-NWs@oJ_AEn%b1xv_4-}E5*C(A7=~hVul!0o_AIL;u>NPb+(jpcRkq2aAGO4OAuOT#IIxEuz(Tw7SN_8
-9pBLQfn+i@l?4al@yG%zj0(0_vxgufKUQ{~pAvRdy)U}MND0UNCIv=AC#6+$|dmwmF%(v3iy0P07>w2
-Oi@cn7x3w>kH~Vz2m{L{D}H=#%E!!BJ5vp+<*dW#LDKQ6?crg+mhiJnXF{!&)+gl+0vpd}FbAii<@rZ
-7XA$kc=U98?s=|Btgu)V6o!9O0hB96O_m(K<by%C8?c#KH;jCKu-=p+s*_FN9!J9wT}GSNVp#=42gyD
-?qT6JrX~{<9LmFp>8UB0Qj=L8)fDVe(<4;%x^)PRhp`7Hg;E+jcdO^AGFI+PwlxljPzlURAW=x}b)5n
-T1b7Nj=#ICgo%QZ$(k1!@4IrGMVkSLckMR#AJLv$n6nms2Oi9>%FR1Cr{)yP^O<kAuBlmRFtGv=;MdK
-bXDwwj?;Lwp!OXljyY`XN0yte=?l3yBwuwyr;J<ubVsW<6&m7JXU{JbN-Cvd%@Wgr>2i|Ej0H})l+O{
-G-Rr!aNO#(;ahUs06JcIWD2L}g#Qr1w>SpB-<&H3A|Q*s^8>`Rqft^Jgh6O=w}rR1ZP8L`Fd{lm=p63
-kr-xEiy$I)m5exE7%)?p>ZZSm7jo6JzM=Uy7hK2&=pB&&@KW&0iwXti^><kf*K818ld{MgTL3kK-7z9
-BojraFpz%>sDpNpp))5x4bdhw#>yf|sj-`xhNhhCjy<(g^|%UtvQ5zuD#YEoD|6g_v8n2OB|W7gny7I
-0RW}Ydm-Ba<6(-`<cX%|2eWbQSJb&{UC|wO#$hcIiyiC$fDw3xy^_`iu`h<|yU+z7UwFBIBjp7|zy}s
-z$+N!VlWoyGrc3mb9{UboPiTTQ&s1ry+su&HrgY<SF0d&IrbjWK*Kos+l{OBqN>@9{&dyap`UXyog{C
-a$JiY+pO^$`)^yKPCRy&Qn{&RWP%AmT%DRr6xo_8p{e_}D#J>+S(y^@JeY<?#_9qvNBKB|E{ZlcN_`e
-cL4LV7d+_w2aexQl$B$3F1WdtR?(Rj%1J?6T<=H?Cc3k+M;HjqvHzeFMA#_GFIYHxSro)$tDVO(9g;4
-mVW;WTd$nqF%G1M)q7EF@emJdN4MnhUSkZth3J!Dge=fHu<M{feRqzI(G%Cxd^p4$j_3;jP(6+XGz*p
-rp<Y5*TT(%!({EA=Dj<Lk6tI~19b)n(tq}HTvoyBrmWV(jBsLtJkHiOR3u3d$j5ZnA>de!`*u?&z%RV
-Kij2k6j3%C757I^*yH?*5YuORH3P#ojo%#%(gx~co8`FuJ?_s33NeykGRBG4){Uk=$OEygK4knzu8yb
-1>MIhu>#>o*0>j^h_DXd#4MV3<_cfz}nO(=1xkbJ&4S?2Z-1F(p(ye4#P(o(i0~__fC#q}B%K-k}Ul5
-9a=X0x9y(TY2;}Xl&t@D0K^`K*c_MYdeN?wAX1?BWu(|SwM0dT_1ms1#6>`uIO5%1-lWV@@h|apM&pd
-aK9aF>D&9h4PTf%oiy}4(MUJc*%Or4!#vdPaF|v4urF!y%7J}7Y(X)?C*le1RickWS~uav1EyPPPET|
-duRkAwUFt*8UQ)oxud#<}MAOAw>fQ8{_1F=?xcn+Q6yOD(IqA<H{^w#`JVA8r@vZ085&&UNNlZm;E6g
-E7=}7mWjW;^UbdFgMbwcNnj9+8(pV~d{@#I0rL{IkS_~DE8dtjq2F0I-&a@*Max>w*+Kr+X@Iwsjx%V
-LPOY4B(>Qz!R9vj&$Nl9{#>Jg6f9nvVyNs>AunNknS_dyL2a_85^z>W}!O{q+hb+dFOhP;uKQU1ILa1
-urC;iu;Wsyyy`z9XA|J=O2EfXV72WZz}k6ym~$Cus&6F<)+vB{r^)K)_hGxP3QKLnEkb%U+{fEP=0ds
-5_L((GvHJ31ZqoczoLX}FrmX79ED-gslW8<y5XifCHnLi@zYXQhA3})eh%QbUp*QdD)CE5dvJ)y+(7D
-1M<h(HlDcdK!z$bZvD;E9VYk8MM349Pe4*n{=tMi&1L+}RE%~X$G4Tz@@YBrR>iqzUO|dlTx?=r?)l{
->M-Z`QCy?_YjXwxd5fG`TxK4|eRT8Y`E`;7sX^AjH!BsJft6+T<xsOwa&s+TLLXSF&$ZNENv8NKMJI`
-pwAhu_uUCnr>w$)>7GslTrPGf8?jOV*Y18#nnmC)c_*E2y4~*td;}qKJw-UD=~E>cS7qQZ`-+#r5#>I
-r@kSEL*l`g|u>>Zg+HQi6@d7ejpGVXy(#*sPLl>=iJoAG52xSB%u7R5cj|1>lbOAwOvh`udTQut!&?F
->Fd1kX31{#M~isn#^!c%szffsk$?$Sd((dRX!;oaeT<s>K^tB;J3cz15N*ST*(SS9d8fO{4O+m5WL*0
-FSk=DT7vU$O`WGU3k0mFHF9w~w-q_iH0Z>Z=1QY-O00;n48F5T(CNzBc0{{Ty2><{m0001RX>c!Jc4c
-m4Z*nhVVPj}zV{dMBa&K%eW@&6?cXDBHaAk5XaCyB}!EWO=5WV{=2FbxTkSfI<1Ne}p4N#zHif(~DbP
-Iu^Mi$o;DUehg|9#(3wk*5B0^P&<kl5Dn&6_uGhHirI$apec??a-W4vFKhFN?)OTNNWcDQhdGchAQ1r
-=a?t!^&4*Sf};Fg7CVzxyk=Oc8H|?7(y!e!PTUw>1hn7eQR_}dxNONO#I5>kXqxm6j;?{T=JwcR5dgW
-hdWY0*thH`wJK2q24o^>>mwsRjadA~dPs~^`bZVurxs^8gK6&)yA;VcBhH9kEb`MwAgGjrselndo2d`
-}%^(5j0E18l2YV2nnZa1i@%UeDCL}@)5$8MZDh_dEps4mkWseY1dw{RXa!nTX3SJ+$F>e%6cg%3kCrP
-WcHZ?e-o&&{J)qW2x&OD1r`242khRV`7lge@x**14j{ce)u*e7|(!=fyq0Bug4UahYmqh%W)Tz@^uyP
-2Tp`L~>e;6%Zxj%TTFp%v4s+72oh&fVCmP^m4WL)Jo4;~n%<E{<(FlQD6IA`&UPSBHp*R1nI5^rGfOA
-!}5Y**?<2KA2aPcn$(?fB*OofUMs~vfl3mVd!)GgaNvC;EWTL$w`!(!91P<e+j{d(W<az?K!$-f-_A7
-!|aimynvf6%4;xjGZf<*=^dlj0agw<k0>0)3&)xemAPpZSrUbLIcKR_l`~fiCL+%{XcjJ&w<-1U;r_n
-%Iu<?V(7VEi?fr*)coOJN^F6=8pfRE^v1n6gZ&mW$580WfF>v&RnH_UvaoL2`vV3QQ2-oG=cY)Io+^N
-)+m^ZuU!rl>Q%5nCy!)D$};c)&i1DtdzvWw_<@6NLEo8~@U_3#p=$6PP|N0yP@w`aJePfTBiC>D}7YN
-gR~I0~J2#e9@retvnN$GXPu=otRpZpAcWi=rs5b$wPg@=VK2^IAjGT+jI>)2oN8^C~IOw>&7T_4=w7R
-0qe4@3WUh|4i}@4%G@9lRQcbdn2Y6b7vFet6&C%>p>PFRMfkJtY_@hE{;=>hvMmvY+yOZ0iMNQREj&r
-dcB)3k5krhl8);P+*)t*LRK`nU-*i+;|-PXt{D*K48dhtv&Ev3C|?)!kyDcBi+U^2-^DTILEHJ<%3?X
-LAbEVX53x~zQR8M#O9>EU=Yw3chvF;CIlFx7w%o19jjXz~k%zOc*D9&==)%G|9D)D26r|DnfHk#}GwX
-MJb1|Xo_uMlYZ)TFCK?QN<&!`$MFL{5B@+|&>IGEuxZ8r2FD?J|EP__IVKD*^5!CM-FwWd1#oQPu+^D
-h(mA>iZKqo+TAd&UKk-?OW)F!E0fG_W1qu6S=(oGbmF(*6rjO9KQH0000808trnOb%2Y{J{kP04)#z0
-44wc0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%geKb#iHQbZKLAE^v93S6gq}HWYsMui#u5mOWdxW2eQ8
-<)K^Kr9jhet%G7H0)dt&n+-*3Bo)Uk`rmg*k&-3n()dBv<=pt4%SX~I7gD1bGr|)rJG6Y(G$Wl(Dn*7
-!hA9gRO_@UOYbs=hb%He+p&Uy^TDOt@=9JBovE?=W^T>Kg2-CRJS-rh@9lg0&p)=I&;SuU3sJBMFe^K
-vz*}GWwKB2!ZR^3jglaLgV+nh=g;ZzeDSOX(#_3XXiWU%ZY_?c%gX8(k&oQ7QNf`OHgL>H2m62BrBhq
-dp8BQ2sW!HMyron5C@FF)|Og+^tQfvCOHMb1bt7!1H@%&=1E53I;JDI`^z#(`LWC9$zuh6`?YSaQlYf
-g&s&fg_a*uKaq;uiNcb_aDnRFuK8vCTMnh>-A9?viVRDFsx!p*XF(65=e5qC6y7Jd@YpD2-hm?RBu-x
-=e;AUP%gy{O-O>Y5C}6ScHWgjj9wEoo6Rfbt=9Q+G67MhLP~TR3b~nVb;c$#jbEJ17ta)|n+iTY4Nt=
-b+HHv>Xh#qyB&p13VY19<Of}mhh4+n!#0{+PWP!G#knqHk@J@_euKKgt6pc~$<AH@w8nV{y*Weeqt=b
-Yh^<WMzt*C{w3d-rB9o1We`5soY^Dhseeg9$gdI<oV2+luTzIz3D?(iPEipQ)-2vPzX<#RKUT2%VwPt
-gsh=^i4$x*5g}t1`t2TJOt*GYaV)Aue>w3J8E}BvLC^CAkXv0Ytz5sDZ<I&i41?RpOd>V4)?AXxM_gQ
-mmn(X<K*MSb$dveZZx3&{7&Slw94qk5SnoE+pT6bu5RPG`(9HG6~QkGkKORfbWm-d*7wFzr54xj{_VW
-<la;@O+Ik)3h)0k$qpKm#ewhBW+j?c0+}z<ZHf$YH%}Fs!Q|URDH>_3n-<`kgbjO7X_h+azG57dedn@
-o!K3^LsV0_gm{;Tyw8g*l&FlVEGiQEXXHCYaXeWT>s<YW(bd<O|ewJW7GXz6(_htF~YS469#p4%v<w&
-T-C+_n-%C?2avEW(?W=-_-Vhz)<-!2QMQdPz4((X&U(8tSSID~mV9D=p~3Zk?!yat>CIi}nUd_&tgky
-Ipg5mZ$WMU+z=MK1rt;q~qy_qL}j%n*JJxs`hQ*u5u}wUfcojA}qz<zx9!HkyUdO2e{BLM`^=3GA)2o
-S96PZ1l3w0(KA-b`L;sZe|<wdn!Z~Q)P6s)o2a8VEF1N`_^Rd0P3m^-eILLL_$+ak_YSHtsVc;4KiOp
-o_a8oaI+tw6v9Mn9A6{Bt?{w9Zmkr`Z!osr4>FrS`|$}|f<<@|o>(Q=001;`!A$F8STI(C<257YzQ%F
-t8wfTPw-BciC=n32AyB<F(b%ntHdG50Tm_;al7!q4Cg5$DiEorKYy%>EeEDgTh*(WNllA0$wfcKvy2K
-3UH!uG=Tnf8ws=E8JBn;vt69xN{m`pg)J0h<qFl@Dm1)CW430LRv=Tm$R_=a(wKb!yd!n(NRHgIRsY>
-XJqs4iCmsGKauTiG1Rwt5UU(Rv?2E#iXd2r5Pwij<72gD+L>oJ^-9xXjIEVJ^={Xl~xkr?U}Sn0JfmD
-O_e#bAiXx>C9?h{Y>NDIsVOuu$oo=dxHpQHO$&P-`H|^y=HG7Xak`o_fOJa>QVYLZfx8olAft-vptCT
-PsMNf%G>mzL;LrcX|BvQS6kvy(~c?IXOhEXS<vRpdUP7!k@wvo+)Aez-T~p#^4w(Rh}jI8wKUDS505S
-ZPH2uXZ1h3xA}*wa&1{4>W{nxX4W=V2KDMrFK~Fn2pz#qJjks#96tcbLM5&0;v^=s_UNXwdlO~!V(-&
-~~7^3;}>2%OQ;0_bNpB={i=;~{ta|hF7lSfQ<KyDT`rDbZN^QY?as2y%H`_{AF;6e5}=ws){WUuo-P)
-h>@6aWAK2mnzTaZD0nfVe0K004*?001Qb003}la4%nWWo~3|axY_HV`yb#Z*FvQZ)`7fWpZg@Y-xIBE
-^v9BSX+<VHWq&OuQ;p0Lei|N%?-tN06(;8x|;$`ie`{L7>0+Is4+7#rHYiNZjt}qb4W_2E@NkF1Q}h(
-kLUWGb0qe4)o9o<#lL>F5cW<~-PI>m$?p1(QfwECqN(;!i#pvLxXi02ZTN33S6Zb?H*KcdhAVJ8UL)#
-Tskl@^iv#~&WZD6wS+%d3?iT*<_V(vrxT-5$oFIDkP~u<Bf7cs*todTG$aw*q?bok1TxM0yH`}A;D%!
-?33&3B)@m%S&NO756h40gxo2!7SOo$+!fkL?>H3XWTq*4bNw7U3D5YGVhAff=FgjAZz44-<6xCKv~WC
-gh($KYVA+$Cc;6Ks1GoGs>{o-)SZBy}>YwFUxZB~uDM@J6sw{K1>3+J54hMks?t=j83a#?8De5^zyN7
-oFR;ReoH)tK`s1_U&fJS<V{;%ekP6x@D<b7B6}PbOr&VM}V+T(DXBJmi;Lh%Pfzas#zs9mwNdFD;4(u
->30S1-rv5tfp5O~Cn$_~&^yG(e>nmGZBOBCxQ9xXM<_Wv2zd`ek1*_S$8rDm-x<7xypo}Y9XoJf7&J=
-5k!#Qu)J=8Zv%7^(;X9^8#>(=DHsnQxa4m-4{p|X?jAc7cx;0gq7NX>j4XbP3q^}WS%d&?b@Y%2S*<C
-V=VU*pYp@B)@ML`*iLZTH(+8qaiMKxqzq8)B`^OE1q9SCYiXqjlTR%m69B74I2IE#WuYBDYzYrM&nxp
-v+Ivt6oo&+~*{%z~igZHXkv35mfS0o?&>?s1#NxMt-eJF07_G0J&9?+S@VFy`Hyf*Os0FMtwh-k5i%l
-u0Q;?$W`sJ~TH)jgcy<^gBwyx9=ko(hJL+X@(2_9PAFd?ZM6Hjd@ED_-2Mz2|Jl?aOs76a!R|&0{TTh
-B|gN-fFciZJi7^F2p$qRkgdkaoC?kNDw=MblMqQ)w<KVXVxP<`Js`HIq`%fZnpup@pv>AaVf);HE9PZ
-t&{{*8=*i5|A@}%OhHr*jKc8+tpCaN4UgJ(vl%Z-HII!jj&ZdK~Sq1beSX20X_KDLz_kGgw@Q_Avnc%
-s{(c|T-kdVT4s_IhcC``hkH_82WDIGS1yO~(Ytz5bbW6gRdK78F)cJ0~-XG%{WUiVx__Bt^oBKA%A#(
-3J;@1tiw;ybKBmiqY-(;f>hM>cY~oD&cI_~HG#rwl#Kp9^_I{x}d7$x0hBfn!~Q!_<&n9{DFua>!G%>
-lcC~NIz9VMyp|s46<zbA{a&-^@65{Lr<$I4^Z2f+Hyae?j%}*)~Z><bk(S3goh^(+ytn%!V0i?;77H*
-ZCXA}l6cgL4Oe)#>-f}rloiV-y$6ZmH5*s(!LL4K@kbtFG2U`6;U1d}X)4~n)<-HlP!$HkPZ{zKJsU=
-?HL)L8-*e5Iy+AiU?ywJb#6yTwz4|z6%&p<}M~tXbe0flhLht%p-5f``Nn!1Z1O0I+xHSfUehLWwd&X
-;xL0-1}P197(1O@?2EIbQ*MSfxryz7COB^qMZfI^kwI6!>~*3?cxQx6rjISdNwtURc?vMn8$5rIMCDl
-*m2&I*|8ob6NJ<OsdGdAWvvIQfF1<W6@|;9o;`oz?5Vu9xWqm+gLwYpYgwPQopx^tLz$Vk2kYrLphot
-LN+K4C2LsP&fx=J0cVUwI(y+3VW`1Rc>;cUfBS2@;vQum(Iv)Oj9#&LO$4-1lSz@eD*m=5pmCSgivuD
-4YOe!58on&*tU8uCa$ozvu*FmzmI&_#hPQGXl179HJ(ffPI*<9Bd|{`HoW9s%sfr}$zU&Vrl62<N)hi
-pnOKzO$VbR2rv_}C@uoe?y_^q%;3Fngah#M$>~P61bb8j;QHD_Hp0+8G0AKbf{`?Ad@Jan6e2S@ghB=
-IqC{sHiybf(?IZ*16-l+YaGpWd!SXhWsx=iwb@}5D2i$|kdUwg?f3TcdOu^G29gipHSHz@PhrpDX-rX
-1R;kzhLzUm~(M@|64}#h^-dp*t4MniehY0XfO~C#Rkuai)1v#;&>zWkt;{mU<!$13v9C#;Q_JylL1Yr
-n!}3b?UCyX<gNk?Weu;K0mZlzAYV8*g=KsRp_>b>)7{_uS2LCjE{mhUzt*fBpD_UhA}Lc5N5kpKJYvo
-s?=>KL1(smQlAy6@4D3DX$o><^=Mcj<4ySG_E?{x7HX?@G#N^=fIqtWtrk+};W=1RgUEh8ibrr}B8H!
-j$fy!tr0{KjO(i9wv4<{jQH%w(EUBAorNyFVZUo1=?JsE;M6DF2PjnCoR&{|9Zjdt8x>RRd9OF^k5m>
-=QX{z|h1~c>G$y^ZPSs{`ww=JP+Yx61148m<um{uAYqF@>SLg#dSRY-kR7*AV7pXQ<o=#u^$He*P~Q~
--wGQie;eucz5G?o!Q1Dp$asU2NiR(E?Q??uDd6%I{frw4r1B9~)U@H!4#k8AD>>vTE;l9*U4Qpr~rmT
-;G=fj-?KLPvM08EIEBx=qj2kUxsPDn7MMLEFBqis@?Mo+D%f;G3(NOG)--vJ6p=1YVF2E=bTM~q?39&
-uB1~HUi@tp%+z2NF!KeqO>V+47^9Dle_O#T_|-a&9BVO6+L$V0E1B#2%_mf_X>n?~rvbaN)KBa<{aQM
-s?A%^2=+7<gKEa$DBE4_9{UGT*8-IlHhsLu<&P<W#M0MXx##SK_F50Bqo18i8;xK*D4*&m9Jv{ph#_B
-IjqrU)9O9KQH0000808trnOpANPLc9O~0P+C<03!eZ0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%h0mVQ
-_F|axQRrb&x*~gCG#acRmH1m>Atn7#cfw>fR7MD~XCZj-{Wz5&xh@Svc~3_wI2G+MegCRwDs&(~lO3S
-4y`~*@4h@k6B_(0QID-*wbhVC}XUK=Flb_IF~VgKEXh~>;QM-2S|OLe51cY9H3F1`2pUUwBXS=GCBZh
-$=GJi<#Jn$;YAvNbp`V3_hK6p`m^J6NxZ8gu*)0ED95l{HH&koX^DAn{XimViN>-hl5CB7jkpsNAO!L
-_1eW~)P)h>@6aWAK2mnzTaZH{aR{YBV0040T001ih003}la4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj
-}zb1z?CX>MtBUtcb8d3}&EZvrt4h4=i5w_REI0Z5%HDzOv^v2?1U#3!uYC6VK!@b8=CI0OrsoX^is&+
-a9TP`c=!*aRL^6on^GL5)$lZVbxnt7_fzKtIm96D`8eLOv=mba9jvyT-R7QRc}Il^x;z=K0ojUE^Q-<
-935xKom~`jhHe)i}l?T*EnIEvf^aV)TV~$erpPF$ZCgy{2Jdy<!o3GSaD{H#A!}|THd>hLu-{Vt5zi8
-l5NhqG7pR2_7w7*A1=}U&!;$4^!gUb=4}1}P)h>@6aWAK2mnzTaZJId2LD?H007Jl001oj003}la4%n
-WWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zb1!CTY-L|#VPj}zE^v9BS8Z?GHW2>qU%|N_DrbfgbXx})2(T
-ngfC6a@q}j5fC<IzMMT{j<An7<B`r~&;QW9k++c15xDBk<?+>sVdtF&bmH&rcG6XBQ2OeUpP4QoZ4W=
-|jsrPEsF>r&Lfg3vXtuW<dkWZJ9?q4)JZ(Z^odYo}?>^Qsp)=LRn5L%*w})vB&RcOq{4qW?UZObRGjW
-+2~a$W#k5+iGDUA=i>OFlS|>3YaY>44*gb9+;B#j%~TL%qr%j>BUyUFw&YcqZnCY!ZIO)gi|6*&Q4kL
-2g6RWV(Buwzg^y3f0+aa?$gEX<=Gwk?iZJTUR<-SsB2boQ8Q7ZFL16HuQl*u$KY8QYn<n;_Z6&pJr~W
-9gzb@2GwG0wX(1Qo&WFE(oNo+}jV?cs1}lTx+&Z_E0`0fl7=|kNEf{k<Y6vckGW~w~N?u*o9~6_yvJz
-2ITV{4mE#%rz0Ide(hsD$yP!dfOv<+Vi`M`K5>Ea8fFt}ib%K`!L*kbiv6*%*h86w1bB9FPXI#F1{=`
-y=nUM;V$m-o|v`e7cOL>K;2vU`Cf-WqiO7AxLxy&fpRIM!B3u6M6^JpXuecKhXZe}2F7b`GV|4h5Hz+
-UP*M2)6=iK-zH`$U)_Dp*SRk38oM%?E$oUH+V;<8XEO9^uf&S!E+9+Wy#0orPfN%+48e{i2{Ga?mBih
-8)F@;E`pA%9ZPdA*&|7qwP+cyaE}6~lrY%d9uciC^Eh2%8qpO=_fK6DQy5FngE7r>3_{65SfL~$(xP?
-h0lNisL&p0uI4U_fk!{X1+Tt=;0xE&`wF0y&3=}D%)Hl<{idy`IR#-pPoH0|WO<lzO>Z71AJHDeBG6k
-B}L5Kyy70=h0cxbS~&k?FyJhg~F-S9dDScBbYNqS}BH47x-b~TN0jzK+>Ax)KIJ839zu3@Yc69IDdfk
-qwoxU1D8<TfT#UMquKDrQ3fR3#k0c};_aX1W{ANk78_rQCSVgcLT*5(9NPXLt^vd8Ls_)CW(XPp^1wC
-}}i937?**llLbl^WIzkpl&DdD+&;OGW?biE~ht&u%*|`h2=hA9K9KYB~~D8h~6aT7&55FTZ>T`E^+n;
-uQ%XYCz)PwNutD+k@Y=`Ry_c<D?;>IKx0pl?&<#V85tM{eHie_%%KIsB<&$Vk^X%w5}-nX@V2)dprif
-pdf+1Lhqv+eD9T|m@qzwkEVm+Wuz;%Qc?B{@JIV9xpfAG3CN&j*_wMK9ISrz-Sz5t!As)ckB;eo}TFO
-99H!I`Dxmn&_E^sDdZN2-h>k0F`;_|^A57h2>YV6P)wj<31ygsCn9shg=Sg^|4)+~;XAB3$oE4<}2$2
-h?>CVlJ<w{Yz_7RGGA9KZjmH$!;=4GdSakkl~V>1nyPu7)_W6EFXD@yoXv`;mS1%Wp4Ck(S#keN@7iA
-&pw}$Qg`kg)9!WTEi|X6@}47M)joKn5R^)&Xd3IBzwh<LLwRu9Nl7}+`*Fg;rLds-p;7%W%Z(VS*3JT
-#R!`?>N$I&{{6S$BlJG;HQu%SF$6=4go|4*IGWM)V8VFU0aP$ampm@WozH$g>W-mc|KX(eXm_V;U#Go
-x@@}YDhZ6>Gkp6OuCjigwhS#onM>5Xl3m0s%=JJ`32f&NC(1W0OO<(%~8h_RK-<*o4(?RjWEy%Zs|Ff
-{sb!JsY@n#f%f*<_RlSk*)bUMBDWa=;L{^Ch0Y=x(s>v7ur{q{Qb*|;fDDDY=Te{Tu;o-03e=G`wQg!
-%3LtMUJeGK`C2^9gs%?!p|(@i$OQ0|XQR000O8Q5kVe(}>1YrU3u|%>w`cE&u=kaA|NaUv_0~WN&gWV
-_{=xWn*t{baHQOFJob2Xk~LRa%E&`b6;a&V`ybAaCvo8O>f&U488kTaJke@Q!nd=918Tb%TC2GU}r(G
-=vu8T1rpOX|9+&S_+wjiuxRqV#}CtO3_U2-9_biSDX{$^L;_>qY_h=@MJoWK3CZ?2hVy$-6b4(MK-#H
-<P4Fg_WU7Y(_^ei|pC{^qhx>X5P3RAr^xis4Ck_n|+d`+4CW=hkz|BJGChN$F$OU>JQ!kTM#Q^COJW8
-;)O$<3U1lX1ktJm2Lw*oZ!lwb|_-}v!$x7}97EKAu7YM`#+%XYoqRq*+2aL0|)DZwu^HhtGkhh^BmU_
-)H&pdkZM%6dyml?h$D;nuyM^&-w%d|a4Z6Ym)*Q(p1(Z}%gy7N9^TYMN6w@TT1nH-H}p8!<gT1&=d59
-=i{8iBA4Sb#*!?$zs)rLYHvK$wJ)E#kw1Jr1s&xtgffPk8_gccg;H0n0##1pkva1$293?&~ikLLmda=
-jKiDw1Kj~5v>~1$)<1)G4yZ#(kidG-(vRNjgf;w52=A7<QKQjE;-BTyWvk_g8k2=Pl_hFrb#2~PispU
-(yXYCmCb@b4c*cJKP)h>@6aWAK2mnzTaZD6&1xGyq002J#0018V003}la4%nWWo~3|axY_La&&2CX)j
--2X>MtBUtcb8c}pwG&sES%&M!(;$jmLsFDg+e&qysw)ltaLNr?wDxwzuv%TkMqGxPJ};}vWbl#C1vE%
-Xcw^$abPxByT~0|XQR000O8Q5kVegDcv>CjbBdDF6Tf9{>OVaA|NaUv_0~WN&gWV`Xx5X=Z6JUteuuX
->MO%E^v8EE6UGRNKP#($xO>s$jmLsFDg+e&qysw<tix3%q!6Vvo$m|xd2d00|XQR000O8Q5kVe1)<vY
-3pxS-@FD~N9smFUaA|NaUv_0~WN&gWV`Xx5X=Z6JV_{=ua&#_mWo^v8S(BU0x+Z$huW)qV><;x_VjdK
-+FPMcSkU)&OIl(L@Au)*I*PldHWtaVxm)Ey;pE&LCP);(F1VKK-`(_IIpWl?W?c-+ijo1E5F6+QA&sl
-o=X4G}}jc30dKNsGf|JnNAj@Ey@ABFzsw{sulaoGL4%@2MMmz!_@<F8Hs$I^M+WIi~I(-=X)7)sGN!B
-8+ok_-$JD2#(Tsz7{`vRfKA_a?i6fnf0lCpHASL5K~^YzSn-pqm)k1k{FzHW;;Gl1+eYXljEp8`@t^v
-t^N=`vAv-aKn%rI@m<`Cc!sMv?0+A>Ti5{!}uE-*(7ggK$cVa_y&nKG`eBJxBgIq{JF>Y)e!=3aCj5r
-n;_VLafZ|eM>ip}iLs@}2-_g>((lrpzrpEEKyFBSL%fC(Q=1SR#Wo?RnQX{#=@0`=z)=SJ&*c{<%8K@
-l7Y$R96rMH3S1F__iV&GR&z5M)4hqMn%7J5Fzc|V2{DII1LHBn1`l4K)p~mW>#Odr{&*DL43mIY&OXR
-L9uNT%Ro2<*Fn$5AbDT+}Wpu1}zY4;0?r@_tZLR1_@fjz#}X-y8<J)r>8QymsZd1fzf2UJrmer{}4%r
-oLSK{wf08erlmu!Jgzqnfh=qzar53MWtq3es2MQl?7b$j|KVty9lri=Ctz#UKryVC(u`9Jy^EGa2MLq
-v<<QugC;?aJ8#yu!E4kDjmcjItM5NE274!Mmxy*s~ntr_iDVfg<g%N-ShoYhBOs3m4#*g{E*K|fC;+D
-vAV^wxWWkoyBy!MHMrTj;0wKff%1^dad@>)p3gDE)zV+xmF-%5w1>(T^)o}uCj+mdY98lk9y?{fBDKs
-T{bs7zi~qbs;{=~4vJK5GyRA)lud1+}TWcJP&Z@;(A%zJ2$Wz$*Sf1&-#NaY!YbJkm3vH&0?Hxj#CU5
-J4wDSTF29M6<GT0ZGbVts3pxo4IUC>kSGFf7sPrDsnc0m})q-n@oBL_c0?aew~`}C4^b{A+iF5R7s4A
-cGb_?&i}b_$WRDdH9>Q$wsBoCD`gM1=PvI?`$3w>!u}NqxSxSac`{gAg;zQJvT)$EFY~UQI81Mv@;z?
-p*lBO=oj`;2SRBO5vQw62WLR#AH%Ut(wWYGwXs7PHd`zCt1$*96VAiE`ujE5(bf554yNK>RisAmS<yY
-fO-inLY&D8tiD~V9Q;-})g6vA(iru8Lr2}IF7*Qji?eyI*Xx-%&#cC!#p7CJGBdy&1U_SlWsf{~Nm%4
-|x+Nlm!V0>k4v*}ao6=s`BgtuOZ~V|a^(wX~rg0y&aXthkzdz2<lp|L&(qukRR|6^J9%2P_(>xpVcGa
-l@uUFnP%RGuAIo*EVWc~@`bEqFeNw!KN6(Nk)l2Wtm$uPK^YDAHv+d{(F>T#0uHLX$8M0jw3KAv;(ly
-A)8x>GK@CM^@bqNeHuv4LoJ`Vid{;(m~eBId~XK8~Z;Q~PNbw-SQxhv#*Bt?<Vvd1D!Ix6HGel`~bY<
-wuaPfAGYvG%%OPP{d=r*m&Uf>@ZK9!HTWQkwk7ajA^a)h71#?d&azryJy|VgEUY@XscSuUE!Y6S=eFe
-r0`eFxs-0U7W3Wye7WQ7fBo0nlqPDzUnex^cc}Ff+yJ2Y0+Ignn}PlwxBm4Geve$Q8oz}vl16EoAPE{
-liLc;`0dqgTp{NZNFAzb1DIXw9vccd@5N&V(Oz<X57Bq-pQ1~T$QN$*OH-50-2Lhml*dPGAs0AuufMx
-(ul1&tCB5(%!g+>4i@eK-275@glLVrQ3=rsTef3*kWp%=Ugm<^0>Fmi*2n}pd!0JV}0g)E5aBg>eP;0
-0>{rtl4!Y=~fkFOapMDrf?ZGVvebtIq*^J@$WrF9G)|B89(%FH;b~?0~<)7eA`5fsRkFl3EKbZ$ZX=p
-Ys(SPOV%S#hEoeppE~8P7r{nPY2bX4uWID_8Mxc-~m(;5miV5GO>fRl;z^94EkP}bE<k~hwTUQjL~<5
-`2}Fo!<jpS#-<8x%iASf)%{PG@P2SP22k;rW8i+BmGAcjdcQFoxG@5NrV}fG3VO|hpE-6PoOUd^I#hI
-BSvEiJ+m&LU1D?^=*R4Q`&FKI=@hBN@D;cJg!PNq$NhAt8y12LVcEwddVCfXEux=INS!>l->ih`yXa5
-pE_Oa?*Wg3d>L-VZXdrMBvPLJL5y?Aib3f|u0b(XFW_BI4%lS{o>w@=MG_i=Yg;)BlBm&7f~2h^EmoC
-#+8+@>nO%fw)xYiH`5Ci+O236CGb_BwTT>tNWm<}0yIZe}Uo4m){oD2F+Mc*ecVr`uyU)J;fi<(tvBl
-lrXjy#OBw{$M8kpk1G+>^>v_o|9)B6?eBzi{WmR_}z!*$Erb+_`&=4^cl?;mtm%d!<uf&a+B4NC(?Xy
-gL-9alAqEOU*R;*4kF9?NA4!@98{Ta#AvJ2FE|1Z6ZjOoL0IUD0h<dlajXUC1AwrZjo#|wqLk`ZwNkc
-_jfUa2<sMu|T)JJ|Va#y3X853`uMQH9r-y^dHsJcx9qyI>)__ByejZS53V7lMy+3X9^0XZ)qKtTETHb
-?$t4xOqR1(<ab=I>g$^z@8;5EV1$i0k1Jjk^SVPyqZ8J1vNB_Hyi!SORTR-R;D$FVMP-=L1%z8Cew1D
-9K92d|wWNJAaVW?|RRWH!)2B?hL|-kA$6ZO;MMA1i^CcT)E#l!B`6D%^Tid%&;w^$4L1GHP7I+1gz`t
-ps!b=sKG}Ajj&UDe{Wkdp8%mY<n1)veQEf^u$dF#}E$j%|80iGgNmgEMo*V<%-Y<*)Bik_`x?|ySPbQ
-V4tLj=#6bkT*>RIUu%TClPN}CMMJ`?nm0xen>>XexIGOSA&gvF@lW!ew%avDcD<q+`ed&n^U}IGJC|%
-&0g7>-t@Wd{4o1Jz*A!%OIlQ(Hm%OS*k`qr@oqMYh*)e1jmm!_T>Mj+#w$zpJvECB=QRE8o8OLcXn}_
-soV51En=!H#u>9_4S?Axgi$}IeLYO)G2%Wr(#bXk&xewWp^Z*1RP>n7_a0AVr)!0@B_|Nf@j!hbA)_`
-O53>D%s`7I)xfD%SrI{;zKc!!X}|Y4M-mq`LX$zx6xE(YL;hzty*L`UQgjZyx6d(l1Tge{+nV=>Q6oB
-#n~{iBb$sp%?<A1ddV^O~D8aGb9PhaO6vJ5Jrn01gP#)i+Bw2MH0TDJ<y*x09T+W0m{BKFU)*N4geuQ
-qYWIrR5G@~gAK`S7|>a?2>`?sn-JSzK$4;xg4j?%fWjLlSTtxz{$ASxS^-E2AS*yQ1BnV0a^f$I(PV=
-LOCbs`!WPKbFxdFS@?Rih0d=6F<tPC}HL)Ry7o`Z7azGuZU_+tca{fdPM0o+bLE%N650dn<t7jtXBey
-Ta>$r~@_g9(50hy*M+r6r{1H`|HJy{%fwl#~c%31O|+8*u7o_za-@vS13y*J_G_I+Ajw5?QLN+_(#ck
-DK%$khO&0JG{gdWKay9&;A|sH~o^`Top~N3$Rl=~8~QgAP2m3o5l=XoyiUlOjt<Bm=;%O7i09VDi;UM
-P~Y7Ta1Ru2_G!v^xnyvG!?bhbG2C!)YRJASs<6WB5{-NAlL9#q&jL(kz7{3qg}zjPr!e;$TjK!+ufmP
-TP$>AtIqGz+Y|v^5nq($U3t%1&SI+RP3mkBnpyfEH*mRs(0}I!{<wsH^9C;W5Bl%iz}Khn-?@Ry{e#|
-a;Lo({pRz8sCvVb$jyc-jR&)Sq*pXSOWm9s>V6IuzSi5?mH;6=Mr5B2hE@D(x$vWYB>0pR*0%oD$5g?
-)^A6FULLHkO&+~u$`HGufiE(m#6bTo;aeB=I9RQIxnrHq<&M<uoV<TkXp+wlbI?$B@wdbx*+(F()Eke
-X-O!|r>9lqbm^MW1x3e0P<sx^NuZJMC5FR%2S01Cqy{Fow9;;YvDl6~yx^yP#GNV_Mb5JsHIQuo}|3v
-EmC#G?Cn`6z$$l^#G3-+q+eyq=nn#Bcf%+;mKqNxx+kQ?GBwEYs`NhNZt1{bu@Q`d(UBl$TY^0E*Jbr
-lxh)iUA#4RrbCA<for?t==4xlWrR(HZ?wz&Jv|YPvorYpnLmZ=16@t)-tcdz8AIqKov!x+j`E9(MXY_
-Goh})zL_>G;sWWdbjk_$<BCG5fG!?sZM<U5llHzCV;at@i5@hb#g*>86O3w|?!^1TX2GvGG6qi0dJmK
-QNoFnv>g^byEHS1*AI_=hYe^nz(@p)+N;X^)^a?9b27S*_S^}O=~tGZHZu?Lfp!&cvB<|?k~vwYpv{i
-&-eL$?fj>VdGlLlQ1FPM+-CtbxaVe|4pEa4&UsUJK(8#-7U6ly(h*8l@g<ADxD-d9p=lX00%`v)n=EI
-A2X-dJ4l7F<7dhCmpeC!S7Jm%?UV89rL<wZK;1CO|RccvtSO_BXOX?9TWAxK~Kb6x4`p1ZgKZp`1}tP
-#_9hBK>l-OfbhdG{3HHRwB}Fe|7WTCExUzvbN|P;VEWd?$v?jRM+qK^uKiYKe(;a~^@9R@?(eWviKAa
-w$^V7J`yeBqkDi*i%KGZttNU{t_D#Hyjc45a;-fP-36l(p!(VZWI9?2K?B#r8=wd$r6pzVG3<w9YNvO
-q15AY3!zr_95#sjff5*wIYjCVjt0IOKsb7JGi3#9;k0Q8Tkg`5D~2fqR011<u(#E{=`3o=?*4mcyA0t
-?Ftm*EBQ;xUlu!W#gQp_#>y0E7jw2R~ef9lcx*3fs`|;yu9O;=BV^5z<QlAVOch1?ZFdBe&Qu++zH0J
-cvgb$Xwxzc?HP3P7p1XQ$En|02vMehc|nUc%r|!`lt)+>K)B24U4d7BFf<QhI;Q}Ot2&^QF9hP^4uMu
-n)VEDY_G^WLfP)hONOU=dAtWs35OHc`i_(xvSQqsZ2ke0TmA=30#vj6XuCr~Oz(rr2H5)67{KBP(0=@
-Y!hP{;J*^CH#vQs;W$wAgJwWkPcWv00naOtzLgCX%6?A-Wey0qRn(L!BTZ3jwZ)Uy8V$iEl5E0ef0nQ
--9KpqWZ`tHsTo%GZ73lgge_}dK}_2mv>(4qQyXa`u+ErfoZU6BE&K$$7z@zet#9aeUA$k-ZycLzo}E8
-t#1o}=`8Q!G_peeYQf_p*9d1Q86oNPqd1QuD2Gc@e}Ju%I{dg&oz$uND793HE|AXhM2l9wbiri&hrj!
-H8y;<9xb*0aIfkhljD3+y0R&Y-mfB{($!I(|8Wu-t?$0-TLK)if~=!X1%@EgVvdQ28sKv?`fCgLB1oj
-IM>H5(qr3pUG6wNhFVX)=Prta+5Nz-MPAUR=5DbCyJg^VFGoCI%^CYdu2>w|Ayy0+<@(jRxf*A=w0jp
-)OYV6JGxCzo`TBt3=TJg3tGKK~zJ7XDewo(tjT%SU;qgOUw9|z{FSp*p9}JFEwh6iB?A#8A(_TLj2hz
-~n&QRvmnryFO+R9Lc{_Js>8zjt%;3Ye~n(Te$cFJ9@WE`kxXj@;R_*UD`m}c{<mDya#7QAmhSz_n!<n
->BS%-hB02c6I`l&)r4^%Q4U>6qXkA-jceT@hHF<!V?Nbm8wCG0=w-W5;I>He~kMWxHO_ay6;0JGO9om
-;K6!6kcpk=mRK6{6IZMX624#>_=M3gctCbQQURCSFus{@Rf7POj76C>yB=!@OGNaH9l4e1|HV2hAi4=
-)9cY&H2{lCn4v?WXRek}DvC<wE4vxxMqt7xcBO?J3EOR3QPuS>mT~Kuq?bUmi?|}c3OKg(uLrwFIhe#
-FKZc!=aBoE@scsI7lX*lfnu=)V`3TC=XoSwV2~V2{pngr~6q;V9ac}OBK{z-xc$i64e$27+OpM1Pz1^
-P#k%k5Vh^X6N_roLR_+WS1+a0xn0#85iO1H}6#;y3ROs_&ZJ~Q!6lT^vWt`x6e^X@M2L=vVuUTe`f2;
-fwa?BMiViw%@Wq#yO=rBH1;oh{>Hi~l;|;QX@7su}<!KLv5~W)8f3`{So$0KR`5{)H3#dp&%>_HSE%h
-G`5V2%JQyuTUD`8<77DzKCcBz#6rnVgw-d6^CYCS{uMFfM6d$H~u9`19XhyMS@50BH2lDG3N<vlf+Bd
-8DKa~FU~wgZ=zs>(o4sozr+bB{5L3#fYZIq2Opq3xd{K@6@Ng`mwf;Tfd4WF{N=>SD~=vu8wA-P%qAi
-i%VNQ8V(}pGV8dX`i4$z8NrDpxe~xZ1x~p7$M`<=?+5Ri`zl4n6MeDm}-9d&ao>h+hfbE@LNiCSpJ1~
-uxs-X^|{t+g=3$e2+!}1NWR3P*e_D%hQx3lCuXM}-V1iI5ob*#)T?#_C{i?>*V%HghHE|S_>!UDJ^c!
-Mg{E+m)=@>ZzKnprG`gOk4n-#=pSXUiJJoYlVvD6HKz*aBd7m<hU=KSBWj-u6G8T@W)cxqXBQE}t(Cz
-&zmrjSksw0Q(k%7ygEb-K%0h?Hi~P5SQdHQ`Oi6!rwAH&g}Fc4>-~v_fzFxwAIy(QE=z&4xQ3|uJ)Pt
-B;ib}&*YppkaEFT{oHcatydyO4RbmsdoM%$^mYqZsiE%^V^;53e#Xjt=qpRx*Osc*<kM+(Uc85@yB9v
-37(WfO&8*9_IIVe^v4`-)p9b!*=i1)KqZ^oL?-=sT+dh$ML)<AMb6|(Zxrf|JSalCiS|7}aLkb>|3a^
-q+$lW=m1v@fspvdv_D3SfsVo4&t3PiFV-OdkYz#}db6om|C71%so*tR#Zayo0~X{3vamqLyx?$6L8sb
-kb%^LtZbMy^swEeqQrRuJ^Lo?<93;m7q6X@xf2<h*!~9e{~ZRDtGuA=8oLJW)D2kz?|_f#hm)suf%C<
-#>J|5GP{8I|Gfxw=lS(vfcu5;3HGtG9C>0^agJL1XEG|?2bVn_Slle!0NmtNa&G}8N(M9sn$@+oWk<T
-9vKETnL`u~IH~K>>gn&#6&jli3NhEhRH#(vpQU%#jB9v+MbD|v*)_5G29urwM<acq?mSf1#dSOHwbfD
-eFwt6fn3IlBUd-oqkYK7I5I2n!`Nj<E@e*EDj<^P?w02jkiy`L%&GOypde-JbMEqimui3ih8yFJrH>`
-#M4VlN7xu9_uW^uw(%6&%wPHh~51Q`OS^*stHi0cZQpTcyTNJ^%X$x^N}RJ4Z-AAPOL75;(a9u^n67!
-xba@AYQJhjQEK>Wtnl`Wjg)WbC!f*5C)u4ce$P4`;|=6#UQ$t27!W{|YAZe74uenA-vn-HC^XH&^$68
-L`+XdP50u?BeF;mrI2C9dEuLW4Q%!{#w;EPaoFzFEI9hu-gx8`)j>lferZz(ST0Ghz)@+9x_cVr~|MA
-OO|-^@;h3j9>6Lf=3pO`e~D-?y7<iiF@OjJNQh%ge<Zzt59klz63Hw*0VN7hj0l!POHdqCpns=3fqYD
-sL@c0sF#w0?(ovFZ5_l1j0A!J5Lr2S*qBocP6<sIe#X|=QHTD;+i~tA=HZ-WiEK(Q1Es(P)=mh<v?$l
-noll(w5?n^IA;GVyrnF+wmf<B8--7$)f*<H7kahJ2jcd2Me#pS!}YU7b?PXT}jNRbT7;<@9+H86k^%?
-H%IBOP~<jSpm#;;m7J6?iw7+^zE)(m|h~ZqZPS44RJs>HyOHS~djp&q!y%)(A-gd;Sh}@aJJlyn6PA9
-s3bMN4^{l1cqbT5}TSpGDbim`tvU^`02hF?iB`b*?Z3L3cW8V2>mS>JS3Q$pDH?K#e;cE&GOknTWV|t
-8bwyw5uH0S5Y3}|=SwxY9FwQ@po<kO$o=s&uk6l}8mF8p%c=R{>^8yS?lMrXKGxctcH122B_A2=HW|!
-$U8{Ejp4v>ek2l#J82om*vnQ5pJ^vm{$|}B+(!<hb7pe;K$pyzMyqv=@&~%S&wju%J9PaUtV^#ZS&nx
-zw+KP1knD3{nmM8Olef6Ccg}?_F@?o<WNvsbnDGAH_$O|!``A*^Zyrr!}_Ap?4aXa|1aGlWcTpOVg?Q
-ba7X@N*RW(^YIGd7){kv;%=R>_3#+&yKKvHN^H**E*bgzz1KeT>h#vg<TH7@eu#J}GKdMiyhikduYqL
-+F^mbEx@qRJ;jLFV4^K?wODyf3c|H$l$zru(^8RhlQL0xcdQh^k-<4RQ8n>Hl&x=(-$ejnJY}5%WL*~
-$IxGUeq2M+7*(16IrXpvK>f41@p>|$_eYb{bFor+{ez@Mzk330$<RN?Kp-V&(+{IY{>>}<%42zDkDM1
-9;isn-`bmf$_yAX|a_GDqPgf3i-$(i-3sKJ?(x`}?QQs=_rOYY8i>SWUopB3!ie|K@VmieM&19ZA;;e
-HI7=NuKr+8cKluMJDY`DMX4o!E2F=~6KW5$))6T{jV2#6d8-ZJzqZ(s*kw~29cZ@WF#GU6V-UbI1!WA
-dhZ$oZO^d#q6{Yk!TalR-57bv!?LNNaFYh<(Nb+9)Q&onY~c20mr&31#ZR*Hha-L>IY{QKmSlt%xdJ#
-S#5Ho8IFhx=@IxYx~-cM=payedW(#dc4(mFRx^^Qcj2Myd4d3mbtCAiz@ast}{l$x#rN{RFfrqsJay=
-g{^z!Lgc$EVHbDPORqpXGdw-w%<-D)f7|$ePZ|4-wfx;v{t?#x!d3p3weOyC4em%By&KDM6W_x4WhbL
-BOn&>RtFL|T{~t&5i>>`nNAeS+KuDY<VH*9?(gxDff5o%oXvzJKq9vmaeubW~XvqL)&;`dA29o?vEC<
--TSsYNW+-+>hyr%Ib=Pd$qHhdY%_&d7*KL8?tGmB(SnBPzf>XpI`I0GOLc(NqGh2+8_{Afvu1MCEjm!
-mPYr0fCtO@#~7h+i}V2yM`IaplP+O%TX+G+4Acpd1vqqIiRcf20=0k_wJh-^H@wbh`Z;OS=_*#%9R2)
-lte>>jRqw>$^MqJ;J;AzTbnk+n;T2=!eg(roIdQI7AL8#sL0Y!DLo^x4MBWy?|pt+9vPGy34HTKyTLV
-LL<CS*6om<LFGd(b}HX~fPC@e`1fqT5?Xxi-`U#lyaiQFanfdRl3az=^2J-emqD8ODjd>){RIJRQ#HI
-nVm}Z7`C)Ir2l-VX?;&k?CoeOHMOfHhem0h$I>MQXT+ZL^Z7@1-ain=Ji_aX;`_2-%w!uN`=XiSd^8P
-1PV9`(3|MyR3Nez2hnG2NcepL9Ld=D@P_MOY!LnZJp(*wHo5lV++^9Lb<{>+GcyDKz))n2-N#V8nIs7
-E`Ls8%CHOR6EQ$J+J1=5kWR_oo>X#Y=T4;8<=%-)sY8*f~n8-qxzu&MeboDb}tO#fYh3=j`_h4&jHA4
-b4QF;P6;ZcL4W$+q=4f!Q2p-f3DNwxob=+Hnm<)C3ekw50O0r9LiyDPM!?3FDqXmEcYNf@fIb7*nw4d
-m#@zIL{i`=be~91j3mrdR|)of!6EniJlN)YPgw0-S%I2>q;qmSmqq`uJgg9B@j{A(c4PXsMH~AmlvWt
-t$@sR?F&B<ft>Sv5sD|ryMchvr#Na}4Nm^JN@O!%Dv}Vra!<|^$<SLd(s@bY75cex|tL3*k)w5M}@=>
-+@PKcluyrRwD%PDN$(&1TgC$Jfmvh?d=`T2Q&aKh_nZ&XbMQ*#zkXMJ+=UsD5(8Y+&)?Y_U5sT#|dhd
-DAZ5We`C34Y;e{tjF!d9Ey6*j_8Ypp)pJuX_=CI`HCcypxp+!@(lUaqJ*mTgA>p@WRyaA!h-9JL_L1@
-<8uag^39KfDCH7?*zhIWro07>BFWk)2*A#?mVIl@2n8Rm(PRBpW^AMIQ7kCI_QY(=Y99QA<9|x*4}BF
-Jg%_0mXT-+ziaTo9b;9v>o{ekqcIOkan?dBZYQqUk(b_wfT%Fn7`JjqNjn?;EZIA1vQ7U<pmu}yKDwj
-sbZiKDtQdyyST__Z=r`@0kq_!V-A)kW=pkQV#&iE@Z&RbMF=mb4utyui!!DFXG&j!<mI-!0g<7jt_;r
-h3;36s>y}DXG*HGM(()khT>50F&;=?+Wv{aenS&s#+lTRnsI+8c#6y_*P(Z~btwtbJLy?)%f&(uIF2!
-2LxDERYp4MaUAmRGwq*H>cgG&=pSC*sHTn*s2a6aT*c>!a`s-tjLr_?~G0m&!j80UXDvFG)Z`Eg5otu
-tc|k8V7nFj~6hfs8@1*vVn;W_DV<x@R<-_JLd5M!~mUrd}#r&IA9hb?*k|&HZTzQ$nrA)exF*B;2CnU
-xM{#H(BF^%&<jm0?lu~2P-3AVVYK+}5w`g81o@%@@XJ64G=*NW>%b-WF9RLW5Q<sce+pfi$M_P_4v57
-x$6l#{nEyw|++ODDeEJ{(0-GDomw9rc@)wMQegV1d#bG`K_#4RmvWV)_@sHJ5FQNUOIIj$vsf?<ie@d
-MHr7Y+8&rS#Qo^0l*oc`f-Xa;IOKlIc)83<Ia_#gx4&&Q#UWck;cufGwVMccviW`ThiF3jcfvT_)j4u
-rf2g9tC8GhIhlb+x|=U3$8kXK~9bx$p2ybv#!L=VphSnb%wpJ)q<!7es5M_eOZ8$MbH_uHs!3bm{uo-
-S69NrIx%bSk}!4((JDECf$rzpk<}I?H+9531w%Ljmx;Bdm`}}h0TM)T5-CqMK{)XXjIr{#*;4XJ&oz*
-3^Y?^su)cQvb)`zK+;2q+u!97v9UI9;S$HKl^vS+(5*{0*PdfVwEgi8rfv2R+iYGL{6MXaJY{Tk$7c$
-71qB1W-THL9t(o)~A4siK&0}Q5yX+a9{M34yhel@A+DeU)@Z0$mi+DeT=vCf_aa=o)dNPuMf7YS%ELI
-=kSwtNy^XFw-U$5FSSt!0=>)g9hkHIbkPGTN6r0ms3HUENDCi_)g=)Ll9^Tf1Rz5BiObnWwTZ}ZlTD1
-7O7KE?b!EBDF`x)78;kN4PE-MIE)o-j-FIg1R=D`FoY_PL$TS8ZsT%hr1wvUy&c9a0?DWEkb!lbM{MP
-IqjtsVb~4812^L5uCZr-b?d|tR{Wt+j}XoYH}29F;jZJBpc5@vt>b+#3?$35_D?gy_L>^6ad)0Jj=0>
-EPsE?{R@v)59`z)inX#u`*Y*qx1%0)k7rfxU2epW9lEw|&~?DYKy%la&qb6Mox7>E*#}PCt2<0ajYv?
-Vrg7xm72(+>l-&WpR<0Yn<A|Uld9xuR5gpzT5yYQ^-Bub7yDNC)3%Ap@xpf9AFwSjQ8&BF1<2lD?>+o
-5r!{1rr^)dHbx9k}=?cV~IKeYJ^zI?9#NB0^iNRn9ckZ3SFql+NJUb#v@<h`xj4PK#I%HP017}8&&3(
-#`tD{UGh7EK7|b^u9?|4PlKmxL+?K!d;F4TUdGG(s%eH3swl?<A%VFWKEpu&i|^vBi@H7(+0NL{0of3
-gh8oMFVY{ywb83Pa0X`t~k1&8TPW_lb7ipy!0^;srV~*8{i)DNB3It7j!}RKe^Y^FYfhgN{9Y1r^hNc
-e9Y<g=i|0R+@mF!8KUp=`kR=8RY4sz0g%`wo%zj#CVnX!4D*N3g%+jzSD_n~0rFwIy{9tgZ1`c!NuQ2
-Gie&e`3pCnId-KH?>6HD>OIF^LQ@SW8aIf~B4cR`Qk3E~@JNRm83HQvpp!3gh9hH-FfLR%y)?QdxTg%
-}ev<IYx$B-i*9v@7%J7qK!>T=9IZQ30vPAJ`dO588%9=}X8r<5_AX*dR-@Av7FlU*4Ksgw#pwb6~LQ*
-J4lCZy-bRO8^-aD&LCYfoEElH}GG{xsVoF%R^k=*4|?CUV3(`Gw;P!!tUIUNT*=dn{cciHa*SN#iQ&=
-HRLC>r85??(w)@c2%>!kUoC!`%F<ZeSOlOBC@KQKFQj07HWf#(I*sAJ9O&<^?JMB<cCgdCGl`Ud|_=~
-BO#<B`p`Dzbsfj^?z}cos?+^zn@RCK@@;>+9-!(%g@&H42u9fnrek3qceIGa?etPqWZjW~5HKZG^EJw
-T+;&=lqP)=c;WJ#pG%`kzy}jT0OW>g6mdjnI?o^tXRGfbD22E6lJsu#;okHA;{w&s++jUi;V|?lx4a{
-vL-i5kY_Kq}*UBJgv9`OU7Sap+j&J&Xl%2aZB9Y|+nN1<D}+2XZ*&wIh?B9FDVvMFvaP{Lff3%1Yp8k
-44E6;InIZDHEvB#s$hBUET9jIiemk63X1xCfncw}|nyw^x%JBt{Hz86#y#ZYiUGCb&z#m$i$kF*<u0^
-UQc8=onk+jm3uP99Ko+IPLxTkgHvIT^WJat)Sbr@5YgtvGaJ69hXT6jTL$7OdnzTmf`iODk_z>sgIS|
--VENJPd+>J*=YYMh^;-S!{adshfLX(670&b0Mmk(V-28n^t&Oidtg5B*?(I3i*?`EPmm7%gz2fss%~D
-5l$-QBgPq*1_z>LIxMKV@QENx>2Yx*r+q^m%lG9uiBZPeardN4NuX-!dVq3&<jwt1<=;?C;I1N0ToSY
-$gQ~K_cnOB$V2}X#P9>;EcJjuj`lp()X5+yk46@B>rGn!VIcR)m=YM$kqnafZ<lDiYNHf4;GLPNBiKs
-||mCfqo4o^BAUx!d)=>r#F<-1Rwib^XphpND$4H4-fll2Wj5cDB;Zyy;zwmZB<{tcTzLQD?2;8R}=xt
-8nWiMOc6EN3@`B7uG|T1XqeNGntOs{n(&lJ!u@)U9bRmt*bHW_?|Gb=Al8STafi(eWS}&LZQS(&;xHj
-#sz#En;xMpxyVj(G2dD^4D(`?_LI<`we=0ttE0TneMnc(^X@8{o~uP9h22IGzH8{VX@sJ?Ot^zQEjGo
-S>%3*a`-T-A+*Q<|NuFGxg0y#_qBi3D<A~e^yg|d+li~P57p8Bn3xNa@cbeC8%24`Xn|ZfN_Zo~I6sZ
-tYuDTx7jDbXBoiuH^9~1R<seHMSGh@x%Dr+2088Y54dR<K%4i5-o#7um@vHn%-Fgv@PX*AY5NRaSdz-
-Df;SD9pYTAxVKy3;Gfjh_KJ&SKQ9ls-Tt?qUVabCmsJdY+G`W0S7WN&l>%U^kvp=T2Vs6Lsp`+k|=j=
-!3`Ho^*kJDyMY=<ddw)=&B%U%3GaFC2NU!oelq8vV{Iybm^;B|CBI&L;pybFnq~33+UGZc5+dzOuU%c
-fQ^LclJf;h=*5p;(%eGoOUkrt<Ki#bV^pv#Ne5CI@Et%~;Bd)%0~Cg2UW6)KR<--d2B#LQeMuwuCzJ_
-&`SDn=MED7G@!bJ)Bhked0A!0s7Ka{iC(!khaUQ*nz7o*GSGGIyx+riaDp~erSrX9cg)c3R{vT7=q~J
-xF&VQmz+kb~Ly_UhhQzrMHQl`aNe-q_Ec+U%UvObCO;^(sb$7nvU0Q-|D|8g|Y=iz)F4WLB7+h>J;+h
-;{t_F3T}R_AA1I&hOoO=vWY7I>leaXb#NRTEKSP@yZGN%;|NJGX)BYOUpn`-plu>R>^n5y+X90~?<L6
-1!ts{CGJ1V);sLdE)gNGn`V?2X-VvGwY?@?aasNh}JT*Bp`J)XUUKxtpHm=s2sUoHEnqCr=lMQxl#%}
-1oD$7%I6Ul?=+{WmvBmk$NjoKJeVVihw*M3Js>v-Y6o^mOg&yXhjH?n)^`tkH%yePdtru)D|xDTgnUT
-(z{;+;tr%7q&cV60TYo%2ZH#-pMLL)^qU*U|%?K?Fr-335ge<SuzOL@h%$mxN&*%}&u8!7N<6f^1H4N
-iE9|CBvT^d{U9}W{|2d=%$dxdB2-Q{UU&9$++v}ruDEuH7SK%Eo3l9N*>@czA+bKC@|11V{smn%>=yx
-6!RHhV=SS5JddY>|DI3O=_;75h1y+Cc^@>dru<z>=F23a7qnQW!L?FC~M{W0|D<ao#y;UXl(4KQp6W*
-MV8Dv6Yr<v_L!D(E$pAB-ORZ_d=CQGkP&P=*qIU%VQowk=^O{eP<G?=IN!e)3P(7_m&szw{4HDtK3~*
-ZF5gqhR|>=EmfUzPU{c=RhkqncotZ9O}8m{@Xn7%I9<y7@N|wGg9jwVF=N7QccE&U0wvKME+9q0A1XM
-WaOlt>m!_+(8pT*zG|p<VQaKJ>dRqdVy@r!y>ywi)k3)^}AFc<g4&J-#0sV8^!$4`oy{;ZQx?1yzEAK
-|ioMB^5_5J+jdO)8n`hQmWuW<v<`%8G|J#zreNOHi9*=a^&whzj6J(J|n^0u~Lr<Akn*qsph6WKcFWH
-m#PTg>&D=|V1qi-fo(^}4NAcAP#+dpoT|L=v~+lWe6NZ?*7}ueCuZ2Q+_l96f7W9RlpAA34Lv`t*XEl
-sxbCJ28>sBlU)Od$GbP^BglzSr*A)c*iK0Rev%cDw5nW!AKiON{K}4xAeZThMl?w%|^=MnpG9td9jfV
-W;@n+o7c@WKPH##`>AFG!wt2agUZ`;4f*MM+nscCJQ@L|H|P5<QujUl47mO7l!&)*e}Axua=pQPeL;k
-YM(PA(=$z?B-0Xc1G7*ckR;MTZJSQVId(NJ|EB6@352$fyICNop^NPM3r_=rF-cxU7L@Hjms3||tE|?
-)%u%{Uhn**xmR|yq!fpKdkr>l!t@2cv8C@a@EkVnMI#yg+hX~Ti>*om<uJKZa~f{>x0kJrHv9+y^I$D
-N^s?Osj1NZHS@%<OHdMfT@7%~t94jz@)7Vk*k{?MNv%eYdlrBcExOLq(DtnZZ^HceSBK_5)2S&Usj9w
-<6lOT&o%y?Ol7D_$OnJ;T-kkS-)L*&K4s5L)c)rC)Ov%zDC@kv+n5)y)eQS4gK5cz>2rK?hub=r<hsu
-yb;>jx>&SzJ09&~a3Nh~cl+b{;1^dDUCo+pyW{xG?{zk+_fD)_jC?x9>~G0n+VbP7Nfie!1O0$Rrm@P
--|N2%5S?hm``MRp&CX7FFA#LT%zV;JXjw-iTV&jsI0Lad=#4ZCh*|x32>{a^ft_J^Sy8ONY!C$-kX<q
-??Ay9;dDT+jCg2qS~r(qPQ8SocEzyv`O6!Ybld4P@~$cvEyIzul$(6Wl}EnD$r5mA5v1+P8z;th;`z2
-^|TEJk1ebt5-)xU^nkCH^b_|Ft#&MVBlKCRuVYFm%}%D25lKi~L=PWT9~W!mU76f>>fVu)pkjKu61Bg
-&^3(@nWzg$dWw4yrLw`YhNPYe}#MC#gHSA*Sf`MsYYSTxtE=j5HOlQhDhoq1+#v9Ffv`lJ;XHNHTOJl
-E60+M3mbZ0S;qp`Kwr=_O=a5;UL@K@Y3io<RQd0z4V7J$vv=lp!Od8<6(HUgl`TOEX<3c8MCGkiceOb
-{wflSa!nhS!|NEAD$mJfQVtTQ(ClokH8CF{PzNgTSSWB*;;NS5msOa}tORfM~$BtSqPJq@mU+s+Ww}$
-^p!Tj$Ge;GaWdHDbOetZ1WW(a3nkyi+<__5@ZgT%Dk6V6K}orPT|zyZ8IRZ)IL>7C*VkM?Muwp;XZ*y
-V7eCAQLDwj5jFB2?ZbsufN{YZyn-St0tK4h-MkQy7Uhr+vCb(zRGz(vyN-@hx_;XMEm1yDjb4b~!{gb
-a^<);Y@j{R898*#f*NqdTSbakQP5r4Q!skOL;M(tBBTg#h=gtFHbvW4#Sm&!Oa6g8D=^v^ISIAC{gpd
-&pXL!{TtJIZZ^o#nyc!4tpc)oSJnl-s`srd$E8W*tjVq54tmb?{v=uH@jSGwT*9UGpq0b^9><oKUE~_
-$MvbDnl{R$II<Lx1+N-QQxAJ!6o{4_|P#%-s4i$+t-u=Aa-q+cbzb-O>Ua6NqQ5fAmD(dMp4eL-)<Jk
-&U96qGDmI&Sa*B1)<2*$W;iA&ru<PSxIYtGqN-*4{TGKWFER#T^DR&a7GY`1>cY*(E$%oXd>2@PoG&n
-*laZRq2iBDX?a(_S|fWD;ABCu#Ue<)4yw!g55JcLzY_h@{WfNg(g9T^O7&=)fg<#M^gfO*E(7d1YE1m
-y1*uGD2SPyIH5PnOfcFxp4OF{<2%cBXe_QW!!pEA+-@iJu#J8QH-~D#`t;}VI$BJPN4(2a#4~<j+gsz
-7%W=0Jh3{nC@gcmr~8yt?A7oT4$x{P1eb@(vH?~dw1?r6oSebP<0ilirrYxR=C5nErU_Q4c2u&y@>tw
-w%B{R|BRL&92vC#xrmpkG2ZTYPDie{P(*2OSCvPkKonQ>hvY%4(;t$Yj0ki>Zs-t?b0lr>P|2La{0N?
-wurS<m~&A+m?0B2s&6nt4y004}p7R$g77m>cKA%DT%vO#RHL{_4&*R%t$08If70z3nN2tY0(7k?sRmY
-@oWzf22c`Axnc5R?EIjhAeI-vC=gEkSx8ex)Ns3%H`x5;g+m6gU~P?EJdqD1@)oa@6825XoX~EZK|xl
-E;9*yan{-R4kANFAENqZG1reKkt{LzSb5z{$w>!zhKx_&&2@xh^X`Ia5k`Ax#XpV8K-$b-21XUFA2$?
-Hdh7ndt`dfSOwUwP>p(k<oCn@fs=#)MV=R#ekI+1T6TSX_kTrp7(6f-?qfOnlC}peXZ!&v_WUEvBM$0
-o&B6CD53ZWZy!_G30y*0C5YOTP`kc^cz{;mxX;W1!qUqvD@WoY9(~)`)y_O*cE-@GNccWQ^xMA2@sMK
-C6W&*?YRW5zIC+T45DANU~@qGCgpH|x|=9@MH^QH>Pi>f;RoNjkHb0+vd>O0`l{;-b>^mD2m!QK+1$K
-yMC9Y@Wu&c|mFDCyuw!?{_>-0DcM2a+bc$Wm%Y)q5Y}Iza;SsCGUhmPb!$P+esnIXxzLD2Bs0nSC=#J
-_Xym`pmZ)+2&e`caNQ&sF`y*#So^hpDFHV`OY}q(0r<PoP6bzZPcvuS+Lp+!M7LL;Ri7r9=k2!T^Ll6
-___$As*5`u@>0#AmD(3q^;nN&S|u>fJiVJ*UZ33BZu(Pe?a3APXlKVmm^s&Ksq$0&p|)-;Tnwl=Rxz_
-p$vmV_s0C&Xc4`g;ePkmF$cS=BpRuIb8k$UGh(WvMKH3rmmv6oMv`Xo)g5sIn@4|$|E?A{GsjlqM6RJ
-_?0Y8U=P1Ogw_?~Jv2t4=vC8rIlIdQMdq(kdTi$CZ)h40IRVTb!c|IJdnpAi%KfXsM!-@b3F4`I&Ywc
-w|k;!VG7-<Q9=FHG*8m!IJ$w7eWYZ$n`Jc!(w<536C&9xPl7ds&sQaI|H~!^AA*OJ->YEsyGZN-hUF`
-}v8qf4pSxdjtL+n|Udq*(V>6r&Y1)F4S0@*|}JYW8$%nI#pdWSZ5~{qdu>w5^LF%Ns$`S!Mi|LX1dLZ
-hA*jRMMsjsJ=Yj5Hu=^>8aQ)UDM5LRvznQCZuuvDCL+a04=&Qo+F^!_4t|b3_ZVmuW~Y%UJH#JS^2Xn
-99Ow0oz^`XlXik9;*}MlJALd%;xTd>DR|ctxLf~R(T&nHyPF-lbR8(FnS#)m6voupXz!qW_Ykbz0l{M
-L?hvR*k?jonQ$k9@Ek2Zr!RKN>~fRX*)w<v6SIC)xE6px_OSP!fCx$0^H38v<G$oF$f@}7+Nxa&SMtU
-HYl3~H-W#yCowcE*DhC7m`a;YPT3?e2TQ-`Vd^?`zwSvi47@{NL-ngYA!9*}rb`3y%MPc$yE)|K$`v?
-_)y~FiMgP^A+X;EL}FXC70#w6uM;k0WAt+%iqi^!#;WK2}8d2!bN|xLOy=2KzwbvOTe!M>Da;&KqCP1
-3Av>H19*n1B|HElOW!oJ<mZRK4KLtJw&Bumut--h1}0pRI$~teu*>E)$tHxCA4qy37~qskI>{?9kxUk
-ayNsDy7UF}mE<5SM%f`UuD`}9z{uo|>0bp>4?8iPf%|*|?;MxH9*T3LC51FQTQMvF#{ppr#KkZ5?mi+
-xsu>I2xE1xsUq2H&Ji@nN!Pv<B<cl<AQ@Y;T6!F_=9#Ug5Fb=F?n&%Bj|uQF&URJZi6o5gFtY!+`s4&
-!)^aSta>^&RBCEJ;w$)&MCVIs4=IeJQ~|T}g1phr`E`$;mdLPd)!@9sH7&2>r9P#3w2vrF|sr^-R)Lc
-sO30MD)0#3{2yxBILaG?ogTGg)Oqh@f7;kX!K0AFLv<Wg?B3<YfsCv(16|B#`eaF(ec0`!lOY*nBvA%
-%AcqJ5cgi8MjH4^gV^K4>z{5H<p_;Nq~+(`L87;IP9fz{c-XLj*jhm)u^o>4E9E(ky@MPcOu&yWN$%@
-AQebV0o$n($dsJ5Lujg8pPNhY3C;y_y2X79~2qUxusHR)zoC^CCl2+1q3GwKXZ?Py9FVhwloP%$l4YU
-%opdQl^#gAGwt?to13wk0Plcy8k*mHQS+q(sgfkc)DGH#3do~7VM6fSq?$~c$<Z6NnUw<f~lad&>6uA
-;v3^?rEw=W&I%0B?ra0v}Ggr|buBNs!%wyDx$#?d62<%hHntl4q8?W>Ot(jUk*D_y&lJv3&?0Zzy^_-
-`ew1UFPMpzPw@iZ}Rm4%`@t^TnP3IeijD^a6awz*)Qa983ik^9G2x&WlMoS7MG?Cmo5x5<k_6(#__?8
-(yk2T@)}fH2`zgeDqEuljMMnTQ(3;2<H%AUpSi&UZzA~j3Wb=41dcs}134fELnJRm*-8V{OTn92zB+g
-C)N{FE*+<cHb}cyBywtnM(ga<2ZdvZwfwO`k=_#Nh;6V9$y+PUYl5t3gTCF1g^&JVfyDQ{j#v3i+-#U
-1mRg#bZxm+*H%9&p;L*kyxNMi6-DygSH-#@-obfoG#F?ub>Sw5z>Pf6{)3jR53Md=PfjG53rC}cSvh@
-*cSO5Au%t97C(a{rNan)=?5`bYMo!LRk9r9th<;$4xse`jWbKBlIBcV>b<rl!9;Go`6cb|t?EsV~2A;
-kU`OS*KfFLc!I2f0Ltg0VOxZ%bBuHB&EQd=y`M-@loOoUS@;o^4?Y6*78cb%Pe(V!I55z)SBk?<QW`}
-%sHVUif7EnO{3TufrH+2Zhc=K+Vk4ZB7KkU$!F1qC&><V11_Gmk{SpG<~M?rsys<7#DK!>)!mwEyw>-
-Z8#`-!YM(}`Ki;=4d9KhgRq&nNRH0l6D>vM_aW@#TCOB>=V~7t=P^GJ6){fQ=pik<yrc%nJQBBvLph!
-+0ce~s91m8~0Ebtl8-!Dp?;N{vnuH!~69=ZdKlH!rs_Sh!d>Z)wZ{!z*M(@p@o@qF`#81?g#uO7FA<h
-T29J!KYVQL38}w?@~p;~qNSbaeH1c3u3HTD`J7ex+*vobmm(&F|>jFL@y-{UvuJUi$=6!Ln2{p_l!Fm
-c$Em@kIP^;aZ>s4qux^z#BC9lDh$hg!zlL5+=*?3H+60f(OecLjk%hphRCA9MSONqJXm@%tE%PaFbBK
-;chgsm^IOB$HItu1s0-(SH7(s0prA?Wk~2N<^VWm_&S6WuQektyNIG*Upa&=ED_LBpIDZVg!tmu(BvP
-vTeqM9@qKqAp3{pjzwqF54(r?3^}r+a)A#lKG(-OICVu)_p7K*2>Bo2Xq-y>~wY1ll8t8ylDcHy6z@X
-Vj*^7RuqV;_~gZ>uP`g!HZs}A(b-1N87LRg*mAz8g2N)~1hJ}vCMW)SeL(iFqxYQV~kZ10BR&IerX)G
-MhQ%__fUp1*w(t1Xw3?rsFMW2(tW0n~DfTy1W9p!{b_bo(rM+D$NK7@xM?Ixbe!(8%p5+%a`0OY3X2_
-Dz3H5P<mH=Sp39MfnWZec3kKZH)}w<+grwm8EpuUS=DLiPC|N&8GsRMWU@&T5E{(IgGG?gPJDf{aPX)
-mLuS)TlMzxy*Tmdyp?jLA6&qg?5ubuIeqc@-WhO&iT!0axKkyOuz818tTEI5ZRPGVm2r<xpE6c+WQ1T
-+R*$hfl^3hi>%>KZqpnj?E3UUOmIUHTDb}#-B2dvD4a9pW@J?tk8H=-USB4k=Am}INc3=YOF`dy>vx?
-oRBgr);wa;KaTMc2Xsp`JYAS)b5YZw(GC7CHOP_8^wqH&bM3Oq(fR@AaKmGwg%?Zc#NOXu?BkX<z12A
-#NiN;X5MPOjJclfMlFqdjXD1{-J)BOI#AlhRzwtwtl;Xu3vIJrX>I5V0FfM`2BPg3F`F6k5;6t3cJQW
-Vnx#I-TprS<&_6Y_E^g)|m>=jEU<_ok2_ImT64-Fw`{OU*X_>a|vq;)l+CtS5J?rQ92jX#A$o*vAK*O
-ZI6~*D{4|1XgZxP5}<SQ<DdvkpZ~way;+l+*w!uj&abF<;$G1=JK{XhiB2Gi9^UBtMiK(SufHJMS+*-
-(uG-)E;_irDktP??l2Te@He-(A#`JlNz|48dz~YePDoSy=>L>(V7ya6ltRlPHi%%6OBhQOef#*l!euS
-OkyhRn`x5^RlbF+o}5;guQaq(lHB`idhGKG0nu9i)XJOVJ(H84ie4p;UgRtZ+N$v;{Av6eV0gAl(D7~
-tm<=HDJLz|SYl#{tv-@@V_QKjAU;SR)z0HqZXv9h1{+PXXv#hJO+C?ZY;6zQ#w66dX}(lun9qvw4wAo
-YE`k<au*-nek+O?STAH>IWvpkcQSzZMqZ}G%zkN)Rv_-J6Q^U9T)phAncs52JUMh$Z^V`JJkg%rR{SI
-WXD6N+%Kp$aK5cy(b(~jx;$bu?%?2*k4m4kPQ{`_m0%hyUtJYD_&&LWcWDwOTm@YBqE?~e!eKm3M?YK
-Fj>V>jdSmU!7MBn{6+9Z~N<r;`H;Y&W72b3RIj}=}Y#=EFSO^?!{dTPaL&Pj{ZZ6RFHdXK$EEp^@o=(
-x{t4RA*3Ox<~;1Yp$z)9hOu6I}N*BB^Hk20cp4A*>|xSH}sI}-%#5RuOX%Efsw*@QJDXS?7;Z@YLUNU
-rPdwYr}Qr@vkdz_R54y%ezPgcTSTN}81uf3J;RTF~$bLD0!>{VETOdBune^n`Hsz~aJ9N&?W6T^?v72
-IKg{;7v8mf|la9xR(*hwaHRqQKq)K$?Pi$+6iq6YMo;&YB}$S<TKd$<_QXbz7TBDC6=NX`%9gpVqc<O
-5Tu=!O$s8**dPR+etO9XLL4ELYfzE3S8?bL0qx)E1;E0yCB=)XG`(`x`7=Bt%<*nugLRWE8BvGC5u1b
-j5Kb-Sa3_Xw*x`zk(Bnyu;CT%JDm}kQ8Z;{SdgB(4Rf<lq3+5OkE+?GtoEAgR|2`~3|BJBf7x(-!EJJ
-@Bq9v(M8M|+WE&7hYXl&<N>_bKLPPEA0^2^wpWJ_dwCo2A2q6^OU@mLspM?}=#Z=>I1uUl9Z?xd2v`W
-3y+uF&^T>=yNr_}-kO@L!2eQt!T7yz_0hzzctejN$tc(`diA^GnG6pE$Yq<F*~5<bUvRue@Q&P9q_|=
-!8Y@svx{aW_z;_-hYMSzYEL6&f+*$cK-~^V*me-ux$M)EPIDy`j26m#UMIw{I7>)+P?_PcnxqM*>#k)
-ZS{*~r6fqkX?9&3HHa?#vCko7hJ)I(F7-VZt}4Wtt9YMe#0d2~=Zl^Nuwo#sB1y3RhF<VGT+^|*QA#r
-uAUcu=S{+t8mZ?)OrXUk4!HP;Pzck2!Ji4iE-vJ573Fll^s^#<pbG-1x^{InYG=b-fpccywE<7AI#YO
-8@m+l`(gPfyksV?K4%%5HYP|X$uSo%~}(HUa(^MRyQo;S4Np%s(E2u}KZJ#myY47@%jxWo7}m)yNmZ_
-!*B%@Z)W1%GTpMXi#e&XD$Alg#omnubqKbskNu&dZ%#MI8EM@1#Jh52HDEB|?r1^GHq>&;~O>wqqEQX
-MNlPyG~O#WOz)+yO@UjLyQQV?haK-YV$DQWu@5KL>`Wr@)Tt&D^egDv*0LVfrhl*88eldGAze97q(Y0
-;HgsjEt7pV3YX)UO<o<-Z5nsLGpe&FRZXfGuyEllkZan6R#xIIcvl{4c?RJ;q_)^tv6f3Dkwa`hG>1x
-$Cz;alXM%9T@T_l1$&Y}`2%e@~2C<*=7`X)DpxUNQKzI9ge5qQgU1o)J^D-tvnLpZvt9iwFpl)b<FX}
-TN05LH>@>A7wh-vl8qKO%}Lizfr%}^@u=MwX{%Za%+s|)vbI)#_nIh5-beZsH%p`jT7D^K!xGHQzsiO
-kNyn^<cw`4r>0S)V*bcBXSeCYmAstOl~pKGPQn@46lEN#TygzLbq}R+a)ymfY?C7Ms_5ZBAe!+-I2W`
-x4u89%v%)Q97JuZVUKCu^0KPi{rB7tbzHih(Y0Jg)MQ5d^#NhLeGG=uj;RBa>rjpUCU1;_U+lO5%L;*
-w9Ze<Cz3EncJW;u+FOkBQHS<jM6UA$5)PYB-&aO+!Ij-#mDcp`ixt_IKI93}XCPjg(^p3Fhl<G$wYQx
-ux`krbl_bfM?zF*&J^hI-+tX^|7o)#Ko{dfuUFPo=_jX$w>tDuC|8b+^2U&sd*8m?TwkES~XWjAjt7=
-#-FcyL2Ct)S#i!#wj;M^7s0?21PAP+qn?;MXL{B;XBNebb*GYseUl9uhkm*w)_O$58(!CZ%x_^PG8L$
-Iq+nrRCpaF4+x_$a3J>G@}heMClrJT8%WolJCi40Gx(&$G}Gh+Mvq`>}_kpxBOp$voxyDFMKfg3N~*6
-Np|zYh_Roa=o0Nj6zTFP+#>99vt^NIlQCDukGtXl_2v<`^DyMvsuXPRL%}B87qvla#(^UK=7G18p1Jo
-0aon5MlKOpn)7^>{4lW8`x+Obg`e+8OW%4gOmtwxG49@J%%b-d16DXuG?1Tj_Oi(NG?<+mxm<WBg4DY
-WRNdG1lt71QIODfGVOrt^@IEWdA!*5Ll07kpQgQi7NJLX^Z!;EAU9`Z-t$Rv`{GOPH<xHDV9d#@hRhN
-er;3QB}QoXo!c!}A&RVpKS8+|K|uGd(&6E$TPFnKqU;z0*F2NAsQ_`TQ~ZP`nip((@zSS9b7AKclmx=
-VD-N=sJ_ZpLAieTLHk3a<xAO%4yTLPRVybN8AXY0UMpoRk+Vf-1mWVCbrx0{>O(F%1uss7TY9g;er%&
-mx=^NsloeZXrL$%z6lYJ!1ZIv~TL^VU(|Q!v&?uo8w%qaNjjBcG}WAOMhWxXhrv1fEUuv`slapq`QLY
-T-Qi`L=Eanu9m5_nWqAn=@c5N1R|(B;WhEb92tbM|A%G9^Zzjg?yP;WU;E~X^7ba#JHtDN`PqGI|L(C
-U$H3o*w*TGj-=f^VS@=^Y`E$jXw+G4=;u7H=A8uh}gzprs>@859lKYhZ&hJWgy;tmW2XT~myPidR(3{
-cw@ED!$#lzkD^iAzTssBLPuKb3-*<|}TS-cl0e_4f0-+DEBr#RVp&f9I!doFF)oW=HXCiI@y53#*<9i
-w|B48N<JTf~dfJN=q^_o~Ua*V-1tW8vOh-Xd>eZ*2dT4(;x&v0D9;HTJ1w9DDugP*rVS*k^eCZ-?r|h
-8*64pxpV+)I&4lS^1{3{=%)m)!}!4*JO8+*a##p{v87C@MZ8<>zjg%HlHnR*7)o03W9%OHUD@GaI4R^
-_D^>P{Az2z+S$*9W#DfZ%j@HSA0PyIk*|Pq2wRK1P(4A<LvR^2vcJ#N(og`M9iHlwABbp(0!|IvmU^7
-aV6d-lpp2^{iNotP474<$NhYphB_^F&kysotfkM;@z^kD%K~Igp3{J~WKEbJli3(U6E?(WXYw3}<Euj
-%x)^rP6DfIhmRNydmK$4k{5e;Y$utt26lj&5yT`s<|-H1yJMxT6QR3Nfh0=_3i%5<8=;<UM#k3L-!pd
-=P<a69P0)j{P41l=4vyi0VSVl_h}6ihz@mFf5_;gz87l6gC*%@c}9=`k?OW609>qdDC;NdaDWX<VqY<
-LknOQpXw84=2kbAMkX$BN2RXE^0$~8@MF_qHx9fjj()K8G5gc0e=?9%shtLAk>$mi+EML<dcJgv_{U7
-$^SJF`PQBVe$rF>WwR?3xZ!r1Y72(($LzvKQqKi&5`nrwb12bohv^Bn2y%GM&ggFFC|x)d=?$N0FNDc
-PlSSAk8oK#Z1*ReaOCfSOb3%3p?25)ZmDcZ5<yaILwp@R`T8;VA(V(5lsh-8>qa@W(kn3x^%#XDP*R%
-^w?dmLGhXd>knzqoYs3m$H)eSn)ldkJ}4S!M|I0c?t#edoD=;!!ru+-a$3YDbR8R4aOmr$_*#o$krbz
-hL|9+^%^4inK`Esw|KqFDS&LRbGP4@E%SSrvqRH%5qumBnRmgQMj2BVd?WqiM&K8hdM59L^4$?PK(M$
-nguhK4I&yo=??GZy4uKD-k^xk13BQl%Cr8#QYnwve|d(J^W(XiF^@&`Eu!}LdxH*`+$}2*8G8d1}Dg;
-U9Av(i?!hUfsdqbm9K0cZNaGhJjT-hKyQD|?VrSU{qwFCO74XdBH4vMA#!h5(a^3vwt)<q?hULBlXit
-t`0aFs?PJvY0Cl+G)~{qp>3!B`TMD6jStfq#oNqTnZ;do6*`Ef*cVHp+UG0UI-8mfISxeB{)B{C#zA}
-XGUAgVv4Mt#m?}hEm=-)bP@$y^q<b#pKN}sZj8T_Y1TQn`<0_+Ft*Hc@xck+Oz6yFsxc;Urb5rQ{yE9
-6(?Rm7;ad?yL>0`>vtx20uOLtn|lub-}M`0-=m#;EHT|Nh3m%O}0XHe2%5I*b2Z+OVYr*Ka%e<|(O_U
-nOAvu_L#_cxL4$%f#r-BN4#DM-M_tPaepeEStn!um=L7Jut7AUWwFV&<-1_SBupIm{)GX_3(<N3{)Oq
-?ui;=c!#HgfwzOzz?8T|R^oLdfcIAAfbOWq7IZGFZt$LhzQMr3!I3G{#x^-$ty1eVqo^q7N-6`4xOl=
-nCh$oK<O4vh*0K6M-A<INRvnp0vE9~BF4>9`)~t5Dh{YF%Ex~K$NUMCG%Bz%fZaf<HiU<`jo$q9KRUI
-e_@z@#$j;Ai;`N+Mn3clcFKahQlNyirn7hdkLgeQ)WkrUgeqT;Jt@dT*OU!pSQ=kBtiY}Jp-<(AmSof
-Vlpc2cR!&S0-F)y3~?Ea?k`(!Nr9wYLU6@C%hp;~USH%dfI|<8H2OSza~&rQZU4CYtv}l9CPAKEscl>
-^RUPL4v94OMfO6y+dh#ger5Q*RlcD+rxc^k16B5(_LpSqcGnOGCzgbVt8wS(DZW^U)_y9$;QDwzKj#q
-Zzp;(kvdN(-~m8+L5?FXsS+PDR`vR7?V2W7HDipmTAS&Jy_PY8Pm6TNQtZO30ugiR&|OHSW7&xZj`|(
-Lp}MXUCJCpZIH&X-Uyd-FXTEU17P7>0u`h)erAMY)5b^HtXbaFt4;@ZIDgjtEk*-_1*63?s1h147wup
-%!Aul#x!nmquB7b&<5wf0(l6q2M_Z}X%H?~fzunSfM2=2CjXKt;-`H)7-(VQ3uvAUf(qF<tMqO8Tu5b
-Gp0%`o3}TKmVxzh{K)@Szy_OP=bNWglt7$B>EK#ou(UU-xav<Liq5H}2b?0OWu7nZ7~LkI%yV)nNl7V
-Tht3ih@uAhjEA|XoRL97{L$}CAU8_jM4b#&QkDx^kZLiIKmwX_GwUP&oAg?hpyzEvFygu;eQhNbFu6<
-qEW<uz6{Om6xX)|_XbN}9HLQZ&!{qV&x7zcIX8W)r~T4fI!^bTD|y4+&cvnnZS2C^*;n*ScBAY4fzU7
-RlE{u^RJ<b=^0s}9p*K<E%?E*!ee{%i8(wXI8UEgfL)%Z~*9S^nZN+$yY;}W!mktNnl=xtN{}j167RZ
-0{aN0G+{?rV6SV!+Ij*Z3baf~Is@loeZusXFHu2@11XxxX9N8}!rBJ!BrMw}|~zBmlpJN3V9s=(9U>K
-d8}&FVJ@Tnrzu_ecJ!y7?B}{Cms7Z`vO(ZNtc&I}7MM1HJR9)t=uMd3)7Y0pGGg_Mf~w;O}1FKY4k;-
-@U$n^74T1U*Er&BJ~xPppTJB04SAegP9^{W*jIoIN!MWDI0KX=v3i(Se0DxG`kz>NQ9$AkU3jKWeZP1
-fEstt=PrO6AfiaOF&`9TQZT)HHkyY-tF6>#n5Mn5p1F_yx<SgrC`SI&_depQmZQnah`8hx;9uJ(5l=D
-;Ifm5P!s~GAB<o2L+5rj|2+Gci>>JCOLXN^Jg1LEX?T3JdI8j4sCu6`(khF_(HL`S)hkike$E0fO6kM
-$I1fo4ylxr8$vFZ@7x_xzbnxO<vzCD;%90V651Qb)%b#7VcHcx~WwaNmsk%xI1o^n+r4#7w84Lf(+cO
-xaQ#n|0SZ!~<ZIB1fR=}rk;ru*_TQR|Qx&9|g14|ea3c^2jmCM&1Et{ltwDa)`tBM2XW3w%Lb@s}nZK
-U9jf;L=x+=wnx<)9?~!%m+|83rs|Qr19^JKau9^&f1+-f*E=)6&3f#`IuDNKauSEE#U{!uTwX!knmUY
-%W#dre7|*@{gN&UpOP4WFQJ{_oUa-yA{l8GE6%lS)F*@9ASYZoY8{LzwKXu$8LA@{zsCo)z=G9#NgJF
-4Q<TWqi%0l`IzW#WxixNWo_Y?U@!(WA(HV!_%+5R=95T!EP5u7JU_xYB!O#2UH3GK)W3!4H)||7@1FF
->BSt(sJ#h0m;6yX8gyK@%flNNLqekV<7;AhS-aF09Rt>hE}vO(*u*Ctp@b=`}LBstd~@=#wb5#!tCs;
-Fk<N#f;sA3=$oqOfN!a<mQz5u(?Nxd0{6zVI^`iX%gZLHE3IWrbPGN^Rjyr_t2)93?oU)BTteW7z6cW
-o}39^@?31n)9z$;0%(2b+H}_`r_u!pz^*~mgveW(LdG5I{zQ5NdFM~Klm_7mOsRM{~Z1_wfMOHEzkQ0
-BQgKi9`Qq4>o2$bzHCXu`+NyR>|?26w1Z^!hC7(tIg?TJ)|n>X!qmG>#isy{kh^wu^frD*v)v(U!}AS
-O$?ZO3R{;&*Zj;+TNoX$}Qt#G#ntr%v{1w2__tQmtMvA?qzUX&+L124HbqfQabgzPL2`#++5brh4?Qy
-Yehv+cg;XQd9Z@~0h-z(iqsag8&+wY!~zXkAjTJ<b{SGKG^5o{=cZ*!;{K>5zzL=%!p7K|bg4Sf4~iB
-M<$)7e3oPv5B6OCd!IE9^b;`dug#k88Xz%Wt{aAG56fvZbFWu>bHSKh-`ie!VvP>tFHr&oR^95|74~C
-7SGeD_?ga#VrlTf7)fdG>-Z<v(p<0l^f!*4mRxlnl<OZp1l6v7UD0?x8L$w{p+l1{w1;1i3A1*PZZk1
-1t-sgN|Cse$pN&c;I%@5Tdoc&=3bYQWH2g($1%Xg@qK?TCS*Ek5KkYN=2|)|?>~CUo+X<$(Swvw8knk
-&kRk0nT<DuhO2<+nh3AWyfjKFT3Ig7AxI&91@(>P1ZbphqsEk-Q-@72LUyqMl)F9=duX2vY54aCGSUR
-1~qgMjLO}0)+dA`Gxc?lVry_SflI?b6ej;%pdzQ{r^TWsQ1j{Jw6MKBd!?-*yh?)J^rd?1`&7(+CAhV
-eXj8^eQoWCpDdjuWvgXF82%^qG)INO!G2odhW$WQR|X+|>dhoqG`Q%OZQ$f@H(hMer~z(LC%xIzugkL
-UO)&BC$I>o~u0Gf|%&1nFakM01sU?U|}}mNH3NZDGnpjhoe<#vZ#N|Eco`E`zo{F@bh}$+YP;&)`9i;
-7v}H2FTg+f!u;L$1^9dxL0~jy{u&W{CqnT{{N<GsMV{2lAW_02ELdzgCj_&yg%Q^*=F@Z8Uaoxr`Y9v
-0_<$?Er(GzhcJ&1~pGi&H0v9Q`_5&{=>BF$$L)2(a&TmQi*&m;_;ho_L@)YIdIeD&*GTIDPR3cVPUI0
-t$R~gLXQoSW5bbKBkb&mUOx>{2hUlOo2{rq^mHa7%ci!_Yn08%4aKHn}C$6xv@AhnB2VzK^W=%OUhXT
-CfgP$tYml5t|;Z#jtYYmhv-(|Whc5Q#TnhYo>uD1#T)3I>n}_k;7gNj&Pvrw46>Mw&B)QZ!qbd_Bom>
-r4uFmgR?=n{uP;_(QL+SjoLCS;M(!1{kTYcS{*RqWb1G>8Q`(BzcEu3aEeH8yv%XR;Eqzhn2=f*EfA$
-rjI`n^UvS^D-iy_`LG{F-@o4Tdnn#e7kle>M{kJ+;;l!yn=_|x;#>H3d`fou8%F$U1~q&uL%{JqMG!$
-dUZ&ZOx5Rszbwk7rc=x(3x=S9V=$`*>=osPup~7Dg=CEC>JPY4!IdpFUZuvS%>{mi!A4v`Ay{t>6yWG
-;2Z>QM1MfoP!h2f6LTbdms?^pCT)!0?bqg|UKBDN&{w@}RQa|~1ZJ1FiyIawOuW45%=VjDGzxDAHDeb
-w^OXndr2M#yUlkfw>34{Y0=ZN6dK0Q_*%*TSsK%l|Ybo&mj*@hvA_HwgYBoV4!c;_t3ipKtx!&Vm1S>
-)-AH{_WPc^Dh5&3-bC-cjd3?E~-5$knqHomEDnNk2Ol+I!WccD949BoXCqBW&ov~3uLtXs2r{O@~8)%
-5GaN0J#cLl$bwbXKcqC7s}nEZVQuOj{gDZ@v_ky&ymLFi?P!bVYZE+2Gy{|1Ro?=|Fl=IpBnqVh*kb3
-30B57TAMWX6Ad@t^<)+lr7G8!n1bFnw*S?HwkWD?J63-_jK3CXv;irjhoi-gFfykqW*byj=!?US^(U?
->cwq1D{4nsi2?6xkJj=5jz%ZyB%)N)VWr-@;;^yo~5@f}_jv_H6}e#DqHYH-yHIz{SJs59;i0K1r_n|
-g}kV|GaoE{#SUQ4wUyK=HLr?yO#6@HkB6K@oaJyfeAL_n36lWQqH^1$pqu%veV#D<&gy!Zn6pJjdT!8
-DBZJ{vsh!v9hRcFfHX@*8`v4KpY=~*v}#V*Pu|bnCe?lC>?cZLsDh?&^V8PW9==y?W2}{L`X6Op7!At
-rd7=Rt&*cUJJ0Lm9v=9o@$9eQ8Tg#!zkNCxH@RSC0>yRcgyJL2E~}f|BF2wH3r>gLs}*&eP~b$$>8d5
-^c5?FtA$lZK!<Q}=uTD`;816rrp}T;~ikin(q8c0QPTIwOF^DWq2~O}pdViL$gAE-qG7xMYI&kyNGMv
-MJD9NexEQWdHVgdJ{kz(`-Ic?c`fZC8-zEXZUDGl&iU}6Ywl#K-=>ZJ8D<@xnG_SD59lN0WG-hk6tof
-N4yHW3NO!EUPsWo^!=+vjfp98>Wb?sCIk3a>h&#Oa83b%%z%RgD}D?5Nm96E!qsnRkH>$4Otyi`D6qg
-~PEb_<(!8DDvIBbh?wOW7>@4RgJO|y|PEKEohu?)dP=b4~(O-BmPhADbHKNI;HonO}oE0V*C+&|M^Yd
-pw$Y?Iqd!rjUN#eLm&i&NN86wgeY<sFQjQ2hOxJVAwog~L49uZv_asm1dZ+JwnH$!yE|@Rw?SKm?$DO
-PdlDRDZ|lYMQ`pV0-O6K^L(KMcI(&mRjlBo_ptn8~v6r*AUlH$LQEwflT`J<2evia^T9MvU+YQ1~YFC
-8bC9ku6G!Vgdz3Y9=+cRp{E=+f;4(i=##oyje<U3JLus28k&6MBvhrX%m(eI@n;+?ny|EXgr;c(!N@i
-gawF!+odrg}<$s$<9;e%3LxomH4M4*Mo|)ENkk?8db_1N3{B#lH>Ozh=3MX6-gl!m3r;s=@Ch_vdRfa
-QQjQJ;tvM9iLwhG);k$X%~%-TDXb2zgigrzf4;Hp&<vrD1GxhuUg-^eR{~wF5Idc?utTQ*rc*9I20k}
-MW=|+%Pb*A2KK>95|ujGO`j>x0Oa%%Dm*Q#hi7)Wi8j8>aZQT{aTX;T@6N-)R%I_h4@8T;y0dLT5h@5
-Z3f_vqbl@A1UlW(=?>Ia1Xv``4cuLr(rDBhad(HTKh%c~(`r-`{b&MVhE4pnbXMe5Z#uQ(px&TWtpHp
-9QM~^KzMtE8^b%qUbx`l_Py&vLLPDbTvDGqTWo2k<<i?%B9rDeltam@Gtj)$>ZG<AH$2s0{Koa}S+X>
-)@Kt4M|HT#O#6Wfww=Fz8lRWGu{y8E^Ts0*}EhM1aaQz|mxHo%LkLo@N+vJ7xV4TSX5%I+uafB-eYv0
-zCJVf)8RA3VIU4c2Rh-X-zMnd0>~8;2%9YB-3c$68qGoG|`N=+oY<?qgH2Zq@7+j0|LFoBz1s~EiIB)
-bc?VKM-Fhrn@=&w*no}cJv%4tPH8yBk<VJtkeW#BrZ)+^msWh_t{1%9f-dX?#fLapp13KgfN#PhOO!&
-!p-<cNUOvvHhxF)`;xv_|K0eZrz7VK!3H(#xqk6cc<T$$#d3qYRYcBypu6kC<U8xJDOHYM8(>im0rn;
-95EzYPj3#-1z5NB;e|6%Y*$7r6GOgzmQq-U$p0j~!I$&K`v%emuG30c2AH{Q*k1A%JH^A-ac_^371Z1
-=^tB73-prC+B4fv?6{+Il`{s>{`9QZ&bECA3z(+&SAhuNy#rG2Z%9eVVUDR*Y}#%m~0&sSA$TqQ~uAI
-Bst`&lLTBSV(N{bm|sxGJA-LPqSQH4vm>35WS=`e<C&OrUJHW|9Zkt;23l2+a<<RO@}YVcD%S3_xZrI
-HB}8FVdDU>o{c$1UCwnzd21^*Ravd=v4^~nPFTqGL>oPX-LHtUWFt#yXjOpDT2WQ1T)ceAfZIBm2h{Z
-z!m5I~I^Z$mj&{ywX@_$Y72)nMOlV%*G_{k7R=lBsOE8#57nekBLlp>w?aNz~Qq7pzwNX)vnm_|OB6@
-l_Fp`fLmKwe4@aUy-{b0$;R6^f@Qrq$R%QZR*fO5I8hhn%-SVhla6xIlv=JqX+m6se8EzC%b&6D}#1U
-;#n14q6DY6anKN1Jw=#+(ESn{f^Wfdtm!Xwm~XdOfU$+A|%BT)thP%uLRw^adsTx<%;Mm47kD#A+=3w
-9gO;!hmo)6^40XR;GCRQL5aqOQo=6>s_->S{QIevMr*V=g3S>p@^T<X688Fia;r<gYDA-bUavU4@G_X
-g0C5@d+V*~biE&*ER8~UuyIwk#P#G<d#+ykoS(Jm$%gRseh8Nab3Ndh3=Vs*YjVuQGmCGBjZ8M_(Z63
-#S)n^wYf`%7Ozl~JJTK^JFlF!bTxzR&VVDzjEAV(+=hoEEUZ%*sA!{hBUb%p^>#If?pyw>Emygg$lR{
-=a<_CBW$ZNtdXM%){d(5Z6N#pq~ubEKh*@1PG`T8>+n&z6A`Viyi1<Ym++QPLs#;(j0>nhng+yz?~;D
-y(oOalzQ|Hv-ae=af2mwCB|MZ3Q9^PVPu$o$73-uchpe#Zq!wrlZr?GwVm|M<bag<*g5KtE6mNEpXRn
-50n*Mj)IbDFT5BlB6+u3(ZIvLvV=tRE3iw{}aDSZe+BFI8eHiqPLJ}*S@0mkcy7>>P7fgo+dw+m)?b<
-(Y;=={TE91LB!-e%lD<gvPEfdy4PEhY_EXqk3{d05|(U{-Y>$koi_I-6l^y@@E)8|*_(s+7O#%tT~d=
-y_DBnUi$?Foj_^%&!}lkq=zYyDKAr8w9h}&gp~+s^*+NhJ_k8NNs>AT1>Tu=HS&kc-Z%o7mcX>)YF!T
-9yWzOa^d1*&uKPn`eAvRrT?_t;%+l}wIaVO!$qQKjBdSB$e7rlpYH1oQP<9sF1jY8-q!@I=5vFtAS6S
-q#iWrxD|^M_x{BfC?u@I`s^n_I{#{CKTmo6jsf|JAm?-!<^xZ2Q};cOJlBs9V1v0*rj&opIsJcqdV!$
-Rr0n!5l&|29)hox=q%ZHW^$!7CC<@8RS+wjinTqllxL-Q{7UYjLR4Ph~6%>x~MqXSROA5>f~R5mY0#_
-v8JfC^!<~*fs3@*t(0{O?@6HgLNd$`blG&_1MadpJPDcJTM-_j2m8V2ATS#fU-6d!;VA!5=9dSN^6*1
-{8X8;Zf$wh7U0kBU2p`1KoT2++9v5W5b4VtxdK_SY<Hva)ADZZTmrZYewY>h2pREM(O4#3fD=(z+Y@|
-tR4NIR!#GrT1aXrHK-l63ib^sWAi|We)UrthpA7k$&VKIN_p!ycL4-#1#5V;Kp4t<6Bp)sQCfe>9{E;
-3O{E_;Xq{An8Ysg2ifeLw-0HI4+KPPB45<&`kn{<9kvF`*Dt=GVV?R{v!!@ZI8Hvbp=5piuBMQfGaM(
-V=cm2Q+RYUwaxHkhtoz0H*~`y41O!vsJ@v^;GK(!p1_q#fiE`=TLKWl^70<TW^4a`|8@eFcw|zTN#ke
-HPxI$OeyDlvXE7kJJdT+B{rmj1U3zcWjRV6J2Tq7vt&hmK3dW%!OWuW6dAXG?!sAl6%o^UX3W)%ZY$K
-x@q%R3=@ns-2)0H~V8Ym(M{YdaG--s(Ez-FLWb&A@%L|Z@ho<MTo2|(fa*Sg-38v9<JiNrhR8QxIB>7
-+&dLaQBe4f|fPFcKRJSmjQ{1=k~U=Kx#3qLBtMg6Pzf^J(>X0Wd=M9cZm@vS4G>Kw~!Nw)S$?ZA9Eo`
-};-{Tq4952*Uefcu|==YR7+e*w-PALK_q9*u3FN#is{;|PR7D2dTHOrZ!(pc`~zIEG@xXP`;ad;LA6_
-wG6LmL5XGy*IzX-j@Gk+1{1M-aNVuiIC5089NSA`)JX2EAiGG`XW0Nz0orvc0M@<eQib{*-odU-|9-}
-ujqLDGg3PVU{|Te_Gc%lopy&1@5Vj;HfKoRk^tDwEl;R@tJ}7Tx8noyw);Zxy`!+LLEnbj+hfM$4#5Q
-cThP3}LGz=9aOL<ZcLtU-?qZR+cf}1P$^6`tq4?hdO=gxp&?osGeLiSu-%1j|)%tE&|C?0x_ZmvyUDH
-J2Gv{r4XG?u`-hO@mY<o}jJ294rB}i{}VZE>M-)ry+h!E%{^Gy0-TM8LNfHd!Fi7X_K2vK&&(vPA3f2
-Bf+RZ}5&TjHTwRu88)TU9R{nqHSsZOGzuZkh)Ra3-%Y!MU?44z&*n{}OA)!O^lZPf0Nc3?mE5`oN-`J
-Y=gizKrL|4Ic6Ff%@ICr%9kI2q#Mk)KoPY8N(^fXPj-FgV{jY#AeuyB%i9DKp8q<t<xU2{3YIH{U?ZI
-h~qE<7|I=z7q=&CNRjNP6zglZ1{QVC=<m3MmC21(`V|yv*_S8VBd<hp0*hNcXqmNlabfzAG(>K$snLy
-diMQza$llK3V*=MmvjaAh+@(#m`(YucyTw5#`$i_LHuf5PK43texMbzzhtZgN(=5wa?_aErqK_h4EM_
->fL^YZfoQ@t?)!KPd<{w<5&cLU}O`lWQe~_$ZX#A=>kpWnzv8B{YDZVDYA!QnJ>{*(>_8ZuIKK9JV;?
-LIpx`3}eW1Sde;U%l!2n(G+n~#f?-E#|0y;|;<tA7w4cVGkj@tJtiVX{~Wu1-%8iPO&NT5bcz$g5(ND
-^`1v+u*F#9$(&ODxQY(a6m2&&LlYi5$8kaJQON%&lr4xs`f%$h%6e#EthK}7jkj7%H$2p2GktDZIyg?
-W0sLYXjEn82wb|xuFKHhLO%J%XA`9dxX(uE{hXgymv|WLUI6Ms%(g-GUL!U|5jGQ{r)MQNQ1bwMQ}E%
-dIi~#lIQQ&*0H4#*um(i#*r!!Iu;KV9C%S%mapSB!BQ9ozCF_7f2{lI78sN4+6UiYoN7Ba$=I~o~xwn
-j9-s4h!4LRgtkb2Rg0S;UzO0fR|D5Wwlz9e>G7pH#+&i@6>{2xB%U*PkXkM}*2qBxFX5Co9~218pSO2
-agXU?d8WD29?0y#0#$l-HhMZ*zxqSAoIfeH3<wKlDvb$9GM>7~c_f!^bTvr9PkL#ow*(^v$kA(H(kmd
-PlM_*{OB=Oz)d9w>|2XL&6)_!aJlT@dkCjY6@WQ0zSS=&&24?S>IA*jM!6B^6gc*rOVr+q;I}F_Es!J
-qdgo5-|E%Ldrm7P-b6ogAJQVy{pmLZhpAnH=XXH*+6&+}<O4{V+bdSu{&ZEI+mYQZ_u6lg&-I}n|64%
-%nAL9@GmG*)w8`7gy(}Ep7<HE2Xkurz9i8$!nEKLDK;9tAfA0aIy?(kjNBmDJW^b!+i?KeezJ>2Gv3d
-IIcd8IC?YhA#3Y^;aqH16CmCt_HxDQ!~@`v|e|M?>u{i4eO7>@rD82mgO_P4WPTBPCLr3FCRBykfOwO
-f?ozHnG#s4=79r9LiB!y8?{C3cS^Jq$JXdY#gxqB(z18`ib%7OGe-aM4HTtQzVnKuta+>fmVR`An``y
-7{U-yc%!M)}zjKaVai-BZ8pjJ&?6Du{mluMbLm3SFlbto!q{5vQFyth}Pr0rl+dM?Bj@P##4V#acu;*
-?k+;i@z@I^*;@oGsO<(BfL!B^@2Bk5;o8($6trkmhqj-11I7080$U9V*&?h%>2lrP5X)1KF9;qeCmGY
-=ETBNKvMzhJjgi}q&FP4r{jy|=Bc&i)+Hp!S>d~t=zPxj-#Z5?%G`_|5rkxfr6xz%q2ZYCqeInS&wo1
-&T9$$yU^lFQ~KCy84EBhSylzx5^z!|A|@I*^YV){za%gmFm0&e2Jx3=D$t%1K?{LA4oCKmJ1L-jNUx^
-<C*+?Sn2iex*()Hc0MuY5^r=IT(QN}=~aaNV<>-O_{L!rj<tn*GG;wBS!Nu>z?^Mi{K)aS}ChaAlFkm
-D<v%>3(QeorrY`>GjibXqSuJb$O|xERVsCq`5*s!qpKdO!}-{!dx@_YB^_RVEF4oQlUsNG^h<}xr!&B
-DV5W87QLg2zAm-e>Vo6plsR=X0{Cl58>(@@IseW*OfS5mLv=ne!ZF1b$v11qTTHR@C$8t*nHFG<c_9a
-rh`AuCMJ@#<;o)&62rVz154BoSD9Q9L*-eg`UKnPoJAvszX5$vQ=%kR|6f^01K3f@Cp&dOP0PtKt1wu
-y&mRA2U%6?;nUG8NY-j^>3xI@~|JRd)y=kL~jcpZJc^v7Rs_^}$h{SQJQ3c_%D14e8&`NIf`++F{+^p
-eDB9D3J2|5}cv_Q@#f%K#R&+YF%b-XG7%y_yQ4d*L%o-!@6e?p*w-+uxUNIJURKNo2>;ErX<y_nb5R_
-A;V&%On`u6T%pI>t7%{Zbs2B0C68JqxYTcrU==aoEGkqZM!@Mxf9)>^zHMv&z|i{7I3uZm)nAEpV`~<
-Z~GNa?bY0E85!<4O?^lK|JHw*ulFu__t7Oc7}=%G!^KCQ`alnsw;hCy!D*i=yaAV=CxsjNC46;r-4TW
-R(h;8{$ytBWQhQTffj5`t$S$D^7jajAR94ScJ?krjYF0e!*4N7FmurYtZOMdX<8H;!KSQ!;SAy~NtlA
--2ej};GJ`zv+QCF`1LMH=uKA9~kL*yQpoq_wWAW45+fo5b(koQbZDu}UB=7W29u4HX2FpOg9I%K)2!;
-jY#L%Qdy^UBrMgMq0y=S%|+O9OBUm7_uCPV3L7ZxV_i!}sWPTbVoR=nqHMmrF?<d(^HpPk5dTUqHYUB
-pBGi_mt~$0_vEFTJIS+IWm!>N*QogrFKK=a@{Gil|HszxB>}UBOOk)INq7+C^F;(HJ4|ka|s~if>k98
-<4>t`vrXCTj%WYqrpTfNspCsLPgfkg%-9_VkJ(~taKWA>OTc{agf8I&kVyA*CKKLupR=L{V=YfY{2US
-uFVTg@(-Z`4%6Ndwqb}yy^_knPq?-|K4-VKgHUvmwGR&7Fhe7G%z~yn!*dG=|70<Dy^-&NNxSb-nK@*
-b;>Q`^Z1mORaVgDiV!%%HRsmEDm))bA-_0qLib)R}ou4iHU6Z>)?Gk$~t*X{55AtuYm-zKGY(#L#KnO
-o15qVkhqzW?Wk>j}K&ydd4QIJ$b%#8&y~qsrsgSjKgZ2FeE8olx310E|w%8lu89EU@)?;xDu)8|S+A(
-nEJVLHUUH6m!AHj(%QIJ%ju)JjF+}!>@*Xa|;SsvLi<!ufxk5D9I7!=O}O4Ym%TPY*?da1!7m9o)-(p
-A4(fWc@s=$aZC<VwVv&}W&p=nxEv{nf8uj<jBaJpcN9AbKBVX;zFWAF@F2Q5fTYc}oxg#8)WuS7yGU6
-_MX52s5<QiyC76=MrsL_#D{8((^Eot@d7hd`93YvC+39xGOM<=XGfSB6;Q-6pd@oSdWr125b=2El6M5
-1-t++K=+0Z>IcwR0~-9v=y?jl;jRbDU|AF!ik$3ARC!y^e1L3c@@A;Ge`8}>iX7)|RVjq}j2ncTR0(w
-2D_j?a7gMU3eWuK$03P7MFutsnW{54Zi`?*k(=O>P+<iK8e@Z~sB@E#KQMe+Zm{P;$%naQsulKX?bQ4
-cNBaYeSR`(r{>p3i!=$-UpV_9ao6AJbR3PZvOK&o&7R|guhFeyWvmvRz5}FZ0EO?EJEy}7yBer_#TOh
-{{#Q3)d;;YY`bCG+lGxHxwF2upA&kYUC!Pb8e95Ee>bC?zD;Y9_fuwXov2+^<88?czvZdEsLJme9rSO
-p&D^oA`jBqA8Y(#FdRQssP0{#PJWT}?ewys<46r}jYwEZ5S|Yw(UAF`XFA~XFwsg#nJ7?W<nP|aY$CY
-tD^q%?Ju$=Eoit;i4=GnL9Wc9k6(Q20bIy>KFIQDD8?&tT?oi7ZqA4Y}Wsg-B!bxLd7&C~acEv>S@$u
-{LzgnDX5JRiTJEFjFdV8ee>!>%UlYrnDB`ySu6BMF>{Ah~j~?v2{346^W=KUZmsH}9G@M5NyFS)4Glk
-=rH6_Zk`~>Qg(&c5B@Q><rvjTwW0GdC;|jM?6y<>!rfhhDOs_=$>#Bb4pLN1i77{X+Dcue=f7Ww>1qi
-`m=BY&Zh?FDv7pF2ooeAYP)BCIjgdt4kzE29(Mc0`=@de%Q7?7bIR+zQdO9DD#%3E=?Hk0H}$p<bgZI
-B?$tN7WGpXlyxmsI)#UDgySbIZ*VCehPx5$+>jI;L(^-3s;9;?kGeEMz0-Mp}e6;Z^%~J=Xh_4sXBWO
-2lF(`SCee;YXAEg9`scv_qC1014ggvH=FM7xWVS2r`ulhEYjfa6Y-QtItX`pW@7pHB&^@|$j`HQRl_X
-W?NwIMaLdxQpgk|Y8FkEdGl4lmZp3%|a8LmuE0=&8hViH<WH-wg7piavV2gZyiyPxIX7jmah$-2{d%g
-S<u1Kv_TYggu-ES&b96PqHBo(fDDRq?Q|J(;(uN%0e#+pB{)$Xl{)N%J4Th7TSq=dUt@CB!lT6!Gd22
-udW1<#eLDCQl`1j{6&226)@KiPtmhAXg^ZHd(&#f5V#as4zFMZ4C--Tm3G#l>Vm<+iH@lYFUd<mMYC}
-lt+<7G+6?5jQMwT>?}s))Vy}w$P;rl}h64&O9{XF)xfLs634CSAnd1V6ArPbTm4`dYl_ESNGYiBMXhB
-Qmx)9+lF9(fougLF#b3{3TvC4Fpx?z6PlX=?S<A+e?S)@k3N)8C8TlV#zOEk^p<FP}<A7a0c*)V_nKY
-xh3y~v-xV8oy0n*QNEA5%P^uKyvSLa|+m495wWf(UwpAnH?&@pdF{=k9hG@69!MPe#yaCx+}<)jQSMP
-V0=?MJu)hghoF{7-}y%Zs<Y1MVrts5EZ>^c-Wr1>>Oi!?~|c#tfJpVMTFctWWVrANA?5^iuS%-MDI$4
-P`HC0n!bHzshz-r$2-oTZ>r1&Te~QBxKH}*<2=-RvIyHzZ2uYFr*(I4S$ya0(7)BfK0bGZAwCdBVNN3
->2^ZL_!TGbm?-M0zUH+-LWhF?n#_*0Z*cQRYFX?MD<K4GvbTr)Z78_|gASziYLf*46tjt0A_UZhSm%_
-`i#&3wjYw#Cd%1_rS_V{!5#GCw&1x*`Gh8We~Xd??pNi)6{eBL=+U;*E6)j;U?ki^wwMp=lL?fv28zw
-{)(cF^*72aN;XEwo%<?x6L|`bW(d%5!(IKGs*V9+Y^w7fGQgoUq)ez)86)k9&#+U(3b5jmUulNaA#zS
-&CDH-fDWP5<tIq8Ll#@SRAlxrIJs&DaV5oFQ?gwGrm<Co`z_rA6DdsgFqDBSV`JIhGSsF*7f3Y6A)N_
-P&3vg^LU?L!W4I9b{caKFLKl^hXqWAvQ|`QDZm&YB8^h1X=RM_!F?Rq@jB#Fg21h7SWlI6AIPCpy40x
-7Y$-5mrZZp-2l8qs1Xx8k0Z3bh+QP+51-Bd}7Y<R4Hntp{M)fcn0)JeZn}&??JyWaabc-79)}M!jI@<
-Tdc`Zr;Xzk5w5Y0lUE=sL{EUZC&IjRDhR@ZsywjJ7$ROc0%lfjhM@>n7}q<g_hJ(hbUBcSo=RehT2k=
-N5>u|2BugqPJ+>PbwL9xPbe5+7Z0MdmFZLg!N@NZvE;l1i@79zqsCd#wJEzUw1}w_Re<-UQOkiVaDcf
-CHlV_r-<=Taqr(tlL`8GczT-1?a?RQBDNC07tPt52?-bU3pf@f}@!D<d@7fSQ`<%)%?m_v9ygQSw6#+
-Fu2tqFb5fr^O2By?NS1vh|^U{QK;)dUidP|#boZc!EKNOe)rJOw?IExm!^*VxZ<KP2xTRTrP4W{@uhx
-gKrU}V3BrZa2qILSr~G|5J0jv^XR#D-3TkTy!N*Sz<JE3|xZu7%gpU;UzN_BctS@-|GhF|Z{-nD&Tkd
-i*8rvhVb9P};F-Qsi-ce`lFa61V@n>s+eX)^$Ro~{R`C>67n>TskU0L@kyahT=74!JPDbMipZ+5%D30
-0a{q}MIV+&=U5Gyd}ZU-$3-yV!4jK4JVOF>@&aV7Nh1A<3Xc*5XO!(2hCh2a{YK?3hAembl?`ITvm=y
-_S^EdBhw`aprLF+~ixvd<Ja)F4_F?iP-}va`fOvJ{`!y9mCE7UaC^np*fkWfgj~5eai18yM2x{`Bkr_
-tA!yBoMG)SFQ(-*<4`}>;~YIO=6rb^i55e(gkt=2rqwB7mog+-3c)#HmvJ_7v)~i*;5Z<fZ=~=jC3A@
-l(7?tQt{u8@%#?OC5tC3U!x9Y{a&A$2m=dBDpTzT&jdJqJz$ds&fOxTQcE;d^k~)!yMe{NV$rkV^5u+
-;fA@fEVUm=IS)>HOa=JXW@$<o+Fue^q~KZF2Ds`EtwrHGa9fyX#@C4`DbPnxM;CG2&nmJ6Q<$4WZ7{Z
-WTN?0CGc2O-jq{<*$yFQG_Eep$9}FNa`C;@JH?7l|8U4xE|Keh8a|e%t;|PYw<pN1M*=INnAzTo6c*i
-!wn08oA}ycHY8Z(n}m>sUN3IU76C<x1-<68!xm5FF1&e<Xw#nnj7eRsnv)2!h+Qoh5<MwM3d^Vh_tuV
-TygYVGM1c6*9j?8A7Ssh4V|`wx46Wdg-KNPfZZ|PzKh1xna3wM1A!*6-Lq4B@#gc7gYRGD$&9M{`V=t
-Th@eHpFEn;^iPNo`%JX!e;E4el?!2-HSd1fZjVbn#w%FoE+W{4==bHghbzQquJ445e-SxGxAXEN}aLp
-{6DZT&OfbDm8{WWC!@s96<Hk^bYltLjKg<%q>X`J}9;=LPz5dR6`J+CK|J;~mF$l^WKj-kE6OyX~96}
-8ip;Ll^WEjbUvy<z)BdpS*aLU0`I?4_NCobJ)u?h~Bt>3s(6J=-ldgp<AY{CUh4y-kR*WUs(S(H^!%;
-oet{i1)PGdq8^&#!zyv!(+s|O$_ZJ++HWo-qf&cFH=D8LGm=&H?f6}TTHpdZ^`dtwrQ{M5+D90vh|wm
-6Ks+v=<&Ia$#;WTz}v_K%75&e9{-HV_EBWxJ4FcQrTO1SQNUh4h@_y2%kLtkk1j5==oW)%s|@MQyNmn
-twHYvenhX24y8(U(>OR}eZ{oK7P2|4CZLf<cWwefIS&S`N#kcmEdL2?q2a|Ig4X285R>^riTNUFS0>g
-Ajn}FjAWs8RQf_B92Ma`=(o;XP@Pd`gMJT(rL8^W-5_<=D`(j=Canc=?oBu3CJ1v0t=zC~UmU24I@kd
-g)hbvFif3DH~*>~`uAM=rNPe5_Ac4U(v0qX$JAw8}0agCeXlJpx_CI1PUa{VOb4F3a5qMIvN9w2#$L_
-D|dkr5FtwRa%4Y2~~AY`X~YA#C@i_>J>`>!B{GZ^sj=pm~m?D*c-dxR3f!Ka4BLxHL=&|fPXe=w5<N=
-frLkuyo8GhI>#anMj%x*;WR8<WQD_vKh_c!^4xNV^y`2vj(536tVCE`)<$@7V?yC+7KFD}fk@QYL)H&
-KOiBD1%5Qm26)jn5H{Rn5_Q^k10vr@)V62<MNV$N-9n>1_-RbbC#C-f1h_%4Y3ZV6D{=hGcdiQ+}hr!
-D37C{&eVB(0US8MiLD5u;Ovf|g4zrQ4weyw(PoCA)M!N`yR$zmVIxgT`QHA69^^0flfwSGb{KTC%(^-
-tk2OnrCF#7LA*3+)?_`DnV=(R`Ysl>wE0d_GvTU@=OThBl7VMnhB&HC}R-=traLqjkQ?)s-1n1bVhOs
-)>~*=0to9?m|QWczM89RE&)l!C$PapQV~N>}q-)QI9(l(%DqSM-E+F;ey6tBcCSp1{c&v+y?A{+y5kP
-1C9i*&#A$V)e!xE%)M8Wqv+Z#c+aos%bC!8M|iU%<^m6r0O199c!ZTf0`cn)FIib8E32z|?>%v*qq-|
-w!l(4E$E;^9gC3+VhLiD9k!4f-6t{i0E%d(e-^6Xg-^FbZ2;BaYxD8^Jqg-Tc2cO|1zH>+Xa^Z4>y`K
-=~97L@gwRIpU)(&Y<k*p<KmYLw@alR_w<fmO;Ab+PMwIw1~r%#{UwF!1qpkRzt`(2pd20XcovhcbY74
-9w3$E%pl2X5GnUkW>;yxkdS;%^}`F)!*#SiQaD?kABCrYnD!_qS7%*b1{fU?+chiU?7wV~k5ei&e^|R
-fh3I`X+?#F`T`HPZ$+aa|zxi2OW&=n#<)ysZaI%=nsk3)<V<bxxMA4?L+U9D?dGv*MT@*LrA@6;=_9A
-OGdG!>{BtLKE?Q=NHK7BZ!VnLT+0rD@1*qH#Zj#Z%J~{-p<j(sB*<qPimYb&1Tvdu^tV%1*RDsoh&wn
-`T33D*2w`;OSQ6p1qb|$1Z{AQJL1LwrngLHO^t2>_NO-lc$Bdzb60gnHZRSiXn5QQqDSz|m6LFDWSIV
-H^=CQj($J4H?<w&85*>_UYf>L(4Zi~CH-Rqu*cN_cuc=%Hyy^ecboh8T6)gh`j{3C$X=$U5b$$E^FwB
-g9{670k+WN4R@$fAtKZ<R|Ha=m_ia6uOJd#i~-bwF*&hi(w#&e&_mt4@TMn`BBxNZz8L2{us4mMwfY(
-L72v;_;>8y3G<M&s?9n!CiGSdN$|eq3xW_BNhs=qQec9>vIxw@@W?zUeF+GE?flH5Pu0wLR~rL97QE{
-C)g{sujd=@v&4MAoKc?mb9*^C>)*OCUkL@j6si5XDG<*25Xk)phxsaQ_lJl0f&Pb542_~BK_E*Y#gG_
-=;uwO_Fo|O%LnF(Z%io^`e@ldfuEEpWkQYpYdK(C;Fc3ne@Rx{ic_kzN6@PAChpik51Oe?MBwm>k^eT
-FTt_C41vjIq_r=TsfoRC@1utb5(uZZ-^+bOZ`LxNf$g08HK7zCg|84m$np=@PoFso|^w(8yHG#H@E7;
-qigD!`t_AT&f6a6#$n1hU-GAGmqspuN%BUt2=*{)I$O<T8{l8KAEx`n-w#=hJ7wXZ$~3<IMMRnQo!p^
-Sv4KQD<%my?W^T4ZbHG{JqZHH|{*7Rml(J`Bk>v30~Ul61vkwnpFHmp4Y5kl-RfOA|#H868g-0*XpAn
-nE(XIzI)$Xu3!jGJK|m20Q#kZ-v`3{ulVv1Ak05+g_mu&ZmuBREzs+XE_wHb<xFp?s;u}+aCYrP;7QD
-&+tAz0tvEigCBhl^48;2Jo+^DkCdIKkpk*17uJP3UGs{jhQ$3<fz@r%~RL22{v;6vyT%WU|h%vbA9#k
-w8s$L?ws5(&@i7The&2*VA$#%BEQ+urtaEEt7iLghh8P&==oz>gam{$Rz#wi&^7@{&pPBQMsUJE2?AE
-y?Li`O&}C#HzF1xu~*(00CX)-MT%(Ku2Mn@vckLyFW?MPNQubH4i&Ran$SViSwqv7`KRcarYcjSrKDt
-likbv%^X<kcXk&(#S|fxL}Whb-{>@rb4a31e?oC9Omdb4x2mtG)=DKCf)o(n1|KT6n-&8#(uF3`(R)H
-Ltt~zmrp~Oc;_vD)LSXGpTi9eyPZb7wGN?AIq=eD%wKal%+`?!LhEWr8=E>`>655qvZC}x4=ddT6Gjt
-(NIpBpJAPYRL2XsU-nrv9X>bp2iO~w0o!Q!*9GaRph0$dp;zUCi1@jFr^xSDPxq<MQa=nur=+1RhZ?2
-D<yMNX4w%GELuKU`2c00d?sr|I1BD^VJ=skb7{yt2p$Wt3~5B2*e{7}xpt17}aX<l7d={EU#$`Ln<XN
-(?enJhvjlA3-Rwk@0ltZna_SAtwZmzFBXT|QzLy0Z;)H*OyMWVXTOdKoOr;as(}ax}W9V`jVbu|oFS{
-QBxj8M&RUZ4~JHsdpjPAz5177mb-_ae`?!X-QRdx5>jX^B;bZ8^uvAk%;u_Kj**?Wi$@iSCIL}QGa{m
-n=IUq@bguYT{u6__vMxC|CRjTf1xl;{`JF-|MQpB-~Ni;z-rFYzaIDOufA(u9{}_J;AOl6?&p{AJ-m_
-(filPfqYMgT;9r6yQ82THQ8Yy%D1*Zc{3*OH2$e)D-694aQ%MGzPw{G01sH?~=v*zp8PTA;f_y&Q%^)
-kmVXdlQ8K_{qiRRHbKslTSZ8e5jC3IFF6*2)O4l4c^{i}W$Fn2}4NZYdAg7V378Ef@~VnD5A!B&g}Wf
-x{0fs0XaL}u-oF%;M!UKMMXi(k%~<7=M`2c0@P25ds+xAb~(H8&Z*$;Rs<<#{i`qq1qo@LNM??zi|?v
-hi2vX9=$#DjSN`2d5Mc?XP-qy~YRc{PZ09L>JCkpcP%|_AgG1PT?g%m)9#1|DuKsc6{z-?V<|m2vlc*
-X=IsVR`V{`xi;2X=B3JCF_{c~vq(>Rqsq)<3F5zY=%BSl*S%lnckub$4EA@E<Jgar<G~2&v-lms5hSP
-o?3q9xAId*{CeX)+@=u=$^zotm$us$0pC0<nT>8B~3REF=Zl`7SOrWKI(srWgYJxpIqN8+&e7Njwug1
-3QeU_6QmeZqo2whk);+tc(oucpYSD2veE!!cym2-DNvv#&ynY(km86pU?WPQK8B;}4ZvjSyOIe13Zxx
-fd{wTyep5w!AXw+}K$4F1(2$9{<@b2(WOuq5x>8Y1^fkod0NBN9d3W?OAp{oy@QjJnaTcR$>S^NX~p3
-ulz)lEH5;JvByms+9p)i=RozuDAP$P0}S;+)so1tdogOPHHkGTu06a<`wReM!!nq?y+?-_{Qh9)`eo;
-pcnha;5$gaS{SN46jyY-V~by+{7%?*knxevW-vRDo1!a|ZWH9lhUi`=CH2#H=^V4-Sm;-J^FL1qi1PP
-y=^STKK72YtH<~(RPk5@!%XN6_GKr+B`<e9Rmr?V~QdpZZtl>G2q@TNx;1klbIrTMjFxYuJpl5$ny!@
-b47ql1WyQ{=~sHoay-%Sto=_CD;#LtJuTn>~n?F<Dw>?SiOE3Pf^8U-9Bd1vL6;U|?)?b9nUki@#}ky
-*#_XC}SONX)}P7TPVFFzT5-LDMnu$;1hgXQw9EoJ(igyE+sToinu0hUjrAawOCBkiDiNU6zlhODJkaJ
-`M<_c3TwMUMDuo{JSXAOf?Ne+CN2|(n?u%8ody1!HW+cS+~(fn=+H-u|FGec`Yjvf`^%43muf$35Y4g
-f=!E?WO1k!>~QgvnVK1GdqjCu+T<7UR=7F8n}x?^;!+)F62pGh+>xW8%8Rs!{Rgw=-U5wl`{9j<kNtI
-g#7o}(+r0OG{*s9W-QRcrhVNew_?G<Y*)aCE`Wvi&*yB&*i~m1g=X(J1pIqY)RR9deC=$mJk|IbNCTN
-C&5fTj8<I4*aiNFX>d`jC%VxWDWty6a-1)_{>HIB(Mz_cN#m1l{82q0hLmE_Yf1<ydv52g!fFe}K!K%
-F<q0VR~60jnlTL2D>pbzqivm-FB_u)oQEH3bNifOC-cQ`tHOzXnM(yyo!hQ2mnaGwbl;DzU%DC2RkOX
-1)mjF0og>3g|>De+Ljr@h@I*>F>i77?2>T$G0kgezUrB$dHF&uX>d}%XjMYarz}pd3|F4@{RbpKyni{
-3&ySem9LuL--t5@NSs1{f#A!R4$XV6ZG<Nai?Q8JbNbO>zl;seVjsNf0;rPeXKvjOdfV|!5OfAzoA8;
-Ox$<2DHv`HqUktS4b|N&_9nJRyf1Z5kyR*Mbj?b#ZAwfG`g4fSk|Hq^sde8dbSV!)6F%64<jA=fGG~o
-IDJcsxX9w2yr(0}p(zmTW?{RjBnZ{gp2fZ+K--#@^AV9@j2Eg#wasYjr$Wwq-gJs2>R<cE>AtQWQ42%
-EimAiVKhg{tfAwx{Wq6w}#*&m@1nUh4f^ZO?=kXA?BQk9pfO8xG0u6nu=sR`r5}DTK%guxC|_sHz@4(
-;?w*?|Zhid$_l1dgSERFY82|Av-OFU<o;FW`86V&T>+D7oDC;a*Sq-+rcO{q&5;e&5ia_QXZMT+R#@z
-soNwVa#MylV`DxtlO=SR9IS53-fr;Gpo;V6j-5C2vdYab=E*WQ20>~^3l(c(Uzl0Tw(Ovmvw?2>#h&o
-3$BA8C`MPozrb_{Y=_vS?*ITKHaHC5d%cQw3*=R1WP|cBG=7*r|X9V6tx|;dt2jP&s>wPuoiPf=)=)a
-}qzPF2@_kL0Qy$8HGih;xBy@wY5%!QhijGh(jz?@Tvx<K~2)%YbBm{|ql3il=y8ZQ^7TWwB`+(-8+AZ
-{bQVWYuPWqzV$8y|O8P`y)i4y$%H{QwG}%Li#?;JrD@W8oajOc%e1F7iK+g_W%nMmdjVFNzk}9Sv*5r
-r19rZ5HRhnNx9gVn3eH!x81K!C}U(*sdO)ryRYU>a$_YB6J}+T)ZM@q4vg5J9P~j3@zJiPRl1{=F5gI
-<SWlz6ztg%`ED2Sa$N{%y@`FC7JMpzh$6B~?o4d7B?M*$?)u<;RqOPSbMYc+UFy0Q_vYP+aVi#cxM7D
-!eV!T-t|gN5n?2-<O!4YSJ}U0~_3WOE_!Q@xObqR-cfO%A){vakYlEoG*)}@!`xfq%5k5@Dsgut^2;s
-SD#S@P-`3%%lUnotcu7~%-g_L0A`MjJE$yD~nFcQmeE2gyBQ<M0d?(nA=dbAFeU6feL4Q;#`JvpkXk(
-N7@#Ws@WmswvWL$ZYvqx6U4{w}6bPx<=w&)Fxy7ccuVPO`eRe*Z#$yY#m;i1<i9`Saa=FcJT{%LgSqh
-M_2Y2|o~&Kq-o%X^ccEVhKiYlq6{qg)#I~ErJBhb^vqk)yoxKBadXIc`UIAlY&YEnyzF1=&wBXXbOx!
-CT}eb98h$zb#5eG%NYy`ejpeS;ZP}vKhjlaC(r+d{Hj>81P}?b%HXX8muRJw0JlGEHRoZ#{7amGVU*>
->z~2=Ep-oJDxqd)d!B<=KRk9#YK!YM*4f%-lU({~}iiHO#mR$L7N_a=!II)F)i4Z>D3b)-<hVbWJ0qS
-SHh-LA@-+K|KFMe{(x8V@xl`N?91%)Q)`&kvCc{8aCJ?pjP@E@fG0E81j*v@!!j3qQ@S^Jka2wh+iFs
-ovJqQ3r3Zl`x7<fjunp`_!UN&D9E_<n9h9N*o>y|2?XpN(Zgznsh5Kk6d$y*WRjl1lLoeRJ{d?D@Ni!
-%Z|adGln1;tYk4c7q4TGiY8rI3H^tm1mq2Ez=s)_{rmsZIxYcnY`4M+)XI+?8(c5hInJZ7kRJ^2rjgg
--7tgTCyB=-@-4ZkOpY5jG-zzr_IU)Y9%U@>;?}aBg?l<4)KejcagM698uifV)05dw_OY!F^i(fl{zH+
-ah~3>C6VtdS#*oE$5&d2^EgQCJ<r#OI_Lzm&3B4$C1yMreM#=@d9F$HtZ@BESN0L5%_U+?9v)dR(>g}
-W3(-v<hIA+WY$(#<b+ICR`KMKx<==!O<*rf1tBnfSF;dhCzOF0)lGZx<<qo-vK&f~r0waVjm|H_@{9G
-+_{)>+`I2CM{;4OC2G)#dk(i>#=zrt`r~{1;k1&__~*S?y8j*^AqpNNwyUZ1YqzIV3VkdeqtV067N??
-B><Lu7GyI_rR#XVxIWoUgyDYAD}k_I~TD&HL!!eIoSQ==k%?)Aqay5-%4M&*h%w1E?2#g_Yvhf0|t>H
-c7+Kh!9}mhMr`kIcB6aPyPRb|>?G4oGqDrG+6cT>ZsXC+QP%Xk1JbhOojNpI2s>S#r&LRr<3?TZjK7-
-R^g3ks-J^I6>U7;=O7b`;c^gl(>X|n}I-eg%a=Bf|OFz{uBoOt3KM2pQ-yK`4-&L8>b+6}6uPkbJ&~a
-zyo-S<ADz~t9t1u7bJnS@AO4(-@zK%A;A73gNk%xREj*O6Qwn^|p&uC^Xp?qxM3O1<lRzGabV|ZZXQ0
-5xDr7LwGyn-<zo)(0ugYtOD1mYje{wl!X=;3=`i{jDoH(IFm#C6gsTPN)DpoI8+yp{dafO)DC|ADXhi
-ca4-!TvKO{KFl8#KLbo{V=Ra0X;hsNWo$VOdte-qZo=TDLK6)<0M1T1oNpd&w^R`Y61t)1_uPj1s<35
-79l})y}%=Ynh5CdgSnW`74EPIKpeGlFc;_oG6V1``i}#b*9DF6H(l1%i#EYQs-CY?HOQ}6nLzUZUI%D
-!u-%f9FZc$Gbz;!%Umz8Qfp~w4fXPy9)%9Nm2EZ*K2_TsQASFTbez~;;T9+$JS1gW}yZimD=5qzZZ;k
-mSmpWgJ%02gu&TvPSK33Pu=Z*ROe-4J<^y3y(lfGb;{hh(;4|RLcbFX2oQt>s%t!mJi2ZB2_vZR^75N
-H2SuL$~hNq=%h|D<aE)NLxb$&(kE;Y3(^zbpzzR2xfcTTOv*-a%*cczI@*%xbh9Ce4Wds4&a!d2*IY<
-W<j(MkzVlV|lS5wM$hhVfL)(Jb5{1pJwh6w3U=0(qc2dTJ%nrALjk+yR!Dcj|8&4oVycTKblM<G}Jbf
-tCiRKt~(wM;kK3uFG_Y$)v1!wKT}Kfd2`@)BZm~UE}jm%(~Y^FxcYjO#%rPmEK+bB?`I+I>qc}Lo_%9
-EoeC-KiKw^!mG%xv8y3tZ2qHmn=go3rjtx9TkXefCgNWWOvFy#*I9h?^J`+{iP?!z{-KE*>_Q&&y!>X
-&hLr&e(O*b^*9d0|mEMoD}><)N&Sn|y?d^&a&b`ie0y22w=g#91cy8bg=ojoIR+K$WXvw*@l!9M1Dso
-dK6-qxC6zH1c>8h;<5eZ+P>@5?IsqpfT5<r9~_ed6AdMMPJY57L`X0k~ZIE-z7)$rV-NEq{aJKKnOL@
-0DDXY#v#eJ0cjWTpu8#f?O*QsHvo1hVhJ=vm?p8b?=?zERq`|=t+7L@n;X_bjrBx_NFIXRK%|@;;AN1
-o9<*l3S1fC)1*y4vRiqKsk0>uTsFJcQ+x?!Yo2o_-Xt9_TnyQw$qP~@63q}t{8?WZt%XzqZUv;gY{hh
-QA9(#t7~8$e2+_$xL-={*@VRB58G^@_Fu3<Y+HDDp5A-J)Dk&QW&{-GBy~B(1pb~|w##b#p+3|GsJgJ
-l1>qa;88aeraj@6^2-!Gj%OHnc@UZjo;Jta_1AB2{hZcZ7oBzD0=*FUq|^|{2$UMN`VW49;h*fRI|?x
-;@NDBh2`WhkkNm6lH@{-0~{7@8p%f5S$5-+=w=aBj~-mVOlI`F9TRRki1Dcm7ck7RQJMCNUDHQJh(zl
-EIgBk|tn!`45fZIEfR~r(+C60(#*KNapKE0JX~P5G1G&16hD%wQ55^Mo7c|qCOWlAW2XGUodsSuzVGo
-W7ewnlI5iY5R?N}v8$#*yn-B{x}`vnhx(;(PXgqGQWC&*{w772|0}{km3o2nY|U&D1k|%Zt{4Lj8?_d
-&^Hp>Yq5qXLU@v+#i-!r2b|P!59h9`m-`21dkP(ev#~4hf7ni5MYjF0ygj6`f)^T(Er9=Bi;T~B1P9A
-4@w@zQ7FTvqSEgT;xx0OwTSxr)j<~x5#<R(pVQRyDG%qtYcNaKoke6viL(H+=2uA`~qbcy{24t;al&2
-00vQ?Atd(Qz5kdHpd3?xhKD+Un333LJ2TeJ#1^Hwv68b05%GF)K0FxVPKoInB1PT>~6?z}$llg!LkM$
-r5DmrCID-gVQt>aZH`SpV}DP)tc3hGW#wDAqftQ93e}j0Sp(8+ziXg(k#!Q(|Grt?w5V{4F0}~{-@kI
-&?SXM{&2<)Rc$>n$W6r9W9<MY+wGV|`;+rfHq=9%3#>ZKwA?)T^WNjb+i<6PFB?-yn&u4QYZu|R*99<
-9`6{QdP5FLwawQT*_-VAXZKM+(A35VVDe~+-+0u!W;88WSvLmbA4to_-6kN-YhD_q_`Be7McghBl)m9
-dx=(u@un_M=%&EuXG=mEvlF=}HE7o#fCryk8|(N-G_yPYo322BSuYiT2fU#PG0bS(ErAICaFed2?0-t
-|xUA$h{t5Ub<$WbcILYLRyq*~|0QK5Zbu*>p;LbCzduxailrVKAP{n^NdTjxN$e6=5>Miy_=od(M|84
-$~DP=tJ=ai%voqP`CHg+u`0a?_#sKY%Cw5!;ejE^WYo)VX8+@CoT5s@E0{E6ur6l(8r4K-wzOQyEjrE
-ErK??CXfYm+_Pj^m3^vMqj9F60FGDMzR%P#s+VsRerEmDSt9e(cLn;Mh`DV1ivOm~e!QHsb{oWGnh*n
-aekdn3fb7&z2+>$#z3uM$^!p)WyquTpFz-AelkSW_YBgq9hvFbQMLNYae>7xKy>cYS-`OXm@(gz-l*A
-T&noi>E(S<jSF4)6@{*HllU9wS|BR!8&-0#$&edq;l==3#WV0+e*Eo4op*56gRDLNnB;@hJbau`yby@
-I9<T1@Ks6dKb0PTi~fq2i22@ZlZD95T6!=t9MzdFR>nmRn-&Hc{nVq@L};LlwC0Lgt9ux)<j?5zQW*y
-P<atqYc3(H{y6Btl15TG+kCCa>L_BE8zyAar<I&G>?mGeM2Ww`Zxx5kI_1pRnuAQpA{!*7NukdA_$!G
--B_}AC^Y{;oBd0B`7gU~9so7(-+^fM1OEQJ<>7xF{ulp|p#EPu;5)AW;lX|Yc!XS%UItk*VUz)K@5`S
-B^C^NLF`A?i6sM`>g-^@FYY%z>;Uxu5V9<$PP!mbl3M&E%!wd=L1($4e0n}e;zEe0r*ad$RY;~Jk@EZ
-e3@sg6_F_60j-1G!6%t;)0$pZU!0*oyt*{^J42>{hgP_X31%W;=9mWtNvOn~SGaB!!91s<}x(nYI&?G
-iFjt4=*bfgB%RPZp!#%7C?91U6VM1>pVfsp<sKmbjB&0p6qUb4>3N=@BYYnOC(S_4w!I;qzx1@eeN5P
-V2$xl5$2b&WX_pS*c;2RyaJN9ct|X46nw+yT1D?{n}eqrDZKrymj44KH&C}pMLdWg}!;n2EbEu`k^hn
-q|9r^{IxC2oj+bN^iMDO;}t{y^pd|=$Np(bE!0niv^5!%Q5C=O)Dl2F*sd9<Y?JpkJdZP!P?~t4rl~U
-gd^qolW5c9#(QS)jjN3*s<#V*dQm;H&T_P6rz+ZR5$;wTArxs*)JVFLP%DbW=lV?u4!T}#IM<<HZYOd
-vJHXKixW9wYq@Jc?OC8@bkCg$YmvwyJ1#zAil)XMtBX8q0KNzcQhJ^6lzhg18gQQ5b+lat)o?Nh!mlv
-r-7#JF8M@#dlp=gu~AKXekr6*uuNo)FVR9%t91j?TTUme`X>4^|$l7IGW{?Yxf)txLA%e8~}9XlR^bI
-a}FbEDl`*;&FeaXe%iNmucm7x_PCo()-wtq`S{vk2V#}{P6$>e18))^&vRlQtAYx)aH-bFfWd;e2D;H
-GC=$6x*z!NaFbXqO100-R3PqGZYq-cC3UtAnplq(=n#sAZ2CWD&QJ{M$S8A9F#Y}oi@$y!+~xIj4eE&
-bN3Ny!!*}6#T7cB8es%+r-*U1ah9yQR{ToN@-IOpA8X|Km3{M%7Es<tryC|+)Plu{vJ(L$(HWE6jL9>
-=H@xxU;94Be!&SM*Tmhc$Uhgxl+5@C~K0Zv@lvrm#eSac<5*(MC<J?l(KnVHk&q!XFG$N9mIuddE)W!
-b&I@?C{TwE}IsX;RSpyp#Kk%M)pd_OIdsXQx&<+|HGg-}i8M5!=%|K6cXf;IrG?-grI5FrG1GctYboQ
-|U&>?kJbtu6U1D?meC@34X;T_LySlmENT8#aK(|RNRbRW+i6gAY@;L24gBZbdjef+Dp5%nS@t*ru8<x
-UqTx}v=_02EQohjGE_U>HuR$o#MkIWe6c*S*FR0AMV|l9)9HVHkPj*K-yGlv(^!O{Xp~+MmV)U8fYAk
-P!Jrt5tRyjt!DyKIlo<vjk5<(t;LM(a?3lp7pcqL55BE2=R}_IN@{%>9zYqsl_r^0I4glO>QvjFQDnY
-m$Z%K~{cpVobK_!~bRw!Q)`j<UfWM!l=D8SkUx{=j@c0to6Z;n#HvPV}lc+lBh2hHM@$qvpJ0W<h$^-
-5c=16{|+76?yca7|0T4|b=12fF+jWYxttcQOUep4V1o6Nz&jR?b?~2=^7c=Zazh-O4zEBH7GyrSpN*^
-iMPDH+6x3Bcldgu&<hf>bHzqGGXlxP2P)91G>6zS@k<{YkAQT@$ZRS<sTFcpx@o&?`{$L-97&97NL*#
-m{zRG70H)hm&yUUO<|g>TIgqXfpH7FKhvb;rQk%RnQcMRVBdmEha4OAz}*RsRW>Kw?CT>3bDXh6wLQF
-R#<@r{humP<e*biZK)j>pDX63?yn~Y5+B1A<4o6Z|WPBU*^pp3R_~P9U8quA{8QpFC{!UQ`hkLXu-}<
-Aq7m`HD5}dSj7h+e_&GSaH)RgF)><`A(q3_5_KYmn4y$42mY$dYPsK?p$g=OsJHQ-ggr94?;>;2{`v`
-}tV^0Lx1^1hs(cDxVRS2|zXd`8BjX2=^!P_Asny39_a?I@YE3nyEYUgee%JGb-+$wJ1uTPjrz7HO;4n
-nsx*hB>9Tbb1ha-(y<aNP|C5m<-i+#J_yi&i2{s2kR-Bee37FzXxWD`pfHfF3RDrFZ5kv`?kN-Kf3g7
-Jr%pOzukXY!2iEI&-)txn{#}>z%L6sLemsQQwV}#2*E7NIZVR@K`;nHqZonH81iXW6(?Z4hd{u%Y(xQ
-a3LvnMV8CcuQ<tTYTGhnSRigYCihWDgf})_gm#q!G>`h#cSO;}ilP!z^HB+1fe_|LkC6`0OK&9nZea2
-Od23?aNP;JH6F)9)ecL9xfEu_+`K_;55DlZgR{+HY^SzRudg&aT@4WIxdbtFjhfTb1%#Ax&1s=o*{Sm
-1~D>jG~&$ZOhKHwBl3JXh?!<mBzIsK4jxXYCbHc>6vAnhS@dI~Vm1;i>*^WxNBm@n@nmF9;ZVq&)kLk
-?Jhz2G71v>x2&6IG*T&;Tj}vt@kxsT7G^eo!&splKFMKXUVDZ_Z__D@6a8Z%>K!KOEFhj^S2Tzq=Ry)
-BTjn7&bnZ|O%cyuUn6u!0wvUs4NM>n_^tB0EY`}`GdkbZRwvCiQD)3eyGw|cu*#R!-ezA5svw%Jjw%}
-n&>MxfIoh7?S~e%gnD+?f_o^@WnRz9sS8H}L?!G#VG4I=-pyh|gMm^$Z->#JV%)9GjITiZ8p8A3}GrP
-Mp`hXFz+gziG+bNql*i#32BkZ}oYk1DC57n3GSt(V$xXFS%@A0TN1-5++H!^ju&+{$4O5zPcV<GUSg1
-uMB-0di1+1_bgwY{TtRCXL25A$WnQD|f^{kgXfL)erLRzCNPr6bE~T1OZ@u;mo)nUS`pTmFoNlz{65d
-)9(Fm#7n$ZE%;M)_e|@Bko>zl|{GdtKUV}CRkSOdxi!lO;6iM!?*_=ko!C*G)Fti<&JrV+t=iscX9#Y
-BCXu{a>=}lxPfisoMMH9Qr-TsIT~g^mFgidIcs<5E=wAcZ*bJnMz5Ld*H~VVfq`%ivktu+k4)J!6za?
-5G~TVi<(Z*)*nkH6rJRb0qci_Z1%m!WU*$gPn_Cspccrtio!Jhhyiw!brM#FU^gV^=j~G1Squh=UCB7
-Yr(KRN>K5G5Q!H<{OaGQ(CDto)W!p*Uo;fw;D&-hg{Pqo#w+I*F$y1~p)!9D32b9XndQ79jth$E<^=`
-yiJZ+rfQq7&DqspctDHCzR9bkTW+6XJE@QkumS3*S5oB#>%eoJtyc9tZu-bAw3@g{E9O4Vk4jRq%t;*
-va;xT`x&<QVt={kvFHBtHP0UmW-+Kh+odqDS}GfGg&G=mwThtuf1gyN-2v^-;&SsF>jnywP))h$xXpy
-#d3LgrkVKgI1{h)kqyH$Bvm+zPp?Mr#h|YzJH4}3k5cXOlq&y*qb}`k(qJP;b`!XipFGe_e$w24(%~l
-_Ry$~WpmM%|{~XBItfuH9AedgB+gCrFe=-gEe3S3JLcrTUlpkr(S%guB!cmyPNED$yRZ5T6e%yj5M7$
-D3(bZIAbwf_+6?Vvfp)^Q@@^pckPf-yRB{MKtyFe*U03?fW(ES7RCnzW`zR8ynZ_>E<YSodhI_lIfP;
-p6J;&n0?*hFTl*<}Wro-_^;o+TFoy16Kr%uOf&m7q9^gX{=jCv$<BB?9<ASPtHTV{l(N0j6gnP(b}HD
-qaEm=E8r|u{}}=K8nYeTWvqpu@%gZI<}#`1gL;kw>HTHwh<$_88V-Nqm%ZXD~P7?@BJ{8C;`h95&)w{
-2tX?jS(d6%e^W&N_}ZuopV*Bo(LMA9e>L8<`p8F!7_%<P{LKl39Y^&`p3udu_|von^fy&LH99IgWQb;
-6aoeJ#?!$q)o(!?2EJ+D6`J8hh4w<}C2RkBq$;Wa!$bS8#gV?Vt+#b#hgPryB#^R_(ok!}P#lfAJtwX
-{VO+UXBdFozJVJ1go$A<8vY|5MSf;~J_F0o$7vti7#Gd%YNyl*|RL!0(K-CnBYpDW`+yj0Jf;t`s;{O
-%#!OJ7_AegUczF+DM{s!H?j`PYc-$VtV=_Qh<?7uMkLvz+jgyNl-nKUXknLI?)G<b!rN$k%OE(XJTOh
-0rDL;GizA=Ge}nynD;CluTduy!Y5wco0lUbDRlL<zf`t-HYZ{c>BRftHaUIq(<MIj(1BgD$Z*6xq7Rn
-u}3c0u_t{t&c97tjAIeke})M11KXHRYYw~>J`3gL4xYp`J%MrJ2!-qy#VrXQeVqN9jpfqVo9Oo+WAG`
-4{@sspQPk{qm@9}iw>$gzt0`Gg=6znaSy|qQ;KQ{RC|Pd)$!GLiyRI~~tnL)lyl%@Ll{0dCWQFa%LG-
-If4ACYM0w!<q+)-~&*rZD+_Q=L<kB0cHp8MhQBxk_rJSeaEzERs}6xhTTQB($Vgi@&|Ru0A^vV0tinW
-I{%OQ1Z72!U_3-Z9Q3nvh}OIL+fQq_sCzlzUr3kqW7s$C0y<=|Uq)BbZ~rTocjcgZtwFDSpXa$jgb8j
-4Q{eGBda?S3E2hbMLXTM}p8_uKGa;S&m?cqhpUaK#E#z&|@>&<OmJ0*^Ye7-Vk@}s;8%)`;a?YiSpbY
-4~KjUA5q2R6i>7b%GTKO8kzkehrP{#GxpmhGVostErufetd(a*pr<t7oSKC9eSUj=!13v^al*qtGGNX
-g!#ydpznrYe>c0IdX90vfe|nRZL2l^$5BPsOOWs{TvTn$3A3a3=n+N{tF!IZT{xDQZe_9q?+g5l4MBW
-#igXxt%y5?Ir1?1gx7)Y)oYq=1nKOfZ~03d>0VZc8{)~O641-a;QB%nLB3PvpeiopOG=>$+k7sPy*q5
-4@fbk%xV@ReAHM3Yq{l*(6n={k|R95H&6&xk<A3SQ5Ev?xgdq7U#{j@RNKyfS{)td?5GKd9w^zaQ1;z
-`$t#)qk1WeeSh9eaM=YLx~Bbas7LV%dun+Nfo_{<Rxd5y?f{n&)8m7I`c0jAdp4*9*?-8KQ(|S3aQf9
-sfi};)_PjCEI;o_VDyWFesvxJCRg9vYJvHU)pPkfTP@<P(zm=;{d^k`xR3wjHXv{x|H*AYYe{gqjejs
-GdE-e9!PWakI*2Y*Ml>xNCK1nGYF{a!+^jcl2gj&g$t~Aj_6@7{PKfMJO}5jFh?R$jizLRKavuAVhfI
-BY?5XRrid=1(9FunF)&0xuHVe#KTcsdh6WMNEhaI?$uFQN_jjSI%5ww^Qtr~C8O%fvHe#{EO*<aaLs1
->+sOJN*6pAqhr0qZt-Qj4@?23*yk!}WG{1`W+fGVh}^Vne!qCn;n?-1HXHvqDgv9B6mTm0VNXgo8&#S
-T3{YqQ|4Xoe>Tf(4nKBGGA$9xa||jygnr)%8wDd@d-mJTO}-CJBda>5^#~sawDhwBN`e;O{eO@yr?;1
-XUD6WJIDCF0u57y#`R_Uy;8&np3F32b^LgG4l?D%`P2^*I_~eUN2<;25&Fc$OZu#7$9?t%TOe_j4{Ky
-Ayg5xxyt<pXC880(J04w#yCVmuG*{qgPLV;|7SzTsy6J&v8bc8z8{h61XxNqH-5FeRu1^+*M^*8pm01
-ck(|*lmJ|DF7tT(5#I-GZ2YzOxKQg4PJ(T7sZq)P;;^X1fRJyH`lj}E<P_UmEv?6EpN_zR-%DEMadc&
-F00klGefSGTYaGu309ojPoVLj#d#sjLliQUe^m=gCuduac<Wx^tD3&!(yH<6b%ol7mR5Tb?+A;c+>Ar
-O090;OA$zfu{Ht=nq?<jI<djrt+V<e8Xi|XDqJLg9<6BBjXpbB^zh|cI|YpEr}B=wIg16MC(F)i;{+~
-_2uO-%c>J>80E-$;R5jg02BFFyyRgk0)1b>G`@Rdl}h-S+x_`&U-P|Bcln_WMq>m8V<<)A1Vhp&O;I?
-FW8~+ZFBFIcED%Ripl3uftI_aE;K(8{@wdE~ucLzt)@7ehBN90fF31Rgk@4z$LeT)nmQ)WAQYlc?#8+
->|galxN#(<@Y;miO2N)v$ubBJjU=q5{EnK5gjcGc(xR8t0!MuFE!1b}scwKM{lw!mwgf<ckx;;9w4v(
-@<##lSGhlI&s(AgD&ahqxXTM*FXY(Zlln2LEsZ?q3gX@u@VnF^hr51z(GTM-yw#fL`%7bv1r*LH@xsM
-9BOdh?~Da!CMIrdavPqn>th{{as8z`eKmv<7;2fzP8T(le2@9L+jc90TFYfo$04#nPGX{(z;GS6n}gT
-(@m-R(<F9AD@VPF60hZotSFrcEB9g);|&xskla6rn3H-tp{0<h&waR`ZD>cw=j|Njt?U;fOv(G!j**b
-H=gE{A;aMU4c|)=keuW9Okx`>@MDt{z=R=HnMvJ~6<uDYZ7#`T%+ub@sJ`WsRMWV*usmIpHjt_ZgX^a
-us1Jmv-^M+aM@@z8yxO{UW>U@L-?5<s$>W0;MjCe4yRnHyGB-iw)^!`<)I)n$~W|E%l%rHD90e*O5@s
-dh})A{A=Gb9b{MS$CjedOosExk`sG8!(I-tNx%WQPu|;fXqy<#pNrQCMfw7;{76FtG@y%ghGQ$#%Po`
-IU&-XsUev1wMSr>41JjBOB$FyPn-&cU64JUbV|+a(I+BGI}$+eJ5fX0_c9)g?42}s5}#2iI~9gT00YC
->hJE6uMI!UPOO85OqGIvl~u}W<#<3JosOkLpk^aN&ik=&)X>)&>Uc#->2TsspVd~NFT)i+HTG36Sw<7
-)yN%jKO9JHfBik?>?Ods>D!uYDR{Vf+{{E01cXJ>`8%3)i|GJ=Heq_|@Zop<NqI0Mvqiql|dnUBge7K
-%Mbz|U8-4_=W=XX2$9LOnko{$%xxD#|T8luBF<rtwQKPK+c&9^LCM*=&D1gbR`Z1Z}>C0ZJA#dNT8U2
--p&+04&PyC3do5A|(wa|a&_bCz&qqo_}<;}(pI1qRhI@^Jymd8D6P&6sHJPz4sZaZZ@HQ*Y_x_*fzp7
-A8~q%#|Bl#3+fP`P#oBo8;uBd_lH+e0j!ICEYJ$5f;)89vb*{sV6@T5|cZ@l@Iv`#Mi8yAtptMA2h4>
-Pw}viR6`@YKZCdhk;+F`lw-8!QOS}=@%{h$fBsrB;Z-jvJMPslnbqe!jqic)zj3g4IQ;Fl-y<VRGXx3
-K^a6?$Mj$jp5(JFF#Io8E%L^zlPNqJcQ$*HMB)n?v01roUrBJ4zO_yhDxsw2ePS8}0{}q4UKU{EXfh~
-BI9;7lr0a^Y_#GvN7VD6G6E;vi949z45%0$cI7dTFUYvnIsa!Dy866^+sCNWSl1tri`${0uz=Ri7$Tr
-qO_VFAkp>_Kk1&W2zseIzFUv=b}EBwMS#%Qo<8b@>PG5qD52CB7*fO39fC-88vT=Ox0TYHrxm-RE<P*
-+*8U>&@RXAifwQ6D^UrP5TrTzhppwY_@t!E(_QMLm`h(`-<(qG!`}0_e>kEzdAhrZi)h0$0!8x1)7g<
-49xVc1^D4LO~OA230o)4)<#G*zf{J!ix4T^BScFqu(>tM1Ir?q>_42Bl}@qhLnU4{{tLfj9Lvz-4v_s
-VG5w`9&X=KxPi-im@BPExZ76WtJyJaup9LKWX>?F9m~>h+g<rHwqdNQ=#WJe$Ybmh`WWU0gclEm(64#
-gR3XIQPDtaE(hnW-G^r}`ecHmAg{D`wrecYDlNgk{lcY&ut?bs4JSIVow>>Y2Zt+J!`sI@;g&K!|`w&
-nL+jWZ!Xz^7-kbx<bF5W94FUqJ(39Ezugogg9X9Su2JLEex^n&Nk&pP7-D=MvEy;rzTB6Yie){fXlR*
-H$pmf#I^D8e2n8MW7;(!*%yC4{wv{msFiN$W1GEglY0aT^rPOV{y8y37gYVuTBVhdl++7?HT(d-0FCN
-vmKPr$#ru|@fmRjACA%<XN}rDa!51e(&3t4dbqY=E_`Atey_s2zTJed2OGY5y+wJ>LifUwvc_a@H^O0
-Vrw-2xx}O#Mn&YM0I?|=h$J9*ZhO;>@2|9w6j}k3ilQi4d+lLGJ3bGL$V=|xVIp!*V9-IEyF?XgUkHH
-mf0_MKEO!V2T#VjV;{c*^NBg~Om%r|U!u%XU@RVi{!)<$Qoi~7by=j?K$xQW9>e_K{`MhY)CO8Hx(>`
-Jap>9X9MJ+AHdcl4q_X?sGA`{o#wNtlg&KU+7unDBCXy|&LMQ$~lhlc@oB0?Y_Er+N%XOhw~!7jjFUc
-fLUS`LSPO9iq!-?R-=4UC<={EqGQOGi0{ixosts!s#6LNF|&-9kJRM(bd@HwNE`kT$0&03(%`37e7*5
-Ief`j!;XH)_O588QF4g`;MdmIB^nyPOpJavEozv77`}RiWlf+sJ|4_vbrQhW_gz}ZWi>XDIX_uqoF%H
-~Ea|Qt6o_v^nra4I*qsPjI&znC4#Zzgk1Ss_J~jjwsk!6D+dXobgC5TYRe1y1p&X3J*HD*;J1ZT-Zo6
-;qwy9Whf1R$rk#UFKVwymnwCkyB<8JJ)AsIB#aSShBcNEU;5|g}I&cjUkb(ybwqrk&gaHCTnIikL^5y
-G_UQQhQuMb2)|9nCU>P#>Y)Y3N<W@;Y`3bFXL2&}`hIDy-M&X;$Yw$JCo{cY6qP_=FqMqf<E4e{td|*
-z-4j3l*0fBP)#DJjUT_pIrlqQ@9a<*agFLzLp{?+ze5C)3vl}#iM?D#J8%s@aV2Ec@~8#a!ctCeBi}C
-eH=FN3CyZnk0K%CU?Wq7Hd=YK@4Iq?g=5GkRE$;8lC=lS<|gYc2@#KGPd5BsKxIdHsDqrTV<Y(X$s|#
-Zq{BjGlv<JwhZ;-E>|pbax|fI>E#H<b?BQ}yk7}6ePU5s1tkx2Zgc#)tF&~##nOQ=scxM=U2A<d$qGr
-Ed$w=%aT~-bPb&l;?x1nuil6hQR_UVLPlVaR()>LRgrq?B`)>5*>P`#|k2Qz3y0wV&SJmZyhyj;*(ur
-}xn$rt2&>(M1Yurti7&5^`Xyv8amJt>q?z3xZSR?1*6Kj)C%7Ts`fH%e^X!yUI}3`c}~Cc$pCYG9EW#
-n?;rG}n(G5*hInZro`7BD{76cJ7?k5I9~`LmYb*b!YlpbeheL0F}DAQPmS>SMaSn!dJd%bh1})F&zJ}
-sA2rS$r4c6s;q;M?CZ~#VK{&B?2qBxZ?=4o)jq!ULjj&Z5g0`&6lW0PQwkTda;%n+2WUhyfa97cU~Dv
-gQ)+mdh>h2RJ^n9*`ZNT~S5ZWuFinD@`4Y(i+HVY6)5~F&APJ}(<zV_WU&mId1RQdSlbBykz5>Sv1{@
-{9!K@Cxj_X7@@MOqVVj1!#V?nH?kQ7YI(CO+bzRvjo)7aJO6?D0Az(`w;hG(E}jsr)q-&QIN5Q3e*Hm
-hZo4J4^!`Oh2G_YWPuW_Q#q@r^FI8m^WVh?-ouQJhK)H7<FtUYh}E8B6-kg7LzwnWMKvSdjU37!@?F%
-}JkuM)DhxYL$lg?zN9+2PcRAld}UEB<N4=yV*lBKTedobFapbKHxp~xO#-pL$G~t!o$s}H<f!+!_t&5
-g@=}IDWY`Lm^_zn^OoqZw+2?0FO#rWw$IJ$NoKjC+;Y~0+?Q>h(Rg=N&$k<LtyrVoJnH!2V>)%<GQRM
-L^I<RYVQesyeP{E#L$kAf5;E+(xf3a5r2#%WK6<|^W~WN~>%)Gr-k4U%CY%oPu*8BTNw8|s3$wP@1>(
-XlDDL)lhQtV2n~=d$n+l%d7LKoG?vK3U2(VhrLpPsNeVdfJBnX{L^tQ+DjSK!7@%y1_(@Gs4QaL`MU9
-Xz>LvI?k7e|T0PTmt2jf45<E{6?+W9$OV{;R6s%QPRWz0&TLoojDT*ma!mF#Q#~e{0|U15Y>kCddb^K
-yUC`%iJ3~K2EtB`}caU@C<kB^{)Q)un4<>%hwJ%R400)oKm7=n)A_mIa+;3=AA(^aG1FnQ&mG;kBn*C
-rV~x3oIL0qOv)t=^WrN@0!Zsj+LrNS2R~hAqMRBJYj2lUNh5e(vL)4>#`l+}pc1+vH6Ge491$mQsnGQ
-E5RV~*<HfX*>Zn+Li47UT6Do*4J)NrC4%u3Fo==A`#`aE>CzF{j$@gKS+;6a-<?WR?kSerGk#hIalED
-!bPKaRn!ZW>MO|IGuPtK_XJbKX4eKV2lZr<xEoC$GgWcHA3o=L5b(0SV}A=c<zJJN2E)Ty_ZalD9zmb
-Y<;V3(#UvlFGyPG5K-LuP5ooz(;3MWH9KLZd^>gB<;u*jbVloZ!9i-}e>zpTA`6qbm?VjW3L0`mZ0~`
-BVMl{}bo`r%p!exqqxi&@h9*1Vu6oN)sgTGGb^PrU?{g7>b~2f?z)NTZjn&P8begEMdUZCBF8haT>I6
-fvDh02u^V@00Mt50<mBmldX=C^y(Q-fw4^t$P)o*0xaSf%!Q`tDjtXeyv36hBGX^>rEyUAkAcGjPz3~
-qj<pj2O84uYfOwsNcJu;^L<V})3vMnyEcb#kfJ~jC03w&4aSZ4-Em%n=s{jR1R{AXzZo!P`Bl=d2h^9
-xwwXe(_IOd#P#;G_e^T%-h{>El*KN0PdD%Sm~!|SF^jJ%i1n@8}%Cu2dlcUCi`eWUl{s`%5!#bIUlsz
-vZMt-mxO&mjrw7BNcPq0AA{F9J5813dgwe<WzFYrOeZ&R<#w_;SE;EoFRd9cY;5EP(8&v+mT0;q{<ux
-B@fuE2E^(eUj=?AKzt#-$>jLIFrG1KW+Rcwh>DR0YmR|Er;))w#2=FRBY1KzZ>Bxpyeqm+WfOT;xEGj
-eLkPsU7$Gn$pAu*o5%A|;;#-7Zz<PT*HFc$cJJafM+WnYsP<b<ev0<%94YLcopuQ?dmZYqmy2ezt=mH
-7J!;OmKq9zZBzxv4Uy?0XJKifBUZR54nq5(fyg(?MiV2~fqbL#1@+%GK(nc>u2N7ebB?1Y*tOGasnQ(
-HBGdn5wXy6=tkV(De-QqBm0XoGJM&;(t%&sHGt9Ch_k6RzwwbMOd&BkfGO`dJGjaX&Fgr$iJODFu?wA
-%wuJ#LmMN<&Z;saM1j3#XRKb#ykd2S{l5kF@a@e9tz=y5`&&4R)rE?xa2)^v90ux@Nd()RDSqdr{hQO
-Hx}c!3$HkX`Y2VR6dLbaTEUE3Jc6&gnr2XHH&!lWa$)Is_4@Vou#-D@U5oM!^g0IAK$_PXo(Ak$vPgr
-o};qv%ycAvZ?pV~4jcDWG?&XJeMIVuNp6I4HOZ5BEBCbTI7Ui0y6$k$?2;VK(&EJ1v%ZVv%e5adv@8=
-QC#v4xQ6rHxcDdi5v!kfuk0oFc*$Wj3O4<musYCS>WA0OcZc0&Cg3;jc=DPP{EO|Pq6i%4#ho|eLJE%
-%=rgl1sQy3-pY{~c(F}ukE#QG&uxpLWX6}R(dnm&>O+o!Z(V#h;KCU(v0$H$8cvY<xkTOpib<z5j!re
-cU0xC&(N?ix=IyCa6(hb?xf{A?#*pTlD!D|T5RrPq}|2~rBG=Syr6r+Oo87>m81uGff1W$1pX&v+u<C
-St~EWYZVr;U-(+@SnObeerz$=za7BgQ@?j#nON6Tz~JQ^ph(!g)9J$p)g6IG)mwI3@<;E2)Sgr3%)O4
-zht^F`3ut7n+PxvX293HG6h}p1(mUEZJfUq@>ee;{Bu(F0<B=yGg-Us7#I>wRw^4HKvO`*5Til=JjVe
-;df5`DS1l;`t2xt8;2y262@9qZFi3BgWIQ5Q*+t}w(cyycfcu?;KXeS7l#qO-V`JbPOEf~|V1AY$0jw
-{f0>OZNv$tU24`xxpqFtch%#`x6J?X9J&^5EGkW))iC-1XaRN*s${l7O-`pFLodh`BC{w+VGoxq;I0-
-KEet@lr{;#c)0sh-726WkvZo@PT>Vgsl6Ug1gnMBl>GIPIOFrh%)5zQ63{0Ha=f0q+<6Z364XEwPD&r
-Luef7`H&b3S5@BrPg@$J#LBLpV9ZY4O%kLDqZ~UtGz6VA{!_GpXUk&tG=|yMUmxIAt+d}AN-`~9$uGA
-cBbZ=a~W+RE{pSi+#Llomsv?(mcyNWu=llDb>g<)USEm4K}2lZVb=`5NpyQfyRvBJl2N+$p_9-hx;!@
-2bxt&{JMUEl*&ES4M~Cr2Pn+wRptpB*x+vD>)q0<~214K42L8@9upJ6kV}&llHj-?Rhv81{A>mk9c)a
-|&ia`Bx?;?oKB9k4%LY-J0!*MB9d@^tOyTLF4zi(z&m+_kR)DVOA+7;YRHe>;QKXOf?PFuEd_~&*T^b
-Qry<8lzq)|=y;xXdBxPKB>b?yMrZjU)X8okDDXyTQ)>e^d8n&8ni$m+(EGqAuSKqg&>oBKm@P5Kursj
-J{z;21StZ(>IT2KDAFxzm9+RTM@O78xeu6Pp-^dxt4308ZtZx^cIU_5}X!dVe7OkNzwgBbl_hvh}ge3
-xTF712Z8^ZbNTBa@k0iPpwxyF5rTpV5~u<(%zK!13l2a@o?*7Qfm76nDd4uUA`##bZ|f`lHi(JeO7Ai
-GJ4ODUp<p{60h;ob*<l~^wlV~))F9hSz`;@m6h6V|4QM&PThSQkPa_mqqk-GZTk?mDw!{Bwpf!5ePT$
-EW{2pT6^3m))TARHk0>ku8HD=!R)wlK#&<-NO&rhxB?d`WP5`F4MM<7Q8qpWYedHgSBg2V$z0q4WlC=
-syo<pqa#vUA|(b=CEKYVCfN0(KvH+58t<?&beF#C#PJ{97Sr{S;!hXaXDW*!Iar7y3E@EBqiLIQ*Ru1
-I`-y8e+Z;tm@+YN0~NN0v&JgySJ*M-6l=FzUA9~6`Qua@|Usc`_Kgao7nVSXj-9vLVW8x`mUeG2$jYp
-Rr=_DPZ}tX``xH415F0^rgX|skmjRc-iVVqU+>NQ^!>68Mz2KK*9q2*XVWhef6{ePNeFXKL&0^u#gux
-hZAp-&z4$7aOT<1TpVw8hn#k;Mu~$4CZ-+!=3lokn#=)v9e#iB02<sUXAv-d}54XEF-klCk*^3@I*!g
-k9n0;o`;)@R>T(`qcj2SN~FFk*C4y-s^aulGB!$8cf3n*UFF4~BuL%sLT-mczaXhj(Jg*Z^;b7m)P&+
-k;>bjj=xGYGhN2D^xTotF-EptY#vcnFM(P_*-O_D6X=`uhkAwKdjkPrV(K_L<#+`%zetv-k*XslO7Td
-A#2Bsd6jm_&42qe-(zIFLAi@muD^WF_oV8yAnSn{HtX5De6b`&m{u=>vSyFvJk3yb;mZ&Ee;5V6Y8f$
-G%kYR*!ZZbXuR8!lFdZ`^8@qT9zPFLdSJ0mAXoaJOR5h&_?Iv^zIDR*)>yoky~Tm!lAWHt(OSir9pRN
-VRy(qS+df=gb+?pbKVF1q6CG0|8lV?l>Q`FP?%X5TK%3xLr#WB=Yjq=u#u9>|0uL9;Xx_dj4|duo%N0
-f)*Fj4qlnW|`4z6sg<=nPZ&(qyC)~2Jzu+g*G*-Jhg3qDp_mb;%%FMA59c5a_-(2Wj7`U^_onE^G_xI
-d;>KS+#2OWW~T<|ytGH)*#II7ID(F_{9UB1V~xr~5rlZq2y%ZhvL%^d?-luXAFva-+g#Nh54X_5sQMe
-Q5DdN~`Ffly#~9g0k}esrUakW#u0-PZ|cCZ*t2$F^ooF5@;eJ8;XEwia;m^ClLn4Khzf95=0^e95BFP
-O8~14O8`x6%Nnt_#szSwhd~#X+F(HV@wij+7VgD?XwsGy0y{knlzc(q7Y1B8;w|e-Ab<`I<bg?0zTRS
-d^ed7ZIHl-4_KUxjlTc8oCf|g05&^Yi@ZuCOyeS5>T{pNvzUP0pcio<1BG4p8-c)p;Km1nO06HJ<$>P
-7(7UnyEDavo!!rM9xJM4qSN2=3=4TlSq5dJJJvt^#mhneR;C@F)AGW5BmjQyLEGN>p+|4B(1RFt9gOU
-m}Cq>Q~iaLzxJls7aZZV~Q}CFO4;(f_if3?e_YrKSJ6r2G{Y{o9f<fJ=~3awyP*=a#4J7&rqaSUG3lI
-F`M!sLFDjKa(d|kla(<9S6mnr5nW@1hdu{+lzI`c_5T0^kh`i9@}$P+tam<VFyPq6<0Rm!%b8(?SZ1~
-xPzTY@&$1^@R#-Cq2-{5HT2T-SHv$F$soclRA~pk*~)fA?X~v<o@CU&D6>Kz)meX}S$Uc1CAOFKb^nB
-gFq^n7r{0O)#WUE44DtM@YX>^LEE=<hZ1INd_<k5Y_=MDlu?=r(IVps4wx8wVR1+WUU;Sk*BfXN((9@
-!tdos<6e#qN7kJD69%v_z0bvQP6yJyBhz=hM9mv+V7(4spW`LBMkx#oD|h7Fi)q4km5y0uW9RpkSEZ^
-I|Y?hgOl&egr&#<c6d%-j50obI1GqtgGegX{krr}hWa*1vaJKg1!>#v~}5!f=?z2^wLxC`4iufs!~5V
-+e(k^v7gt`t70$EL0GX0OAP{LE5rKI)0Zc-vUes4%pbB%E)|d3PXZ$uw|?m0a!I#u%J*dVY?k{`xz3T
-G`VfWJ_$5Yz(_uNyU@JJM<2x@^etz<#Si3NMBNUtWwIy%7}eW}0h!$p1Rh{ylL5*QP{F0aRm3#NaH$O
-Ndg!;r1_J|@QAC6McMD)!){OmiZaaXPBvSq+*2Hz<m6x|<O%#M~ti+;|ls}NIKj*gNN7m{86+W$7+V(
-GfTEFFiTQ17{U~=k3O^t59uiq&<{XM$(&k64@@?GYGeD?wwockr=J$j9|gx=d~@=H4UoymKDmcF~8Uu
-JzFRV3;}Nw!n!=VQs@Un9NqUGG@><6q)Su!H_A+JV8Hul-Zx`*-(-@Us1WH@}UR{SCtThdD6xQ4&0(B
-6jIS&NN>)WcH&yQiLUMlt{xLt0c7=)g*~JzaG_9f|$XpifBu!vhg)W_i%M#_GRR+n7k<AMfQ}nqWj8H
-?#KMNtB}LYE7`%9PsU9v^4?b<1tpD4qJ348MEJs;yj@o+$CHt!M1Zms-^2cS;@5jq#9cbESXzl|dK6c
-DG%WePQy^WZP$o-weDL=LdeANtr(^UbArwzEDv?y~(h$bIp16Su$DMN^F4npq2uprdrIeV^o-^z;IKM
-9S88tOpWi!Lltl;9jx>>ojO-K~^^?ANhj5_3_GEvk0X&aRn4yq89r!&-PjK>-o%F9o8@b>W*_2xnr2!
-Dy~*J<+U?&XIMwl2R7e=Xama{OYD1N|)@dKs2^zLx=GnVUp|+djw_Qc50DKSBPPyBLz|^M3sb{G`^=q
-`j6b(3qaMDUc2mF0jQzl+=9<&ri8i(PK!TPPyE<4wv^(I#+|iyZ(31I(>vDqkeyX^49mq_mey@8h`d@
-eH*=g9!Z0~%%mmzwspibb7$R~hKFL@0|mauiu}=1_E`tS8A}}M*;Av-2}Ni&7SQu>KGlqnWAUO_$gq7
-bg8ie~HH%P+X>vqQYctlU(fW3ON$E~|?w~%kW;G7E+Pj8Ar|^g_H-5Oz0X^Vn4!Kt1wyJW$LqVQ{cp5
-lY$c@NY=Tm$_g57b2@I}!y;ok0Tudzof5);mhNt3b1ilM?H3ts2>v@i2SiaS|DxtC!*(AK%M7oqDobO
-&*>G9k&B5WzYj=fjlmt{42V+mBEAIj(T>N-UgwrPD=dPhq(`P4ab1pt}|gEuT>p8>(&Vn8m1Pns=wfx
-HZ2Fan_+hkQ7ou+^jhrWWxxMaWCvA#8-289J#A1$JqgIv?B&l2FeGSh!fTB((r9q{u9~$|G?25{}%v;
-`j4^I|AXiG2cY#Y&hdNHMPdk!fpKq~MhJ|6Ns=Tm1Yu}`fRPP_kvI$!$VaFP3&9-N2CdR}!JYgfBfLG
-x-aj|=gS?Yz6o_wqh`P3ClJ^u@@>V8>QBXM802}?b1!59_vEmFgEYJkl0mKYY=^{Z-`xmH-WI&@jc~7
-GQ*z{H`i{BzD2nPBe@mrq^v@Bxq-uRo%w&5y3Sz|yMBYw*!Z_iQ$s63$W0lw`dfMUvDTk#d3?>s%fqA
-nd5b}Bv{)tphUv-+rlwC_L2{{Jr;yD$Hb8oOJc6_#Tlw}Sj&f$)LA^76SG1N|pA@cT>nS2qycKj=TXf
-uH{h|NaJo`v-lwfqyRF?A*P3OS`YOY9{=3F^ja*RA!$m4J5k{Mq*8U*RXfhY=oPCCp{w!Wr^?(%{k@9
-&~(b-B?@zWy7C+NyXS^1uU!puEjFf5rXN68ykOOEKpzYRtIg|dBiE*q=TS^qOe1d7zWJqFJoIOLufO9
-K4}D}8|4-cFp^xn1|F&DaZun4@VME(c)ypBY5>N0AboE3eBcMF;V|65F4cX-lIVc1!ZvyFor^uCu@Iy
-wM58JLBwofWVIK@^{@F%M?ue51J$JK9`ip8QxEO^BtpB7*QXcOZI+uz&ELrAi<YuHjF;x&unseN-%%z
-3$I^3oP5rr6kcVhIZ-o#*4#GB^3~f(McPXHGo&Bd&g9yYRmJ_WykfM)IRh{@ZWT{~BO~Kwjbff6ZCg|
-F1bsUgP!?xqtT2dB5<Gz1|`6{K0P3EljqJShXGa!`AzM`=gD||K+p!&I9OQoXL-6c>>2#pu~cZ$cMzQ
-n0PzKQg2ab>>c*rb3uUTjRMBi7F4$|hQ**dLVv6_29toxwZ&B89a)k0Az}PoGH2e(oDrBXf-#^R2EUc
-28S3pj|0@%MEjW`15Lk)d1Lnz_CWgJ8Z?|KmFyNpk=sN(XV2&MO02u)=wvo3RAOj+F@*Zv4&Iy<qyg6
-<7+Z~so|FY~MfwIT=mG~t)uGkYSYkfrh+;XJ*_nG^aCuyp8{-%A&0qx7XR|OZYjxp=|_P!y2<XoJ`0P
-S-Jy~27aVvr%YUnaH(PnL#>YS)QG;G{nm(Y@|MU#cd`>{Pz^u*D61>2V)`bf;i^QQ+)>fzMfH%5dShx
-RHj`VILMc7cpk!Hp=u@zRK<1x1r<@@A}oLU^Yr|i>2;#6x8{Xl@Qnl1Y<sL+u|tHu0NK39LfDox-s6C
-QVqGv(saF;uwlEvvGudu;|xNj0Y&I`ed4RxGUnM_S>(&Sy<Xcz)E~*1KE4tq5*|K5glJt{jpG_F;Br1
-y)}fF25Eam`S-%KK>fhac>!N|n%nzd32N!dNR52MN*=kiWlB&xe-}N7fT+h6n#uTAP_E~sj=dvca0jO
-ju<vLuMy282VwoE^!<#8%iLn#@dJ43ZZhne(xjVpI5_zb<zj5ZqKm2ZVb*n4{mx3B<__4MgYd!-H5fQ
-+cvlq1!iE=jjS?3FF|B0fDYRH31#JLOySLoYQ0J?*4c*!OzLAmoNVG+W@Q$n(Q6^<HeHU>wmgJpp+vQ
-YT5}Syzke5UOV$*t{o^YJcNH1X;WNGst+^DR0=->uj7l$m~!om&fx-XLDoAkg6wBwyvpT4!%ppM6$C&
-ypR1t2`~P#qh#Bcc5)*z*XI7rRJbJ@w9QX+ga?eL%qYZZuWsjZ2`iixy{(aZ>Z>f-nmhL7SoesPfoI_
-1ra#~f2Cb~~ea9Y1oI#&8&cwgNo?B1tz1s8WVDk0EQLDR04ajA70zw48ZrdMTd#afH=XIi8i_a%cRJk
-y{5)IAWB)fp3Q6}UAa_BOWv-qQ{?_Ws9(+>w#t2|J3##d%VCh_20c6rv`9_LpWypHZQJ{LrT^3aZ_>s
-VI{t(O+p-Wj@a6f46FOR76Dhoo-PA%L@9>Z>avIp#CMz0y#H3Ay6g!CrYN+D_K@P|IJ3hj127BZlnPQ
-BHCS)9eP%+p#X(=uzm{uxo9vd?b!n?B#UGjvBq95;W*#G<H65$nK%Jt$EJX5(@ErA7Nu&F<;jb1#X)&
-QjKB9r9DH2u5LDZxU$#Gd<-abDP{aHzEb9{WHukB^D!{1$QqKX&$@oA8;5WTp7NQ#j=|d7WpZY&HuX<
-z>0e>^`YlPjEivAH*5N%#?>`f=KiuhOoBIFcKwoX^|MDO|I`e}6-Yn>kOoBoJv<rZPT?G2qRPvtfg#o
-Q?%Q1;}zKo+FPSPK@$F~p&_|Yh6PA~|dx&aMq{4H!o0b7UoJ$=08xFA4AAap11tQq;0R2pb*#Bcit{H
-^r)wilw_N-$f1-O~9j-foZqd)xA*BskSA^e1l%q789G*qi!?y&d}^(6In^zzE>sQOK6{|D^`Z0@~x$S
-IV8pYB#_9gJ=S1LvZ0wRrMou7R1!xrZ1W=o{QN<aIx~M>@A>J4*uN|r(yedFr0omd=@Vgc<sCe#sYAP
-tGC0>mWpkmr4M|fy88Ifq^{-LJe0AR@2Hv2Ch`Ds+n^b+Z9D_AwJ`%NHUB3f;JKP+rDWqTNI~*UIPfJ
-{mF+FS-?og>x3^SuE~3V+qf+b)zWNgAZ+~`4fR+dSNc{%W+`k%KQa_C@<zRGayV-_!CD0AGJxfBr>pt
-FTxK5nz*X8+2O3EcfRljtIk{@>>>&V>+9Yooh<?FMsYVir*NS1q9w9`Vv(amn|>puFDO6@TRmwA<lsv
-zJ?Az6l3FQiYCAu8W#Wp8KeLzZKi>7oQKaIf*?LRVt&NrSq~d3%QCmsXF*lAk=xImI<`;d_I#axFFYi
-PzQ6sW_&Sp>U@s9|Xxj3!@0NMrJV=Yu9c$FMm2jTB4&JYc;3ZC4<|oPAPTj_Bl4aWD+S$hB-2tA*5IB
-CaGXz8zSuJj%l2SP5Z~uK(FQ^oi3Ssi_lIIi)$_+m*wh*O}p~;(GYPZ2*g5vgxaM@@8Nz6EwbQ?c;Zm
-Lkww18OobaHMptBw)s~7LNQKGpaDAYiEyGppZa!m4e`r<y3=i8?n~>aGt_S=UHqjJh?S9DoD}CxvcTk
-n%dd;WQkj5*+?=Cy;K_%3!kE`Cl+??l&?gII=K!isUINgyM!po<p3d<W72>IMrj^|?VrkzbameX7sK7
-K}M^aam~2IJ{be~3?}^n(#1pWDK96V5kPD`-x=y}H#x!gJptj;c8p-J<9m->UtoPMZwzH#io_+j$z6G
-~2c+9-!1D4r}f2mE>}LA<;-H(VoW|q@ytE={L6BCXbx6P$e?=!_oxi)6I7eEf30LMVTQ9abz;gG3~b7
-)mP;?$g>Nrc<A%OQRoAPso@k8-`g1iH^X08HF2NdgTso>%4voe%besUD$7o%m1Vd*@3<W3F2+1-2lJQ
-I9@4P{OBQ0<aOn8X?`5yO^28AF%oL&X2F2?QdNK>>f$0}+LzQ)zItZA#IDTdg{s~1wlODz+_LSg$du4
-KO-g3CKUUcv%yFd73ejY{J4#Gbyx4j?Q1DDs_fG1hduN6g4s>gerO)V&+DT7*+Bk|G~2jZ_G!SsBmqO
-6<-lYOogCk@zjM<D7r%-jZ$vaCv2<>-;T@qFGe|0Nk`o|FSR&$rk|+*013%SJ${t1FNPtH|5Av;DmkS
-P#~{jMh|Ud*@7Dr_hb4#CGL<<v6f{ukD3qC`i3FS$(C6V->{F>29XPVy(`toypo8$oXc<Dk8$Yd#rt7
-2tu=ZMl!?3wP#GeH){tdzn5F`Q(f{~@VYo`mWI?0QCMGUeE}6*VvlG^Vo&~To8Ag%M&f&p^P;BykX3v
-e=+KVDc>Lyz{R^wc3vrFKaiY!gzKk32T#MZ;qKw^IU4k>SpzG5{WtWp}^yMDx3xA(=Xw>F8URueu8);
-Q3#wHWEwzm&q$Q&g~YPJ6GOr<26UGz>|aY-W1hrZtBj(s!DW7R;Bn5WO?=5VRZ$H+6n*d*d*gxS!8sU
-~+?;`!%PU9!_IX8T&HrZJa>OBI&FdA-+T1)0dJb6#}s;VtWzA&FhQ4FxBBy!|CH2`?Up<6+YHI5b;}s
-9ej&Zs>ViI+xhMu${z10mW?@nfprdXFN`q=hbspX05E*$)D=w5#4&L+MQ`{(H@?9^1PspUeVRG#-sC0
-57-r2rnWA~Ycs_T_rPM(=Wv~R9QC_RIqvgpDE@A0WYjgH3m#itJY+LtG(tm?y94`A`asI#o>$xdznvc
-a>npTEHgNXCGe4obzyGQ)Q0^D6_!+-_=yXB@Vg~4GFmG1IrxEkFL-B^!wg(Ii;9DGnak=<o>;|ea;qT
-j#P#82cU<TAZ5aR8yhy$VrngIld;Xr~mLct6~1c2c7;1}2}d-ESR)P`Z7?aAP`3QY_HI2n_m?gOLmUI
-__s;D#&Hw@fdP<3-*Qx$v6=`L?V~Xn^20Fp0nbMn>pgHa83aCyKB7eLTDSSlZV9xr8A0GxQ^su^6K!=
-^~W4s}eVY+RBy;reF9768wkfbLcyaHh;!vt0B0cEC5_iX7iKO?U!w^c~%!dF8p#f(D$eFZ_Wn#{&apg
-o4+{$@D||iPBi`+>V~cE<)b?n)v0Dn>`vevLhSPcL){!ladZ@YY~d)QE~n}4Vpkbq+tq?fuPeORw2H3
-U)+D_|Ltzdr<FUPgq}~v}U0-hP1vlTOw|t+@Pd<7xJG^}8((sDJJ9Jv>GoL=Ya46uu*XoN(?lZ&03j<
-B1aYgis&JX!5OZF#8>7CGRg4B_yQe?xE+Li@$4e;pVn9Y&8)kdwT#q(J_uf#rS&wSe~n3W0M!Uj0;vJ
-8AQsI!b%rQrw~EuIUhVxarogI}+lzm!ia?K$4O>wQ>ZF-2P}HXDJ5&`oNTK7X&Vai5MaEF@ZM5G4e*$
-Yx(aPr|h?C`><)+02n~>F4H<tG!-KpV<#fFloXc>j|IB2?F#{Jz@TZW;*zb3035s4%Dq+>NF2}9%@8U
-EyZO+RpX$|15co>L~)^h#{Hb8v}yF7{?NBWloIj{_=4R?zn`m>q@3)js~AMJw?|C{!>ft!$l<E(?d5#
-EgsFAg$7-{L=e-t6=Vp$RxO3CurD!FKIvxB7Gzy7p4tm@SE)fdvHth(#NpC7^VQ4$)@EjMoy1S%jdo0
-A9-@daEQQG32kS0du(n37(heYcku{dvl9qmPpPYa2sXze=M*WH1p+y1<N*vG>4?EYjbxEblL=ujSaw`
-_w^!@<2h+ar`2^1LH6|K-GEO}+-4!)~xW^$L8x?RC<ATvrOY)#n%wGnXj@p~n0G*JdT);AO*-5ZjDb|
-DOyFI%zy~>AUF-)^eUjz~ZlkZFv9f<BI&Je)`W<f`5OQuQh@{9^!|f@}UL`^_ES=foKVXf@PP6fn9Hg
-f@D6$K`a5IYbfYkqvXdV#R!zbnGAHTGa9tnDGa3Pz$YXHz3Wevh6n-0cai|Lf^CsUkgp1}f7D>fK!GA
-nK>?mgK?i?}Lde^~7z7*UO{ISi^MQazfhd@~`SLIgL|X87Ai*;bDTxG>5kSEr1ThjJ!EpFrMU)6s>+7
-#%d5-;9{WbWh5^!(@v4g&(&3s|poJN|0Es_88nYyoocyB`v=rhm#3=B4si&lT`{Jt4)TZ#?(&Y#BK&V
-U7&Pp06artlVhUBEWz`;CT_|EO11wbpkvh=aIjhv32$pt<{{^bdVB-uA6IJx%gg4@dKS^-Uyhyw4;(F
-ra4xMK$qnhaa$(?Jw!GwHJ#!kNR2bSLlX3Tsu79D=xAzBy&`oucSSeb>^0q?#@wm%6g2-1+=w;y@xEB
-I_)o$bWb?n$0wDB3T7CVNj^@a*~|}5Vpv^1cHXUj?#a8ptB9Aw8d|vuQFt!NyNe3Z(w~;Ya$5@NeDok
-A=~#KM4?)|=!MfXHSL2zJ1v=P9_S&)v>*1f&As*!M;PH_vy<Gd4kYYZD_vM_o4CEd#gtHLo3}5HHlke
-PpFQPnlx!TA<-gl=X#m-IX4U5{#@Wk76YpGXvnN2oe)5rY=(MBxz@pg5??QV3ZrV)90j^Vrb7>$%BG4
-VX#0yZvBw-+0=4$J!}+M^5>t*+{xwt!I3?(X*E0NM}LX@6gsXX;QFFN=gnscfG7j?b=_7lXgKc+elnc
-%PYje<1Gt!k!Ug4}5Xtu8saod}WbiZhRzERNdxt-k>6Jq7LRhO$b>HWhKFBh1Z@-YxtwE9s(Yl8|V;)
-QRZxUm3!>YJl;k3cIxKfh)-I-gY`z%5DAqwxFC!Pu~T3@?_*P%dtdCRQY|d#Lb&m`Lp!ze>K^yWd%nZ
-F)FWlQwT=bK2+>S=5~~mHVe~>a$U~%V(%p{Gmi?^y9b`qC8!=P8rU;HdaHF(p4f9RPZyKMy$&b;~uH*
-$q7P@ej`;Obc>JHw=TXu5EcE^l>+EcsKxP2DFi)9proz#^ZvHOmac5JD5LQWs0=ENBH8*CCvDpW9u)O
-o5OxMNgujR{#!qFF~OC2pp8OqN1@g(SOI|9*%vZgKbM)A+aazdP#|9v<J^qhOfX!pzqlfOh#$f$1N=_
-)9qY^B4XQnQ$1vDFme`5@866#&PPy$*wJq;0&0{1_RzPm=j0enjF#FSdnBv4gy>?-aM)3V{X?LGm^K(
-Js9GO-v`Uy#v$-Kv|wP|i+WozCU3*66aoDGEu7HlFM<`er92tn_HRc7jQkK#;?WqK#umrIcjQcCP%w|
-*YMklYmSj6anglsm_%;?v-*aZbi8*=m)ZWu#Ad>!dYncbt*75Mo=+V%2)?^>;mA?L>z07|JT+rvp_2=
-#7Z%N6P#2{^eX=4n`pT5YKYb#rS>3}NLcRR@L%f(t?r#F5-yZvU=pFi13LEoL8#@c}u`a~1KT&-VB62
-z2fAs)%Mh=&^IU<U4y#<_S$Jm?7Qk5~5V#_zB1?_3`AXV>?4E)V*%>-#&G2PNl!p!IdU<K^BgyW}aOh
-b*_o@dQ-~*=XbK+WO|yUAM?rnr!Bye)JTN_K_+?0(GtW5RMmLO8Dg=6zKU?+^}+cyzXBy6i4@vI#G}8
-v9I(QU7m`spn6&m=ke6ItqiNiHH-N|EEX?vI~X<6`g}Hq;#{-I1$UuLWjC-RD3+h%50xvt!?iyb`}}U
-<3K=(~vCDRo<UVxvz_#-pxxZ%5osO4uO4L1Zryvu5RI_w9T#hTt=d+bNUX&jZaiNCUmB|XWIs>^#yX|
-OO^!LuuP0N;LY!GEmx>v+QTP9O;mU5-MEh0H4u|IXHrXD?-@}91xSP2ug;!`2y$BD{|f#|giPV!*2;3
-nTs0|M<j_p{d5k;?^c_seMap%Enf25z5CO3u1KN10Wfj8i-y4u34<`?EQ8Jsb*b_NgXph_b-?`FHz5A
-M6}`$`?gZ+H%L-=Gv&aj@I_ci$8y{^rk?5Rkj6Zr@<DH>aUB@W7BTgPt1OTANAD`7kwYDmj<^8VQO`1
-qzAfy8hv#U36`0G;3<LYABShVjPiIJAA24%pQqt5SPGtXwOyoXKk!0!QTIpVPT@(P$`zC(Lyp&$+eeT
-15Ly9K9LPsux%es~izw`0J61~Sj8mlhveWk!<#@M?dY-a7p7j((K(9r#*X>Swcm6JFYAUY|r##VE?hW
-yDg!v!|Qf@S}<0D%Rdr2yGF4LKc;^7Vxl2i<#rv{Z#ZQ@rLU0i)JUI`hbk%O+-hVSlL!>o}no-fgQ8#
-AmtKS(%CwzHkiSGt^u7o->_Vn1<&3nTO*zy(!D(-NpR{nENmOb{|htMfbW|NQ~*x5L#tF+2Y7i~Id=-
-<r8L_VWbyzd69y5$uom_@&ntMKCx@0`bm|6|7?dM9}CRi?_%H6K@Lh+nE>$P=_E<i{C0=K#clhf>%O<
-iRMpJXdr8Z!Cdne6}MyK1SoCB2&hb=Zwn7#E<(J+JNbL~E7{ICde<(|_Z&3^>Wb)Fxdj-9Am9w?w?Fi
-Dxb2;icXbg>L8OPN-#@jpfxu@7w6Zr$0PI5&K+xVc0-xr;R<OPRxyCB}gV&bo6=(kNhov2mJ*Km;#R?
-Ap?6ox;7aN_&ppp9TGrqS=A`j<oY0Tov+F#0peD&GsN-{wN!oPdc_~FUzxzALqYBE+4H_qQtmdj7ups
-yQC&M+KyQof3wBuXSRx4@sj%kaLodY$dXXJCT+#V+jd!zGlTp8TB9{`B0BArJb~m}g9N(sBfM&u`LrV
-RI@Jm)kAfTOKOL{_CdbG-T(RFjI%a-Lf;y=m%#f<#`nq?z1;?H<=<6so-=(^n-EAOV~J&<OQJuw<tJb
-So<@SE2+UBB@J%cn?5t?uDw1myt>!tTgJWO-4geWZy_tz2`cFX$9%rX6f)>=Zs$wYY{|;$+8+0jzVJ7
-jxT1%^i?L3zTueFV$AMV%g^YI$PmOz*VUJtT*xmR8Nu1mA;m7!zK$eB)$DW5<Qfd2YXX&MulU}9|mg9
-tSSs(dpo<xT%+3#%WxEoaQPIoTrIi|=PzIcT$-R-i0XzYbLVcId-WS_<c)hWSWb5E}Pr*#UWp%E%fLg
-%KD^5RE%OX$Pc_KP_9LsL=RPY$+wKzij?U4>Y?<`~`>>W0|^{VRP-*5Y)_99j3!?G|<&8RF_fw%bs3&
-T3Y;Y#+=}KCtn+G-H$K4axH8(6Zf`$&^{ZpZge14mq8ODOTnkO7ziWv`|?ZgdHD`gkE2wLr05k)Vp->
-B6zzWu6DU&wvV!$_@~DaUst!7==!nmsc@=~&sF0O5Sej_{a8Hg(gp|aF)9gVvO>a@J4B3<<b2SQ9gW7
-KQd};#Hr$dK!q7<DkTG*jM(YAKv6`hhRqEF5#TQe*Uzg6a@Kbf!7FOE4I1yFoH-rw<QLsGmtP<FfS+%
-Za<wujoJ!H%@d0Z||Q3=Q6vdF1X7y9gw)a&I%%ub|oS35`W16A}RjB3`^rn;(41tV$JSKKO)FEH8P4o
-~dxdUUrWOnyt!Z?(o4)EcE**Mx2N$WkCB7S_M<s`ML6q9lgHB>hvA`cIDYC0PCIWBf2Z1mhG+;V46)K
-!FUS=?@3ADeNsmiN9T=V$gL8vEP}ua9I5IlLSJ}^xKLU_!ECDQTe7HWf7n$Z~LZi>&O@f`5gY{K!Nb`
-HjUgeKNx<8CJNA!vR{n~!8o8x(I9k!V<8!Mu;r3l%%U@JpzT3IgPt1mR?Y?*A}CO!+@k3gg}3v-A~08
-u!Qe3igU8gn4vNFSr+>+Wk|nV2?w2otOm%k?MUBJaNFUaDCilCUYzXwRY|og1iR_n@>F9!KUuFq?ySM
-_P(~nXe<)<m<Ya2I60mX_oUK{T%q6NmHEx49dQACY0SWSUNkHXhX5P7Frg0TfO?~_%7ATH1rkiKp-B=
-M)(r*}47b+Xvc{41dbA{k%~xe9zhZgTS<<j(^1U8<GCi}u>m#U(<o^;`OE3u0Sb*6bU{nWc&vt2LQrK
-IOT3gMMLU%zv^nR)LlA7TAPC-3&)^EGarv5nN#mbPxphl`zn&5LC7%S8M6SGx}VXVonZPi;H&K`d&J|
-9F8Z{{zSaCj3z%i`rfq(S-%)}5l1b{fa0)c+zWo<7^dXBwH*n2oScTA^mFJ&0(a7fmkGD=GD^Cc<JFV
-e3x$#~Pf39LG?O8nQD1(5kbFh@p{MfCG7PBGN=m9>nDbt%%4Cn=;){qK0vB+2-(>KqiEMapvnxW}Ad_
-V#uEcX$>W&PiMw-8z6V5q5u;VN|pNhzv*UQ36vYWlaEtraZo9xY?>syspjeP-KNID;%9GYQKO>s{-I2
-$_x8{iYkp33Ke2%8;IEL$ezFKSy0OxPGYb2WT<ZchDxMo>dH7GsG9Hdl<W;<!pzV>zuhJK~X-T#v8{(
-;d94=sh_eUWRnPRO%z%(xk|V7mZ(_>)r~a)*$y{7QmOAZ`eEXFwNQJ+Pnh14mF-bQFG5cVX{%5&*U-$
-_uCzL9KzH6)|DY7M*T&<Hi@{{GDBZ(sJ1(1bb3l;B<zP`VZwFLIR2$?;b_00p?#N>vC^|)QX)p#pP_?
-F&%QUF7wgcxB>fPz8D-I~sx`X<qmRsexjlu%ljzwXm84`-mEo@Il-9B{q|+!tq*-w{p$cpKT3Lxp71K
-QI^1VE|xjU}4iD(4(dhC3~Kl&BZcpJQ$Lk-8ca$s++S3pPSq{y&SN~s&~G<6!j^fGZ}G*qQGIQ4sEpc
--rdkO3&^|Du5WgO#UUuj$a4HqM^zl$RK6{8CIsDB4P2d9M9@fP8zC)KKMU`#<1v8_=mh5$j~|^mn7-D
-kt5{A8bDL=GsDFRrzUA`Qr6C#VZ&8z`-gxOQ~?yWx0Y?4EAbqBgFD7du6#A{2PHMwtuah8(A4=1B)A2
-nP!vx({__(vCq$M2T<8y;%bPMCpMbEjv@<~UmLt-4VIl*A^t_-d|P<Agn67A7>h64pOHj#P4^4-IVNp
-T9QvH`oaJ>Xg|RjgY&Q$~OdzkSE`vorF12ybE;#I<6DK}%y<(uSA?SuVzV^n+f9$T+;j-HJIZyN3xYt
-mB+|7YE^Tb>nePq9XRyKuHMmM5b;M_D=M<7)fcyVU!?d#(W)xkQvG!efB4Y^9HIKoe~ujCc8(x*Fm#Z
-nUK*>O%cLL^V&>5S6|bXxrNn9Sv&<vLZ`i*BJE>t%X&8hXL1a(SRpG`$W&9bTK3z-wVw=>{RyeBBACX
-E_iS?uB!XXIhP$n0_=V)8}H7a<(srM5FVOac6Bq>-L^eb<G9y{<1h%hcRc*Cs-jW$Vtx&M(Ta<uI!<}
-?k`=cAH74<*Ajl-StXzx94%kQu3~S7)Z6XIN<ts-EPU&Vc90+}858oUp}Ar*%yklH(KiXIif;t<M6in
-;cS@SL=eu>sZXWt#Fs-3af$<<8{JD%h1G>i2lt($f7mc|e1Hly2r91UEuJ2RKP83CAnjta5$LnGDp+l
-?my&50cez-d5PJ(mDdD$63A&(TjERsz*$7l5-lcLiO%f%OMrSqzQcBFc{FGo}6AJ$1(PlvN`;E%@s7O
-#*6^SQLH9a#=j{0z&%ZS_lWRT=$2FY4mVS2XJs6&(eKHRYkb5js0?*^5%HXU4HOsML)cDZXeg4wK!}a
-0k?vqJ}t$cl>bD(7)-zx<N&CP48{`KY(ZI@qemU(L9O2Isb$Gx%coVyL|zS-*)*P0Wt_hkQhu7I0Iue
-gW?Fm5Cle&G|4as4sW>d!*=)v{UZ2naP@W<O+wHkAYj0T+OQ$U06c|e0B4cZ@6^YTaC@GjK^-3@KyMv
-rj8kt%E#ghvLf&<X7&Hc$7*soe=V}I;+Fvw){;1hQ05liJfb7n^q2Klz7zMSKgn7@jM*t^+(o6K7f_q
-nD(Dwt--FVNFZ}66RH^s3xw;ni<;XpMP`D=1K4a(EZS08bU)p^X{J~tO?Uo3lHN9KEzeW=;P;y)XtO7
-1GUpW_A~%j=HUO6QuBRLR)V+#kvq24B@AboGhp>JVjw!rw-(OK}DD{-dDcpGL1gZxiyxTvfy`S^Vc7$
-3K4OFK-NicLvbzZz4Ml#=3(rlYNUv52^8<P#>$2eb(kWx$i`2G`d|{r<Q!W#is*ZdozQjyM#Ee@zd&U
-^Oja^?;fAZUDMbDUx!C%PV%NcDp%(yzD}>lA%3A{V_(8NJSdFv8nk<=`3KA=r)9A&?HV;$l->)Dv~H?
-+ClyF<0y{uwcegG{-1D?P?)eu3o5^61$UcQboxCyWk&Ajsju6zuMNIZ2Uz1B?<~!*E4dL<77^nWYo~7
-EA+U$PePrM)nQES^In^)SgsKjwS-?z2Nb3)j18!O_Gvkk9fZwb)Cd-QY>qT}AubkDjwhiSxPr$6<jUR
-Cq?c#ccTG`L;LYPN`&S3@WS@2RNW@{-BZ4$?Z;qsfdexO+<-Wc9V-;X*yFw?u-u=iT6$h{tZJ<nqx$q
-Dn1&B)-l)IHg&3A_-eir@Iw%zS)oDs-vS!!7oC2Wip*-*K4>10(aM#Qv5nBWIftPH?rb=Q9QE)EI+eR
-Tug{7&G7NK)Ro}pK|T5BQ79kdLy$YGk0UeCw}8MieJJe4RJCb2nF66V?qid!?BLQmRNTrP+})oz^Q<R
-0X~jW^wjgo6?GP$9V;&h$MdtIK<833^+3Kz6<Rj6!0^N~GqH>TWJ<T-Q=_@>*o<+pfsq;FkkDWv)Ztv
-@LKKLwmu!QV^?$P`1CJ@O<Fb#9ZWHxcpc93Ee*d7@|fl3F?jcPi~eM(F#=^L^`H)OYN_-gvndC0>pvk
-84pK<fdzHVg|C8lyW`zm;)9hpWy!SC*1ui0+p!*Y2k;7bq4AjvM5_Y;QJJ1KTpXN%yoZ570`zzP6uIM
-Db;#(wfL#o8CAVC@h!`CvQ1c?ymW4tsM8+grG8xm4sep5saj4$rw^!<r>}&wgf&=M++x`0|r}WclE{G
-I9uBpu+w(H88Udz4?m@Sh3+OrjM;T~dHii}7wC_ogK&Jc$OnD%sF$Xk2wk3u4)GFsl0K?^L7y1)9Ny-
-W@3f3@6FPR8$XdFi+29tLtkPz%EqJS4cimz1m{wxC`xeb9<Cv;`1l6H+SKWkn?z4IvJt@--qpT&o)7&
-%GM@$ywVI?kIm7f&KRk=0a2YvRuRfCjAAwfdn)I8_geF(++Zm4XPmZE?3UOU>J2F#zdE>q_z(2hei5@
-Sa{i}Rkf4hHFG^VM0W2c($;EM5FT2yUc)Ke3~CQwUdINQ4@clD#!?kHN83L|d9LHgH1}Yh~T|)Ta18N
-9qaEg^S;<0sJyxY9|~X)Xv0j*<jkv8s7C{XK`~utmLh_%{tv<WTOY|et%k0vdZ))e}=qeObhEogy&4Z
---{;~oh9RP(<tS6FH)IE*EJmrf+!3!i&^42mF`gSj~PvEDXruR(u-qcvP6@@O?TBY%kE9$e$lLe47V&
-HWE>d_j)6Im!e!zT`8gg>(ZcG_?1b`YuSJks`a>f;Uqk7iRWi;T6GrUzwuo|BwP%Irx9_7Ih}Pn9$o|
--dQjgonjv8Gxe+3!6hpf9H)#Ax3%lXKjAJ^7q<nukVE~(F{H(A+l8w&Gw?vm@nf^Q4Dd#&0rwKK%2UJ
-rH$-9v*uEBdyyIyquYxJFYR*OE8Kytj9n<YOT`H|3bsH>LEW*g#tmqff}y?~d0+u6xK@0?zc!+zTq<c
-)tWg)m^>Qe!w0=peG`Zc=(Ga3g*<T(Vh>t55+&AM)F12L}}Om_Q-zYA5D{Xar&tT_1`~9IUfHf%m2oQ
-+Y=cm?tKIS|Lrlp;KRRq{SQ18<gGf4;xtaf8)Bpo{6mQYB7L(YQy>sbgulZnz;^K4VqimM*}EHtyxr<
-CAkX_DN(7E_@8V+^zx!Iz=Q`bn3AgPV+}lv+2I#go3F+Ud6p%}p@b@?c8jHUu9FpMeHlUfkMTR%9mt?
-?j0DGSj{4Qi}uog!F*2GD0wh0Zmo`Bz(f@&h3g0|R(R=17YTLMaG0t%wruQB{rC{a1DJkOoeZ#<O4X<
-Mbpst>8~Lm$`g1o^*WH18}4hWM#v#LWhI_N5Ax=TyE}ufCfHn771@HzYh)TxEN?UN*QVOE9D=?~$o8@
-R2%hK2;MxE4O{!@o*L$pnv;5xNT_G8K6aLHOd@=47;D?FQmv><E(`fzCYL(lz2F^_b+WWRWu*lJ~trZ
-2&ppDY#YYt{UWpe(kjzGOCo+7-h9ghEk;=(-;{@eV*j^|TfD`8E?s(tYfRRsGgQR2H3Q$?BBqre6tli
-MTnQyx^xHryyxoxMs%SM(VE{v$pNb)75&7P7ZR#cR#m_a6ulu!ztxk~msW2*uQ_XGA8Z!lBIc{)UUfJ
-uHzN1)4!giV8A1rqlg40W}-9l^prQ4TVXtC|I9sO?P5gKg2GcWL>0Chi)DX_0kjzsxabPfGAyyi#Ncu
-nRquzvL*Bjx61p}CifJ!&RC1EF+p+KRf<x`X9*ZFyXZAR_%Wx;hQbAeA6pP-e&$^>$z{gLIp_pv42Jr
-@MWfowX<A9oR+o?mGn^FDIXu3&$Su?G7X>p4X*Ygp{G87k0RwQn9K}zR>a3?a`G54$ClwT97att`B>V
-h1WCWyIv1GR(3}@&9JCnroE-)*r_?QjAGc5DBXJGb$TGX%X79wC1I{MMC9gv3w!n1FOVT^=zE1<<IG(
-gVtxf&rSIq^Ns?u+_2{X>aw5H$sb*1!%khPYd8R{GQBvae*ty23<1g3BG*#k-1vYOXs2w|PS0c}j@|d
-f$b2nJmUzBCch65^_cdLPk5OR`Td(B7VWPpMHG*;5nv8<0fE+KLO9c%g3@9~{jEY6*y(_XntYQ(y>eN
-y@wq0cqs)^?&<*+IJTc$eB7b$_V)wjOgbwAqg9&Dwhs7>3kCbjXwNLSG$$Owp<LdndHX9@-&jJ73H8C
-B1^Q!<k2AkpXgd`Q?(z@QxuYIb9RAMXvNkw%T!=77L#03{8&*GoA^^ui&dm9I)AtU)|m&H0`;t)-ZR-
-;?p?0?2w6RPI7*NyL5c+T>VvhO_2<NhLn+Bl+Y5A+=a^#T;r*+oKNO*AhKaR-S2VHmN1@YFBL6C=CC_
-zOu{4Mh00ySa&D1PHpK=rw}TDQj>e6-K*g^Tm?{^628*9hV*Wkc%s03Vil{0l2tQdr>>Q^Tr~|T7?(D
-ANRhd3t&(<N8=4#5*w-`&JP7a5zJcp|6*ZrYCzMv`c$f@#3{96kQ^z#byPZt>I=N0CkE-=u~E6hJ#U_
-N`E-FV*OOSIB<tu7B}`LTf4=@X{Uw}pQ)1$F_&X6RjQ<{#66{Z8F07kx$kDjE7|CKs!=YnEPHENI^Sq
-R%A@=$AEKjdi+3MW&}g&^(or(WOn5SshD;v9DT6CeK;UCLcO!JJ?6VG#oNv@KBXxHyF4WC+y~umwrCA
-v5e^9RKazwU{C!N26k@ja!as}t;+BcL<9uYwm1_P=3?yqXBJ;eWh&u)F6}jg?sUo0utDvjt1cg1+9%6
--msXK$`>p&uz7Qy{!~2uu=#Vp3riCY3rte3`Di5u|RD6Zd?I|-47n#|YW63f%=e`W^-g9><iZ*qqK+;
-1c4e}MLd5Ps+_tb|iE$<w}4h`wZ++)4+*yFB?vt3S+jM8hb9BBnXIzH#iy)#j$bvSBg69>*$x%O5dft
-EUgkMGXsL=dj3w}s@}>dDs!Uxg=WcQ8sbGK^Hy;WQ9PLxAQnnmdzTXtUwu!HLH#WTlf}>v|(G$*t_;T
-dk&UEN)+Np~JF6cppv4jNqO96md(2UZu*<(qT|vdfeY6UVgPK&EGYOeHa(uGTzTByvB!>QxCU$vwfJ%
-edvy`$#YD<o}W-zy(;ERG5uoRB?}gZ6Z@L1+CJ%8FJ*kKGO3Up&$Zs)w=ZqN&(Bf5cY@`wx4J=u6v~Q
-Q@N!*>xi>I*io<jYg&o7|Xg4aOed~CcrgQnlp62R0H2#6u*7%EQpvaD4-J6|5M>!UabUD$uE@NHo(Q7
-|fUKhWt-0Lnu&F2WEKeC%}2;`9utmvF3l!@S_vaoX|T%iOmt$)aR`|S$=|H?o6``G{A9pOjb+pk{zBm
-bPh5duLd3PZM^G>tPKGT)dt?$6%!T^RWtjsb-%MnFXsOgW`*tPBJ4HVnp~KE(YSKHv6D)3<Ke+g=(Y0
-O+R~plK4n$FYFFWenJADD!(p0{ygb%QAk2`w<MV)V8DG7(nWvR80Z4+;*x63Fff2900|E<QatmF2RQK
-;kSw@6@fQH-*TjM22P85dtU<!>lBdcxBMdx{}T5*XMp?V@A&6;6W-mu%sCx@f&2UaAL9P+Sm0;n3%!o
-#1Spg@jM8kU_dRKkhd;5vg|7}}Z+8)+G-mUg2PS5$;tYM+`2CIfC-(*V=*Ik$`vQG*WB$o~fj+u1e|}
-$nREUB8Tp~uuyw|BZwlCC<tTVdbbFZS&O;`+SPgBS_O`t<?JDUC^8#h7;MpNVTEs6@^9LEde=k<ytjb
-xv8wzpieOBo(xQ;K8PNYJDkFQ!gGG6j>bcz8YNS!^eCP;GZVT-vC*UxJoX@tfToUbx`kr8au)Vk3{-;
-wclpY8o7zPAIg_#VOF$5;kILZ6v)3_Pk(nY~Pl#5EjP=RUNv9&pX$10;+9Bzsz?L9zIo>QYs0DlH|ng
-bI$A4#3lLEGHt{#Nc6JT;-OKUy>2w+$jHI=C42?@^3bS7AQAVMZ5=OJxyX?6xEbSkunU!`O*3cD3cCF
-nlkjkP9Aw^_9&3uE&x*^O$lqDy(a#h{UXRG(++U8cj6!OHxs$N{y$Cw95J4NLxlh|PpnB9$_CxH3q#o
-<={f;SYNX|?pM-K#nNg)!v>4ACBqM^y;V-~D4HgP=R)0(5*3y4*PV<DPJMW{xYXX$Z91N9a5)A<rTNV
-eW%2P7%56pGTSzuso2FgdB}@t8>6RY@krMV#{aP^qSjN6bX?>+#-T5jyN;M^etqeX*jnI58bW%6)h;{
-96y})NQJEm#J`OR2LD}n@8HNh|{gecll0ihlldA(6htL%maQfk7Fw`S^-U0nR2#utAu64f!8Rs^}VY(
-v8tNac!$uBOrQ4&hB=8T_!}Mx=m&F3UBs*Jt<XPmXyspewN$6C5;3{-1hbCU@|VNk#`nAkh~pfBkDsy
-f8qbl?cHMxuv^Si&(j6`(&*7h7YRRd})ld~b|7m~dhZj6$u75gQw<QOi@S^~N?YZxg`ezNr^RYsT4Xw
-A(m1iF@>eZ@jBJo|Tqq~)Fxxlvacx$|H#kSaNh(G=a?~Y(U=+lnXEWVX~!O`6_?*eJ$7&cZFH&-z-xU
-X}vj^zS4|LtH<;BaTX5(mSHC(ZgYZAyIRB2V98|2M(;r-H(bhj>fS*5uS87r0#i0p9-t_o07__kUi}z
-Tth9S2IjVt6O>HuC}}<xXUvWM{ItW;l8DXV%9XJx}#$FjF$QexsPHJhb}o~e&izdi2MBQ$u<Oad|fjm
-K<H!&$V|Eu;f}OZR>S&M6lnD#+*8}WJXYv}?0j9m>64qD8m(uh<Ek@>&sPr%fg>C}O4r5kUWy(*F0E|
-Z<n-XW%f3&p8w|AfGnCDTc}VRlLo;7pI(QK3q&enAyOWudtA>fzP90kGu7qgoeoqNC*63n($<OVT)x8
-x8Q6pzcN#cd-$SB;-Qn>KMaGmw6|2K7S*5oFdbqn9~EBc=AH1pIE?*#}DGeS%fcgzSOkQl`9>kr_eY*
-)JM>h3pAd=XXYv{DRG%Fo(sKWncApX~h2J`f~+x=QI5<<wnEk5HXUdEv_Jt}^qS0M}wc+sl$XOCjxBN
-y-}c0lv<!etkqYr1yPE=itULT$a^6JX|aO!lF*|90PQAc|8H_R~0_HJ5PZaOpwKJYtNU$9PTHEA6~DQ
-<fEtN4l3=-u<^Jq+9L=Pgt)R<@+BcIV*>1n3c@E%>lWRxxyU@sTivP3y{>EAKFQuIULLdHv@0D8=(?X
-y<uX0gOgwTjM6_K4=&<%YTTeR5)MIKxVqR3t;absMbw+P0m5$j-$9*c&lhA3OkDQv<a}qbjUz$O{^Av
-c~2fN~}2%l5zHW6>@4b`NRMlJ{U&HH|!y8i0(&*^<E%U5@NONTsb`mqcgkRxAY0KiN>E|YFJ(?uz?xw
-a1&t{)5x6#^~wF|;&cGDF#OdUBo*lJdNDIm!(|vz`$5`{jP~4?awi`Nw3X^n-xGW`E`;+W625;XgdpR
-|4>xr}>r&d}zC~R?=AbIfs5N_fv9@T}rlwIu>nnCTmfT?eW0OHf{28-M`2Ch0!)tf_|C_rMI1fwcg&;
-BKW^Zbnm?Ha*Y_>&Hj_^QgrmQlwx9!kBYWSZvn~CMk8W+w?o9Yk(zB1W>=0d$R;|*c87;;A0XW*3K4F
-!A>GX%m_3;|j5kwdgxO>!$uH}Ee%e$aFZ2(Sgb(c!4_v<dIkX87_)kmndZfd_;uiY%jvm4{8jRRER7M
-$LXE;XBMRathW655>G>HJgP2T6d4R!z2%l;a_Cyd$`_xibzqL~vmNJ{PRBZGj?F7?%S0ZZTeEE4<3%=
-aOIn7(=Wtp5XFQv$F0_novoB#`|yCTLl*FecoVbQGaPp`Z0p_}pOwgz@RDx4xo^aliUgrJtMe_$66z5
-~T<}Z>2i%sciph5;1MM$6amBPI_}j>HPEi@L`5jVE;J?Q2#u8^J8o3<JlXHnXY*`fz=&mrnhobPgpKg
-SJGB_Kp-Pg7Ie<Uor!2XrJl1F(^!%7I>0D)xK4}Ab(RZqFf}lz=Sf5Eqr9#dM=xmchLr$lt<{n%OSqS
-J1v);O2;{T8$_}Ajp_gUy;7bK>h4;!BTpOutAhH*g?97H!Eb3g3Gr(s$8{F2i+pl_~8P7*8bGl;6d%h
-&uW-(y~IdTlHo`ycj^nwN{wslF{zCNn6VtEB{yxUxPn4cDLEirN=^Pn-+*o|Lll}K%v)+MW&F*V&}p0
-W{4*N0iW-u2306<-;TXQ1c%Q7xIFOK<Uw6`7iG2oy2;tAawBnOt8~k)7X*IdL6-V(Zp+#5i=r1s6We-
-T>?`LJxnHc?gL7D=e(o3g#P1K_SDr;vnls7tNvc=d(A507Vc2$sQNL_hbH=iJ&=Nr^H4JStd@wHH8^6
-jNeB2)EGYU2kMl_)6(<B0nI%MWEEsMp;ecp1HklID$u<nNTho1j~B3w2X#8Oca5#{Q{B`^`!oo!B@Cw
-PaQ9L>SfB_Dad$5MWpr8~m(BK(%YA?5VN~HIPBK{PB3F(2$S8$uLrx7mIy?zwqdYZ4fUK)$(8q}2)sk
-|`20)L_qDi<5vD&MqF^EI+3p%Toc|gcA5nbA^%gb_7(-NT$!%58$njq5kC3GHo<WDA`o!GadVpx}Erb
-Cv(1Ae+(=RsNG$~-8?P>o;K*OW57<#%^o;ROtRq67T6o~yZj$pAhm!n;~9vRIJ6<1*Z4xAmj;8(8<pb
-DcCU>ZWS)+t1vD{(GnW#)0_vPWekXO~_3MNh6yz+-5$s_svLVvqV_`i^I((E={(<(rksSk3EN0U_;_P
-kTBi{Pou3HhkdddA~u*slMU^%-REJwT7qw$b8xmo?$1P)yUlPMZHSufrg)nl1hVbuGkXfb3g0NQx!bM
-x9Ald)UXpBAT`!iTdoC}%+c+TmMmx5l?&cz~Co*QlFX0s1;I#9938&?M3r-b>Ex*F4BpUE_V=}(i1qa
-Rze4~jTdl=d?xaeQQ0k`JOmu8RZ{c+5eSN~BY-*3Y!@FTwd0k8CL!7K11zWxbbZFiK%FYr2T&db|oRT
-Ukr+&g+D5FUy5mYlM_o<H1<He+S>OF2<}chHY;3;YUie+9R|C%nb_(K^vg1JP_NzI}p`(EuUvmx{5d=
-pR?w)AyNra@^tOp0LJ$L|D^=&{@xcT01MrB0s%1N>K8W$nWQj9g?B~Db#PAE-D_x&0gX{e0#~MZ!fg3
-JkOkca|4gj3IveM03t+tu%W_>tN3ut@=NU1t#r$!WQA&5Bf9=%-@B7>H?W62n$z)8Lq+5n`t=1FfHd~
-yu)Gowng~`YibSU$`JF3iN}0prZam`F<?D-XK!bLR#bCVw=t3D;;PCj9N(>;Wnl!0!cr<Um_k5@w#6e
-FTWiVczGDSM!B7Fvr!^`%T^CNK1&0v)NSfRZa+;F#t0V#-FrMF~GtgQ!&n?z61BRFRFlknZF>%X5dER
-DKefHmrH&?F&EgQ`svlP!mI^`Arxf8Z^9_OqsPM&n&6cj{4qhr+4dB=_CRAT)Orxm~RK(5R&gbdrnH&
-iPfRc6Mv74>!GbaD45fr<>bPnWMCu8erXoKjNWOTwb{meC;+9lamOq4H$rz2_&}-+l&O|zWa7q-U5tO
-XQx9g<`_%IIH%8bW3U%Y^v$Fv8g~?l=00(J&YiLxplir|<t=0tFh&JV6^M6RmSP-UWYCmFq^eJ3D1*~
-X<JpuhWGzvrtd%BiM%StbQh}!iS=H#NZ?n0otZKczGk&ne31&n_O74EAR>dh{Rra9K6ZX~){#iUMJ)3
-6<lkpk?JoM+atl<~+<boJ=2%|oyN+=;g?he^<_g;2Ox$<BZehvQ{aQnqY?|%z-|9j{EGXVeYxqpeo2(
-|4SZ6dU6+YQ<R=i@zm9^b$Zi#K|h?s+)tUqkdmBwkT=rIK{E5#r7DDA~qWQ+Q9x*#msYaN9E5oEhkya
-njph#O7g}{RD{#ay!>r5UdqIxR2n{)W%yweDnEV@p#2x2Hr}9INQEP$d>-IO<2I&#Sm;OELJ2&nGNvc
-JuENX#c|2X;(v|A)Mn+-r@utv2mk*PiOq#2z98|+M!rMhZ@dNnJ}Lu$#d^P@a*+QNm4Uxvy}yIXz_+m
-cF)DYX`K2qoDBq(p>dip1zRvZ{`rC~7_uME9S2sKB1-jIYiSVF8K=US=le9qELeRN@!cV~L@>Aw4Scq
-NmD|1J$>MgodBb#gT+rL0)0o^MLkLvK;+m9z-#Odj(S%?`yk!&Xq6riW4-`)l^;hc7Xx(7bJNGZ4uVc
-B0Rxstp$T{Vg^y7(z9B+DJqH06#tiQxq67l;Zt9mC(9ckT68Hr9Kas(Yp_+xpE*#5s!&SDkizOKx+0g
-wG5}U{9`!EbXKz$H#NXQlK~&N_Gs)W_k9n=rR}wlH@HD*BM44DX}f>OYopc4tBkx{tU)~!4Les;)^Kg
-VyeFb<U{0Iy>>kVlr%cNb+<^bk;)Afh<@Li_awS;;&Qo&y9dvCXxZrg;70LpGGbAgGS&cJ0Gq_4y4>W
-ZEqeR8%tCPF|H_TRc!ffO)`>YivS8L_AR38c&QJjpp{vnI2FmrE7BD#$$6>faQq)An?QlA+T$W!z8SX
-|qk>=WaLq$3p7Y=x*q#Z2^Oh1nYjY1Dr{p!^=&NCOK)5^8S;_`ZD$*Z!7E>WP9q&f3s9m^u&=F<yVfY
-&%gi8b}-C^ai}-kb+>Sf;)6NR^~~N=gWOTb76|hxB=E+=VV<nZl$~GDhjl-4oy@@TbhZCeTDlcuYYu^
-FD$N;yJJTfq>)lxujqyLMYV^sh2O_jQNIYc8dyfaGx)S8h~FYrd~LLESK;)`x)flFx{L+5cAa@Me=}>
-(^;#Zs9L<)rmuMyet4J^%BO|1tAhb__Ko~~H;Qaib9{=V{VdpC0c;a{{PBYyjVFHZkgpySA3puNlsgi
-pF@j(yiXm}i^N;vY2Tp(T%ndiGM!MVk(cy+{;cnwc>}Itz{#n8ieXIjtpR#h<Xg5j6i48KDc%zzWycy
-eW#)9y_l6aGBlj(-9ThI==o4->((}81O1m(MpVf^Vf;2qBK?cf#E;ZHd_=`Qo$v7gvoDKK)w=Wxe<X7
-6!t#)|Ongp_S}6H>o~PiI>yOZ%&VM1sY~wf28@m+?avq%;46fy5q>`q?Ra^W;0g;$znVdY=O5zllfXc
-`o3BPl|*+8Fh=&;Ug5;w&lvu7rRfWCXAaogy{&dzU}o@JE)DHK<(>e`<?tb?e=fp3Gn4s{&XjQ$BvyT
-`cp8*ZF9aL+)dM@@i^m{A#(S#qG`RNoE?AZOzbsJr|G^jQ!yijR}%4qdIF@0JRZaJ)!Qg>8Buk7fueD
-_&sx;Q*D{+suUAiTYs4P(v|7?7^)dx*MGo|+dePSwh(cJTPpx;L!H~!}>nV5CnRH7Zdy*ipLxTwh6{z
-Q9a&2xg=z>%wQmMg;ljJ5Rc6}35xm6yo$Pv?_J+R<#_ed@?nFo6J+8QzC<4G_sSCShw#egvB3{nk!xh
-C;+nJdypfLVGHsH?7=mx-Yce>kM^$Q}QE)}F3ZjHCYW6QZ1*OU0S#Hp6(N^yB+Yz-2lphgS=DqkdCaL
-`g0nrW#M=jZ-DY5`_L2ez<jTI=XnD&Mz7Q>Ipv)!NYqW9JG@E90mJVShRi2fe)kI#9PO(mbt{N0gWw#
-XpMiFA54ng0$-@@o`W&xLf7kheFQG<=~&!wFs9^3=7P>EiUjrfYULnyyM)wXa!|x={@ZXS@kL#q;^Jn
-=(WK5f*9AriyrTubUJv0)-%YFLZ?6k{R4#DcWW<}&^i(lc3`g9M<vXP3-vNTaBXkv<TecQjw|5T&v~A
-9=IbV*Qce7Ob`kqX>b(dGGyy5Y6bIlWKg86XPwJ0cWPaO$l+J_?@hmDeFa=;)kXMP~yX4qb13VNG{EP
-f-l;ff;ryuKw(4P*FTbZ#Y`-4xyec7(Vx9^Dl5%=G}&)zb_j-))O`rbet!M>JdKF)5-p!f9@~Vw74r!
-zDB6-=9nR763k{p05k&Z$r#q9P$yw{PFbfAci3*j7DjcLbow>iXuMrDB5B@h^;5OLc+ReGrN@#zHijg
-@xO3nH{nb6Y3`NCWgicuGuyh3?ybx%I((;2+n^G$k+jX;4&7o-lfCP@601*pkXwew&lnmUZtdF*qQVU
-USN28imV4`A>+#zN61HInk!({;>*?0ZtRT19DG?h}TyHqq8>R4`We%s?EYf;N2Jg8azc$<Z5n?id7R>
-YFK5Y2o<d6S0#C%QP4t=8jGsNWcr__&cA!dK<zYj6r-^t&Bm|k{teTs*WICmi`+KoAs3-)jw(|2>F);
-#|#1XrdG*3}wEM$FEx?+0!R(hZw|s{)TsHw#57cgsYkP#Ly579(dPN2;P>jG-X;zVyzd_zJJ@0Ma_Lt
-*a2p96yeR5V#+V_R*$tBFDN^fkb`7$QPownAW4Gr?IZ1H(h$krDU96t*w#|OBf>mqP=hDhi9KPz!L1~
-$YjOXTv)7Np;L<DYxz9M$SHoK{v~2+!jg_g7NH)ZlVBs_waie=vu7WC&OQNhnT|A%<nM*C;C_5q-Z2&
-V^(|G6(IfMy0O202-$Ti^<;xG1W88CKf(XV#I^lJ4Trmnm8AaucHx?Nuan9blF19Ev{sqKv6J!&_5{?
-h@23VRsrWI?sk|WF-{2xKgSI>1;t}a~>kS|?hkp2-p7UxiF)+`EW{WPHN{YpVlI7N3SGl8C$2Um1M!z
-EA)6LN|$FsJZFt;zWDjP#g3APQrx1%qh2%Ts{slRR;q7<kXy{kaT)b%iGsjA6367l<X22x{X2UmJ6Zz
-A3lkZ8gmw){(`Ierddj%6E%Xet*kBCSIh}3ji%|pvWlCOzJBAaayTZn~N?gB|eJzN)Tc`X0s{}Kj0fU
-F6n(Jqdb#Sv6>pM>G1(*s)1>zlDLb!5sNjhpeq5R)0|tL3~WzH#NElD^%y7+-+6lk56USLg=}idOgaZ
-R4NO@24%C~2LBTV}m7Kn>oW(>!R<uQlyQ24eiosXdznSjegP2pBK5oO~xAEm?&;JNqK0o(cWT9vVqc%
-)|DGbL5bVc<KZCvqfeTH}I^tJL2<4qfm!Mi+s7rSg7z+DVZuRP>q@{-Uy*TFVolERza-O3UoWE(SGNe
-_u_b|cg$4_0!+F?6Rn>vhndkr!&8KgF_b6c(elZ0?nPz<a#adY>D(5Sv(Ly#|7BzIQ9?ZDAqlE_hEjk
-CYV<SLj)>4J9^I+Pazh#4EO`bAD-ca^4z2Gx-%+qU-3M+vDRf;6EaZz9EbCqx;>j*YiK(GkDJU6S7$G
-!|TI~*Z&Ds9CrCcT&zD(<<nzd?*jOJRQdQWfX}G%$6d(s;irg_?}&2PLp*YUoj5H6ULFKm36?McsNzu
-A;m(9V+T}`14B7Dd3zOm8C-FW4QwMc|F?^J#vO1Q9*VmlNT7Yt75>?i?3dyea;qLUq5xl!tR#=mBRGL
-&#l~V~FZiV&Mm_r4@uk)3<1;!k{nv`e*04&S&EXE#@-SpY0WITs`WrEXLHbo^$$yeoZ3#;Gk89kRPq}
-@X1F@ZItf_J(#S{vx-QxPh&0!j_*^%U#{UI$XoJLanzHg0QTe_IY=_@IW@wK4Rb4M<(jpKlO8IzdVRl
-5R~Z<7IDAw?$$Oyt#TLs8HxuJSgrXIi9qEp8KiPeA2WMC4rW=_EatI3ile8Pyhv+kg=j9da9P^yv(qe
-4XS`YE;wj~?EO8Q%9tDO!=oh5Pe!;+?5j3~qU)d<%EI9Yc%VrljfW@HlPB*5#Pl~%M&b0$2xuf0F`bh
-4qi2PTb+VHoDoPEeJI0W0P?JFkw1Jlt9BV<TPA@ARt(f=k*M3m4rDy!vv!(aYPdck)l&HA1PC<<YCr3
-EH1>%FH9yMhH!~o;uFmh5k$=?0G{sKmfRY;ldxCQr_2YFE>oyRT0>i9W$9@yg|RuWN6a+_ti90CWV7J
-Ns+I%>*8?@B<Cbxh~Q5BMl}yJcT+4EVIwliC&sMpiLIG_6#?`{NtsBG|bA<|x9|UCUWh9zw7csaov@3
-IfU3s{xG#?dpfxKfd?B{a#k1VC!%8s>}WT!MJ|=Tni6jt%A<sRQ`@PJn)Bs?)M!>p8XoCxp**aUGF$a
-sLN~M=C^)3$sJsUZZM&MDkH?JN{%9PLELwUoy}Z6YxK1+WG&Y*QFz0wXL&^dOL1@8=}C94^Qj-}8-rJ
-kzVff0pn3G}+*A)Sp1J(&qO8@a(l<iv)RQC)cCcmKZh7Y6ry25|*%CDUIptXV(q;q)(564f@28NL#(_
-K_R|X07YYCE8dx&{)0=0+xxQNEe`4v2St+kPj8Uu%#O=pjg&s%`5t`w3z-(IoP8wo*HAZ(f<X={WrKE
-p>GkqIMA2sq`1+<8PzB7&@>^+WM{TMdpe0GHKr5VQ1Qg|JV+7B@%-R=wep&>RlMx){2W3gROoU(kbjQ
-lFk81V&)Gk>8M0q*=g#KaO|s7R?q-KCu_xWE_5ex3n=s)va+B48jF86r1Ki-|_t6alP-&gK)2go@So9
-2n-;ykT!Nsoccn{PJ{|XX5nB8a~APNywO&w-8PcCzpgBC9VL`KQbkunjhM^RQv$AyUoG4n&X3^Ia&1{
-d9A&GR$0k+XzpD8THhs|g^I%%cNz>lz>i#0f6nZWG`pFMz;HZYkOC;eOo!Zdlotjyu5v|%G75hWxOs|
-SV5A~Bti?r~9;P7w+1@qZ+X}M!IgeGwAkBMlsk_cL2)hvRdxzRFNQg`R^h9J129R>I}`19e#8YdK@#<
-0Y^QY;)8EFm%l)bxN3Y}Fjk<JI~*9v~kTHp1cXw~L{Vj`@p%XnX#5bQ^~e6vY{sqDf@^10_E!inh!ac
-(YI=h&_A~*$NDX*{JJEz!7X~tF9H#S~#UE4NpFnCed5^=32Sz40`LrZZ#CSd9AGsezT5?H{1IV-wK>9
-`X$=-M>j>$&y>E~WFE4~fwMikbEVr`Fk7}shF9KB?gqxm?l-rx^7a1Ll8a(C^ZSh6E$7mWR&Nf+;nrL
-xcHa`3-pZ%7h(fVn6-6Ah6-8J7kB+VqSGO*P(#jeS`BmPEqNRk_^-~|u&i9+5z%NUYKiuZmQY87VAlf
-Ps;7chY3m$JR`#jyG^X#OT_sQ7CJ<9VoPX}*>(l$@`<uP4w_bp1``#nnQ)8M^jsXW_%f3?qc{GT(=FP
-0yC8b<LX1=+(jC8dh|3W;n^v|xQq_UV>*EsRR@WXT+tyKQb+tehJ+mbDCB#3M0)c>q>L!iZw>q$uQEx
-bfm^OMM7pZow+=^eT~Vw8^*SUcj4q47;~>FCQ&e@Tt0325mAx*TEfe&u+&dC<h)MG^`XH<_+`Yxp72q
-4hc7LisDdRO5IrIGyd!=b$*na5AzSvBzD-&6*+POV%Wi1XL&w+6D$%^{)uN#-wr5o4$E&iwgpoHKPFR
-hC986I{`s}9I5!$K%X4?OWG{!zlx`vyw)FZ2wTyIuybcJPD4z}qOz?$+j2?7coN~H>%bee7gTO8XRUG
-LIE$~`cp;!qD_~g0?NW$ZN_B&DrvMOe3kvW8rD{0YX%%3O1_rW1JJ+H*IOL5c$`>SL`qpGKWC-`?0P^
->G)zJ8?1mww%rlVSdkTi=$nZ@yDz?1RQz_QvM}zmI49D#7^C$moCVDqpRRes+a#7ebU`DE!0e=5?h@c
-UdM5Z+$w1{;bKw$&KF8%$B&gt~hYEO(Rnu=X$J6ZRLS0$6LRmyW9DC=*s30W?KqZ61Z}|aF1ie!tKHE
-lO~h=7xOb&=H|aiZ}&id+EF7mnuqU;8insVQgqX5Mtj2&fj26<t%-Y_79MV^B#mvCNp=U%Eue(jgqkb
-+U0)`h{<76LY+{g?`DN|nIl*B+oNAVS@YAR`9nfugl)ozaD=&IfWN<mZSDsm2(PD_u=^gA@?thwg(}a
-oOflarN`0z*hk>6?<rj?@QU&J6sch`DstJG&ccl7SEKvap8yyHi=Wp{iw(#+R|RGv4Dqp|4N=RlBsNc
-qcSfM0Up4@1e8!wWb4z<!zD3p}5ArVkH}=0C|*a^SObN39<|n*&bkzs~LDNZXSBoh;=Up?GdxJUHCE0
-54}^d;b9Wi~Mq`_%H9rrxp2J1>ZD4x1f}d8lb?>LML&kXBtc;$2YHta)yMXXyQJ>a@4a|5Cme7uJ4dm
-0$dMlpS=3GUQ;y6!6RI<EAcEZp_dj%zDmN!nV51hX!&un%Yue;$F}FPkwu!~NKFTv%PFEs;xr+V=f6_
-_mbJ?ZEnOK80)?g(g_^slR(Xl%W(+*s$V4j=$qnB2D@`ZQ1vu_~v6e^g*`<gVFN)Fmds`NYPETkN(8M
-`W@AX?=e=6abY4sW8cNehpYf9+hsMUeHt6<LIqTKo7jY7N*;&@sicM$P8lgQnMaw|fB2hujWH+az;Gj
-2hN$>I3z!`6BgfQ?TbRtUX_z}X=3=S%UZ!vvS~xl~={LOc;i^W?xfhc#h;-vB**a<lmnRlc(Vx8$V5G
-!CNgOm{J;Xt3U<Dj0BpFrOQsz(*a>4;!Fr*tE80vJU!aAm#=Ox8#NpGtfzefHPy<jx{60CHb~nVenj`
-KOf4{&e8*}l(0#qJf9Gj*WJ4I5L({+h)v#wrAz~4W`n}X*Ff>fTUhXF=_2>|fP483M7S8Nwjkb~kcW+
-kh1^zFUSAScelvJ|eWVW>P?)n+MvZYUCTyAPyQDqtdTht4Wbwv{UXFHHkro2?3wfF9s8NWp40^0+-wN
-l`uPfj+#uA(M@z~3g6*ceo4R-uGcsoO3<`xe5qkd~R6%4BUY<C?$Y1T`<p}q*Rgr`k10Ats>UMU{;iW
-G{k?H4m-kG!kd(tURB!6Tr$sYPEtuKcNA93<;-;?du6+LJJ69)BNH9e+i(AM}ae0oMw94lDbt@qac5b
-pPjbHq{TP`5&C-3oQQf6u%5f-rP6nZR2XKzcXf2OGJAl@=6a@WI@tRDzOdp?baR?^C2>>K(yJ1P@6z9
-!S<p*-nyD7xz+P4G_44>eqAg15Z?70%np~>zi|5JA<4;pS1GaqAF^);hUunr+^j#Mt@>X{3qfugPdMG
-ceKU+kHUbkd+pTW14C$sWA$Hy7ma|3e)MU%n{3SA`8!|r3Uxg%RKcI)}ErJbvvEw-8qv8po;=!V+x$6
-S{hq7Pe+2m^imTvD3OrKc7L39BRHn^{0RDX?*U%+m6i`MygHh6sjKG{aIpV7`mOvfcwu>0_KKe}7s@7
-(T3cMJUNcGpGhXI9hPCoeo<^TOMJ?J#Dwia%M?C0^?S=G@M9A+iOT(7tcEDdnC80|Vd8g&mOSR@fKVx
-X33^Tr2ie6xKyug(Y2|tRj#KN53VltVSbLDIRw!t|9m)@<BMp>AMibBKNIHtgTGStxo3R9+V_N#V%T=
-fJ2`g6M0F>Co>(I8)|c0Z;h7$KNWAq%WX|V)Tj+BpNu7F{qtHZ2Q<&p3vkZHz+1XD0?!hoR3cPh6R4!
-+je{{soKLuPtsWJRH=+Zb6%Lgdd7e76<ywdaDQE%O3u<3;B~lX|X$Uj4&~tu?G*W-B*sC&zb!>?VJiT
-QIX=l(q-Im;-@|K2j@LI3GegN|)JIEed9^p6qJY8Apbw1*E>5F~CPN7)*_yGa>9bh}ZOtE{E390#S<&
-;)7e>|7vf%hN7=Q;)W?jOuvrwHuH@UT<TX1C}i@oeFSH_p1Z<Y+l4p*(E<aDy64KU~y9dH{5xRqhb;B
-FHP7;nm^MU(bYhGBtXc(flGngJMnm>zKt$m=&yI5;CGz<_ry8%OzC@T++y*7~>T@aZi;!l9Xk(<;eQr
-SH9I7jeEX<p7Mgu!jZHiJRcraOtl5J#6%~NC=XOc!SJo?npbC1&3oSv1SQqa*>B7x^`UovTCBs%yE<@
-`fha=wnJUPYI`H&DW&FDa!tN<uV}k?@bN%puxGXz`QCa>3^QnnH7tDZ;2Y1ORqlFOBI5crRUkmt_FY{
-%}?g4OJDN|r;7kF8Y#Fd;~dQz5l9HF{1b%Lj;M0W3IT55m0d1d~OEgVe!6QBBrJ+Gwd(f#9K{`3FS9D
-ZkJb{Y>m25l<Bq5c9a8`d0H^jjqRFP!V^7{FgX@t2Z+GTvK4$<}{bL1Cp-D;bN>jie>yh9KM48oKE=l
-9gwD>|sUh8B=t;Vc-ff8|%XMrW3t2n&Mr&i0qT(@%s2~Nwoq_Os$OVXDkodC+Xw8OSPYI<!f79GO;zb
-=sh_B2{%LAcn{}VA0*)o{yt$bMt<gi=pHAz^1g6yiov^$RYv|2%aRStD)1MQe=hj}98{MVDnLKzU#L*
-*!XEFyUkHkoyI8gHuYP5CyffpSBc6pH*%08O-e#@1tI>B8!;3e30}eZ?tfcLmxjA><1F(2@F}>yj@Q(
-cBgX86gMx0%--whf_q9Ix^W2{_s2DV0=EE>edsiKv&Suj1U4Aeb;7k}J2Qe{+|<<v&bK6~9FE2%AkFY
-Ij>+;0H*n<H<Z^z^I;n4UVhtw~Pa<1mSc-Ih;2xN_PAss7vO(25Bkfjl>tH(wr#1;dD#u}KQOq+`*$#
-}-(k3QV3L2s$`ws4O*R*GX7`_r4&PT)z;vpjL^ne<9i>v;x)|lgPK4`tXJ<TzGmq;IS9X7|vpjb#9PE
-F)v_etj6`%@)pDhC%sn?Mp*E4UllpTWg9-9iQBXN;n5*tez$<a;9e{1JF<Kt5fX867EmM66u+sh_^u3
-ZUE+i+dW^;SeoPNkbUn9Zk$LJplxnf}O`s|3tkQ~6nsev|P3+}i@+Vn;9iLUZFhmfRZ#tTyiv%I6VD@
-HST*>wj>n?Qc5!)Vta5SvZhH0@!1mh5gN!I;zdrM?r;_H%BTu{)KEa5y6cYt{kREl3te+77dZV&!Zss
-KL->UHyF2(4C$U7R{umurW+mIY=LQ&rU+w3l*0Th)I0Y1+`zlsrWsZj^~HTYEWzb*~EL0A24j-Cdw&e
-k`44qx5V*l0>s}%|#--tniNp&Y(n7fu^TR3^eyVJ363w2j3G|WW(Z8CC4cqGF<Lh)`8q*xk(;%d{Xnp
-L35Hx@5AA4qAild*GEAEJ%pCG#?ITL3aaBnGEUr!jfP0|u4~o6V#{oFv`fDF`g{}~^O-6gk5XP|0=B_
-BFU|ns-VaQ!RSXBUnep(wu!bnPB_3`D8D4XE<&Ji%1}U~5=XYqsX^t|Fw|9|8R+7&#1lVPL=G?pXq^?
-*VdP%7^%cT*TOidUC?AW$}vEL?QQd(8%3KRce*Uv-xSicGD<R9m>OT#uU{vp?0f9r=0L%Po(@(&b7kQ
-K82&XF6n`sYu3pZ~A!;R|N|o7ev(n6B8ii6vLM6m2-S5-5t<cvcqfVLb7sttZoM1T7){6@N?&vvkw6k
-i<qJ*Q4S6Gz`6&K$3e_(29*{x^c2Cjfmbhr&fqV(XZQ2e<p_U2B3Jhr39@wNJsnVJF^kJaQA;-N$biP
-lO2^;NF}pPh`HVbO6{gJyF1OwKhb2X4G4TCgZti6xXsd2$gjXu(6>qU>G2m}>hAM%)ei`DM&t=N^W5P
-JM450=MaQYy5Jncn^6H<r{g+Zcio-T<9$Z#5+SK*iSXgbqD=Hzt4w|+8iDn&s=qI}Dc*?)bjU{s6PhH
->>&+ELdh?`Zhk350(FGcj&#=E^G@WuIx=9~4(3gZ==>@Y_xpSawaw{~xLVfrlA+1sXoQ3{K}-x2-On8
-E&_?tFc0%meoa>*d7OU2C*H?@Ix~(tmhszjbGVQ2}vn4d0FUIU=j`_!sA7%szTubli%J^?h0kjbN=%w
-(qY#abI8BdIHod;)l^}!-i{3uvRAPo9HvcmwCc1{#h^AQ#l{QJn$jTtCho=`tW>*Civj5THu1<VSIT4
-WenGIQHjN=Tu_Y=P79D+ABLMcyuqmIO+W~#jcv>|aJzZgM4!lr1>VhDB^XgIF^@d)Vi<R`gRbyLvBgg
-ckfjyYf^e7;@CA&_#1z@nvw9Nu>)~yX<O5zLs<*F7?MxwsNTSMs{w3{ZDc8bSs5>Ca7x_`91_KG`Rp=
-g?tfsJ3F1*E*Pf-~0?A|JqETQI$IUdz(C$9JsQ3E}5XRCVg07aN&c)m>6Cz?H+$DxT5SZm(yWc8E=@$
-#W>nACcO_i3(FNm=f$89o`&D6Tf~y4WW`6nF_U$j<W5UC%ut_F?qO(LS9uxgt9vN!Y2>tJx^PFLQGyc
-XJM0@l$HbcAsJWE2Mv?PJKSb19UbD`(~yG)p`O%k~`etG+4Gfo<FHmQ*J%<^kQk9^$+Y!)N#p*d9Dw^
-#T~iz6Qe!6d*ZOiJhuiQ!jyV_BKP%))|V#=e>~B$hELD?^R^1`d3HXduxkA`)(<C2)r&GY*mpcOCejG
-n74YNgB;<54vgW0@dHp5PZ)#X{O^$9dU--CwtjUR9_(yq$UL&<~%cTGZCtfTRe9zAI@o2{!les5hmcG
-zDA1y;<!Hq0(8gO2mQ%5pcn?qGAg5TfK1I~`3tyUcqFZfI#N`GPx&kPw^5LM;S9|Sy5#>H6PYo!Aua(
-6k~fi6CeJoHGI#YM^hY8Q4={d6tOIzQ{n5(I0QJ}{B4Xpo^74E>r3k7nb!1C06wHMK!9IK=hAs}MEyq
-!YA3%~~APgYb6U3s=JQ+*X(&Ln_(PknT|B%`{otzQ{mD`N`v186Cgic7BKg1I<kLeO8zh|9vG#+=tbz
-+W|JM`)`Tor(Mi1Pq6>_{3rWQ2wrP+nm}QOq<++Q{6}Z{s`~iLvwW8ajZz4W;}nJB==v2VVERL9%xvy
-%aIz;i?>$*0+8Av1sfoG|wnw{mBillvKSuMN@UC=t8(Al}`3RKW<rd*ima%<LGTrw>qm9L`q<9PUTao
-!^_RcFqXV8u9(z}L(A-Anla>wp%BJj&($a+#Z+OlHE{ij*9-FCFk3x?s|T+X&vx1Md|>e*%vw~fpHk{
-XNq1}OQp%`1CjbFN@b!0C_2`NHJ~MXc>vYemoMpQqn-&PATlir~7fkMd`OVV-+(S8SVxua?bNI6e@Zc
-B4l?Uv$J=nXS&>QDgaoH?!lIuE+&n{pq=a(%wJak_mpK&A{G`{esT?ebzSvwQ>dIFEfDOKla`2@A{Sh
-<o36_2mX`W-|imxI~v?49SKkSao0?!I_m!Ds>T~|ogq6^tuo$o{Lsm9!xhjy@}<FLA?%Da(s<*Mm51C
-^9xsvb6b1Lg{mJ@>N6V31UjRIuX<1h%TsF?P$7X%DQsEh5&k|YkgMD7Sa==b+NxFLyW~an~J!a3FkT9
-;$Yw*GVs*2^e7kul*pemcdEeV5H6P!5Lw^Bct<dSiWfMo0?QTY%q^hq7ETzp1miz&}phJgGKFaAhkw|
-q*tC6;G&vD15eJM$ND(Z`|e;TIJpOpqhl)e~;s`CXoeQ+Y~Q<oawQpq(7qCnf!Mey_jPh;EcF%fm#HM
-yG9-hs`~~0Hz>^yfaqK)nL`c>FIbun<-!4wW|dXYsK;6pQs{$oE%?De$?<gah7E54I(V%gj$_U(o4t(
-!||j#S!*$y&eKS1L;5tJA`qo?C1mR5cvlJreqBg;m;^Q>gX?i#ng5Ad7U+0-A8GHU`Kf$prNM>;+;xy
-jWb!EmR1q9Wo)H%sd_Pc#DhvbjpWeGwY@r@VdK6wK`+3682kEA}Uf~M3g_=5&31iS3xCp#S{aDjCWJ#
-?Inc^dVd3lNG8X?!NH9~(26r{%$KOYH8@<!MtT37_BTSoMthIdg7WNV4((mrd5Y~!C;+m(ciuC<T!Xw
-r<P_K$g(p+O)@kt7fE!Nux<A5Ku|H7F*ecM2#^>NI+2@??8mWgheK<RdlwwMkLxN8$S>g{WO`d@I*j@
-u05t0;EeZR{H(GmXY-{4X!kP_DAOOQEXV(?QgQ#-Lmu;^}sDNC{sGPvn3ylp8Za+`!l`n=Z3~w$g&!c
-VyZMA4-ea&W#7Cew^Qr}!tH^Ixys*Z$4F>IN}Qf6B{_G97m~o#vDAh;51-*11p{Sgl-kXBbjK8osE8G
-oDu2CXSP2Zo?a8_hVY9$1JNDQ2n7b!AbPHAA2N@m=(TraJzln?Z${91r;*SNSz=0i|7(BwLYaP$!xf<
-0;#gs#+&iUIVLbSL+A#vm26B@oN+yiVKK8sP!s@@Efa*3VFaOhEuksewaOSvTpMTEBV-PE2n<+<Rc$}
-)sCSVunI;X6|T&#^ij&JNA0^&yvxlh$!8dKM|$e3ER(JLH^mN>#vP%&j#v>Qos_WKs9Rq40pu^98uTY
-xNvBBy^igRJw+PfX=1>Mqq)+SLy!1-zVmk970k$oa{^M6A`TPeb>`C3X!0B2eSArRTrs2Uj{wJ8lEV!
-aKyvzc~Bfn3p?mOp$jy)ddDI)c7>wBx1!hKp}bUF)2K6`;uq$LmhzAbZRbz06ctOAW<yWM70q%wt0`c
-g51Mp3v95wwL(0ln89bmRt>CD4f#9$x3gv0{ny4T~@A0TI-x7GY?4xB}(ucX0n)P62@G*FE>HJD+5(=
-j<C#j1BDT)hdb9Yu|7fXfd9Jc(jh(#iv#Fx!opfOL;?h2pEYO>C)&b-It)uEKY6JpSi)@ym818DW>72
-FDZIm7OoJe;(d#I=T+MY+|<$fH4YPI&cFRQd03dF&e$Yf+`$9=A<IX1ZS=5>NI&KG>xH8^?Uzk^l2gz
-b)4=5+*PbhcSx47zW00493^ejiG6VA_x+r5SSpak19B9cPdEtJ$W+POn(r3+iE9?ZHoihT?SEjn>;0{
-pUHPWWg}zs?yQUL_1{+QZBBnQxwTYKbPvtjTPGQ@wSG1$LwKzYe^SA%WmmKhD>2NjA11bYp!djU65EE
-Y;(Z@xGd`rZ-TzNUMQiD}`5eWYQWr))=Xk95v6YwU?zglbMJ2!7+z7S`?*4Ui!#Yl2-`{vbF?2M9GKs
-#<x&QIzz4&8%vt*URRp+i>Hat$Bl~`L9qlZ57+{9+zOc!Z@Fd3iJwOef@1eW`UCDG@?jNP1tHtFuHJJ
-x4&2Kkem*V*DRmMgN4&i>dgg5~MRuiWx;w}?kR35vsuo;$~?4=?8`;Ds2_x#r7Wi}TIx9$oPdgCOfCj
-f}020sN_vp?g+J;FOW@*(5JU`F!^c&7zO&d>~&jn9KU<`AUL<epqMM00Gu~9aFpE-wupDuGOOlebsA1
-r#=>1$lCgy&=04Qw~eK_U9b1Ja0#Yl{CB!s(Ck)7z|E0jzOL>PQQJP%f*E>%+VowY`1~2(pz3b*9t2K
-r-*EdmA@ra=o_He`&^&ucMOgxG`+j(xni%&6A}0&Z*2XZtV)b=!`)+t=nGQuSq*e7y)aAD>3Q&3gF9y
-MD)Wx0_7J$z#eTT(6oQ9x0#Wz;2QVAWZ_DI$?zVr>IJzCT-H2h+VydP?JQYTCGy3*m|ZdDv$woZXV8c
-FMSwYf{lE7kc4&pmTm+~d=^)aW@79`Kh^z*+C%yMb8Xn~B(LZ(7*8u>JmX&L+WHsM2eHv23>}@_r&I<
-<2)<5iEZ+IDoCgF}$CXa(QSTEL8IKs>SIr2P~<{e*AMmnM7P62u6Ul9E^_wn0AMOE}PMX<~c|2Ni>2W
-r-igg)@Rv=bkNB&DT@8&PSZETo6!^I)|c_&1Irc-eP{Ixr+A=Z9_Cy9ysW=y5ASf}oruT#*en6T4JP6
-{vVFJo8{VmI8(vr;>`pj<aPkaV6yGJ|TnJVd(fyGJpAXAoPPBKco;hsrsFXefBFTKeIB{A15<Qb5d5M
-Yx0mu*sX~4sYmL^Yb=x5&?OWa3HjT_hioO@ZJ_3K0OR!HM18{^OleyWWNwa3d)<g^Hs0heJQnK2qPNZ
-D{DB+ydvGcK@1XM3l&==Ih4{!Ch`rOaARmh4*HIP$U_j<IS91`wqE`k^*1RolzURrq~H88^(&u<QPDs
-J5@@H|>HiKVj|v!_XK)Vi@{k%i(Vy`~|Cia^QE8>JN<@$X#`e{_9hJf92!k9u~VYbb{Gk7NTvx9LKkB
-(2utUaArdXYIo>McJbKySA0)vCFsq)XGNxXACg@$E++Q~T6EJjGt5t*hzYm$#rh1C*m@Auo-!3N+dvD
-0?<RS>$~sQAFsW@fg5Itdk(&T}6A8o{=xqwIT|cm55}a<sE6Dx=ar&3d1b<s*;o~1$1An5m`#!t*1L~
-O0A|&fN-hEMFxmN8F@lo8;NH}+f36s~Sl|C$b8Ba3Lrk};ox(F*sdf|#KsSvQxY5zvQ{RlzAW_ULnC5
-!7zKI+JqG28DR8v&>M9)g@ZJxLB5eVJ_$g+H!ld3tX;`HF4VMPFoWn{xra8FV=$mukFjX-$IB?SJy}_
-i%LkX<z+^d?X{2F7J%vm@@{#dcm9=But$_&!woruNfiUjbTWT9MM{UET%$qZ<J(ZYN?VVri2OE8Tq{l
-52|FwULHX<>WuuM!R+W#E#pK}Z&4jEeGIab2WYs7X2Ypw0<yiHYKIO`JCWPFq=cQ1^UprBrh+uike+~
-z51KBPxfLyXIw6C{1A_pFiXQEF@LI$=Mn--Va3q32;c@h8R?%Kud|6Rb<QhdeXM?7nX}jXCp~20wjv}
-$N76cV*IW+_q&r??zruh~I=)#I7w_vd-zud#idBsqtxoPfjQ%Uk~p@lum%bcZPC@TQ0M{>K=S>9BauJ
-5a-$hc$+JH6fcDIqm=W_k!hwwjV=Sva;452KFry5-BI8|doJ0bv^(!}=l1nhrlM<>OGL!70THQavF&7
-bQ1vgv;mnl33Ogaiqx^Wvr)MUe02J#8nHp9VVO`DDJb<)x-3Z3@n1vAO|bUv=>iZc%E-rXP*eJAKOg5
-f!P}qALmCHFp3*$H$XfWHFtkPh(9Avq%ZhUYA+G>e6aM4Oo(<m5FzWS=R>AtWP@F~J6FC6=?--|Ru^X
-*I6=;BIVr`Rk(dB|U)<M9Pt=~ZNbX{I22P77{OWEAL(wH7dfjA^vOTJAqZw}T*cbp~Z-d%TgREuVPTt
-aGLT*<&W3WK#bdW-#=sf7hGM$a<qm#Ter7THSZbee6xZ_VJ;Cq4HPpJI2y#W2eCLnjaHyUz&E(<Wc6M
-bYzyjl6ePXr5pUR?H`nZUXTT>wn<8qG>3G({aFmRBem&#5t*t0(n*N@pl7R(yqg6r9}XL=KNpQW8NEC
-#s!JIEi)ui^4-}lkdqi`-XybAxvQie$DB$RxD(4u_BFa-&W@*fh5S~B74G9*PnUuVver~>jASG#>yZB
-92VrJlR7Dh7>A1dGsC(Ex_!*8M<p1+NeIbLRH&OlIG%`*vwS9B>3IWyS$B(*is=^Q_@->3CD@q9X*+y
-DZ>k{3HdoYJ5x2>k>^%8?*902sTeWtYxw!`!1*maAT@ENQqaoUpMI=;5v9~JlS{Ebqs$N&^n(*~qhvN
-37$lN><F+|sCYt6DcfddNgvVG8GuC=a>JeorlGGHKdgNk_M`j$$$lIN(cUr3V^5NP&!EmO!h(=z3otY
-+Bl0ExC`mn1O0e}qZrucZiD4*jLmUljX#Ef{=RKV*z0;r9}g8*+Rq%xh`LxqI+%Giw$ggM;hW&nISqk
-R_&Fh*TCDngQ-pU}=ejGV31pRFialtNkI-Y@Q2`=2eZ-@Pr#G1rR+$N4Mi)^mD?A?5lqaZj11;F5QV#
-Mte%n9{h-Bu(kPAd9X2w1n1}L^deLpdO}PAU?(wj{Bf4y)6lBrK;0Yr;7myzt6-Y7hXT!$1BAq3JRV`
-?$#}~BH9Pn47&4lAKP|u&K|<e@-}r>xUrA&g`a}9=QtpsR$~0e%R>^(u#s0g+684`IOTTgO$Hfx%+r`
-pab*!`-*`sMT58=I1O6g5Cv9jN7Ya`w5NT^Nwm&PA^k?g_u8MS>S$<MnbFu5^h1mE<G(Z1WVo?xZxD+
-iBu6Rqu1Kl36<lkIeCX|+8S-SmWLxHSgwWcx}*o8%GShtAg8Ys)M^cQ;~uyY|ZA@py9}UjG`VyA@-!r
-*ooPl@;ykjsKq%OMl|)-xNz_j+o*P#nPw8{@05o{ogE>)Ju4Hy1r|g9$k@1QVK`Cens?|LkIQ{_MVI`
-_F3u_`U(Wv95V0LOOu;*y^lAI!SPcP<uCIdYetU?>B9^~!Hc_W(edowh_H4sxeGTpBNJl+U|@0MoNs5
-Mg*^9-OxlG72|5yP!)a96H=I0g#SKrqu527gi$P^cO?faIXKvqDtz&?Gsd+vZrH2RG4%72sl@?U?NZy
-4gDOKk@)IJfL*Jw=BrFJjSO}V0P>aB8E|1Qwe1%P?wg;Yq#pN>mZ*0*pG2Ge3|(ZKQ19D|^_+N6TaVq
-x6fE`1u)!sI327hIk&DiH$^#yYGyOpIfYHWPRt>l-%u7@0_KjB0czQCu9q(`d(%&?zPmW^7XQjnt4nj
-4piv)Pi3Yy=_PcX<suL)-!sDa>sS^qoX<K5t1kx1DS&q1}#P1^XZ*3jhcE;m_2T`a|IT8gd<ZfHRf&~
-Z%4ul#P@*^iK8|5mYi#`sgQ6^T|?nU<%LcNV);Z5jWiWn<Qs1rFcH@}kFFP>3V1x4k8?>Yd}Ym-mNu?
-+Q&TwKpiHH4RfGAri*?`>3^~$@tHjLAVLX80lc<Z)5k~Dcc%RtIb6v@4=RIOmdt07FMj6VoV7FTU=DI
-M5LomCF^f+by@I3qZ2~Zh+LW^ZxCrj1#m3}t3^4cRgkKA4*d8E0}do&##C9Nt1ny8ze#_C!-mO^*vv=
-ICI#gdTXO9oXDNa5Wuz5yqv2qik0r{kOdyTuZFU`xPqT;Z-O?DfIF@zT?g1?=$Bwgy#vC-24=UuW5vm
-*-vA=F=%xYv#rgQ6Hf<w_Cy217h2nnJ(Apc6xz|*>!n#xDZgZ=r{G%60Zmp6+s^-1V2y%U0$1<xO?F1
-#>DDVKVNJ>KDHfnkU3QckAuvnuXsE^on;nVL#ngI&JU6>Gn^C)$6{{u;Bc6Fx<as8Zd`$}P(V_&k+7~
-9rbdsuvfe#1wMRHSTCkFxazS#Da}r!I>{gq_qdJGuT=C)|I}{d(+@vl9Ov1(_|4{eAQmcM-@t=c}-u3
-Y~o-Wt!|C0A!O^;$*u;4qt;=C*F72cdTyb&P0i+RC=KnP(3;@1zTOjp&ZKHWX{&cwt_bXQ11m@R#1XR
-fu^%B<-AIgruSx<HuV&~aJTBAy1Iy^|}J(XZ<Z01+g%h4U~eEUCs#%Hm53#mYmLX&!pL*W3F<*f(CcA
-7P50WcXqy5Io&@vh%79!Dk@5>zBM?+6FC9>A`B%?2FKYyq*PZ46mghTF=^ObYgSb(h~=Wd^C63uQ~f7
-Z@AX*K$FOp&hRIEVmQ$vxdx-PGsIKg*<zAeQXeWYynRDY(ycjh@iSKTnZ$#GlsEOML?HmV@>-D0r5ib
-FQ6&R!pKeVP$c`jMFYO+=Z6>M^XS^J*r#R5t%D7c&@<csEyj5QuFcVap>lZOEDCN37InLnn{JP0x18L
-%fvzOw=_|q^EbJzuQwSy9vx^eY*g3b+;rze1(OJb&09fF;=n-KTsbBb|CnweqUUaMZS{aKo$^dIyp{t
-qW_b30G}^~E#%3vKzzVXphz-x@afZu+o;G5^DZLA)o@XUXIHUSE}^^JC{<+Zq3Fz0&vfmH%>;zif6)<
-4-OJJTg`2$2*CFkMb4h<8V&qM<aiVeriQ`j`n-S(ZhlXKkUYlPx0#^z?ObwN|B?Z@o*UjkMt9jeXU=C
-pnvDc!OJq}Pq<i-9Sa{j$IFn9)e?FX=@g%Z733qn4Sp_gsH5PASPJ-YL(Hg;cwK(1tq}RK?z3N*_{ft
-Ui!a&7|9t0nf4zpXd}ILT|I+OE)$H&W(qr-N3S2h2|HgXc)|`H53K5ddYSWH+$AR9;!qE<YxD<Fh(aE
-N82SaJ2v#$y!qbB@(@OPQ%qjV$+<RAJwG))rB$rHUX^7QtoY5i)QyM7~c-)PhiQUFIiC;h%UF8rlAQv
-0g2aul(Ax+8!8`Toww1OD6R`#T>G_-~)@zkR%K-ITyzwNuh2OJ$L<gthWgE<~Ak@mM5Cr0706oi`mId
-9}omTJ~BzxwmHKnC}ZU8AfVY_LS8QbJfMF6BxUGEth)rXeyGI6OCQ3$UEScGhnH2$MD6$8A1K^qDuuT
-ua-pe;v;V%EOhmrGwprK%Zf3Mk?VTW@Se4|w@U?_z}qNLJp;IYj~M*aHc#*Hv>Fh(a?@H7h5}C71%A>
-a>ud-b3AF)61>#H6dRoP$-xOiSfGDR&Ppe804g=#PX&$F<jVa@OM-kcWUQ1XEUoSZHR&-E`aBRAIWoJ
-`9m~%tWP8z^>w3hH@`CO%tVmcV?S6e?7_%zDv6&zeaxlijlK!JD08KNRN>+F{+zJ22_z<(n!zpcgish
-iS<0Q#K4S6F1@>hcr?W1!!n`#KZX_n#4%o!@vj<h95C6x?0kfUn|nbAdwzD^7GGE^f)9PHrZ0U?#=L&
-B48SDlwHp6%vD8r;u3MqjD@Er4?~!Ap#)L7HsVPQcN>{yK&!AI6GF;(qS7sApD91qtM%%GpD^ojl-Lo
-^J#X=^NWd*#YaE@FYhnHxI)<C=Y54=TuAa8RMIlVfamOaS4<Dgz5Zl!IBUN{OB0F8042#<Xb36-2cRJ
-HR60AA@SpK`B26PthJ=!2xhd35BN;7HBk`)$ud>O-8y1hVHE@E37p{Jt<$DX{R9+iVEN+H;*IDS<^l&
-Ur^n$j~l~I|Zelw?x<f%4PEvtVJhE$^oE}5Kf*ExgsfYTdXFPN_XPqe^z{+AZ~1G$F$$HGth0H<S*Y0
-P(&y4PcqkIg*(f}{UyXZnVde{q(dpb~-+7$sp6CvX@9VG1G%h=Oqxfk=`>sr^5U#DD7&fg&HtE%Io%A
-hM&45&fXi4rwHMw07(ulqW|G=e`5}dq7R81CEnVZNm<(BzT<iSOY>1Suuh*)|z1KI8FSK5+gpg#OaQJ
-f0o=pJ}O{Id@S^!@Ub98Vn>C<et~1b2{|ens4uEL)Ugtjel!qvLU2g&U`M3_^Z{TBJ1(=IXQv29Wkhm
-3A^x(gl&23soxcOB>B$`Skc`P#814P&LKKni_J91OKSc@9uSE%h<@_K>Q!bI|X&)b;k0?N3ZISQ2kK%
-+Bp4$B%1f(1P(Ae->EoNcu(dchf1U|@<-rXNk4PUAsegqSRwn8Npr{0wGLA`se#>yeL9X%gAcyikJN5
-3i!?M81$Wdoo&>08@eOn2H?lYVUo@q{0xgE*#T-1o=T>EmLQNjs$PFZ#r9w|EEB81XjEE*Ir{#)J|q`
-)AvuqkZFO4%rd;9odWxd{63F<sy_nrcN40DBC55TRMfuIr81#N)iCS2T@LzHEu*TPkk;K+7>!byhfEX
-DDZX{iP2Y|GF1-`-+cr5JYNOy<im7NG_i6^v|Mvo413{?a2DIN4Wat9qZ*OwR*|s|cHah#e^oCDKD+(
-v3MAdslDB$YF7lgzFYoxuR4&QGZE+r3^#Kq4lJ=WyV8I()?-Y0r#t^@(0bz!vz5j&(UwBble7ir2b$Q
-9Sol<kqBTF^h5QcJVDPeP}dwXE%`3r>vun}8LOhpDpV)S61GeDcJWL+uFUArr%mCl^Q%dnz+&K8!c2+
-MLk!*fOQw^NVQT)>}C{q+$}x&dp6rRh8Xu^#*$avfT+OLTYiK=ae`B(bbq#{`exNC!<-y&a`kP``m_8
-6LKn>8Csb_`l?j#HeroMm)XheFio&9?61l-+P<}F?OW!pBm+Chqsf)Eh5W~;_=I47H#K$<-n9jX++BH
-CzUTtc%<1}iC(lHcjSNEk)^-v_+`K5Kk6)iKME~gFs9M^vudRYgo4KzpJqaM?r4|8C+oI`c;yPQ(+(x
-N|NiS}SRFwWJ>W%g(xneE0|6i7%Fwbu@B_iv*?Ozmsq%x|$n+M?dWdl!n)}2qPpy@EqjQ3D_B2I+$Ha
-a92Wg9=JP?&haq^Ov5NUFai6;7JOcvSrp(Ik~*|b9w4`{}S_eaQ?k+E*r49s?`bM9T?!}RT+B9+l@O>
-m9C6tgm+FP*j^2$&Ff%;}eb%LZ)FwzR$}Bb1j^Df>W8hwAi<RGGcG$PHEpCly@8IVIzpG}mkmUY)Qp&
-pylvBrCTqeOd1zrQY-{lq~Z60z{8hLT&36#Wj|3%*Z<hH(H@(spzi}`1eto`yY<w+RndzicOD>$bap?
-NA1wM@9>E`k9hPKT>huWenaB_e%#N!90(5nw)pRm3-}Z^;2#BWlsI}OsgH6U^6{lO)&@SJH%Ru~+Tz#
-1mHhZ0C5MV8@~QSikRu!>KS%H21|>(>2vbKKT6{bYvEopkE5JX&S@eV1G5YDdOb?5TJ#5C|Pcg?wvkp
-T)!Ufo;rvpD0DsuENV5IWnko*t;I+PjW&(gyouJ`FMJ?xsGf2V(=8S}u|^*hdTY-nu1t8dnL@D~iS1V
-FRgg<rm@Wv;yXRkQP3@b-r^z#fksHE4q3xzHcZxIpq*b)b*5J#*AI9QMIi=cD1dKOP+!?sDZcNO!73!
-}I;?HsE)|`X{3TemAV&kLsUvGV0g2JyN)JqM-ZRz_0b$cX?mYok5JL*9l&j$MZ^aytUt|E?pOn+do>)
--&{&`Lp&|L=Q($S+jzMlo6T3IQ4WRG`l<pW9M6M#<0%|07iHk0FfiHDCD>Y;5vV;tdEeH0?oEb>^oQf
-y#?_W?mMF6h(+lF&u7;P(QGH;wXDc-%I;1S%Z5xmDiGwd8REkwqB~^S~BKq?70*#}tpg2R4?)4WUS~r
-H3%;x}VJmJ#sIvQ7T)PPoadad4@_m_0;?dh(?j&i+lg=C#j)+V<8RCVri_M{Ud8dKdYWFN1NNaK7Rcb
-L@!=c>zKNhizn=_3zf8aG*pLKDR1gz{Dv3Xu4$5<7WFzjrdSwDmY>g?~hgz+dLO4J6(<Q=#c-^|CPbT
-D*twtt+S@@_(XV$}-@W^1_0VB~_CpS(8QjA>m~qM|dJyRmweHDs1)X-MayqNWF6#Yt-P&-KO5LHe)Hy
-xk1MrXnUUSDvrE-xyjtO_B97_Y}4L5+u1iTpBMGf4<sL*N29Yr-*4aJJqw0vn_W4>wFCqH*|YNy!i5v
-~D>=QdeTtZii8IWDJBfy0ftf_(>YG9`B%LD`0>7kBusI6MSBNMhpu*;qeJOw~(qotcb^H7lAaV=#69=
-18e0~cyc1!R7+1~X7P@e*L<78xKOoc7rrNmtYM(JzD_Cnrd2374f{*<_ya)%{c*HmxO@~#HrwAfO8EQ
-K&Jxq>|nv;b8acIrU*Ji#>48OBA*l|0t#TNf3rDRQ=6OD9mZQGx0~;DMZ7gkVGZxxQj}92MJoKm1@;y
-rIQzYDZ3|!7hfa5t|#lI1vV|;aLpamLRk<i(Y_@b)UNFprOKhnFBHBw^oR0HR7n^FqfopSVg~uZ+vT~
-jS%;^Kt!xg2#7e<;01k?fFb+$czN8poOSLZI~QZvv}j)in0SqPS*f-}uMd;#S7bo~=k5_RRi0JtB27+
-pM?ye(R10)^TAPDo?~yf=b`XQkY9VMlJx=of4xr|}|0S&c)5HH7uD>4oABg>1#n~OxQv3)&;g2dcoPB
-b{=%E+1N1xai4TFzu)&3;;eZwV%A0_`gEFT$P?BgE=9`Xr0b{6r!vyVv79+&PBY>^)wkB2k^^-<(T{%
-qMlKjd$B+{QmT4CKdrk;D&(-jCeJwg<%UN8<?o6i6odahaVk6v%PjL!Agc0_dY*06oxtkCOMdvJaAze
-~sAYf!Ob#5F7k0Vhi*?N9@auetg45+5H=cZF%9Jptif{T=WZSy9;n^{N2$0?#O^Y8`__b?4Nk|D&1Of
-)-u;8M7yxpSFrFKfz>aiqsqRp^Rn-N_EsuX#avrk+3w*EEH=_H#S*3O3v%mA`o%5Oa1q866=8}yPo%a
-s@S{9klG0!^4FnL!fWk?tHmmE2sxlm*p3#c%Ibrntsl;c^3?qiPX~YGpgY3$w=cpA&r-ey-4|*ctX*!
-yauVu_76D!RKm7E;H57!di#MH4Rrz)NUI$Jku_01TqbqGbs3W-1))K$2(fS$na{o{dO21F7EsS*tKbg
-f`)gXT4U;o#_o<>NKxSA=^tSVi5Wt51%>s|wiZVkaaZmF7vha3M!db_pva@tB-8VtWr)pP?CqCl}$Bb
-3YF`f<cgk#P|=$ZJW!{G*SMom1_O!*3DY;??<GL?^pWhDSgUgK+@Ol_bb&bgP7lu+uM=b-jQ2+$RfZ0
-W2%lCBT-m@YfZi)v3*Cr4kn0#srPU2XU@sp165GJ8h_kqt#<oT>2d(^QT+m>h}Iqno6iQ2Kc2roDD8!
-x=Nd<2Do;`t`%SL?fc?+yJeoVQ1C~SGezKkpls3ClU$u_0F+TL~`M9($3|lqKBa^J<7<IN|_%T}Gr{T
-i-J7KBs1SCK{8YD&dDb&#m4cbrak?#QZ;9&dkiy1g@|IZDNX^;q}*tpnkeI;W)a3z&6PKNQwT{{`7bJ
-zpO%&m|XHf-K88{{Sv$3<H;oS0U;3$Zy7grdIQ^h0rXs&b1E{aQ5$bXoZ{+wu{_fNs1@H;J#vwjTzHB
-%RiOjSs68<U5v;<5Nor;{hW^0@kk9L@x{xwZ|pqMJJWWQWpT$p2aNKiU4i{TAyb4620YSG9k$iz3GIA
-2E~~WJLio>kWy<wphor7l>yJ3;t*X7tbHzmvdUq+GMxvmj(GH{%o(k-F~rJUz>50q%4U#sGoH!wmUUQ
-bWIW8&A)_MEGXO5$@_Ic4W)8PA-a#eP6FRgZj{4NR*X4FsX79C7Z<KyZ&u&dtRj{GIuRc%zi>t@F`~s
-#He4y^<b^Jfa|M{zi{9o+*T?zh|{eH@1gBSrL7>I)~LLmr3!q9KmfnoeeN$;`m0id4*GemsMC$S@BJ)
-FTlxnuC7+z0+%C~yyKap=fO=O0DBEI(pf_|r3oe+2ywog?fBX3<Y&-U0l?v1&{F**b6zAJID+f4s)BP
-Z1vYQCz}4=ns7)b-@Gf4?#fcXavl5?vNbW>La@T_#WfPu`nHfa@JJ#aY!Z)#Ru>&tuTc602}CgO`bw4
-mwon~mwFU#zXxggI}!q4bm4VXv$Tc(lD?MsrDxN-0Pa)49xg=H5AR*}_xOE#AHA7M?X-DE_hu26Z*u4
-iXWGoS9lor43i4NxKz^T`()D_X1v>7geW}sgW00RWF77YOxh^=a{6<?}#SR>{QQpU7mF{y)cIQ{%k2f
-Fto5ve%x6iwC`bJmLp@VNC^!x$R{MYxt3g5an`G5ua&%|xnFNtLNNF*QLNcDp>X*P?6z=kHlNZ19r=7
-63ms~6zR37<sw$}t7sqS$l7d~S=+$dYzc9nf8Qib0;oU6Fc~+PF`WuSmCtAl4<o@a+Wm>v$cP#2}uh@
-iBsQjfbAqkvH-545(h)8jzD?BLr`@<MoN^&<icx)<PT+8Cc=>eaN)6C$<Nc3wLPRLs!CLqO>uG5*0!+
-rsI3FoHKQ9uB5I|r=krE5VeCiVUip$of5<!FA~g4UJ&`o4DfM9vg;cX+!KV`A~W*-{U*Ls2cOn!c~?{
-GLKMD7u4GpgdqDpVPE~_8Y8z@f59hRXxnJ;<iF}L<E10kJ^K;pw`rdweC8;~Sxo(m<zpb9L%-e7UOcD
-2n;w-ioXl_yaTKK2De$cw@LmS%7wlo^sQW%3;dN0^|89Ea3Z`F!1Chy)91OpO9N7-DCOk(&Q=Y;LFRu
-#qz7;nlNDaEr{wa^8B>m@SGw;JcJe$vge9!+qxQLzG;MaVagM}P65;aY877JzJO65DdksrTAtozK3Pd
-sI#X&l6*JuZDXZHS7ahrKxmX4yeyj=jS(usYD7%Pc+?7ttnNh1#$BI6c%OhYOG6@RMAi)?clBF2DijW
-#W=++uGR>2s&+N3ydH0+4R!eY$=?YucsxuMuZ8MdU|d@8fk8BM-<r6r7e*=4p1TzZt<Q!70mIW{J!FC
-Ta3zA#<hpRhy5C6O|ISb4AT_`*^>;r>F-=j24g~8`xmH5ubJ`lr@AqKdoWcKKx?k<3_Zf)|_fV4SBFB
-)+I}vqEii=2pA4>_&xv3B8^YaW6*hRaBm%E?=6KmRa2Tl7_hjeOi!G?FPpqM76b^i(m8rs5Z5_<0)7R
-ARMflr-&D~NT@%`)x6X90+h-sz{BfE~{pElGHq*Fy{hs}!vcI)b4p#ja0}F(S5;-t6pCJ6j`ox384eb
-A6Kl?JKKh?!{k-2u)P;mYg{XB$Pa}PEi}zBQ*`x>IlS%62y_ZkP%_kp88NI__{RsB?eA;Ypai`<ex8+
-@)@64nY1R&otnHkA2zRV!Y85T%oN-@-z<G646i}cxzvfz0+hrp;0V+D&dc>RmnhTJl{l+UaN2(qUKyW
-J`dW6ueIgqvp^4XdyRCOg;wOZ>3K`wTJ8J<t`!z8|BwF}3Ee7XaPwGhYQPME_Rcb>VC%9KT%)Y#eIN4
-mqOtif>TS3SQLh~deK)F@Ul?#at-ujb2UO{8zah^gT*ky8g|B2twDtrm&5aG3VMDZ|Qc8|_KB@g}tk=
-y`?SZSntBsM+<ZIRs&-*Iz1XYs?#&rkPalQ3PkC)3?uCr+2pw+^9tHju0na+Z+m2yEK5#eMQ}>!)^US
-z(H=rMs${7iJZSiZjng)yp-jS(B+uqfQDJ;1Zo)?;BXZXL1Ep^gZ$e@-o>QdGYgNtaKx)9o}8LUaA|9
-I7QPakyCU=wuG4=>uI!hRrI}{s()XBie){EmZL)$@_2p}!x<O(c>1ft)PLRcyMolWy?#npkT8jXJ1;^
-Bl*B2V1b-|2xQF~ZlQ`NG@*|PIa|@6<dMIJ&P;Ml$PjMQ2qzFj(-yr<^+y!zRO2kKT0EB&VA;r<{u)l
-<hBU3>^M@9krSf(E0%IUG%kE1&i`}6+JLvIp1`atuKJ3;oLI7xnRD~LLJ7j~+(^PY_On1+A4E@1fJc{
->4uKEsB;xBz|hr84MHy*ip6_M!YGJ(9qUWtrrA?m`a6E7CXmxxdoCHRd*Ne~9Y?^s*?Xt8-qfFt+zte
--YO=ZLnobQ1>+xT-fiK1ncXzaRGiT32?tTg?%KE-R0_Nh_+=%zGD086!v|a#>*>zqfOvjW`uQxJ*0?i
-({1CO%a~thY@S^f$>panqrCC@S3SL>=72x80p73Wao$mY_O}^N0zBjS9J<e7c%Oo(@4<lLqV|Otd#ry
-aR<f`*gS9S3ai7p)@|;Wv)?T-S*G!h$?fwV>X{rs_ib<X?;lN;SBgVu5Ya$SC`0u4%=YnU_hrJZpq?Z
-~(g78^6=}(w@sJ0dQ4?u+LhmqevOMFw0R8?sL*NjS|E1kO78h4Y+;ek7OC-U!=HNl(Lk-U>NLB-VVTk
-mP0m5gC4vB03O%(VwE4=>~5cny-^Zsu1Xnz&c^;@|q^B6bfv$LR)bLHjuqG0Mq9H2^YAE*HV}iW4_)W
-q<E7fmVIA9xyOoOg94WXPWHKXijLX`I^k91y0RE-kxN_aF}`qz>Dlro~ESMcDAf5kJV9ry0WrF52P@}
-k93JqQoQo?lN0@U=N>w>49_d4<b%Irxdb$LA=Zz_*1|Nxb9i9f(O$^nilanXWiCa6Kby5t2QyZ0t!p^
-+9*EwCks#k1yq-}4KrejDfc5YWTkyQpMya0Z_8x4+ysEJZXSJrSBgn0|c80I&oMO6ghOS<CM>ZTXv@3
-8&d<#>1Tdmp?SOmIXb>v(o@Cmv+Y^>pt;)YG~WIjNwt_xODj3;M~qI8<v>0<XWkOqAdPdiA9n!ZnH3K
-fDyBR6m1Tx}+Cv;F=mhFMZ&=J3q@2(Ec*#TT=M%0A9}qXlMn3{3j8PD2MF%{fKY>v&!F=tH(HCX7e2M
-)#>X(9t)>v)|6|BXv2ZOJRmG@O{bO<oVQLUK;;HEx|_rCgCC6LL{7{Kzl{^b_60{XcE7jRq&8Ht@`Xv
-ZR(GUBEI!X-_$$wTRimjTXy5;5K%ylAwL%azFvu`D*gMF5?J3-7OO&7ht<2c{ajz@*cIX2kS*;RD1ZT
-PelnPoXg3Buznni|bIg|<*UtAsjfrVNzev;7DD-#k0A3OK_(N*-@vTX>6Lr{6rC(N^N@jl^A2R8FxX%
-GX&6JiW+4RSv%I7{gO%eE`rb1?qHv|S}X^W;!lYwZ-q?3ht(_%wM`=_Kula^_wp+)z2<c>!mEgA5$L&
-@~CsL`RhGtK=qxiB-$(zILd2VOxsFX{3)L1Z3}%f8?K$n!K{F8i5;a6cpcI5tEJ)6ybJhs$w7{>Ll2$
-76V$SS0C$W?r<I(g0!ZSJ<zVf6l1wSJ;QV4?Q-S`!SOJfa(}oY;xOi;{8OzF@oqA>Av6o5x%?;e}>M}
-D*fd|w#kT}k6_Xu&4si^(<{yKv~JQc&Aar)q(2|=_y{H~Xvdk`uUB{+XU=G5p}7aGF7%6*QaW20gl5s
-N-;qXV<$i+Cm$=c(4;3x@Um$E^$pSwMg!`?Vz5lqORCsM8xZM&_xE(cD0lWw9`_7Xle5tFE7VEnI78d
-)-$PYdiE%E22yU(p$W9@!x-(!Dm_uG5|Vjq2(ht#py!U>|i!XJv&B60s+AW9Vn{bv-KM>SC(&tGzXzm
-GM7FSjz!^W4sG&GmDjDSrP2{#lXE4(m#~(*3zRyLxBusE4t4iEx)kG_i)B^?I0OmllK}7~@LDMz3qvn
-Pi{!07rnlMcq#@;r4L<iiYPsf-;TN6a(5n*W*mbx@9;Qq4!9QTI(7wkrP{ltPLgvS-ODoX8VYD&gv9F
-&-<!}`^{*(x*JkMy{Y{jb16P=Us3$v2U9<M$oV~r++@P7t%5t<0a`ormq6Qt09+IuJR_?6MWp<N2vMq
-I2b#-DDw;KtOAxOWwi<n=khqvMb)({2-gCgqJ1J7!G2>3d(FUa1X;2jC)$tgUVurgtT5m$GwBp#ORcX
-gAGihZN735-8Mc3X(VCwLxgUm%P4MysO=KN|<whu$Zl-+?fRHj<;UV?QlLpw9CC%E#Fku|aleskd3mj
-EKKJd20rofe!brAG%Ny?RY^g>G64JuK6_FC|}rPbk4jvSXQEV#-(PLw5}2EfuQ(8Q=QewlzLvUH^HhX
-ScJLY_s|kxbpTp7vp3`y`WmIgTaMPBM^CAT!P%QU6B|!8mOR^hR3&OKtZXeIa;YW7^DzhF2b956!&0-
-=P3+CWjf!NXy~O<k-GQu=tD`i(<%TNatamf@eb_aR$U3<E{3nRruSdbjZ>(6ITb`yq=?y}q$&uN)xA&
-ZvXv7u*9P=}C7?Gv-(2HJHSES4OmG%?<ee&E$;@SoOQatnJzpdi2Tq>OhtC=fiGSu>_N8s+hic-#>s0
-o45B$lS?B|1iQbL3A-}XxvADwt2KkO~@!#wj)W+9NTEy@&laQVZ$vpBk2s6SaaO^>uFN**D_p>T$N+=
-Y=N+Ss4x<k70UKR^76!Nd8uz&@%k#lLav&y;GZ!?^6r)r*hICYBxco@sWh<&wk^)KJBdr_HdV$oNn=O
-O6quhm6?~a}>x&p)EPG#^5JAjDL;-^M6ChU*={%eZcSUy7MfjqQ6zBb$<~O^MrH-_>Y(G*Tkl0?Ey%}
-I5l)s{Qg1zS55k%5;*-PEOzwG0G^N?`Pi?0D9aBe!(RiD8x3o>bkT1zs%`p@fyk;mE(Uxmfd&2-7g1}
-UujGaQW+J+@?jDo`ri)G{$gjuj{mq*NV4$xCWBVHtN5|iDv5*xUg6$T(zQVgOem5cm`JaLl;4h++g~?
-trj&6MNcvJ+6>7B%1BuH5ZA7(qH5C8~Vua?`XCVzqWn>C850`{CxROTfhj#9MNusivEorns9-!CtIU9
-QpS%$J3in#tY(kX8%Vh`a#~ukRBhg)BK}w+3==k4Jf~2w@DvSyX-N?OWT6j`#+i!gJslh*w++wgNO}c
-|Mf-E+oi&wi=kcUMv$m<L@an6|mI^3Sr35TkhoWd<s2x7GW_#j9v%*exLUxV3R9I8m5tXosxJ%140y^
-X|Rb>tRi;ac$2gF4_|`#A{CMqq4<Q@?~j7LB>S{qCn<p9mq+72ilrBXTG-mVTCKh1M(<#S_;g(|o}BJ
-0Y*_~6UoPBfMx*E3=u;NDrE4?6!22@RaG)7|Va4>LIXf6ymor{xg7!2#t&1&ayxrt6qUn1G^RV;O#c8
-9c@ePkj#MVF?tJjTsve=S>VwChVD?Tp)e!r^t_2NFNsB4Omyh5yB<j`bF)=PWBb6D#zr<O@*01x`yzZ
-LKNf_#e!2E(udI-yWyCr=!-naRepEveQ?MEPOk%v~kbp7OL})+mQe-5DFhZN<#kS6n~!H-GJ#o0ctVV
-H1ifzsmbrWg8(`l%bnX<m>$;eUdS6ps=K2{&td-2cDsQ)1If9xQ{_iT-Nh_s~Y(&Kb1`0#!7#mHF1OX
-&)8g6slpHy#Y?Q0ugq%^<Vn5*s3TZ~qo&;QH9C1~i|qWqGWtiAxo=g}z<K-ge&}GcnQT7!QWmsR*03R
-J`b&(LsUUU~xJr6jssQvZsXCCN=S^qu%1jb==U(E<iUD54-dLK`sRpNkFO*EZCER1b&*$E6_`CVE`{&
-pJYSrsya^fM0&Ih+Ro!w`qow)a$S^~@R7x>=xDI)8yn{#UAd0JK!g76DRoLqFpeF2d0m!V&m^Tj|l(#
-u6>Y&~k-T=?QqOxM4lj5HBcxXQl2PBS0mktZ-CR&4qz*1rA#EE#qv(OMoHoL%UEy9O*8c4K+Yodh@QY
-F1E+O*7;4-p~e#7^GE8)GO@HypkD4oPe%wbBYwKkU8gYIltAwM@+DGuycg14=XE$wrq_Ry~`xoK+<F?
-w1mLcP0^-nYWfubVP;%&>MD0;Jv{w8%qYDhvNw802ST@QO*!SSnu25e3M<3gpsDgg?xDFgfLJ*DK7eo
-5jo<I3wh$-cbWTg5l5uxN@w-3b#hadzK(>nexJ2h@&ilHS37&Lkj(;Ne8g+c28`Ys)>mnY;L=ovN)wX
-e`+gqTwSdpLhP?=C<Qfr9Hw?_xIoOdj~{Ag1c<Jn)Z8?eL>RnZ#BOSLE>-EB3DH>0@aP+!?q)o@z8oU
-vQjpk9uzD{f|)R~VRAT}YnTa(@G2Q8KMM?qyHu)qI@S(}Zl#5T8tKbCATspw*>4M9mFH;ncIiKhQw6^
-+$Wnhx7CP-UIQ(WVC-!0q*2&9ovsCAL8#+=5?e}e|Y0p_Vf1+`ObTOyZcYe)D#7x5QXCe3V{>|fdqx4
-`zDwqV2B_{oCF~Z`>l@u;r#u{UqYYkCWar&)-e8+!KCn^)$+B)8T&W-do>vpIXF*pu%{y>dI-_rNBws
-S9X(KZd^ANL>U$qgSOoploD)Z?7x}Z)>|t3)9Yy6uek6$t@~8zTh~tbfa^#HTkA2<o68<-g9t;Zp(67
-VaE<gC*(c^`G%+irhl{$Q^qaSwc$iGSIFWJ%cNGZJ8Z|umT75^kWIYe!eHQ(-R`g*Ec^jlly1<*I%)f
-o9(vQs@8Z)0C@5_peO@B9y4yqYGoR-1@z<-*h+Nh;MrH-N8vqs(sKyvNgZXFur28;5h3FAc}?&)aS^q
-FLs`mq(k+C)qo>k-zq#r@xZB_YNJt_?o{ty14vbM)d~;vl$rB{zN6_w<0mx<%GYBMUIUvwj;0T5drY5
-*a{5fB`1_qN{<QbMJ?Q<g<zd!!2>((7BeYKWI6@+Lh7D3)n{uQlc(oGBccZZ1l#KYDN2;hv=>x-SR1a
-$n7ar)bH;^Kvae}043rQNJR&aP^E?sQAi>-T!uQjh0w5wV_4a@o21-%SZ$SM9I`)+^&`G~bPsb34EZ1
-*_JJB&E(h`-SmPzvgbQ6$=Osps1d<!bVV~D52>SCrTw|mtE2}!nV<;?H4Uei8LM@ecYCsAV-l;DOVu0
-!n_yk;2e2#}CAk<11W{(@bDD=mzby~n3I$`L8ztkOdrp?bcAu{@u!gnAQ`iuXBa6U93eFU=jursZL;b
-SdfjS?JP<@J}=a-iiIMO$7c;g0u<}ZYRZmybu8_T*r{?I%rOg1BXvh%7JS|*e3zyP)$-Kd2?<q;<Qe@
-=|}YwHg1AJPs)9A3i+;SqcRg5SkYXkJp5bj%GwN!JJga}Tn_BHNnnX}%?2|blQSn%2T!Xr2T`Q=5Qo`
-ZxzDI&Wh>T1rrS(`o{C#2(3crex*^QSNtQc-)Y=O%UbH~Zy-gyl)X&c`UNLQs3}%6ywuyZpSA<pX(2Q
-M(Vg$yPw_8Z-{mEJQic6j4Lh!x(3Mca%yE@5b3F%8NQ!7v?G_QQ#X{xn|3UeRefVh}IJZNlRUgQ^{OG
-Q0IP|-hf&eOm3hZ!49{aNW9`?Y7x_<e)5v)rHtrBwsEVNajagW=T8PvKNL{145Tz)yCyJ0p6{R=Pu2L
-+!K6`OG<-cxxK4sSVKV5@MQ=hkoClH;pSc=w2o*kgc|bV-S;L`x&pn`OHd8P;iX|<wzFat6-7uXR44W
-kjS0$4UzbS&iB)+tPGLNeFZ>q>Qt3|p!>(tw*an$HAQiX%?-SJn~;f@FrU35i$HZ}?S?bgMvD5NaH!n
-w3gp}X$L!1WuIi0h_<eGg@BV9AneP4skNlkX(sE_C)AF1>=sW!mdz4FHs%9K?%@&=>Ga!V^JU(rl6UH
-dN(XYS__5FMGM7)o<p-pdQBoBct1!O^Ldql~fR7p1R9A!`)O&J0(QQus{K3wnaB^QeKT5ATKHKk3V#t
-FL!ncb%;3QhSQ?7U}87|KYccg!EX)`V|Q8MwY%&T8@C0y$R~KI!(H`=^0gx#pr42KadBjQrjyX6e3(M
-|X9U@iuUJc(2txSkX=d@bX?m79c$<<D&Lnv21DkKJ3U5Va*DO4e)&-%n_&3Wh|9?Fz*|*NVPR?VFo{~
-+y^F-)SK6Q6)*SD&cytDXZW-hF)>G2%8}NqTgwe=K^_xN+si>?%WAI0e4EvNF}1V<B=yXDt$~MdV3O-
-{6<*#@wUsXFPQ!(G+j+BvNMYmdk=o_;iYDw0L33ilc^TEKw*vMBM)0YMYTY(pYrMhvee`|7eKT+TJxU
-ieX-Y>X@dmxO5AA&h&k@v1zMpvEKWJS4AI@CvROQb-=#M@Aj~RrZV&9Et#D6h$TOS*+qQ3vj$(!!cK5
-jc59_oL+@_$M7cF(8JEBb$acFR95z~3(PwROFT$M=3AEgzbEtAFi*|9{J%zPHo=_W}LL?udiep#%)#1
-c<;GieT99m|XI)K|D(RkfXpp$qt4@d{kV>`0y><IT{ilG>xEk!uR`@KIm9jKO7LrgA?xb3D1v26ZNUn
-$I_3Aads3F?mX&f%=<LZV>^@kGZE!uB*j4q;ZL7n_NiFh$F`qw-;QO+B76GjGK@b2E(Jdg4(O4|+PNu
--9DW3O{Ao<2K6X;rr=1@=gmRGdub7-@AB*hVAC64%y*zb-n7pC?NZWt%U1jngHHen2ndGtarv{OuBPO
-{|)xqR;P&j=PbJ0O}@}z+8ke$Wx9&5cB7KnEOwnkK+*vwAGra6JvSA1{BqaR(CqE_asKEFe4CayaPYf
-955gsw(c<wiGOM=)xVdz{(pJ}m9~QpP?4<kNSr?<X6gpznWeYF9lA0;11werk^Tcn|;N^!TL;ay$C&^
--ncq1Ab8|lsDkhl)ru7_|q5kcfKFszkNY}=lcQv+ZXhAz8~PfeL;Wc`}s$vQs~P)H;ZRU53lwF3}?@7
-2r%e%E}j%gQT8Rqy_>n+G5cI_>)lq2$ecZyv9C@e+2AXy%nYu`_gTd}ZIj^6NLC5puxdHUZ$awpYjXz
-^Qx_vHnV@8>`xqPOiW6V&#!&ZZ9K?6}8!uu4nb?KB^hwj%0$@^CdU%SmkK-HO5~|Smh^5sP)mo2j!j1
-Ml<332UoM;A%>N{I5tvsAuIjMVr5&r<5(5d8Gc}ds%^>*5s5Uz4FI4pQYde1A`ZWl{DF=I^-+SMc;qo
-UpfRoGm~sIo{!IG};hN57FB8KOD(?oB4vJve=JSI?mD3a)wLMO6k4DME<Ev^b9%#Vebl8{1lsUa15WE
-V{=kbZSr&r)d7UYBFp@nv{YDkUy>Ci96T6b@GTtKFu-w&>o)Bg2~C=M8hBF3CQ@gz#|bs-X$+TIhTWw
-I(N^{ME1p3T;I3Z!IzV`4HHVbIid2%!W5`^4Ls59Doq2X8gCt=!BQ@Iwc}&vc*|SU0T0Z}4WXjuCOkL
-VeD;&sOTzj5YFzqxdkW(9CWe?Lk-(--inmkhIb*8(oobV7!o4>PvJ2ekPZwqNi=cBu$GHjc^=)rmCA8
-IZIuk46p46=a2BA-<9g_ngxO$0Mr{0vXXU;$_Och<9Jp`AR5HCv3Ih6x-eS#hFa%1l9+LPB*ZUDICj6
-@}NcZ?gBxo;C&m1PCpKR1<Pi5pBP3aG5^&e?H5c@L+JCv2R@+`nrorOrk&Hl5iC`;RFw9^K_dXwIZQo
-YwrOrc%NlUk{*@WCGfFkRqSp3{oGGUYZRYY-HPrJ%{F(e9gd&9f~V`Y4{2yTs)+)?sO4Z3y>T-n?;>`
-UPEXq1}6-XJ5*-s`+kqdhlOXDE(rUdLebffU)A%B)AQNIwCa4j2A5|Dh)Yn?e013(;8sJ&J!An<kUF=
-<+?`HPmxZBafUWKGFz*<T6CEeGV-YT7Qc65;Pzn%)&RQf$c$OxPbeEic1HL}W%iX6=Xo@B--19q2vsh
-^+edto3%@DcrOmzdF{;bdla1s+KS7=(Wadq%`$X)VB4A=9?MM>tJ=q&9m8`qq(0d7G!z0+ZQcPXX3A}
-d!w{snj`ZoJqf<}efo_7a%3_si@hq(Rsj+_7oaJ~b2K=G%>VJK6bc7lruriztZ~md|Az5Nf~k>6@BBI
-@9qbYQg0OW`%U4EKtrIj)@rjOyYj6^4`S*Z%>LTAC_VuFEiL2wFTaL9AV-Jr9OytIH};>c-YdL3zti(
-RjF@M+&Hy$ys9d8WVcuFF(@!nI^2pXoevuTt&l7{O1OmdIGb7*>`^{j?4;CZ5D6d>-)>b@HS;SqXAm}
-&#lgrof4VL`RJ8EabHE!lL9)K__#FW+^O=c}Bt9WHQ8}CKl8XN7q{_-9N`_ONM*?Dly-x1odH;)9Y(Z
-v#uAWaamLlM-!wqx4WeF#_;@2U8mTc<wNf4Dm!i-Xd{s+QO|3#1x{(nqh@qfdW{)WIJ{FefY$C7Mvtl
-8%1(Z7PHM{f!U9&(9Le26LS+>szYEiA>q@%Z<omO3~qoPE|!$)jxa@bt)!byFfgGKo8pMc|`jXQ!HJa
-XiV$kHyEII)gxme)Y~o3G$<AK^}dyhn^I1h&$~skLBg;C@RH1Zl>f%R58tt1|SqWmTHsqV?grJz6Q}x
-^7W%}0q^V<{{OGQqWr7C;^Axs{(nYbQT|5)i_d_1B*CfLnmmXD!>+NWXi2#8LfXv$`e|=>sN1B+^QB)
-9l1tUdX1X~J&x&j;)w4_^B4N@&45Z)$vV}B}s`c{c;Z84A%>u&1!J~ne*Veq1xuef+bEX<<*1_^|rO(
-1^&K{`&Vl9Z+D^^?XW#BDUyA@6=;hs_hP<3&FAzj->7EVaqNlyb>UR$4!-uMgz10N^!C9<!TB6bLxPs
-Q!pCcVv(oP*2p>j~VtOKIRvt_iPK)j-eIn>g!Inu4{pv{wjsL%K6{Z9QvFm>})$y4N?mik^R!XbwptV
-38rREcAD(V6Suayuuy{t%LH?rT59^cQ$zI0$732u0M%Jspn!i@sBBx{&xv1o&n#cVOqNHL_isCdhiaj
-3#w`}`=4rTe+VpU=CuyZvB<8~8_>sSI=OIusxJ>T6#R{ZiSG0q8mmDEye9=0*{0`J?+g1%HFn>h%Bqd
-Q6TMUU+Mroreyx>!3b*^l;PDpKIS%qNYK2j*CKq(*6i-9KRxe)qg9+<<-PhTQ-5zx@3NI=07C`17M}q
-lzUVR!%h9IA+BnuWHuUn~T*oS86$mY_-BnVPoqZSIL7Scm^P=0xynBYJO1<yj0``UW-31M8((&yhcdC
-Fz4PR6!ag6ftDH`-=O?e26#uPyNuwDHaIQ<yPzfa)HSN2YbTxRarbt#Sjy5pTIdyU9=3Hn`{Y+%a>e>
-8}`Mn)!L#*3)*~Nt~k(R%-x^onLuen3un8-gvY<OpmXam1iGJf<frh0<mxZwL{{+@A|z(;&;3K)GmRe
-2uTnqMUW7JKsXBiwqhyHk8aFE+u^fn6{m*>HI^MqaXaGeaJOSqk{s1b`*ZB~6-!6D<&!KyKFJa=J^B@
-n=FN|C;$f>m94m7ueq7<$0sj~$rvHZjR8<%`RtJ;(vzCS)$H$+R(F8fhh9L*UQJ-E3694Mly~7>(k*Y
-vGWlYC1-bYFJz-sbPJuc7##^W8^(Z2+}>;S#?^hdh{XQ*Ml7UT9G>r|gij=}M{#w_34B|I}YN}#_^<f
-7MnS@AkL)A{w+Hi=B6wjYHP0e(^TL49wNK#nyzopVubV}7ho`a`CWTUO~tr{A@e1XlnPL@U3VDz?$r!
-XoW<0NpR`5ywb>_150O?YGi`e}W!f<;+3yeh}*IW%Mtt2lV~NDPES-bLvnhrcYv%V=rYW$UPV{n&Of7
-39HB`L|q!~EUQ$K3h%JaDg6E#Fm%uWkHbw@JJFC55V-2I5aS5bK5Hvpk&GS(k0R6fLEmr76-gHO^uA%
-QOj4iE8~se-%L%X}q1wUm#Fg5Uf*&P9%O2;UUi{i_<tRdH1U0PxzWGrpDP)?o^;Bh&Fq&rx(Zj|BP=y
-%1m`CL2MPg`ov=A7S)V99(;p06NRde>6mcB-FzzS0y$@l{@&w7_{A}Mhbr~+vZ@6&rIwGR2<UWkynlm
-m5kJhA3{D=*fDB*J~gyi8e9Igu8%;MI;)y|yX~QZQ>Ee=OhOqi`7F7ewfKbB|aqp%PvRt39>LFf4@VZ
-;AZ1A|Ck5lK4yBG6O&MWm^)H7~larzqm0<^s&;I@{2f=Oq<q@TgQE`ep&};aZyc;-|zk3;FkDPJPrIJ
-YjDptCu#Xwyfk8_a;Vsd9Dlnks;8F49K0N6>zdOIBgPwaB_i?$yrN=@q3uPyAiAGURfF@F>bbpSox$h
-?LaDV2m7TZkqq@(PA207Bg?ZB0_5k*bH3q=-!jM@>B^O($jF~jyiQ!AiS`0(wM4ogd@2?~l!6kny)L<
-G{HK-$fX*WDcaI8;(dn^g8PEgo1cu?C5oMt1-;JO51TIU7zrXqk~GNy3o*^xq6Kb^Jpw9tF1u-J_-2e
-kJJPeV~b%~yq2d=k?)Eslt>YsB2*<a<6}B(~!z{A9(wt|n`Wh{&Be&xLMSiuwXBLmC>-G=j~E8l8+W2
-Nn+*<b5t1YcyCX$MfuOLy<W@yf~}J@8uoPzr;i0{`>Z?Zo$96(my!t8$|u~ke@sH2oOE0M{pR&aSFyj
-0>NPd0ucfSaSTIo7zGKEfI$%1r;6XMMC|i<@-a(9ilcx7`A8ugPDAKN((fZSw8uI~cEmt&@>~4cBcdH
-T^7zm@pzx#3?uhq3ivat^ggi=KN$A*k#9Chzct0+T_@C939B~+atb=5qW<vr$qy+Z>aKFHQB?|sX<zq
-)#%AwAi9QH(q!Xb4mH0=K$&cfJHD}#Kn@6ahik0p$KOb00cC4LFvQ8NM7-|)-Lg{n}W;3&GUo4%xw&S
-;M*O57;=&y|Uzp<uDOpAo@qz#n7;9u6-EPy$6&^f3=!55Ze7^34wnee2e91n-BP{-|v&HJg#N?R)j@4
-oUL5hb)NBSqHv>z^@xMzWhbDNYQ_gT)6NnV`V<&hyEA8W8e?NV|1TFzv(h~KkoG1J4xpF(%Q6tRB>Cr
-TH3tL-8<n~kWt>k>_``cMH)VCc!QZdV9B$6iUpfVGhS7OYwA^EjO@f>&1tgGY$Sw9S=_;!(eqg0>$&W
-oBEf;&-IE#c=I6km4~t8-cSE;Fx|HJm6BAEb5eM8%(Q~!=QjAa~ZgNSmY~+TY(n!P7>puNHbz%Rx05}
-;G^Ma>~3`;0lqLp9Z#+VN%b4?km4mZqz#^?f`S;N_=fLFk->~8Obz3fw<{ip!cSg>bn#6_@UdD%KI0T
-dYRRN0S{nmuIwQQYixwGbbpVFncwqfBtO#cpdH(&uN;18z0hQzT<)sVU(A@7NK|{RFm4so#-8<3X3Jo
-yROv;<+txx~l|~UkcxRIW)CiPY)nY7W9tWO*;uSeD7#Fisv_JS^D*%Jzr#X+rJ*W-I_3ZcHrDRa~ZM>
-=iw1gCAvM^6hOuRYuFvMd2dA`F-oLoVK{JD2n779qQ^tPXZCH7etCMzT{yjC-js63vDm9wD`ye7%t=5
-+&&_AhmnJu|2-)=%l{bQ}5J~Z}aOWI#v=)!%Y29bCdNz&EUTP||%k>@D6HpaNv?iho=B}wVP*J~W+~A
-u+L%oR0UMd@S+#YZfF(Oc;e&!ts5g%_tZi7xu@yiu(8n8J*M8l}qTg1aob=&wJ3_(CQ<%FEv**&kEwd
-OT1Cwx+LO*ZF=VLcIa5%2VM0yg&c>fK^<m%p!o@MBXF@T&sC11o$I!fXC24pu~x0&J2*DJ-4#pUQ+^Z
-Myeah`HfD5|BnWNC8qv@9As=q-L)?lR@0&Ig3L8S*~aG<*m<S(_ibzxn3vpd1V33iRCTth?TZ|TOOGe
-1(^*RH>ThJrk$BNCxn@XJIMKx79vETcDdG8%TtD{q4F{qNIA_p&w|m{IwBg6_;#(SDD4d6>?i`Y4J)z
-H42w=yP4&^JCATv%8k2EpRSITnR|lTK$V!*ayh5b9$UJWNPW8gm$r&Jh)ysaZ<q*{TF)c5wfj{ua9`&
-}Hl(C}0WtNQrAzMy9d@F@#doOF<qVmasIWfskccgP)L(L?{$pg{4X_ngwS@E?4v-PoxJk)vO|H<5YZ9
-9rCTZ8vJ#ktq$UwBh@SYZSRE8q_A5dtL4)Bm8XtX-9rS@!JiUSo}AkoW)zMa+npF=KuM5$s{`hKy3Wq
-}0v2t}WBJny>^n8|$Asqi+5dXKbAcls@=sfmEhkrA08v$eJ_{7$A!qIGkvCf%#{2%knP7iK2cyqLp|}
-VyD&IjT?~&r!r>jjEiyVaf9lYbpx|-Ud}b3S&U6K_Kt%uT%TV{+1}T;rOE4b!)YLPQBle|iP*(A5-60
-7jTd)_WOMH%lJ8Hg0)kwj--d(hU>XxN-P*Ui<V2^3gpfW%&{x7A+sECueP<Xv`J9e8)zO5SA$KSV??n
-$hArvRXWsfjoqHyq3h+0r^&Rpa5K14PneqS+iZ7OdtMv?_7!tEPWX(B_FrPdcFpex9WQq9&Rjkgw;YE
-lU`s2g&N2<oQQ-9nX>&75Dd6mP!nasM1u!T$_Z{dl(@qAK_sRE1C=gyA4@3_hT+9aRx1ihoi7)DE-u?
-K|88VVs0f0>*wIq7Z)O_K+V+M)W0zog9gQ9YgIgJ_LWpHipL^2eA5nRsf`q<|q8qJVZvvcM>0&Y79GK
-asoTV3qbg1vE>vx($N|AQ%wGZ;6FlD*++soI`G&rbuv5%9S22(IP?<0&$R96Gu!AGNJ$)-?)}*Ny8D5
-5keDO~eHTm*VhQ@`nA$N{gdVsIBKK?j+o;MEVo(-dOc{(2IpV0YO;Nu_b7JNHU!bb;_ozze98BHh-=e
-Co8~@9wO8VQVsu;@qN}E;eqWRf;y|LkR9VA37+es*bQpkYklkA+-eO;Ewxq6T>3L5hEa@^PDdJhlDqJ
-Q5n4}3Z=q?=K9S1hhqtgv`S6*Fy6??8tR)tbEg9ZdP^5<krM+N~L9O`5B*o-Cg-MMUu~%tC<*2?>|OW
-^!t4JYBKZiCSAA#x8~*`kcUWD~6_3sld}i+RlAGHcshvLN2;1kwdw$R{EJM&}<347^mYqf?DBt0(9bu
-LMY9gaBsL1H^FP^ry8<v?Ud(we|o6pyuXWe0%ExCMT^?%gm7sKf)Ml;Hw_4QP-iWdch`9vW9oJ}TSJ9
-I{<2tOoDCVqw1duhnZmoTQ{#d+T?t|J3Ej`jZHnjwtN<xIy2f{~d3o4`d8_#HMI)E2ZKA6tmhww^7Yu
-Z}DgvEqW#d>&+d(fWcw8YZ9W~_%Nb$wTDy|A3Pi$d)yo80@*UklGRUAG|&5j;TKBEbn>?ew|`8c)Dv@
-pP)f>yrdZUC7Y#%SGNP@oVz$*U;Wh0|`ur*PbZXsOUq6~Z<#OH1MP;v^|E!L>GBWk)|Z6iEx<tvTie+
-41CD<%aR*@MXVR#R%X~8HSV8IgLNikH;vmHueT3_Ps{Z@;K*FRZz}~GyoBlTXWwb?74<0?IbOC8mdQz
-49%rz%*eng^g3)P&+~3`7ie?<tMwlFce0wbn!a9um_?bvo?YmF3sn(m@=luP+1D5OPKHfFOsmjcqJ;z
-h09DCimU9%xde}0*vtdNb8|q%xHwQr{t4P-C8nnoiJYV~3Zwv^2z1kfGb*hKs038nE9<C6zW=P&u&cm
-LY*ZsZl-|dyirk66!7u%kD4z2HHQ>YeweiRq+c@vd3IhialJj%*|3M_jPO7E)L(}w1^MF)Opj{0rk)R
-)MZ=QB#&cvGsBd#7IEJKWyWl~xV#5(4*g5M2B!b^RQ1j0yGVNBRJ-)PlhhM{;XQOSLQO@6u1D)p^olI
-v7!f71t^xGz0B`<_)zPHx)aSTZCp2nZ}f9vG@6bRtVIi#wg#C`_mSg>+b)tx9FW^alKuO%Ow*ZG7p^G
-)8sc!-8PC(xMKJ4a8G~vZ*dVr2c^d%zz5CbBB`OCi;H{CSz775o*z)Pzbm2(#ACQ*mxh?n4s6Ct5jB|
-FsBSvEa@~8p&J>B{M7Trc?e=n+>ckPmJA0Ueanj~in-U<2B<*gbf?%l_^cJ(H<=>#X5=Y!GDO*ME{eD
-`=3%@Y#`%L*xAZap~_nnlCH|?(FfWls@F}QP^e{T_sykT%+MZ@?mybZFtTesK*{kHfWyq(Eu)?~VQOL
-7{OE>}URpQ?c9>gy3SF;yjAZxuR<iYBKn;=Bz`<jd9(PLjkiFY+OC&kgnpeFxmD$k;PkwvP}6?$!XC8
-yJ)<@+i_vN=S|r4#KFZbwcp@pd-~3jFz6>TMp??>OV(S$Uj3>Ki=(!s0#T8RqcQYq(B0PAOhUs)RCIP
-5o*U*7z|+q0uwL_LkIzq6pT<9`CWp+0eh08+!7{7u^#_YnSc&BM1CemfXGi2afo+**sI^~e<Bam^@Y^
-B!>f?|)NVfX*_8MR0Y6hPK54A<(>oq#pSGoRKk|=I6?u$lJZ3zmheGH6)cxoOAi|En_mj!UBb!FR2Pg
-MPl4Zx?q3k25{gLwoKXa)Lolfc~`y}L%GsCH)1q%Jsfm6RjRoC}DqRX;_k>L!5dQS`>_fSbIEPihY|6
-f2=>+ew2F(d%~7FGSS@xP3!)W40Ywsl60041J+oOWvYP~0jwhx{gvFo{cxWdi4=Irs5%BnA!cyrD0b*
-AQ-Ebjl~&R?b3i_SjA8)ib_ja)RlwFRd(Sr|a}m2Ss}U!b2tc*1W2Zjt~kT&0Z6SP8w*9a>;h8f;jEw
-Qp(Ie?n!KK>4SXJ>RV-Wi{UPtX95nPFT{AaLti=xgYz(-Vv0X%nQ(NJaYChdyGO@J6wQ3WUpwlVNRPF
-kF*bhK+IWhAA%y5etOvRx!Snf%haO@Rtq8q_Tc>I?BB8<RJ5Fy2%_Bn6_WHP-7!Z07B*B}eZUTZxU#j
-Jlous564dOkcb%389v7aq?Bn>f?tJkg!aehJ^mum<4scv|8XW$aiIB<`SX-a$xK^%n`C(u1>2f0*?&J
-JO)UdgYGTM_s2N^*A<&cbZ8x`{S<9Lxx;DKTo^W*}W(%YFm&Gsu)zdy>Lru5Nraq;rEk?@0LMSbsyAl
-}5|<4u-F|Ye<$>iy*`i)La{2w4SA!U@ddY=tM6T<j`G=*SlOO*CKGe%X1nMW8!Zn|G0@$F`blK0G=Cy
-TU1|SdcfWCly+a5n^q!1a%!@wpyjzF)#oO@A}QhUFM)R0?8KcUeT1;(GD;)n-4a4pFQ5U?sHc(HNfic
-<87o|hF3h>+PcC)#r@`PcX14LfXQ(&W7({xO7jceplsUmfWFY441gwc3Lxkcz|At!UAEK(I$c(pAJ?Z
-+kUgj|Htd}8OyCY@s2dIiO3)l@I{*kzL0#}+XTwb^##>0~N_v@q2#;dji*J-%nN&ubd_q|@j(w>lh0h
-CL7i%)`8YlHi)hGs&7r~9A_1VUQeex{gBz>l^QmHath_$-!0hH{?j>F#aJYwRRIaF}B4uJ>5ktm#b0n
-B@1QO1#6%&6q4!5$=~TdxZX^c5L!~tFMZ_Z;Dndond45_ZxUD-jhC~b_v@xNQxFN*@TtwhV3;ijt>+i
-fs5GD&X8<ruxPtQaf|mg3u-S}F20ZhuQTKCRx)PK=}l^!ZstcOvR?t07)c9j-Id~AT->*B*}U~nWIF3
-uH3;!Ju)N#&2yXyLSLc`LJJCcm@@XB?t82d^|BSO720qKv{)kebD^H%g<#8z^slXX||JX6Iu*|fd0f@
-rcFE{K^ET1w|PY`q-I!@8m-kxcDE|s3*=91uAt`>FiO?o-Q?svp0cP&@kq6Q#U!Q@B!D&|JT307mXl)
-N~DIki~M-QQ%0z6AMVA*F#2vXewNl{#4wBI3qyf#1mq;EGrR!O{c8i$&5TcB^)qBqBapDz6vZfhu9Om
-f)G(k)hUCm|fwnus!YUc2Y-)8gOeKy>_jsLdBOLF@rh~?ujKb2}WS)OUS!KpBSbBGkr>Hl(MZ->Q6gZ
-y4CPy5T-M*?zijx&iVJt-K`wkq!8*P?~r47a1aBo@U34KSFU;M4Ed*^0{{AWk}@xkR-pf(_iaO({Ex(
-afjyTmy5&DVDs}O}xt!<u|0Mgic;EJa;z#@Ku#$hf*e|0?e!S3cn41_vVhBn?I7p)44!J0V#8Cu95FF
-mY7fOK`3Q^xfUk70NjOsk_405D`Ncbqi9W6k_F-|P~w1DqGh|GSXlJBCg9ju`rZJr(Y?8xYl7!8k%5(
-*yjI%sx4vK0K_F7OZurI16}97}#evLB$Y9T0+_`JfU0=~71yB_1+9XgB+w#{sCLv3-BSer{QKR2{KTS
-2~0qRl^8AN`ol%`Nob$rZ74{<}nL=zYy$CnJ&#Cbl2g(jQeCUHP$B|3r>58L7ce(8$j!Ok{cY;d^_&b
-bvE8r8TAXdq)=7!(sZG7P#=xlx?|O^aL{$fK?v}fh;%&Z{&~{Nhp9=m4jHbmIB4R-d(wYKfU*n|BN`O
-9ZY}W*|4aM2x&2J#wAESvP&tn_b^7Pl^?W{rc7EAbG0nGJo4<Y9zdmc=pPcsBvpy&`z+dCoZ~?aFZ>J
-*RxNfC-v$xabk*cmm104=IM&ybJ7Cs>5L|>y?*$|H^Lzj|oLnY<&@Rl8q-SqRtff%Nz>9?_H{0$YSG>
-(C&lwI|H_uh%>fdy8Q)cY9;ta?KYwHZ&yI^XiOg$se7qcTAz`pQ_Dax$YUkMfk*1AJc5^p%d4J!(!68
-g6kyPyH;;JFaCtb9V3T`vI5Pn}Xpqx~-i@_iknlXUr`~vY~-!LCklr@1a%xd|~i8Zu)y{k7ww1Gub!#
-An@A@4%#<O={NtHt@ZPANG8eR#%VL|zW~3|cbh6BrZ9B5@gRH9c%@N(X0A*8kh0=}Q)V?H<MlS6=N6g
-uZr%Nm*){g%)13_*9Gkz#(7gPHp$RaIt<T^SYh7=BX;c2jo6~y-5zQ8M&>t`~*Qe`N`b`3iJJ!p10`V
-zH7FF;Dd*qUGc@hR;S-15|zpPPa*iISV_gg$wR!dZ$@TQf^8bSjl0bnJ!vp>+}O5y~$NB8pO0`5^hO-
-)+@Q;P21CZvqS$%Eetc-;exYh{%qyFknpy>unew6ktre8ZGZ6O+EtG+f)uDMvIJve*0N`Dm24)zSB2l
-<@V++c6jU+lc_#%69MIMga`AmanO1;%3|ISWLKqkGa^a-cJM+ZZDZoWQMCZbrq8RrboHw2&&bi4chxQ
--#GRS=o<BYEBZ;X=<bQwXMUAYq)#l@#JR~ea{7e7W}dnuRi@6!>B+Du0U{~tPotN~^8=6yZHrX0rTj;
-a{hblmKXyOJ|E5#?i;MlaQ$&926jAI@C8tOT1W61-2n3>F5+P9v+i@p`!Z<;FcLp}`;d}005P?1wpD)
-RX<S6bS=`m+I{e=Bt@@dZfK7A&`j)sEpGYssQLqZ;Xz46D-?i)ey5J%aaS`vQ}0_5RvcPE8_hd9a)oZ
-^=X&ZlUE#)mNW?ghawyWvLx35tGZbndP-I%+pZCS_m!s7c`;6&UQOSVhpMe*-$M5&dX-BS+fe&zvG_9
-!@ca|Kk*KAv_gG_PDyTshl-gVMc<Z6(-O3&-DK3-EBU-eeo>7zj26%X950=Lp(eSaAXMnsY5)@8u&L3
-@i=SXpE*QzPCjCP@e}y+s!9x#J40?5w3KTlO&bA5tfP7Hrfs+F_uESw-LyAZP!O`~n>~|8BA+0?kuxC
-Z&<soF$n@&#rUo|K!<uJY_gJh;>1Kc%>!DY6p_FxZd8<CB(@Ewg{fWI3Wd;!jU|RI;?)e6^$Brb6q}p
-2^6}$b*P6GIzm)M=e6}-Yd8svf#3Yvy1TpHt=XbpAo%?$<6v)1h}tEMZu=_Ns++tIQR7qrQ|LJ@9Fyl
-a|C-MnGK>IYcL%W~ijEw?OOr|XRm$W=f=sR0&M&8p%IJ7;>v?sBE~T{%5fqTOs<oE}Eq32ANW9TJ+ad
-Yo72?G(WnzX7}ts<3s1x_6lA@AQ@ZVz+)Rq4}@Ei+{4v@2u!=7x}dXMPUjd(A`pkAc|AOZb3g$20>vU
-0)sG&?GJr7r<<aOB_hM4aE+k{sU3rlSw|@TsZu9L-t@@Xekk-P`dtH>eBy>fT8jDz7~lu{p1?ml;m3$
-$0y)q>h#z#qIQ|S#&W>myM1NpFchkAAxc@wu_uygNQ|t&#Amj*c_Wcv&qrHV3hfLDL!e(FO6+Ri?_!C
-~BpL8!w93=kTq+;P`vT^himi=i|QGKF{@D~G0Z^ME;WAhoZgmSSK(dcmOyNzT_@!yIn=vn;58YREBM&
-BxfibqcOOTu@f(GO$4qIYBYg?#_TpgO;7Q!n2tgSz%_rakiW^6R6?QLFwcJw4jI_|d7ZkLP^Uqgkv1A
-{bmGj!u6`PlIM3zzuf{t&{j<j9|Hl*sqD<cs(S@rQZty{VW?`d}ITdk8HpWIbU0*Y1%@BWV?nkJ6WA~
-Hit*S=A}lNjk9Ji34qV~i>#h<Z7(?X950vleH&Qh;pKI0Ui-4`i2DOCPN-l)5`7<?Ya07YKdRamic7l
-y&_bl=B+FOK;xwEXMNrcbZydn^eD&73en#b_Pgc-h{RR)Ff!?Da|3=*;r}im0HGn6~Upnc$zFsYe2ht
-i6-sYZ)<U+!#7`|Lac4cyNrsk!|Q34_8d6F%{8eJppE9|}j6RQ*U1ro?x*pIz4Pd7+){kgN6*vTX%**
-x6>mteQLtLkW%o0zvJ0T){-9;p1}7{FW78+J51<rZuLV^C%nam8ZEl5J|kObMJ4$dBkrbm|VtQME6=N
-m~McHE&sbleV-=*^!vi1+bU)!tyhI8fuF$e6QN-@8&H(BQ!5er^x1;tBVTX!~}0+AK1MibyM$Gt2_7a
-X&eOVG<%4KD3xUEzR(#Dqatg!)6!LXpUc~L;Z;qsUJ}3VPWz1lS}MSBa%zp?Et+(B$+iHLg&~Y+(7D@
-pimbb2D$epaL!wf_!IhZe7vVXQehEBCy8uEmJ=!z3shV?AQ$;IeqAI5$Y$_DuaW^Ax&FqMbXqbX`aR|
-D?(aRz`wy=_sygM*}94>kr3U8hem^i~FWh`zy%ec^4b<EVu&71u!FlVi2;^cr4ewC4Pxhj}N)v_7dDb
-Qc{m`MYp%vG|gX}D6l)Lj|55soBW>?2tU?yuRqNp{doRI9cK(EW~IgP_GX&CVJ?9sY(U(f7U0zlkFL$
-wGhZ`+gHWe2SJRy8As40e3$LQxJjgaRhP<AtX@*M<MjP!NVbslN`w|?4#J2MW1mv>CvdQV{tG!d=-Ts
-*)?nr2)^GiO?-NicNaubhm+ZZj@|d+$%hk$AJUDxr$Rn6cM|FtXn5#fCkHQ{N`K({c4rrU`qy^1n|->
-a4<bEz5W@DKhrm#JoHGJ{MkFFf@$_Jfg-6YEKVk4Q8|a93sGs)e2>x^eq}f3-+gDEhlqJUAj^45O{)_
-KpT=)LI$!X6y(2N^5D4c}2`d#o){I`OKzwY;rIw$aN{NCaAfPdrn4z~yV4ZpXkqJL;`i-$ejD)5jE76
-1k1d770tKc{&l%z_vCMA`Fr%~sJOulOlGtD9#&NlhQprGJs2?7^hE87$EkcSyJZS&vTL3D^C3_6Rzes
-rbZSYj%g#`PsOG#E|H<Ak=UwgPd_f4IW-r<cUi?E)0`%(}94RtMjbJkCSxzyEUxC7XZI@1|u~|{jDvQ
-q<m?$sPcEM_sf>FNPlK?U;6pl`Qv>FX?hL}X#r>jCdqa_^Yvg}?T%yf){D=Uq&-$iCf;o+K}HcK)hR$
-%qz!HEEUKf?-jMq`oZ9IOJZNdw??E)TmiCe{WA_-Y6<()>+DywMJvyqS;z8-h+@YuZ?90(J=_`V|x)N
-gUL;~X)dw<_({@l{~vz<c!h1L8=EB(%FezVGN>?Vpq7zkn*Nf87>fCNEM$Zj`}>0}^;;}8lX-%q-bpF
-W@Xm~?t*_-9ADK0=Qq|Iu~yMc4uPkT$R%si!5$VQ-JI=E;%!-%ZoL>mDZ@8JCYB#F6PBf9A;U{~q1DU
-rG%>iW#s^`GEM)bhFQhvM@VrB_1D^nE05>Baf0D1e7p3ba0Q@20RQanSSDx@Zf~(hu_1LpP3<_xQL>D
-BFR7Hfz$^N1S$VxH-j;9F<h7IYpEM4)guYyao@%a^AR(Y|E-vT{~|B+v7N=Qt=TV)y}wGj7=I_}QvSD
-+E`R-$k2C%|M3OVsGh4Vrc}#$m8%LMwrQQft>2}n;Lt<nF%BcwE7vJ|A<Uf%x+(L}FpoX?^yU|--wa!
-F?JBD6l!o%2g>sp8wCY<k#y;vM1Wx&#-Ztvlz4sSf6Y25fpJ!*tw$DxPXd%vl@ZSws70!$~CoKqg_3?
-lNx@@mWxQF1P@T6E&C^|ZZ~)E-Ow#0o{b*#i>?DItvETYt+N36C1jWTV%&M3+gHQnW6VX0A}`0LQ)%8
-;@t$jb3XvB`A)_HbgX98ZRsLw7qH7E0hbT{^A=lgUv`KPJ_r#_lK|3ssU6<<!HF^Vmw%)eCfo?!u*8p
-tYKe0cs4hs#ZB6q3tO|up%}Tuh0tKCan-Rx6=cr<t0kco+AQ{L^MHbDnOF;ZYa!mvJ!&;$^Fh@VDfFc
-n`bh-^o+HBr+IpeaOQg=00AEaP+t~_Ik0~}|)$ocO0#hu#M=6BnYSX&QQ{VF!YdX!c1%j<G;oB`(66(
-s(oC;*->dxpHks@W~qm;<bSGN-B(YUkE@vi!&?1V`xpQr~rpH4;HS2wdXvf>?Ot$`ap@KOSVPWf9y&x
-IJtj<O#y(jDDt1Tndy?Qjj4B*E}OIB7SsB|(rk`R3j50yn6!rvP!`muy0jw&<Mw(_DC@kvsS4J%+DK3
-7%P~cC*gn$cIS?vvk^h530z02Vs}`-7??=P)Xa51=3vpDLwbwh>Xy(Dxc)VyPGPqV%_bO;;n+l97ui}
-kg5M6l3b?(_TWCcqTV9&(Trb8T0*MelHc5sLWYjR&OxuVQ75OuZW@GhjTJ`k<|7PPF2wsMcIsr`4~nt
-kYzV{e&;T_y3RW9qfb2_jImmghhEBZv_TCH&dFh^)vX-ee0Zvx>Ql&dawTY%zN6S)OI-otQ0?4f|$Vf
-Y=l#D06idqYXwBQTpM;}?;fLBOl-(w&Xo(lAo&^FW1@@#5gxjXpWepT`$=ANX@jIk0M6I`D}9%u3$yF
-9%JlZ_|{wNQM9z*zZCnn$aAt!3WjJob7)OYg}`u)r$mz1l)4H<HZkE_Q&IVNou&XEW{U@WOJlDGi8O{
-lf7>oF`XR?Jb@&a=BTS+pJ@QBpNgLqA`tO1<7<6Rxez2!WJv39|FW^*nnvO=-o$99S9>TxIP^0d3Jew
-o#FO$#nJkXN{}`(E!DXmb(x&`9F;|wT9MT&McGhN3ZO4YDTz5cJBh+2R2OvkdIv>AKiQyuHuiU@d(Vw
-QJ0YtmW2dL;=Hic-zg%zn0Jah^oOP>>!VPQr8~AW&45CAfdAXh07O!AkT7sv=*V*7eijCA-dFvQ=s`{
-mm3r&7H5ODUJ<Sn_SXkV=dJ2^zqdvo%}d6f(%bW$!T$xLPHI;RpY?@;u<RL=g9xH_SHKV@tS<O+8e2c
-6_*%1*5Ii5D7zX}FqOmx);zkq=?<W@Kg(Z8s7QPJbD+vAU{r`u~^~{RdjNKR=13e?Zp#$BTT0YJa}KZ
-%Sn#M1j-}(lCU;NEoCL<e-f}2##PdN*;wX1p16|{T*zBq620{pMug3dytPp$|0+TA5@QHg26{(D@%S#
-_wD5O2_)H(iA_GLCLwtMrDOIhd{o1->`22>*{5lpJcz(ibfCLq3~ju_!ymym_|xbP9Y^1nKIFeXE$r}
-T%)*!C@6owM94YDj%%jirr$da4JVJErGhY@aKC=>#19qa(5gYGtbdQ9QKW{aM57<WjGQPmDl>u9)sft
-c?MuEg0U+S0ccd6d_qZtMi-%NZmL20>cbnqqo%Wb|+*5EE25?{G}7j{%uG>4!`Tzwh-1blWpra!^L7_
-`(HaC~?uSNsg3Oar7e8#Hep^6am;zh9NRfFsD1YVBq_)NU9U%K`b^_|*)*{r4g4$|Rooh!D9?#QJBLM
-<0+50}ed*4bDRk;jpi|VSjdsz@J^?pIsvGXV>^=mk50C8vn*{Tob?r%L4QMK8CX<YlyIcW|zqIpy3)N
-Av7IFi;a*rt`y46LP*0M;4Bsu#P`m!HIp9DZ%8%LW<k73vmrCEs8HopVeu)rwVF5t!sXp{S6z5WGM+r
-CrPi|XY#?}d*>HqlS%6~9(<vhOzNBs$)|{to>GqJ7;%M$(rqgiMZc~Njv7k&REY)6Tt$bjzRKvA4_(S
-0W=X7A+mlZD0s$K;{-NH-XW(8_-i~xm5!P$%8-{!Sx`0jnlxV6OL@YG)xGR_}YJ_CXTli2ICwx8XagF
-aH|@5i=(S`0YR<MJ7KS4h3ArQ)$NF)91IoF2mpZXD|bdSv4PaOxco?&i$}d9rfFi6w$~SeNQDQQpd(N
-ZdvE7N>+ZRjPYwfv;zCzs1!1`KILim6(C&?F_yYq}R?b{B<*~`n!7=pp=$L$*;?8funa(-dVI_i~GPB
-Nk<P|oW5_|1X9l+ECB1en?n2qah9yk%!MHYpP(kaM4J~f=0@rCce;kVM^!Hk8SvcIV?g@#yatQYhpxl
-|FDlENOYfS)DSxa*k?pt5j4RJ8dwH59`snCDNQM)8VN(zaad3sWHaweZ(eX1LMj0SHq8z?aG?Kjy<58
-R+n~GnXIW^1+<CCZ#-^YPaLS@>7SZ{j~RW<CM`1$2|Uc<h80`ahT)+ArMXf)1OMm17z5^X3|WH{cgr_
-D*8oq4+R-!#Mj0`-6c>%DO5L{|vjzj?Bd@QJ8OpU~=6oqnVs`=4?!@SA$@cYxss7t+H5IUzscnE8U&)
-pmG?mNm6g-wiMe_U*ymb^6^=qataP#rii!odzK+M=dz<!L`2*&-B{&>llH7d07fARKkhzt<Zg{0Gh<7
-o*5q3`34RxpYY81?4=1`GF0eayGt6YQ}@Jg3h|)Ytn%Zz@y!-*yPNIFl<op>m2z>h+3|@jO|0g00dXy
-_rWJD&33<##I<7-ELC2~i^@o*D!9rFM`Kn>5o3<_lgr$7F?O6_QC%)Y_7s^Kth0;{GWhM@urMDkf6A{
-P;(hA;n80!30EU)76<mdZnJ_CS#74}u$Ptd6S#8{fA_`XU+9L{Aa%**=>vQtUmCcy?5KR{=Pj-dzB_L
-by0+-|rOAbN<GB2)UFMLJ4xYMxKIbwt3*Yy8m&BW!s*;Q(YH%%liIQ`R>Z;Y!Wi-tN7P>lCQ!ntGia`
-IRy^E08GRA=8_>1k20E2~&E7_A)k+NIeUP$k6a4=ICm^-vp0RPzJ77zygEnoYSBoa?DJ$1ri1`np?+|
-wmz4|XCN;)YDwI4Uox7p#)emMUu%n=9F~Ol2r%?wk6_cp8ag^zFWMQ+R%BRJV#%@ztgm1uzf^h*xf+8
-BQzWUhxsM%uUSLqE(X|0Um4(F!#qHiIAs8E3Qc<$oBPU6_#$r%=sxPx11hPn1NZ5S=_qcXjOi0%-Ftb
-%;0L|3}rtXsthl$G$oBlE|bgcdHk3#Do!#cZ2|L5~u)3NOT(b8#t4D~no@ZYZW6(;_rb$;9Ng<?BABy
-f}<ArK=8lE5g4B%pmej$;J5|M?@Fn59Sm(~j<TU>Fex#zT-}i~#|EU|05$YsC({7GXb<)FZP4z<r@6?
-?7z_gCYD=0v>n}j}LNiMjX`R^rJYNgg^I{kv}Snq{P8Sj;RB{!r9TJ6@~{NApM9DA)o11<VWUqe**cz
-r8s(2TnO|hDn80H<Y!9+9b53^fRizDa0B9K2ef~R6On@wK>msnkU^7rTdTFXJTAmibCttge}oguZ(6)
-uS6%pxHot->w#J%dWt6~^x4^3xfjbl+kH=!01^a`gt2L>`aGwzb|7o;R_{DX?i<7&qCOD00?Y|v~-xm
-{;cifK4wW7ygaH8zGw&}`W)mi@*R{YW@_9s~Jk1iAVE7$o)mkIop>-?k31peqc{|a6Neg=#*-#VU_6C
-6C38>lQE=S9<IWwxzAMh=VRvt%^Zf@(I|^fEZBx3C+j@yr0oO|-`(Ahb0%6)+3+I3)F=1wA~ZvH-4pP
-=S-T((CKXJn8Zq)aSb-)AH?geI#n_1CuN|errb=u3kt#_rsnpZ`bX_pIK25-!R6UbVxVNr4TwZFU%G7
-9d`#`>KQvl@^%J<9`xVtMc2Zx3&vs%sIdqJ(P@#K+izAJSGO6tuBm;)-%Q{`B9w&F`K+I87`a{}7;rU
-2!WId)Lrg7)ByI-_kvK%jRtX$Bln5_AW9l(u*MZ$`T25is$=OmP25*}>YBoSnujjcl^)OC`>cZN{Xp5
-Y7F4QNX*4t#JvfGs>lycvw3SR2lWj=4R6$~njAW@y+z`jzG<#-bee4lX&??ZQap%JErjQL{fBZz=Vf0
-`1#ogq(~7-+eMPp7^jR7sb4YXklRhk}u8N)_f`SN_~{^$j+Z6klYu@wP3T@4Z)q+;%NG^p)FPyhQn=s
-pAQX&J?kK8u7W(SCD>huA9(}4D*eD=}wmR3d}kuHn{_1+f2zdT{wAS&xT9UPsijbx$9gsO#z3YJXgt2
-XV0vzgkS_l*WP*QWh}iq-RQ=II-Fr}8`=Sa)v(Ms;ivSPk-_2>tDEwGm{S$>YRcCXWUfU#J=K5gw`QY
-9xvt>dYRhrVY^3JAy@^;)EcXpw{7r$*LE7{E`53H`a&letTar!4LE?gO{2^WhzRMr{5ndEFC!>)YH4B
-sxGz}--1i<Of*OPh*n2wC#T6H@N-3>;17jA-eV^gtVt4Z7*jE2kbS<sAGvZAG(^w(o9>_b_~y(=aO*D
-icrC6u(D>=}7K_2%kYkBfAH+?1^Yq9JFGA8X#-Lp8a7dF5ju_V=<w&Imx;r6b7hj&C}`SGt#|j8>(vq
-4!MvuxX}pBc&5rnPy1(!re0XoZ1wY5YW=p&q6f<<joY$rLy7cNe8D!@C}b?;L{`Nlv|0;@Ia6n6Jtx2
-hHbP^W8Vqol2k^HNGf@cO`tT^m<N|t(@rGhiP^Ig6EteZikmI(?uBnRwx&JAJD<GNzWb)LN0h^B_NE<
-g*8Y|PRz@V6cPRxcbwrga&^06?T<c^@NU#Y^*cE$Rwii2`RxUt2rxgTnjM^ZVx^sr)0pN*^;<LDAD44
-3Pk8zEYa;33^+Jb0(?f15E0TJ^dc4AE5C@zN5nSyRl;zq6l)KX{QX(8Fm*gsrB8cwzs&Tu*x;Img`w5
-r}zEW__&<j)&(Lh0*d1_e1;M&LauKJ$pyWB}J&wY#CX$X!Y1p?lrS0xXn!G+~^`(OE|MHJotQyP{s^k
-$&eLzj2}#ktp0kCKxin6<63NrB$ZL@l{4nD)F2u<ORi2`MMR|&0s74td_<Lf&=O8T3AyFBAPG8375nq
-y8u<SaA5&=7Y(CsX0-V4PN|iO`UiNCXW9QXy!g-7`aNF!gLQtBS%eV~LP!`PU=X4xl!SJih~d=!FNz`
-*MPLLBA?SCBG~vNtKO~B%k5FWGAh|3#&>D2;D;=Y$;14?m-r*MX{etj^n;C~6N<93Tf)#$a{U6#4P8@
-aM9dBmfLF7DEjSrGMu^$Kg0b)e6gJF+@$69Fg0fG1jXlBQ$W}mh>2tH_~=x0*b7adFF^C<eEs7A>FGW
-Wgq=iuQ{SWe(W$vHf-ntw{9sSYAd@gE|MC%uBjeL71bFYZKWrO&DI?}#*CP!#ZQ(BgrjfPaG)4-^G_1
-ET~3RR4NraR-ZknpylaPz?MVw0K-5@DI@9Z!Qz~(RF_1`Tv0C9}a>UKC|WlNT&pcEc5M<LAZmBVVUkQ
-m<C%M5=p1|s-GdzL#nwK?Kp&x=|lsb(ekow@60K?E(ac{cDe?c;m7vUCUaBY^&#61*T|I%&TrjKKVO^
-09^KQH+48xp>?-wsruj4A7eD=lx^Lj9(Ow{x4CX$76TX2ForacHtJ><v1I&SMCzzkNZ*JLHdmP=AbVb
-7f&fi&WtDBi&L<c{ica;IQ?e#PYp?=7)qZ^W$x(gv@ef>(&yD{kJa+Ksn-|Eo;S=Hcrr4__VkQEC={r
-DE$0aFWJl&|BFTT-&t+%0{0FN%E0{o<+Dk@*ZJZM};j=t5pt<bR#&_=Qtwm3g-t)L;MO{QAGcetwlz`
-G5Y$M87fE|9FwFmiiB#^&9()A~*q|But?c3{yCYk|2puAPhqv9XyI4NQyv-?^<XWJS-<n9CkYSGRp=0
-iAp{JIQ}6ChDYZV_9akGziXj)OT2$$_(xU+Jb3-PdEE_q2p!Tbd%R6$M>#1950YY<9_n;qblA-(`q99
-{^l%aAXI5bhANCykG!7)6=`~>Z5!<IeW}7%Djk_Z_hALv8{(|_ZLBa7+Xu?1Bp6t^uKp-C>82BghPX`
-_{=rOw4Pk$L*tyE<#%D%#A7(13_!=7@mrKN9JYSQd*d=04V&tt0>H8SC&ol_VcxaoFV@i8L*84^uT`;
-kG_RA=7!$}Q|g;ODs~c6d)-zj}~69{kN?Uq%kDyZt<vjUSt;3J(w9Z1qEP)NOiGZDZD;$LG}k>X`vQI
-<>!gW`HWxN1wp2>5E@qs6E_>IU}d}ml|LoN{zCCXV<C@L|U)+8=%pRSO$c#uXa3oIZ3@YyP0mh`|Xh>
-jqxVa*<jbGQ}r_$7noVr&#75%c;&oeTopr&RrmJ-__KWWZ$_>CdRCiY%_$BEz)P3u>^v&b`*l*untY(
-PtJ04P%RVobic%k22<EiPJFH}Ias9mHJRaR>f@>G{;sN#T;kYZv5&HgtgbC$&S>U&FO<%K=%Xlfs+dX
-o}up;ZsnqV}dbJ}~hX)6R`dg|>FNar`&p~ipNY+?T!W()gEW()g`oF`0>7(u}xwSR#aNWd_TlORr!Aa
-v+_QYdk>exlzsThs?h?jL*TLu`i9BgJ<#NfJjA4<V04-_chIe}+VTzhr&T6VaonjDSZuIz$hmbebJnQ
-M)<IK1bNGUXmQjP$>RkQb)%_VfX{H1%1lg(WiL6pAV88X-zQul*QA-93tpp{C2o|NMU6M6*0p;_!Bz1
-o|4a~)(|_gml=MrCXaeM_~~Dz_H+GHU@0D{$k6)5Z23YXqpbgWK_13-sS;<60$=8D$+iE;Y(fA3HCw+
-swZCq*zQelyHR;*}9ld!^loy?QJ>iR!OkStSCB$CBEuoG9@**wQn8B4B8urk-P2=iepy%9ggPFh(_ZV
-3*unk2-h6LZ{?GfJ-J2c-$;Gh{<r$C{<&8}{(0<%PpdkR(?W}VyGc90azBT#<M)BG(|_8Y#}E%kd#em
-@!VQJDOrMOq>SA2*|e>d$=ve2;Za>u%4F%?l>|<&`%K8f56{42Nh3T5AfCfp)tx*8S>EZ4O`%me~1=>
-x2nbLRywf;pykn9487?LEBS53HwcXe<XoKtincFI;kbB@?drOwK$y)Eb~hCu+WoPOrX|qJz4K9=xO9H
-+d*pz!|8vLblAh+{bv()N!tC&5Pf=0zWbzaY~jCJ=&L>a^F@Bk;{ibg1i#yp2}Xw<+CyIOBMc0E3LZP
-YBI9E?5C(o?TIdiA-T@f$eVx68JPZpS9nB*cbg1oN)DgxW&}_FqAJO6%JZ#q?-14F89DO3`9vA<pFD3
-qj#Nbh=!9HUpBIH;F`AE1NlpFGp1jLZTj;7F2EBZ*d9L6zAjy9DY$L(hE=#0+}($Q{)k4(X*4<7z=es
-yvXb)faD)#GWoEcNgAV20n2lXbxU)qo>5pIrwr3*R&H;Nq@FWO)3JF2Za7{Zg%QR(>`e94p(&MJRyX@
-YElMOY82x<<Y-mb#O<2Yc7w5j<55fcdMs;T2OLOZ9Y~{Lcf?oY5Um}&i8L-^4ayT2O&LF!PP+jE`ZX-
-Y=F3A^x$qbak~^zYc^5E4=Vd*XL_E?Kf0t}v}O)T!0Tsx#r|TJzZ(X{{G749(Z`FOKiDrUP;`AX#tn#
-X<LC+95UEz}q@|z?H`S`_brjAUH^%YJRnw9#9`J>vhFD2AN$!|66+@B7JLG-`q}mro9iA5Gl`0b+pSj
-`Egc&5jv5&2k%+gD|og!7!A@l^X3vwA(Qn{X{YO4w1=>f||rZJt*4{Z}h7<z+}yz=4O%I`&x7b%j;a(
-)`O^oH6)W#?N>_p5Y%KpPt@Y9g$FB4301s!hS*P7HV*`s$|F)0?K+rAk#qu`3wDTqPnSl)xG@A1{8&h
-NF0HESYz%CP1wg?u&WY-ZGib!24`Fp(}cCgSs_CP3Rc%=9U^O9OpH(wR?S-6!UfpTkwRMMZ*oiEc~=R
-jcB%7{xNu0mepWmm1=Q`dFX=2%X>L1upbiA&_E-lQFm3I76*g6*NC4q62KjTOq{DkxTVX{0sH7T1QXc
-}LFD(nO6W2vg<i`RmcqD8Vk&obRm-YP->4;$rcVG`zV#qsD-qK$PTm$`#5~{V^&Ja*p-!`qJhm$Z+cg
-cb?@AWBC+V$3Q~Ah1AlN3}fJm*0I2PUV>Nancdk9M`@`D?L&oQqFyUicktc{-bK;fx8t<~)4B39o@?T
-WkQ=1l;zb>WkN@NNrJexTLBR1D$H1#->sC=}$q$vI)QQARTB_d10MEGZJ_9Gu5=6%%^`Jg42B_u(2m3
->$LS9MP!PA(jw(p5(%(H-{wA*U3}g6FdO^`rty-8L~mFoAk9-_xM^|3GCV@fTXRC`#oK$&zN(bR^>Kf
-?5pJEDACe9UOw%PIVbo@PeTOSL5zdN&s+Q;O)P(*rc02)b@P*_A)7%n%ar38D5pacvfsh{l*7Ka*@+I
-{*m*6Pxu1LBT6X2Cstj4(p2~AK1xAGg_w2GIXL~AN-8<e)u4A$ndox!|(Al>wr7th=w}^qXGYLq2hWG
-;VR4mFL2grZ>@ZDaR{ZmyCH}@hw>;;s@E6E@y8rhBFxgD68V`tpQdbC`6AP)@rH6bTEX1Pi>cTDBy12
-$*$JBM7Sew&j`lL~vMb8=feaqCKrYOWcjPpX{HegT~CG&NLL8hqhe|K_?$l1X;lae>#;ryHhH+nvAok
-L5HE0fd|)Qc=Q?R0Zn=F+O9=02n?@qa|!<mUxy78YF?NgnBX|p*&7GkG_KFskBSipsmvlTj6S69d^~*
-8o;5gAR5TVh)xpub%OJm(AR61HL?~w!mHM9jorCoe?|6KwYi=gDzbaYrmGlZb4$5ml;&<v0A+#`zf4b
-PBfRcCPf2uT1kE`_i=t>APbo`kNTqASkVqJ+hq*x!v!iLdbMbV(Hv!0P%hI#$jzCk3$}UlqO7exu>(F
-8gce)$VW|+$K<O#yO3MIl<nm<-ag)ld$VZbwB2qI*k9h`_O0VkzYG($HXlatY1?5G~yY2&iz9vT!*Ig
-0lo(eGW2dJXy>QQ=@=0~E>-(mn3>VE(Vipx;M3y!#8_`8UYxFD>)Oxa&Vle2cnv(1m=rh!G!^ity7ym
-Xb#^SOy&;6GvkkdBk?ar`2r-O?xmG{h%8dKlms_dLW-8ri_kwZ~uGWX~#LlL6<qwS5bNZFPQqQog7d5
-VTug>41J)W1IMB9LCm4BPc;NTqQ*nw;sc>}M73kD9de}~7R(-5!XJe{_>clTwoo79P5fcI98J&3aa!1
-)7BPhQgSyIJqpo}PebnXuOVm}*^86KbF@KD@OxOPp^7=Yy@|Y@lOhdMLOs$%u>30Rx>X(hPS{0!xe5-
-DZslP5AaE$vo^49|c-yC^SY`Xh8r&1FB1J8bk&i0_yEg1{=Dt&we?$Ymc)P5GY$Ug!X>_^~YcOEF2oX
-V`Ot!=P?Jy?dWmu^Jpwnm}LL$)UDMduVMU+_ZmE=6c7*jT?D+?HjApxk?~c-AKPmz<xdjs=|3M@z-N>
-mb|CBY56|(jFnhxyykIx!kFE!nKc3ad8fHtW2$7Nv+*^j))etiH;;da6U7>4^{Sjigq76@8)s<3(|Pp
-Iw4zvJ~uRxFtJDFDTN(L?K1SE2P5}^x-2}3_rQ>8X}J6B3x_evDx8VOlrVFc7^Km&<(pJ0{IYH<r@uR
-yONN6YOr|`)C9li*3Ly>9%Z0%)UV`49akdo?@T#=wGc(l)I+ab{8HA3jm}vJ{?t1djf-?od*}}APe0r
-8%1XP&x8pTod&O-IHGpt42-e&VwP6n4O<k@t+3PH3~J3B=rv%2OEGPvFbkYrD(vao<66m9PWQ%qky{?
-=UG+maOZQ{0fVVurJMADrCr!FS20o*r|z*T}H6!v+@1Uqd{zfO8PJV1!*dr^{J9%%vJdL6s-f>oQmC0
-&N;6R02=j_CP#fgCdJMF7QdGV@2cn20b9o_1immsaS*A-Owfkst{<jm2oXZQefMrojPDb%DRhm68;Ru
-xSyW%^HTUv_FYRN0KFwN?`~lMy_=h+r~7M3bZ>(j&)t%l8c4rS#3S`^TCC%~4VY3`au@esY;57@V7LM
-OLeVqvR_}T5THA;w%?0(*7vC^Z>%LW%o_U)7IWc=ADZb570O#%d8I9j0W^edF%dFp(Hu;R_uzZi*>q^
-eiGbethHTm;s&V3Q?maNOm9WZ?)!re+)gGtsJ*hON|lL<rZQO9+ZfK;J+FrQ?kx(S1Vuq7>1%n(ELDC
-BE&=5g6hAx-c3)eX-rUJe~7AR@9wH|EqokQV?anSN)o$J1(GF<6Qi_Ew^@EdqfI_;dPV3hwO0VPv~bV
-`F;2(}JC3yuFQSYdE3>ywS4BK#v@*Wi#2TnvXWYoP#H3-Fa`0l-c*OW5W98#l%&WRSv>K^vn*omX93P
-W`X%;FPDrql_+d3v=TwErpD4DK4y*cu1#V-X)QWaK{XIbhg`Y)`pzohtz*V=iDYF3*r%qtyyOd}<iC@
-Fe0ApQOkUu}#rB^r<qka+hh2DwMXf8&la@i-D~$V%zrB=a2B*N=_EF1eMT$lpQg6i<cj|1U538<o>XS
-u;g2E4%ttYW!c0Fl5+18+dEwouoiE%v+1h76d(=rWxHlAe)b|3jG7^!F)+j`Vu;q~IXE2a~2`7CRKjz
-|<gi4I%6?C^GbNFi`(a0zcX^qwl5S=Lt+G-EWl!(qUN!sX-*5Ahc2r=T5h2s;Vq)9qoKOQ3ESP%`xN3
-Zxgx$ZONM!TzOuPFx`b3b)czkrNO&y{+`oU$@YE*l!_~ONY5zdY(;JI4cDYT2m4b+(hm9h(RSa-NSrM
-1j)-Ky<*Rsf#=W5nmQT=J)w76rUs4MPg#o3aD)VSCT9*`#{lu#yzAeY!7c5u<_n>NeY9;l#N}5xl+S2
-V{Xb9m24nrL9lxTgKi=s#m<oX@l7t};K`9hRP#B>=3_j9Z<e?~llL&>v-_;R_kfYy>_|)unY?OYAk_q
-xtiX0FMrH+QK{U=6!I>~;J=gL0%i0MJpKtCcY=%=WNVLy@R(YcR*W`7-$$LVMELwpoMk?<!N`%yz$a#
-SJr<5JNvt}FR4M9AoXSVxf*{G|NTqxe94#)o0x@r^{s0f<jcVL#Zu;|{&{lQ<gKz$1B=Vh05#O#kjY3
-4_fAHmCP5$EjA{f{s7w?+LPUjPgAl0c($RzcyRR)(%mk##|Fm166Bx<zG|e3nm{Z4EQo~+sF-g4`A-@
->ch>i1WP{CMt^2`7zd#PR_z^JRnqo_<gtfjzu8zZ%HKUB;M-IBD`)g~WB@vc>CzikQxK<J$U9~FzOp`
-@(=9-oq|h20K#cjZ+xhv7<F0`y!6|Z+Od1&D#V?L%o4EmzTQC++@Kz2Alol<qvHl~wR|@rby&T|_7BT
-zU&aI}r<46Y`jM9tK$$DRr(cYxF<VVkIGTtGtFx{sbe3ypzYGnQc$z~$&0Sj!<o2=y}dnMcC0k5i3Lh
-Rzuml%pV{Y*F2+-pcPDpH${L#{oYKzMu9bUM9mAO``F`{2(p3a+IcC#)KI_Wr&!2v1uctZE?Z1?L=cQ
-fku2=n+k_m6ZRNy7yXo6x+H5?|F*4><;z$@oq=-1s;Sz!kaiZc#jMq%+oh0O}WfnRXfh#r#m7uQn^0N
-68f~}SaZ%XM()j*t(uIcxtbMVLm>OYhHJ`ZcgR<jsK2vTvO;FxOCl*p9gE3c{(zOhZPAeRw)gaUcwD-
-iQQUcP7vLS_c)boaSLw(VOg1cO7z*iei?|f_YdJMrC$L~DBr<to;a59En<;7As%P%mGHMlYhlW1QRFD
-S)Ih!}m4#2ZLV<=&sO1^vLK}BA4BQ!H>Q_gk`otmky+%<tFO}_@A3Z(MpdO^<JAWZYc3v|m<t9Z-LJF
-(H0ZA9u#XDj}0lT)36c$50%>q4;PI=O5y^Rf*jC;$C^@}oA7JFsJlMM?*XDfq1Qm>deP?K6kunk?zDI
-AgZnsL0LNS|UFsEXkwg8)(VZ?%rJ@JXkEdbF!GG>(Ts`%GEMW;*>BJVG}zV)N~Tu<T=?Oy5*h=2MO2v
-4cCE6a$lK!h5q2u_0zJ@j}X`IWdIx_ob}tx-rv(ho=(P;bgoui^*;DFei95aHT(s6G$UooK^T}=uWE4
-SUa9td)s*JeJYWL9b63e>#QJ@y@RI|p+StxAK-?>$3r3^WGp^9-k~28_W$a&xfn=#VbFvGY_m^vxkky
-S1HEau@({QQDSvxJ%G>^c=d~2loj0WOS6y-2psjF~vGqo*=B#rAGLcs;6Tnz}r9m;{bS%e`5;%f5lp5
-~H9fu4!)bCd+WtGZ;;r{@qKPtSh5Z+8e1TN0UIgW5ch%m&A{WjVOn5fx+!*3{K9I4E$M1LM@YVOWc@n
-m&-O+#bb~e0Q(bq_Lvzy3P&it#tzifnkFKK?&c{o1-9LU<RfNc!>Y5j4c(_q*#}#J;#QAGUWL_ULZy*
-q53I2Ed_6p<tAX2<LB9QD&fIbMAK}bhYc|Ed+?L{MtT?8Op>=pFTq`5cJTS~!BTS`)BcMiJh)W1`4n!
-qEuf`$>tH1Kx;OUa3AAt_C?kf=)Jnxkvt7Hp8ri2}y*}0&Tk5j9(y_gI{lhOTXMNsZ%~Qf>r10x;K9v
-%HRbgn#PKNm2*-0RyJi}$6jp->&Dmx$oe9}R>oygaKs@7e6`Ney4G7(Zw?deS9A<#MP^`v?XvN|_e(y
-MA{wh$R8LAgn<l(=tZbggqn)=?>^o^Q&?eYQHyj1EI*+#wi%1fPq~7t+HVRV<yci@hb!<zz^stM*sYO
-r%XC-==?JE25ML`9A<ww<&I`WJfm1cz^vvZ1wlf{WHA!$$5W`uwa_p!7V{yD2<{7P5lUAq2wp0g&$?R
-{L@}Qf3&fWzS#JvC&C}6`6NAhWPg&=+7CZ+N$>$>cC1EIA3ZzlQ%TGZA*e%o8$SRL@-d-5s8#7<=8*r
-)v1<oJ2aNiZ5f8!bPZtG3932@n{9*CqM*~+1ADOm&5QdJt8AW_DSkcF8HTf6$Y2u*qgJ+gvpAsZ>v}G
-WFsqQL<NB;yw{19PnP)Pk7gr)yOgms_QZ<biA_<Mxq$Zi!&ZLNrU8=&Spss0_xN?>i%)&pe$2h952V9
-o0PWLChBruBDcbs(*uSw8#`X(7tPrXE7|CWQ3G?fdw2vez4SCxNWF51RGV>X>`XoA`RlDN=F~@=`>OH
-|m$`R%G_BsL)5(yM$bxLjDN)AQLidpO~})CL2S<$P;o!X9zWJMnq7|g;iCETVGd!v?yilGpp=Qb961q
-nY-K!oHJk+KP98qT0oo*@_IkP9?0<&1j?7lS6<2FDyp%lVj6gprAzqp)fbRP75DABug}~gnJ8FCC&v^
-4Ft9Ir#qB#oB#IGOu_Rfwb=rm^+IkCC{#@x-fnMHez(;JoBe0~70xHzEXz8>BH376HWPy*%DKZHXVU1
-yUtB*D=bmH{VSq(pD1s+aTkUj5KcV5Eq9-LmeH1F%R#G~&S5S#(M3+9+n)4i5u2#!5dAGTRcf*0Bf{t
-%{`!y`-UwiN3_qmnwzdlvh9i<6IbTLF5#EDeL$2=NdcFV=ED;0fe;SL-5d(Lj%|M|p}jgzRHF;ohlgZ
-x~nNu~DuUx1wD@TGsON@?~*~v1h$ndn81dM1so)a^~j&YeoA`jB9qYJjz+)5sn7@Ik=21TCd?{hX9h-
-eliZpTSDm21>Y6#Ji`i{=$GD7{8i7-B^x=x%~+Pl=`q2OBtEy~aY3BbF!w6~UL?vc*G$D)=JF1bpQz$
-9OmsD~^@7zJozwTw-0^HO+;U}zS9i2iA9q*MgL4`xc)$ZuQGN1AvR(y&9a#JyA}!!&4LBGo7yVfE#@N
-S6D8AbB?KKlOQ&hFzAuZrn3EX`(5^@4Hp0f}N*vo-a`s7?&*a(ZJl3itehUY%;-h{#=Ztw`ZMS+bP7?
-FFbh<VF+XI7-OGlKe;xV4Nl$D$q+)OkdGdhQJmRa~6K&QT3*)G9@I>7HJ$>;k;WkGXSU>J!OyMeQ1Cn
-DCYOi0^F4mp(ITplF$AYr9~?rW@0h@iRS#@|dic=v>f%9r3Cm`Bs8%a78z2YlFdU)kkR*o@cfX%UJVC
-w49!9Z7TFl7EbVb_UUx+^%;^W325g|Py@D<^G61v*WrG>o+ox$#3ar%pR&-aICccs6K5LEg!N_CQ?$J
-(Q4(QYv}X_K%GO}d&$a95wt~<3O)LbJ^O>*{mVEybr*RWK71>M5Y+DR%(M=J{)Js9woR(vJ4tP36O;z
-S$cLs{HYXBie{}RfRDyPX(x#c;pL|*cVg;(B>un_TEaS4~eTka~Rl|2re;uc3)P$%}UFF!&t0{KlgB^
->r}Q&8$>XWzEAzKe4(?&5Wkv}zk_IH@GQiRZ9%2F86uIq|#_)iobK$WmY8C+nRxZ#m0kltBYrdJEKV`
-EtH<wzyCdirGz0!gqgK+>!yL$VeYxdoi{=iNwckJH5G3wzHA-Ls~Q)siG1XPZ#&hT@i~*opl7C7+4WC
-M>%}{1}G<kbAKM#>vHd7^K7y_lr%#UUULfXCIj_aI?5r&eR}BY5{)BuKQY-U`P)cK=*KS%_7BSW3AO2
-ee9_1MdhGvoh+Y2I(Uodt*)NCUW%lI<|J7$B*k(o4{*N(xbp!Z+B>(3x2n5l;{Qk`U@k_qrs_4t*w=D
-f-8nR#ReY^ev$^CzAZr_mN-=5d+xm?(e2x$~YeuN6K_$U)5^vB_gINVd9<N#1m_CaLm(JglL*+)mYF-
-Crf3aQT-2>G!H_?VlZ(Sg_q;=}h!KPA-cpjhoFEsl???vRe$QQgmkpfL2qK=^d_?r`<U4CcqlM>iRE@
-U!+y>~NL*u(WdcxabZzj}ABFNFeSL!m<N=?l5o%tMI3{ZJ*Q8e0zu_{}n0}ZU-t{zZ3igtG#OKpY%G1
-52644hsG`7;4X<Z<9zdM<sElQzd))%5!xwOv1Pwl_f0%lhV?eIzKURaI0Ss5AK_Ez8}C?h_ho(_)1y4
-<Ye%Cj`t3xGD{IwaR*h$HMfmk5z}LGR-CbRbD#gCtg(8VwBmdEc91ACiQ^W{9WJgOb{{<N`i}o=0yB{
-|{YOUXpUYqph9$wly@XbezV1@DhVkWL|(65$dd^77CgYHmt1$5hizN7(}LuL6Ggg;~TpC8zdo)_>>9@
-vkb7w}IW*pHqU@J}AtkDeFs?;hCUmiAX>X}}k^G>#}Q;fmmx7M;|Puo?D&#!u~4xrX^VBb|8l<jW0wM
-_d-uTVMq0!^(pJ25rD}up}A7tM)#xRRN;K(i_p8V;I571}*Qq7iGC?lH8Hv&D}FP>V~V|`I{`~F06Qm
-W}yTP+oi9Fi+eb)3~_Cl6xpm!FI<T{JHaOHlH^QC<bHRB;9$RU&V{FydU8Qa5113x8NhRdb6M1{w!ci
-9(XAebQ5&}izF41Ag6)Q<5S|`fhbvbEjA2#?jdylqNe~7c_>|n<hJU$+kC%Y0wsb~`SANIi0eZ9D<@H
-!hoJ>!ndtJ2k(#8or-`E#{J;r{#-yoolym!znIwn>_c(i7M6;g+0eOAro_ibT+R?cMWpZOmAzAfyTR3
-QPe<U7w2GIC`nR*<}5&)sulbl_)hX<106?GPcEO;vS}+vThYf%JHF6&_Z;X1;`*Nt-tisO{!8-&ER0I
-qhkIPmwY%?wNEXJPNdJy}vxQV&v%MdF{lO@M*cULLF9bVKhr*zK4L><QoB|_3SXBq59ScT5wlK;4>(Z
-iZNZ5o01ZxB7Iv<m&l0_-8%cjlYa5=fJn$2fO8$$w?<^e7gg`Ab~hOG8&l%YK6N~dJi)8CipdjxB@uN
-?If1y|rR2rxSNn{;H_QZjW@`HIUQ!?za~q2xl$?~%?evze(K`5?to3r8Q>4%q3jPXcQoaxNd*a&x({5
-5H?>psdlTfM+!h-Q)U580)ijAf7-QS@*{y4+*a?P-Z5@VxC|C3VM-;AjO2mj~69!CCqfyn=RllzBAWS
-`h?p$HD+*oWUk!88gH7!AW13==SVB&~i}6(l|$4C#mJO&x~pM<wt>9Y^CMsPEyQramN|^j~rEWBDQI5
-D40V2nHRXg5IG5ek7A%<alu~eBdKhm6Jztk&2F1`GdK*--`SRI)RYmcF=)`K6x|jV3K3_p<s?DN5POF
-4>(1BnB>IA{4^yGO5*;b{f)#Q$#M9@WuiU~_4|<-evlgX`Q?A<bIP3#s^a~-Or_4K(IvB*PpZn%IrC)
-ynMnTLz64$1-$mWO6Lf)p7j^%A&=uAr=>9RZ{~eUF?I(W=x=-NWMctnUT}NBKv5)}GR+cL-z*_BWdVA
-joHT2uqj#7@XxrnJBctQlT$Q+ED56cJ^<Niw;?efJFV$!T)J{R9~&1pOIoFd(E%BB1MaHqK2!Nmnx+7
-J<ki+{9<!JB69;OUzn`o`RYwJAO-OBMU4n;dTkIMg$heao9l<vZzGBJ_-6Kd4nCdWz-dU|B8SXzgnA{
-qDaKrw$j2$O|6<BJTgvlOlY-7?gbo3@)$PEOKNH+4T$m@#u(Vt%==(W(6>a!mx^AuPH~wj!0tNW)QHO
-hlLWIZ)RM1t&EX1m*?`z3|@Y}g)tlqk`#nDXJJQxU5)-8@fhqRVc;zE`p|l!H#8DCd0dXyq|B!J6Yf)
-jJoo<Mn*6g0U?Hb7y@J(N2H1_%6!mM5(SN}G1U@}Rm$b&0S6XL{@@PH&ab=&5Ahv>YKL3IH$umg8Xp+
-Hcl87T$mjg_iN?z?X6v^-{%V_ytBnL9CN}5@E6<KNu#aZmhZ|3cjV+v|uLxSM5?;f)<dwA~yrJYElKP
-X@}^cD1UPMJ(RFs$RQCDnB0n9$|>{G3bXRfXdkvfk<zuaQ-x36uW5wz0@DpC;Jr)jkA>%c_r#6)oyNo
-g6<|zW=Cg{GVRrySDLfF7P|MI*7z^9HD+}FM%B?{yhxr3oi0W`jej`0SbNWrLm7ibbRbRDR>|JVF1WJ
-bflwh5r1t3i9T$oBcLE3uWRCnDN*v#`=CDTr2IIHLVwm4l6>UiK3);nCq5lsbNFGJw@(kkzS{j920$M
-pykkrK@w(o(q;T@lKFJPUWaz`e+UIoi;^Lp}^TCh$%c4bn1OW8Anus6?FYSlEygcjup&Gygb}h^rhka
-|r?G2=S#GO!>-M$=q_>Pyw;oq&Oz!!;)@1}4(&n&#z9D2R3r-<j94S#cwP!9J9Oyjj<W4L_wgLSh2TD
-`Bu-v;YHPw}s22>jI)|7wQ7F~z^H3e5Yy_tpiT%2~H}SqDOa!61i@o35gX5)Cx?MI|o#QsO(FIg7*Dj
-U41EdPx4B=XjpDI-~>brBT)ENuw_JxB#~Du$}(JlNFf_sL;+?o8Gd0t4G{WwcgIk0zaS2{>DLhBh`Jm
-(kORBmAC9&ed65X02p2yS79}0G_B`~pHZCGC-HQ;(L}j6PyuuPz2sVZBqc=#K>~SjIrnTv!#*vPSv&x
-;48sd=o~36Y!9=A%g}!F>r6RggkE_)S{kQ7nuN527N#izh6QW^}Zm$@n5Op&*KzNuSO3hvW7FXY8TQ8
-s=1D0l52lA5ggxlaWXLX)=jYBS5T#`s`Uel}Zp?W1b#R!zkES*p**nz-CF}@{{QgJ7fIMJ_46t@vv*H
-AFdZG~3g=~|v9aXYsToj>;7up+&0Kt!W3pIh9%pIO5SGt^t;d;R2zcZ!uPc!+xn_n5FLW{EE-U2jHcU
-G7<<pBis_-bWx(DYft%BGIJy<-nt>-Jcg{5+(A=;5{qy-k9k*3tq`8!5MR|Or>q;yV_ajBI@)4u=_yj
-1cELIDD{+kTc#H|G_kQB;(Q$9GRN+MVmgoX#+>>ym+~CBR5czwcbp&(xeMIX+t^ZCrr++^$tbQE#ilB
-DGu`fW9-pP-toz2lOX#AfA?Wrl$HFZppO5R}jSF!31`==or7bypc7!vDDtWkx7>EaA{ms7*(dHe!<ez
-P<r3n(xcm-?MV1?4E&Rl>oej@k50@>$%-;UqN%l7xJCD=duJ7FNUe;BpFksdKVFT#6{o@}t%r}a;YaN
-i3Z0K@sx)V*IN_0EdA^KLmSJdjC9=3CZV<87)~@GV#ChG(;cZySs@6YW$8^d9``8rwitgQK(D46LG`S
-u!xnT6c22!=a!P=03dXd^CpC?P?g2vgG-MuulvwM$oyP?C1WG0rhnoosL@{O#HN`Hxw;BO@K~>an7?F
-H`%abbd?RU<U9A82A3;g^rvE9cUTf*cSr;XR&i%Q@a-T0^KkBv*o72mbj|C5_fki*95P4(en^lB;>ex
-!$_qBt51p=*u`~Ewfg3ItTLHz?#ze1}s(kZpzgI`JGs%+rQ`m2d&`>YO5Za+oa-Zd2yw)l(-^SP@g=t
-_>23;^|dtHciha>kCeig9xR#<|BuN86C$=qO^kyrgpyN21VXkVC<dFMM@_mNDe09TRZ9ZIgZD5$d`U>
-6Kj{1-hIVsxr1i_lKb9J3X(f6JDQ@rVR*@9P;e9l70v@}dKHx26}RTyH$bvJasm+HOS3W>N-K-+{i2N
-fDK-daih8T?jRN=jY%S+KMFzsd0H^0QkneYa}ZhOk|R0N`ij(n>Y~*b-i@qnZ}7rz|I45KBY?Laq3Jb
-wtp*EL#Nf1I)wnk+!=0>T%-*}1}oGa$qm@=mZt(Uv4L_~!xQ_~voZ0@#UVS=OYj?*GOjbr0eX6e0N%%
-Mh`W+kqQwW=;nV~<-|^sP)qZa`7bZ<0c{>FIfezE(hF|voT++l;zlgI5ZPtvhdtWsN06HL36a6ArTbG
-T$SkeESAQ;ZuXgyw_aPsA!;mbe2$oQf4_S>tmRa;cQe0~hI*;pN~@Vx4Nd1uGZe*M4nKbJgtXZ@EUII
-q6mv)w`1FU)^^j?4b*50LNwR}=pRGyfM(`uDc<1af34XqZGW>W5VQG&<nh4hau+CFGN9Ko8KG6Gz?Ra
-E(X*1>;91;;>czv940`Q6$;Vz&@hH>Bqw!`qVEDUyG0H@!?d49@29#@)1k=kje6&lE&ymC;*NRpo?M$
-cK*V|-$7`a9QlevRPRG9OQ{2j?jtesFNiv<n<MH-ZtS;&$m6j6Env~{?g;cF@wCI$zohC5=Yw57pT1#
-LnNctwtc;@gA#sdjhu?Ti0G~vKs4V=4UHegc)7VCwB1BvRThujS_=*x2!PTyb(~OR@Z`56m<sxtCfym
-<bLzXs`da*~^QIW%TpVK4$_J1Mg-}_kHEsy0)KNO*SWF5R8zwG<+rT`3!6#EKWjui1XuGiJI`CdF<T=
-DEWuu+)a(nhGc#t8n1R@VNuwT=*>04%8`V$X#XQ7`v941wPZgLe}KfB$Q-if(`RXNC@GlpQgn8ZUk*Y
-sc7*mW%I$nj$TKK+BF(3%3KueiA$LEEyjD3jA}aInZp)Uy~KQu)|?|u`KwT0^acq(ubm1b1dzsIq~wy
-gNn3s3ZrX>Z~r%`D+Q#TJM9ll=#i%Q_ICD@*2rSn%iv{~T0HjP-_!^2KYS7*upj(N<?}o4+Sk!c^cA<
-ig8ltR{$mV%qi_&;zrj*wiM0fjwIusrMc6}_vLl3_lI8y32L0fi5c9l@fQr%)?h0<ov-i4p0Ep?~))>
-zVNS0g2@Sp<mj|>GPq9Qilkb1a*>1iG&93^Y_{J`*ekJPvA!Cb@#*qDISwQxLWX+=vx9bV-JD*3!6%U
-#}DJE*LE*P{rQVy#PCfX!K@hl+U(aF;!BvFb_`z?$;j6PJj}WL7wXuN&8~kCU)+x>c~Tq@6It+xH%)b
-4uG~rI6swqN%w(rKeRQW@-a)N59dc3CC6!?%^;pXz=1|F9o;jC9em#H$Z4{pXGMbih{Fk_cXgx@3h^i
-Y%EfPfbvQS(=9&7>Ycm2LKmwQ)CZUSje$D+AZ6u3>&tTnQ<q9eTTODQVWLp3m8G<a9Zdp1GMP9)pZjQ
-JdAtt1)HWlt7$%MLmkU<Rx8G|91Amp6`KcT985h%j@BxdztXE}tyfebH8iJKBqG_(Y4oTL+4}Hj_&3P
-ND5S5Bnpv{DO-tO!TU%4c?JWHqrT%Yi|HbbYuF|)Go9w<ha1__@m>~T5ecq|s43o|WUW7F;V8dFqyJ|
-CTD7SE}k<|p8o(d-ZCGn|dY<9Rqxp7i4d>v$MJprD=^?~No{X<UtYguOUib#>ETNi2EjMFaaBcw~WF^
-7%Z!&u#lqjTGcY`piEBzxErfXKuzssJVUbLU^qwB)yynE05#_gb_kRI1vcmn9MvS!EK^bTRbCyPD=Zd
-QY=ni?fPV<x1sM%SwpjES$k0zmIOZ!&O@;#TlJnEaC(j`=1hogyqRus{(h<CljG^{T{RraUf)UCzZt$
-d|2G6d$S)X*(lkXw=pU0v|Irn`XOMny_U~f!4;>7!PxC^0^dao=455zHK1zK&4L%upGW!?taSVVCcjg
-~PW%`qtiQ~gIG{O(run0Qh^d5bWL=O3pB!dqz927YcIeVNvgmtL>hChkQNObU#4)S<%T;*tU*u#5r+y
-hPz4Z}SEQ`o^aIt&dyZdga+C_a)?Bz4pq_Tayx3Mf1BV8}<dhx!PN9U4D>!=UtNa6q5mqB6_;J@FiA4
->mTSvBI}zQuV7m>J%gJBiRIBW1VlpUDuDaO?8Ad4Zqq2uJPI;+e{36cSQc0!-+e3jC}2=1blBW{Z%}N
-S@*xVW+%&4{N(C4;17d;63;PP<u~%NcbjW|ccTRmH^%)|px{3)&`P26+IF=Y?4w0yLbLSUd(`B=gmnB
-Jd+qkgzyHcO{|DkZx~*}>eYoKl1jrXF<M1_#N|@0kn|_YeRW8D~hdGfL5d8`1J^JE_{LXp(-Nc%v_OP
-v=w#f{=bKU}%Dhr6m^`7FRN?mEF;Lw-Go?s-&m|jx)Ca7oY-lwQicjB#gnH2=vbfWvyJe*3y1-#Hvmn
-Nkmv%(+qzDoAdW24gdC}JWwk*xDN!`eL`NUQCxpstGd%l;w1;^a|3&^Ipv`*QLcvpb93=P8uwCI*rE9
-9}Q0s$8uAf+!XoJi(cC^(i<Pv>%$gJzbdFt1i<)ZQ^~qbvt`cISd=_`E-y@XVkHjiB+LwQXRsc<}GA6
-yH5?G7xUtcv)pXel>^D>T8I}b0l1h^F@!svZe>?#a7_7$h+W(*9z@#QH@()Hb(`&|VCL$1bbsF0UiP{
-|Ag;dG5M~9;gWu5tD4jwos)O@c3SO$`XavDP>ztdKFzfI58Gwy{yR5zb7Ao#S4jh;1`xbIIpMiNnNAV
-prG?&D_m@KI1PfvFLMNzlPOcvk89<aOg#pqU{We3ZR*Vxz$)h#Zb1!hS=2et)N(qm)X>_Cm(Tlh*-oT
-2r|%6XWCoyL4j2}htBO{3@*F6t^NwMu2kWRmC$14N{nu~v5j4td`Ol}Gd)et<j^>XTgIvesmS0QwQsh
-ObU!f*7`q{WGq?lwIsH><hqi&uWk%O5cs=$_Y=3_zH38)kYI(g{H`V>yii#WA`8Viymzff88ZvzZ+-U
-7YS`9I7%T#eNmp470D$8Ab-wJ{q$hu2P+luO=%~uVF#(s`+`)QuCUQhua~x7wJ4hIr;~Ykxh+LI8d(r
-c(VYhxcYDH=&kYDbs$|OCe6#V&_1yj2#9e|)L=qj`$WRk^s5C_Z(?8+-Uivf(g;{DWF*QxbaCybv42V
-Qv)w)?_*M}EPvkEmle`B2a)*#M^)9U_#(r0Kwz{bArfNYaGq%lT0-LzVPm(T(Vh=SXTX1PAvV$J1+pI
-4hpSk0TW*MdOiU1a>0yWU6RY4PNlm_25=YIF2x-yl_NHSjE{1ie&6v*uZF(m^Gp2s|VSjMblMHhI3J?
-#m+HJ7jb|vC4TxXv>@RwQM<e2cbGpVu35;PJ^iCyBmn6562ODoe}oF<M*N#iMfyTL5V#`ItA9NPOcI5
-cvpxwShSMoAn<HYWh@7HIL1#~^h<`n#sXf}s|Om4#hi8c((?j!+TsoN@t}XK4A*ANMC@>qH7OT}$7sg
-czTjuoX1H`+g170ibZQMc)1tWh=r>lI4Tmw|vm!MYDZHj}TU0c}Xl60jKmcku)YFI)<<P3i3oi$i0)>
-`pq17D{WVh=AsBq42=~xG3y~e~sbPxs&`6^FL1EB6R88<I^nIcBrR`$(Gj94-~4D$L7?X_fm@p*eS;f
-}=U{3b)9sMpQZdZ!>1x3>orMxQ9-Hr20QsNq`~lEXGBg=-Gr7}-9U8n8rB_<|+wt85f$a)iGRz^;mA3
-%_`Zm8seK%NNnruWs(_7bNxVXFH7ga<F)x`t(atPUzG7Yxt9C>Ho5eeuHU$alzkbRY;Pca2h9I0;ebp
-#xMkdaT*~hnjlCVB5@KYen@AEJ|6Qs<T}6`b>OfaK^+n|)Td(<KR^);9ViQjcTDv|TnFVxT@HgjhVRs
-opE<OpqmM%XbtF1=z_?$D&OQ~qPYNdbl<%^i(V2*kx4;hGGV18(IH*?S(GHS)q-6>GpjRC;B>siKM=w
-kE>1e^C<Cy$Yo5Zt^Z$12JF@ZlUCh{YvxDOJ4h3ok7fFlp&JDn+g35C<!a~Y)402a0Mj=A}VjjZhWM>
--R4@xQuu?pRNDq1FzavCV9u(m3WD&I|2*+!dSxFgqHKJM)`NzPP`BAHw`0FWfaQ_}0OZe>>s(1uga?$
-_fPD{H;SlHmYCseDsf=kFe;6pTKrLk|R4*`!*)*V`8L9&;tBk&qr4@^J{Csr(q-YEmv<X#KkpBnHA<+
-qegq%#~ssRB_KxKDU`moL>#Z_H9_3wH=P~(J?U>Je7~R~q(h9HOW;>Jddhv(`eFZW`T}7y6p)2`qwXk
-mNM4ov9_j1#6wtAPcLLT=te9rB(zZ&)iB|ZOHi>+SL#bHrfQN|OdrJ%8O(qW4J4QH(_I7SXUmkC-cm+
-%7ezEX0dfq~Xlwp!jppqR=nV7?D)l{f*v&yU-eE=3=10)|k!d*j|DnN`T!5ALV!5gPZYa99`tA-O?Rb
-MtH>qf1CnA`94jglwf<?9VFkttVqJp#)?nm>?!5;N8D(iNty`*e04L)LhDdO-w;-S_np>@6)GUIAUOh
-HP{A4WMa96$^w88x74XozHeqUA|pSO`q3pN5&7sk}H-Fu~Tcq;ajO@z0R)hLUJC{w9+p?L(HHd;Kv)I
-ViG$m%Qq?yEX?-CT)t9yzR-ArKNF^bAJKSp161@*&#>ohIN4(-Cb;QLSF@|3Lqhnh&H>9Z5~nW?3w$9
-6F+a~~2&{I(vb75&BY&XcaACSFC`olw_4rkkK;l+@9$~1cQYReDBCJP|B&<SKeekJV)fm*4xBjZxp<S
-GOSs2UU>YzmqKUMiMD>zVC4fR^QK(YCgdS;kfm&+A=Wa|yZ1R)^reaSUu3c1EBbEH%cN2v!vG@LKq{f
-@n^K=^iU28Hx0oRR?)KA#nCAvb%(JY-Zu7PBs|QX!som96j-kC{=JDml!u?0udLS<ZpzCbo8hQ*27xV
-brzMMe<phan0fyz`6>$7pw4O*ox_gckV6@qEBbdqY{d{a1f#-fS$lwWV(*@-~x0SGM{>&3pHJDj{fM+
-j{xEf5?w~7?J@Wj$g<r_M8#_VK)NnuM8*8l)WR_bpF@2`^?i<hQMNeRqt@0|$(HriF=YK0^T!g&e{%k
-JvAW-%`#Yg@oP;nGLNSscVTzz(41r06BvA~*DH5d!5<^jv#BmCt355P3vjc`dbYA!%*B(BJAG^cDeH%
-W~`DFHC0B0XT;A{_*KWm*iJh`KTTZ`sj_34n0kxrZ*0d9}HIeLV=Jt*!mZVz6EkW2or^k>$Mhax(9ln
-&634G<h1(#1G&1VWtrL}2tV-+_}OgR%!_^pl|3=TBqDE%A?n`r!tY9ZD<E{sup4E_>Wg4vNZO2FT<{e
-6-&aAI|OmNZHfkLiNQRPglgB<<}+M8hA4P^wkCS@9ymU!2{b7=HK*5-ZdE-*T8$cQ$#2%|4{`;P6K@m
-k*5<t=;4nTO-n`8Cd0y(W3%(Es=&i~WH{m3saVT~Xy+3=>aX$dh;eo^1Nvrc+QxnY;J3kVW11-Zp<|K
-NeiOD-o~189(uvQ{41|^lI^l@6#KG~+I(OP*9=cE0zBIyg;Aye=);>eqUL#7Ds}z9K&^Py!`1pG)hOZ
-<B^v&bOQ+Vruaq+J~mU-*TDv@HYhT9X)(11y?`LdzNy&UGw$&BI_I2zp6H4Yk2>5N8DgmvUJ+5md947
-k)){>)G_Xh+Z;)0_I046zJeb&{VdI4>>@_jaDCG@qcEy0GDVOHp=8Zt-;n(1OXHyeUuk>jf5r^R^=aD
-WKvFKH`;VJVk}@;EKJ|IPP0~!*6f+WP7xJIh_>Vdl3Md3v^s@?VVL2+vo6YOxG*c*$<2pWG+1?O$US9
-<o1KCt&BVn454z5xF3i}#?u%F*nLOSLhO9IJcrbMCi|{6Wr~+&;bUh(fh;24*dwdL=yO$Nd>QIy|K>$
-Juvc<zWF7FOJG1gLR=3sr--+A)OxqUtv$(A>iO*J*F8*b^x%<km)jn9JII+#^4*(<Zjm0qfH;kc|&|6
-@Hh_q*hGxwoE84Wr;yO+GjN23Rc&g&9f!X%ioRRw!6;d~h8u|hV3CI*4YJ;$#g(!}d%GgltG#_f}x$(
-L+y$h}vM6;o&-P%qGH%GD=T;@wpOdcO%tFe7>1GiK~H+A|1m>?M5g1bM&BMeEYHb48g7re9MdxxMkXI
-kM<OVC>V{aW~-Jtk^37%Z35<SMid4e?lGo;sp8271OuhW2xz0rxrWC&t=543ZIkpfN8p7mp4UPffT~|
-M^NTvmzB3Hf_zCrZsYqjuC;hCvT00SYHi&u63@rE=9<-d5GPRAm1PRG%_@M)+k0>u==hm@E6-phCFi^
-vgF>G4ZJhrBi{VI(Pu(vc8Hp_YW&w9>-;S8%^wpM)_h0NRDf@eSFRE<#M5AL%_x04j*#-LFc%R><`G0
-bc-}Q~|u#~0`3D?7w4y90tJ`^!X0^6e}4kI{C&_8Asd@=mpqh3lM6oCD|`-Tlc|Aoh&-4}K^$-&vN@7
-kkX{$tML5ve{>VrX{6t0VEA9MTv2zAwrT#^Ju3+vDcGu|z(KtjF=mQNX8>pBW&1?2hsew;+v<3z6hej
-o;5CK1Rklaa0J7mVi$HMn7BM96R0!fgF3wI68KWhn`t}6f^cHzh5(jj@={lmrf!gbVNq-dt@|}G&Xhw
-+45Ag>frkHOI0WSlzfA}m>L)SpQGZw>nXk^;3antFaD!VC8}^Gw~i$Iz3=$?$aA+N7y?H$Ja2o*`bIb
-SlCg(li{<}qtGfNgECl$vw~Rjp3E3SL@k`hI(HL)cE|enl8m%93{&hbg;5TLdXz=q4qVdHBTx|#O%3@
-#l7)U=lQ2AiK@*1x1&{b0;<`27L!{&dp3of+~aQEQ8hfyeASts=Ld)(3cmN0#UzE(IZ&R%Mv-=EC4ZF
-Ba0reCWdz)xFQEn`-`?>)!Q^GH3Y_@dKc9%PAY=$q)ic|E_rh;u0apuLr&PkxQzqsIWeWTj;}d7+emN
-`22#L)`a%V-jN9c@vk{GnBi@xwMKf#mHkMr?5?taAGVv6AW(X0q9f_+GRL#=Ciks4pN9|=0`3+PDFgp
-PIs>0{L+0s`*eP+nF6z?akib8H^;g+sUizp&u{aziC}$Vb1W7>9>YA#<9+rH1*hoV3F`2KXx<DlC^lc
-Xtm)2_jItQeuRcIq0mz%NJ}aGcsSQwd7OPsH{d`qTRq60qeB*N3_h$kHyF&HnBs7}Gz+EoLW3tVVdz}
-QpdV@Lmy5<DkW!Sl>Ni}?>OYlUfb-XTXQ__o+z*rb`rRbh4qi9sp7~?s}c=o=*9dL(HNV*cr8bH2jb)
-nWfoR(pa^H9E+DT0H>1@*;^6r?)CJek>5Hd6wly#>f$A*2F^g*4dqmC}#f%|*SC&YzOhrPx58Jg~Ntc
-a~c2<ZZa`k}xEhY`UaTc6E8@ii6741FoS<#tIwRi@q*nN~``um|C?_N0&8=rT{Co7~5g4<MqtzzMtGG
-*?FT8Ni622$Tq-!lLnVQW)iOncM3;@bbX87+6(8n>lvFefy9vg11zgebwMq{lgg@=C)f5b{w*>V5T(V
-{Yog0_8oE<;JC84peK!j8xYhexV5WsWOZ4Pj(;Qv5OK+6$TVqSMm@o|<VY~;>CLcPdULLC8f=@&X?il
-Vm6fVBHCBRW|{Jl2EpXv|5p9>Hca(4}!8Lq_*Bh>fp<($~HgY5eiwEryb0esXwe!m0IziV^IQp*oyL&
-Ve$IlZ$t7+jE#+F~01B^YlGG8ljeE^VnLh86M|LM2^;72W<l^q3aI@3-vs#3T4&>PcamBY&6nMR`)~A
--p|OxRM(?2ROHfJT$rJr|zO?F~&96<gwdJqxoCe@n_^cF&7-y0>#8`me|1Wk(HO?hEpw^#0U-eItG;+
-&JGNTOlbge=G7B9FzZS<n%wxR+t1lYS>2zs2W4sZr0tL=rD|anB<VVLKw5hjRZSoFTSL;;EiFwJT0@3
-+A9DX9A2Q6UzF=MId(%1bHQT>`6LE>`NW(_$(byp1)te-Hb};S>`lDWmr<h!j6I@Eed)ay&4G2q)p~b
-xFapO~2KHh~VuDD9(mf01oV}QAz``PZ}88t6AJIGE}XID}gKLsOHa;_)#_3m=5Z2e`R!|<G?H6*&q$-
-Bps>6_sR+`y^s-uR~VGS?5`iUp7R8I&8Iv;|vr%Lc4`fk~bk=RKyRT&631-#GY0XY7f`)H@K95fLjop
-Hhh0lv&xgBPQ0ch}HUvW@5KKdV5Wr4m999D@4;cc5!{d!uLy-sIspCpSh?Py?k3m9<H_@8M41FY7)jc
-&I#ud#vk4#xNPJ8-Sew~bUShJ+TtdXeIn^Ocmwb&1`3EgA@qGLb6$TvkX2$@amLj$DRassqk>zvWzlg
-yV#=q#z2~&MksA{Xk0GuA{^jBC%DVk+I4NgsoAp)l3zI}?*6lB%KK;eahAes|<u6J<jMX?D2yXaf_77
-|Z!AF<pKRNRNdjIuPsQJHZ4&Pwte|Z1jLR9ES=<~=^<cH|S4lZ|;wqwvFJ}M3wefY*j=}`nYm_YGSl1
-P5sCJKG5?jYjG%S6P70!tsQn)`+0k4i>DeB7Bn2V@`7w(Qd{8WBIs%Y2-VY2*-LgOL5c2VE(~j(W$T?
-}i+gPQKhJIW#y99&Ua#p5h;&jYHxsJ5o7FbadA2h&V}))Y1M2Jq(`y3Vll4(IyIBe{D$liQ2~FkDVT{
-vH-tn54G852Z@q9C7UQ{g7OWXk(T5Rv2-Lkv^^T=WhlAh@%j++2Ndz#CWu=moqj)PsXMBA?9l9kHk0)
-W0=@j+_jlQ&&gr{BvJRDPEG=!kL%1ED*1@5%=IyT!M+1)Cp^)AN{<)404ri}JJFJ60Rg(UTmmQFPg>9
-Pcd?imgU)3~rP-`n6@|1q~>(<)*eXRcVc>uqCApgnp0Dk*G{*&hc{PuzTC(i@;?F0Gk^Z2_^b`RM+cT
-yWr!g}h)&w_6whW^^4Uf)n*`+CQA!&>GO8YvpIE!`gR{Thq*RMlXiLV*FWwH{uT$ZjPVfj(q;v&8dcH
-~V;BQl-il0wmqW)9^a&&_^1U7sy>8w%8_p6r<XP_He~C`&>9NbhEU&>z#dfJTShj@RbrEh^_d{Ih!N*
-<}N|~yn2593bk=K5jVyNGZ+Fe>(u8e)$5nxk%tqq&Ao!BnhGjq8~TQd%39)UFf*8&Gu|!D7WrGG5O*&
-kxids?z`gcU@n+;8c}C$Nc|SXxK681$3`2)c{wbW(8W9{FwI5+<w?Xz$!=y%%QX~{5u3doUHVW}s%SJ
-2gZO^X?_X0Y;nUO{nqKs?42=>*<hxI@RbviM*OWM6hUES`w&+soEDDuKzaRu>HsYYZc#)6?I`iElVuq
-YYPc*fi7?6Wc&dwJn%79LBQB|?j_<aMou1Q6iiMYY*$Dd3glV$}A?jE7IL1dbLbWjdpl7u-S>$tN(RT
-+z%es9U8r3^HzrUd0p8OF_t5j@Ith=|V3noF=K*<c*00#SOH)B|2Rh|Jm~BqoEBbDCushbe||SftaP{
-4qS3Yk3{K-5iYtsErWjwXtfEoNeO4}I!-iN#V~fEN{$OHvqOX?T27GbiqEbNqcs888GJ_coL`D?C6#F
-3FBu~OQ{v@h&kU_~+9_k^0p{*z0&zcpvcTVEU;VZ|m6&e7YW4Z;yD5;2`x(+RrBI=9nc=7GD@OLn*fl
-TDk`2t-UV}05^cGS8e{_dc$>@>8C90OO{QBU=Q1je$EqPWgkWM`Da2X_sxh|(ttjG01RROs4oi@0d0%
-({tyXEzSw_<{v2i1nA#BDW>a6p9j_^0ihT|%B?#gc7lN3|)aV$DswFJK#i@B0YQ7w}9wPQ2BHq1Kt2M
-OO%$+o2318^k*Aj8<%o<h9wGPCYhyl$}*tfFTAvt?3DIfe_D|A@N>s<X#iH<zS6*4+issz4-vE+LzR`
-r?Vv48AS0~<>;nmyxNy3MK4<2VR8i2lr%_#+fxVyLGQ;FVB1@KarcK1JWtobB4rgK!Qz$Q7i(4~!M!!
-_+oZcsed&g@F9Dyfwpwf;FS1@XvXb&r$7%EqR{Wy3d|C2EBFWGw2{*xg-x1O0M^(i{oF~mk548r+LMY
-0&VLG4P=e}R#C8R#n)+;gb=V=&7@toBJL-x_h45ucrVVSEHkc%~VSq=A@=0LpNg|`M{l`&oU^;AEbQz
-b15EfyuigQ8^X*)yAKmV3M7nZ~%9dhw(6R*CGbD6WP9k7OnhIYBk`d_z3Yq#ABC{JX!Tp{fTRYNYNCb
-7|KOboJqD#mqn7%}t8V3K`bDtO6NXNytmRbvBj?Gh_)F={!OHA^HJ_U-|r5F`0)*VkmHr=A7s+_hxw|
-BJZHq4?PtE-W~mXfX-k{(E5slvVRfOe+!iT=3V^18_xc(p2vRzY5y>Xzl60EeAMuE#0Zl|V@`q`8PE(
-qkS&xRUCBG3J&Y8P11M%c>9fucF*g!EdbRfhQ~W@qIeO${N$jvC-7g;}2k_i6GC>`9GmZ|FOZ*JhVqc
-V8@WT?~5EjM{YCawvB5^wohw&pRdkEJhN1^fXY)%e*8`GbHXLKNJ0zWdXF?<|+7&a$I()V~T)W1;lFQ
-r=M1J*Xr-@@A8OS9|{?)d{q%YPA$`p+Tlf#86D3gJwi<-Q@f>yF@n{}j@ij?RDe88yFTTo1LCFCE>m#
-wR<pJ(_lsMf<3)7)P@8(0KVaHW$(TQ_BQ?ZRSZW&G=A6jy$L=%psdfJIL&{-%R`dnf7mI4g8a7e=@S%
-?~|{9<`}c_E&IBSO6V=aQO6BdmJJZG2|f6DUB=y^uHtT?C$0ff6qbi?`-LGO{iJm9?NC%P)-T;bhxh8
-C@1p-3g_V!M%2_P{BP%b(jufzWu?S%&g#vayTc^~pDD_plxAg3-j%U7V@7>){&ZQVvFo|%ziY(F^=RJ
-%)v3vh+M*GpfFGBgYIp;y>;^NU%I{OYf>N%0253ZN)s@p!O$e8wD*`|qQk~N<?2mH*%>2H}hU5pCgFf
-}|g!nMD=8~%-eCp;+{ym|gXVTJouVI{wcor2w;OJzpc186Oqk*X}w>i510@`z`aW2~UtWrkZyN~E;q@
-wW#aSS#p<i*{8EWo9!GW>Wl4TK62-_Yr4~K?jR~8*#1sG{MEtS4xo@D#IW&0WYwwHOG#6Rr&SKd7Ntg
-qw?FMordq6776}JYdJ=LP(%B-2miJZ_J;$1*F1^QFb%^vfs-Un(G-dkBt(-a43h*+-~^20#8D6<f9!E
-c=Kq4|qje)Ek0iw5<oqFn?tgINSbNcrf(iW5+r)lc1w)V{RdJM<KH{Iz$Mk+bJW7tW9!U<K%>MfDJB*
-LUN;p3ZeU6sMpDoz?DvLx%Dgud*RXNR%tL&56ms<!wSh0t4D1LOA>@z1nHaz<z6X=Kz6m)Q7j!GGHBt
-6JaR|x@sJQ2x*GmHMU<4$xe*zor}ge6$4TbzvX)|y^vA-ql|11bdOANQmDz8?iN9{Yo%U}$Nk@a3y>b
-YL*$XWdPt1x_|0(b)Sp(xiQ?JwPh6L+We4agt_b?RyU-18a3Ke^@pAmllvKe`Erj?_>X6Gx+-)7l6?p
-MoGreq&BDCvkAApMs5vxxN&ud+DN(%uGrKL>Qi<O&nE&wtV?(eakZ267e+@w6^iZT*3`)8d1F(f!1_f
-#oG4JH`H-kazYc2TTy1u)^L^b?>U$e1-BZY(qf0Xw0iv1CH&tJZH<o~@mRw8@D_i?%kafJ=^XRD(%sH
-WnbBR2gm{nqefYApTz~G$$ljsIOqC^Hg(hR}6f-7TAwOg}6C<lVJHMdZ{7y7MjkkqE+C-GP-ur?<2m8
-%jOH6wxK01?$r#?u)1Rxr*EQm72L^*TQz6@=@D{l1twAvb4LHl5{F%z_IpWddr8dk>aE<pn_SusNNs4
-kc2;qONjs?}8;nHFvHen%St_zl+!RLoWCZ*)YRS5vnKNCofzQCC(ZhfGge5E{vP9+6lKnkl%l4Ip~p6
-dckN=+Yy8i<YF`3tO^f&`Lg2%V!FN(tY_bx^h$sdNuYgInUfLSR-3B9%`e}T@KAV;#o4Y^u1&k{u{Y(
-q6V_Z@id4FANbjK8ZTQOBK$n#%CK56Z#rJbKtEy!?n_Edv!!$!b+&We%&bP>jg<Rp|Ay7Cn1oQPmRsF
-L>Ef>Iqvymx=V0h9@b3$FO=tbq^HR?7<ddA`&SJ2QoxnRI6C;8Hzy|)ltL^2L=wd!wIz{|%u>orNBdp
-qTm#xU+?jOPh{GEesya;eu-<~R6Wm4W;tjtlTdDbT;>xLEf&;o>GLd2!z#0c@2)YAXlrJh8){I4-|G_
-z%Z^lAplu>g-=RF1;AO8J{%Y&IVUQJfBOj!T2KB_zSPv(~b%nC`e+TVz?3@2y?A*!+*2dkjAD@77vQ^
-UkRK%ONck@lbpT!lYc^39IEb)T%(|t`7gB{P#ttY5&$htZ*D&1k2fjskxa-Kjw~7hG4k|rf1<piH4~;
-A%^NRLQ#c`KWZpkP7&{~JinA7Ak({lL#!0MiZ9jyqXyeUwHb7)vZ$3Pyk$HMkr>3lLw|5Ih(YSO-DO<
-@Mw%|m-YXA|`)LEt2IG_2`7^1GN-$LCdA#Qor9n?OilSnWZ!PyABzh~6OI}!SnA60ifq<Bm~9mhJw6X
-*T7JDn-5^Ocxwuy7Rn%-i_sbswfXPuxki^(CQdeNHz}7)$z>(}oXRdI6^V$ZDUDTMAd4i?}slJQoO$Z
-@FA*IUMJ*PzH<PJfEP5KJ-&`kq70eJ{#G~Mn_)(qO<B!c+<REbP+1~WE=iJ%)Qytqga<Lc+XShJ$*{d
-Lz(pjAVx8WS#ZZJ5D0{rpT0qn5r0PfU!KgYs?*(O5n&1hn?cgrzSj2TUWMbG^R7=xN>645Px*Rgr}B#
-F%UMfYqO4ACVN#>Hf1<nx>;Ym7&u7lFq=a}qb-T9T7hmT$sAF0^Y<=s!ff+@V^t*Tr3wKv3_J!pPY;z
-n!ML1Ak9(QBtvw?Jqp85gJ`X{gv*)#JfL|rw7c~fnMHHllqRibk<UX0`=bEYNd$>^;b072tqHe+_)&k
-^BOg6NZ45>5)kPbeNx@bxw<h{HLS+H(i*sw=9X`3r8*`l)+N?LT8O{S11Le*&eDzYC?1U!W8MQ9F9tX
-95^U2@1myh{g#NhiC+$XdI?UoZ1l;^(CPwA`ipD1Uujdk{)6k`+xTrJElVDV=d*-(jX6gb@Z^v`4UQD
-`H^Z;*#{%hN9LJ+x|I*HQTkAp!^k6xPCl>qJQhz6q?R1EJ%84Vk{q}QhmOPctQW(6XEzZa3Dv_uIzEO
-wbm;P9P&EE{CmsgW$Ig4My<hpU$g}6W$${Qz`pC_bkDVb*{$=hf9k3v}`~gax!$(4lEm#To>C`c=(={
-O%?^l(@1H%CS9T0P17~tPPO!fC+)c>g~_={XmgRVXtap;K^#33308hy@E(!A>-%A9V_2VS<;Haf-mD7
-4hA7QO98zJgQa=Rsy%nl*7^_4XKXY}A>CS^)V0i5SAJRtOp9Gt0L3sm?J!77d5mIDCbc$Z_7UFo4%PY
-j<z<rC0lW`GYMA{1Y|JPp+rG&cUqU)zE26HCKS3m)Cja`isbh8vAVkc{T%$jhJ6|{%POezZ1Z}q&Iiq
-BD$O=oxwLVg*0Z|$m>3xrcUyn1LIT~!83T{4{>zm3_)NR^&LIA109&1WRvQ*Jb9tAD?LqlVdTIS##{0
-hZ`>?n?vtb*LQ~b#wZ@}#9V~l7hf3HsCaM7!H!QI;#zgF%<B(;z&qud^!p$_g@BUstC44_N|JslD*Sr
-7dwEJS$e+z5qksnepOk*Sj@7W-PK@g0P5Q<R<4wKX#>qrv+GD9Q|>7hNuQ1B;?r5}Bu?9dt@K0=(|#1
-HnQ45j}w{n{~%{5VTw)FEQ9@0%e<XiPthOBz4uiukwqhJOMl_IXVm2_N}q9R&C%n<GD6e|z3~2rz$M>
-`@o{bm`?EXIJE7BD<gaSYyYIoN<q>(MNjuSYt;%0qvu|iQz|q5hFf|&VS95j6WG-_J^>>Z4bf4^BaZ4
-zQc7m-3J){{K}vDD5QLmpUFr2(C>kzz9#>&;QGiVd~XmCczQlM2;5(^k6D>dzH1vp+Sy(8iox`=3v1u
-x60jegb9;CL_KmZ7{z5LHV$AP744g~PKTdS!Q;mIp4{t8upzII(u%pHoAAYP5UsxOew^nL_-$gaC%#E
-Y^?asHhTbLD|J9V5Fvr4usfM=O|@HU#_Z8qK<#Dd!Nt&@2abVLlyrE{xJQrx}b+-hj6drIo{{$4^vMS
-1THDYS<>?Hc<kRPqd*DD#$ThTlRkbT=gP2AoDMA08ALt!SM4OkPQ_#wKddSb^8DwgH7KDp#lXTs2tc^
-s{X{WgSXM;MjI0SP(#x0$njuX-Fu0L%Lj1FGg_BhRo)M*Mgv!YWp@%H|D~KLV4UPmsIaibTBMxGVuzG
-0k*~BGxIM<aek!_j}<yg46hD*c~<2@FS->kCIe}j6gD}wZbilqJgIXNg*d*t03D*=aD8}n1aZ2MPX+J
-gXPJ3mb6@mGi&;^}whJtX_OcrE25Df>LW1Uy+U8bNvMs>noz)}BmD_|n5d^a$6149wCOQJUIQ;|HAUj
-Dl(UGoI@hr{SJc+T4U0&!q7jJz=0H-jvoKao;`Ho&~;!GQHPt`F#j}r61Pq$8tFXQqivF!|LaC6xo>D
-kNDEh@AnZa^OpL8E*UpuK=7Z1zd*oZk+sQAz!x68UvCU$ehDtX#RnMvLD2`D8INn_y0+-&Mh0XJ8U|&
-r|Fs-AFSPMB24X*>G}I+U!nKVEfMD-a{1$6m}VozWZt{DE95bynOXGUxNVPO>3V*EpkJIIm<0l6_(^N
-ZS^R;dPgz5*3QQ+Ca;ODb7MCk>d%^*2Jm;iSAXp!tfAoUtvn1MRp>3J>!PFQn!85MB@Slk+W-~I7PHV
-YKX(3VU*J!dby+lJ8kWM&{uA%+B=K;J5Mr-Xr;p)a;-wwEAqe7ut2#=uL!q?9*T`ceUU<Y6p@@)avvi
-_=!y5YGN48Hk=ZmynNh|J8)#}Xa>#^kMBL@mq8??TAga|i{-cv{MPJxJ$d*@A1%e{uFQ^B%hxaa0#n9
-g$BE8_EE%fy~3c}r{q!cEE5$JoOPT#be<<2k{rb#Zw@T6*e};L(O>dnOXC4c@`^*4f6(BX3McrS5ccd
-<gKUQ+#*Ja7^}SB%kz5@!ug=(O!Q($CLs3o_fDw_O-aG(AkNGv^T0D6CP>R1*imHfm<EEanB1q;+9iE
-*J$$Qx{Zvbqzzv5{Gz|@n9a|akWMj`QP9(ZF}uC{A%Yht>?8vvC>oP{>9n~E&AV)0rq}Xx4TBBG5NR%
-hw?&&22YO~B{%B0=nSX0t=!n`SX+#?x0EY=p?JCj!8Nux(&BfSy-31#mcnWU|#E&$st*_{yTJ$A?3}5
-XSmcPESuH{uorC|V~ZG4;fJu}4;sY>_EtCUjfadOo<>v$LH<MRa{T_-K5MYuGE8ah54czUvUSNn8Xf$
-IprryMe#ez?8Qd-g+uEyjwE<$}YU+f@u-6x};Yxp}`I<J@c&DP79|BkU>bin{_Zvu&1RbDh8v8Ms#^V
-^AWgGX8j#SEgPV<92fsi04w8)G^+W;L#@RxBljzC-5=`6#%!(^4|ef$Ug&BzwZ9O0agE=D}GEYAZ&+G
-`;#JQirDi*nj#63pivwrQ4Gd0>`Of=ocy$65{KIa^08ixvZIMH&ps+r$zgJuBS+?jW&fGQe+H`X`~$<
-FLvHHOKu-=4M;bX2y(B&;dxz~7d|;a$wjB-^`LQ$fXDX2h`B6&v$fWOAa=<(MSn*8YgHX7`H;g*EF^?
-3NI25X4_+!I?eD31YMMHkh3VlO%AI2b^9r_7}!z}V&0af?N8c$Q)&~6u9W$-Rf>z|d~{||wx^%qd}Ek
-FE!8C3nfPLA)ON*n5|)^O7-9K}Hq0X(AtzQG&kqHb#6UcR9tWrFleOygNwzwpEsL49cMz)9W4_;ROow
-p+xph!BA?EG8a0@Vr3{uVUv*Sr0r$X==n+IfY-AD`60d^t5}2q%weu10<^B4a*3>^n(XGI=WeP7c}Fd
-w`Oxzd<EBNNb*CyW=W>=9s&B7e_bzg%{3<ifL%X;Dp#Qk{ajzka9TMp3%H;h8byx>OC(G*&)3i(rqe{
-sdIcFvb9?)|grzZ*^MDXgd|edce)HH}57J2y8?(n1*ni1aavt1N%&LsFHz7}T#|seBzAAF{DCtuY!Hx
-|S_PB1HqDm|+f_F4{yayyCU8OOfb<ZZQcRP#M3+r<`^g%^AM5z+iq!WDQLYR-y8z7Q~wEwE6@Fvx*Mn
-&EHFs0B?!g^}2qPz~VOT^<L!!%|lwmg&d9{S)^q1>i*cDMq;{Q}|LdbX~i)fp<2mDX)7i2Ay{U;~@#b
-i`-8Q!}BSTOUtC1y{kWQ{1i7@ckDf0h4HKbbM6s*m0oGFVL6Ql6S~yP1>R2yqhJr<9^Nx)&e||17TGB
-PL<#M)lGF`Pk)9}Z2I1+(3I*8p#?$d4HU_E#)lxwXqj4xs-mrGlP!AO6Uvr-zK5HSpUWs_z=%5m#htv
-mC<qbj7T@ylmAlM?y<HT85uFv4IKzWPJ`bntTA*jA;g$J+2vkMYlQ2sa1@QL4I37-G*bZ()9KFA&e*;
-zDcm8VMUqRKs+CG#@eL)O`I~rG`)Nm)FD=grbo-8t)92O8`A4=40fLP(}%}$z*Y+qQ;-io<<I15&$?9
-@Gk)7)#PlY`s|<6@dIgDeYSp#@taZF%R@R{{ago5-tF7ebFrZd|@x9WDrbjDB4TAx`;x7Iy6Wq@KE|r
-nj!RnB#k%Fy!9A;>!SE4q!Eoz(~(b_9w(6I1!%1m6TY~#)b`zn0xAwiIi|x2%<MhzJ;eJU9O5Z4TDZr
-YUcoR1I8A=;1CPXZ#v7F$zECVEa7=M$TQJ+??=Z!QyH;o@#IYNNwVh09$yTm$ip*-00T6U`fE0;7i(*
-Xkusa-FMdNWr5-7`gLJHlsg6dqUR2-cAS5!F;#3&j?DVlIP6RlQ9ZP{{eD(}R>c;_uQoCFxx}BccxxA
-oPM-OA&$>`7(wF0(8S4gf8N~Fn0UvT@R)9%Sk&ct_<(j3E=BfUq93rD!jXm)DDdi{f;-;!<LCZ-6L;B
-<q$v{a9j>{9rU=K^R|&|Jc`cH@b{w7w?TG8}IN4c<U6+Dp}lHd5lYzHyJqhq|#c+TqFd2z!f*6wer-)
-Zr(OP-(>3szatwk=>v`p$RWdK%H*=Xv5L|f(41<%9;H*mlMevq;?Vu@L|AM4)~WtXZJlNP;aU}5&0(V
-iBd6K1+l5IsToOSem!OjooMQ^<!&|zs4kzLpsS)+nb!at-Y19u2B<>+8L0Yo_x}y3LVpESFoe+%g^(~
-t;RKFCB#gi`jlmRw!6Xcm5QZP5hOa;s0v~LJZ{#zWIB?LxHz1Fq4hbDn*)(xTL>zk7=#IL+1XYKc1@S
-R#K@S4N4tr4Ss7viHQuvVaM)Lz^LGVX!;xkhEA(j1UPen`~HZjCe@;@$PKLPd8-k?5gvwf_XIxY<U_|
-3rCu{dz(ZhvqbK_3i?{WbORL51i;brk-{N#XG^CjFP7ij$9Z`zZQj0loqGjZ#z&WL@r!v|6l-%<10>@
-H?LRqWt~$0o4I>fG+^m_ICl*fv14~4xl>l6!0~m(&qFtNb)-gPu`~lw=YbSkqf<K80$jT<>(|`1E57f
-w2MSxY&FOCl~5f<E7PY>cEeT>k4gyU$q%{+wVc<}d-Numh~)W#j3dqt5u5^TaMOr8<c2T(nLpyPzFwb
-09o+@5xjS2S8*Mq8EUBkeIlsL%w;69?jW<7*p@FX)DgTBcrIb>dTOu+JoV9wwJXVKTHb50$j{j{L`d>
-SLvF`==iLE&69dl+IrsA23sFG*gYAl-*LiV85^}*I8$O@ItJdlk7v%~%!d;t|b@^d@EdeVxhXiX6t-z
-!|ik3kTAtXE1kIdSX6>ky$XoGZ*YGaO%&82DtlZ~?IA(%~KwfjplZTjM-%*gF(bseEGpc4(7rOZ*mlZ
-bvm;ehyjxJX`>>Wc-*F{$Rn1eLHr)M7n=|^!LE`$0L6VcqBqm1dUJxL6bCukpx6w#GX!KC=OvTK|=%#
-BVRIY_Z%@rj%+N0K0?6c!Dh|qLpOl>7zaf7!Lm9`1<6148Hf%wokK@w4=kUcw5NP~nA+2}J-a)65s5?
-jF8Q>m(dj{++S9ya;6GC|-UC^j{Ac#*O55Y;9=r}U1N5`t2pv)ebadz-ARiaU=%a{tXeFRWrW-{^t_n
-v-u*;L9ZV%zd_WcqM`-A<Ezic4;mAGXwvTSbT*)|P5w8U#MA_iB^U+QtqfV2I(CGo{!p5Ixe2Z8qEZP
-<K-{ObVqzBvp2-X{foW7(!_jC%7Qou~MDQCwJ&zK0-x-}0lqt70I{;b;A<VZb-D<exYC6?^?fb-;5sz
-SFqmI|uk+nL^=B8G&ya`d*dZK3v|PsHhgIOzDkT1c!0H^Lx*H?YNKR`wC?M{1cWJb3t20x<bM^-x?h2
-y|qYyJ4q%3O<@mt8LvioYo!WJlS_G;yjMI0jI&lT+LU6<+s@Dn)yXpLh@^68Y?o#gKmgj&;P|Lu^!Ci
-(WOd>v{@y$$wrs;Ca=RvM)@xoZ^F%<MT*Mo$otxr9mNo{W&5dvY20u9#o>GllR4!Ox{e!y1m^MOgeXC
->^8isa)&ZVBs`Yc-mOjQg8w%~}SUG)OrKHyLngLemTo2T|fdZ@aC-VEvshn4HI#Oci16qu(yNcI|%_v
-XZ_`lUL9N{a{<`dTG`#T_U>rMEgNlaH4y7SxF@)$eqq$cL!l_%J@2l4_QeF)@?O5Q{T}X+&wFLKo2G_
-5sSPUX&gV%4l6cNE(vl`FUBSaHN=1t*~jyqNWdBhL9zqnN2(Qa;B>sjv-sx+zGg_=^N@Q_QlkX6u~8(
-?2TTivq*tY$q*@v8L}4#53d8%(6*!SQ5v<-!bnhbZ({!m7_~6ot1-)OmnUC%n4dwQdn-I{Hm+65Ol&N
-J8Pp~=y3h5~CK4lS^5}AYp!T*tohMM;DRzHUGb{{?-kZ|+=JyGGkq1mBn@dOs@~dpuhTGH^UCd_Ow%X
-Z@B%jUsc<$pFcuA{hKv8RRFBz4hDD9~{dbzY1oO<J`KhSs4pUt*Co$?sFdmPNErUIk)EXM*I<z%3D$p
-#7D#4<on*C$Vt=)fAJU;mEZ^Vi*1KTogtAUvCljBA_`wqpO$tZWz1V-v^KzY(|IKZskNMF+2VU0=f4J
-gZV5HjhGCA961W@J;SUP*&^6K6!K<s=yfEH(q!;a+rcRv@9U0+Q9|FU(ECpR>8mLf_bi={Wh{85%-Fa
-f#Nd&`QjQsh)^^El+EJcJ_wW;dC+s2=CLKo<#b)?XjD#O_twhsbc4ZWYD?CbPRQ-_df4ysZ6!u^x?BK
-V7y{%vv#V$0BNuCBTWqB}5BKxRp&;RVvrnk%gf40>In~Hbl_bkgeR~WNw<n}HU|7s1V~TcFK=EDsffQ
-riy`9SjC(CFXZbqxjPC6?K_Efnd)nntHR`2Juy(VcS-F{C1Z@xV+&1QJ(THIe<c&mg+LOTOhQ~|8P6Z
-pO`@;D7CIfD9<;fxQ>X=c?rrOzn`RQi>#yUlB2_k}5LRPZ~nJ3plDy-1yK@h;>G0}0gDV4cP-SdUZx{
-!UUZ217>KyaZ_15@j*;SviJ@uSO2ST$1^V2*;-P#=|k+A7fp;Ft>zGa6R3@x#I3u?D4u73i4WB0A>}h
-cXU4o-sDL1OjfseRkKo0Q|hK6Gwq%Ra)pHaM6V?z@)#CIST7)|PNy*JTp6IT#PR7$Z1VK^sZdz6rk@I
-5x=^@3sUkV;-;--`vn=fPLdg)Su%0YnyWsh4UKpHAfou<&OOXW2^ORW_cDg7S&%VLhJMT$jwki$yxS2
-E^Bk&2V?)a^J!_4!Bm-5hOBA5J4nuGCw3;Ue*zbsBWq@Eb=w|)K%fBU}ek7(*I_xz5WetqjF?I#MSNC
-Mrn#T_+a6a^jJ1{}wTJ$)pg{RN4CNz}@aBa?zY<fat;;0yTU<?v~_-vP+c0z@8V?mg%F6Vc!u;@}^F;
-X_{u`4q{qgUhhzWP2vJpJC53cdWB#X&7=8)sYX^3ONe<e*&G3cBzm2;Zgmkj|_9q5O*B6C$KSmfFt;m
-&mOu`$dLd-pU!*&K61vxKY~2y_d61dKZBs3`uo0-j*qN0kNy%m6$f-e#_!PSdJ7F*6BA@*4%Oh)y^9a
-&D>j36e*c;$9v;a*(WFG@0lTWFoE?V`HTHMlGS8;zYK8j{6u>XpKkW1&Y0bvb3RFGze9-;qFC8Q;?I3
-9#+kcR>-oLg8{qwUQCkOtu(?38!YPS?pr`;R;1gxw+%vwlG40o&6S(C}P**v&T>@%snma*6LB>o(Y62
-BPT>ZQIV#d=Agu9f63v&aFKO&<QGMeTc)<IdCdPUvm6SBnXy{fB6tXQ84}D1TQQ4w>ZZt;?`(Na3^U&
-vLvm8{kVqGF-hr9!%C%3ny=uOA9?MnSG9v#&n|SKhcStQ1fNVSrUb~a%hj_&c;#K`yv1Xd%i_Hvm@6t
-fuqSS8w0gMy!fg&kvoj=6yoBxq5Z>jxmk(UbpLR8B_JQuE6Hat1W*#Ibl1(8dIN{3j2rtF-6pM^w<nB
-q?FdmpzKH8<v6dHOdKZ;eg*hr9rG}d>l{rApAHguku+!Dk>oRC=R$X1T5>l$bIeSqa)g^qX@0)-&v;V
-#|EoFtFo4^H3bi~<JfhL|Fn|&4=s1=RaYfs#TAZuT{K;(-erRt<cVKaCf_!M+b10|{HmOOttgVEGUAd
-tZPz@_?iL(<l-F7l}>M1pk*Z@7_n8BA1Me+8qRgIN8(Xe?>O<^HJ<%R50!c*eTS2DFQ)VC3SxxZJlv#
-O#BK2v#ptqXI^g*G(h0dP}kt%C_lN;FkvzGy#F&h~o|{*&#q^uWt{dX`0Dg7~{FRMk*G1dfC9<Kx=yL
-VIO|=EN;GsHZiL%P$4`@NT{cD-_)`Ja9^^5i=b#>ZBDGk^A>1DKRZe+L{SOF@OK1M1ln8#|K8LE{Ozu
-;Yf3LU$`eW(r-=QeEu`2~Pyzy_8?^H`Y$Y=$s-4|gn*)A7u-L&=uW=8N<K7};x&pfg9N`YPsbtMYNlk
-}UI-oX(9GW?X4L+nCUMDO4NJM>8w=Wbyeuq{p&R)=yRyou83_Jy)Zt%HmcVKzX_3h#h`l*o0m$_6-Oz
-|P%r;Tu;8S6@rN>>s=3=WNI$B)$oDHaB-+ftve<*HNQ`%Hm)e0qd5c6v*bGC!yDWi&waga&9@Pe|NWT
-aU=A+-bVeybM7MG(h!q$V1!=j@4Agc(U_@N<k8(0tNK-xay(D%cLg+r!m06WRUI`)1z(?*%`#cpsXAq
-NqMX9d@xY;jw-5qOE?L5uW*Q*oo1^EUF{t+p9rmOU&A_z9MYT(mDI};Q<Dp#14^fk(&Vz2xewtki{p`
-NMQbMH;H^myZeYMX4WA@D+KkSCr4I&*0H2>l%djboR}GMd_%or5=rZk7F2NImK|zxs8)aBVEYI=M4Hu
-$Nzis1WfC5W7%QCXO5rb(!%1hM&L`zzZ8|joYJ)-xE09ONTPOp%$>&O?{0Xse2*u<JX5k_5|SCE+nu<
-<Kod!xmwb^tsqt9F7@s^sXjnk%HN(ET^i`@Z9$0=?$tnc9K|eu$|aJlm7=g3>+MfZ1fW!a%bC{V4alN
-v`g#dGnXaB^kZJo7X&6qHR9d*HraRG72vp_NkslyaB22)Wfh+V-HJn`v9yLFZXmDSyto2f|mN2g;UxY
-wLnm<C|B$|SPMGzWEBnuQ4PX#9+T#n|9aP#Kn^Bg9H}`4Ef?!czVS-tbvIPk>8|!QQiuK@$W${;w6)J
-4wezC}^=;EHb*lf}em`*4FZ=vlhDVX3AVtwILEt!r6BJ1uGSo1F!X$!15RTy}b@*V?*jE4xLqF0(`9W
-&ffl{6wWXppte$;S2j0Nft!OW9`@{kc<0<6QR>!bZl;Kvwv_G!;1KU~iIAW0C}K|9z1TLK^KR3bXIq}
-hMMe^!X6vV#SYeJ%jY52gh5fmVlyR(#Z;cI20!$7%MB=*R2}CXNxwPw{;}$Kev6A4RGpJ~|Eed)aUBo
-9q(t*P_$kOro0a0Lx*UHQ(^&R52}%O)OSEu1#Hq@%n{_JFo{${EI5k56?&Lu8F1(-?N4uHR~}8KWwX5
-HuePqIOHV%#Y1P7fAwMiNfCbgR}tQDcoq1yGWIWdq4wxaAA(yq#nrz6)_w}}`xX7(1^%u0{wXope+ID
-lZve|Y0M<U|s0vm{(k0Vx6_7-<R0u4T`(yxPcZ62zmWGRaaIK*`!%saU5BI?+%sn@JzZ_HVTXt&E*wz
-Y3*g_4U4MLWw1SGZ`9;_#3`{j%d8J<=}8id5-)XGSgc^7ZA1T25j0~-^m{z{t7#nsbm24sN|W2rX__0
-oXR>1{2|)jbyydbvo3S7GDecc6QJYDzrT(mji@rg9TzzBkd`@*@K9jIo+=3Agp_1ZBmn-k>4fzxyy&J
-ZPNceV-r`EV)sYB3{({8SInv^?pHAM?KCZtO7JDB)8^yB085_xAM~03>MQ9srqufBuVBO0*Z;be8yKv
-rh}8ov8VmJ#~1tz8mrj=Rk4Q(rI%j?#O>2O!$dmwPa3;{!zke=3?Q4qCc6-+&RVUQBPTS;LdvF7wDOn
-i=R+5qF}Z-M(#Q<CyZGK`NxLZYQZxE7Xh)*Q>I*J+XZ9qX=11j@(0UPXbRRF-^DF}{e$_axsv7Qgl?e
-w&OUcP)SLt0MN}ZnLke8B4A#W}BI+kI!s)keZo}eL0O?Y<SfDRUCn?SoDVz_v^t(4}kq&K4I_2u5AEa
-M69<h~G(no7r@3H2sS7r$2G;6k}HG)+Kz8go<e2F-IQbGS;@ovQluakV8bLT(<Gq{3=$797`UI2THyG
-)%XxS}3%HY!WvYz_qswu9{_n_w(hZlx<X}x1w?%7Xm{x%$*0;quLl*6#bkc;eA%0t(j)GOk~dSqg#Rg
-b+hugHJ@$x7O@xZJJ&t$wasY~@&D?Cg8a=11^F8j3i8E-LLn4|(*%m+Fa=X6wofk*fm1YsL(o3m?5|M
--{W4=erV0EYvn3xk*`8AG88#Ums{=@MbgYxfK{P`?lMeCqgn~y$LY?IY8}3*I{>a$jp9Ko?^A`1Kcsf
-=v@T1!)$v@3j@t?O=!SS&cvS<I%=lFf1!l2Lk1#*nCC-8@f^GBa#pTLgJF65Z?_LQDNj~h8?bRVJSef
-mf~o$SyjnUAnTOYd*=Abcj2_2&r%>H_%QQI|95i`n(Q|I){c{%@Fh{-2*v)<2(64q=a<w*5~}DAhk%v
-q1dkiX`@9xd6qjwwi3ctjJKfmO(i_B%V}8u2LxE#a>d18AddAlI1-eRmJ#jUe7)~TnMeg9#R|vK6I)a
-qY(86s_mGPJ}XTB7|cD-=H5DF;rBq~dap$>2GyQXsJYMhW#S0R>Viqvw*r9EOJnahs)Nr<{=$>mh2^F
-K_xtOHQn`h?dbh=gVZK%R&BhIqsrd^sOybHaPB76IfO?LgZu%WxITeLiP*Bb^!`IQ}imld;{!!n3GEb
-gF9z812y-u%!_u#23c_BC~q<a8yZ_apP^E(Jp>bVh->Xea^;t^=GhqNipRgRD}l0qL8oW7|mC>42Bg_
-c#OcOPsrU^{W8cY`S<=q8nPgbg#t%L&q5i+zJI6;JE{E)hmH48J@kO7%{5^zQ2$5lz$i7Fz&ikkHmfP
-fR4cL2T|Q@<cQ$?9?uCo-bc|3yE1cx#E%rnV%vX3O7@{+IBp=&JGb)K;y182$PfSTZAmo?@)HVb<4Y8
-pI<NcIALsTMJimSLyVyBDN`F@_ApBk?D6U)v>QNb17zYiJQizPe<xjhT091xa}Wn<3!I*|n|T~WC~{F
-N*wwpB)BZJSyESgv@B}9W0N&iSh47p-pf(t4JvpgbVWkC`pgpRO&pn?9nI2s|=I)+ibKvax=JBrp@|?
-TtCo%wy@R&E$2`UlRx9eub8N9amEah?#&BniUcL2V!cVG(f7k3AHK3`c)yPAT}DDug<*6xc|?}pw0?!
-TeV`A1^?dX>x$Td)@7N?1c1I=mAG*fI>s-Oims`L7BARC!tNM6;YEdOP|0l3jesPpBC)A@hCLqc~9EX
-pERA!3Z2uJuGCBq5(usw`5I5Hvqum3AKv$zNHr}4Ll?a_gh69RI~M}zm;b$2-~~XpTLA_noijh6Iflc
-^xiGGN)Znmc;I^9fyK0gH9io^d1Dky6h@))l`tTqVbF;PTw|2sa^~i_XsSFFS2|U`jq}(#*8n*#n)b|
-~=hAmJ3>8b-(~_L{%j4R@>bq$k-h6vKR2{yS*7N;5WvocG4Z86cWL=8}h=-<LonAIAy`W)E6Cz@bt=1
-Fk6vI3Dh4{W%RP>v9fg@kF&$<eDctOfSG`i*_)xg+Wl%TT48uNK7P#9fHujbUg+q>kxZ0IRI{G}%qBQ
-a6N=VL!IW7Va`?bHnH<_aK?yYn@d6g;b+`t8vgy)t%<q~p2jK%3fN?7Xf!IKdVKl-rPd(w82ekc6Pw)
-(h?g3Oq@Se%s9y61+{-g(-U4Sz|{`Y@f(eMQ#j6R9vp5<ti<MetJl{n1`k;67}Zuq`?Cuaj9?ef?lGu
-oyBo9^-DV#y-vxnYAAEq+~2LImde98UDALDrAc`xS`zdSd9rX!0_e)CJ6*eY(+L(3>rE0xskn_Z3=|{
-KU69x4xLD&1r9v)SX9>&=Vh`_6mbxwQJ9hx=`c?vQ{x2ui=-<Ra=-<FW=vO#s|4TzOL=psY^kYIhBto
-e@xrXRH$)@(VaT@)S^btWv7vqj$c1)3z2T)0=kDl5`FXu?LKkE?rr&*ICzg7)S514as%96uL;^>@=jz
-2hcu>A?_IP{weF_Iml9*vafu_QwLSuf^Cq4?+o$Um-yIeauN9Oh8S!9c-2#)avJ=&|ShhkG@Ahy@*9j
-qw40(&!LhgYkpywqHMl9z2uy8wf&oH1t<Eh#ijk-y46zLGaDK=}mAl<}pIDGE0l=YFEF?t}*zpc8C86
-104_u_yY#o{wW6fNwfFAf`JYQ1bi^icC=P&Ked&AXY=i;oWwvf!*b27qe3>P7`*`tR)k}bsxN!gDUp>
-QD_b3MVoh$rtAX+a+kegYy*F<2)+L^CZ}+&3+)K+#X-g>5_m<b;T=n5VRKPzm9r|Kc>VaXHZfu94{h1
-S4T$mSp<HcCO=3kZa3SD8&tjLu7o<{n1yJTpUKYD<D`A*Nif=Cora1`&*^_^rQ*O>TI7&ViVO)g=^(^
-4zzR!`4<DSK=vH_+%9R~Rx42v$p$bZX91uQmQjWA`sVc<gTm5A1IQ5A3VpL6bNIQG4(}X%d4W96930@
-n4E0_Xz``FpB)rEA?=I`{*2|_@T`RlSe{zXd8aSy7!HFdbq)19|~>q^|EJ99Q0EPJC;3D;>d2|55;y*
-rJ&@Hd))J~J-Qq(J}ph~C*vaa-}9dZk3B-*=|Kp?J{ELGV1N$l+2NJ?@oq(_qilENPW16F_Q?bHyes+
-0n&<IRp*sj<$RQSX#KrhHe7_MA`Wy6EmO6sRt^7H7P$J3mb7z9y{{4EtSGH%*zXp%(e>iwR|K9}<{rn
-f26#Atvt8@oJntpnVmkb))3<}kNWJ`c9p%|I(i=4^~AsTd3<|K8l$6MCYUDB|xmmbT?UAS3se98(l&W
-r>z4ElyyC55sNKqJno!qM~CmiNnxg+W;ygCgel7=y=UGfPuD-Y$P$r2@WOsrt1_rC;C6*46QQyCcsi@
-}@DNuyF7|p9OxUKL3!JIKNam7wP;i4v;|yb$Rj$90ngU)Ne@W&FfZOF7*s>kHnzPX~<91(1d2|l-*T#
-q0KMkg)usq;W2VKzg)hP6rYb$+0xezE0c1xG<z6*0KTkhgbWH_Yg?b@kEwL1!R!$D;!`~H52BGeF5ej
-Te{@_v3N}C9_`<*PZy)qMPJMmAAEOmc(|f=|DFpfSL4MW_=p$TFC`s%X2ZkYZ{||y-6pbTa_DCM^0sb
-&GppSlEen6fbT+r~LN3+A6L%|_ERt65un&iuP1!sqz1OB1cL(#$Wpg!T@a9>6a3JCVGOCX4Y!Vi5TOn
-llZ(frSZC$J*~?R${l<S>vU=D^tRgc11DAW47v52*ZT?M(3F#r`jZ9M`!6ob*Er$vz>H$PT9M4&vw!A
-WHGSEc$%3WQiYO$K{?xgF*xU9J-ex`x)LB9<+p~k>tO&uC#s;nso$s5h}+0PN+Y-3!DkxIrHBfDy83>
-tbh-<|M7<%em6Y+;dgwNe=u9Mje#{sTld%KcVa8>)5eMwe~F-)=kUJ9n%^R5G3$=xVZS#ReC)FTwc_*
-N;lsi4_y4$qg)CFh2=DK~?W@8N@TZj_Jrin@vKr$#2d%DM<s5gB7UfRzb$@Nd^xRxxQ~=7jSBecq$#)
-ko4Xh-jqgXF3)>-W|2esgxoba8$k<gt;&QRpUlH|A=vu6q_p_4VhJr78WEs>>4=HOx5HB!@N#XRtR4k
--PhLf^ML3K5+kE)FJ227ON^$ysT<R5U5P!T_(?_jFud=-Ydvcm#P5mYc<ktzGy*2<-wY8IkkxSDfAYf
-h1k(%6qvyHBR3;8~=U+x9&j+Fmf$!)OK}G&UKmIxASSf@(UbKmj({eNHx=nd50?z+LXgLo`c=(RiD}@
-P%&UTTd_QGVuv-f&2&T93d5@1AK?D!(}t8GA(<lZ(G34+1nZqSirf_)={;J}Hg8M_(1cSzppi<EWI?T
-s)^3b0;13NnXI!+~+u*Q^m%7)!uI^Wxf*K0U>1Qd-olYbb-T)Oo`@GLxpKU#bBw1K+OP-bPSyHsPyfC
-aiU7nK>`*;7nDH2oK)LU-INd_6Ylj42qJ@e5i!m{|ic8ytiVtjcKecl8aSeu?@E)yw5YKAbqUpzph=@
-E%{G$VYzv6MLlH3(3TtHr0(6x#G-t0{Mk#gi5zQYLg^7?iJ*@K|j*_8s-n+4#*#CmmIMn3K-s*~yU#x
-Z%S|jTT&-aZU@<s=JPR((LZ<+NQ=4d)CYjLubDyc`#t~Of61ngxu}!IE}fz8wt1z_vHtdBP!-1a{pu<
-=bJRLWHY?6;}-3l>~sCd0+;z{B5r5(%)EAR)3XIHux7$BR**%K1tpS3s4KmOH+D*p8j4W`SDXFkFMa#
-@1IK^<ghTsFgNbtzxjO>7g`i%<k+R?Mg;X2><Ok~gOAF^|DcW?ZW!7Hr{lxd;I<D^NuI8%tWk~zhl_|
-ENV8COR@b5cq>WM_&=x3#Hvt=x*WIWI__!b;S+kcolFuP6jsm7`+4X|6tBn1`?O&7w&xsJGVsy=01Lb
-``$bA0YLjbG)xl{5mKI@10vmGExxaAs>?v10(0Fv7gIUCRQ~;n#u|IkrAIJ4@cUOVRAq*0E1&8mfw3F
-x3eoPBILR1F3oFesMAl)U7Dj?UVJrg}|TmtQ*-G>!mvu-vg4iJzV4xN{MbsyY+WQ9>V~94773zX;g-A
-JON&>=FxJl%XZV-L9u~DsWi>`4KYw-l)T|uk9fmE%h`(qbEf7;Eb|c!`%~vLo}YmLq9JF*sz$W{MK!!
-+3448`wWOG6!F4VwgWidMcz02Frcrw7n2E`9ZU5})MZTfg^#mw9lV(kCIZJVQbxcY?OokGCW+}4SOcx
-zX1=Z@v)^aa5;^BuBxJOP?C8$?;Q7(N3Z2j{BI-nDunra+h^|fn;Q%;jj?$zYPh8HovJrw`JV|I7fq;
-`Ab@B`7J>AbyQ-^>BkZfzrp&wiy27S8+Ue#U0+oK;l&dYsLKe2DH-z(RGp3wBsTkC@?OP~-hx>@Tkg1
-Qwd}hoQgQjVZ<rt52?CoX{##v^E~}%s2dXq)g(~p|D)8thOPJKPsvC=1J>P2L#Y62Hj)K17kW6r+RN4
-OTkNL<T8qGq+F%&sqklvxogc_FRQ^6bKn1MT<5r~>@b(#E>Sc7W^2FMw))$peH?h}Fj9R)@A9|*wS&5
-TY(9h!XY3#4n*GL>b=kbL`nM_j&B-2zA8S=Ueq;LRJ(PVD{dPGH8TVtqpTThd?{6phG4i^nq*~TLvh6
-s>?^o~(g#7>G^?gUH|LEF&O1Zy+rD<{iQVKpy01lI@{A2!_ABxilz9SCm2p%0MmCF7T``S?*g^wB+fg
-SAJEIF!Yds@D~$kL-AhJNaMJ8Fc|!(=O?j=|FOqb~VpYmpdn9DFpIey}9=O}jffuqyf~;O%KU7JW=$(
-?c#h`>a<UV3;^cby;*ER^-!bdYHl!M@!f~&QT6L!0cbaQa(6fDK!4e;^5yrV!t_eLBF6+PmmYjUk2!j
-bB5A7cy_hSL4}RbRp5K?$Pte0?|WK}dy=<CNR5X!%SHau0r5?*cL<8?8{E(z#&`#UQB(IaFRa1skoQ-
-Hz-HC-roi#dE!2HK&s7wU7gWuL=6xdkKv0!mEj93A_-OAs+*reXkbMCBNY)+yIIBlQHZ#cla6bleA!s
-?8wSeypRjOxs=A(8^_q|`fFr+r?IQw50nvdJ*e;K$tZqr2%$!#AhzKeWo8^36kI~!*i)*bI4K115!mG
-Fmcn!L}ge*n+Gj-Fk&;scEhzCGPVyIP1>X3gh*)fmz5;r_5RSDww^TX^}ccK2t}N4L5LWM1iFu^tk{d
-&^Q-%Ys!$$j71g75VSNyeap?KO$-1`+om$^7QuGV-Anq&n*M{Juj-m^xxfkmG2Mf(83h!Ch~`UfO?8c
-RuA{HhPST!_A!5ZPJrX^h;}x=7b^x&@HpGEb{xQd|5Wt-uj6pX?Yw^;7<m-?B)~eK&-frX$ucYd+oBf
-#ZBfglnB#q}xP0u(dvs4%h!+V&v=OSTjNbJ|&+v?a5b}A#2eWnvv-Uy`UTR8dZT&H|tmL#;tTC|xTPZ
-@W@N%_#Kz&_d9kiJ0UesBj!_qdL;!7ngb&L%La<MK(AM+a}rRRi1N_qqB*EX>pO~?=|>ph^Ob23i^%z
-(>n>sM$<ZUe*6j=pv}%~M)&8pVy8z=|j6`>A=Bt8jZtea;}6qAJJ@2%^Lsg?&n#u|e7H5V`|r<bl~31
-bK3y%9wGc&IEFSsoHh5nLJaiU&xN>dhxlc!xK>2@}`23!1YM|V&4clToYA<$Yn8T-`3vv=s#$>P|56N
-n!LTko6&(&j?vXn%or>O7)2McjO@T{xe7nqTK$CcLgyrvZ7g1Oi1LIP2G9NA7K;RURPjaG_|L^h{{$5
-7*p_QgSkAB2i@Z0&qTb$gFEy<Km6wixr<sSso7dRPU3xh<)8M>@<d-tP1B{e`wpPF|S<G>@c&|6gc<Y
-L)!{}>FUG-MkG%ab}3_^_%E+8iu7hgtAd#&<0zUIK5GvXMi5h%4LwSG4oO78_SN0YG}!peXZ&*-u1U3
--NnO%({y_s{V44tp>($o@5AK)uapvG2}H7va`T#@<ABuPemLP?C{7UAu$m%E7khhF4F1xq3N?&bh+fb
-AJw2mrMYv;#Y6%9$@x@pH|qIPj$;_W6|6z)yde6@}cU5TMc+Y$@6?4l@dM)bE3T4jdV3G-(e|w9VUo*
-dac{^6lYy;?A%f1?ImB^>>uz}#WTlzGjeBKNBYgef3pn3*+GElGP?NN+1UU2!w|n6dl{DO1ix{{fBav
-nbN;nn^*=J;cXaUeV1I-GGz8HUO%pgoVi1f#FhzW6D32Z-(Ud*_0E!*GLHNg|2uF|lboP;TAfZD;3(g
-OE&zFmH`KRZaIx0lery2Svg`)>fKtIcB)W@<YqmMHXA6<+6oFw*RynmOU$d3Zo4kl9QD0ZRf$GIpys{
-S9<ilc51f4o7z5uxb(sA<LVfoJgSpjtuscb*dZ@kBz7;yRpuT8#eE`$#B{5(~<G2L^I(Hn-EnO2o7Mv
-I{%-13&-{gkVD0J{dCe_xjYuO+C}aC7HLb&Lb&I$g@4Z7HwB&J>D%$&vR{_w)cr6+~+j?s+No9@#d&m
-zsnSx=K0Kql6A;Y{9ecU9K^A<ZnL%n(e8JN3P5xCqws#ztQOt-y%_Jv+rE9Dh99uuwLe|*uU8EG(@Xy
-Kih;j<$%od*7xNwPjm7bq@VL)}SMUrHX+EXhp;XFZa?^BU4nZ$p;XtO5`(5F3FKn)D$&oju0?r+wqK^
-4yYQdV9C+&MSzve>!hSqtHO5)9_#P*epyq6Kh-7lXqJ-n6r!cA&l-q;Fop3faGjC5Ng3-#c+3xRaT>-
-x^j{=H9f)hPp+>ji?E<<*y5NP4decfX%{J!sDPo+|?v7o&%UeD`l@R`7AePR^So@Dq&%bn@)`E+0bYm
-G^Zpm&WaRSIzResjD^e5-MnX1-uetXdWK_Ce@p&q2eV|O#Xr=D|Ru2r9kp9Z%XAgJC3Q)+=}~6@OraZ
-{Ji7H)9o5SbEW)xngn*F;^B!!Ru!Y6sFB$A2xKsQrk3NSUS{hg0!H_D<6dP%DI#;ZF>ENp2oR2<g&>$
-Tiz1`;@~C3V+|fLFRSgRl31m4BGu5niJwJ5|g@XBNkk8`emjosab$bQ2;;mUkUSIo?&XX+GBlccz9h+
-LYcELmR(#dyeXuPy!pOHrCQ+o2HxqdaHswJrS08|vR3pI5#KFn;`4$nxgbV;?!n#hp~WTBMIflEt58B
-{bQU59(_ezyA(eV!Ll%s8MDrEF9;OT{<xOfx-c4ak_8xR+O0Ya!UHWf(_RpYJE7jOskM9HrCVC99^)e
-$Oqlf0bFcp5x+e=HW8aNqB>(*sE{2fz(x2GcHbfHo-3Ry}e^}H?yS>2y!N*X!9zb4-WVvVfm-k9Ya<2
-4^H34GHP$z^<2^QVmEShudP3V2H-CjroSL89}0W>+m`L+1<+AT>#Hq$Uf<ysAamgQZ$5)7SA1d;3W7p
-=qMzAYeN~E-4$4z85IR3=YrXao8-xvTwo+PP-553|TEcte)}`IBv~|b4wueLK`fF85A#1N=#+LW{%?L
-b5e5exPy`39&!U4``>{Lc!i@x**9g~?D8u}B(iBRoWouqC5O2zrxO+x*tLg{7L5v){pTfztP1o!LyJ!
-onyfOe?UtihIPI^qk7*d_j4uVVyPS5->E>%2}|CgSR7G+YXfcgn|Zj71eYwo!a}Rn{QTT01|@48fDH$
-jPni$Xc`9OP33NHZF-U(;S%Qr;8~KVT6*Ycrqdpd`|_iXBWiyidFiyWx>l|N|4NoCb~FPJ4+kLtOWEN
-izS0;Zt>n7n#314jRf=MvS)#kTL4LDyM!k>pe^qDVz%rNjP%?VR&9aNgIcIS0L`a~g*WX<zC&u1$y?|
-2x8@=y70Y@6L=P&-b0+nMM~_y@^K-d9NbwmbNLrBZ7Y_P}feJyNqm~sf(Idkh!9O{cS;KMvGJ%_g@!O
-W?((B&5gRPOpeme1YBUSEPzt)r5^b&}oR#@@nCI?L3MCUWFLX%_L^U}Wnhw8xO0jY_+Hnuu8t>qvfeC
-Hd>9$&@iL=n>|?yFwcDJ`2o5}t+Up?pkUJ?VZmvVCSs3HU}m`pl+IIjY6&wLM=-)bwWwjUnpZB@<Nqg
-Qdd{2IAWOo8e>D9~6ZD^{Lf-f5TqiL)N^1v;X6_H2cl^5A{EeYRr$fxo`E9BpR|mHNgBoc9I{(o-a@E
-Q&k5iaRkFKh{lg)NQl6`_VYNDy6|JcG5sJU2s)a@k&hu|jC^R{$syc|k{?ep{A<2Mezcb#ZAaum3s0z
-{?sKeIevlzT9F>+GCGL<eqJA&e?8t8ie9)g2dQ$9I(WH~($mAmomVI0>6ZnwVIc(eLLxS~?T_q1-m`8
-`J$G$W5(VI=MgYuE1M{(y67=w?U_Z!^dDNgQ}@|T4k?Z9)(559!L=&zWRq>Uk&@XPjaS$ur2QvkoO@|
-mXd2c85oi>@e)dxC%0EOX|+xhzU&W-tREzsEjbm`Dv}4*vi&PX4|$7=K&!v(7Op7cN?Fspt*K$~tPvK
-EfRosgHTo>|{UPx7yB`{jNvG>r+yGGrx@dunQ0Y+7I~21oQif=V!t5cLgyMp;zGB+M@M2_z*Nxo$p#c
-!K{5`dv<VG@yKVzvwG}6P+K%7S+#B7R&gxQ{UT`Q^86o|8->Q!hl`{z1P;H$&~LZP&a?Xc86BARbBW5
-CDZhha5&qXD%7TvX&!vtJ=aCgFLeVYU64%s<f9|LI#u?$}Is4-SG=G#*^n1D=@JI8@Ux4#Z5AmCi<;O
-AeV6i}dtLy@Nue(ebf!3MIDR-sUmZxM2#pMMzugc`AlYEw3X*6JtX~s&n5l(k)+co8`OaW_9*)_xsam
-C)}s@lZTYo$vVv00FnP<d*U5V|(c3lV!*XGRokvKeRgtAcj+i9<c$oxPya=l8jybr9ltbw@~3)EE977
-m$%0;z7XgOL!UG*d`%3JH1avTZJ2>@b4GgH5ouFBsfbrXN-wjd)H_{3gf|VWO4?tcDcIL8m9r$bhTcX
-&fAkXg$u<c)kl9BNrdwNKEUpU>eH=s4IouP7ykD8f2#YEW;eBD>p8#T&58I#Bf6T=2m}I&Rx~sEz7q%
-#zy1TAYnSbNT-UB!uOi;SC&C=G1srLwm6<D7+Ic{Djfa4=o47Wl-b0%k7sd`#_uM77MMxFiqw&aYA2y
-IRbRb;`@FKPkNa*LoxzABq!nk&<xbN*$ze~Fi^(d+5_5g74ZDE7>^12LOgDR_a3;*Ph`sL)$&INvX7^
-v%hI(Z!U$kA9XED7of#MN^K=@!+FI$L@zgFO@vyKd3PsNNSQz^sRK;jx-)kJsr*cpWAJ2aMH-6}6ty6
-UtEQAWG9M9Kh@z@>lO7dQ5*hE8Can5<3gtKMO*(E|J8Y6Gwi*@GAkz7}Rqj2?^WJ*CSTnh*xq;<y4{|
-yH?mcO!p-w3V!5ia3e8E&V|C`Uf<aVr+bv*0k5`cl&VF}9M1N9Z%#v?d6IyvRE-GAAxK84YVqJyWZ^O
-=BN&a7nZ;LkXd*l+#sQFFI>e|6@z64%+{?XA<A%S0>J~F+-rN{)3HxWJ4EJHBGp3cQDLo97uwu#JrXs
-omYjrrE%OiOd%eB%5wKHW~<vUDf%D)Nz$bSR;{}XTWFTwviT@pgTFissY7=kHk`+-xRY9;-*_9!8DLC
-?p0>Ah<VdruIBcU5%o27c_VN5ntR<pktEf_PUkhrzBu+K9yNBTDUR$PL6{WJmpdP%6IXa<+x3<J(DQp
-V##h?1zXwnG{odpBegg5QT%cniJjgLK|N}sa;Iz$8UXPupiub0QN2iZEwFZk&Qa+s?6;)cvo2NR-*C#
--r?S7{a4s8$Scb-%vXPQQS#5pYl|0b?N7~D?_ACv|9)|X0p8{;6~lZpzj@oEye}BP@EmRYQ3O(0_zw&
-;819WghBgCY`iG+nGg{vukQr~d=h^VOi<Lw{ueQs6n(T3r*6r;+N)gI=gK*$0K%TzVU<%jSUU1^!NZ2
-mCezT14<VD|N<cC`G{o;4y+4yyuSh3Hx)^@CaDaG||RCDD{JLWIfRYa7v@^>Eeqh9p4c@Xf02>rV}2>
-3#T{#_pQ&xiOY9`sut^=u;w1bgYFT#{@p8q#CZaz;-Ifv4FPrJOFOtHnNUNK%sV`6biM1riliYe7J}_
-i+><*VmH`2qArSLT&isET<Y~x7^W3jk)4QajK|msZYAqM>BqBq2+?rEIF1v0E5&*%jwd|7%tHXr{&x$
-AC2wK$Ld}#1FSv~_uidF!gT$>KyM=hsq_N3?sALza|a-=zPcSAw?U;qKQAb0S;ZkPJMtbqJ=xS|{XTM
-!<C7}`(V2Ap@FZ{U+7e;#Py@KR0Nm{sI97c$Z;~^3`9-VZFnS)QDdOAyDno2AqSxS9rD<{E^W`M+ey1
-}$O27zo_PZGHS6o&m_bkKVsT>~gp+i|b&ex4_%5-t|Fm4gkJV6CfLJY232K~0hrq**YP4;YGcmSPM&`
-gX;ji}H*qIh@{sw7X&S&sF^A`2Ohan_v;1#diJ(~1yQ1jZ{|6C0V$d6EQLTO~mMb-sFsHSO?Ho%>L+Y
-q|Cf(P*)!SE3U?XliVvnM)%)-=NN&E0(efsL{MCKuWF7NuuOK7#y_+f+uH%J*pJ7-lq({ELjXEccU2t
-SiHLuj2u9AOdl7zeq>rEksb=v#f?^ZOi&LAH~2R}A%oUQ5$tNbdVLUhy0Pi@Hk9CE_m~hJf+jprv~iK
-qg*Yxz29Q@s>J3hu(z=As*l8xj*(mb9k7sv7VfI2jj}4QL$deIxd{v$A2meICx2y_Dj+rLlR`YlTs<%
-)zOM93*&+bF~6RG-gF7VmOzeB2iKKMt%_$Hl+@p;H@Lq<XxO|78ZGY|W9dklhsWH`j$93Z-c14$Qde1
-AB0Yg`cKveEvEa!&BP_zu>Cc9FYHL?@2{O`5Lkl3+M_EJ<DSzH>l8u|vzh=Nj9$GEs!Z0yFx?*TCj^B
-`DBTv_c#WZIusDsnp96I@s8=YCDW3ya|~b8Q853c`nIrs<XPf=VJ2q<<W+duu_`rfa`*`KHoAaD7Fc%
-5B)OLIIVZxL`m)f>khz*+dbM0YT%2PF}+AesBEHzgMp`2PS&TEwCNxdGPN5Q-p*R4fdpYJYY(De*|<L
-7ovDB`6^U7|1XGZD$1k%gI`j(Ov|hZT;5gNbyR_cIG~HbsNyYFA6g)uol#f<o14zX3wS`#qOvy!jr0p
-_{PTFnI^nA*QXyUkDeGP|@CWV|0i|XJq@k?M>S|5B1?g`+E`{*S1CtSw{Vbn`x)VV`<la0f+ujsA@ON
-yL}V1|gUwO!u1ex)S=M}}D~Y;$>_fDz9Pexl<6_a(8pgp>xYBcB%vH$||}StW7w&E#fQYC>l8aL8C@`
-@mdJOVp1O{a^rkAY;rkJ@SYJ$Z4IMc*%HTu#`$u=)5-1-9@09!-QcX&s9xSYw1&-`jF;jbFtkHz&47l
-U$omrJek+fK?20Awa~oF<P7PCqiPy!t5*A*JKr@S?9xaviY%a^48?(i`6mEBXX*Fp>gj(oNA;gt{7>}
-s^kYtn!j2?zM5yD&M@byPDDqQdoqa$L@(%>v%Wsgsi^(@8NQ7_SXM9gaQExH%c04BjfqyQE-v=wgdp{
-n9y$uVA{dM@;fjNQp>=XPp6WnbIf_JA+u&1qvjm$<rlf?VGr4II<2lU}$un%HHcF{Y5?e2pl`TiO18v
-czq?{3a-x1EjdZcLbb4`__zy#;W)IO@YPk$B(ZZj11jDJgMJNzLD+q(p<2c`|gzy({h0lvMbCFeSyW^
-!*DJ<GxEto$ep0mye<)qHyB;K|jS+f%lrFi2YHsM3o|)uW&o3-u!=%nmY<(eWB*J@2I(MeWc>j^z<_d
-%6w4J(`93zd%Z_3Kw2L?u#K7^*a#725$LtJxR+5U{leeS!CBR#2A?~jxao=>r;%b>-F&WxP6Yi99l5E
-3>Jw+G^Nj|WR-$qFoOiI$oL!~%@hJwgSiew(@L=$z$w~(H;u=p8bm6T;LRW*m-jVaGyk`)N0jQbrC&$
-t1K7@|);rimm=(*7@F35=`U6BwDZM(s^Qm5{>!5ekj=$lI&cF;@WkGCh#&U$RMtbESI>ZCUgcZMm&(i
-wbwP6M+}X+#f;*JkyKj#@El(j*US!)Ht_X7>|z0A>#YlNYO`%FrWHl)pq}EgfWTt9C>5lvq`<8n&k+g
-UfZ<(292+%~)-bbmECd;qibs8hFhY%okDmdxF9DuF0pSEZ|juMfk$V$pP~u7UU|d_OpUcfFFhu{Hv2c
-oqzy*CPvRbG1U4<N1kZLJi-ohpKG!?hX_9bVLn-Ndw6Lu#IA#3Jv~iNktjOW(GWTQ;W@wh>)?+%b}di
-_1L5)bJUmNp`(km)Vj=*2Rt7sbWz6$TJed5>UDQME1?c4!2e4r(=LltPPuA6C?u2m|Iykq^V^`!%^P~
-#HJdlMfkG*WQie`sgUx`rT^XsWZmuIE8hqiQW*+v>1ISVUHXQ*`<;d^--`jZusa)m*_(29BIz~&iphK
-&bO*h{o=g=w#2A&}Pgq32}m7@hUA|A_m`Gh{B{DAHJ2pODHY84<80uQQ|hT=0U~j$p#Ai0sM+TllSL*
-4u|oEoJD*r7Azg&iT|xp<HjzT|V*Z#{cXb7^Q=Q{Z8%4Fy#Liw)G#KuU}y_Z<~Jt>Hp{ky@Bzr-rX>?
-Yaj35|A5_pYoRYV{i}<7i{K<lVE7S2sNFFSg(2wk!G9#a*J$APXg>nlvodkG7n1yU_v~I;3issAZb-N
-HmwldCBKBc_DEgig1Mk}1<8d$k1peNLMnZ2#JAW@Q1<^kC27M1=fWi%Xe`bw`?P4O_-}6*RypNO!;=L
-{vzlZvT@J=eocL&`*2_D~zRYbfW$D^Gn5YgTchfw>a5XZNlQL?x3!ta(hocc?V5V|`Vk@nZbQv7-a(B
-jidSALpUO1K|HLhtt1f>yp3QSN#b3;e3+^hcfljo#4)2pc#FdqeIPiTwdu07p}AeeMoGp+LPh;OPS7x
-JA13^aXG)Z`mnU1PJui_2>&&13Oy#Hud}ttv0x~pl@qK8z7tEdNUPluMJ(_=Efh#fcL?IAwTISz9}0S
-`Gb`3cj10?9c4LjAMxN0$PAQCZ~WXZ`JYPaR^i~cQg*{fY2N;2kx=dJz>C6?Uof<_;Hx6n*9i!WuQPh
-S1>pTTd{+w+dCAm1aY+7oTb){}sINSdaMCUlF?dJ2#$LzZ*(BNVU{Bp`#f=KlfrXFG{*s|S8oUnP_A2
-eb^4(GPhO1pkM<+cxxBK((;wOl9Co5;~X6xzEO$(aTgnS3+vq^jkSnkyI;!s0RHv}0dk5!9`5xNzmit
-r*4&>YV|8dq)?B9Avh^s2)etWF)W0E;2Q-9A(CZW#9zJz9>Y_Ri#yqmixp5GC&d1x=eThcs^E+Y9whO
-aB@oMg=P))ldL;?NWJ7)N%Cg*YoUkr><RyOA8Un_MC1aP72N>uGl#$^NiJ@W!5OaFT0XlA5VVDfI~%A
-eWANA<y71yD5#k;cas)Sb-kg}C^~Cqmf~mDd=>Je5w?x_Au5NXE}2e$kRLqYa;TRu#eL`-GjdWc%;n2
-%P!i&`R&w9qP5weGE1({;YU4H2;;m(0>nD%v1U*pb36QQY`qJ`D;A!CN#!2b+IcX~VkdT&GUqn|vNn7
-|>O*b}@&6a~ymp>oHjKs6`HahnZu#97PK}kQ%i-wjRJyHS(lfaR|Ziuy7@PSLp`QSzT<CujMZm?6Hx=
-2q}oz$ySP6FQD4$#TE=7xJZu$JHD_wGeX<EvS7`wlvf+qChPoP?LrQ`t!&vqmhDp>dZ+J>1F~0F`d3Q
-P4aTdXt@S4?n!tm@d~)?&_`yMgdhHLT_CcRy0LPx7qSI1SfnsgkZ=9eGVw#2F5>SFlNNi<++{icygD_
-Q+K%&MNUf^QrqTF2S<EJki=PY6~?FeD|BMDIH#PBvMR+WJLh>5>5B6`@6&-#KV>lKi58huuh@o=Iw(A
-6*z6|49SFPYB3<CNg!7xylfi(}-1aaZk!WkGll7Eb%bgbzqn_)}1#du$3Cg6p*FG7aA|?dRepDX`!D8
-n5b@PK>AQ%i`kT5)%MLwb@(6f@f$T)Qt_|A$O)$(7{&B}c>BARPD0BYK1FBV!K@_|pia)}fk4nrFp61
-vb6Bk~Wk=VC}P(WW5KL-mAj5=Y!<>x%J2sULtI(~q81m{eXw8I{eRV-nn>G;ussUB7%)!x}$9xG<TV=
-q(OydHpGh*%IkRA3rn*2%mHzp;0(?T%YB4x(CUXBcDn7z;jWZkkNpAY`E})qp2X7Rdl~Wx|Kv5`ZE(%
-JOCeGK=ip3%3`D9oU2O;UbXupDh3-Xz&o#^MerQOK$Fj4XhDagDCExyhX}?=%WW$K&M1-Hy;2q<+-%Y
-Zf%R8u+OXj8jL@NH;EJ%u)J+}F;83Ka>4vO~m6I=5XN9-z&jl`20!#HOF@<6C&u+H$_7yv&Jhs_^gC$
-W7r~$c1Cwb&=BPzMju{5g$JN1Xc$(Qj7H1a&O{B-wIc5>DvgOgTcu{_M4VO@~KObGbpK0oOrgumtsQ@
-9?B-|ZBQgdQo!X9BeDK6%w@xaSLLASuO!gdL-fVM)`>ky9|KZBiPOqtj9R%<BOOosNL7qWyf*q>;IR7
-$P%MIfS%QW_e~ihQS<(_>IcsFOjhm%l>Dm;m;QOEo!(e@*OoiQW$}tB#a^yfx!3?`8>H3@74hEaj)VL
-$y?%+>}9^_JvWeg%Y|TKuiT;jKggd<^g?&`wa<Zm&y|kxUHr3;j0oO_3Bk_FC~Vhx$H-e|6z{5T2-&#
-bPpBdKHbn@6y-vB?EJJVW7k^)IpIR9138}qX&40Vb#Cx~d?#qDeOCSAR`M&*jpZfK21^X<rw<PL4wBo
-O8j%=}$jm-E;4Wl?nUL@bzcsjGGEA9kjEuejy{EimxtPuD+v~XvIz~7;TJ1Yb}p@qB#DL>G{bh&c$`a
-LcDI0pP3TKI0!{yVgAXNABo(ZW3iwSMj*1AMiSIo+TAojY~8f;1J`Za5%Uxm2puf)^R8u<|Vr4FfOA8
-e^F8Tvho)_8bu)yrXyx(*{4*iUk)Bw|#&lKdAo78!mJr@(>*e*}n>r0x{H!SW@pWm-d}d#zW7lDZs`x
-15Vd7gkK9~dxYQn7t4C)C^NQNC+K)&%W0~*>-i+c#r2DJ82GW{=*NmqItqNaa?MpU%_6-RAZV9RsAae
-Uy+3HcpM}QXS<bLD64HvGv5IhLaJbYvfm7XpwPO(CL4!1bGFnG0Su}s)1^uCfqQ>M;g5WT)xH4FSaoQ
-M#1##+AaXu3-oCU>MQb#gynLFE+Adu3~irIcK;5VX+Y`K`rp{ro<IMHWT$VRAHx}Z8FnB7&sy*Z!me;
-sk_$S-fve`C2HH|k$o>f7xaM~)<d5J&2WV#xLb#Xj}oi{ECwD7@#aVSkrZY+Eh%-b|DCM!kj8FuWV$Z
-4ol{xjb|WmbblpPrD;~-aCT!>90PtYcjXJbMN(u_6+$J*l%GxvAf*t;rTvk=x5tC^2LG=e<u_+3?Scw
-7K69r%x+YS@B23K9$bXOdzX*@){O*j8yzIsWB%yfRkX+U@$R{^K>!8sN%_B)hw}K|2TXk(z$o4yZnv5
-S8LOX4z~*fS|1l4JHx+F+e*2P#zFVG?W#M|#{z&faa>%nGP<!@w-@3lGyaH@GtNY$1?)m42*>>EIz<d
-j`=j#^*Ba7|P{?kRMaoe`+uXACMy$koN1oGXc`fdI_wW_`OM*L!Qyw5b*Q|d>>)Yj`e&91$G_d)LK!S
-C+xS8fmZSNHcTw+H;I`}>vK1Af*>^jRNKv3iwuJKJW+IpeJokb3F?1xl`_T2V=WQ?iN92wG%W?|9F&a
-{L?Ys6D5#CxOFW86z==BFr3()*pn^(8ad3B)~0J)x{!&vWDuVc@hKFHjUN`xO+mGgqTC;Jj~15xwz=?
-5;_S;VrF-XrAJSCg^LdygEJbem*f>`M1B(5Mn>hH8pn7pleS!5<+XjV>Z+=|dGltlU17u)wCQw2<;Nr
-9Dd21*Q~4aU37#G|{Gg^+lz}?;WTPF}T}twH_Di?L)7zcsBa(_}zE-__1{wTPFovrGzL)e_5UN!=%C8
-fbS#tZ#hY97dHpfuVzb@*PEFsf>o%LCnbF$|JYTNc3rOU2bNCN@oWh`^<pN|5;gKLUe2u4Vx<qef%U#
-Dw^G{?Mk4H}9MUUo$u=ZLzp2A`6s(|0co5IQoG&(v{5j3aW(YwDb@_wadw3i%XY@S;G@(VAxFBYueo#
-wqI*tv3ij*Yc%48SM_J_9e`URG<ad!1xNWE0w0ZJU_8xtDm2@I6SUK<M;OQWDA6SL9R3%!&pAjjh)rX
-4d_z)ZUk+cA9Hgkv=F)I_uvtR&=vRY+YySDQ_!et={cv?ISGvPsZLLeb<YgrjK&kNxH9M2Kpu*5jrjY
-SL2Ksbr}GIiD@N>}Ri;#03St&%1P28z&(|Xf_LI$&ZQ|j+3n<JQ$=i2DknWB*1P4bPZORG13_f^sfuH
-Ctl8;FKpZ+zND^J#uvLNbFz)VY59jXR;UAIl~y}lN-SpvSP_p9n30ZQ{}$&Xe9^15C+{$|q=V*|sHkl
-7BFiU(LOl0bM_$Xi|pgW!FOJNuZ_O}wXW7j**li%S(bl|%hq+xQ)BX88dFj2b;V)7=5XZhL|kP@hR;i
-Ku?0MtCm6Dj}N1J!GwX-}p~*xegaoowy}FqeavCbP9wreOiJ94f`Y(Q-o4pccBmrLwYKpT;FV@dn#&@
-x@;73>lqQ!CwF1!NVl%Zp&Ts*AgEqwu*SiOc=B%|CUpkx%kd$l)IP35%B|z46yIO?O)iPc(V)uVp-P8
-tIC1NZH&);fMD6SP5DNH24%1UdnYF1gG#h95Re+arxl~6m9;}DraZD&xHzRfF;l>Uf#80&|0#!v-5w{
-YoX+2|XHV^usI$<=XW@mHcOdNfZm0y=ZA38z3(4l$tP9uMOI?TOh<5LY>5<;+Q0UsRoFwd_LvzNZ&Nb
-6P7cIBF@?bm|?Em?`6`i*?$l{V*H9W^?OV@Pzl09tUZS@=OD#;qc=em+omkYd^sG7m}li1o*85ndRlf
-qcHYnaq{UR7l|wngj}s9w!Z$4<RoMoc%!c++ZTKtZU8H*SK;S=q{4(Sy5M-Vh`Qv3TKt##%cRx^%-ff
-GnH=NLBOC+H;Z+m*Q_W!S#va<-L4jL$w73cJH3`q`r(CHO_jwXYqG=GoSdK?94eb7n1u+SzT6iG)=b3
-aR>~S{^YB=RoHmNU814kmySOk!eZzvk<DUAfH0^f+{C{_?-=&T}g!w4E+Zk?uZ=Ar67=|Gv_8D))sGT
-Ju$lHGfeK%OcJ9P}9Jt*G(8&G@oW}|w^Mhc-%dE+tMjao2x53eJ5*Lxsu>IffqLKot@^a6bgMRo-R{F
-W`_``Y-=G#uOY_{d(-*=?nx-AiU~RS)+gF|l7^fbFbwpThn2k|D{xFMQ*Q*n3_^^tOsVzAI6?0b;n@#
--Q)+^?k}W`IljSwU-RC{wr^k**dhBU}QY&&td-h-w5-!===3G%!mIO=IeL&mn%S@hx(@Yr%)ewA1s)|
-f1?5fDV+Ev)PH<i0pjoZFIIs*3HO0NxyD{vL&sQGI84(F(dYEV+(?sU+ceP0?jpE}jEHt|p%wFtmkJH
-s#UMQBhlG|h#;w*cWZV~;fgY@^JVU1989CVue4>*3e6~OZzKLtHdIwKV;meqnPrz;%pLrr6c@gH<NJ|
-(0lW?D(F3!`5p;qWuKOH?@KoI8=RG_B<KQkElG2FMwF2*9lNd3pPXW`Nc0x#^I4uF+E>nr{--2cO2R%
-0(%$x2sn>R?^<fY+!$B=t6{ZY0>uV;CZ80%0Eyh3R}#)^>0gl{+Mhhq||P9}wx1tiqv)_)2S2@lqhel
-)5HF`22X-)Vk_tg}^2ARSWGF3mg=KL)NF~KBNpUFa~7ux?Mu!Uzh6tKTt~p1QY-O00;n48F5Sr6GBI-
-0RR9*0{{RU0001RX>c!Jc4cm4Z*nhVWpZ?BW@#^DZ*pZWaCvo-v5wm?42E|-1?wAP7Z<1PbO?~8=mT^
-(prfEzbj(&34M~oXrO#f<v3+UL(;|W*KmGc}rw@lQhQpcs0sR$*Tk6=WC)j`7L&KK*<p^VH_b)l4R8b
-VF!H}q>dbp|I+fwSaqX<3Q(IEs(WAG7Dhd@3i<D5yv9vnCKfLmxxCe;J>^~|My;E;gh8cim65fGJ9jW
-aRAHyi>A0PWY&TZcdH1?8F-@RF*I3S?z$-d{z>gyt7SY{o$82Im<7BKeF`4|YS>@ZF(_2xk`g0d717=
-?hnCaE1+muVm#UF<da^NA@|6i3b>CrZs_M+(){2v=Eq6tT#PMS!`hvG?t6Z7Ebc)dN8T0Ed_6SEVXXQ
-q1Kg}OYV+tRX>@0**?SW&BR@`pxIgd7k>4z&Ote+W-;%&(wS@vdbzddYqn(l^9OeJ&hrGugK;Ds#Tz;
-Q?$WVTZ?2Am6_@X>%79^ZZj}5#_4C-Ek*goD|5GuMb0T(?Dt++f)907Ec;5Qn8JqdMdUSVTDn%`5oxe
-eAIGtdpb#KUPy*n-wKt7dAb*26QP)h>@6aWAK2mnzTaZK>f4^!j<000*T0018V003}la4%nWWo~3|ax
-Y_OVRB?;bT40DX>MtBUtcb8d6iR5bJ{Qvz4I$}!XYr@x*?fflF7kIOyVgu3^vVh0%5O%T3d1@If<v!|
-K61`Q1UU8>cEHe-qYK+t8Vx01y}xU5W*<9_QS}BtI_!SE4+j4cDfL+xrUst6jL?O&rBhLmYI2C3NN6R
-6(mf6!jx;H_^L7p+yE2lXQ_x^$dqTb-Ks>23d|b8pei)Ttod^r&R~RE)7dQwR4j){waR%y<PlF$XauI
-Aw0nAuDXi*-H?&5g)(8wG$uq;HxB%pIZts3XrD+FF-NE*@R?z{epvR2$uRxZT*eBC9<c!>HnQrH;2=<
-kxz(pgwmL-+7CP6CniRU@25GsvXl{=(BShx@3yYVarFPy`@H=TN6Jij2USxY*_N8Bj!qRcr7Q&oxyQ<
-HHL_~uWq?}*`D1*0IITld2t4*e*C;dlxjOuT6vT+c?{6ehFjWE}Y}K!muB*oOI5$h(L$k}M=8nWAAl*
-PGJk)Lu;n^Ay(X5vk1y@<+1AAdzMLUp>sFcxdV+%0AEw;28*M9C%WkX2;0a-6fTMe;o)!;yUnUKp-Z5
-=G20S=tG{7^e~rFIdCPlvCwZGaZgSMgOg8#vy%b9ETWzF7Wm=K2VX|F)9GYN7T_kbC~e=1QYr(J`Kd!
-6XYFAnxE&>yQ>vI4%DBbNwg)%uK}*<<Yztc~+Kt7+f$#n_3dSMboMHwW#onqmxS)CLpLc-P(a}-!y^(
-FAM3K-Nr0m;fJ#af~mIro@#e>^vDCZ?ptbncHx!t4L#}<meDpG11gwL$t0^JSG)Fr-P!E$Lg^m1t@b@
-Rv0bG=+1xZJd!-V_(wFjC)@<G_y7R`wCR{s(K9Vw@%~CWF3GQuU7g=aOQf`IW05HXj?w*1oo0cegt5A
-k8@(ALzYY$G=bh9J};%3TAp%Xy1;0f5*gJ<DsuD3NH5-?x_uQH!zp4XQg)taWlm91zn-3l-NU(TxulV
-Ur<W}1QY-O00;n48F5TGzl0F)IRF3_dH?_)0001RX>c!Jc4cm4Z*nhVXkl_>WppoMX=gQNa%FKYaCw!
-TU5_P2lBVzTSA^7BEiEMw{vFZ1GZN6yQ(79>qR^=K1{GCFlbWKE$toJLzkcm`ENXkDVWeFylB|>Gc=(
-68*=w)8?&o*E`|ba>k3aqMlP|W<pM3J^7hiw6ef;^CpZxdjKY8!(Zhp5t`{8c;^6~y}_phJ7+CF)BdA
-Hra+5YnIzwTeXdLIA&@yDNE-@kbN_Th1R@#_BW_1o=5yyt_PcOQN7`u^>GeDY6sf4_V6@YCJn_VE4o_
-BYy$_kVHs_RWjuKi&Ob&E7w}eiQ$E{ORG*e?-IER}YW*`isZA=Wp*`Zr}ZCi~sRa&mU>)r(feyKfK-E
-`{egqInN`S_|3O}uzmFE)%KM4zS*AMy}5h*``ybN$tMr5-#*@d_j3&My*I!AL%gzWe|i4+Z`)V*um1L
-U|Ks-l7Cn5sy?xle`t|J(53jHB$5g$#|L*bm<FCxx_m6jX+na~)-~JLE`{VZO!_V7`=dZWNyO;NGviX
->Zx7+jAFF$;EjL-l0@bdoqUwP^0*Dqr@^!n}H<BxCN&EcQF_-6b3?oIS``}5uFyT=&KS3iIE>i$K1`1
-AW0cdy^vZO`9qKk?d|AO0~@pV5)8ua0b=Jw)@)?jN_i`}jN0{`=kIn|NibACz}byIQ>6Vy)kM{+9m7Y
-W~Cre;=Lxb$b=7@%ZkOAN=MN{9~jqxBJ&N`$Noq{1OeuKz|9d+P=HnetvWJ{m-v%qlI|y_ODN#{mYl%
-Jlj6{;;-Ake)RO|M_)Yq>mTF2G1KwaSifxP{>Puf1Yd43s>kQA-~JjMj|Tqo>C;dCB|h=d$4@?g^6an
-l{<9~~zWDU(ueZ;>e7b$Kef81PXHP!)=JSu9ZeM-#^s6tw{`7-w`}*$g-4rvKzctDKXNtd%CVza0nS6
-Qo_WAv*H#zjb#`3<24!(N1{qX$ncd^Vb?(V~)w&$@$e){$QYYksLy#AZxjgS0eLjSnkf4{wccze73@^
-~M%6V~@1RySJt$NJue(ZBfMb{i$$^!)X|y^1CHIzIl{{rA!IXRjU}9&fjgAKtv>t$+C_KD*aa_V-KM%
-eH;<b-ePQ{kMJk#h?BkoyzZSqT!G4|2EhV|Nisc>la~_&%b*`U&BD3J-`3u`Ro50P9`?O^T+7oSC0=r
-KG6Tzhd;l5asMjb_}_kb`}U_leE8unzx?vS-OHapc>BvAj`HD;@sY<5|JnI3_1L!e-~Z=r|De}8OT1L
-aeD~5=$Ka(=>bsX#&zH(x`}NXswxjdGy&u<0=Nd=z0Z(4u;XdA3H2r(ZG;ja(uCWi_EAL;w{(k$X`hm
-XZY4q{o$KUwe>-b=F=fn3#-^=^)+wcEr|Dfz6H`1>^g+Khw$36d!T~Nn=!KAWN53ggJzIn@L`tj!%KW
-smQQ`3QjyLtMjr#CkrKl$_c_Ss**dh*FfpMU$OCtp8%`sCwpo;~^Ui*KKP6#vU1j992oet7<fVTDos`
-<IV;A(tu}_~_%$KmGRWC;#(Py582j8jk(;^xJ1&e*4+ePyffaUq1cQr%&VW@7;vcEVt#@<Hy+NZFG6u
-mfp&3xaH$E{(8obqw?Fl9s3@ym9^r1d%bP*h>yhr-qxe?iL&2rxZyHy+EIFZsI}WxSNs->9sgYMgsu1
-6uwedL;*)2OALUrLrSR7|&f9h_-dyKx>!aM(Ia;>c>P?|r@rHPM8~bgiA6t(H*ILHy*7)Z*qaQ6ESkB
-2~wuAoi+c<8c#hrni@z++f-G0P8%oZ>Ew-QfpC3-aN<%)J|jklKQTRgDc*3Mu1;hUo;BPOlwXW@OF$+
-+5`{U+wf$!iREr{^s`nd3We>vG_2#E0gL9`)$?5pUUIdoy#f7^OD4Q+d`k566BJ!-$#L2gBW24}RlW@
-vi7}=`~toMoMM&cV~LBBAx!m)aHyZL6hHT_nbHJ@#xIJ9?n?j_`!-}6er`GeefgxI(O`$xJL2l)@XdO
-82JbOd89qW5N=|6;~%vhJa}MiCq@wiI$JEoepc2w`mv&KrN=zPYn{g9ExlufGv@1z`HJ-|*=~(>D=S{
-!&oCWlwb1=NCbS&g@$D@8&L<g2j6Ql5PdK8rZN)$1&5nUdd)MFIZ?^Ls40190XgqdOw81}TG!)}ISd{
-2_i_vV0P88;5#O&9$7~H9`F*jj1wmbKmm|E;1EVQneywYMuwmCJA=>AFH_A^==3_KPtjIA>+%xHwc7C
-siwxBF>lv2kun>~xH?N0ZS|tUva{jt<j^9$~OM11T6$izjUDz(xkk64nw^5bx{k)lskhp7kbd(5b~Mg
-#Cm$vrVG$Xow|d-%r{-!n#X6W0u+;oo;Doi#OB#YVU^a);-p3(YJ1o=)#O{#cVO=SjJLfeq&`8AL1?D
-4aUqJ(Z&($8=Dr#5z8GGKC|80Z(`uITVqyNjWO4Ff5E0>+37T`O?Oo6<M?Z#gJFB|Yjm20Y7FxzZu+#
-d+V`6nOPDS@HQwKtw^*nWYZM*S)Eg_#YcaLaRkkqwoov6baXyCa#k0zRXQkaSZ^BtL+Kq0l6VsjXV76
-N9xme4=J{}Id@|fQ66!F_ZR|{LmIXuG7JGN)LEB0GwLoU42$(ojlUB>dnvoPY5@r9u@COP&Gb{?<AJ2
-d-)#fyQAXgAjUYWFy9;tfOz_YofGJluZz<Y*|?9YZO65+}iKY;3DJSx`L6#NypGwdOpuJ=SeT2V(>*E
-aU6NndV)y@`RIlV3HdH-)#fa-SHIhRKhf-z-ZRhZr#J5Rklk^UM0RXRx1V+-O@4J<k7K_cuW|(Yk9;j
-i)9G|bX*6^jdL%#-&&hD(Jf7vuz+{!F}_$>1BCmYokwegws`)*OcPM`lUqFhJP9AwaF_e7jT-%Jyi5R
-&T^eqnIxRXMeW%liI~+LoPLs>G#BZa!FN`o@Jo~keW4z3-D;^7QteCP9PY6?pPM7c*;d%!>r(Mjn5MM
-{kNH`>dR;*zBv+=`cUF`-AW0vD_bnB=(9~>SJ?gzeL5}66&3wN;&p2c1XQ)Wg^!np1#I<}5%x9@xSb^
-SFx>M^S^BjSyT|KqKM_=AOFNMS&je|6^UCB}mXiYbk;*7WNgTr#6uF(3gBz7|Vf%lG>u*6ob$mxC3oE
--e-pgXOPyQGo($xz5}dJ#a}h$vhCr1DLZ@F^|QPEtYIzg)C^(<q+p1V8lRTgwgYYe-bbeP4FnR3odCf
-tBsfwyRr}#jP5(W6JrywbeoLlx2bm|`VfjS-Rk}ste~EPb_17$Efc(0(|O=U@QG75z={)l!9`dXejR)
-4_y=50W#;06IM8@s{C3Sl;F2&<`iAKYR*P=M6r6Z0b}wDXP<-eb3_N%Rd}41{?O~IHKjc2{flDITVmi
-dKb+Ey3+Rf=^$p+v6UmrLF6KBH=yvL&PGV!|6iEu~;`?RwGE~y}}f$u7;_?k8zLz@wY!q?&nWAUOjqI
-E1((=yIjw}62dMJKcwyj$Y45xAt$g^tIFsMpvCK;`IkXGh0l2)5z}z~YLj>hw2S19XMK7UnQI;m*JM+
-wqg`hHfuGN&wEzBx4k90xTvg*y5=L!wygxo$k|pOuP~R?5_URZs3vv;EXK{h9*?t;S0b!mKYax5YDGt
-hbTepHSE*rSTe$M7r!vzJ>%v8mjE5MQ@23`i^l`afD?r7eGoJbCKSlWqhlc8@8yg*OuEX34O`511D8}
-=V?bd<45;ZE7=3g#o-lDk4m>_dEQ=8m?qaF}R$~vlud!<`Ts^@hF)W}xy&SGCkbw6K{11|niiyY4FmU
-`sb>?ty%P<Z|tIk*2Z(x9%&Tfx|A|KKNn7kO|2rZrdR@`O_BZ>|JjCYL<A4iY_Oa&Tdgd^u+1}+I(VY
-Yw{Yv^1DAJR1dbJ-k)RXvN*?_?7(wareDFT}HAAL2(w?&Db4h(p7^`Btq9{|hcDbdZdvu(z6KN=_9%;
-vf=;8n988wlJ>Vu6YPtQuSh|?>}_VY<VW?1YqG*HkS+(TS4g+uiuSaIfmlQ5tOgE8QwAc16Hs=`U@aC
-tJ_ac2&8QSUce&ZoDCBlB>M6E6SqlsHc-n}uRM0`#J7_LV1CV-#&V)gj4e9Y-KlypTq)^E49=_=S6Z0
-|cAok1?1>*%;F1j=Q;B$Wxo0&to{ss)_8a5|1j=d3%`~zvj-~Tqa749<QO^Bp7hJ*~i1%yxootLznLi
-Z(EC8}GBy#3hP<)KB3HUSOW3k+gG2p3M+QSl;OkO7Qih#lUjYI4*fY3%laq!d`h$<$P#UOkfJMNW8fW
-rr)6OnSig|Cfui$!d};)V|$;NK?D8oR!Wys)y^bd`8fNxKFCbpu(3XRRz5@%Y_51THDLaiR+`4|*pyW
-YPva!AyCwTBnBHao?m&hr59g&%}qX;kUH216(o;GGWBs^q`;a0mfH!B{(|M&z&b2Jgb0=Bx8XENmEw`
-Vzk`H5l|vO4l5|4EpgOZniC7<+T#R`xa-tB%zf~Hh8bcA=~+0W=*hfr-_ck%fB>c&zcH#s%8L^=+a^g
-4kY#2>_DU*tGMY6+bn$#Rp8ztzgCp_75x68igntO<UWuUL^$3|cX19rUNlw?;y%_u1NwIbfixf+*#0m
-y5%60>n5ae*U0Q#!K!!-aeXYMV>uvmMTA*SVIT3W{_+1stV{TTJkeS8EiX;*(wRx27h+{Zj!uLms??~
-7U8g@)apv-UdcL-xn$Cm_A%A#h2rCV1@j15`FTO*TNCm^5SW!D{Ju81n)XPZqgj*wd$0W-0UI*nBr(N
-FCgzDHwAkmQHL{!hy&Pt3%u_yKNXj2~eaKWi`_naDC1Gp714Lu_jfq0lb;+Dggunj4{&H2DL;M7L70l
-qNQY)$v^RRnD5T?4<~%dOn*YWz{hl!F$3iQ&mGMEffa(cmhPAivJso~4UVJYLc%pAemKD;7;Gc#Rwge
-#4kYL{$?`DL%EX@o*C04LjWG1GX*Vz|hfzK4EK*q3Z9#X)cH&Y^<sktGeBDe+1lY+k!@T(`kgvNK`T#
-O6Y-wJ3%L!l7CvR=UsKzeSW3oA5Knvg?n#86~HbQ4cWCsM&+9+uW(JT;#{)`<McryCiz-~pq4*m_7bC
-OvTl%;V1rgPbSY?Wx;n|@uEPorc;&OO@=ToRpO&z?A@lPzQl%ZGMtWQ%1dBdEHeCM|+_;B7WCo$#lwx
-v9;_b_18hhlr$&StTVSwJ72ed`$c(v?~>cw}BXFQg@hG*-aG|zX9gT)!#w>7QKvQlF$wN0dVP69?uy8
-4$F1mC!<}4ix0=WHE9lVo-z#r$(MwQRr(7>dir!9eDDM4OW;Z93t7OUH#*oPoDUp1ux`We#AM*4`kCz
-pE(xQHg@qX}kTC%X$p6_}tvS==0StGNo^;*<R)|mdgMXT#N}3G!1sVHIbd`~I{f>+bmh2?sz`FS8G?q
-DEkS0c9))LyFu7opiu|3x<9Lh~0JXTo2*oy=-d@Z}Z@xX528Mt2f(E*uQAUYdqNx}bCaB5p}fEnlGO%
-dNVa$z0VArm|$=SU`b>%Pl#`2^+$=s<c>KyLx#q;FtY8ry&5zKFy=;(P@s61o@2a%DonJ~sN0d!6zRB
-$GJRSR-%=4wq!Qor#?Z3@h!d1TN{rc_<FjZs|?UD%cW*EGSI3k^XI@q?LaTlE~<ewg(+jjWyRi1TKjW
-@k(s4LHrKy&F-OuvhUIX000t|NS>HMyfa~pLP3Rj+$__85!!`!NDm@zVkWIRW`IDB6mkwYK`yaTYH6_
-K!(aqy9e!iS(O~Rkqt~<?*)F)G$Qv0CnWF{ZBrn^nOH4CLy!kT4lWuQ@AfCX687wl$eKT>U-9|lt>~&
-7b8;L`yL3%`LF#&|kQZ&TwWtZ=}M#-!utir^B$Vb)#Kzr~HoyX~&Shvn<fz&Fl*V$ii<D~o>-nkaRT$
-gpmcM8IbwEQ){flHzd*xaJ8Wh^9HjUClo@ujnb`vN4vV@4;KRiGqZshQ=%C)C=m`3+oBx-Xlu@Zbe4f
-+KI__@kI!liB;)aG?nCnONmpK-h2xrC#j@E~%_rhr$~rHy!;jECHzxX|jX@Y;Zgfh`E!yH~d2}d$o!;
-SFT$NTv80|SZx8r4wGtJRQN9GG$KB3NDBVgsci9ADoPy+aTIMoyOaJmrY7=O0wDZ)hhrQt;sdI>W*xG
-SEdkXRbS2i+;9W}<0Tw(qWG$6}TCy$@&9iR0S?yQOWhV~+%)pma(@IKd#cDxuZ$qb%??%ElX;SPV;k>
-flNqp;!0FX9LV+maVp|CQ8S&gnzzQaWtBlU44BNa-clFAPW+>1}8ghRWy>M9H){ljYUljXG2!;Jt^lW
-3Lr!C4o#iH;5&mHF|J`=WtMU}9q)KxJSi$eYrVlO=VllC^YyxbuMCQ({dfukcis#d2KoJFvdtCqY2M?
-d{Y9V3H)&V6nPfRcp%Rj}ZDDcA#YkyMNW6$wX%y>hdLUL~xhUknbYT!RY5s8_UTsGXWSc<{WQlX$YKA
-MHk{(=o8xwTvEY_BQh0ClB}tT=WHB+g(GLhW4LZ%!vg6&$y1rkF99cmz~vu0d`V$^&0>m)qn_A`q$P%
-`C9$dod!psc-3aS}i8n#}DIJpgA|8CxnEL^uDQ;KrStDc?fa!3T*Gwj9vg;x-#YtRQc=IeLGs1Dr1AN
-JF3t8u#T7fyBsSq1%I9v+L6jLZ{1R!(momKO5k_M11NQQRf73M)NG6~%-R0l9XLBnvAX$;Z5IS{PdWN
-%7%0Nil2hZWJDb~dQv6jxk=0=AwCMS%#bR#3NM4F)Hnor9FDP?Nz_Vn}ln?S|0{r$%ZTc!$&!Pv3SYl
-=w15?&L#DnvT?hP!WH{pDnq6O~KE)@J!I<cLJXTt`^0Sy5Uk|S2KFp+-Xe5PeN1`=#vKH-`JPUExa2W
-VSNqC1QOc~T+*!29_)+VnyL%6oO6<DGtZ^{f|RVuF}0>gUCSWsO9?_z+wQ@B8$?TTAGHybVx#w_m2}@
-70%C-?jIIj0cwo2F>?!@zp^zloojdDxIC+rV`ZJQ$3F|80hLjI4h7o59O^KtKIgllQ8Fib7oAb>1oz!
-u<R&bbDL6#n38&>=fFEc*N@c1HYo(E3=SQILUh5km&Fw$M^1}^DHK>BWJQ(^%3w%GSm3&lHAkF7<5oQ
-MRq-}K2q$ruQ=8WP66T<yY_$c$6e8WLe-z_IM$aPXO>V+>#v*-l(p1<#^yDQ7hWky4R}%>5RY6!@1Ub
-*25{Cm~}fLk$aP4Q|A0=^)46tep)v5l?8kH$xTS<G9*YUxGuRywlvhr>G29#``y^SBUItfk!%ElJ~<=
-wdCQO!3a1r6F<zrC56&v<ZFbiES3R84kE`Pw@6w*G6|H7zz9-<JBUrdTj1eIMw&(8D_$(?I2e}mK-$s
-iQK#JvZ(gAAS_ZGhEV+U{hCN%Y^1x2utXsX}@dB4nn=92M?zAL=!C3Oi4h}xK_`%Yi{((f$T`nnhU=-
-F;XZo{c9Y=<Yr!&Zk$E=hX8hfBK=6>}Ee72;?!2F6kG!*qE__LXHrx^Wy6PrYJ0`VII7_v2>xMsPtOR
-74dcnX09m=uZ4AW)7fQajxRSGx;-viJt^251(>w3@N+?2wbZkby%>cN97eezdDySgZ)!GzLdRI<IyEm
-kh={)UBL`b2(WY4QQm1GZ%dFhRUd5d!00~={5ltqbA0LOG=$sZ0yJb8Z%S$`7)*qNW!W|kA|v}Y59A~
-A_yDhJu3qT^#aXKJn^17ka$-oUSO+ma3e<wd35T#NV{--ht$rgcLa+~i|$}oP;3VkF4s48AmOm6<7B3
-aKtpn&T17hOG?Uz2dml|sCnqaZ2gkvtAfw<}ej@kV0WLxCP|-hh%Yv-<s5%5#C<;QI4sOnBm;QtQm66
-8^;x#HdxuDnlqAwwpuZA0*IjEW7IOq{uSl*E`kRlW6Cp}5?<y&Baf!Q$q{i<Jt!wNiEmoGO~fnbE%$x
-8VleGEP$us1x#zyLcm^VSeSs5+ahAm#7)k^McX<21E&Foo;1zqV@|v<qB<2CZ~@V}qBO5*tDgLAe73@
-W11oe>ek|RN_l)4r9~_AMX=DdtHW?AOj4<#2SUq246GSCY3sGHAl0SFt7M_!k3U|wO!<qqP4=)aW6P9
-&7-S0l)<Nlw@YCHy3}mpV+Tvt_X|Iq@Fj%vrsvdC6u~N-EY#J2%`O(pPFORRu}ZJ5>>wCnY1lx+ck_V
-01k;H<V<Na%9u^8q>T;G~pk`6)Ff!V>^8f>|%XMJ;!`+znd!jE{@Z0Kwib$W%Y`I$Ymtc#?1n;qtAT-
-O`%`zVmzp5i8nxSpl5Do_}>AMTS<M0YiKQ-k^PrJq1ldb|piZ!{ePE4>|2wH>+n20VDOuK<gI?iH1k&
-Y_LISjj44bmtI5QVDHklG*Cy{r}MPZ!?C8fI!2u6EVER@JdMi75i3mqt)B)#GrJvSDZvAm8*wr!u!RT
-_zs2S<k!>0d?dT(#=r(s(Gb1!F>%a-zI6X$>8AJR}REdyK_VI0e52JZGSfp@FkEO@geX%NtBjk5dqNA
-sTR~Bm?3x-V?S0%MX4*5TL1+CKuaDRX-Tvz8Dhf3R-<;`x@Ey#B@b?XS-ErnDC_irILqDb2UvzLsr{M
-<aEa?Y)kl#gStZ1WcM2w*4IcfVs|7EHqf7lJaF}$mQC(;j59&3)=w53{yzKJechn!yuJC<N^M^mHA{z
-EZ*HGNsxKbQ=v!;@|HnfW9JrBAC<YFEUGDI|g1!vh+F4Ny8K@FQxvtT@l1j_8}37~Q$Pg~KwwnK(NZp
-}&t^%?Q9JI|6OsaPpm7e=h~;()iu7Y!2kT2vq$SG(w5fi>G=XsQF)sU0;=uh!jNL4`<^sU^)F{UJP%e
-Ic$ObcnEcX1jq)+S1$X?oS)XhZ|Zl!Ne0&=mI2l*B3sw?!s)ULLk6lYK$4#F8UIb=kb1)j9Nt%ew_00
-)?nCv>_#}@Hq7U75&)cG&Y?V~X4ublL-*RN6<URCfCyN#N~eoEm7JrX1RJDc(Q~Z@Vhbsb3`f(!D7wG
-w4Bcx7pB1(h=^Ta#Yeh9=33`C#)LsittwCfA3oK+S9iiZ;>d8P&GR(A#?iCqFpYpFwQ^yGc*QRn{$$K
-y<BzK2C8PyEjLMh~62fi!+zxaoW?v*MWo`uZ>nw9ARaurug3Yu+2v6;WZp#W<PsKlXBUFqGJkamXdwN
-<lXvV~doSWF8^ku?p#%$5>iStz!jbTIL)@4D@2e^o48>jq!arO{70Tx1S{8PY$QU_q!V0s?BmF*jgMC
-&&%}R<-a+gy}QS2jH=88o;GB3tou^AbfQL(`B~~i6T#L*Ayb*qJ=K*B>t)nq>roJN_=a2EXIN>8T#wx
-#{q6`YuE|wq04pbdgtZ)nBV*?=9xS#O1s!^#1{+3Xrv1XNJn(pQBn@U0U)WtYe)Cl1H&;}4G~OHq&L5
-48IRGu22yeX{E$sDJ{(@n*T_+ZM(kr4xK5aWb{NL>cG%vmSG$2rhR(QA&BK*-$_^VYs-qApZm=#BfSW
-as?Q%24jDQ+3^=n;O&H7MP_e%a$@p>IC=)j9L@L82eR=~Ba_<E=T8s9>#*&TwG2Bp$S{zpwdic&NEg>
-}VXx1wbzls3-d1T|e`3w8$SLq$v2JgHDUqA_sRI?!WfyMapz#iF7Tpjd13FbL^#KU7$_M$iE`Vfe<bw
-ljD1A=9oN9mXQ_i;C_w(n?h@pe;@PlvNS;u|}t-RM<?UZqi;yQEP#00RjP}xDEGPzvdxuNtZt0<3;`q
-Td4{$!7-IEx<L#V=4(`QI*9MxEunhVPVg2Wr0oVS>1Z>yuE3swFP?c&6*~1X`boM<(WRP=9_rMrc&Jm
-O01aNR`(+R4UbklL)gl5h3Xw-+*&E)mH7(gifib{^RA{nV<b<o*AO8v{xNu3gjzb)RWa)ge<Y|@E3W1
-4<Wl->)PXc8KJZzoQA7U_Fq@-icFS^&-Jc5EDve>aGP_$-pU=?=5Xem4Nq=|)P5^|%Oh$Hn}>ItrP(Y
-<<h0Df|`bdhGotir+8Z2rO01?Qa(afu8ec%Zq3VIEmuV3O_1moNn?padPe#c47EHTXx)n+tW&OXx!SW
-~VWk(X3pO?Vrh?K`~)x=rWZvVoACeHr=o?yGu=;%AiPIvT<^3s~Z()NX=@3fkxKfD!SJ?)#0hl0I4~b
-$W=Eqf?bueg-6xm7<;FZTvQpQ(xl2a0^cutK=)cmh$|4WLJDnSV;KK{h?v4IrGXI1Gh0pNr;WRykb`c
-uW$$tx(7hIOT*RamsYY9N;Q-Z3!LU%fHnNmg@xJDKxg|hvO19ltJ@*B=*J}PImAR*!hGl2Jfwl%Z<nD
-=(A>@QmFSY?1ve+y4MNZe+y7~()X|8E;q~;Bcf8t?vuJj14P$l}cq6BaV2+7|}H6>q9pMSMG;3rvjRc
-aPfG*ja@ym?z{1Pu^!?o@Bo!;q~M@`Vb*9!*~3S~qmBBNLU=USeWoQk0HclPuMNV*ZSQQY-Z|&&k1Sb
-Q6R|$3$=Gf6={`Lt$>wS>a0Ho=hQkYlwtm`Zk*9B;-{9Sg;-g#co4H*~nG<e&GjnubquhB~U@%g>BME
-GEk@SNupo3aj0iCt|$dm6>bzID3P_@u_k{;-97d(0xp%Xh<=(5de5hWtI5lh#A5{;>YiFucu@M|Txf@
-8j>H32DS6MT?iDt9qqedwC7d3oBu!i>FJ;hA>w3e1um{;NSX}cs6Y!vVq;6jJi|(~FtAD2lF+q{l^DT
-pUV^*sp<*A;>>~`NDJ`4H;n?BtBsrO`|A`Z!MrvC##3iqc9Nk47}eT~?QHd>q7^$%I)HY+DxzIXz3uN
-^BN0IjN=&`$!P`t(G~?lA-`lwjYi^1z}twkff^rFk~JLE=7iuXVRRqy6f`o4=8CvRCMIZTgsIYY+(3h
-se7JWzk`s?ogq5;j=?r0tQHSOHOI1_9xg|CV^0*%2Q?ZNDzj?DJ-rIeE_Sa=zo9LU+Orx?*YfSS-&-b
-?;g;@7c{xWiDR5DC|S)Am+*-!cChB8eeJRbbg$b?=W5^qGm&1i03F=b^{_`uGPM!*n+Tgt$Ak{KmSwV
-+{8>f!I$D}F_8`qrndHtB*p;5$<uJ(5&7xkd#E{MS>Z#FFuFm`-d2r~Ki1Xle9L>O$4c4d&htXK|=8-
-STFS=3%XJ}kU7P_RghtrLTXWhS|du>n;MIO&{*v)kw<a<QzQ~88Y%Ni}f*yBfN(khbItvgj7e#moFh|
-VJ(vp?11pPH#hFSH-BZBn<U&XBTp_q5rR+p8L^0)Hq(4{cw#THPxu`_dKMS|C&+0N&vQ!hr7S9)jE5Q
-FsrQb~O2Q%t-M{%UF~97~Sh=ZcUOM%&CEdx8cFcG%=tgncOl*ax=5bQ;L4LnKd4E=(yTNU*cI*mE;7O
-A~jef;?Tl+ZqOqr9IhxZJrz#2Qm-sUJtP^Qs*me@OGWou<mIR=HPnrz>Mm3sQT(y4MnR~R?6j7_1Wl(
-~4jsCO?wtG8-_vyi2?{lqdNmmt*dlUP$_@~jNbnRD=o8h#>Q)qT5M*6~rJcbihCf?u1Snc7o$^5nRg$
-vDIN6dz`WS9;kWds*Svx!gmv6=>vR>HKy(+=rm}Y}3D+HN>3cFm6k#+N|J~WaFzHJ%=0F`7xm}jht=T
-i4<7hD2n8PLK*+J6HxO-c6Deyg7ZeoT9AYEI_qO1r0Uo66QM-m|HDJ(M13k|w&8y5$Z$9!a8Kr@NuZQ
-%Dr~KAt5!Xcio?_|$VXbgz{xsN)|tNh~P^5}?BI-nR7SRE1O~LVj*&B@6y{GgmyU#vBHyBijX+urCIP
-ZR9BpK%ES)MMGRe^)R5d%#5Yv=PfJLbU#5Qtt5{Ks~vVm&T1IpR6zGU0|C1nYA8&vJ*ny;ICl9GKz0w
-Pur`N3pm)=sHFU2rQp}o7x2Yemnm?E+ALwfNNwy9&vxgt1^JM|p1Y3>Qe)Si=ghaPOrPg7N;9{dOKu^
-$yNr}EwTm-GyJQPHrJ~D+RH!(rD)(zcj&B}vV)A})LGA4O65g-{sru?2`ZIT-&^9#hFhPf-qJ)EyxH+
-8QJs1lwUEOASfk9>(XEdYQRfQcQ{lw*Feb7N^jWJo;gPI;d~L-#t!k2lY7sF=;n1R&6*&h!}sMdk0%I
-92C^2EXqf$5SJ&93$_mXy{%Wv$dg+sl^oikkIi&Ac3UH>a({`qOigx4;hjcj6}!m_fs|{{R6t!Dw~^u
--PGbVJ%RpPnkmaJt1st6LnRe?OtOq3=RZ8xVOfcGIVY^b){}`aUbUzUJnWm3O!iUz5IK^^y}SA>R`u{
-i7s3o!ftK~yhVHdMunjd~%JU@R%%W><Yi8OQ0>*>4sz8jcDFDcdXRYBeN6&g}L-$&7Zbj*>sp<4oA@n
-g;K9ExmR<NrfCcEosUuvq(cJn;35_|Qy=9lw0upbQ-*XSM*^9VmuBNJlYzd@pPfOKUeG|2nGj36W-^O
-Zrud)1ZgavsMT^z<~m+9D5~cC%ful>$gffQ*}z-b`T$ce|=Hm623%OU6xr_f0L9xmY)MS@!}NuN5!^W
-u_dvH_z2!9vovCDEb>^k3Q2fncsKq1}>?R{k<qHVMkL(>AJ|`Z#GFV^2qJ-`6T3Bt96%Aj|IZ*$yYaZ
-ubu$d^THiFV@;Q=iG(pxA@<Xi`g`sRO```IC4<!N62p3{SG%0YIrG>oUIYkpq$A}C)y5quA*fh4RbC5
-s3u%&vQ=wV9CZ6ZX;GyB82v5c3Q3y!}K|P7G&VYT7Pr3vmQH+f&jLJk=&LPkc&c9seB$%k!7v{K#8+M
-C(mIAs)?+k|NlKV6eZe!UyxzFfU2D;~>ykUq$DbI^Ebg#`MW?23(S_y)iOYHbOiRL_@ydQRuQUs6_hI
-w>dI=;T=`R=CfwRu`b`Mb6atIi>wN@`Jb-$;L(Hz*+yZeDqF$SNHw+`O&;taQzTx>rS)how-=Bv-uqP
-w+i41kSRM0oUD7kw;1li!6ZvR)#t6Q{X;<n^uK2UIf)Ob<&>G%aaHO3MnL2*~e<GJ?~E{UjX6Fv%{dF
-(c3k@)^W&I6tXGN)&HV78Cm3%O~y5il*c%$;y$gwX|Vyq{=DY*V83}$lG!%3WzG(?;s&FbgH)m&9yN6
-z;~iCg;z9-|a7Q<P(_LlWO^gh`qd47DQOz?oh;^r@q_rtjo@O6N6jYp>CdzPoQw*n1>N2z6uXfRw0I#
--FU`W2{VX<z7nDi)BA|PQ7kaY!mlB(1ELa{J#QInydYP-#KvorA9yA7FBfd+`~U6Aiau*^qpIppQ4Ss
-3d82=?gcnfJpqbg!MXxp}-5ox%`4qoUoM_%q26<aY33ND;SF46T1s+vHI)BGS6>I=a`<Ewp<qqgYJwN
-G9;vV*2TQ3IIJ7Tit`-geCllqAqW!8fG<_A0s=AJl3Oy>>db;w%n=eebiGe5elV3y{OlTOe2zGfOXha
-xWR{A?N0A6;e6JvbrED%QbAa9^;w+U!$}Myt{aTnuLXIesg2yadopq)e@5)RDQeJ%cMM2xnpqdu&3Rz
-wA-;mN=*fS8OEymmq)OTm5@GT@dQ<lb1KGe2$OvIwaUiNnybvsv1*%dBH#%!bXq7Q!B%Oq+n<c!97wT
-T8oB&d_sljp*xr-#oq<T)HuQ~hv#!P#04B3*`K6PzrUh_a52Y@`fy4UKVWzQ*a60IstWyuI_N|L<VV?
-(9vF@3V~LUm!}WX!ZPbgx5toFl@69|h4yDT-PtOG@5w1x8s`AxQ5NW_!VkCkh}CgtFtx-_X5oUOVS4L
-8s&#LQE=Qg$}l9M3~N?)`C9+aC2O%f<VjghvDFA7v1aNV8Ui<aVQFegdoX?H4^5!&Y0Nplm0e&3~{@d
-$0{*5;-{ZP_d1jX6C;Z!pGXOtN(fab&GjI=qZrvOQ+REd2RpmMU^roO#dY~#bg#ARRFo7qKS|hCSy0`
-*ASx<+)Z#lqt9XTh;!LN{5<c#&l#3@w-K*z+@tn!{lOK}@)Fs9QgzjE6W-{BX<Ew=|cnr%8=?Gul_ta
-%Jbgz{_HN0z#Y_P(e7VptYRtJ6sG}2K}7u~nqbT@;_vAP(dg=-$rmna+Pp0dw4WPe%qL#Hh|rrqK!xd
-;6x`%Mgnq3&4#Nqa!|x~bwiY>3Rdo6JgqFXK1KfLGpRo`qKsClkxOY|ptV`n}W}HFd9f+khvUy!pi4g
-Bv;&yJ)`%3R$wzJ)C-Iiuep;qn1f#G~3nRz$G14vYMPpAA89VD_)Rd*Det0YWb{gzyxFGRtb;1xd==w
-U;VCKa0ygfrEJx7pJ?N%hw(r(y_hKF7(iLXE3BZ-yoiPU?%5-&pBIio_u4#52qWDP?~Seu0IZ-&7?@p
-~GC~l7o7w7eQ{M-E05cB7x8usQ(7kSlLeuI*Nq3XzE>#^6P^O=dCRA^_G(J|)iWh2FIXr9<nNUkyjqb
-Hl5^jflP+sB(8W~>Kg6UGsA;%xYq3&H=RxMH@M&%p*&>+k0<?1iG*DZt0kgqm!2o_l_vNkl#gA}i$73
-xjN_;6fa)Pxeb`j&$qxi8SY*5&yYFMNQUQ{2$=={}G|8xWyLb*SwmB5`v@Z!*l3Glp{H3#X!c?Vil0#
-DHvpH+bt9;6$!heh~XPy$Yn#Eie<ySd{v!pdsQ9)u^<K?iCDOt0%*|Hi%2FPO^@MAg7K=Viu&-R9)<<
-VC>1{hf{T}8+Dwf=S)OSDulbB^4(Eh_9e^b4Wgt4-TRG(oyLro!3fI)vt8$AI6xcy1=cW@ingdx3N2^
-e&*Ig2)_FAm!d(vBe4cV3YJ;M(!7~HNd!o^fe8^dq_%Mu7-(=^F;lWv*6+Y416SeaxxjcP~L&6~yYhf
-$fMPI^$8^@Q6I&Vb~BX3FL2)4y1Z-9aGIrL)i1l+PUI2GGG(}Y~AUpl<5?sd10ZMG}JfgAEb3n-%(lP
-#~Z;piJVQsvy)CQSz!K8C>2D&>C7FLj*ZiEp@51bvmFK#}6AE>G2mbFIMcHMl%FYfN?(hVXFa$Xjw>b
-ak(KSZ{6e$O@gQQdiz5cIGhv516X=<aDw|4C`wc=Ri#rFkLzjz$I~0%M({K1%?|LGKkA8y^#@sJc_4?
-nf=Dpc9e5N?9oj2QV-M7y|(52G7oAa6drptN}0}~-=VBSR2yvOrl4i2cFpPYIyP|0WxwiP$>@6XES9m
-idOD5rK5^blSCFU`R9U?V=B$R((6r=*#Y0T@mHb&p_gay2kD-I^+7$cK3H3%-b`6|mDft-RtYzwaSXH
-m>v5uedqN95qT&^&@=Ywk6P(WoN8kEyz<`pYQS_tGz{&1ndVCMKFqATmB-TPjLXVMTzkd*X1X1sh>pf
-WG=*(?a*Pp$tAFIogq4M72oXV4he{HibUD2&+xyT^NHao=^R{{=@Otm#x#YR`+B0776=wXmu=5K7jb^
-?7c@j6BOr0;+xU23jhvr`;!B6vv0dhi#?4I=q2Fysi=hBBxBNAmwVea!;=jcL;DGth};rX$2TIu6oNR
-odO6F*TK5DCx%hVT6P|(Pvy>ln*uJOQp8&+NjFvYhJ6~+G3vXJI(au{o?dkc(DT;3yn{fUc{k@L!>?!
-G;Ln;?PT*m`QEl4PqMk-(v_;BIV2}nhM~96Yq@P2{7exWvMPH(JOL>!;7G)XB;z;qIP9t8lOY4yWkV~
-kpIr9=?0$I_j($3Jm)}HSo8+3<g{!1Uu3_1@KonZrOH%59X6iFnDF*uDnIEdQU<#*J*;#oGL)!>w8m#
-u-Z?Ie@sbZYfLFp40m;YsM>eL-Gn><tXWurtqDLc5b^$y{hyopvo4V6e~u#L}v~O5*S|jqp|_blW5I1
-$yEw5?OD7yy0G9y)MC4Ic`<(Mg5J$E}iz_Wp{WF&;3d+lk|E@Z=|sU<jXY=)Nwp_;H}_A)8Rm>XHyi!
-LU^<c8ahi$Lw42E;@*7a@zbSG&Uk_DwNkzA%J5sxJxS-O*wM<1O9rGSi4s100A9w})M9!xVTtuKZlZe
-~vOvg%DhXz-COdd6?{u<+-36g|fV@3MUXTvrE;tp;qlsLp%k1i2p)~qZbZM$-WpsJ-wiiSCS02N$1#j
-7+Rzi*z!!!=%RlZyqa`^{zuY+l?!U|MI#RM<!1Mx};(6M~H_v1nzcj}eHOC6TCZ-TldB1hi))zQ7yWF
-^&k!wz&En6?UtAdqwmn#=Sa5@K5U(S_(0@-ftQQn%94y;fvM+ss>8d;@Vv_67b`dX=L<75;AIxr6Gog
-w^t~ZCV<l$T_pV+0nfgio;!D4euX_(<@5rp>%wCFCa08vfxnP4Io1^%WIs5BGv$=>MGZ|aZb1h<zx@L
-+8%X8Ucb$@&P&DY41`CrofsCh0a0yuns2v$lIJfvy4Qxju6Y3m_tb1Kt3#2qdP}OX{d&#*MqHUf7p_}
-YbmV}cT*tiZ0o`k(w$kAzt2bm5s|RI=w!DfC>)Mr;z^*L|1>~Rv!y)tNMK>^-W9EG}TvHl;-7g)W3P8
-G8t2dL%O5!#XO>-*YT09chrYX`1KqVyQMwZ*#g?G@s0($5hb@$~NI*aMtu%q->3BMIK;hndhk!MW_1W
-uW@e7<-+?QD1+=hPHDW$I=0SdC{uIg|rMI;Oy1o2J-1y;7cyc$IybT6NIx<^jG03mvxWwI38+8pX@zT
-}m?Zkl|HPO0~*uX!Fh(Fs_`tH)mcte$Eiz405U=g$QvtVEMX50c>?BEO+#t5+P7lkHf*|_T^zN3mbH&
-WWA7cdpF(h8(3Ka#D2WU^6-K|2m}Iz2zM$=cI)UYar54pOVU}ry>?{1o3jqlU-BWdM~%pPsYd?hVlzI
-|IU*=FU3a$$&`_$x^EKo$=&iC{_!3LJ0K*QcS}7VfYJJr!>pfLYQeP!Cb#J5q-Fte(zh3y3N1uE8b#$
-+rWCT4LAhn^Sg3~qKGxf^ch7r_j2qZ`-Re~uRcd#^XA37Dp=6N!z?Khjk8r>FmKotP*P|GbtM&-Mz!t
-sc55w#o&@4P|_gp}X4fit=Aq`KGBjqb5Hm=lRn-0TqGc%2^JqkG}c>1CjK5Y_a|xPok#wC}qA4C?i!c
-`>6Wnn+Lj@-8`WNw>!DJ)D3Omj}ss^E*5aPYRs&iMoil#3lbgn#8)<8SjSyi+L<?`qd0}5J)1C;*B5X
-tn7=D<8m3*f&phPe}?Y0a8hY_=7W@_du4}dupjbkAo7?oBgJEulCIweveJ6M;pxMxzufog-Ot7RO=UR
-R!zpL!*927mKtp+ClIX6e0p^kN+Cb9QJTu!byo2tw!eq6k#)(s=Q%B?G$S2_ShauY)_vRq0M-CIDX5)
-A}Z>6E#gZuDwM<hjgWj*8^MWWu#ZQ1;gEE_tic6z}#ap+Wh3;D_hAASn~oCxirdu<+t^oBFGclUnqZn
-*KA8j2UkLScHooMTN=)!y}<@y!LIpm6DII=a^Z+-^OuhULLayc|zgKyaE~OJOdz2|lrT-z)W1a$7-{@
-`CIBosRCcWSj-Aczvap@HTJgqYeqwX~<Z5@kT*K_mV-=o|A^la5o#zcyY*=04`7cj*eVWt=s`Ack!On
-ynGQfA^~NE+;V;Q%S&LU^6NM<zNveiIePYh1tDi^sU-JGC=bTDWX$>Uuk1@wp(#O5MuH```flC0R}Ce
-?n4*lX3J@a0@azK*zmfoG=J$F~v-jI`rVdH$ssm@@*Sh9`@5e#IFlN3V)mL5~imR@=5;l1AlnSQkxpB
-X*V|h?g`z1$nH(v1q-D^$3q*#+ojv{?Kjfd0&mPG+?IrK`D<^%CS6sIkOdp^M{R%hOa*U`N;X*~}Mcl
-p#)`0SYdLKAHSfa82Y)T>?aO2U!cruV&g5B=3He910)@se7P`?)+80Ay^f=omp$lM8-P<N}y78Ibs)*
-j(G?*U`N;=4~@%d5?e_UD{On&lFL47^FK7B>&o@TiEY6q3l65bIi*>pnGi;2a4Z3pg5>|q>kDoxkR%n
-r2<yrotG*wt7GXbNuvm|-Q;lXSAV%zO{7nvFua+rdf!TZXAW+Dx{uiElFQht#3in2<V9GApY@0SVW@j
-uY1=0+V*pf0I3U-(UoLO?hB?uQz#zk`VGeIOgcbE#`l5p6UAyol2xzN!J>-|e!01USdo%wu9(s+Z!$l
-sL=#4n!hJgj^`1P^Uuk&pdH&yGB@d3yVzop2p>NvfVM{eBFc)@_=O7lQ2Tk`PvV2aZl7_R=pmn^UIKY
-at+)dTD9V^4NXd*rj&A=KMtESAi!hfbM{l5z9uFLfMTS%Dnuo;mUSuM#4~80Z(v^%X(-f1;`dtZr)rY
-Ds7vSG)QfxMWB^j+{4$Q4c6jXAsMGvDHv`1(Nr8krH}wOBVyN8@)ZT<@aiE3GPiH4s2der&w39fMPL^
-kb1yW=Gt$^@Jc{(%K@i0q{6)C@AT`F&Z}MSRr3g-$t=aSv9cNr`(fJdSw;>7Kt)yXK!Il)3Q_@SL&4D
-SQn7dKdVh(tYR>AtW}embz!3E}-Gv0y$}d0T(ak$~z`v(ozd(}X-6MIA_sIKR-K54L1sYHaL;e*4!Sf
-o27d6RL;s&5T#&Y&GBSV`9EfPm@WnJ`F<3#1Nyk{Tpzg%q39pGL}lD)CqTi-pNcse*w4SAl}(n<2E+(
-Z_*k6-|6)v?QJ`X{+-V&(ma%FJZ#u&KuR(E(!a-kv41n@Z&5`?#iwbAW!~kNXWHmX7cm54pY5ADEK~k
-hHYRsQjq=R6HOd`%Hhvoj8$i4xi4Hb-!?pB_`WlF1CA{bJ!)H5S>00hpLItD_HCEbbZzXxCn)FYPv(-
-m8C^*`|_l$3NvigN0W~kt*y**GH94Qk+rqy%_QrZ2hQU-zej#`79@`jTKv2FO&|80fs<#ESdFFYRR=;
-$$ivvMYb)<v<Ys}0n@rxJ?=Zn56*^L_ZEN1cM({jrji*lA0N%2+hZmKi?z!|299X~Uhp&JJV0}CCuI`
-s4c%&HZRxiR~I4x0*0LKg859K3<C33};JS~TYV;?(>nyJBPIeC65l~&+|DXeOKUmk&EXmPw5DoTz)ed
-<achC_@u+v#^;c>qRU!FwWg?p_M*=|czZH^g+mSj%aF6l+d~H`n`w>~Hg&Fcn13uXiuw)EZAu<muE7p
-Wqiw+PI@(;=vDxx5to+>s$834;+_@_{J-OYZ@QvN=U4{MgxE~#6Up4>fs%~Y;bDWdO)|NBx#=C<PgnG
-tzLnta*ec78J5Z;7@6L4mRxbmf`)A8*Z$g7hNMrv;v2fx-{0K)Z%|7E1QY-O00;n48F5U@=VxX-0{{T
-s1^@sd0001RX>c!Jc4cm4Z*nhVXkl_>WppoMX=gQXa&KZ~axQRrl~i4C+c*$>_peyQFAm_kaf<-g3kp
-<L?9`~gVA&}0WYE&eCQ6Y8NhMH!{SD=>TxtV%dXknq!`a!@Hk+3p>h+(76B-TU{v_#BZ#0d6(3RX~qe
-+V`)6~k1)Iw2gGA8M0Y<^3n1ip)+)G`&`SW1;-?I}f0r*VW1we%9mM}A>tc5KPy<S%d{f5P6SV#jZ2r
-O^(bc4ut;0b-gNyN{=qh3AacRn7S4Rl)|YU4^T*o?7uOb-#T13ltaAI}|BJ^N{Ok&W`O1XZuQGqrH{u
-5@ojB?cazHjfMS1GpROK7W9Fj(33YbtNhmJL;bKy$+Z=>3a;grnViY}D}+5zWlBngCd-+0dwLk*N$Bj
-OvA`E5lX(?FrOr@JQ0>_k?&#suWJx1-P)bj%*`k_RxmGd-cqCKSj!8J$g_zr(of-ro$w3GW4CrfjABZ
-K+!`&}z9U}Cp(>>mHU~Ch5-4Z_NM>lr?cni@LDRjdgk)4YcoGZ;p>Y8>7@9_dc6#9y>qBT?LI4@Nj49
-KOQ!^QXMazWALnSMs|c{Eu(KOh%Q;}redGs$9y5zGixS)qLe;UF0I=ka$SqTX;cTs#N$gW+P*PZAnT=
-M>Q_nlFa&aum&Jww%wVNxwssFdr=rW?nM+WN{A4!obOly^zZ7OMgat9R#Y3w&I1+=9DESiUfX<UG=|u
-sEpp!^#XD>^nqkf+W0oTT8Y`g^!?FYu$=qb#?YsoHr;oTB=j$Z79@ZVWDe?qGRC&4XPghI;|SQhPu=d
-_hwkUQF3~bU<l001$>V=qD$PbCx2B*@u}-(bI`%tj)~Fx-3qR4gR9^Nf&oNFD_Otr*fWdZ=dgDAstq|
-!}YCgi^`XmV_<Ne7I0-Dp@g_%A8dUA9B_$D4<8&wXQ=%miM;*>mmx?d&Z)p+{YA2k|{R0-#5ioLwnW!
-2afSQQwIoK`D|jk8*{9IN~g505Lcds=6vHq{B8Q~vEa6$b|gR*?4fLd~sz34I5B>%vNea(~12uUDOTf
-3?L@^a$3`Z|EA7`|4ETp_?l$3VvUuWnWrNH{q(AYXnN@O(`~4!Evb2@lE3&P)h>@6aWAK2mnzTaZKP@
-C_Oz1006@z001Wd003}la4%nWWo~3|axY_OVRB?;bT4CQVRB??b98cPVs&(BZ*DGddF5GcbJ|D}{_bD
-V7uVInEymzDw{c#!3fth2*x=)(QogN}N=O4tA|zHbgs{JUpB@R2kidpqYWM1>RBUE?o}TG``enw)$N3
-++tlu<SblbeDx4Lz@ylr27pe?e;N5|9~3u=dQBz@bXtH2c`72O5DOV6|MeKMK((y?_AlH*C?YjPk{K3
-Xnq`cg}*ycS=D7feM+!H{$gCgfW}E61LS1gs2vg|Fc>2+bD&(|r&|<4!1SEnFHb3}RN59WvH*0aas7g
-{vY}FD_mJB3HajHP53C%PQ&!CBm=5jZShE_&St>8ID;{#a9?1y0gPCbT7S8C?|A6*r6sJ(EUP>13x}L
-Oy$WzXom~7+AtJ?R4~+YZ0t2Hf*CosPoZ$7ir`@gO}6iz1|il@0#^<fJT&uN9EW$UML1DQ8{V|~bSo5
-gN;kq6Ax?8Y8+g*e;#=tmUkS1mO?ga>*OqGVM!NAvs1X3(SobvviFwxjRfGy7bXKk|wZ(`fg0Bm<=Ka
-H)Q(joarWfSF8{u+gIoAa1le#2*13QN8@e2TP&^c&D13@z-hBL1O1jy3IX763Q-=kXVfj-tcom#8+@E
-WqPG-lzy2uV(+prA`QRcQNqfsF&;uHLzNhZVKU=54e0z`JiWd#!r6OO1AiYII-g^qN=w+ggY2`<?rCw
-_Yad3b8aX8#B+yD-#a^ISF7%S7=*$DmwZD+^eub&!w^bRlv=TkYE(q2$AVxFCTh=KQiaVlC?o!lN^#C
-=n~CC3GRS>8SesR?cWke@03gQq6#6~|Kh;~T`X_NA)p&x5QHVV43uWkyBgM3&Z^bQN%eW9O4RRSWZQ@
-8t?MTymE)tMVHixPEM|_LBPf1j&vEz^>iw(UM+@%iSiQE@=+yshwL91KPKlx!IPtb_b({aGmyT%5Czg
-D;Z(h}It?OpD*J)n%d(C#s>eTR~xYqt9+|>S|vrRi@o~WHAAJsk@oIS6erPSYC@=&h+c<Lz|Sjj%Rg@
-GKsNNwP<dGjJyy_tA|@<{Gc#h;~0>3!eq=BnlK$F&-%9XgMW9M4v$B4azeUZx)eLk-1ep`<DVgU`az$
-m+&_t#<$BopoL7)vVsTPQClCeS1xBsaiQZHv-*$r*1veyBMpKFD}+&t+pAeRL#&`v(>!o-(`WGADMYq
-49T)2YLI0Wl<<bJe*Pe5+0&^+$ZLDxnYbPa&E?~_neZK?j*!cNF{Xo4#or5&P%udV-3Z<0$wINX8f9%
-|ix*ltuo%^f0Nzq7@WqCl*@C6y?;@UO*e-uX0<#AJGMf=eC^bnR|2Wb4N+T81SKFHjnvbP3#_ypND%!
-qh`=gmXGG|==UP?fr4wypW*q$>(ePN>jbSPaILPU8wAwJf6`s(y_KA)E-QHxRz!qMq84A{l$RQlRG?f
-a5zl<hGil+f2gW0FhOSWmnJ8t3)lEaZw9r}lE%IC?Qflj2!!f>xGkRPt@<vib6@9BAOMPgK5uantts5
-bcUC6xZB}1~!QG?AbFjj%v-^7s&RGCqN*s-f)x_kVqJyIgIMf(6dMEP+kg0^}-pt0C#CNQ`h-qXk6Gi
-jyE%{!`M~{tbst4p4jddn>1`s?KVoqP>Y8Q>1_wih9b}a<qf|IH^o3f{%kUc+RcRcd>nAW-iRbFsVKq
-Rh4?6rXS-})S=)FhglkM(GAg3~El>Dqld~Ad!g3c;A^+kBb02E`ksc?lE{7`^di$2nUZv9BG0hQpzPC
-U`py5FLp#eHO87wp+YOMhg!_8Tem$A>KO5rU7-y9VABgzB?Mp`Ef0oT0BU3OAU?mHU&1vW}cXTA9o66
-(geR-QnrkZx*n1^p(IlhTS}VR(>!*_!5lHUEFguFQ3~+3CvTY@v1f$qg?(3;jfjqJhmR4E7h_;0?}S=
-*8@GoMF#!t1DgqA9~p*nwZRZloKj|qstJXhfAl+SiLVs5HJ{Oj&?p_o2)P1aA+aZWsd$PrbT`!OWQA2
-Y~<r=c(hyX-`-|4Za{)xh0LZ-sZhv*on)|zS@-_)v7}urZqjZ=xn<SQvL-%xc$9F1AA}RI7&S6MgaW%
-bU=Po^A|j9Co>Q$<{!VHZinZ#DDWNvOz(8BV4`!pW#XQQk4o%HLgj)ev;2^2-#S6Mttit_@7xI`J+Ve
-!hE+<eLe4mfX<2unJ!HE!M5V>T+Ntbi0!IGSZc~7~ANO>xb%iK0A9cNJ{iqb3RHw*4co%AEy)0`A(+e
-M$0$n&eH;|o!+d}`og;c^JF=lxMKa`>7FQ=l=>QO(<sWqa9iO(_vN0>M3r$4YpgN!ywB2Xnz((PZXnI
-mO<VaOUoAr}`c>=2XsQa8;KQXeQT{Hw}x#yX<SteJ8iE-PZBOR@~Kss@W9A-wItaUM!YZ%b(O;ZoA#>
->Nq#=eS0)uk6i@!q#JjGxHF#gKCYZu;<U}qlcobvI@N>_4P~e_8Mr7{zoN=F=bTPX@N+0qvPyt{?uM*
-g&5`wks76LLz(;oh7BVBtxXh!6Lzm@@CFq0(ENaa7b!7!$Hf0<H8!b=zYvofiT_<F?oPWDI&rSCi=SZ
-rBgz$-xEz(bG;OZwcT3grqY&(%l>JObCM(TX%gGrtHXz&QBQ_l(ek$UI*!hxjz(D^=64=VqAq`s^?oz
-$0={{pF_mzf{K>h0Kv(R%A+)Gl6Uo~iaA_M^{M2QWLrd@8f|AoicY>r$*VhvcOsF_VlhWGP=XxAa01%
-gofO#eJh8iE%(QT*}dl9}^4PkPnN5Ew7@x;$Y*wbdM-_<OTJB7~ogl@5}A>9u3QR94<c#D*YuxVlyIY
-8=Z~0t7c+j>$R`?;^&<BsGaA>2L}K3JOz~vlmo%fD|-cB_kFYbV}frR@?pW3|EGanv6ud%!5*Qv`|k(
-`M4tMbxJDinc`xJexfq&g5_>dR>p(2g3Mu#t1!AT)y{yKyDKWusQ{OHc8>MMUj_S*oIq?CUL@4BGs#m
-sXs_&<%UO^x}ukLy%T}R#~Wb|`qAaCX(c4y<!huB!9nMvNK-rxVQ`&2&k|6j!OP3ryqcUId!`6jjd4w
-Wd1yKYa3nwNKPvY*x|{sB-+0|XQR000O8Q5kVeiCH9was&VX%MJhlDF6TfaA|NaUv_0~WN&gWV`yP=W
-My<OV`yP=b7gdAa&L8TaB^>AWpXZXdDT^IYvV=`{_bBf5RP*=N42jMn&tv^96M*~*v2m$p%k%}M)q>+
-U9-DNP=Ec+>c#SlRN{Uq6@kdJGtWNr%!{tBsvmghKMlt)8ut3*c^@7|linXt<9pS(g2e`5qWPLjCZMN
-61a9D2{mq47^n1IFB@dWY8Un#lS_sI;YZReF$t|bIM|?%0cBnx`U@I`me~i`yY=;N1TuDPe^-k&Z2LZ
-!W>C7HzWEMkMB`M<hRZKgqT|!rFEHr!9(7C<+l^`nJJ?IJnGv{kyh6eR3hFK;(C9USGn9^*T>)*%%@X
-Yjgm~ye!d<!=~3@um%)5LC+%=0Iy1Yc>U6Q^3F5y7a)z7erINK^~~lb|u=CW9v-EHD}Vq%_5ERmh{nn
-PM4II*zqPy)}h~Pva$w&=6C2LW!EPnZ_%@0}3AT0Hr}-26oP7Hl<PnM`WH8fq^3URNXs3PUr6KSJZ|q
-@Y(AWx8;Z}pjtPXb^NKCI~RCOq!SQS4P8Wfl@gShhQMVCyCLoAg#anhH)<<bA;bowShNU%eBs-0@pZC
-XKzIBC-@3C|cf5GHBVSUQPN{ww65sBq1w){$G?O+V;so&ApY^^{ME7Ah8ZKTO`@wKA?$75in9QIH)9!
-3B>@7##8BCY6>15vb0Op8=#7@jAk@pfu1i4kDWQdk=VY1X;sJw;<iV!yJ6{*Yta_T5xG$Om?q8bV%*J
--{KQVMzpJOZg~3*I!R-l6V0t1h9G^=(np2VM()>5vnX-vyOmPT>O{5%fSPrCaczjCHQhU5agg?sVEWo
-uAtsfaRPlbr1B%kMCS6SB*xb)fPOIG4(Q4&5h1fs}+~)xuqt`&w~xq2JMbcNS)lTN5(nYX=-dV8i8QO
-6xJuL;$3#sJaVL&rIDoqMd16KCg1m)21V4Orj=_y;(}WDeyk+sp6)U6uEaTjZh;HE_V!4J7zgjyB@+3
-2J_{^0fKOS&J+zMxvm^~2{Q1{O*b0sH*D>{opG$EMj%j0`lBQ*4(|j&qp9Q^>qigY^4)Ta`d7*o#Av6
-22**%&4?Anv#?0&j?p<_IAI^+219y%Av^*h-}7n|(G%e%~%Y>THFX7g1Ce4JzIv?icH$%uz213XFd5;
-XT{w6T^M`4d|WhIg1uUBa$IW48YPCtD;^4nl+&=5xJDEc*1ZIY{t=CU(^8m{Q7?%aiUripjh9ouS69J
-ZjQBHqBwrzEV>c@P1x7{{7L4^#+sW_|YFO&T;C;D0`_ZT^g5OcI1Jgmcw|m@Spp&t75+k227ZDEQ6cF
-WpF6KspA(~ZRfX^m_<b@$W}(x3vhn2@70s(Io;klg$m3IOPW(?d$+fH`-L^xL$phM)BbS$-FLz}`I^-
-);lk~|pT+b}q1J2i32_y#n;$=zG%$<!*n*0sdj8?6q>u}f1N`HntmZ*~WdtF8Fx7na#$p+^(zvs|QI_
-jV>Ts^dVL{!$f4>(lS^Z^eozBdjPvZwrO9KQH0000808trnOyHMcTE7PX0QM6A03-ka0B~t=FJE?LZe
-(wAFJow7a%5$6FJow7a&u*LaB^>AWpXZXd6iddbJ|K0{qA4U6@M^nKnuBbYj??Gmk@}li?IuErLu`v7
-Saf2Ek@drWLx*w@97zV1cp>XRZ?cAryr-gPdDf1$3OIO_<1~~$#^iF&WH4Iay|HiPRO30ozr41=vvE_
-R9-}bI1nULx{CjlQRLCBl8-{CxbfGXPDMt6$b_H8ntX^lXIl+pB{K=JPvTKTaUwLuA!SEYLw+i<)b|p
-Bqs=B)()ThMs}x^#5^M7Xis>fS_T1OP%S1rS!f1SH%G0bXDPU@yQDe}gH=RxwDvpXf)Q=*Xv202+kqZ
-4N0vpL7R+*N|9Pu^MW)CMsSDt>L8yT&%+)$g~VMbX@H$}FNm64dQ3;gq<nD66Vyau5XAV3<)rS^2e=!
-RMdO5-qlg6D6kh;#BiMOp+hwf2EjMxF}(8f(1Y#DNS8KFU>qcsZ<0=uNr>`SbLaCL%>B^jRpOVg4pxM
-$*UQiS&g^1$ikYe3q^&C`atbymW*{G1MFQ-;$8HXWN{9oX{JmyR}woY#~-^cp3YTbSM0<38xE+kS@J_
-=^TZiiZmdpjM_DlgFm1Ufj*)9XelU9MVLn|Xn-tz880rcZx_^`ex)z{*{nZZe0>X9qyo1{u+=0tNhF~
-dQE5+Q1ssQhtKn>Li5LBk<H>mOmAxO07t`T<PNVA?_35TRTZ{*{lm3iuZf7^w^Pz*}3bBQl!8``?4&o
-3hH!+YzlXx;pZRlT--V_c-0j<49fi(L9T@{dr3Q3Az%3&0%m5CQmDnQ?o3`xaVi=MPZ?VvngWEWbh{I
-<{)zSE-LyAbl!LxdE}@q8phs2)XetXuRkPBRw0>f>$aO}E==cYo`2iEigOIrX98^wUq0&-vLIGR6HA#
-Va(;YWo%5o`o9i<Or3c%FE*$9WNm@&rn`xXJ>xor63LP(p+SGCv+oT{uk_o&OIY;%**T9VsN`~7nidk
-zDz#Rd+Ip<_}yLyA|%(9;0M=jq#_Dis9d#jLm8od-%n#Dpoz*43pj4d#-W8T_pfSCabNp(Acjz_gpJu
-*iELud8m_Cnjd0y&<(>vTWyZIYp43rsJ`ESc!D2l9Y*qX#(ad;Ru~S&mxUqDoSBosy%7(Uk5DF2L;4J
-gHbOQ8GSuwtyP+#-DvH}oXKUSd(gz`_l>^Pm$AitLWMxgJ5%2R{3y9Tkl%OVqQtfHc^?=-#vGA*1mUp
-AH(jc?zdJDv9T=f92any)Vq;sssUKo5=M>?e#%h5wc5F)wnTVjZLh9=v+>YWMdSW{OZMW*F|(tVo36b
-ap?j-gr^6_Ld^+kx(mU@ZCvD-@Nvp{r11_cEWou^!C4+^m{%|@bLTd-#PTrsCv7>tP{G&OsX;8P*x-&
-@XojYSSz(ByEi=jrAolR2sA`#^C(+#NO8{N7-WRZf)5o459}swhz1*kAIS|UE2uJ5lwPEc9U5V-eD<D
-SJfy6yY%&iM!fG)?V`n7W>57DxW`uG+g@RoL_@!Lsah}4z|K(hP#>LW)Dh-;+JBd8sPEdpcgd&Xc1V<
-RKzLYiHb%;2Q((8n0lZk@^NPR66r15Dj{WS$K(>M=38kU)^GUgnuA*&V+y*E|E6R&7AE8FGh)nX-{Nj
-xWD6f@85JH(kYLQzqN(u^rDYwz%@X*-D|*8%GQY?$!Mk8<pLjJ<`i60K**u4qC9RdCi1)1+vP03e}Jw
-^ja^TGhU;4que#KQCH4g-1T7!7B(cwvFdfS?j&Mw_AiA@tnca28(>_wYzsU6*iW!o#YXtR)t%xH`YRm
-s<D8ywzXu}9n4+tK;5>iwuM-35$Xb~Av(=RYOr{D$U~7raRXKgQ>3V$;7}LZEb=t+?D;yz+~nfpA(eY
-8R3lbRlecV*CNSwQ9~`K`=4u)Q72I_8?l@?dgGTBMLhWwvZcoDQD3zciQ$u5orZHbBcn2EhR9^I6<gj
-jqx%!8R+6mVZRkHb3^d~5tQ{$Gr>qa8uuK59{&y0bzw%py{L;C*SwwC725Z9*VxGeS<r)>Hc#BTuN!D
-f2A&f-QX=bWL1<deV-{O-e1+UQ4VymMf9FiB3EkedyDm|$E-Ma9x0<UKd`{aovv`yWnlUO5pg^##YNZ
-%g0H7@cs4L(Lm@)8-eN`t!kfT)S<VUkNa5-O7Nm0h${EaqaZo-%pTm)wNsW{rxXd>#m-an|Ui-jy%lB
-YA@2_k=M+9eqo2039xOiL?aT)lu)yG&|h=x`}idUtBex1BD)IUWeNuZ1{qj_gDqp&AEETyo)#$HwMZU
-*W6M2b{xx;)4(tuq!hhh-d=eM1>Bk$M`DP}B`~yia+w&2uUM{XCgoqEDy0XVT`Qb>{o<NE}nE!_w-u+
-0!Lg(TL?Uwnjvu<iyVp}S0TPj>Ve7voC={t^dGN2t1?cQy#D(-se>p4LuKd_kcGqd{~LRVTdsrg{bW^
-2ZV`%<-4|A!DseMR#^4%kc`6|44s$j9g4xsj|;sDL{ve#op`SM0E<tGnh26W4jhYoS*TG8A;V?&0?VX
-b4UJB<MjT+0WSo-M_R{cH6eT>wC{QJd%NWy32ud4D4S8`2fxXUB|&a3F_Ss=GFfJP)h>@6aWAK2mnzT
-aZFtMH%O!f000IK001cf003}la4%nWWo~3|axY_OVRB?;bT4CXWNB_^b97;JWo=<&XlZU`E^v93SMP7
-zHW2;pzv9q*h_kv{++x6*Ai$i|X^kaLU^^&+A~0y_WOJoNkEEP>fBhaQ$-k3zMuFDHyT`kCcaQGT(cu
-qWc0c#}bkn=)_J>`%yt%vjlV0#WY8=sM#&l=oROUj_l}?zXrA+@Ll@gIQQ;K1W8ntULmrla-6E9flIU
-CX`xdRyR@3XV9m@`aSR^&1kPU_s^tC?#Pz5tl+wJGhfVc|HT$uc1BUnPvknlEwH%u(~|gxViJ{tk$P?
-h$pAqJj6dG+@hS!AV)kmCl`!lfr4!v?ph<5Zwy%o$jTY8kx~MLWYi<ru(Iv>Ab2R)F?SI!Yn;YsbMCo
-Q}>L-&S|L&ibYO_6KP9$5aCGV$*<ZVKGTUzm)=z53Ci(VJ2siEIsDvzpc}Txls<FL2G!gb6D4B=-^iG
-A%Oot#z0J<nOkMj#hE*bTtpOj{Jtvkp_jfPYSXk(N)UI!<5L=`THHGu}qnmRdc!H#tq|gmhM@9!JSXY
-{m%meHU+~XerM4`_ZBbqQ3meWGDfB;|m+8cejdl*rt|43gugF&Z1dOU|On8qpkS0c%5t|Wj_l@YmHB5
-?rRb_Z8q5Yf5p-SkF}KKtw5sNWq9>H2O!9lGxfM!l<to6dml9|re#!)`=0WUeXpWF8`UMR5wqOoPdUo
-si0wr9Yy*7740^W@5o;bIcMGMFJ}_U;eKiDxFV5y$D$odQLK>T)P%M8;RM$^zC&QDC_>VF!XWMqTkwZ
-68U$977P)7EmJ^WE3Hk7F12;u^|pi9)A#N6>AUua(>Bq=5SEud)a`%zNf9|}G|(x(E=o_K0n<h!H9Dh
-+^8&M7o!yFfCUYJ-3{|7ih?THj2@?1RTXo*llfO82*h#D;y?OH{{M{kzeJCrPJTn+ezf1x<fCI~a7o5
-js?*z>SBqc7CFa&G3Bm!?HfH6SID9<i>jQbE(_0zUibDJ`{8z#B*)_ycG_ab(13|QM~i3P?*OqAa#d<
-{{E7UX2cQP9urfOsbIDT5<tH{d41;$kc-%rrN=kh-wd8N?){9k7vTopnIR$a(?zu*R}}E5$B*z9jF6k
-(D`ioNbUgXqSK_zN;xYYXqR-2n$t0oRtEAKW<eE0`U*y!aN5t5u|vEx!>wcfZF;rWdu?LErgOucxE8F
-$mb+95!4tEjWwD<@+J&TkO}8brqZi;fV=J1X;pdUiGO6+mL<A9zSju5gR`4nDPUlI&M^YwdKrCMmV>r
-=`C}`mInct`<>j>OL;1$QJJ+QB7nEtO#F(sxlb&Z1L+M|S7*CT3Qi=$l;x1gBaa7hECKbsk7D?4anPq
-r_eBHQ6`dNk5KI7uFT7m8CRy$D9+8qoaq+1Q&Aoev*akpCce!t~gYZ@qCujjg&L#6Cv<+x|3wvx0p<f
-nSK11$fDRgrLT+J{@UB4`)7U{P54Bc(KjF8X)Sd)LC0a7yE`#7~d$xM^9XEwWi9US+{5jmCKRS<wZKb
-`Ijgn6am7j84Jf^w7B<xv|3hzi?i*<AVCoob7Y3$6)577UpQm?k3op<8dxB9*<A9BOnFrnkS7_aizhZ
-?NzmP`KG)_K{3`CIsb5_V?|NCfprubx7OrmrfJwO{2ugg#D*hY$8zmbX>2LVE$=Us)gdSVfT^jQt-=D
-k<!f`X*^Y0=!8mqauaBR;#ZRjc+_PWdp%Txw#^}FV`f^*h)2i&N%+?h=ZL;QP(jOgHL<Ri`$(E6=O)7
-m0%EJ}JR{NTJ1^;r0tW@}QI)2(;pYVCR!S=~()3OD<k+bi^%J1pbWqEr+?UjRJSD1Y7ru7JdhhT?P1>
-(W)?ojVz)ScLY2{KV$Fs?-KRjjH^zi(hJ`1~<9{(mTLxk6U>AyA0vPa)O5K>HU^O9KQH0000808trnO
-niprWk~`60B!^T0384T0B~t=FJE?LZe(wAFJow7a%5$6FJo_QaA9;VaCwzeO>f#j5WVv&p2USnE`>zB
-l;&WFNvsk;*eK!@t?hBW>avS=*QEaU9rF<)C6U^_*z@t;zM0wSc0WECNB8j@vv?BClL+J4V)7H8<aRq
-<OpNwcX0<oA=dQl92e=a&V<mK630oXIF?%M)7Q*GG)56k9Iw+Z0VH@yoX^G%W>0gAU5gJn?XN;vnx+6
-b9dI(*7HJ0&PQ^>MuU9~RA!dC=OcI#lugK<A!V@A$#?4C4Pp|GqoC36PPWKP-<gu|}&xrz#8%>g%Ug(
-N2-m>Q-RUK%|DNshO7@5ws$;JQCN-*#dQU@UsVxB4y2t_5DP=mtu#x-+u>VGAym7LfWtTbUh~RWTtK`
-XZG=MyMT?wF;PlbMX|X4~un*aK6D)xLSqtbTi^yUm1?lo{mg%yHk>hxhgBPZ&)}JJVvX@10%w5Jd4v!
-t9}}%^C(F$U91pd8LrZJvYv%2EZ3{$B8mDyLUe9%+su!e{MzD@DYu3@S&$b}xnt=Y9<O78sz4?7#AD7
-$?pdBdZg$Oo%}^Qr>rgL4E)5+)me9rrc(Ib-jyLb8%Pg1q28eau5AbcsNkactJc5MbQ&}?gR2gFfjE(
-bc>SM^*!S!%B_%gg141smRp3e@V`Q1M*RJYUNNg3<m8rNZ?Y=8Qvck?WDY48KRn*ameHC`+%H`lmDYH
-K=~H*8LYaz{H8j-L5lv9rgYfY(Llrl6}s)YBjT>>GY$x932I82Xm_!gb_+z3MG>)_8IO*m_UQ&dy&@O
-9KQH0000808trnOua&yF=zt-06zx+03rYY0B~t=FJE?LZe(wAFJow7a%5$6FJo{yG&yi`Z(?O~E^v93
-R84Q&I1s)2R}A8d1322ay9G843ap~osS$rcvQgw@&=O@6rAULM5~#m^A0^pNS{vBqNt&7WIP+#W-R}8
-A55uSNj3(n~I7^1~FqucsbRo9e>C$q?X>P<;C?+Y=87E<>&_9KgEYN04DQrRK5IR=E2}C~fS1$FQ8`3
-$sGaQJYac5Ju=P(sTsYJ@0(8}W1?6s+XKuim58hdIub3CI>RWts66*Hb|U*W2qqh54PgS)%GL2))bpi
-oMReXOOJTW(%?)>IN{<&4;rPMe;+{sIfpl$js25OQloK{td99XU;l%I&mj>xVQ_Yz#A%S1C7~lhwI<L
-t^(->5@{W$nZ?qh8{vVVk-MX8{i9_iM;ZrQe`N|XYIHt>_Nk)*@`CIB2#+eiW^k3C^u5108d29mF2`N
-?Y+(JPD+h@B1xMFjWp<Mb?=D_`2F3l+*nxXQ!qH()-v`<8|pFV^G7%L9(awUE0XAjIUs|x5}Yc{NT`~
-22kr3zLKOOjF`^Bp((=5NeJ~)FzK@sR=Bp)zvlsdv#&I}XzT6`gO2do(HB6$|O95h3Wtegm5(mL_7)R
-fL2p`6i@$$uIKN>G*!z7{6Jf@HqVZ0nit4SEsVihmu$uJ;FI6p}2#XKkSQQ{nwg@%$DcT7mzl>UPDS|
-lhl+Ob!THm6)*qKM&%?5qFPL#frat{0G#p!XzlQrh+D%?Qj6rti1zg5}iTK88LG`t*5#Af|puv>*X|B
-yv!Xq}HZS5865(It_un{WKWd-VFY{9T2S&SS}qJ&L02c66tn2xzPm$>5iG>K=@%p1N|!+uA=Ao@tq^Y
-o~SH#M2o|_P+RLTZUswsLh%DKsy&JKOdC%NDK`Ex%iZ4S4Ww@4r=@h_p>jNeH{otkdruf^izD^o?ytL
-bGF?ySkHbl)(@7<>wlO!b-g!2x3v3I_Mo#Osz|vW-dzQ<*wfkdBte@UHsy@{b!4YtMiiM+9V2$j)o~g
-O_G1n6oD|Wsderb~S&yh7(Ll-}e(Ea8)#@)>veP~TP$s7KTtT`A!gyuOnT)E(5p6@Bv%y;o8#Q%D^!@
-m}4u!bFswe=q~581lvC}`W%wPFSTRaC=WX%t=6#a>-vkW6h$w!Mgc#=B<fs`D>UO9KQH0000808trnO
-hg2%$-n{t0DT4k02}}S0B~t=FJE?LZe(wAFJow7a%5$6FJ*3ZZF4Sgd99R9Z{jczhVS_mqn_FeDzueW
-NGml!pe`XnB&^g^Fv$Sf8k>!sc9Htycj7=OtM;&~<^q2089(#kxwyD+Tp>WMz-$maS#CA`;|6$vP-@I
-*Rj6{kQKhj*(hV;%G_d38GhbuNak{)T8&z~+z$Nqqm-Yx;W?Z(G$L0Nc%X866)%MD{pi3Pm6<ljza#x
-zjaD$g>`4dxf)pdZr>P+<;Z*mPtSWw`uK#kI9%aP@)6&ADvU0G}3P|ExT3(W-(Ah}Wnq=d9Y$Ytxy>v
-TTz5;y8I2H)Y@N?z1&l(tnK*ythYJ;fd=od($Fa$Qp3!(13F{u^2x+`!8E(eR2EmhX0A4@LpEo)(MwF
-{r^Irp4ksmi_|^yvR!;HktZt$h<)n)9>r{*={^@2P|e`;QIA;$8JBmQ@7f$wOgx=!<pv>werm>K^P?c
-$FY^#b-G-?_R}7|zlNj_aNa(msLia?qw(7b=j}kzq<vbbWiHoW)G0gihM#uFz>B?p%z{zV9K&!P3=$S
-My%B_QGC6OI2~Rh<#4jSWe_&ht{0uaT-C2C<;MpvkHH0jV{w9p@SBWx3KYvD%Z<NaZkyA8=)xh9(7Vw
-nX7gkCL^-2Y@=g8<KSEU9e@tipDMsCc0cn$PC@Y&e&pBnCFSvTl3jM%~8#<9x14Q7ipb22MrxPmpBgn
-*NjvbI)5j`}hc`ViLvpj)6R3#q#lAOfAPT7cqs7uCs}a&1GY($G56S6}S}Zkw$3k4fm)#{2&+{=3_o@
-vv1H3QhSf4)Y+QBn#~A4OSOxG*jEliv`diJyoO%z^GQ8GFR@+rYep=ZO6NWei+2F&<BD_mDG7g2pN@B
-pdst?qEYXALwcgsVCmf59m*7VNspfB*oyV!h@K|B(6_=({gT+oKAO&5UCraImC|<p08mQ<1QY-O00;n
-48F5Smhy^`01pokU4*&ol0001RX>c!Jc4cm4Z*nhVXkl_>WppoPb7OFFZ(?O~E^v9RR&8(MMiBnauNW
-m#1rp~%s!GkJkxGcU^Br%piB4%%S&Kb}Rn0ElU6OLYzO#P8IGDTKwf+Lk&OAHw%rk>8FPk5@bKiMW7<
-)r^8n|#bo((_38Q;s+B`nqmGsRb2uoQ+eM&KGY@-t6U=18@Ih-^-)boB%`oILOG2~)X61u_BCfI<FKG
-&*8iB-3WI6Fg#uOQGqf+DeuEAYhnFmD?kQ%wP=5eTH~?6;l>#yQizx2HL|8^sldfA&5qI2L@>hzV+4M
-qek_FabC$#3ZwXPXQXQD&RenoOqlu$<~&^~zJWJD85%GW=6kc2qNty!N%>MSwYMxK3K6tS%rhl+1ADo
-HhzU>_bDhHz5eAruf0T;iH!|kQ-kNqIrgCi72GvHF9KM@Az!)`U3hz*$qH5;5Wy&K89`gu=MqnDY)~4
-4LQzM&5P$U8)N$?rFH-MbZ?cGnPG+E%v>6f<^h+U8h+RWJeshe9H*rBBNkWx2P8R;}qP*oZO7a8oDxT
-h}!NQFL=j9`hd)0phiE+LRFeDW6WXAcV)OdsLX!1o8!#p4b664P`_{mYT~W}9*Xrm7SZW>1L|z{K^3?
-<rz%=Z(F^qs@NgEv9Y|z-Z>f0OkXK;SC?g10UuO{(Kg=4nTldQf$d=BKbgZLXaCtOvY#!Pjz1UBehpk
-f@utE_Jq{t2stSV7>&qw|4ltirC4S4Qb<MU4e$hnG+lUBoU}vgJLxW=RQ>Ie=p&~KKljOriN8{6K|tX
-no)GjXl~Q%#PHJOaCj*M@UG@9DH~pV_eSn96Eax6@r}wX1BA2aJqT~jgXw8&HvsH3Q)l>KE2o1>?pqX
-dJ(vb#1th6D0ZCJGC0uSEVNnlSV`AHFiVn=gQc#WA@?br%OJSBy8!Gf1zRA?TU{VJn%q&H=B`~B}>Fb
-OBKdv{C>2D7W))zxr%YWpy+Y%OSb3crv3!LQS5wW5@14X%!ArMGLpXy;gfi;IiwGaIX#gPj;n(z>wg7
-j(474PF4-61h}fCQ(u+MuzGJ6a}Msn$I-yNUH&v=IP!FRjvg8%$6wv<{O#9^_o-y8vou=xV=kRO=kl~
-d&0;JipMC7U0NhW67Jz5=a7E(CB_88kkbYZ!?wmW>C*BLt1!tLbUT#-i;C@|ceI_`FA3^`4eU4voMVK
-e@0|*V{0l9G)ZSb8<IlqxO;UDz6bL`O5RNl^@6q0H!@!%&$KJ?u@88z?T))5}_EE&`Q;i-gs?+&Ch*K
-RNA-$@a4}<x@mh+u8oQnQi6Zkmu-NE#~U4J}FFFMUg>`zE2VMH6yP`|CN>ONsU6c~raGWv>FT2#>NmT
-joUBSq6-+MP=Mxgk^VYlU87l-_oxD>c(9uX9)DHUFo8GpF{6=pBcP9k%MmLnkseskntY>+>?hGi^vww
-ClNc{@<=-e!tP`BRb9gz<B`{3bw(Q)GIVQCC*%b4zRrUbzr4;C4v<tL$oJ$Yepw1<qVyqQ}11IS<kt?
-KG-qUc*d*OtL{$_<6`|T_lA08)Y1K!zO1gwvpV88$*-uVCPDkBQZp1%IgQL!)*#RPAP+BQuR;^}kIBv
-LsMC~9J@U5pBH*~bKl9I}axxSnMvON)H_pJDTj)1>mpy+O@arw~nv*%)abV#1?Z%nT7U9G_8+okMEdI
-ok{^7sEl(z`zistOTklASVFuf1G#TVil)<DI5K0H-kVex9%KJ9e_;?c^eAP*DzI;tAyJwN&vP)h>@6a
-WAK2mnzTaZJGqV4@TT000gt000~S003}la4%nWWo~3|axY_OVRB?;bT4IdV{>gTaCz;SZByb%5Xay1D
-Z17dY87x0p4Yk;$fC0HR0-CW`^Fl=L{b|PY7*SyuI{^EHzW&@j)KVQT?ty~bpLy1dLH^$;pm8e!Fltt
-)rEGe(d-&cIB)kF*O1_QlsbaJSVB+P_qHn>Xm}$Dwht5UFWYfM)>HRjVp}#9xwc$8u+j62e2|Vel?pr
-y0wxCfcV*z4Vk)s|GMTxyDFWMbef(EVJ+=4;14G|a%XU*q5y%k?=ZlD&T?s|8rgQ9S9KcEA6!NuN6+^
-J@S*SY>=;Z5zE`6yU<Y+mQhUW&#9?k+!o%pApu?3(b)DP&}&b_iHkO3TF0D%Ync`)|eaQ>JY#~v!7=9
-DE%NeRAZ1wV0MXE66>U<wzM9NGRdJSHLl;g0_B6zV75$hPLxG;>Ed9U65Y)x?i-c-g&yw)AnNa4B7>a
-5nwf(6LPvw{26pz69aJl-m69DpMCU5F;E2TzD9Mk=-+pHrlE02dR8)0WF)4dJ7|_!BcP|0vbQA=9Gk|
-IOsVzxEd-_X4w?1W;z1fU4$KD?(q){h!g#Z+X#jdX1=s$P8uViFMMkau6j2EsCRGSTV2=d-NEe{`eLT
-hitD$GWKX7!je&7iO1Qxs2aW+cO}%l2iu!r0-5T7|=r3A>ZqqQ}qNhV0`gMKKYTUHzI`nV!e$QxT0Sq
-al6jL&}B>zgWg&`*%W^yD0VLSeE>bJPOJ`T_s!B{*<TxL_+xT8Se5t+_+T0_Tk?-%n$$ts~|U|ZmNK^
-lH48}|<GzKzwzD692N<EA&WX(;8<Nw_~8Tml2-7q*3=FC5QPX*l=%fLuFu)aJB&K9|WCa(RFo16z__(
-CmKM@)9{pr7Y!5AS>M&?qysxIyxO;j%`;O0dAsH>gxMlqiw*SaFWWWbFnu74l9QzE>}tAI9ru$7Hi9s
-E+6UgaU1FKyiOyX#`mX@PUCe2(iM1Jfpi64S0r7L*A+=u<aH&|m3Uo=bR}L_CS94=l}T6TbrsT8B3%)
-GOKB~#k*;Fl`o-U5tCFr-;ccX=^12%7YP_ySx*D$&q!YYOkWTQrA?b#^Zb-TzuQN$!@;Z}rCa)WjZp7
-<Gq#N-%Njk~vB<Uotvq)$0I*W9cl{#IVMq{uzjO(W~YYgz_Ovjp<y57@Kj;})cIp^(~mLZuYx&|_M32
-f*6f~MBMxa&0cYNP8YgO|~ZVr)0c#4IjWp~z>BF7--k;ZaIl!E&Od6#Gc(qng3%G}$Ax#6Ob#*gmveM
-ys%Wa0z|!9^9pgDndq!&JCi6e%Eex?~p&*O*%t(JH~#(^VPZQ^u9FP=<)Zl=?LGy3&hZo$Dd(Y3)9P4
-u3n*+B}}AJbSrOq_%y8bIL3epGZyO3k#4NN*r+!(u9%SLr>pOo%kzv@$ZMZAogCrb&%`}B9ycgUzC8X
-Xm1-G1EvIRX?ym~3y{igeI8cQz{tqhrBU@PEwRHTwUg23=Sm8NaRN+}$Sm8NaRN+}$Sm8NaRN+}$Sm8
-NaRN+}$Sm8NaRN+}$Sm8NaRN+}$Sm8NaRN-0Ms=}`hWpbhCs`@VVXpb9}DfGLL!hxIEBLCYEV|x@?7X
-4R?yGx3m=Y+!{+up0Y1{tL%$mrm^Y{?bxI8lXMrf@(WfB7_`d!$g!6dv7o&jZ>zsjc0U$-ovPoDD8Yz
-_(hWW1QmFZ|daOkC`rMzKIbc!b4$(l$l0%6Y;hqy|4Y9NiV8UuSI$lhV%+d%za6(9CBWjCB0g@^g(*R
-Y#*femZXP=@;^*^Zv}sQklt^6<n+p%cMwK=0{cSHIsj`vL3jK0R(???lHFdH^$xKcUl;ZcL!%4Wdmre
-@-gU)X2Du=1C+|R`F(9Su{8=Dfg4nh|n$PV<q>GBOGm&o0d3z%L+TV^yzly1NgrwK{n?HOktl3r%AB!
-6?U+3XtDQ5e4`1paO?+;1wP`(|KetgS#0JLI2bkEG~%Z7)4+PMF>hYKE!9gD5LL|i*X&yv8h{%uPFo8
-K%x2?C3AyfX-FOmlk>xYoA=foo4m;SvU<{smA=0|XQR000O8Q5kVeAUDL&Dg^)lr49f9A^-pYaA|NaU
-v_0~WN&gWV`yP=WMy<OWp!g}aBy;OVr6nJaCxm(e{b4I5dEJ|F=|v5bc747PP!)Q=?IX7mS4g~Ra8aR
-Viwq|*+skSwDi;8TiY0Hpx5eZMGD@1^JeDF?5r;?PCs<pz3&aF-)nb=UYBnBqxJ_ngT1I+kiX(I(qbt
-ji>R&UoP?pZ`X-`?HI!abh_yy#2kl8=1&|&7%p<kon$&{q2@c?g+?tSWIF{DySc;HYp`^j9-YA{CfSA
-Tgr|Y5S%<?(Swh800E2bUSW(!v<OVxIbns49!35t{O2DPGyCJt+8!VTBYe4b{~R?=!Qi>=aCQ@h3r(S
-YgCG#1fPi#1&mBD7=`jkk8CWR^dqiNs7Zy>%)rH0Na0!hS(uH?&nTg-nv>b74|?2w{oI`R_`@ey!$Wv
-2{zaoFg3<wdHzkb{gIfr_|>Lk<vYvTqB!tJc~pK<Gu*FG@O{BjaxITy;65B5HAaa?iA<~b#I6Z>^tAj
-TpO&=>qc|uEn}>c(o|*E#gA%koM8<?Zz)1G^v<$zQi6S^a}qM4T|s;N03j0nf;OTVr`YgC9M!=9EPd?
-x52LA1t>GhmY)vMuq5pUTER@DB>X$N!^(GP^Mpl|hyG7t27<4D?2UxUjd;OmO=%T;t`NOW~(cNf5EgH
-8bey=_4w<a{6PR1jz+aU5d-%0GmJSB22@dA`<1tsU)G7*_H^+%M~Ai!u&EB4G$=8y|?6fqo;&Gx5i7%
-90-@`cG>&>Ip9lFHWUix%h|bl*{R!LqM!9ZerL>hwnwASORYD1is_JFx)uU8Iz*)2%YrK?g0^UcGKMu
-P&Q!u9`$s4=d*$>JB?UI7BWgm4#MoYH%5&mr*r$bjDiEgj{+SO$6sGTnWjOw+y|Wg)62Fw;Ld#R%SPd
-BP(vVmbbC%aXU_SGaJkza2m(5P8oM*?PMq6&wTAnK$CZ=I{}$NciMhG?i_5iFub+~gDbWBXA?^MwSab
-0gMYOpAo4I~T>u8&AQ+4~-F~G~2_t4qx}2s`J)I$@5QY$1Zb3mHFw26VYIwBB*4<-bOttC(Rh<$<BR8
-n+vDnDu3J~4969QF>v6gHPH4B(a`5TJ#?!0ct&J(qcY)dMZ%`^tJ#bT~Ty6~e??99I#O3}&RXh5*pZS
-FE_%s{d=FMHP9##+(~_`ZBUesPW>VsaU?<yrIhY{Mj?c(G4(!TCIa*D=>E4<PY@p&LrV%~%|C&_-NVb
-JPLMJ-AXI-+Z{vS=^vz$s4&zx`kFM-~1$=l6@QuiP3@alVJ;#yH0ZLgF+U&t0A4Z$zJt<wpL)kXe*Mu
-D-4B3cQP4Gih1Pqi_~(7s?GT<URGbdG=#rwYOHX{aIGN@E}SIAm*!Rdi01f7Q#dGeJ@b_nu1=zMI+|R
-C!x7gQj{IQIJ+heLo91(2l}G<2MbGy@bw-QR-tR`!VJGPMzr?@i;|4u;@5BnwcgOW#Lc%cCnoIl#$~E
-V)cyKG6ud8F~eRi0ZDaWVg6CCC3boF%J=;(OoC+UE%p2vS2S<ZBF=>0Suj|~4#j;F)j9~^vqHm?Q!M$
-M-mY2@Pb|C0PgL6jmX4&#FoUlmGx*?ihV(JTo%@6bZKce;MJ?e~WF*X0>gJuUH4*?>zGFINFRomka<;
-Lgi=rM5{kE4dJJE<+CFUuh)X!)W5Sr+(l+OuBgKcgk~jpW^q=X!$bOC%V53N>P+<kzIZcu|JOGoJ)!1
-)>#7-tWP(^S&A(3HTzmUjHO=Su2ud8P)h>@6aWAK2mnzTaZL0<19@Q>008PV001BW003}la4%nWWo~3
-|axY_OVRB?;bT4IfV{39|a%FKYaCw!QYmXI2l7_$cuSkh6MrxSKsH{t_wJQMzPiru+4QS;3f*LrOqiO
-oEryG0OU%&A@1@=m2q+KMJ`&4B{M#klhOXjUx-~LzbKm76RNqKzs;Ng?!56k_>PapiP{FAY_PHvSK?|
-0?tasSKy>f*9IIK17J{dM{2@ZbB(%ZvQ|;lrn^{hN!M!?C=%-0!Y#%9|W>_vGu;v#b5hK4<>0`*nAD_
-_#Zk!@F|x4VpRr$?oR*&Be#v|026TTwUkS<Hy6%A4#}8I~=$7Z;rc*o88;;`m+@Oywt@JS|2~>Qtxld
-cMoot+WVR$zB&AExp#S4&KY}M&Ue?l<FC87+fE)Fu5OO|*Pn8m-(BDSmwZ#oPZ!63lxO?PUyl0^<xWW
-sZ_3S~Jo|j}{&4kW|0$}={p;h!@iS6;ciipD_2J#kZ^_vA<@4cFd2?}9j=Q(}>y3O0;-*|&z5UDKnDa
-jz-tOOh=GCXGx49j-zS$i=Tz{3}k568f$Ghv~wEVcc+8uK@&py4r+`q}mkN0nOSJ%68aa}(0?)v>7l6
-nLq&%ZEI9vzar(*3^d_W7N)f88Cg^G%7n_3LV1D4v$o^>-IH@SocJ$i&;p^yhM!+BklldH0(l_+zJU%
-l=BT?^E{qM-t49{+4D{Uhm4M>)pFgm#0Y~$CkgJz4+_XmoLh_CqI|J-#b6Q_vFRT-{;trbbd|!ZIt#O
-KBfu2ExD`X#nsK{WIPG{^zi(_UvtL2`)7~OUi=LAkIr5^dHDQ!dGz$W+$+!SoxeDH@bdA!^YZNF`Ln0
-bAKoqH`EK`B#0c|SLjGOE?~>$)LrU`P?&e~DdA)7@=Tz@?GI;s6yubK$muh~q+owg9i*%8XpZ{MvygX
-d};(l|=9|HZp?BA8E!_8^=?YK|dN$dNQc9Y5<`aMmfe{=V=Of?5xT>axRRq#BgKia=b(vL0=hvR9vf4
-IJ3=uh`@?hv&Ocj`FQQeHmKH~;KkdHCdq|0Af}I!VIMFHlzQ>fQ11p<KL1kum&~_WfTs<pYM4zImNC^
-5*hW;=^U`FA?BV3OU^)1^D6PCyec8_vZc8;qvgyXNcBVOSyCB-^y@z>G?aR`Rnf<`FpDI`|ovT!VvB2
-i{4vf&d}CBUiGdn&))7X$`4;{7r!`1pygjTO4C^WQogHqzWlhI@0amzK<+%*%?<u}?o|$gpPU%uG~CI
-*Z%Z$h{>67be@qCx{KnjqlZP)K{O$bJi=UsJJ-GMy)emRSU!0%afBE9<>62II_ws*9X}&xBKJMQA#}8
-jUKl_h|`94<*g!SP4#SxQ9bNSDwNAcz2_2sUdewma`lQW;bdUXEq-(NjF|KZ_zPX6wslscZ~e?vZEII
-Ux!PfJ_tX<cg1N4_g#tfyrj`e}(8ysM{W8I~M3<k#qqi_=op<@6*eEc}M*(9$@^`Lx!W?_wDF(DJW2C
-(rA|UrBlzRz6HTW*!n)VP=(}3-Cxb^O4KfmX8@mMy3o?5*%m9jLC@f+nS_HIAdfb3AEFb(pxSC@A-Sm
-F)c^;0lpUB!NZvEmL)e4O{y!qO$m&MYgrM}#!*j#wdU`hyDw{gPSP;9=D@PBN5oKBb7|0T2)7}~#t`P
-NurMo?6y!-tmqlCS;XLTiGb^)E3A#M<QZ-2-)L;^v7x<U!#*k@987>nnp@n4%R$<J9J|-5KSY%52^Y+
-ehP?(@F!}Sc;bIx6J+({W_Zf5lCUr>O<vUWt3%e9(9TL)MlCiV!y8PX~$^^uyGk<a9oSqcTz%IBpbdl
-p>~)xt`PI`Ul-oYd$7eJx~x^y1vkmRC$yJ?7@qL^KC1nMb(q6;oPNf09A{xv}JH?aWx9x?<RMBbd@1x
-0ek|V9RO5NwBj>L-RR$QfQdSJVF(-j{$+ByrmAXzDO_`>6qYJ<%W5EU^D}f=7bw8aI^H_gFlf)XGVvG
-4(SfTriXRMbX;#_-yObWE=SkYUjBv9U~bKw)FCBRSA2OyQtRL&?J%Dse>NVlxqX>=EId}U)%mMK+U=!
-i+TwBysUif1(D9TNr(bK50c{Ga<h+%4m==4~g%n5|&=&l!)oCC}z(SQY;IO(pUcUMT92&QGsjaDlK)B
-GFxKkjL`xc8F;s?aM=(cEi2zUU3qDmF!@U<22Sw|Kb88Sj2pAq{MNM-IYJ1&=-RmzHjJJOvt0kJ3;)3
-gL2p;ZudQWl`BTz6T>4;>Rn69xB3EmxOE1i(@mu|CY9flZ^*<lTr1b@!Nylr{klGb>?t6EF%)pCk_$L
-0~L6#ENGYY;FZ*$5cvb1PE+1!6sOV?cs0({?P!8#>QIeD7Or{t)N@OQAeaXgd8G)wA!-iF&8eNbJ21E
-jC?1<*jN+m1_72mVm3sebT~E-p2Py&YiWSpI>{!WqAXVU0Qx3P0tpW*TVC;@b@G9APp}F8V#yggKw^M
-q6%=R3u?Qg2dDjr`h#&DGx2&0>`pRR#uU0T~o#8<Wv+pKM#1HHdJY2y;q+VC>Z%xuCiBtej*EpHSMyJ
-6IARr7jsvjEW1)0SUuoOVrqEhhw&}@j7;ZlCl&KG~OvS^7zuh>8$B_;w@Ww^Q=^xfDBV%JcaY-L5_`V
-dyMBEEtLj9?7lQ|9Ie3=hf86YhweW1IN_a3}>x*k~Ey-~j^)B3vItOE?rG`JfAp;DU$^eq`1G!PIXm1
-+OqD7L29N;*Q47R<Oev>+9fJERyk&{MRZj`*URxwG6DzP}QM3#zIb!`^II_k!o!L>5d=?5R+?e?v7b*
-`%W!aSMI2_;{gM4*;Is(S&2$j-Lm=Wa%I$)l_CDU%3N-_SG3%5k_M&$y{R)oGREFPjSjZPBC<dgH`b;
-J^eH5=A%51?bOF~hZ|bPNL#qOS!)%x%#-r9@FadF43=fz?xM`~JzpVtDsWLbOn{by-2$)wsW1C=i{)I
-!!aQJBO#W>a^HAuPQ8N}Q^ZZQRK72@!jin{=NnHUk3m}fTGi2Gepg*FC$R6zue2-x^vZW)vk7i#)#Sv
-N*x6D<%7I$8ka^Dndvtv;F^`4y?)^PPmV65}iJwi0|2Of|*^a^Vo&uTo$#4$+%f2mhFAZ%Ad;Jyv}gw
-<aJ3p|7Eojw(7(ZhmWO)f=j2UIiJa>R`l-KXf3on;&)pe+M5spx7r37FDYr^26q)Tx2qHa0a5siaKFu
-0O5uiEl2nnb+NNyFtFe=qAYIKK!|R-*tI8Y6RH)A><AJN%(<i@Ap~h60BpyX`|MBr8=x6U&>}QvGk0X
-oPCBv{8D|wGhvd^qRiFW-7}L6HB|eRghA%Cx3F=r8UmIA*PVzxzKsuM60~kReaDxf6+)Qgx%kafUof1
-u@kbj!Kn{~3=s%;9eGv+W5BP%FXnG*WDQ^*abS=3;;*|JE6We(jEPWmFA!(k<f2rInNES-6Si7Kk-jz
-*+zPd@@>XYC1iG^TWAXpY^<96MkUS~nYL+h0)FlFMAFvhUU88xNkU4uHxqs;Y0f<yC)l17e5PhuE=`x
-^W27cQVD^0n?_?n1%;iDw%)uuIqIx1(l+G5t>j%A~QG#o})K66|S_|CJPe>3ScmTjDe>VB3uDNbIV{p
-`ACE)%ez$^1%|W^RthmbBS&mNNeEa?zJqFX0yai6ISPzAU_f;>^r<Mh(eOy=RdtdHJqrIW1kb=p@{v(
-5pN&6_n<Psn_NL`IIzNz7Y=7ar$Z!#mLNbVk%%@>(RG(>wAoiTH$<LUn11mgKZ4O$9p%_aW<1)_V1MD
-V}N5D}PlF4l<k#P$N2Gmgs)bZ%iW<*R@Wo)YYRjMo;ES%^PWa>fMnp<{(M9LTpeG&{G%#&eT9Jr$y(`
-0a-j16#@W|Kppn(9b`BO4eE0WdO4fnr{Z8BK)A>&3_}XtB~L85UM$&3$eJnHNxPY=AET;#C|qy6^BFZ
-3iQsjgC6`V$g7|Ac)!6o~cx<AZ1ZqSZ&%9Vz)vCD;h3Z?U`6x*eAd&=Y>6)`om$dk{Zlju+VC%Kp3sv
-YF88&ZJdX!6`JaAqQ8If6;H`0;+#+ta9miv+ij}8BP$&J3q<8nw|YQ<IM<?_vSr0=nm&YKG>vTXK?*h
-_zU^VbgvE>OlrjN)RacsQP;XSgp*75A_F*GPAY*4>ll5$1A|%WSBBl>4hYd`t%aH<WclkB9yeX4a7Cv
-u|#OFobBCiEKVuFP&Pj;y`sT(h}Ckbp})G4-qh(J~~i=Pqpf&|o~+z>p;or0<?sC0rtBq$lmx+!Ia;L
-2njTI|>$hY$8WW|0wsG9p22pi(q%u`L9a8G-<;WlYluz!M?5ZsjK+ubpeZ)-x-*?Xb{cp(`_z=tfLw$
-!ApSWstZcIiREx+4BP;o!lsDwGP4}D_BwOwK&bJd<xrrcnWHzA(;;{Q`dtp69lX;KY&2pzZM=Y2Whab
-rYA<#mvN1JK&vu3kt?b>qx69)yCPwNhU?Ki$we%NG)86sWR$^45G12c396G~({-^XA*LAXns{g-?IPG
-5sX`DuqbeH3FcPE+`k~kkJ%1b^ZJb$|Cr+cDDa;D}3f5_si%|&IV=kpw%5atkVZ+hx$My6SV({p4KHz
-5Lt7+4=W$@7Yn4~>u;0EbRJ|Kwa7r<^@ERNVCLARowfb~K`+h(VU@idieOCZA>W5*eZ*c8R4&G?(eiY
-eHvJyGgUE)1K^Mj63>G!<ky+Rj17T%AnsGbbZC>n=Q{+C~NJs^GR*d9V|3jg6M3ahN*KqXfz9NFT?+F
-Ng{Zs|phMs%~#%*mn>FpQ@|REG*>Y7Ly<$2Z#&eKvdC&G<M$Ju}4{2ps+w;QHK77knE8eZpps#B_SCO
-7j4Pp6-N~fC<>#Rk&pg_^lG0AKC~=Suu<Dw<#5YZp|#qjBE-<xG8q_E0687FnR10HahaA)vdL~ipxW(
-|17F6X85E@A&Y#3!*u+~)Q<<h<pcE3wNC>1^q)`Vg<|AaRqlFLQKHWg2pk-6=#g#1p2#)}GRSaDtMgb
-b$EOWWLAR{BsJIN=Wf@Wy^7IM_!1R!F|$iNt*HkmvA5%h+G9#&Wm&K6NbXmW7~vH%bi_DyZx5N8@>Xc
-h%cv7qA>w1k32O;GvQwta;(s6;`T1OXoEv!I*`^5QT<Bie@%2awOnbeu<jG8vNq(gIuvd@^vlBsenJ>
-_}lag;Zn{i)Sa8+lVm+xM20;K@L6GLhC+g_UFSblYmV01lnr0%JM)0p*%t$0HtUSW*B8Kng@IeU9faV
-QORkZNf|X3JyV-T3)Sp`yj$@#Ow~0lqU^VBzD8|iJx)=8k7STqWCTmwdJg2RP4$rFxKZ$9Bq{}{0h9;
-XM1&0Eu^d9=1J?_JLm?$5{*}!pOh7Cs2?3&IOx91<jW!6`4tQukf%B{!Vi?uc_3}c#3oMPu)$@TtMG4
-312!t!9eSiq@qJYz7Go@LjkT)$haNWFS3h0iuYzTru7PV>}CQ!{q76`IYodWqUTSbpyRF6NJXkfdSDT
-}=vrVylPQf85c_iU{MHwG>Jo2-*0@uZLu1o0}i<{)4i7Ew^JhtgEFjcbi|Bg2}21N?{JFg1OdG>XPUg
-xsutMp3$+?PNWSe2U^RC=WuFm9W6Td?}j94>E(*X~=ESXhN+WJdXxY@L)Mb$!PKlV2rfFfZrPS`AJkr
-@yZ6U=1s%q5U#8s(J1g$><*Y$>bII8>L&mdPw#ADyYOnKeHBMLyTwHCun-yPPX^|kWgg;F_Evah;)6j
-D6kq&l$$;4y>sTcp3y+lt@WsB9MR?!?2se^sjn<L{PejbcGg^zZ0KPndo!Ka$nEprAkAe#^#iO|i;c^
-O?lcBZP&m&Y2ORa@*lHdq03vjkKt}YLon0TR;WMjkdKGS`$JMPhVv(JHDP!`3wolc;HTs=7iV1bgrHS
-)ng0G7y@V-N@^I~t_OQOe{wE}EyWHE07mxhFotWf>*tXk=rUZqjEfC|G-%!GLi)1_$saRwDTxv3R08O
-$^7#v5pEN(GJkb=_H0Hr=ve@G1|@Y@Q@}6*>(}8XQE!dlm~<XzH5RbfIiBh1i?{`M1pQg09t|1hiL%E
-u3VhJ;=w~tB5B9v14l9^vM~p;7^zI+#_d!Kqc!EGgd^8XzJP54*Emt@nZ1l=W9HMu<x$y?hk0sdCQ4^
-I&5IASWu&MihMA)PA`6Aj=vHRkSYNOaL@<ylk~2n*W@MI@b|8fWdg9F*#6J0^6atdB58AdoU#gu%fBJ
-w|&Tv}yFUwmNA)IjF7o(M?87%R((Ckd(WM?4bsC$y&jEljIR77*`wmFj}+DmoNCxJ&#yhjfg@RZm*MQ
-I`oPrx@5)FD<Wz>;<@>&UPx3v6c+NmhNCzQ+h2jvjBj6*U6_VF@uRi>(f_&+H8N0-w0W5!^ONs%TjN;
-S@eNQ4Efr!jg-=MBze2aQGdzJ~{tO(Wv>x9-YQd1Tt|gAvhEckD0=9y&6tPGiReJAF5lPd0;1Ir&aaa
-nDHEp5|n0IrA1V|@j_gvfKjDmRBg_KNWpP%o!p5mp*&AqNlY{JK)-ue#Qvcbw^w1@_m)|kAW(Nv5l<T
-#7T#zrJXRjIrxD0jbCP3oP#7E!#@6ffd<dHp9?83_xxa^8_E%>>okOSK04ONCf+LC&mbV;K1ZNas{Ii
-oq^FP3_pu-t<uFU2^%fdaNV)5WvoZVz`8KXT(Z$fC3=`ZRr!<;0|Pr!%PTad{G-K<ax9CwB77&|exLu
-p!Md5h4*FiMD&l6zz{=GL|oWZRb@DzJ^;25Y8wLLXBiA{5{qEn9Dz7^wik+U%Z{CrL}epX^M5C~E?vU
-1+<p%U~nOT@bXWEyLV~;xwo&i_M5HCm5C$lwqb|v#Z-bB0JR|IQ}SRA=Fsa)*i`5P}<Z<InVwiB{pu_
-aA{7~XyJq4Jge13EqfFXt<g(kaN}QGEULErJ%uMQ*2%kO+8DVqsd<=Fx9vX9B0=;61ex2IFU;CB$U-1
-4U7OZkN!1L=%?!Z0R1I!}xwFJ2nIMo=T9eg|7tt&>%@b@USyD76Xuzr>9rR#N4-^fD3&j&G>$+w&C#~
-&vgNMgZAbNQ%$crX3C~FD{h84O4#al>=hyIhy+9V@~oJ1}Kgd0pw#*!)IiU+GS#!KIt5z4~BDuL3>mg
-!`f1ORs1!juBsLJKpWnON%00&|qf9&h!~#v4Iipwi;uuyi^0pnGMsQ=~BSSa|rsf(&Hz@Y~vp(>rTzj
-?`oFeA$+VU?)lmQ21Zrf>_`<IR(<y2aEuZHW?=CrA4YNY<Y`mg*Krwl?Xf(PMBhHo&=o&RB^%=(^k>5
-ol#?FoM!=Cqsj!7gmX)4AwBAAkfH9i%gs&4;Lb$QPs#^W!J<i7+t~LK)Z)F!!D`gQO6wb3kL=FILor#
-h6W%OSiL{fntV`{=vSuUU^oElu<zy*HJ~D52o!ES{Vc}@_A_x+=Dm|IHZQcsi6ISbG8}{>H%hAtFo}h
-*8c=$~SDBen$J-MON=TXo^j#cdi<NW|}q7AT0OFOtS72Jf%hut|3?Ig`gfSX5|#WP`#tvsH!Q|T71Mm
-hM5Np<0mwDy8qbun$-Yu`Z-59Z2AcsqmZf>l+|bO*TiRmP1V7CL%-;4LmgEvd*P*ThK9VS-L#*q!49p
-n8pp0zYhP(?1F#LJ~9+GBxz5!~BpyKWcb#xT;(5!_H6h-ic(e2G2$Z&!#7@#}Hn;##k(EV1yV+ySmV%
-F00J~uZe`oq<-r-R85ExSO~_c6stK?GP{x<x3IDVXS)L$OSeD*wns0z(ng)sEj=Hv)=UuO$T%pz!lZ;
--T;UbG<^|TtvXura))3y+QWkdcyfN%FP@LX>%CP&{Jp!iQvLUPD24IMXWGj{9wD6#lyLmxPk}@)5@&L
-=b$`IuCS}}~y<cAaq!9iYdm=Rh$l~loq!?cEb&%srgbX)d~qDWqYqq!sqXwi@iuR+id3tjKa{Xp+5VN
-~|9u@l@Syox({T-W@`O5QRZTn`N6dUMQTrUgwmWHJy@bvX=e%o+Z)7KS6_%0<`Y5D(_WGG-YG%MntmS
-to~Kh32V%h)q$jdS?RP@^Zk;;Up)NnSFUlw@c8^YyjAsZRijdW=}h}qcgj6Or9joo&d#p`wI)a_2m?O
-non+@ocs?^O9KQH0000808trnOeO`F_&5Uq0MrHm03rYY0B~t=FJE?LZe(wAFJow7a%5$6FJ*OOYjSX
-MZ(?O~E^v93RNHRbI1qjJR}A782XM4;7Yl4RD6q0(r$&5(WTVKFKuaT=C`B41l|cRa9{HN4Hn7VlX)c
-Fn&J3sBzI>=Zcp6P<Jc<U>WI+A#EPAFZvF%oy78|CSm20VmqR8Y-(ot!CNTozz?3yyzg4Qu~q@|aLeB
-@VFX3LgLLH+^;;-~CgCbkSySyozR!b_tae(l!S-4B3iZtUKkSr(piTGczm->(w3!P?fiYU8OB-BR!K=
-f44QF+8A9DT<p|M=?9Lubl5IiH!DEt}1VA$KCz|3(-W_?=+WcZDmP!1csixp?U2$Mjz^jG)k_luyvzS
-VVTL9!oPvo1J$OYOlY#4OSgxI5T1n2|1cK$rO9PcH>OJGD5qiV*_Q68;nQ?UV|HLlPpsLZnt8QSGDGr
-MW~?2PaI|e~ZgW;@*bqq$L}+LLzf<>tSi;}j{mRzCLZ5=(@wNkEmyD&3@C|=-bK4}|f^<y^-LS{Z;Gz
-WQN^_EW2fKmx_y8aZeZv^him7s3RH_RE#L~CX;_Ga=pm6#^-@-T!r;C>d#6oF!(Z4;CEVoJm7*$!JeG
-TFOm<;0RD>B0VXgpfHH0+0?#dMG)G@Qj0(mae8qi8t}W127H`79X(L<#dz;zrC%BA+BK09hI+nX?yCx
-qay`Xs-i7mD5JNGTNN6#6*$66WP}PtB1<y^{!r|oCSR#S&%lqOK(<Ub})Uvbr&e-{&q3+S<t1wdI%Ew
-yFv>Rqz`2Q=%F&kcByZiZ$c*_a_>L&diQs|Kks`)%LJBdhX&Kf|F}fjtyW=8NkO^FHo`jgTWeORAN^|
-{(WFvd_G`}(yb1gH&U?tgc9DARJVvb)*+yzUrbRnX(s(9&&oKosr@3op`j9YKM$hr%J4c9hR6DGq6Fu
-k3U!v1wl1^rigK?|X%9L<!Z{9QPTqcfnfo*}=C@4)OmQI>>9IN7BZ;q?5emd`<y0nW3P6@Z?SU3(Uq+
-s{uLfxHTxqirfFGVVvl7B$^FW2Sxc)7)D^f2zM|Dtyw@9R^Mhn}Wdl>D(!%f7OjZgAJ#b9{3RLJ7UD#
-QJLbGaj4JH?5ygO9KQH0000808trnOw8L!)iXK(0EK%103ZMW0B~t=FJE?LZe(wAFJow7a%5$6FJ*OO
-ba!TQWpOTWd6k{rjwZ#mrqAmtQbMD#r2=RCWklNJEj1XtTN?w@G_pJ=sOc_D$xRo#x-nv|e%A9uBp%7
-$(hLVhSACh0krC_nUGIwTz4!k0f7^#2|MBT(+ow-I`uMXiKi)q4^z)DYWBV_zeedSI?fG|i+vkt>f4z
-V6;`R2?!>haP{_XashyQ*5`t^(W{rm5Kd~^Tu#k+^c?d9wHyEpH)mvPMpH`lFC-`u~uk30Wx_xHQk4?
-o;JZV%sX@BYP@as6j^@7}(A@x$H!HSGPvo44`n;|~vy{t^RkUpzd{zrTFEd-3k>)%MNLj`+`ydhy6uK
-l~hz`tIHKtB-!YrSlvy#J{}!gYC)d*V{9$eY-uodwciz_q$i~O+I>f^X~Efn;+vffA#j)zm30a+n-)M
-{%!l>{`FrU@4w&P-(rUEws#NP7eBxI?%~aP|5&Qm_uo9ec>I}F`}XnfZhQOi?Yp01V!zvde)w^F`Qpv
-?c=zi5?HoQ9;@$S*&8y!$JjVUsKfJpC_GkX|<C|CUI?Vdr-Q)LfuQmMRXJ2if-o1^PZhyRcbN3i;^Tm
-(fyuN=KH-CEn^6t&syY0o>?Fat$_Pc+q)F({j%QcbhlZP1I)&1RecOReg?7!bVzKy?Z`Ga&lZH;)l#a
-{pF#XII7yZHk*{yHZ8^Y%J+<MF!lgMYaM|9I0^+x;7d{Vvu%{t*Mli~ba1wS9B9{rL9o+aF)w#t3ok_
-UEV1|NZl?o^MY+`^)y{C(oWe`Rw^$eizrqO2?<Me{-b!?|%ppe6__}J-&GJ?&p|z4DhFqpMCW2amSMn
-pMLuE`Cpj*Cr_V$_VJfrZl8SqY<seO@#NX_ryqUw>62&M7hgU5;`1**{$Sg_yt})Wn8o~8i~P$He;Y%
-7{}3zr>h9f(``2&htN$go_iaq@^{ef>7k|HtZGL%o9}=~_2o?F^=l`!geEsm|ufA{G@{a}m-FE-&_U7
-T;?e^2-eaKEo-#_hcjPj5Dy$zv%`N8ehQe5=n&EH<f7JM1Ee{%nA4E@RLhlj`8?Zbz+@3{0&PvYJ^r?
-kJH%AU6Et1sg(|J8rn$DjS-|Iw(tcM}7D{MAR#|BOcb=Z|-9UWQn{_~!N9)U*&F#N*q?hwry<?*H1hp
-B^6nh9vyFJ%4fk(~CF%Jq%DN$&1IB{ugo81Me1h{`ltQ{p+~!e|-1u-4DNg@28)B`rz)>j~~4I>9-^O
-=KHwg@i+g*vr``1_Wt|-w(TF(oR1WL%I&!R)cR=rsil1Vsn_|ZwCB41G|n<AH|}+;Kb^ge;?_TXb@yW
-X!zJoW?iuU9{r(#3H@`~nuYdk}`+fdEqx39h7_a=#_q~Z5V>Z9}RjYe?KmPUW-|ru!y-f}K`G+u+um9
-EKUVMXk<o4f?HRkksdw3K2`}Q4L_Wh49zuUeGYo}!iJM`=i&u(tqm#?4y<%_2uJ^A$OKRo^N`Lm}Ve)
-at6=bwH3>`DA@zC&XfKl<*)BQh8A_Me|WYM|J}?e-ev$%mhQ{PmYl|JTRNzx3l8J=F2p*Uvxy`jclL|
-Ie>KfA)uupTz~gx(S<_ZqwNJ+tl{sHYVO~Q!VK>toFE#PtW)<GXFYmdr5nI(0g3B=i73mxHxw4Hjh0n
-PJFt>_Vk)>N-r&bE9JK28pFkw$FDsevDJDT5?<n8DQ-REVL6R@n-ZTM?Yu4H;Mw`OEp?BJk6PBiZQLX
-#7FWb&B?hVc5l^l0=p2LIZY3tRwKM(})4NUQ!L8e1#x?%c#%;}~ufnIir~~&JOA*(`-!nhru9Es~Iud
-vFc$J)E;1siqC&r9xT$k$Dxwzhz7AshGrk!(TJ<c`ox!=S@c<s$Mj>|@m)vldK=ku0l$GgXB<<T;8id
-#pIi^Br2c=5NCosTnXbKtQbH}NL@Ht#J)YCD?}_ixAWvUp<R){_@VF{fAnSDU>o&N$u1D>A7gK0RC>2
-G04W^X|ExF|ji?C4O|?J$CzKWslnU5es<iF6CgO;%}vNRx2J+=Lbs9l8RBrO)PQzmdoJL6`4B`jhF<l
-o%S=c+cA?KQk81m`CDc5c%NDsE;c?k@MM$M=8YDcmwNntKVuTEY>IWtd%R~zmaoVpS_sM65#jhC<`s`
-n(t7+F7dM{6i~cg>zTa$Tj2Z9g0>mUjr(&bd!a|RD#f+rId&XwPvpcg$yg-X}&!w~Or!p7MDQ!u`7{^
-U4FIySwnR|?$N-WBDD6Yuy$?WzshHI>L>|Sh0VOP<{7TcJ5VvTd+1@avD-1AKetw%`X3WdDJt+Cn;5{
-rTug&kugr92+7m4T$Nyog(@!ia|*@yac)8J}s~ge(@87Yk84>fd=jYLVD?W^yp_2q{m>W<Ggh3=-moS
-R%(MJH4gSXNk@0Zm)A{$QOE@nb;P4nNrACY>#&#%&{J!YKm68)WFWvabQzoyJOyK;I`kyyEAZRk8`YX
-h)TRWDul%gWyIj9TYKTt#1yekad9p!9#(kK&bsHk#O*wen|PftY#6+_0kuFkQqvr<(4(;Lv4f#7F<E8
-qL^)B!kaccjp<?mUIQtrS<eSXe#lUPTYv&uEA?cxg=nE>{7%5B(rnF!+;$Z{PO6ZWwI6~fQ*_Rv>f5)
-Y9Lyyf5`-6fU$Y+cc4`X5oBL+004s6QFUc}$x;*9tYc2KL)*!bbVac#XR+N!KZ#r?7EiTgXZ#v?)m5S
-PTQ2lf<!Kp2mMUB$W_NWSWm^EGgZ%{yX>@e(mvWwFMsv2576knMQHU@3ey@4h<-)&*y_hvUJ2BM`h#?
-`z<CgmuemE~?tu#+XFBQ~Y}HDvmiSk`m7ed0@*z*HaHk2|4u5+;bk5@*4QaH!(3q7>z)gYP@1>??5UJ
-UWIElr31~uyzefhW^-#S9$FG!DIRgGf%}LV7ypjV6ih<wQAK9M5>;NnS7fA+!+19T>MkCZsHz|ZpA#a
-qFO@D~SXpEDy<-VuqZ*IKE`(_7cpGz9xzW6sUD4B=yMC<mtD<r8u<4pmi*Tk`C=Cfxk+3=&OCB>(x8h
-~pna;lT!NV|?A<`_0&b?y0VrG3TsR+vvhMwONexrtN#iGOwN0_)UhhB^KWVd*!SaJ0LJBfL3Dr{(T!H
->p9?Q38HmLt3DjE?5wJYutux#Dic2PeWjupim|MexFS@+scS_#u2&sBT>YN5B$eq5?R0OhUXNLK4pj(
-Ne>CL?}qcZpXhe8xrr{=c0Cu6~kfY@Dy`k0v2plOj`v_I0~IU;m{0Im{@gAF<dz`me_b4^cfS#xy25&
-uE}3gks@FTp&r~&7#+F6L>`!_WSC><GKCC7PY{JOD;VIMv~H+Rj#Y?%Ejf-Cy$K;zE%0E2HLfZc1`8u
-bD7l^P@6b%d4ied=1MgY!=KF9=KS*of2w2#{kRXf;TNcX}Z-;_qlxb@O4H>t76hxi4v!QuC79b^DB^#
-dz)JnZnIuo!&5D<cbf)P?g06Q2xHuS*GMd*Q4vG~RSh)^#o$VrUoQmFqYAx>EXN5B%7xjjTJVK71?Vm
-*j4t3h^;-HQ9!Hymsq*pGyN3ab-A9TLT~k8U`!G%vI%R9dx&ps?!dD-I3gUwDCn2g=09g%~jze4ZgQg
-~^r?YgBbtzGFF-ROAR)67gtgGm4D!$c3G0I8L107}$9I%kW3Reh@L?AoqdO&IUFZ@8z0eiy~klq}Wca
-Jt0ZWq$J2JCO={o0*S$`#DhFLUL^)L&SB%L+FZCKL~;!r0ZUfFPi9ikYcxO1#Ez|LJc5vwEn}g>be_c
-FxWHI)k{A-B!QTv}*5(xgmV6Kd4d&S}4w!s?q^wa+W<BUj*v@!&gg(1?+LQweK>(MPo@?L;SSq>|yQO
-hJJ`5>z3PdBd8i)|Fg)GGs37mIj?&R5IaShjifFJc*iU?RD`e0KDDSFk|hNSoEZpRK9L`5nW!=VCLr;
-IYxVvN@?QO!FP!E4|_s?eM#wu(G}P%wmyaEK|kicxOrD;Af<XDJf~rw}AZaJ3UN<D|+m^yOspP82LGW
-^A7RfTbi{KjVq9M@R}uC2A3h*m$YV`ykPXIw?W?imUEx;MnM}6+~y9WT0b!31cgP2#G79wE;2q3zJYQ
-i%%+<2*8li_>}8-c3vrOm|1)tA&DVxt9V5NmcvNhj8U1v*s{h0pGWMMu)?wUXe}le!Heu_8KKznn@}N
-kJEj;vIy=jf&saF2h&Wh{3(I2~O~kbsL!7&>*Gci%kn<XtfThobUKJq3n(+ckKlc(Vda_$YrAH=MJ8)
-8m&Q$q0c?*o<<xHyq%R#b9I8}5*#1IMT<%3u#bKJz3m{;Vu<4^{fkgfp_5K%|QNnM+FvU$h?f?tx!_r
-W}e8892odJvu_V`lQ2T&9q@t4JTKoi+aZT8fa$n;3(wVBcy|zSPZ*;HiylPd9<o=^}^b=OIT0m5NWXK
-h5i|feBa|Z-RrahG_Lv8L%};yMq1F;_c`b+L(2^F-Rs!?q-p_5_**7Od}77Tso|HgqN;I!<1`w5i%u!
-SY?le3N-*6DGZ0%Jg2;4ld9H<UA=<B*4RAkacgX}A&KE-*4h*0W108U{K@OEu?Lp58SP=RF`IpeMqD$
-FfF+Ti_hRJ1haJ&6Obol$U?87`^$0(>vs?JgOe$H)9pgof5XgnkYv2f2LS|7*Vu+T#maK^w;NW3HkBI
-xnM`S|%kQ5eQMZ$~|fF<#hb}TtQB48=g_NufRa2ExKvhy$ne2{xG*${B&&N~{Wu<;4o$0ge@GmeNY48
-7h8SsX-cEq;XWP>)cnjF4oIF~qWB9YHQa8Dj3JN?0O-$AMUlC2o;O-GtKO3W$}6gkm;WM+}a8+?6kop
-rm}Drh74T(I#Q7i@6Sw|5&c+0Ab1OQBunr`Ditez$+oHjfFNs*iC}EOF{nAU3}L~<tETOR(yPbupAnf
-LZnVkW>jskhQ*D$+#?1--n-_RDI!7z?-hz*8q7jnLE%Bbf-4A-0m`b_ij$bA_%C)9>B}tsX#i%l8b9)
->A1zAHi3n@A*HVPhVDpHn$nJz>PQ5fC>)z02LQccOVqm5lLP$)5CrC%u(++I;0-M5m#OBp0_$Vkj%mK
-tT=ZOdEr(?2|Cqb@B;rtaZeX>v|dr7i)Tt+B@%!oFtc9M9IwQnR1NJ^yPx;9f;&=8~NVkqeAk@0z**$
-6<{G1eM~3%$ucy2gsdkHimO0MLVIV%z+nuv+Y!sS|)NZWa6h^XkCF`@bwj1T0-&6ybXecPby4$b^D`1
-eueGIc}$6?13p&BQhTdWqS$n{*~N>Ns2rVOGt8+#7hRx-&tA0)0D)24*e~9F#YYxNO%QIF<v@MArZze
-QV{`5C!`5e73z<>?8suTGax3lJ}?BB&7RC)bz$055fWS_@_`=(6`KP`#2E20)`a*xf!}ON=m(EV+F1o
-n+5GJ=(d3emeYUrm_TfQ<S=!pX5dljE+|9b>VPsj5bV3sHfUQnHn$aO}YGVa`^KQgO_8zwtqU<zLN(P
-RAC7Iu!6VoP@B>X`0V*xN&=xYnj%>c`ta3}$g#=^!s;w3XdNc;*$b-DjRz_O7ycYSWNsvxQ-^vjPO!x
-TDPL5(-e`-bOFM0Syx^25l#;3TeSGg7~B|1&-(cr6CWCLI`hB$|be_aOjdOc358@=C5#$@$~WOd3w?_
-L7Pb0ZTQtKh+H#FK}`P{9~iLu?BE*=nH8<C|xF6?bX04DS`#_OrE#!<1l3V4Wn}fqR9q;a#YZRm@$&F
-yGE!lZiE0mk`|<I=*{tTyAUMd%oSIh1}sPm?zVy+L=54}GBAc7>lm3BiE>81P#RT*5=c6nyRas%snjL
-MCjm<mY|=@B;gXAIX17`2IEK2;Dwqli9Dvmfm+TZYU>gYAM!II)s4C3JRKSOQLyQiTyMfDski=3beFw
-AiU##cBx`|=nsjQ8RRaFSPR&O#MFdisEtW+Vc7E{>mv#S>5y;%$uf4!4akqD4(*J2i!g!Y#`J|kd>K?
-n+ywpaKANjDH7bsHATHcTXu1Bpb;!qxT#I&Or}0}M4UTM<V1z*aaMc?}BE@k)S{u`=$=U_*hJNyy17I
-)P&NbwC`#p-Ng$&fe>)j)hInH#yBs@e0?I=}hyCq*7#P$Wof3#q6eR<9Lh^NKVXvkA-c9V+hTw#%_Sa
-T{{b)*DXUPVK}jKe0w%Qz@{K`)URrpcQ{#Art~#%1T0~?cspaNhN=~=CC*B^<)n?*%%F6GMafhU2#iR
-ByZ)L=R8GGvMQ8Iu%c>iVInDUoGFJ>dK4YlCgpxIfq?(f;)LAwojc&#yiq$pafzPWxl`u&>ZTKro?t3
-=<pqT?Ep{W}pL8P2$=-f~Xf@#`{m}eyERZKb?q9KMzZyuKS95^&$Mm?fCpmKl#IjJwmW*-(<xnp_haB
-mT?l=(pP`ZPh%4^wFnh_#M#umGY5&Al+lR+|%##WFUN&$Y%8jEC85ETteL_8j;lvCuISZy-3qOOvP7G
-M#ZJtam;>8yyUBi50j8rX-Xtj1lZriX>?_979!!?W=JXS|9F)Uo+yS!J%BhNHfyKew>%MB?A`10?J$)
-vIxk>=paE&nRSh^8kA7b|1z~1EDgV&iC;Q<89$bSBuYZWd3mAm*iPXBixk;Kbz<5dV9DZ3fufVe&6t@
-8l1dT@=^EI8<q+GnLUr&1Ei;q@<z(%`Qxb-vGy`;-D6W>djTW3b*I}a0=}f~NRI(-$6djs*BIy_|_yq
-K<;ERAO8`8UJ$*N`huIV79V8%s-?Q8RL1T5vWPG^h?YSb9BsoW&L%(GD6D5SSpjJ|=?8MpSN#l$y*V%
-1*Oz?6il<&wj{<1$dt38^FzYivbxWd%~$H)5xA7|~;=bgM(a_8K?>maxKXxj`w*YZxo2zJ?>qn4glU5
-}O<4ckyg=fVppG?{)dSu>WixuXtM4A@GNakjc+8#gI({3f5ANnRI~vW|F;ZIh)Nh4NfMSOO7)L3xc1B
-Mk-a7UZ<8~lr1V!6Fb!x7A50CPplxj+JU!{I3l4`y%-^2+BcP|X0fi_jAhL|fpjSe)ufY}kP1tYeIn(
-kjME)R-;grkuWbz+0ZTpv^xQ3mBfw8cWvnMEKoQGY_aGE&x^J^hH18a81XNgKw<X8%uUKQE-APXv20X
-3@)(yOr%yvV~6MC?bfNoY}C_^UTsYLRc+FY`=#)XoQ*n~`vlO&K>HXm-8GK+am1~Ek6mZZ-i`vRMS6(
--a#6dBTaS+_#Kf?JO%N@~Eh5f650I;TOldvr30=3Pt1AbQk8d=Otkf)7n)4opd?PdP^L$zi6?H9f6X3
-(02%IIO~1eZVVaSrzQ+p=CY^moMuUY1++3m8gK)WZ`{s`3+UsPL~(JX19FI&M-)}YIKNV6WW3^W%J|x
-^3pYHHhD!f-`oN!LluWCCJm%Ct)Y2D-wjxx>S+$Kg~Ga%Pnw3-wG@?rr5|nz;kM?Gbpn}7RCx+scEg-
->YGRpUY$iB}T!mQ_Ow0+!u4v?I#sn<cJdarCz`s$?tI0sb7cdtuuA(~#HkpMG5Qw3a152_L$7S6@Eki
-*hX#fN6#827W;9x5{8wJKi^d1ISWQ`=KnhNfG;3ZUZaAEnlmI8$3Y^;K?xw=VoSFD~^(b&rUK8Ifqqa
-OcO_`z!9c+Mp0V+AaYfJL4G5LL+&XLl>ezwphinLNAr7`78_#-a2O;fi4^{tH;Ko8~xh1S}o%5z|IU4
-`t4jo7}UK+43p`O9>IIAQDCT3dmM(mb0^@H!SnQ-6DKa^Cawm$Ga6+VZ^=5aU#ZytpslnU?9^rJ3B$F
-0Q4g!V*nIU_|kzX30c=_7P5KZd5Rf=+*%t}qY&3_QEt{ULDu7vZoLJUo+z<b3l|P-Nl2AOnRbKU(~uR
-<pH(`_zZ5Tv$QJ9?<%|{CC<rcaUv|m!wG@<uEQsnsNM8#1WH+)zmO942n(;NMUGo3%(uDPKu?9m?M@!
-CYU^pxzn`)pI*)bJ-=8nnF*>!Jx0P?AT>spADEJuMI^;x)Bq=E?eBHGl)i1we!O+h|MzFFuj;EQ!DqK
-8eyiue}EFEZ?K^EJ)ITXK9*5>oKf<OGD5W*a+7-woFZI54lQqLmlY*cn&>Hcg-mS9^NLQt6P?o17<6i
-rrRtEE+RKD#xi?DJ675TmjVh!8__pP$c+7UBh%-YkYvPprG++h<I6+oKxiOe0PLYyPqusponm7DpFBR
-E<i&%2ECk%tQc`-n9W@v1n-%N?vfl&Vs--Bj(Jbk-cCv=SnF^eM3B<TbbLiAhhur!iUSS{q0@HEdNDS
-!=uDaCEHqjjvp|f`#GY#HF~u3SK{lpIk_GdcafidwO@(=hWU+4IZU_&Vr5wD2FqEWYgT_#b3t-*QGLs
-b6Vx{03I0BYJ)RnQ0DI1j&K1hE#PG<*8?(h)=7uDh+3<M+Uq`MkC3=_AgCRNhynGiC3Guo4q)tBV27!
-2@1s{5V$6CzmB^nTJpus@bX2{ik{-RdOWX1TebAywUSb|)Hz5n^R2VHB7Ng{nlXEPH9ZPNWNBT_{4Ad
-f^q2ZsRViFDxbShuEm%szzjAK-8xi%OV<8vJVq5o;%%h#QI#W3DRwcDi?PF2U!djEu(nZ1fZxZ<5sgN
-krhPi6J$;0oTN&L$&S7@57KR?@KLgnWs>|^cqiFC7FY=DeZ{6CQKi*WF;CFx5Mksn;~MHUa0D!A5-Q|
-k5e1smHlc>14RFilZK`Ul2V@YyjgqF>B#YzXbY-THZZl-G0ynMj?j19e@dq&pl2T0qD%}P7c0@@3(p7
-VUrQLK0R_K+ELAp&ydMy)qCFMTQK_m^NpyGEZKg1h@u|Y@9v&ayZsG9Cq<I|=~zm_5bmbigbL1v|?sD
-uc@HVI6?w-IMDrerj<L~aLYY^V0#!H+ZHP)%jo3Q4y^E@%~wLY5FsYZlt*X1#c5NhkzUWSFrqMani=9
-$2gi;;w-q-4@WcLWq}z&D&(ict0jm2Q8HnrKKX0WJ~SF3g`glq&Ha}S6l(<HiHROiXojP>P^Fj#U3OG
-Rf#5Bh5lBM%|ynRah36bYEI;De%!8sL0HmMI&e3uc#@(R9h4$b(~8$dT*!+6p)+7&nRInPhoUJx#0Hk
-QLAtG!WfDcbL{L~@?q=caJ~=E#k)T+x9g-fI#CxVm*<W!eg!=Wo))>+)+)I)ME+gy%KL%k*#5$$PrsJ
-`2R%<fQ1hib-5=aif4^0%hEn5NUcH5-j0$5WFi7W8K6j?`;QUl~q+&dI4UUq1TXTsuh0AeBGjdBfqQj
-9&_UZ+h|&7vN-K**!H%9NL)Z02yP(%|t;Bjm%_Mn!!EEDh2vs0HaDStvR3Ocki{QS{ApXXL~3v)PQ?M
-`n>UpfYqV`*+p!8W@BHdk&8b=LN#j3^ct9(`Ac>Gzdhn7<S3vgeOEvr-R89bTHRNKx&X~3*5<4+yLnX
-8gN`rrfde1T>yLvx?U-zC8E*}^{xZC^=2>+%+c~S@S)~u*su#yjIh{JGwAN<f{dtn0sk%3^ODe<#6lx
-~%I=9MtelHS-yq#4$WG-n=%DI!8pfiV#3e<lKj3Vvme1jRhMNavoa{eq`w*+EF5MvAb{Qc>I}5MRiXB
-|gYQQokngRf}OV3n#ts9!qT1a*&h%i=?-Xz^7p?KYkF~A^gY{E$tk^tJe04IvrMS>2wc345$Sb)b1$!
-Dk3G6&B1yi@DQvU8aX(oF6t?kAUB07|z=IF!5I3xktS`vTBQ*Ju@38l>9<2Pb7+F#l?b42D1g6R=aIf
-?29<FlsY!Uo)|?FrKBw51x3efhh?QGNauXOP`957zTx`o!oj!`{a2dYeR^LeKURm-rBSTX?f`e>9!h)
-Ws|*K%t5?F=87RJ>%qggq&MR^yL6yIO_bDGa7i!M=FufYc@dkB2<xO!ZeeDbQJ75&jiAoi3IYgCLCBI
-(@kuz7rSC7^W`lG~DT~O~ZUj9lzz_zU0!b-$XMsF4sYJNIW`S4pDoBVMICh`CY(=&t)cg}*L~|*KcB?
-f)qMjr;>!*kTDvjoLxKRBN3dc(i<MkDIH%PbHjI$@LfqKoHC?g!=>3}QrD<wwXx|Ciu4=_?n-k9t$!P
-O-dl5TazKnPvPpN@?L!jsVEis$ZtyRhS^bdby^2T@2|9xkqumzEKlq+8Nx0jzV@uz>+d8d#Z)x?>S)0
-J|=Su%;Eru66Q#&?Z~f+O@_JuvBSBRDKfPw?iE1z_(r2%xQQC1PQQ{uqlN?W2IRuv=qJ0*dJiYwy@0x
-={6sBz{vg}ic5Na0R~?-i|XMKg*EY>r%0bjGLkl{&Q%i4QfWxHanpew0IwZpL&PfG0Fu9<G&)mjvl1O
-nfnoeL6;bj~Cgt>&97DQIG`eMQ)J*GDp;szbs|qL+<d*QjWCVvvhf;Mgrl<*#ojm8N!C0CH={A#MCcX
-DA0LBzg69mW{b|YEzHAf|I&l9{O^q~7CiJM7GE{nI>Al(*Hs(wszu>m!LmxMZi-3?f%8yK4>s~5%m3G
--|@TSd@GTnYl|HUWjj&fqBl^(T7`JZtu{NRgh|2#(8)4VCVS0fL8<>N0#U@V`O2?T7V%>a>wGj3otyc
-oo;(P6l<5m`J=8n__PeDcVMpOeH)l>5>Xaw`qvsDwP<^WG-%NPBw~DeOYa=r_*Gy+Qq>vNK}h)<F2GE
-sep7_(<}r*U*U$s^6`+#oVk@!9&i%G)ne(J_1vT~#!GXFBE&0SYYgc&A!K#-j@gJ{O2kOSZi)TqhmPw
-MX2D|0A(`pEN+;<btzS&jCh3-3Z96RWm=;*K#F~&GWJ&`G_gyHfl<q75+CcjY{Bn9U*-JPRmmEX7O~p
-<QRzZpol1j4yYlm)Wdwn1Ax%oHt*I=ocompUIK8q33Al(*{fkGW68x-a_F;W1kg&2owd=1kyQNAgX1y
-5pG`fhWw#ICzod0vBbTfmRIge=?Z=B-#}5Wo%lld{uR=J3tL75y;dJ6Tz(!7_HvRcmUHZnF)J@M=2Tm
-JZdVi^0xhj}Bf`wNp;-)(s&=7D=z<PhA4GO(Eryie|t<n6oy;mKFJS!~oPRAOa^?VL6-Q5;9V=D5sq^
-WRbSF3fb=q=53H}D_tnv&RT1kP0oBZO+tN#f`>Na^Q7bGR-xGd6qAV9gD9=_S_-;^j%jT5MOd<8PlYd
-l5h2VWX-PC96&znVDfF4g0}ynP@s6=OSL0uUblYt(INdyX=h+u<V4{&KsKvSiKUmc~?A{|BIb~~S5o<
-i}O41vo+YEuAWW6-O9;tOD_UjX6ogJ2hf-+4t@9;wp`M;_u_J=yi)>n0`LAovG!@D-k>O6?3xmK0LEb
-*S1RLj3O1i2K%Nf~Y2><=FPYvFDU(rq<vmg{pWt~T>1b22>uwk4yHAytu2d7r1o4yp+Hl7{WVtF+l9-
-KtTl^l6b(7Q&o1hLPw>mda`JEHRPXz(@#qjQQ~^;o0heY>;mIVG)a+vAVW6Bidf_Cp-uY<07j{dbi+4
-)5$gU1pz1isH;7{LAvd>FgJxv1K!0Ui8hlIGUz}A^VO`YYo0N{2(Hz-UAt|lf4P51w~5d?lL;1cS2VB
-NzSuQFHXK+NvTz}6)ct_G*FIw8c(!h?l2C(mTdSo+J<B0;g?+bTMtW-^q}e5p-|_@P$o=G@oig2_2sM
-{%DTt(7BJIvhN|zjXIvxH7NGP&DU2WG#u%Qzo0%oBOdg>8v&{^&IP13E*f65qTHZ2jq04*kKRat1yLk
-6biaVu2;2|!~SOH(u=@&%eUNVkQa<9--l3s|#dhw<oSpaT&}1Fs}ztOrGtY+$sLyxJa{jZgcv#*l6)P
-2`~|#+ed4cesLuVq2%0oew!IQj7>MZM&doQVfykmCAUpelez7w@ZkQwIp$bLUwj}ZOoEYK7Zvc@D{s?
-Rg?Hmd5&-fMp-GMcbDc#y0x$A&<G95c`%!X*e2vU>k}AYi=>CKIdNJt9TOh2(X~3j(mY7FRm`AUbq5o
-&Um6#jIFO)_zEt;3Ru)-ghIo;sQVzFfI5RI<QUU1}GCk;llqu~BF%_a^!JLlwTD7M@9d^;vZk!Jl>C^
-~N+T3m2T`CRfwon7gIP*+dCe1D1@g>c>kO}}w3Q2WtC>E1n(`-l)FExkg*T9`T??43%!hq*@qY*{Wgo
-)VxFv(A{lX<Kl9Us6OFO*dZ;B5WJQb4+`5+G$39K`(c%hWd=ywXQK&R)rGXe{OOaEgS`C?dqKa$aT=(
-rwqD9CCfs2tqk<YAA>CM5Ibj36C|w*UffPFo6QEHw~HUGXGcCW`lHFq{ZQ1v%ITmgis+Hob5uDE(&+L
-LVw#d#YrMAaRFwc*aCB2cm<@}Omvp%p{&s2x`2x_o+v394l^!QhA``Hzap-o&TPUWr}^=!{kPM$W+VX
-kq+ly@60<}b;n3A;7D{F*dCDGu-2}l%#;C<^eVuz>h91&wA|Q`B`2(nSJ^~4t8g7UrnnA<1;Uzh4(h{
-Khc83#2_I??9NVggAF709)VuoU0zzVcgcRJC#P1jKJdRGx;R`NtD4Y}F}>|QR6{(y8_SeSx)=!DkE0^
-TfaAui-;8{k_tM;(TDM0>FQ5=*{GLdH7PtEJ$8bX%)M8$D__>{E`-j0wB=mry#GP_i0rOC)Zn?7C$Mn
-eOT`^v7;VNLxc14YRUSPD^0#c_x)oBT$g;;Wl$USWg>?gv=~;bT8>^;0RbUab6d0Jglu?fQ?#!ZaRoW
-C*3Y~<qCupVK^+Fj8+I)MWcK!dwfW`HFw?T0YZ#P`eTOVsTK49lq@r;nS>dN`7p}51UC9$xJNZD8pN^
-7VVOO?)`4l!U}dV?L+S)~8WIiG8dobhHwk~Bh+Pq6<6$M#)pK(|y3J4wvghi^lEb$a$iW?6aEED8=r1
-k;q*MAlDa8W5;!k2G1bMY>9FT4ksd=Fg6?=pSBcBC6sgk;-XHxkslesSf$AJ?X;KLq7qMOxFvX%nUZO
-M}CQ4kV@JehODjb_R1gRZvM+BM}A2|2+wIYg&-^HzJE_G@5DLZ<t(0|o_yu+uqJC37Z5DmMPH<?v@V>
--=`L0IpPtnzKQ%SYR1z-~;NP2aTwz1kYo}@#wI1Tnx2mvvfJMDi{cBo#vTME^0Fo`D$Q2Al()!m>Xs)
-c_fZ}J2<BaNTd*hBojNh3>lO%OB*um61mjurMWWKj426a^@y~yn>1*Ih-<naj=F_)YxehPQ!LaKEdhE
->R%`3`Sn=@z={8#$HJd@)%aBir3p{Pd^282#<4LJ<jU1hQt4zu~PusO1$RiuD5U1JoC5@uZq(K4`$^=
-F6m<I@vNgdKCFw`ux{2kOMcdg4}K^~B9^Neu~8x5Y73iCG=q-w-42{a8Mg4<~*XX+wn!**Ts<He0VAl
-()ZG&wDEpS~TWN+B6aO5IvS@n3*a%#QL+vd!AA7TJ#a!Sk{ekZ!AFSc1YNOU0&=!zM1>w{6;|tAL#ph
-4NSx_$sG$aw-+Y<4V?XDF>w6-X#m1HicN0@vt#+GSe}X!3e`n;oXy(U_skXKI6{Qa)mp!))>-lvDjC2
-jmUzrBN$2sz{-}7Y{eI7^VBU2P9D>jSo{O*<^YYcV1=W24vP`n3?<bF0%8KDELX=@k<+6e25toSOI@|
-VrSE23PJ6K+4@kF3a7H?ztxBG#K+(6t0WM;_hfJ^2*Y;!}%&tVX(_*SSh|gK|yaUp0g+5$t-s`5v9^l
-d4E$mORc)(i#Mh*$saK^x8Gpx`G>lof6@3=Ov7_cBl!oL(rdpD%8EK9Pe%uGLs%pOWPS@|UF&Et}Uz5
-U=C_(bzG+X9#D!a2JpDC$k5z<u*Qft^$VZJN-rCoceNc8$<wD<Iu=2^nl}hiQ?T{YvJ|s2cEok{I1Rb
-44i2Gj-%c8h{zO+t+ycJV>{jC+tXcIPJu$W@6Z{>hd598g+X*sp7#W=vJ){8z{un^(8BTJRse6FxV=l
-Ewjmk0$gK^OBqsp@cbmty&IS4vkXX0Zn`-U+5alW9(4vRERj5Z59|^&MLx6P!|=Eh|HYO8JI!-8a7ff
-vd!LQJ=)k#RH%PZhow3D3d;sEE6~E3hfk5FWjJJEdne#ODqISkR&IV&!kbhZY&tVZRu&Ylrm|xSJ35l
-|y3r<@zVFNq?#|9ZbopKTMAa+fz!$%HCw*}Ze3(0z901-;|EP}~h!q`g0tMi9$RWJdLl#y!pUcJxSJV
->{cy)hr+X#hT?6*LI+t^`nq1h^~{pgdhDN`3;%E)+F7;J&mknD>BmyR~`ZAws6AXzk})==s4*CBEBwu
-G6>n=Fx6AxoS;ZR@GwY9guD}d|vWcJCVwHj?3vIj2skFq~eqo>uZy{32Ah@tH@gP1^rrM4~|2QwP{2+
-H5=!h1{XAoof-^3AaAx*B0tn-9Lc@*WoPARd1*+uoY2P}d8irThoo#7=-{%$>MbweF%zcD*`7P=Y4d<
-P_1|c7*$PRwI!QVjH*%9=O^n<xcclUml-=VI8(7S(PXmgl6FjRvvGQZBF{Il*>_3(1YWc?l16ezL1PO
-f^mY<2ucZ&xYCQc?QHXY8hF^8isp9kqS$&nDxw=7d86sA-uOPDT_8=~)SKnnPlc0q&P)6$#|pI+j2$Y
-H_$=zJut$nUUUKt{gM4RKZ{0IT@7I+GKRG4V7!-3?kY)+tj5q}x8k;|}?@CJlrSQ!422cDIP<?7W64w
-!!KuMcbEsj_D9vb4B!$ZV77X$zqR1qLBa(q9N7jw(QDEFXG(9yxG@Qn=$!^@8fMt+#ucdxii(HJY*|q
-U1>lg5fUTop61ZxC?VU!-g#m-e2!-@us?lV?jO=^MWAY)XH$9J1MZf<>a?28LfdJ4THTl6AqEOuCt#z
-bPzuXqK{p4a+eC7cU?JsZZxHc9x6}(nmBe&(#;z9VcJ{S-wlNW{0~t)ZTqnmIkZ!Ya3D`uRO-sChOn2
-DCeaM{EbOEzir>Fh8kkMDeE~>$_J>V*rt$=i!?TnL8HRd62o+?QQKF@+9)X%P#oiZK+iA|f+c3>g|Iw
-aeE4Gf3HaxLZbgp*62Pe7!dLF+RZS(O#x(GyLfAJ+5fo*{|SHxfeUdd0_(ZZ~<75;{a~?R5ZZO$M*<t
-~$lo+UDG`PBOh_)rvSiOW|VO)@f-6q}vTG?Gy?+_;vRn9HNPAjy(H?3|{TskX;C>Z+j|WKrZrx4#^Zt
-DuyK?LYnN6q`T3#rUQ-x)*wl08a^BFuK0SI*TGw$$Wra)hFmExq}#&wB-J0xGVM0ccnImK?PN?1BV|b
-0JyTMqiPCmajIaT99ba`wx}{cDvwb4!ro?xTS8I;cn3%O{H;VOW9?K%m?B8(dT}8SE?!sfNZ1tUxepb
-vw&8lbFvRn3vfwp(4knoht5Xb<!l`W}9tQTGZ>6Wv-`H;K7dTn+;J?Uh3-7!oa_y;~%r|sm>JdX$?!=
-cPvWTUiol*i#ox6OBwbxdVY@@LUMX$d8SRRaMJAK}eBCB_~^G4gEa;RkCePB|=!CWSF*X+;i9u@Aa<=
-z|BF5(;viMM2NO6mBHZEgo|-IVAZS7=)!s?U;+job2=yk?;%|-klJ-h)9Y}4o{mVl3{-`1fV3~I@TF_
-2c+BW)CK#pvsz&7ZD%;vQ*Q(P#I|O;U~LeBvR$%uA$!-sN?N-Hrc20*@UEoKR$7bB1_Hdr;RlX{KzJ-
-S<pL6!?n&1kkvcr1Y!N~aNVip`Yc@W6_K+nID8U}B1X5VItJ*I_t52EgM;<RJU?_*(Pgh(4>9$)WvCf
-APs@BQ+bgRg`JZagl)k7wcO+7N;E+uI^97cdURyx)p-DdkghmE?vyFVlhq5|1ZhqD7RGq|ufQ4CheAO
-64|FK5~%-HH%5T>&X3QF#Z|tMe=Z#Q^_A;gm*be)VF39m`DYesjsn8rXy5@S~F`PQiP+He;2!vgYibf
-rm%6NGb$LFg?rx++S7YNNeDOBO5*C!G>{S5D)zF_=lp9>D%q(EY4WB459%3;=v{EfMuG?2z5xe8L3Fr
-rIMuy&;H=-u?&J&ce$Xfv7J<&4hUk^JxEVpKY&`<E$T0fzC*grhiB!Ogh9dgR1^VYPtQEn=HdY{bS>b
-*IH{z}ld>g*!`a&9ajn3+L%QvjfNjtodJ8TCim&rfka@HL%(;1#A?r3n4^+iwb1HMQQFej<UDE9^))7
--8p=aMWiB3WlL{gnY8>&5B)Eu%LCkq#x;@oWwHqIHV=cYrt?H)s5QI8h0gj7@yBF=`PyYZ7ziy#gXP3
-0CEXpuW~YW9%BbH4^AV37m_q+3KONTa*G;<I*FTw_!cWSzo#I?Q$SsP@he$JB~m1Jl-==lO*mFyj>-n
-2s}@dkKAR_rQqCr<lmBkT?NxQQm^iw2LRyA>Ag(fi=%l0}~&D2{{Oc$%ElxVHfc54pg~O0?CA&Ww%q0
-b_h>+xTq!_(rxt&<4K#Yl8D%{(}T!yZ62A_eGYgj_55Ty1@(p|(C!hIyTZIqj_HtYi${3lyov`JfS2~
-ut{NJDNQo-t_<kw@$$z2n6r!z&oO5MP{&fvZz+y8`Gp57F<HEcC(X$8$IWx4@${OcBABM3ay+nPI$M)
-FZd@jmVhjd##;MXHqtS~_x%r-p&rFC$kN|#Y3M9SI5V<bg-6tGimb3TMFb!i@?+q&D^=&`(J6rT4h`X
-DLWqai&Vqe<8BJRr4%@Q#J{R7Vqux<J#O?Gl>D1bRfP=kxR0Gp#@+i%UsB41+4WP##=>QH2zch1~pRi
-+#DKF6p+bN1jj6Jc=GJgr|Yd56CBxV~D&PU{S(BR}z6V^=+<<7heO@)_l(U+4AC}*>ZTn)Svq4q0ma2
-eQRBWm87G%WttwlXH=x6d5~_aXq$(0%L>b;bHhA9sKIilr!Rr4D!86WI;GsBzBL#`T#LBD8OAYV;$Dw
-yu@TZT1Qmo#t72V0coh<NS`GW8i+1nu12v5B@RxxPH_zQ-J(@H21UEL1T^+JaB=O8+>8#jme~3kK<Q_
-qpRrnRgc1gFMtL_0W;H@3TQnyVC5U1MyXqy3fNo~`ns6Olp-miP8>TZj~lH+1YNV1~`X^{hwuOz=)fP
-}t!F2(NI3?d%{F&=W#Jw&v5{+2>dF1)&gIQ%UX1V`ba4J1cd=B}7B@K^^P%T|+!k1Lse86G4&`)1*%?
-~=KQ=T=7{=R-xRU_+iv_gU~}xWjnCkqn$Y5dneVSK~Q}*2DS&k<jTm{^=T+fF+4nz#Yh*?sI7DNDQYb
-Cf@*$msK^twxYTC?8V`jh8Z4nbq&lpEF@<Mo^?MBW5M&AU!O2fWx^SIK%G6M)bl(CGwCWxjinNubAW4
-L5Ed|@PQg8Sz6l^>KK0GwzxY92u(WGXu;iiPGzXNf?bM^OgJl)GIfx>hDZTslHGqDW*~A4VC2PmVFxW
-K3z7vqOsyA1nJ*RY@RJ%L+8W_@TCdSNjvASD<{ZSFcCjB-T!kK0#g$x_p3N5ut0;b0ADRt)}ZqOGVw!
-+qNzx;z*q|_|B@+zE-?!i$u%X^TX=QMkA1ElH%@jY`YK&R;1FMb7WykRRmj>Cvi^*2;t-zCnQvI62{z
-o3AFj;i1PpbHi5la1>E9Az;==#32bKhHQqn<ZL#xTq%)3f>)x8?I>{iAPx^DG>h6mBG1d_g5zt4RAMQ
-_d8rLVs?j}qQRbx>GzmWbe12c8)~+Wqq!bVV|$4j1|>J`=~@a%x0I^86<w0=Tvaf?l&2}KKt#C3p}%#
-bz?qw20*1}@SdhMw7ss2Hmzy*Lgi|rn+Utz5y*f!FZNL1(gDdA_9h2IbUGxT9#;hxWgt&h*Ktu;%=m5
-to6pf0<o?(QFZe*Q)>$e}lbjNS_EdeBunb5S@@6+owV>m3`vhqAI-Sb!rk3ff;4^zRIECHNnty^`n(+
-_UP5Q`Hn-;ZnH2v`Q$ZjoU_HdF1LwS3(~1Z-O+JDlgIhs+F;uu|sNw0Iq9-|5#ZEL#ETHk-tGT!QBwW
-vPd8*_a0=OTe}ma!6{zV&Px`-w54VSt?nlueUT0(rvbn(Hb<tNfnqzwzG}xG<A&Kqd=tZ0##JmFo~^6
-3@5sLuqX?HgeewFVcw0C^W+A<`K5a3jI3cB$U>F|Vb0h+$aC5X2iD>dBAE`Y?qk?N4D2Mll?Ak~pj%G
-_1e!14tuBh}Qx=NC2N>B9L!~r1_I%B_uzA9rpeb<P$BYq)G2uB^sF1^>Hq*R>a45EH5UV5;-66m^Pe#
-24wj{KB{vgp=a}bx@N8s~3-K$EF1)~?q0Z5g|4<0o<+zQKF^8)m!?Z%8f=L6?aJpIzqi$7TR!{nRic#
-5lV3`VHBTgKs@iSGGGS7r+7wn}&RfEWw6Ku6ir4{Yf^bf%33^rRI`DTThV+fXM+sKv6K^D>)|Zi|Pyp
-6bRxctjP45=5bK-s(3hnHr0>yWLn9Nl9ixBHOFhMBRd=KmyF~J)0A9-vk-8lLrs0W+=$Etaib74Xx*g
->TawwtfNPPsi~RTHzTjuh6zuO!C+L!6gBp-zA@W45X<T%NYp$9%%03^;L7Gz<r7YHxR<fpIG8L~00@f
-T3_q}&QkaFk^jkqHtL;HlLNC7z>^Ur2sOD=!^z;~89tPrF;VO?^J4e2OwIAYUl=7++vLO}7CWyt`?4E
-QB^gKMMT5|F1%LH$w$WbNj4-aM+<vdvcrB^L!F0?;vHoXSs;5Y!mL83g&jE5p@KC7p4J*O~(9%zMU)k
-$#I%9>x!;ujAsTLI~|W_bpN^`~uCY<|-I__D0xVM`{8c>29|tOv&k*qQH1`!c<Lv2KuVlc2}^_5s(!W
-MY1~iv#1!z)*LWSDbmi1qqX?LM#hsJ&)BdO<og$w>vW@M(5MP+8x~L#5$kiRmh)en?GzTH05O7x?*jV
-eGN>&VkjwEXWm<7Wm(wwTx0i0`I-lAVJ1#TXB)L?*)O}ID!J%9#EE=87+nT(dJMcfTRu@2&oy?&Y^|F
--cnekEL)blsDf=yeesHZZZOz1F6{w?5NhRX5as%``JW1W7<h$lwu^zmI2d^YA#(wDYR&s-b4(rxgUcv
-|beQm-Qco3-(1nG76WRb+X>yR8oRyqaA)4f!{m*(MALZ!hRK?MhNqCwfe63ZswMvj)HmcUY+=1;yER%
-ebBV^XE%gcSaj*1&w15UDxGSVJ5Ehp@#peCDvoAodODFg!KX!)ZK49>Pqi^Q?3;*v=)_jA?5=rokaGY
-@Va*;iN=T*d#K};VGSY-s%rWXKRMvUR3!Tk<h{`kkp%PNYgO}zyqaux`tng=a)t?+2k=fx<%*d;pl$g
-kHQav{(3D10ShFtEzdy2X%iSFkM_s9oj#Ewhs-z6AUCjKS2(+H%ylEMNefD66>olhbMt=yP)h>@6aWA
-K2mnzTaZI2=jTkrs007el001HY003}la4%nWWo~3|axY_OVRB?;bT4IfV{~_La&KZ~axQRrl~i4C;z$
-sD=U24C3z3K~?CGT2i&k3WKo%We!bVY^&|tS=wBs3TW}L|T>#xjbHVe`%Pte^}Q(fJ3yM6gX{lU{{O5
-;&9n8pL@k7v=pbfvc4YE!ahnpwG#S}2N4#v~mT=7&^D1jcSCMJ#9?OGjFIiONTQWo1gXWODKsI8Z-j?
-^01RLPb$&nF=qBcKB&aV|PD5Omk!R@zk>LoYA`8G5-3LunkvP<EgEuPIODX&!7JW#l`Y~LZxWY)H+(Q
-WBbb4zLUskZ{@o3#&+E8KZp=bg#Au)sWw&?bVpF=$s3y2erxohe^{gB+6r4YF6EY)oXPzgggsDgDoTY
-W%b9e0dKlqJ=<E+;fiFxZ^STLDIzu~+YR|TCM-QK-OB%C-QhH*|7TwINwUQ~oW0|scOu|vw#N77m)UX
-i}AB51*fPUxh1F=NDdHa>ELxesBz2j>K#x5C49pM}Om}c1kZy~xSg=yF$GPr2LxzmiK-qCL1J-&btjl
-N-xXw6hP&MVag18V7clzf{l6AGs<^c*f0;WT-9KrNg`7W3OP$)Z#e#OTTj?P~}J!DO(Az5x;TN8?fQ(
-x@MflIb9hX*gR@Nb_)!jH2Z@T+n>En9t%tKom0{EpE)bWb(=49F&EDlNoy<mD{)eg7G>CR2gl>D`U(l
-OKcPg{6)(8w`Qn}-t77X<ZS2z$(*$DU3#+;yMyifWx8NF&$o-EPlGP~)kBfc-xWp>13r{FsE5iJ+ois
-7zA2rAz}|oA_3rO_f8O_qmN6pNJ~Ws<{?8-QZnbi23JQvKx)s*3FRfXlf6TA>6HO}RWxw_uAse%w@3I
-FBu8Y(g=do&qNVih+5f<$-ag&+sGe-z$PJ7qv^Z_tfM#=NzyF`d{R6CralRW2&pQ=~!WHp&R4#urks)
-Td<=w4vwvTj@p91E;QPOFu~%~`EFj#Yk$Hy>Bw`gGn=b!k@-oB+4yS|ko8tRU{og|<6COZ|X-@5D+p9
-shv!U#`3H@o|gG=n>pSzhZO{@9R^Ohmo$dDEMQemVIS4-Qcae<oV_rg%WyGiOp4bBIKLUH?98wP)h>@
-6aWAK2mnzTaZDLS($`}r008Sy001EX003}la4%nWWo~3|axY_OVRB?;bT4OOGBYtUW^!e5E^v93oNaG
-qRd%hv`&TRpT?r&Z@Ab0ZZYz-rC_1IkK&lEw+%L#fnJz1)Ol;Gw%CEoUc~%i3HIWiN6t>SfYp<6%#~g
-Faxy}b4{QiIC)2DxW_Eq`v*=J9`dhxV;`sLT3{d4(m-uuDD2j%6P>+<#e&0lWbUfq_@?p|M)n}_n}yZ
-^Yky}iosKmGK}+nZNck9YUw)$Pso+sE=M@A>57*N;AXd-HgcPkw&=*X!H6pRe!B-H+w*cgD>7zq)>Wc
-y;yj^?w=m=I-r7e!c(s?%rQAaQWu$e*XQ{{q@!3_3QG(J4gKcM_t`B*3a+qs5g)0!_Ph{^*oOZ@w;#T
-q&&I3Ezf!HLwSDvaDD&R>(_H7pWVHEyubP3mn`$chmZbm{!+@HukQb?d~<XAm;0Na%Eu)$d@PT5<(qe
-pZ|>f{Uw^jh_U4ECtNVBC+K>0w*X7~v$H%{AVt*{}?tUq+uHKgW>(@6AbNFn;W4U_!`VV*a`TS3JuWx
->Q$De+A`#Q^E){ocsKRx`qhkyF&+w$f0LuOk3bp7`FKCAiWmmh9#Ugg7I-n_bg`*2;Z9?H-B?cvRDJM
-{$<dGUTC<%_!v@9zGwT;Jq%p8ePB`-l9cv`^}<PkTS&Wyx88c=gEqbDBT%!H+WOcjY#xasTTlKl$A)_
--&=H%gtMdeUrV<4;e5E{aehc{BT`<dAR=Zm)pyXkoT5<efIL7zW(-QdGghF<zJsXfBxjFm*4#{@6Ar<
-)tuiP>E@@OV}h?sR&{^%_VHaNo&o;+^!aE1lutbQ^x2osUVg{yzj*fYtEVqslrO%1UY?Y1o;-i~?6Ys
-beDb_}^X>C*zJBralTuz>U;nzrZ07H6@_%mej~Vi(yX@ra>&L5`+lRUI?{d5knc(f~^5*KV*E!}_*Eg
-}KaupZ(`Q88O3~%q={>Am?Bfo9vAIr^;<?Y?$W%=9vO>8ID_jjk8QGPq$%NYHuPcF+^^QNn}|8|=rc#
-)5Par0w_{^IuT?*6iTdiU_iTmSqdpIut5%g41ZwUlpP<S+l-f92^{pZ^a*<%5e1{HIS_uPxj5@Q7dh`
-!9ix+jpG%>+<T&)&12gZ0YgphuiDvf%zK?%;Nt2>-*QgzE&>t>ARoGoB!DMtuyeNQOn04|6^G`*-w7*
-hrCdiHr~H*w)Zd8o)_9Oj$dCm-oLPHc_Bm27wRX=^6LxD={$RV4Rri!&3MXlwz&L*kE?zC!-w_b_dkA
-=zxFwa=W*^#_wPUWHt%8Te<&aJeO&`6`RyZztLr{}>D|wP#NU1D)eksATmKJMHRpEsHlF(Mh(G=G%d0
-o#O>j*NiK9LL{Q1SjJb~|De)r9@&z^kw{pZhKynO!b({Eos`}(WzpFhd}eE9j>8=rjo<<sw9Jo|r7S<
-b#K|M^PX>-qODzyAJ<=THCT`>&sW{`7g?@!>_?_Ig?NabDIj`ep0exa?=kKgY7?*S_#;y{!9^zl|+#+
-0OjBR{vRJr+d5XHGgYuSuZa#LI!LZp{?t2S;n5B_q@BD`EajW%iqRwIhJj?tY<#b&TY#-W54X{v1ELH
-Ix|W?M$3RX`pa@`=jCXbQaN|tvmcl1*8E(abgo<GpC^r&39gg5t|yZ_j?0>9U$&!VC1W`+FG?G{kyrM
--Qja~0TJq4k?}LwIWk>CoCDXaAc@JY{u1iL(Yvwf$p4mpm-!hr(Vc)W{nw1?#R@;s((_Aycnt8R}vL0
-94GEA={d$BQoJ=RQV&x8Axg&k{NWttb+uWZX`2b<9{!jc*8J^Q@m!z~Nvg(LII&h?W;^sK4$tf?<&KD
-Ka1J<rS<aww&)?Xqr19<}zoaqn5#y5^^{GT{u}&X#9pWAiz-hE2-aGt8EK%^5A3@XDd*nHO2?nm1<D(
-J&w^X5>xGVda#!%P|<gSJs`aYAmmm>{ri^Sx!4Mxz6V9noXwN8~==axbnQrCR^NUwhx<#4Gb(MvssQj
-ZY<f0J%^W*Vboa2$~v=={qmwOnQRQd@^~i4+z)I56R+dU^48d4oFgOD7+&92cK`#zO6MU|53gnq*9=o
-SM;*w?=kk%dvja;Okn_&+8upt<U5*?i2h6!;8)5>D&vrH`Zk4^qYz~IebTf2aax#M{<#;v>FHh!J+k3
-~%o2!P`Fl@FayOhu7NipmkN=|{(>v?=-zqXUj*zo|ob<4K&Ge7mM#Tt5Eh(~1+2itIF`(m4UTx~c-&4
-7*b$u42UCrjC!Toy3S>_x$d2T$^VcYezG^S+f~GS-SeEHR+6IYUe`kdQg-Z1!>TtNxAOZXC)U>xe~SN
-_cwX1ecbn<E%k|?7)KK^S77{wu;Lp2IeV8oUr0y9S_L-H&BWf7CwhhvQ>3u=N6v6ANYKpKC)>!lp`<4
-2mlpNAsbYB4q#;1%XPuT*}e`q1UECUZDR`9Ie@e-0L>adip61v_2fKaOED^T?!cQexl+K$g{|6R6LpD
-q#+UHP%qEzEwE?gNi#+j}CDs;S#=&zSIQ`BH^UuJmS4^t|rgit^vkhIytXPrb17rti!w$Dq_!^bn<wV
-acJ{BGi?uVG4f6mxf%z-sBVLZKp^uaJjI6Rc#$HFn{%ZYKF17Il~OUr=qFdTw~?%Bu~jKfqga_~63pY
-eALVP74ZX~wN$hrrUxLRb88jcL_0rw~i41gZROR8d2`Vw<y7*`$nGIrNQ<JdIh{Vcdf`oLCx@W8IA)*
-m-i-jVp2NV6T~Q)s4rBMdFTlY@D!jj2W<l`7s;8;lyuQ$^vrjcp^_8OLk!GnsY|wcm{?SPXy*z$;sl6
-4me~^F&mA51?Z#OAppj{77k@}+-w2B*_w^$)!CYZ^VoBOW5LU|17EJ3&$eVodJZ!v)rp(f1om5bVeep
-aT&M%;U7Kr(J%OUiuE%x;pIz1=d}S%_E{IgM?lX@s#Q3~t!2>`W!p@nGl#1;fE5^t+u$+Xp1`Z4WHqR
-SJOsfM%jga4V{T86~jZ2O!=9InOfVs|-@<;4sBkuD)B4&k(^c@J@Rt|tOBf7+kiTfZDI~>1a$s8u`A4
-mg9*w+QBb3$H#tDpwH4DBf3W7*?5)$@lyHNr`6IK<(31FMyX;D3!ZjWbqSi7wR;u({-B{J=>D^8!`_;
-Kc6J{mL6%Sp%^Nf{79<m=D4cInEe%mGnSkGQ$=2RSC6;HkI?vDKG+4;s~=)LI=iJ%7W`jS%|L{01q_9
-hybaW+(oR>Xdp-u9Pr={dTt!gdC1y01r`O0$MX&_KTqQ1;~zi{xJEF(Nazz1h{1U4NnG3XYE1kP6c5-
-D8;L_?=Kwq)GiHj<zyLOYIIms=iHRB*IxjbHdO({((=f}Es0TvCX|m8*L)EepW7w7ajo1*F5SN=#kI(
-@cz-1dIACrJ83=b2-p66IGON{Z5+W@+Ga6PfCMkoq4;md#>NSXIwT1~vlQclBfCQ`w$IGxlM^AaJdM+
-WVS$;HGtx6J>du-b};1yf`y1~Pz*+0@fL#7@LD@o<s9LB{;p5H&UeV+M>FEnpL;3@__|%1-3n2-po|D
-IK3|SU0<}=>Yfx#IZN%=%F!U*kOenT=0Eh;t6SD#X=M(G6GO7V+Bw_h}AbYM(BiA+_tjU2Ye^5#tyNi
-HI|U$*hx5801GAbb)6pUYh854N|S$J=X@-G%SQ53)|6AkY&gQgRwW`ZLnDM)$1Y`M!Y4#~WAQP!e3pf
-7+8DHw@S%&sIxo6j4t5mQU8`)B!-U#aHYD>0LS<37?72YuFb-0nIslfuCw6F_vI1-?INiXZc|5q|f;Y
-(kww!Wdz-E-#WW!L3;lAe3N0TmO!!IiTChlYRhanC2V%Ef5H|#4Q01yy0Fq_=~As}JCV0Wg)sQ7XNLK
-_J|;f>)+gzc((0<|uRQ_#9M0=?nn*nlQN*h!|g5I!)I#AOT*3KK`#G3*@h(J^O2xk!J?&32PV=1P!SS
-Jn;FHGVH9LyKrbcG}rk*>>ds&cIjVAAxcKA#xNUd!&brjAAtv!0Ymf#AO)eDs+I@!sRy15sBxJWm((F
-K`kBt|6tBJ88YB}Vr;CjLhcW?l#t)S$iP=M){$?5A{8FfP5n+16MT&XCQg`N1r@zQnz3Mq`|i*_u9En
-$?ZAB_3ut_#>{8tYbB2!2aDtUC=IHEj0s;9GCc!kzCYj6(2TU%g(cm%UXFC8+pqF#yM>xv@<6v@&N8J
-gBkOq12Cif#QH>2K3+Nv<15l@zYn}NxpitrdhGMTM*ZqC!lK?q@;cofFU$wQVpn-&ko1c9ot8DQlGm3
-@_&2t#D84HH>CdD#T}Pv|?@3)o%okc_(%x%z~?mBa-5JuofF2CjYJYq0bNVUC$2U9c<IPO{I2aWEjcW
-jO(dEoU3MATJ`jLLJCLv1A~6CqhGqD*MyOAS(fN<-v^;%n~bylD+BTXg8IGp*5VhKs(^YiG~;z<I5v=
-jQHTqeFxbAyn{CnWR}u&di0o8b~IHHnBrluVGps|?lzw?la5RT#^caXq^y%%a**qBNQ3a+hr+{9&QL=
-Eok6Y~ILFF^N%+cX$ai6EE|x_yH;CHd*qKrx2TgJ<A0@$;3!3B*(iRxz4)cNZ#2E3!hAXIUkdJSqH{|
-;P2NVRbF9*td*p}6#IiKsW$%=^=rI#a<8^odtf>x>Lz+y-|<9@{Djq_QX8%Yi)ybzx%6d%gh7sCnRc9
-6nnJ)}+xY-J-K#~laOeE?ruB^nbF2-cMyh}|<K$kI4GU~~w;N9!YCH$GP7MHSY$gJC<am+(m14M{<d2
-@*H*B9=_FKV(%En9$<8)<8(!*xb`Zg!$tIkgAJv8q%73NHng}X3P{;rIjv51SCLo!0tAapN&dPMCK}o
-nI^6mFj668ntX(HXHfM$fUKL3lUia8UDgS%t;CD-G;<~^Cdb_m!YFLDqaqb~SOZ>mk;|PU*Mpvp11LW
-`Zj3C&rX^kgK6-}q!9Wiq=(urjGWSLIN8ALCyB10OSXFSqtGbv?6QKu6qA)aRMm%Ml3TIj${BW?^jaV
-d+KM}hYY<dT$x8QUPXoF~@t88jaFcTnctb~BG>YkDyJV0R!v}tBFGe_W8M__Ak@}k8YT~-b*009Vi5Y
-B~^4r|wH-L!e$;31-@DKGBQlzb=Tu=P9p+NQ>f0TEN$F5O}&9S*Szg(z{IH~^c>$tz-jHazKAWvAKK6
-L*&q;ctb^BZf_y*GUg?je^~`Da@h%Er(*1JFo*<1OvQc?f4dp*BGnh8*pfd)P?xbcR8d|6%+%kNa{VH
-fkqrQq?-VkdGtIEVz-&8A=vH%Rb<E25uOUVL_SB(eoBH!frsfibWRm)u+XWknd@~70ec;~9vMBhG)S=
-<8CXG$uTb4a0>1WUVvVw^-<}eJ13ctO$R4oyuHH=w8eayit5gKLUjXaF36ssO#G)NxnIJXLtSkIE@P2
-?hDpy8m;{f2mSWQ<%`mXS|I@L4TFp?=cSIC8FD!<NP03U(nAV$RT@%}1vP=nay`DW^*N%)#lE9q3SMf
-p?=0m@R_Bo`7d;x`iMOmBB|8<nz(cq4YGS);ec=5|~Ps8Tcr9#19sRiTU^i*J#~Wg}%#n`T4g1%Frb6
-ik=#Ym;3xr8h<eU^$cyRm)Lh$zm8&*z@Wt;cRH|1t@8-(59F=WfrIc<%tAJvqcIHr%%U<fB?c_4uyw+
-J0uSmIcv`&E{mSuu;iQqTScZ|$_T~pP^&8QAvE<NY7o%?@IoLN81hBHNV1QSf!N!WjbO|oi<JV-kyEZ
-j!qGi%gaB}@uv4{9O(TfiK)jBwou@#-06Qh%(-3fS-n)7aTa~SeMF5l_`-#X7&Ce+K?m)UP>@#Gxp#e
-5_JkdSgI!$naN<+7nZnmp|Lbp_*DO(+CU52`WVO!!+MFMxSc*8VEPw?4zBc|F=Ktj+gv0->d=tISWe-
-KVK^AvbYN6%mJlmRvDXf$<GpaMs$fs*rX1k|12zn}P#B8GXdwYN+L!l}+hGBGg*{~$;q^|V8k80OnmE
-gDH6TUulx5DxUDYCUVJb1F^bVp$%phvtrwSTLKi3DKknE5T+r4W14Mrc`rp&_;m`sj8qKCJx|If-uQS
-*U~^1B50|qI-3G9zY-u$lre<Z0+%gTBKTX<TQL8W<q}3I)dcK}K#BmsBcS^pcRHzz8W6E(F(HG~;m{N
-m<IC1YNob5_hmZq6aZqj3FvJSw8REsML&I%OxGY7R&?X2?m%*y7GDFO?9)@4$dg9*)I6WX^1j-Jl8xZ
-D>&e0{W4a4r4^;!i7ve8C_Xo@nu$-@CoJbz`t9pQvzzAyTu3Y0KssfKbI4$we|i-z$uSV<-MN?fB@vM
-ExtT1;t0J14siT9U^>A<0#PZHgoi+HOipfreO7DL^E2AiZ(^`=*Z~1o=1I#o7;%q}Ex$B-}P-2@4_FI
-Ko2mWrgt_hl8H7*|n)pZsxNHu~Y4Zyy6g~Evu%~XMztdVD>{*WJMfoRM8Y_s025HbBs}$p2Y(`U{Tje
-K$}L*pcFt6avUHAGC`ZVm`vbin~{++7Ozxv%{Vln9Ip_sj5vt+V`!xa$-4zhAZG4iwbIGa54NR{XRp?
-JmHQe_Z`FEM*LLv3BAQ`A{Sb~-Dely{WM`<9FFK?CLe4hT-ig!r2cd6+aa38tVnSv;Ry_|TpSaxRhci
-XxBg%LPtid^y@Qga}g(Q4rkf)UofdF4tlx`}H)_(M56c7SgYcfogjAj`en`U|BXR&EGD)bi@O;n(L0W
-ESCLJlh(47gyha^Q1HLhyWbD3g_@ITIu0pGy2NU2DRKJRP^{C^519nFXv&gy4J{<26%LachJ`LIO6`i
-Xr1bN9h)^o56;{!D@l2lc%tA35<CZz7R79z-_{ymPPfbf`Xmh3^YM5Hwq@4#~?sJdMdhahksr)$-v@z
-sw|f}44_5vxHTbE`8duy@am4yR$QZ!I&~E0LLWsOlRbo*G%FvAjT*cR2ITalnY2CNBv8+RhBaUb9RO?
-)+7L`)12b~T134&Rf|apVgUuk1Z<e=vSFfT-z8hj}3BU_>@B>ghNVY(iq7YPlnHoryfRI}T+Cd=H0sA
-OqT7!s#G}*?~#7#d<e$5fUWqr9XmOo5UfY6;8D*O@ftZWYRf1)F@^O$NZ3Kabv6(W%t@Y6Cw0EWFw{%
-kG4>kc(W{MODG-o0DNwnt`I55fx!ePp}t8JRiEfx;mSb{5h%QzFR>!N79_stBzG>eh}!bC$@neabA9V
-MvBTmQ?5$YfT9D6U*^iPM#F2cFV!6jL<PuPtY}o>g7Nynl;*ORmZlwfsiS1>Xc+U<V7oW(0~tAgk*kE
-z*U9bbZvZw0WG~Jz;Y;-k<9{N{GKv-SLa0I-|E2G++77nHIr%~VpqowD+1&YVkq^Jr!15Kkd53qyK~S
-&R2$7_H<-yZXO15ru9o!V6>ZXdbO<VsmC4p>^AXC)&}C;m#VR}wZAZ|qHiZ*5vjxn?EE&7o7sdW&TLQ
-rc<~}=PSlMwXRgt@r^Wce9!2)G0>5kzL^rr;2C|pt|Sti;H+ZpH`uzx}2$|eKL?g+7DQU$fNAzU}OQ!
-$~W{FpqBMAstS0Uqv1SC&pIpjZyANL2(+X*N@!>cL6r9VkdP?Nq^mQ94c1r$KnS7~O(wA)X7NaMWs>2
-r|VWd&lgnRWpR9Cdnnc8qkN3iG?J}h||;$A$sJvo02>SN3;yZv*Q6(2V=K*f&DgJ50S5{ZCj9`BcyKf
-!_{5|9GZMNp2_EwGY-iBXJo~yYK(Slke8BW?EDSoHGpdG1MG`-gUS{UhUtJ&M;FTSWWMmXW^QCgPl)M
-ux!G-J4q{LuQMXNtE~`q8+xN-jA&HC9n5cn7j_yPwK&AU`rJ<@pj@x2A%b;}HIJOF3c1z*giKVO6RZ1
-j<@@B7=N?~oQi3$3MKuIPTdgAJ0HpqLOXdiy4iA<~IFbz^<cvyFX$X80S)q)@3(Aa@W>8v3quJpSN>(
-^8;5~NPK2i+R*5ta61QR4?3l$b37V;J^#kPq}`MaE=KuqLLU`Joc?Ii$UV{AsnAM5Ef~L-4vosO_eCR
-(UP;b8ZT8fB_7@9<v$GjMz*H$$wR9wKqW?-jqB9e$JMd+iXP=woUVPGaJJWWw@cNis{<%KuXs(^<4Y+
-AY)VM;{XP1`v5R(ilACiIOTe}T@)9ZosZqbfi;r#H>xkIo@ldCwQ7xI1Iemj>*#`1v+{@^Ef%nvO;7|
-a9hHxWCq$BV%qB#M3)qAdW?j#k(NH-CZAexMGESpO^I}*`BoJqOR5ANW5KUmd!xAV2q$nUEO%^o2bxe
-6oUDN(B^U|4CFcD9|q|?fQNjg1IHb)+o=1%i$%o0MVyV$CCS_9c7J(NEvF;p_v0f+2Eb1+h!Hu=~|Yk
-kX_6!3D|)u?5G*z??gWKy$ksbAWR8c{a8i)@O)5)}00%A2iWa1R=Ps?|FS8tP7`Jy8d)cUb$gqQBcGA
-mbn@pxQRf-cbSuhPT>=V);~7h@z$#NH1G8j8@2N4Bc|Aq7rHffw-G$9#;A7*Q75bZyweq?f(^@XmP0S
-3NeKC7}$#qbjDIcj6FG<#z>?B%I$$uG%o0-6d~$9D?aSC{-<t(@eG>3MpO2(sku|nrYu94XfzKuva3R
-kq97_%4`oqaVi7iRomOuZYIK9yOgh_wpct?m8$k%IW48y+4#{E@6sgRj%B>owdV*n3hG|8EXfw;AQw=
-h7@B&FE!ay;5r*_gbaR_0RNLaL4(O{dY4L;O~T*G1|KXvpM?%F`A5hKXQyGpns3}U%r2O?5Gm7Py}MJ
-Q;U7P=SZ4cRu)m~|iaBo4c^PaF>JM@BSGYrA{?W(Q3(Gq>n3D>QwBm#y}45UW?wKu_VQtu2W*(hLhUk
-c5VKR=WxQCb!uvs>wnjRHWvl8c8rrxr}fe3cPYChq}WwvY0d(hskL}-wC6qR;4-)4y}{5$<-*l?3So(
-afeFJb}oabWodS9*mi5^w&-t<Gke&zNcv8Q9}T=MN<G8mm*N8Xc%%QNZ<aFImDL)g)p`pw=Y&v7jd~d
-Mg5u*bSOR#V&#0T*uhtC#yaw0c1berc7h6GRyeM{1nK)Prr)|7ajA@It28UKPWF@n`fFzJCrXZ9SeR<
-t1Mnl@iY*oQbrD@eR6zdU$35+<7g@F=~$nu9t4MDJ|*ojKeN_-}HiZ;=FBV@+C2QVZ(^YQ@{iL9@vCR
-6V%%{DU*y(%gp^2iUXifXqRs8F?5A#Aoi5O<_HcI#Wqz(0sW*#?@1nz95SvKcnJow}|OYJxd0ixQVQI
-SyfOkb9x&B6T;5j)*B1>hZ)zfu_JeFPiC<4GYUm00da9_E6iwWvit*HA@_T4L3X7^S8Ci@HthIckTt)
-z@^&Z^#x1nwxZeoK^4>aFUk@Y5@ckg750@it5_T!T~!SR*iJ7t;MIn0Y^Ncxmea;QrJmK!R%!^sm)%9
-PgOs<BF%nu6qzoOlU=p!U+e4LvEY-2uwpoy66zVXIBddoUg)G#jT$8QERyQ+NsC0o}HLBeM^{LtAHj9
--*rG!2s;l-SAH#4Vdy_kbo+a&?lMC_SRP(XqjyUm`n0!K*O)mp5$nv@GovOD4v-jAYEV9giJ1GbuXTE
-#~G!DSmuZfKnYa#7BiyMSvv^JJP-*T(D#u6FfTJ2AZM0NjJE&6qNKUJY{~wmLbH5UFj@$zE;NAYJRQ!
-g?4Y(Y`9F@~SWkrWKUxYSCu5vW*=|Db#b700-@qthTQ<Uy9Hif>&}X-2owNWCe=~8|HwC?>3Mhisj74
-)`-<ozx^;88hfqqpyGI7HbZ4&wYG?O+Dshm=CxnUwm-!{WDxpoHmAhYX(24Lyu#|Z+mr#VP_N#<P%MC
-L&)Pc~@y@nevLFti@3ccN01^taIoDc-y(lEV7v1)JI<>o97oct>vR6V=p`2Q+SRxLM&2pW6a$u{{E#a
-eESDl9<q9Vm~Ouo<qP?%w-SlQ=&9t2|3FngUa)w;{O2@nLcW{GNY>>(7++cH?Fy&}71SAcU7ouNoxve
-9CAW}E$6=7~f{cxsh>(WF%DO&OCuu!ml00pc)`ddz|uHb=ZL{@E-i`S!lWv;p~{9locoL02m#U%OsGV
-F&N&c4jMs@Zkn49E<JpUb?WKfaDq%N_smx4ZNQOqp?H@IG8X|m`Z3ET<<Z25u9xjvlH0+LPN!$(&a8$
-BD_GV3+0ct&ivo27q&wY+$4XyKBGg}4QWXd;OC#!D_)i4am=<66&*zY9y)J`NI(?+l=C4aCJL0P;V6x
-&L-+_zf$z!>yF3X>T%b|qRA=s9j#Kop>D1dSJY-i$21M-i==N7B{775D!#4SqnJ1P!i^oifJ+udoMwx
-<U-MlzxujeXxnMDr>rcKPV|4?FtFl134Gp#h~h8F|!UZ}Dy)?A6|4w1Iok~6gfDKO;^l5#{{cmTTTFu
-(#OUS!Z6n>uh;P{7g%TnJQ!zRSX8$iCP^rdDgmI3=rk+NG%u1yT|wnw>sgzT<Pv7Ic<VnzDyF_H1RPD
-+LyX)=VEP24zFtOd;%cH_0KUfEBj*QJd*V-A(^?4^0Z_V_N0KWEnA=S)@gS1tzHDc4B00;?<$qOa2I>
-HZ$4cM`%J|t0pk?**2;g7qx1?Mt0JXVzVlI2d>;`)NZ!!dF!RkRs#0W1nIPpN||AiR?@T7r&fVn);tt
-TxF%^x<UT|;>EU^6U^CZ)(p$wM;RclovSXHP6A_55goYg!%(+^cn=S5Gk&QCW5H?&7TSgb}*qMlW!G*
-R2tgj&v6@=MhUkh}uEjHF_JEsfv2AFn&6;->tpfS@GWGmj}vO<lIDz|Sc`5cP%a=Mbn>a_=jWi>@_?k
-!$KM6<M;+AcjRK9v$uRb4h2-ejE?941&BQ&gnvID(Pw_DiFuL!uF++U_+%dgtowD7C?6*5la>j9(GJC
-By4GEoFnGyeKc#$)p8v@egf9F>NefQRGG;tFR+T=4*M=H1e3`E^|HXY4!=*1_qn}28VYGhh6uxtI8$@
-)oTO2i&99jt&Q-j25VK^N)-F*EhNmhql#2`*hM23FZKd@`{PuXhwrZ5go4m|4VviKU_ND?o$OvKB<|b
-8Nruf1XNE$Yva>yX<_xpkg(ax8dvRrUZbCD5+q3m3aLs}xg3i7y1}W(2VYd`{gqKcDxtgMkHAu*xrT1
-0&81S^NV?#}&r?$C>)2k3($FMs<BS3lsfl#SB8`RcWLx*@-lJs(mr9ZTfW>wMqd54W;UX$EyO93GyXH
-r&#lvSS5^&{J?<vYluIQ}7!3HeY#cwX4oBoQ{P@JhFH6Uu5N*}TMMSw<WsR->M%aFOecVfp4X64K4Wh
-l|o7ht#MJ_wHEMalIyIn=+XQ%5gWzp(I(~i!e;sdWzEht}5NUGq1u8Y|9tywcq6)+%nyzEDF$GM^h|^
-eNm7*CbP0<$wrXfR$$U%4ED4it(u_%%vR1xnrSy4i=ATLzOvf@%e7&IURADavm?9B+}`n0w;`UR+br|
-Sorx~tkaOF-@M2%&@V*Et*es`2sfZdQ5NcrY=Jzav8=4dluyZcYEOwG`00=?t@Y3ES?cNX|NO4=LfD5
-hKU2ExDHN}+CW*SHdqjpT9?eprgh7B}%_s<Rive9ax8;;jF>VlHrs$B}J%BVMEc%}|lRn%-uWQJZhhK
-0->&{O=%fx{ct^J@+WLsrf=g&L^sYC93>pwfs+`01@6ub2>ht)6eYjT03i6Ac1@vH}229{k!6vZ}a4<
-*poFt5;xyjFrtBC#ncosU71qtyC_o7h4-ChIVsFuV-Vr#ao%D1ghW#1U$cp!M+2_<-5&(YG07vu9&*n
-!Lix*C;n1`p_2h^xNh_QFX!!5`$d#RqMN#wcO8H)8;iIVQ4xabEVlX$2UG7M5_<R6;-14)1q;6`KyjH
-)>D60D-a_J`u!}aeVaV7dAiKS*EU$Wz3@AJVKw3Mxc@Q-ac%<SM&FArDA^P;Tm!)`R1bh0Z(VH3WUM^
-F2v{BSX7PrAZaag$$xeDiLF2jDo<cn<E+sBqIy&Zfwxy=h4P7_VvTvct20EGWF+H?{EED}jgW~YHv-L
-JVI{#m}Gh-O7}%w|0EC%fD*RVr!r)1fKFm*rQ*Jf5eVmO5bkv)%#E*d??EY&-X0H0=7J9J*KwwR}VJ*
-k^7mzI%I#GOyQFM3(t=6>3wkC@;pCWG==rI})hyP-@z|8n$|;mgK9>qJ&+VmUHZau?mZTu-p3U&2L!k
-qQ}BIZP~V`a<e_gc1~K2k@pLQ$!ba3>dWx1XO~JzXyHI&q&LLpWiJa3P;P4h!=`yiihYq@Q#O&K)ut~
-tmDozqL?E(cV3pLVR_~x1j{r&(V6HWRSK!H*G0gr}uku(dfeo8H3gA;}L#y4q5#nC^br@b>@LM}hos0
-Oi+fiyhi$k01nI3vk4T~gs>;$f2^d<2e>%98O{JGXt#N=5V8{QZPuUyn-f4_M!L3h}F?gb0)xGJtx>L
-S3`N=j|>iJ3H|v{Jo1yxFG34$!yZt>tbJO3o;~=D{HEm>0*iS5iypV(1(}o!UtOhYILcEMT7AHc)G65
-_GYTXzWdbX1$R_6yj^PfLC+jg<+~0F%3M;cbhI)ufea_FB`9ly5lgV#vkC8XbipDrRO(J5S>f2$zVoy
-n~2y$%Dh(ocl)0dPphJpH;241&g7KG4jZBuuPB-=(m^iuRGhFwdEQXvrY@*qr#v*X5t8dUdmkug``t2
-VcW4@90T#6AnXo2h*NETo0Hl#s_V*YDfV&9raCSU&i4d!sv4ON=e#wJ1HWr}lRqa;ucxY{;*QxLGt}2
-P5{ZBagBGJZ0XG`a4<#FPP6=c6d#12M_5`K9N>oM}e57E0D*QJ}q(B>X`znj}u_Ow@9hZMnQ^_JDrm@
-~Y!<*m%aZ}K?gBi;ZrRl>x*`(-)MYDG5$*a6|!PH^<d0mW{XLb5$|a*8qYyK=lq3C1rrbST}<4l}O?&
-5NjNg_I*tRVwybjicHit-#F<YdZz8^ESV;$uIHXl>L^L;r$1yW`~`$HbMfmLrH#K?WfLTFT7C#hB<qd
-^1hAksEt^+QHI&T<;@~T`QY~I;gJgb#YYzx{~u6G0|XQR000O8Q5kVeeyjeEHUj_v+6DjsBLDyZaA|N
-aUv_0~WN&gWV`yP=WMy<OXJRrlF*0y+Z(?O~E^v93R9$ZxI}m;6SB%07k?7u#s#4pi(p@%?qVgpcROJ
-bo-C3~ewUO;jwEgux<}*!6buUjaGw1lsnPHmE%OC3Y9tL9?4wBwD?NN6)Nxsn=warG8<{PGom20VmqQ
-vA((ot!CN~J_(?3yyfqQ<dwprx0nyyquYX3LgLLH+^<>c{L|Cbo=FSyozR!b_tae%h_EyB{E?sj>TbW
-?6X7X;tqS|9nc=z_qRM)W%aQxu(viPai>Xu{@$!DVl{^M>BS8pE%!lk{Io+TvguKmb?Cp2+>H`A2gL}
-ZDmRC2ns!UL(|%Cj6U=aYm{7BVe8;hVVTL9!aqaU9o43yOlY#4OSh+o5uSw3|1lQ$(&VzJL#Wa@+6k&
-X+tM99d>Aii$PP;Bfi+unGp$xiW&jUm#@aCnN81o{o3m5>AS68qp}qnA&fPm=iF|nbiLFC~ZlliewF6
-_DjHQ<FK|iLs4Zv%Nu1R4U_K1uwT5#?(C#iR|8+eZ|AVj0jSR-07RgQ~FwZVW|`aYO{oh;@Qk00rKJe
-$Si`QsgG;WV<C-=0a9TO~n^uB_0$hHwy!db8v!5OH@f9Lyhs`u<=(?xiX9Co_s^8qel~WHF3qG+oT5l
-e8BRrOZc*gPE61K3QCVvNUiqXD_63`_>;ZUI&3Hr;T`Gj5%Y8jUs`+$hQ7pGgL;ecl`o#HuR2ULE88>
-JzI(0!S?+zU9g<z+s4voQJX$=P$cvZg%PBH_hkX<zB0zPscW1MrK1?wo7+z3=3VFgO^0ZaBJ$RUdgJ^
-5cto0wMqy1!QMt-C!aDX_YgXtV^9z5XQKh`>)}9k&Q})wc_JF~4k$UYsR;?7-MruC7l3gYZnbAITgn;
-I>cVVXwfQRnw`_AqCi%g7rR6E?FlRoFl-^-WjXgQkP_lAu|ri62c@Lpr<vUD5_+zV_+LCdAY*;y`Ij#
-Y7phmWgpfLbrP+O#W)PKfJsF%kzOmeBX*LhG$pYF~k0+OZU&>!0xd%U>*c{k+9}^a$>v|6+j9@9R^ah
-ruqjDEW1-mVIS4UF{#cdW%8{y{^RiO?VRebbQtL1yD-^1QY-O00;n48F5SvDbuo<5&!@WHUI!40001R
-X>c!Jc4cm4Z*nhVXkl_>WppoSWnyw=cW`oVVr6nJaCyC3?{nL@(f;ng0<}L_o=U2nYuanB=~Z#;M02+
-6v7Kfzc{3h}ge2A!sUt`$>R;bycL5TVXeW2mc|FsfO#+Mkz0WR~gM;oL_2%r|c%m-Gr)QJfGxg@;>hu
-@&#M*<s19i7B>Z(ZQNv2bEn#V>ZR$b=*NzzoS4_WeP3X3<<LKoJQDmJBw%Dhk!mJatkg>jaY36{Mzk0
-#Amrcn7zl^vw9zW%vgZ16vw=1V-i&Wke1GpnM)=+eY$x?uvllyzZ1ZM6aAMX7qHN9x7#@k@~CTs~BzG
-*vgW)~Xw0P4Q@AVf-}D$|9Lo5T|F4UNLKzx_D66Njfi*r5dOexKd@Vt~cc(&z!hWP?}5&U2I5Kv%(l<
-^I5qDV?U`)Ua3fDsxWb4g*@agmCoWn<puUH^EjDp=uwr$5Qn%fO|i6IW$z{*)P=F&RJ}8qDIm>tHBFN
-Un=g{cWY#Ec)ry|kMWd;6V&v8_qRw-W*QC;)lu7WO&L(5xiFz?S@uxY8eFdBLbV>Zfcq`g?1g1ACg*6
-JlbJ(eZM$%X%8IxT=_xJ?_A?O;;q^3qy*37E34+>bTK929+Uwyb!qsb@raddMtn%sT*32UKgyoLRQQn
-Fm72?#@~LTBX$jDx`C+0E&D>=?ZnUyScQ5%=fgyUE$@tvbKDQ6qIdy15&lez+LjsOt|m*H^b^LwKAqU
-d5!$E+yA0o`K{thbH0jI!UdF{t4!_U@(o<LO&XqIWmZmSZPGWYV(_HnC97><;9jpp+Bi)rn0>3t96mU
-ci??H)&-TuzI`}-H0-OFCs?GjhZH8b#rE@L2GZwgo)>-fCbuOmy&Pfh@r#p_<H5-f$0tgCxW$vFe$?6
-I?RTb<gT1|3kuTNIWr|giPa!?5M<H~IhqtD@=7(;f$tpO#TR?A;Y<^q9+xEPRIT~?pY<7qcipol->4u
-b^&$Hw|&>`G2n^$^n$OE)bQ?Qj9m*kpSElf&T!_gwEk~-mv-d69;v@mOmOOv`~c8_#Yn=Xlswp+`6LU
-g>4Arxm+u?>7j!wznhRpu*Vgn~o1Q?l6~-(C%V{PE@A20!j2)%+{5kj}lQ*XtyU^R*qEym<MN7F^`>B
-x<c_2n@#EE4~hvIvOnaZ(8y5&s&S|gjs%*!&ivle#0~Ah};?hh^!C2Ll0TWn@Mu$gNguhWRjH@?ur}(
-J?*lN)VIwEWvFtUBXi7V*p-!}cruf%@c(=|hdC4uCW2#zDx{6roF$oond6vE;3^e71yp=4LQu>pWRAc
-7csw}%`nPjRpEh3_wM=Y;M4FLfu?3e%|CU~_4N{h0CaN0Pm5GuW$8enJ2+^5DmZb}hKm3&754$)-JkN
-DmK~QLKhaE5z5i{{$$X7$<)H2y*nWVaC$<`=>Qz$17-Dr`@i(ah|NRq8aC{ILzxKv121qF&Td}+Qq0$
-Co)gP@7>EHXuA;y#j8ikPXWc+`GD#%o-GNfd^Z!=<uitV^Raa3ht##U3+RM*>b*E%els%~>P^YszXU|
-52wEv;oTW{>5MYKBrYs>m^x~RxzD3W31s`9X0qQ&X;%tH}k5B3<^@YHd18B$GmiqA5RjbodmHhiciW7
-nQ32QbbsrWT0%-IGD<c7%DE>mP~WLESW4+^dP60j(jxJVB(F3VYlM<kZ^m!OZUu>=(|Hb)ES5u-px$b
-YvCT2?K61xGuPs$t&aA1Ku_YKF$!=k(v?iTVoMts|8M!DYRWOY3C2CV0J%Ftk_8Y;?NMXcbD?zEb<VI
-{nfq9_n^*}I)6WixhBiXHS2JM?A1^z-+!uu7%iV%xG;fwmbUgW8f*Pf~RHHcAob!`)>-*pD4e1`UD9j
-(CT7Jn8Q9B<{-a5z+^j1JX4ogK4N?Iei4Lg}J1!Q7o?a{^+bW2pU6^yIvN>|E<ur#4snkIsu|bBDp$Y
-4=^4e$v-=-E6-;2c)A2k2&&khm3g{`G_<0&{atBOS=O0PNoT;k#BixNeRNPQoV7s_-JNbKsXkV4CF8D
-#kKF!0VpFet-yXno%0(I`Ymd8sgr(pL5<%yqqb5f#ga~!Ih9)A3JZx+Mo`ELuyy8Igp!gQxIHhp^;lE
-jLhur6%_C(t@Hs{zBa}xw`=mC+-O_qUYrPy><^eTG>}=;a%~8~rs#<aWa;nwS{1KQtz!NJ0K(H?|QI^
-=HddN`bXeAOoYGsgtDahK<IM_xLwfBqu2I^x@e{eJ*bCZai$fX}^R<9RHD;h~0=U31d^?e<<XH^wYws
-FlJ3DqW0WrFf30r$okYEp!BFXbR%2$-5BxN>lopudok5bYpCseK#C40a(?mKRH%_JauY!P0or7K&obX
-sfA1I4!h6+VfyEGvd`#r$P@7B$sk^oF&|8Zet%hf$~7Jhyh1%5XF&q`*5$<FI*5QtE3{z$3h3YASN%i
-s=5ndYNZgGj%$K9*qUbm2h_d==m~AknhTLtzoG&+q=yYUhur|8kOG_^5mqZGAV8|Jyc<;xz_10c+4P}
-cL-n?*J00?lK+;x#mmKyK=1?HIB_mzZlLsYatJ;^i(?X2TX4G<!H32qf<RcXEi$pwvkU!N-X;##MNA>
-iqCJSv+ridF90W^F2rq$;-Z0P(`o>BAb@&H0DTCglQAHWQ0#?3wu8=#EtP9yVVzg7vO2y#9{NZfb)Ac
-Yfe-xYba66&tlcd_EUZL<qg5(+j_x_HAwBBfHe?$=QUlS$5zLj-BX@IIa>NSb1iKrPRBj3mWosR0Pxj
-3QJ8JwtPWtXCtqfgm?!;YFNITz72T6Q4diC8QEl<Z%^I*COnpRIZ_w+I(B;l2YhOUn(s>O)?lkyQ1mF
-SF9}3%H8D!6+t~mx$-5d37Wcu^#P04gVF8jc-)H3aH(CPAbO0G5u_#D&vh9FuQ)?z8{}(*A2}#tl`0C
-4V^pjt&Qc@fhE7rk+h&rajK((ayHW*76>3hp2%LIF?TX7hAhbYaiwvG@r{a69*7*pDgWEd~;Oh>Zmr?
-Edm}HdZF6nPiSrFV7ZNd(MP~-^7=LDogHMyH>ZEvF_-DgBqPYS~P+DA2pEhGTB1PS>ycdyebNgZr<&~
-TePp{6`#%`WwWh`Q2AG011mgF%L1F_i1n-Bv;fu{oDw)rxGIz|7_=eu0eW|0){3v4?n6*&0?zh9&Z?G
-L^RL;?k+vDY_McRNc{q_*A{w;!}pF2xC$xEheETOekZ70b9c+Tg~TGD;!@w$H)Y7n=^!)hy`-*eIZEf
-zo~gN4jVVdcmCD)h_y<~t)Yw?FCFk`%}8pM1~fGms&0v{)3x4E`~w;QQ6CSFkIAiI@R`U0I#5f*)7uP
-~q-ZL(ZAML$#iX%9;AXZ2vK9`x1s3ouxq4giD{UPz-jR|0+fT0cClp1pZ=b^D<HC(b--Y4pCXuueU<@
-_!(bNn_l6+X9WaU*|i)b=!ffoE+ETglWQoV!$no(nU<<3N6DhR(2q^TuriPGN@j*fE3l+K`H*sY>4y4
-ux-G`(Z?zN1l>Bwu>MUZ^29@KYIAS!g6dh{{!3nup1-KCp@`mDC`mMJfn+P&4`_K;cywsI$TEfkOK}G
-Pa;AtPukG;oe?^p4GMl?zNKA(W^Z|IS1`j@F&$!X-$v76T2s3mG_;GC!>q|Uq<KZwL1Q4G(VhN-CTxG
-r@_+8vrBmxhfC|HCRjT8Fp-C|aH)SfI}Vm!pUJZy!j=BvpM!;Ww<GkK{P<<KHhBJ*J*SaNAdDqiFxN6
-Y)(u)~TqM>F21G-*-MM@)IfBur2KAk5M<2<N8iIl*q&83KKd#f<CGSYmg^8|@xExRJMXJ;HqnrD;<J-
-H@<dlSd`E3!zL;n}N0~Rte&4Q49p6Sc0w`Uh2zeu7d!t%eyw;v$T`?EJUXCLn;qf2@nx-_r4xOz7}-C
-fp-1)&$4nYzD+7Rvkk9%WnS@7%=D%(&Oi1-xWf?>K4}Q>MOW%iL2u-n*J~FDiVkCMX?Gua<iC+~QSX9
-=qR64N`-7W`SqLCCbh<j)7;EAf`<TiEF*dgKedKOAp82t%PP}0}^?{7B-XABe?`g3P|$GI*{5AwlA+q
-Ih25xZ&+LMHw~QSVi!=3OD2O|A}G@Vdg9<xKuya40gjw36N*9C`AiK!J$D^0O;fAYZN@`&_^cJf_bk0
-NO%bQb?mBC3XhXO?Z0rN;+;g}&t6H{I-=ih((xUZNwtvQTTARP&Lm}mct;CAW9XC;Mrj$GtkpVt4&AN
-U_=nd;4(fS)Xzp-}fCs=fS*4o1v{Y#6jEYF@~O<YhK1$Ae2oOqC{)jZE*3Yfupn3!W3J*;^^Mq})N)?
-sR*MP8cnQ1$3;1HJQ+pS=iVRvKulEb<j$f?4S=^yy&1_MtyEOXZfu4PB&*^B#SU_QMn(<sRI%m>2G{q
-oEb)2K_f8@wrTIwKAF=9xS@yw+jazuQi0|n7M0%oTdbrS>pq?)ddf?RPAxpwc)t^MbCIJgM#7)PB<5T
-$~PTmp%MCgoj?ao4Mb=KY^RBaZhFag42ReG>aed4(M0Oy>W~jTysV~3H4kAd5~4*bMYBbanRDAnig0&
-k%^BBxcMQJKAmnQT`T`{zQd5(eSyH-eVH=qN)3<pAw5rOrLFa5;YFVP43W!NhA#}v&C{O%a(Oo|&Zum
-@;HGs^8NCUf`i>n54wYOcL1#vYqCU)^O-IV4Yp4tklR?KMpzOjk)4KCFTT#H(x^kDOa>l>R!u^vO!Ur
-@M_#Z%p4K&|c@eb>0<lCwNbWp+tkEDDYmCVDV&DACE08c9gdmlzzm2$mBkW1qYw@n2}@7MSy0dl-=T(
-NyAM-)-#-+ESgw<Q=V>n%W)Oq*~CiFf#Pun6|!(fxV&n<4I@&!E2#9Ui>B*cLQ&nwfS<1)ei^7fkPsQ
-qrSQ{%f6aaS>FX0=iz>vlKYB=(m)-S?PS(8QglD#7&`kJ8U8wHOZVK{Q8!klzVpv$8TE5?*+M~-SP*C
-0y`$QMuv(kacbPC4;5ZYwNk&`78a~UTAHHD?0PLcC(&w1-_5pPh+bFZi{5w!b3c&xL<bfk@MW_p3L6D
-TeTMjJucu`adqC<gP6jY@6Cae`H{tldXu(l8<F4UEtqe=sY^7K<K2jB$nOz9eDnybJO0&<gFHuFFllC
-?f3@YQgc#Bs`9y?8%e2GF>PBe_*r>7Itmr~@Fa^uXCr65Y;-eY?;GR6jy9Rhch!>F%0l3>Vlm)V}?7F
-il#>yH^;wdBssnx%z3S$q4$0Zc})SNUk~MFUyLJ`__|q#q$U2KG8`xL-qM`bnQw9`^`+silwi&)a%!+
-uenfc?ogm!wd#}m;Am^SqG^<NSYwdokPJfK6p=&bjJuMo3fzi*T$SuNvSH8{G+<q3RCIPv^X+?nmuKm
-wSC_qJBN-{G*l+yXwjdCl-oNHfp#7@07q!iN`|Ls9z(cWrSC+G%8=`Cx-t9O3@We54R0gLRl=-0Uy=b
-8ApsySZGY8#`cgrWp`Lx8WcCPU}wmJnNe$>sRQ0AcMq5OUxym&<{Fn3=*4^Cc%5%=XYRQpQaJxT2wee
-54!tCP;X=m{I{+YQBcOYovgg6$gm<?}Oi)bEk7)qd{?Xi{ss9C1Qik|%O8sGYIP@p`?ER+nAxh(9=bi
-qqbc-oX1*k3vO!_~;4sde#0Qs(sEe8nt&)`i*MqYVI2WI+nUM;AAgIsOQ*DR|PJ2W^?os^!2j?Y?R_F
-WU&-kb|?QyCJTsl<TTX-Vu(|ZYMQxLR~meKc6WAqH=eu`4*w|$yxi27-wmYiX-vI6AUaT&e){ea{VR8
-=yHl@z4tBYbW9Mj928dEI-3NIlqsrcw5hP9RgSy8wY&ES-@no0}o;P<`scNGCa8#cdzrO0KGQ6Q<YT0
-?f-(Rc2?>k|4dK&uJ*w@G%C6=h#eCyfFpo2LsAsD`(YBbDmMZ>+WLDFyz?`W>Xf;npVGw7Nt?QA^?l~
-f=6kH!e?aq{ohe@*)Df%?Cf_Vb#*<yg*g9#ixg3cIh%f^m}b^1fQ?&6I8r53$G6KNe_X*H~|c-F`!J^
-xw;3ukmkn+<X&$#Q(lSrv3C`nSAs{ANJ)(lnQi}(x0uC-F?LNy(V}f$M_rN?fl}%9ZD;C_|$gBl)Jg<
-#_%`9bY=d?{~U(@F@^suVAge|$~^@wZ)v^T?Vm%kQp^4?v`??g|DUDNY2Gdj``nTyzyB9dO9KQH0000
-808trnOu`yDVHGd{0I_5M03HAU0B~t=FJE?LZe(wAFJow7a%5$6FKTIXW^!e5E^v93oL`R}$C2gV`%@
-$!EMUPcO+`fhU1JxZWXeOYENMv!1MiE_B3o8tTHT!ProEg`Kk++RTrXe^u&aku-^-g>RhcIvPMnCWPd
-@qe|H>E7|M23Q^7V@^pMUe}dHLe&Z@>H><v;oDCl{ZT*FRsEZy#>{a&vceTfV%1dtGiG%b)K5{pR-eD
-nI}7%lo^VH&;*h59Q76&Gp?=d6U2S{NiKR7k4*LH`(*|*MGgfy?=N8Q0{*!Prou|{{EZmr^h!}@2>x^
-VQ=p59`obFyZZ-y$brju_YeE~HxJiWPuFkDj~_JRKVItUfwA6w$V>hFRDSd2r^VKqImEC2{PXhc_O`s
-_w~yuJ_2c!!U$5WpC;9UJ?&;y?$M^Y|zj^%hzvefk{ORi9U(0tlw|{xK`K5eT@(!QM(|!5w!_&|Acjx
-oxRNdbE_;B^`fm!?M;rhBf-v9LUx4g06l@Ist%bTma@^Jn3=5Y_76Y*58?%w{>{X_Qu<^Ju>PapW|{o
-UJq9Paw*`r((yk8}8kZ@w>IUq9xZmOotIT|ea0eE0sx+nYDp`RkiE*LRQC<?6A#<GaV7|2|V+aU-wJ8
-!2Di=kS`{-<9i|{CBSX*XxJJ{HFNl_VH@xh?gbT`Zrfk+<&g-J34-vH~pd9=4w2A?D_exPQl-w^liDh
-)3871+~*%TU_R*I5?1BM>+=5b`lt7|mpMZIw*1SB*Z=(O_pi&dZ~k2V<=M-Z&%Sy6=ilXTbEflObN%*
-6H^00~2)-@(R1a5oPapEebAUfRfBEG<XOCxJy!iUX>pye%U%hz!&GT2U%2(gMEYHe!&tATM@#XhlKYL
-le`~Ky3-@bbOc`2{1uRl&Pllg0t{C}qSryTN^`<%(Q*H2eBw~zbL|D4PFm^XO)w)}kc*Xvy7H`h0bsB
-)EC<lTq=uQj~Azx#`xH@p0OLVs6oekynOPnYFy4>yUOMBhKGZjSQz^}S5czxn*KG|L}d-TmurF2Sqp{
-?*M-IrLYz_xBH%<%|2rCw}^;XW92~v*R<1!%F%7RetlI{a2oU^ZWltqw>i`4*cqh#mcAp>EZsDa`ht%
->BpZE-~aom`~r}2Z$2hQ-rT-V`*54jmloiCPI7LKoWNh+y$5Vh*KdBlyT85v%LmQ*AFtkB-CeUJ57+<
-p{`&4s;{EE!+r;eEyN!*UqaW|{VPAdr#}}_O*7NVb{Oph4ZFBWOCgU-;^2X==L+-oJxnJ{H%4eVb_i}
-tb#<6OC<*k4GYPMlVe$~uBezm+uqvPTA<5wdml8#56AHP~POt=2x?KQ^e<Njdpy=2kKfBQIC`KR(5`|
-SMiX?}11dBd8$%*V({{Kvj``6F&AJNoMFx7~j`<F~VamS29Vfo<)pzy9zp&F!yU|1zKRzW~-3zkhjgk
-(2hr>py?@;>%}W|M2@4uU@}=@x}MAUwr$`4=<nP|8mIq{9wAi{Q2sExlSzp+qVxgUaUj8+#@{u;_K%>
-yn6A!o@b95eeQvCo4)+v^|wEK_44`u{NdY|zkmKR|M@o;rPSjx4X)Aj%VN{BX*4tc!B@L<^O1kec3EQ
-DW$;~%qh7|*=Vk3jzYOc`GMZ%%the=x{9u<km|yzHp82bBX}03h-TP%b#=&<pFEi}Y*Xoz%H7}Ew<-5
-gC@}6ePf9T!zxZxM(-TAk?!EP&mn)epD%v{~`-r~rsu61eS;PxYb=RR}rRcR&<Qfcx|j(Uz;=S6<-OF
-QyP*<`2uj%LwRntb{iL6ZX=IccWu+<6&u@C^Bc-ZVFDkK5~o+o3tiJL-91>p5=Te$Z5!Mxz-SH1jf7O
-n<HHmJ`~JT!&aZ=E?`rxbwKkueB7Nr{^KpkyD#9ZIuZ%jgf2VExY^l{D(O5nT<Oik+)Oxk-V=QCB}Kb
-t6!MD@qCtij7~GSk9^Xapva%*dVmqn?Z&N6P_XzN&oz0j$#YGfYj%xm=G?FDNWWrr7mt?L%7z79^j!2
-@^jyryqQ{~~E@*=5pfMWX<NCbF55YH;rqOhoK{ILS$uyeLGci&%t{L5oZbmnwn~gngtvRmI-RSOgce*
-E>v!SQc)9DGEL18xZaC!tif*wH+aKpGg*Uf^SLC>IP&@<>6^sMx(^sMx(T&vQf(xcL&(gPS7@MPT4bK
-FMHM$cTRTr#>hx;MHvx;MHvx;MHvF4*bT>Bh#gPLE#qxGUF<ot+ImJ3Tu+J3R+I2R#Qp!L)&C8$w~OQ
-DeV#cJ$0S%z4~6^J8A*6oJ9KOPhH!2F`L=4aBwB4K}zIwg6j{4cAKS8FORcG1nsZ6xY|dUM~{(jh!v1
-V+ImfIlT$kl{Z*cE}7SZE!^3z+QK;nxeRRK;LaD{<-+HZZ#-m&9Jezr=A|aY@>eVOKwhB=p$75|<QvG
-(U(@gmiTLzo#_v|z$s95tX3uYakKI}9BW<CD6$=cWM&tJ#<C-%V*sff*?9OO`EozpVD8Oj0UBd!x`{2
-Vb^7k?zIoe>1j(r$;TlpP#$<8xP_tHQ$=L<7i63)S7q&aX*4i?b2UH3UJ0{f8WFs%X`vXn++vfR1bOU
-_^pf$fyj$aTmc%cV5FtNevMWnAWqanqMvV1@H*4Q~1iBb@jxu{3UAw7Ho=6I>9OcJ8e>-E#k=hma%NI
-14{6uo4W(*G+$MM}^VkeS%vpa)BB$|7wmO1Q~26!@L!+mrrz#8)+w-ZZ(&^u*Vbc4QG@+Bk)_AH{+Sr
-y=$s8mzoT&l`~?P`4YDA8_h2Y7AybM405Z^7^X?)AG8~m#x?vgyMbBFTcI1<1lwt{aVH+&0Qn(%IyTg
-?p`JE0o1m#QjfR=lB+CU3#?1|uyM!6xE-_MtD`?!A>*ly=S)#&n;^zyduZ+%JRt?EavzDFt%74iTVsN
-Z^J|K6l8JQbr^<drbYQYj?degcwM$TozM+=1~2W%L|#JU_cGm<kM2iPlvN$XrNwx7?(fbX#OECoy=*P
-kEIy#X;cLU!V&b6?~W<zF%bw(-b3XqLF?);Au~0p~o3E@6qn^i%?oo}TZx{i3O2*WfC0T;_{?frHB1(
-Z6EP>NyX|OY%zGQ4_#5nw~z{02HcVZ5#`mwyURo+Ph(b+WZ)7`lD&#2hGMqO<s~8_!`gXct*!xI8Kq<
-$_6}`%!U4<J08*Th>k~eJfh<f-M4?M@Dj%}I-XHP&+&{fux#iFLLJWtHOqzz;t^TPY&sTDAL$n7{U$H
-T4|K;pVzjfNJMPibJvxLX(QMo=tR<f-<V`%`5m3qei@`D0BATBtseX~aAJ9e-NNyn=YXz5;WvonXOeh
-?iw3>DeRv+3?S*;wB8^im0+c<0R5^wwz2kbath+zX1+3;vMVAsmvfLZ${X6u-K@ASa&I*!--dB5-yjB
-7UZ!~we=4F~KvV8;Ptr?R0ZZq#w3j^O~K+0bLsWA1fp@DgZogFt3OPn?%S*RZ+`dYKJ9HLExcD0L$kX
-wcBc5;WKRuFXptyd*F=fyoIb4-(o49vUpU!7&@YzllKN0vn6hnEl3_XG0G_5w`bRgO>!1Ex=`f%K(=F
-E^z_b&=aN>;4#2sfX4uj0UiT926&9qK4d(S<ATcomjNyVTn0=nfMmeb0w@Mh44@c5F@R#g)B>g!Fts>
-w){~dy2YOa|f|Y=&1sDl15@002NPv+5BLPMNj9}EVp$8a=zSpfMFKL*_Z0HGA0+JSBB)~|3kpLqBMgo
-ik7=iOQ*nGp;XG4#%*R40!4XhCF6<w}ZMRK{zX8tt)Qj;8rbqF@Ivlu~mlnw?{miLtA6cQ2Jo^^Q1Vy
-mst*WAn$S>;v}jkRk9fnor~0Ez(=11JVi#HeM%BdzT>GYZN31(E?I14zOevY{uC3^r*6iWMkUpjd$-T
-ritP(`g3HwmTzvNq(RwkgPxw#+nU1fn>#I;2yJ~Cs3?BP31u<P^>_)0>$c^?~LRn`GKB5vI5BpBrA}t
-K$3{I5!f{mJ!Ul<dH}@=6f01yK(U_wVk9rg5A+0*6-ZVfNvM|%JqaEvP^>_)0>ugxVbj^r11MIYSljm
-VBY8=FpeK;5K(YeK3M4C#teC9|6f01yK(PYF3KT0)tU!_AwAGWZ4|quhk`+iop|YVTkgPzmVzw$!teC
-Be*{X2u3PvgzsbHjnkvh+Ho2(mHsbB>{pA9|1NChJmj8rgE!AJ!oQ2N%uNCP7cj5ILPPQE^qm*j`WH=
-SnCOd5KE5mb+c644;?O}<QirGb$KMj9AtV5FVAdL}Q)5A*~p4XiZGRs$o@(QN1mMj9AtV5EVO21cMR+
-0X-wwAkx5lb7TNdV-Y(RvKojfsqDA8W?F{q=AtJMj%+(&;yJ#Fw($CYkS>h@{;^OPq5O!O2ce5Fw($C
-10xNL5UpgxwZKRNBM_%-=mADr-|IHvB@L`Ju+qRv!)!G$(!fXqBMpo+Fw($C10%>B+0X-wG%(W6_+r9
-K8dzyyg&-;$dV-M#Mqu;V&=ZU_Fw($C10xNLh&ssG_v2hQcu5B<9jtV)(y=EUjG&7(=x{^lYDhp$f(~
-j*Q+!T%))bG4WkFpSccGWSOB(c}$vVm~b}-VxNCzVwj1c){!?nOj2O}MfbTHDvNRPd43trN}N(U<)ta
-R*22O}MfbTHDvNCzWW{cPv~MmiYjV5EZ)v@DGaFX>>VgOv_eI`*W4kq$<nx!KSYjC3&4!AJ)q2z=Sl1
-B~=je^~I64pur?>0qT}PdXUsV5EbQ4n{f{>0qRTkq$;W80lc7gOPs57Ykm}!Ab`!1SJh|E*pA+5ovI!
-TaD1X5j{5|-zHMo!AJ)q9gOrd9$N5{4pur?>0kvJG8?0DnxLsPji%EKnn^<sFfzc%*l}S-47qOTZQ0N
-htPJeQ03!p83@|dl$N(b)j0`X`z{mh21B?tXGPaJ0c%I{el>t@;SQ*%p0Y(NG8DM09kpV^q7(qSE%}5
-V0GQh|HBcs+mF1%!bl>t@;SQ*$8^pf1c^aLXVj0`X`z{mh21B?tXGQh|HBcmUCTzJU<D+8<yurjbGgq
-jVRBO7{xkpV^q7#Uz>fRO=41{fJ&WQ@MYO<s~8=m}N^SQ*%p0Y(NG8DM095!CF4kkVj74I<PaLTQEQ0
-Y=6;*9~5R0F@0r!OFm%3@|dl$N(b~j7%^x!N>$7XhhjGnocul_PQCoWP+6mRwh`P*pmrHCK#DuWP*_i
-MkW}UU<4s98+w3|2}b7TB^lu7x*-*3Lr<_Wu_ve*X;JA3MkW}UU}S=k2}ULunP6mskqJiT<|StEk_lE
-OSeamDVoxR*A;!*zo?v8xkqJg77@1&Xf{_VECK#EUmzcpzCRjm2%!Z!WlL<y97@1&Xf)Vt)Y`7K}nP6
-mskqJg77@3=wn88aXSV5&|D2mz86O6!rv!N##nP6mskqJg77@1&Xf{_VE<~-L8UNXVT1S=D)Ozg=7BN
-L2FFfzf&1S1oSkj_Xab<h}%(*(_4H;0!ju(H6)0xJu9vcSj!BMXcyFtWhN0wW8IEHJXb$O0qip6Lenx
-;eaLft3YT7Fb!>6I9e}=m|#1OEi?i2Gega{075sV)zS;pscpFd5Jl^WPz0hRu))U*pmfD2pO`WCm2~^
-WPy<dMiv-ZU}S-j1xD89CFbyw1y&YVSzu*hPZk(iU}S+21mA4v2}TweSzu&=kp)H;7+IT_n8QmJSXp3
-Yft7_lK~m0!o?v8wkp)H;7+GLsfsqA978qGzWX*Hk;3W&JEU>b`%EF#3FtWhN0wW8IEHJXb$O0qeof;
-{phU(i8z>=1n>z2GEKN#OQP0&=DM$>5q&7`4cVx$wbWkV06htb36v3ZGQIG*DgJ&m45Pp7BT)9LB-bb
-2~HoohKgoE}b(phwVS^AgK&JjV@s20eqGLC>IP&@<>+=~?MnxmKk|rAMVlrAMX5<|UTlc#d1?+34Bm+
-34Bm+34Bm+34Bm*|=7tN2f=pN2f=p$L1wz&W;?n)3ejF)3ejF({s>s&~wmp&~tFDL61R?L61R?L66N#
-EW_~}chYmxbJBCtbJBCtbJBCtbJBBhtwoPTk429~k42AluG?bW7Cjd|!3r{DN9XEjS{*s7BWHE8XdR8
-SlSS)f(K?!RN2Kgz(Yl?yB;(|ZP9m+7NOP9LnYRj0Eju5IL`#TgrrZPSH|8Y}96G7DPU@{7J(!*TE#u
-^iitOW%MTdg~R-}_X2^?R6wg&29AvQ2@7O=7)NOrblAUrvGRJEOVvW$~23U0(PK2FS9kPV!;!3p3CF%
-t3aC7UxZow#wr&!W7kG9-$&p=(B{qH&X#6nLr=Od6!e(8`QRF0?C2sTl!6!PA)(Cn7UrmI@(kA(Awn!
-BG)3Zt@bt<Txs7!SNW<Ye8T$_EEtq6}Yy;s8E{nE_2*KadTzJ3#oauH)oq@+~g$&k1||lkl!>ccR*=_
-NVUMj4Kh`5zy%i{aNUCPSojBrBREo+o%wES<Z*CbMl!NMzKocrlfWv(%+_=tBnUAyP8eL^VoogVSW!n
-<a~wlO^wYS>O9BJp>;XezHXMYbRCe-T!B(s2gN{UOXrYEZ4W;ymOABeqLL^r(xf(ZArvMak3?~9Nw4A
-_B6#~Y>eHaeSu$YGRFkG7vDs<aOCU+;PeCyzOInQ~(IXC6}7#Bs+k^LQr8M#*@dUlLpz~c%rhhqj^j$
-K}@E0?<U-^AOz2n3+ckd6*+>~VvRI=D3AdBaB+9FIW=9re9HWu4%~pe}_Fz}AVg<Xq(S^aR{=<=>k2a
-U)v^*d{sJMsAQQ0(1()Jr@?VETuijucCT5#F243c^pD+S9TT6&TvMCqclR(PDb6)jqFhNh)YAuD-o?L
-2^V^r4sK4nlbE`2GQ^HGHRQrV6yhX|4Ry=NMw@2Um2f+hgVF9)o{qiBP9o^^y7OdtN91wHeUc}$s#*t
-B%tP6xybo{68STq-Y9g3q>;u7Uf&G^zMbni|-u5A%3f&X<8~7#lg=peR2@^0HZq$%BttkP^;t}K+L7Y
-i<C4W+oAKlJ<k#Ta`2h1EwXf*9IZ7UfS$Go_9lz~D}+sG~pE!$jSJ@_#?cwyIQ+~g&NTX1Ru3LFb92@
-qj&SVrbD4rSCCh*U&qGZUXXcF!@<=CW+D_gkmF1ckNeR*BsU)Xb3soLMbObs&&98O#t@px~mAmvJQ)p
-k_wg<Z;FU87E`cSu)Z!sG|m7H}Wl3cL5B*g0+w>?Et`tH<?2U0<@V0yNSZR*DW{6g)5V*Y(JF<rEhRz
-AGmXp2=4NJ>52<^h9I9sjx8t6n59F`5P`gI{AQed;pmw#VYW9pV73)Wt%7!HkO(&k?`)VMurCr)A-4p
-?a{oAjKq1+oag&!gKs4B_5e647;}jtn?#@|fCu9mlEQd7&T+ETGYu_?Hh8EjB>p2g}OC0&DA|9E12}v
-zuu?=y<5xIlMb>fhaQDfa4R#u@CM!0Txn2P$Oag&!=m#xEWAypXab0HonL}*SP(n$L{0YX86G%~(M%x
-tRcB7`-#eu<N(PU=e_Rj!J(kf%FvS^4x8TI0x0L3YE))EM%-QJGUW-@$+(k{ana)6QdD>Px7+@ur(mO
-&IopSlBTGQROf8<^WjaehI?^#!-gKF;o$<v%q`ZCiNvv1q2IopZm>`pl!1)%r}m@khn2Yt4`w6(ZMT8
-mqJR!@Ek!tAdX$9klvkjV^(o3g<N7$Jq)hGn>G_x48fxyJrpGEGG&m+{2(|xbtp#GuOLckTzCngv>_}
-RbwSp}igvxmWPY*rO&b?_SLM!Ca3O1#JVX9!qi}40k#Ta`btW4TqK52=O7=(u<DR*8B9yhKhQhUOD3y
-lfYH}oKtOnclw(I+HJt}pB*asp|G$kh=Ye*%&xyqr9%Yq(Ifn4?od2ott<dg}X9QnGSq-osbB}RbhWd
-EXXuBlmF>;`R#{0F#=_081SKSN|AuQjzfRU{SKQ|GwUm#BsTJ<32*L6S3!Wg(|v+SXW#A`+omO$5deV
-L^H}0ySeXx}Eq<MsZ=-_0U|d&C<Ceiek{b3t1r}bz<nxW`Yd6oJ<vg54I572~$M+*0{+_41XNx;6`Cs
-B^B%BLkn)SknIY9Qc<15_K^ImcxqQSN)ah&IqR5mVk-NXY&-jytWaPJ3hAOwk)5G%6f}BAnX)MZ%7Z|
-p?NI%W%0CZPOlW>{CDXq#M@|4z&_o^e&UT=p@2b`f28L%uh%-_xmF%(;@0O6AW<}<%Q%HV796*();vu
-TkDz@1V`6iJsH3ycB#}xpp`0RjuDmECx9<*Z}dtB;XN$LcQA{14GiqIet6!uV(#2w)jMOHyF=?^EqDM
-&^I@8?}%-_CbaDShGEv+@n9c2d!t9I#j?TC<Uw5B#R7vJ0>qDbVoEX}IYsqZ)f$>RyRO1EcK-1I9Ito
-RJfGI!cdK)$UfD1_gbj>z%w_S49;BwjjxQ^mBfbm-zX642>YhGZR7@F>^uZH)N;a3JxI)w9q0dOF5+@
-Q55`@`*F^1@{*VeREQ`M!%e{s1jDJ<Fws%PR7j0Z!o=Ws#ttnq?#O?R0Ow$jajAO^Bp5@CHkHGYgErI
-z6IY=0!O@GWi7Q|U>$WHWK-L*a1K(tA>$HRs$#=jRv3`&^H@1W;%0#{>M8HP=!l_(y%1sPyq-b1XRl}
-4PY7ENU{=%ty4R&u)L?<7~HJv&`3zb@G_kz_X^Ib7zEFKBUvee+WhpMOMIc~>J4wZVckEcA%!8Ecp4Z
-gmE3@j|@>N_%mLa}EHB?nZb7=6vRzi{ea3tF!!OhPZQv7?&`Ny5C)PzGSa6j?W?!lNL$Qjh=#!#CnhR
-29a!$xA#`Ud7`ozM%TUT@jC_k>D)060krm-Um40-Hob3Cly>o6voz-U3IUdoE&H5RPA_^XaX;o3f&Gd
-yN(eg7$7{M3a55mA5uWsf~i<dRGM*<mr!g2oS0Bep2#)j<P=gA+fM^0J`@a4HkN1!(+0z0Qv5~gkvZS
-^rS3I0|5O}_73m6DsC(kCBL7ym)y0R%_-Num0ZOz%Q;K{kl}8#kc}Yb?GCZkKDdix!pe8tO-!bmqw-|
-$s!9FS8B#%^@&J4itN#i=sMdKzfaak-<2S$m4%WuJBP{A;>GFv*&z}!ennp$Kk{SeGB(N22Jee+2c0D
-i`jRrw3<9D}FIz_qD^K#UZI;4nAKGMG4`NfQGl6vOI|)9z6B>NrtTxiNwu#TM*Yb`)EJl(Z3DIRvY+V
-VwHz&RT}b+@^FZOas|OjSDXk352!<$sc1Hy(<h>vF^g8GZ_%4XbSXINT-4~$svcht2ofc8FjA(IQf$N
-B}p!%n(1VN&R-}Dmc@dI5Jph3P>|&-7QQGL5j@-JH+S7DPfs#3P;guZ!9_Z-Y=@#;HYxgg846h-5tx2
-I6o4V`QlDzR&x_zUsMEy~5naKdom^&68B?fOC|v{{771DGQu*XksCqLd)S)_MZmz%gF?FxbzHk}R*p;
-|QOl((7stxUXZbmBDP<T&mCwwQiazk__9|D{im%3M%Q$z$XvP~h+hz4g08K?^~GCD?OO6d|SmV5}yjX
-XxdkR8I~=24XIUN{wehJQ2YQbo3{Y%s4Xs%1!gZ{S)x!i#HLOOquLT>+p|MOL8x8aH`KDEuRo4wn;Wf
-07n75;sW1JdM;J{Y0{i3Z#kima6yV!6jau_nW-Ls6{HUvN-glOQf>WG}s;${S?gWWC2;fAghUSVfLXZ
-iv6nOvAy4@dv(f?3O_ZduaiRep?$A7YiRZn0c1V!bnt3N2XZFf5o?W%Z_zC>uJjT`6-&-YE(<D&Kc+~
-^bWBNw!35exK`-*A9oj#PCL~kGR7kaJ+=YLGYKY&P>WXCq$&f%V-4)x?grpkDEh0D)gCzP<{y(=0w(q
-xXy#$JQh{{#QAe_?HM8raPw=I@R^?;6UjZ@Hd!2>ddXFhfu;MBdEtA3pcrOw7pELkU%2*A*3U8Ud{A4
-*49GPL|Ey<{<(E+a~``3`ljPOW;OPS;dsKvteg4xW!Gn^Mh0!xRup>SKZob=DQ*Ytq=Y>m0We2WU%F$
-Snr1>R^~jDi(9cX+ZfXS~FE^*M06x<BGt-!Q{<8-f!{}gHZ(2Q>ivJ6fYzFQl@N%f>f+NB*~h(Z{3J3
-$rB<p6e<=<-FZ`|?$xIJn@peTymjErv3eB3W9CCAyEtZHONZ5hlOQsAuww<&OG?kq^E!2}B^0c~`=~@
-9xsLPXr?>^e9-FELU5bwz#0{XxYy&a5XUb*WPCQWeYE%mv>a$hFr@BkXj3NROj|In5mc$rW;414Z`5N
-b~b80f6TSvqdUQiT+A_61lwj{4s9fjE;H*qY~0lVYM2Vj+)ooAs<FOqg>uk87y?$wy68awDi|0UL!07
-QvcpqH37uI?AoW!j<avO*MO*sOw=3We2-o4lk@sN!=cU33yc#D!>uN2~k51-4)bVyMH1#5useWX-iD1
-mcY|>Rx>bVj-162m0X9Q&|@1CAURIsngg{9!Yk3X~_m`L}w`>X(z9y?zOn&*gdN}i|CSxF>*)PhpD42
-MAl6@Ee2l)C`g1j<?MyH+x)bX)V(?)Kp>t6sr;g-Sf`?vV%E@v5<xVb&!U(=#5?ixOQ*NAs_fd6S5x;
-II&~(i&~zw=RdC5IIvJ@2CC6o3Ux$+9)CRl8hBz*<4A#!52+_F7OS~yyQXq)Yo{F(0Y9i~I005(^O2l
-;JO~F|~(IJHcv~Yz}@ADyEf(|1QLXMIkxlk!uaIuDkFNm66_tFxaR<RM>0e(m_?ARyl&UH&((m5Vjpq
-^#t4<MZA3PCAiP>N_uFHxKm@;(Kpv6RRoRA5$(=*R2M7dmyXCWQfu97AbL>2fmP2Xcf&6GbK%P^CDkc
-ppdKNPgLrL28IRr>;TWt4r>nBCaaHL?kqool}Ql)U7xgiXGaGl6fVuZ3hfcL~jwL;>5$$Ibr#Wrc@n|
-hN5TMU>j^ajZ`RZhByn|4Mz!k+TI6<3zYj@hg0`js!lF5GohWzDLti}rWBm6?T3?L3D`QO$jD`S>7j$
-s+E`>RHE!qp+m1!yC9r>~hldtQ(RP=Klx&KP!&{$QLf%q}ffR0{=QDnz?lrnXoK3z60nk#W4r8m{zDn
-?gDPfTILMh4=*XC9!t~0bZJ5Jq*y4O(MKZev?QRb4|A`XPz(HT1CoD^A=TR;Id?S`q61BCRg`J8bqb+
-05Nu~S+Ze!68Rj%$H9Q9fbhP|Tr2VnjMaDMdMN=r}~I_&$&B)V-RrNXlh$e#bDbu8;+)jAn)7L5^ieS
-y-~sWhxXSh*S1vla03RFLkdbmI19WS5E5CEx;t0TIoi3RpYpn6A|#3NKrf&aSNArl`5Zgj!xaH4XIY9
-L@=oiQ8@*I5J;sqDS<X*5vOjusvOsKJIYr!MUCRld)=seEy~KsL}~5uQKo$N-X>ahoE)XRMG-J2#Lh%
-NJQ?*81*^23A9Ctm3w32Cf6QM_g;|%Fxbs;u^N3O$9yFM+cLl^de~tacBk4S3-EnMC_v&58*-fF4cnm
-*43YtoUP=17h?^LsKVvdcV0Fy9=Op4T>v5zGldtCGq@}{N(%AvEU;D_okCt9(-$Av%+2-c3a@zy|$)3
-c$J0m%lJRbpK95@JTv67QqDnun%x1WdKEAxZ|a5g`5n4GTz`P01me>84ofykGJ-6zY|>a}atUrdDMvh
-Z0g!BJdKZKV1p=seBsbQ*jm#tY;l|jteg#g%apC$hJ62Rz~T4PWN<G*J!$Rj4@QfqO2yEmhcYQ(9xkb
-&vDU9ma?$SrSB3O;0!UOj=yLRqKj4A=|*ZIl#s`=E+xOTqcKg2Z9gHPQyhSQQwAPtq>Q@sNjONMs>M}
-LML`RdduVlfcZ2Fc*uv~QW$Gyq(YTxwb}>u>Hq4goL#LRAP@(|a6?z&uYMD}Q6}_bB7`gIJII_?oWX2
-_rgV8q1VGV~yjD+7pYiM#69VD@ZyUZIY4lys4DY2>)P8s?`)s|#j^pdgPNP&xQ%Jw6-Xn8Q?vh^}Ka!
-@;?ZW0G+y4VH$MH=?5M<gqAQ6+TBDJuV_45}PeRn{1N(51+PC@L8piEW1}U3i9}3^n2BI`0>~goJG&E
-$AG-tg2ap!-vcp#TbS?3BB$Dj~{Ra)8HXdOwsdH*}|S*>RwG8nl~GC8b?ELlOhgk&a4pWPFG;1O{8%#
-e)vJ^Zo`#%spq)L<8*0(XcJN(LrS-*cF;Yi=sxa_XCPbZ%GpR?ni9?TJm70~T*xW8#Dnal;`GhKWpKr
-Wm8+KAqGXN^isSh78jr3Wg74P~PHB33eyMx)u5E?%AW>d5n?ox@EUr!x0$q5Nu8eYh$bCRI>MkI2NW^
-)+@Dk1l7I7g;`<$Gv@yy0S12b_29jUHj`Y`OF_bzA!p{QL2Dq88-<0dcZ%HQGzgIc=6%DCVxqm9}coJ
-n)ssB2rp#mptaRLwa~mYMd=t9cs=aksPyX-bPuT5;K0F;R^0RyI}KMnU1Ok&*Le;`et1K06K|xX-wID
-#tHUsoewAUGAI%#8R9j-Zv#4RfGn6k_!T7Ook~GQ^gJAQeVQ!4G*RF8_|_Ax$sop(cuvPD&I?8M-7R<
-m<E)7Ujm@&owVO~J#A3;8e}V7x}$g^Az5IKJL86s)Wi^oEtS7OM>K`}Bpb?7eF-MSb{r7Yy%rq1t7p?
-ubS0tzqD%u<@U8;Ls>vWE#KM!VDs|_8NFnj|nzrAI!b@eiUn$M<ebQ*e)G*b|13G`TEf1mMc2#@H3)4
-gHR`p~}*5I56^b!){Md>rbzf#r7lztHfS5FcEF0v|T$oj(jWDD2MS?MJvo0m}cTG($!y|7U;RB>K@Y$
-;wD6*jIiKm-|~pjWvl(JG=>Qk#Ze9lm)~Q1@!|G#FSY;!zc=UTUB^IOc(Kp82F~E8@o@Jq&UkZ5tm_{
-*naS+~ZRBsx<Ks39b@=_zU}>$ge5Ejjj>W?XeV7$LaL~CL(1?1QPwm$xEnvjky^G09WL>Bv3<oSR+Cw
-YYL}a!Xfen{`JuMDj$GpptRe^xsR!PEy}-f?$(w_k0N%k3f@DnAfl9^P<3WiNAi`I!C&c4IF(?gw8Lr
-Fse5%L4=GG=70W71$LYJGDq+nV??Nz@7IIP`l#4nPy<!z4G$_wocbpZfd)+GPz(}a7x@(i_?H<zmMD$
-do#I~l<p4F>BmI}Q>^0n@F&jWR@HKbS$l~FICi`A9xN&XmR-VvOgEJR18t~^|Y=6A$b$F7Gw;@t0J0w
-x!3dK=ZyibGr&w~HhRQyag46O&GAHI_=g5VrL0C$u`(Td4Z!->7@F?brvgB?=C5L{PJDW0NnKu-<fmz
-fhqzGDlYtk+N>mBq&XdW5<O--K&u+C@NK^Zn~(XxQld5v;!sPs+@+rglZy`@y%J9lBc@%DgnyLQ>lA3
-w6Zc}*D+u!QDBqC&~CuOR+axuftY}t%6rwMNyT-Q=n8fx9#r=#;ak*RGNg1Hs@X!X?2ziq$tQ1mF;CZ
-g@kqP;Nx{FARg$vjexvTyI2Phl0j9Dy$`W=NTx|U=uvg_J9A4!GdQVPMa!(~!YyekE{2Z4&&eBF7nj@
-ei0VtIGXWf7f;!$7~LcuATRxHWf9LLa$+&B?v?cB%Iz1mU*pUjI0uL2vnI}9$~x+13q^s=DI8h+6CI!
-OJI?N;^oan5h@l9-$NYPHz2a&7W2lXnxjL<=n8P(?jzGGHHi<5ZQM)+?!`32&UK?$ssXiR1A`74YsVA
-EtDsswP6^eo{SjI)kvbh9ov^b?F2u5Ip@cb+4sqA48l(&?y%1wkx9L*d=(#G_hAgqoMb?Buq@da-*8Q
-GrmyW>ynIv*+M;Z1yK|eku3lU%DYRTrX-U?7{W9;=nBqFWxGn~uAP4i)xB1|1F*>!fD8%hQ&9!G0S=^
-MPTMJb9Y`QZR>E540=kUSmvj3!>Rt^cHkRs91R_;-0d;tFAZ1o=wG7q1xN7i;eY(I#fFKQrA=|Du3hG
-|VRB;(44SJs!L9(OKJNk~J!<41SNM*3%f=y<KkCL>dOmS|;c0Ei`_iCi8V;d#~@W_=aRDqyZ)qzx*Qq
-7=5o}DVx8-BD+<UGlP?z~=5_gbdbR8l6D8+v0IxzyN-DZrkhAELP`<KyTM5~hL2Xxb|j+QzOo3e~+z8
-&L&`Se(wt=p{Im&=<Y#NO2^m$l_3ep5|-s1{_J#?8{&6`<<#UQFwhwDU|e}12A|FW&{uBinhgP3EiA3
-oS3_ahwUeG45K^Gsm0WJ99c2^z}W9u((S`{R1wl;EXfuSn)7}dKZ~?b##}^Rr5B*(+;7yq7L|RUB|*r
-ho3Cr*ieu_%07AypTb0m~w5>xojk%&M<dD8o&v_WCpOpFn0H*wlZXfEPndWJbH%(>o$Hom*U@Fn1Fh*
-qyT8F)lr}UDkQd$u`ZgnZGEwB-LVIN?uF4c|z-goW5l2y=_Bv2C*-*pv1-K!s}qUGO|ciO2?<#eYCVl
-h5Viy|MbGX`S906_VcrMN|JfZY3diI<4ltA<TA@Os+|u@Aw3A6mCAwyDrY>LtVt_kp+(s=(FzuG-E!a
-YO<ghDcnYKZ(Dpl0lWzxN?0&Z8`*@JbLI=aY~aQ#!!o(7d5FcLt-1_ikEEnge1qWR5m-d2(02V)E}Ae
-t|fz50NAGV1iP0?9ve~{PJ2e(E72^ErurR`V3k>@FjvvGjz~!NR23oyY0IDl$yAxL{h})syw3ZDm!S6
-<%6!NVDSDK)r;tTQ5yb*Re#oTXsiIX3ltc^_SnRGYLFp4p4>?DL5mddAYB0NkdZnmPC6&ITvY;SJ8RW
-!t)=gx2DG}q!rAn!cJubY2F<co>)kZ)BVymdkO;?qiG9Ne|l|x`Df(W&C%{fehc(b&1j+?y1b%;D<%~
-k0kpRQ7S`8=UOOdsWh15WM|mjydj<S8;^fV0k~s_qr6hTbi>Ro_FNgI9zRl97+KU1}sYuY{DgNmUv_$
-F)?C4m>vBsnori=AIJLp!Too$d?K)NZh-Qv?+tC@>*ABR^uX)nv%W5$5bOlY@MJ|_iB{n7%^2>b(pf(
-h{i={Z(Q1!wERQJhqX*mU&$P*#S+9sv)3MXp({&GaAjpwpQ<Wa9a$8Q!qzWUo#{bzgRH86t++|m;_RO
-@Pey59+FunWNIKI25s9$7su}mFM4o(zj`Ve<QSs?RBCu)!pf0G$ZP&#!mz;0WNhzGNcq+aZ)yyS#t2T
-LUY9{8cR}Bhh%A>Q1P!ACm;yh1QO?jN1{J{da9J^j$DR3eZR$UOcpxSfP>?+-!<ZV+`fW|er;EucNu6
-t#jwbka{vl#xa^e9F`9#opUj(jOL=&GI~zUZp*1gLuP=zjlMHPx4>Y)XEfXfU?@)9D0k0jH-_mtK}uO
-GXX;tteNe4BVJWsjTPyqL=6mzq{aI$gxTyg`KK4q>DC6n?VRv^(g8rG}M|3Wwv5~>ayz}Ds``+v=#5`
-F?nI7C3SKREwm~WL5FtTs_>v1Z5^)=uh%XUMfQG<o4mv&TDYp06bnnQhP0E7jwVw!WV@vB5(=5B<S_0
-_2T}FLY1Vw_-zs&lu3()6XjOfm_zo3^p%6>wA5`glY^_)4>h#8I(I2fj^CgzG&T-)-obz!)P2UG2hDs
-U)0Pw>a4ar`3znwb4QId=d(>Wt0BXy2y*Tq-8?-fg52;i&A`&BzjMU!!+$MHTs6q2ee5AmKvf2aai>|
-Z;{ww$-^j^6i5$w=sEloaWyFh)}Rj?+mzDm^RP)m72NtHGsUDJYWW6xyqMT<Ts;wTH@4VsdQL37%e*O
-SS5HtEWm+VRohpMua$*)JU{q04mP+*>L70;}#sC($&7>C)Gkp4uILIz|*yiBv_Q?aZMV*|E`~x@UMm6
-IMe%HsmU_LQdb2mfoq5jh@vVz%lRRL#deci*mXh3#?DPDh*Lm*&I9!&_|!nl;q{KV1-TnVH&h<UZ|Xo
-dm!^Qs#H~1z8Y=tgDxZ^@9_P4ymh#E%)#H<1arx=R#l?RBP)h>@6aWAK2mnzTaZCnzC2CF+006s8001
-2T003}la4%nWWo~3|axY_OVRB?;bT4XfV{UYKE^v9(Ty0a_NRs}}uc#e=IJgt6N-ul!va_)a2Adfh2*
-5Gta5y?dx0=?tkyuG>hWqtfZ%<{Gq{jBmOvH`b4c$_`WMw}2WL8Sz*|X_?;)mlGr)T2T>Cy4o)v@^D)
-%np+VoTd+JI}=RsubsKbz9ZNS{yZtQdFII-TZI0UKi^7-QA|H=0)GMV!p1*x)*cR=3ob1PwT3$RL|$-
-$8z1=m#t`)qMsO3wLdHSZeHA%Y}l%)JN31_Z(8$34J<C2)*hd?Wzm-lar0<K98XoWdaV0LHPxyYyGMI
-Me)G-OYKY0^2jXzO7MHqhCoapbY(JI@yON`(?%V2Sqn5eb?R~3`2=TgTKZuKJecM)dVqYi;d(k)I;;~
-;fwOhYZ)w;TAi}q1#ZP}Kk=$d8!palC)JT@CKFKW@2i>kB3D@F98s26{2TGjuqSyanMeP~lJ)N-`cec
-9f1(BX@-H{w;<DM`hPvMyV-nv2cNx|*xbuc~=jccmygaj%bcE7H`77UaqaB2F4LywUD=qO8<;J@?15?
-bH#G97xROMvR2A^={E?`IR;Ab;ms=^rKiSYqaQjFsTAs=|WVs8Fr;~uRf>&)j}T>ti(+zHeI>gtRppo
-YAb#|y?%NA=2{${y%j$nUS1xaUBCTKwN;u{XO;czNY&lFg5W}^RkcOkKPti10I!cPk6x-Chd-RYI=z0
-Yr9U~nK0Cg;5+~=E;!s>1US6Lby?J$bDK6ezUYuVY9|&<(mQb-)=9H4XikE80yGChpQT9c(?(EXvD)V
-+q!1Y3`ijSo-^SrDSqC}xw<o@xCY`AXfTeDu(g%tXosFtE``ba#qmBNlf-^jXZ6tZumKtDf-L@rgMqW
--W}Cb&}FPpYLF`efZSZ6tnZx?VSZeW?1ziInlaOk*j;n=5r>+dpx9_WUzR<=M^-kfHvss<yZ->Ov&@^
-HtG`uKd@gtmkSq#m!oQO|Pil+}$YsC~3=Lz7q3Nfut?(Tjis*^3|$0zGeD7DwpcZ+opZo`Q<)2QX^{L
-Er0FB_hNTvH;(ixiQ?boC4XbT>Hcyr+SyH_Onubv)c?-ROP@*2w^V($pX~3{oRjXnjB@h{@7#=(nxl#
-NB+bv%|CHuP#*So8S-O{fS*dK#Obhy3^zd8t__?pd3aVw#-P^7sHyX9N$&JRKFK7+AL%ZDT0^c(CTN?
-daJH<}N`llT=G3`mCcEsGg?NR;HYxMv9%L+=^#OK^;ZLB%cY35!z({%21ksJKx429BTG4n@qH$xtAA0
-eArj7pBt-}?HaF&Yy_Nt?0PP-2jjm^DeSVY^=Gbb*!YpRfbz-6BmI^x2<@`y8A0b_UEZy+&b+1nltpW
-AqQwEn$>APkIiO?l<@}jR?7tajNYh%`0;(8@pcC->to*Uk2=um@z^gC)C>`dhrIM(l?|I+-YD?aweR^
-0zmkQCl(?ZJ6_@z6?@nueo+=4*3dC?NJwKKWi`q<bm)0lFZXuRXy(r6PX7=v_2&@75YJL4PCA-_Gfw6
-(Y9o^bMpFi8P;(ZTHw)efsnQK92jrFekZMOs+|R^m7eO_ThJYf<%RFcja;79Auagc#Hc5epCSE6)7Cx
-Fdrc1q^U{XvIx*1P?GB>t`2F(Fguq=V-DWs^3t&%iK<|NaS(Nl-5)Zq)ERJ!(w8$a_$o-%#TOz#OlVM
-5wfCyv3$OX)5BI!ViEl(KWFa{~BzsMj<iyQO~a*w4fxQ|jbNZJLKeFf=E1=}apF2ZI>7$FiO>k2os;a
-j}O7(LR7fOXP%)bOu1lxJF4wvFAr%1lmj@q890fNIcFUE?7hQ@g&124+-F2u2q5<MKF(18BwZdHIR9K
-w?DamW)5wHFo-Bwf+wRi@Ld=^a{`dlg&IwnPH|Ly+lJB94;wqP0X^{fG)h^!Btm4)JP|=a@^sQAQ56^
-?@$JAZM3^3<T$`j(j!DTp9;pVj0Rjh#!KxvTQp!x*lA+gQD`IUzfbbe6-QkVQiMv_CKF7W#Py}sd{u}
-ypj}B7}#Cplj$%x_-LMV&%(j$U%8L*joU6B^i3%VSp*WBwVP=p&j;t1Fv4?cm|vLTO>U-F$Mh6i4tMK
-U?^Q9Ge@N2L=GHsJaN?SS@aN5QiI<fADMp*+?n-h27fKozCUNrbHi{mvZ1tz8h4h=!!ccNm!{dqTDl`
-=co(B_ycy6Z42eERaSNZ^*ARhjGgBDQtkJrN_UeeJnPlC+R^WT|3h<<WUlqlCn@J7z<=f6mKyHO=W?$
-VDymq<A_pkawgg^@|1hPqcIaS^lri&c`wX@^Ax)?$CHVle0qbCcsPXqA)}CaC7cN>$|EFo9EZ}F)WSM
-vgHTQctcDxo#NnJG6K(EN|2g%od1Okw*T-C=VQxfJ&fQCT|Hax9W=iBoVa5sz@C{!QeCD)8BN2}Pcxh
-PD;XImq9wk0a7#AQ)5kDYi(fQm(`_%u$Qizz~;bc{m$lx`ScyyRJgLo4sob<nOEZjgOE`3J&f=P%^kz
-vJ5f3(pX(i4^mbf-g%0>;n~&_laTM1D9B(iGxPzN?~ikC$|0gusE`DWf&a4At4$2l*&v;lntc_@g1_2
-!o`#*kemZ+t5j^60aKGb107_9vw1V>>^Sa4#J(4bZ~&kcH2F4IL@TBH;_)Z)34DPDnRfez_0+pt80AA
-$Bj#lgt)>Zxb#%S>sUy6xHIuBIV8%4k%`tr8l?nQMq{GEo{Fbw1P}_FTu%fkVpDDd3ag9;Q7MrFim>`
-Y1v8$|F5fy6=|CHtx)6v-pOn(%5i*0YN|XC>t;*7{q%+K5cz(l6<q#_l1O>HZ%!f%(6mzJ+LBI(Gr41
-y-`T^nd8h##VFCPe+c`b7yqT)gBkWT!{5lUN^kTH{BR5-5*0wLk&QS1%Fv-;SPejJhUct#Z_&QvnYqb
-wr)h8aGE%QT|>W*kvC$vl1?kA|DOaR{Y%!n6!sV4F<TpSuMn5wGEs>k#c@EG{UliKROhB8>8#V0d|p#
-7dayrPm#_$1w`ZLOp=e91uLu@G&AjQ)uv!jp%8dWy1(Otwp9EN2pMN!V$YLA#y3&i-EQ{0FZ%(<s=$m
-kUh~xSbAhoI)U_#5;zK+8Cwo7mJ<>)KOK@}$ppa0JmgXIXX#*Q`rLb7?xTk7gluY976+OLZFHR}^&p_
-sgr|8jn&Q!%wLqGe4|$X*g5#628jeBmEYFt^NNJIL5fn<LUlw|Ygpa*1oGF>gN2PNOUX0`=a=Pvj77a
-NnxeL+WiT|YfN)pTzvn6w4V^{9N4HzPHGB`F&2!UAgRK79!zug0nddo7D!kNhPKpw+P2Q)=j^FZ{xuE
-H}Wq9nen<=G|-%efZY7Pw);ohjU04GX!%d-%!AlC=LOQ1EIB_j3NWg7O$A+05kkZuD)J7%4LyA0K|FX
--J6eDe+S#kC}!C=Qxk@B4cQJ4go6M%0P#33?h8EV9Z7iVPN})#ZAi8$e9Ad=dKghN2%hBgpI06-0Ni|
-JurA;H`H$!tCC<DTu{yz%<IGaeY}gpcR4y{hZ>i^zwE{5PDi5*oQZ1r<TeQd2AP@gi7Hcgfrnp!giBJ
-QC|Ms4ImCJ!1yQwT8kMY}HLA^&q-QkTT#)(BbZLPyag-`3)+Z4edaS!F;!MNKNtsuNohc1X&rLbpS#S
-5$Pq+HA*SLBR57Rs<tz=9m&?e<nWJqL0<h?c_iP=%|cfLSmRk)%@4o$8|o-=SJ!YWop1qVV>8nni72!
-k>>7C|D8^^GV88+t=~HbH+TD5nTOeu&($pAJbHTA!k&&xZ%bVxot8Cdv!LYZUxK81^)YH#EPD!*3|yy
-M7+i<A|Iutl?uPkIU)UG)`3Wh@OzUhu1xMszJLR$(AzQL{lJ<?6dU%Yz+xeiSNmmm<<Ibn&)gtn~Wqv
-K^92nkqP>c>@$LCn2L~I$t^)up)Gu<9baM$rx>PtR5gvAsZ)P0iD+ArM^vAlDvjf|%<+XxDs<2eE9H0
-TgnK5QY*5VMcRku^=s4ZWgWET78606Dyi0^OBvV@vr~~`@!F^9WjPYVt7;8W&Fx>bm2bCRY=Sf_UGEL
-F_P+%Nhb|+#R?3u6~fjfjXd(te{p7@18ceJGgR1koPYe}!Pi6rP@!-y<llsFG-q}wy4X+8~^b6a%(l2
-?H2umC|9Ob8>CHA-f3crg+(>^H-ufsPWUMTA9)U1=1GmU^48pb|!=d^81`6N19k(oHagusA|}{;6FkP
-iKZ2Pev_RhL6YuoPcmBakCnhf&OucJC6|SfojTX?Raz<oGbwsBgTw9TVxUOtsE9|$*ICZ4G*CRah&{d
-TPCK++3(zQ#&ltai-aqCwy(96J)Vy%B_Mp_QeJ`tkD_|QuZkoQU2x<X0MQT<MrfPvamIB*QVp2G@$Fc
-nc3@QBK}Y<qMy_Sj7)rM}JBr)>`Q9JbrVuXq?d@sAYqN0_`*x1-32}Jm5w9PCGb!l++w!^yZh51Maqj
-DS6zl1Ve(aXR?_2@w!isawlalZXbLLmeYZv5XyzoOCKcaB!JXypa!9aXR9#0o^!l=mWuZh#^pYeeKzF
-n5gq|yb)@EUUN)=miu-(r)?QRy6klr|`Fgu5W2J0$IP1}Z?vPv71i#u>WuOSvWPjo^Wlwt!C;9(fK-J
-ev7&+1%5DPFGE)&ZWUbw9$q3;6U5dkPcK4vr+gf8D~%2CFnlR@g+vOKOdAI2h5O0oF!yL{5!mtd3Y@}
-<Waj&#-rh$iPKYfy@|x25P+*2peAr3*qE3jET9b&XIx_BIj;qnHvQht&U{^To%pf1FY2-@-E(e-b+LZ
-zs&2Qr`K6rqd*AK|_3!M>>)H9q?C9|N_{I6<Tk*a4n>qgc{Oo%6)7kmY>d3w{hmOzA-@JG^yF7k1yMB
-3jeD(7D)pK=L#<4m5`tX0I&bgDPXQ!{#RL>8u4}%ujjyb<5mtr=n>Z+g3cDr)DbmHlM`s=~0Z~9_AYs
-<Cjbk@}6;Iuk1>x#Skbvb>$F3W`)W7d7B?q~XW!dbn!n{KL<*V`sdtDml&Y_w2^CeP?+5BuFcT9!TV$
-u-47JQL;sJ?V%iLw&br{vk#&Z#K%TZ5P=`A1n3cRtakkcQiy*o2MZCvyV?`?Ops{{HHxJKn0t>S_-Wn
-ar4-l!RMQ{)em>yY?e#?Bxa|dJ2lT{QnO~MA8l0%E#^w%h>iA83T+tufa-_3c@Qi0zSB<(>wcX+tnH=
-esr8eZc9PGuZ2U>H?n^C$ei+>zQF7k5<;SYobVghz=;_ivV7puww|bGvq*}V`c2h?B>0aef`k`q3AhQ
-NWQ7@Dw>iK$Oo|Rq|9UJSWENivO#TH1N6zi@e_$<}(40<A?lv&rek$&!VW>mx=r7T0^&|&?rE&EMd?=
-TtkqMgZ<4Q`dml<3x2t$tX)TtsFO%x+5LN6{%t(dIBuHTNs^g*(7AH)eMrP8BqYt|TPr#Wk(y9~zGxi
-x3VR4)jLDvRCSTFpi*16vD$G$6^O<?bG63Vm6vyi-D4oM@ePjwJO{4K!~49^R)eZ)ij-XR@%+huNvPp
-FyMoJ%-CqhP^w)d>8UY(XEaKS&`+y(l|EDOMfy(W`F8C(cg2TN+-;OgFDk7W?Zw*ks<#^J(X8UWs&Cm
-S2APAQTx<O#{<^uX=0;w1tZhD);=XK`O{+9HFAoSm3VTm@lyCR2suW#R;_rmQ5N*bpA|udjt)T9Py)A
-p|dAq>zyXxCY{Fg}H?*;wUvG0BF@XS)3{KvL=$&<EGLM8U8^On9-G!Zl{m3xjSR-*0N4u8=-_Kd!Fr-
-!sH#$%8W6d05$<YYtd?$q`l_Q)s@PtQcNIpWb|wzcI=TNWRlkeDLLyYTV)cau7J|IYq;KfS<hrZB&W8
-x?QO%DUOyu4ap(FNQ(Z(%v>TO{FtzXoXhA;LB>E9dI}@{gr}WHjdjK6gz4vD%SIj{(BdKdMh^U#Y5A6
-=qz=ZKMTP<Z@Vcc)21nM2i9na{jp`@_j}^6!@2xmV_<Uy`h+mlk@e^>K8;PVFC%4TmzQ4sczQL=Nw?&
-xZlou(!;NCI-H9<HBlq5c??^0THK38D;`ppC?lk<rx_Wtfay?T6ePx&UPeqn$?EcZqz<WFiHs0`y^kx
-5Uhd(oE4y#Op;<8dyqyOFsaxp#of4Fe2DD<{p`PR#-bv~t5?0GnT&jr|xfBjmDzkkmgt8ekI-<<53Kk
-*X(dK^!kKRFtZ8Vdo*kjQtrD7yF8|Bca44nJ%3?Up>c_$E!hdIH!?Fv-&*r(vBjTguT9r{{l-geyu7;
-A7dIa#<Np(y26}UW}A2-+w|CNu0Rwp;fLI&quPlm<k^rfz){4SdC)w&Xi-)N$a1-Z;pPv_;LsRv!Hu~
-yJO()a1!+=$Df1ha;?T54Slk;XZmMFr&3eq;b}EChG+Wu@H~{C4bPo_15ir?1QY-O00;n48F5VTXvxY
-T3jhEoG5`Q60001RX>c!Jc4cm4Z*nhVXkl_>WppoWVQyz)b!=y0a%o|1ZEs{{Y%Xwl?OI(=<46{L_pc
-~TYt`M7n{kzskkGpiGz&9mX+S`0)KADH1z2P3tnG9UyW0Q0=h`XPEq{d2u+lyZmPuSy_ug~Q{ip)@&7
-1xo@#*lF<5O{Rd~kSrc_==eoE`i_46J?Qy%AUUTAbzaU7SXVILH=S#D(~r{VPtA2+t1>t2CZRWtNM16
-6>@SbFA6%jOcM1moX&&uD|IdTk2e7x1#LPiS?(tEauTtGqrJ+7I@5;SzbLru{h82dVHSisMHH_^H^!@
-nu>DLwS0uB`%=6+crWB^Hie4b<vU_ONyG)MEyRT`bpA~*YEKTbw9Mn172JGRyx+r!5TB#`cX1vkcX|9
-EJ_sNzMVX27$MQZ)*Zza5B)-X`{E=9@&9xRqc3XZ2u#e&~TZws;id-+^qE-(gN)e@tpR*kD57{EVeWa
-mPx_~=`y43kYVL1Hd^ouyr1(1qgbgFZBbH2Js;yHv*;<-)>Euum!X{@-nOdS!B%QX;jltF#P?nj|x%#
--bJIxjFH)Q&XP)*5|*Sig%(!jEV!N$@>DKZ*p=$c^MqF9p`qg^1Hi?LD~17bt|I-;q}0MvGOUZ&!&A4
-OlCFJHGn$?8}wdKm96x+rPNjKfU_;5o^ITW)Z(yQ~a<*3N8e^%A>S=1aK($e0Xv2D<t+m9iJRueI@iq
-$5*F^mzUz`>_Y5|^Zkpf<AX0J`xoN;%f<QG<>8JHms%T&iOfEd8;WnC@*xA03tdKWQq-=0MR*GUOcvr
-k`lb=)xsH)hB0`BQAD<P&Bunoqe<5NC{V3vFk!GbYzUMJ=2iez&F0|PA`bhfujxWX%i=y=R1R=PD_)&
-Zd)kjH|<-Yio6(ueGybswxNf~^QVIYP0a*2_lA8~m4_br>s8xM-rc)VAaRhEePeUwLYBu`N%!m3zBN%
-ANbnJ&mdq5nYMP{L4}mHLme(lCMsggTDy^v@T%T;*vs9PWwY@!<w~-z`_^yj(?fidL!{l{dN~6`Xy~@
-<k=6_C$b6o)NwS0||A$T*g>=72PCyuWB9$K}k=P(N&RB*4;#i6e{L>oJuv8pH|6T1Z*j3y2{RSR4`Qe
-XaLZWrEo7@J>0;+Une6{RIHFe-=ZX5c-{#hr{n7Z9pZ1|od*K_?e0<UcOekn;2CQAZ&D*kP3XVmCN+x
-GD1W<qSWQ@?5xcv-m<70Jz6|iWtMEzRcX3NR<NFj2OeLNbo+ns4!n3N>i~<j-k0ldKPccOzBVWoHmSE
-Wo;}W7%sFUMCG~+dz2`o(@x(g%|Senq-6rzL*-)H!Qbs3OqLWMO@Ep}z4W<qFSv6{j?BN4J3VvNS|eF
-k-KR>9dJG`mnkR-mR=47@0Cp@2vMi3;FYFu}cxdy0EjshPqlaD(1}8_R)0Nh~KGfKo{;msk$2l)^fNb
-qebg)+wx0b>7SZkJwiVA_^i3A_^iQXeY}d=0b>t5DOs|(inId(I?i2(@ISQHCQUJRA7l1!B<R+5vZgL
-9np8tJ_dNG5+kS}(MlD`1(li`QiCOmrbrZ1BYYoWjOZJa3L1yH2_eJy1Sm-LgytrdnmN=6h)M!S>M$i
-Kh)@Clg(TmB6iy3phvLBvwSvU)DeFirNDV9rQUei6J4H9XD-wrFa3&OqP@Z6%3WFRPk=h!KhMEZt(+w
-IcPC)aBa)>@b{fL~P@1TB6xg)D=H+4p8ZUgVV=WXt6e|DumyV4JLrFNHTw--rmWJ8NFU5UzK7rab}G7
-^(jo=dq~x0F^FYPX)ID^05|#5<6rs+&@zCQdhMI#Jb?W_3SUccoqUH$}80AsAJ~$t$s{LR4p6k=;scy
-3)&=+x(f$jpnJjA**?FTf9zl(?8hU2q|lBbyva(AAdn6?0lA$I7AovpDUftb+HE&!Cx?b8|OGgj-}#r
-v&qgZoGCkxsvEHd;Z87-Q<}~-X1OT+1UqV0OQ-q{hc=w^`HEmC2o#JrE%PKw?`pWzEdxJ%;!+z&yr;y
-?6*R(X{aaSQp+FAUX^VD8k=Q<5=w7nAWzS4^<rXfeUVMarOn5<$CAr2B_<ge-1Zqvp&?N^E1T}(w4xX
-}YF3)Hm#_+#KFwDGK=ZHxlRne=OKo25NTaNYQfw5fsE<60FH3BunfqW?f*+Jtz*DGr4>UkXW$E2qg+}
-e~rXGS&ZmH%u6TXMkbUojk}jYt-Sbt3iorkK~Vv9)y`gzNaXtF(SH2;?RX!XBGjaL~>H`^oWaRSSLoZ
-k-1Pja+jtebW&XbFG6wI+lJg6YZ8!dumXGYZPkjy>y!HYu1AGG;AzOHme#`wiX6<rWaLXI~t1Rgj)-*
-mj}U`bGQ4M{3AgV71dP96H(Y?vwe9s+Wl9sM!+jWJ;gzP<qaTE%og`wGG>CNI_g~E?!8VPY&s#xrXJn
-Cu(2y|$N$=eb{FFPS2Fwd(B*!<FcUin>Rs3Dy=Et>5p=D;0tc)bt=EeEHeJAW0^5zAtc7Rffk6=ZHvd
-#(i$|r0#O)(K5Cwkz;dO4TnT{~z#tRWN9N6=aWFGUH9NOq#qZUlG`}SewATc`=-vD18g?1hU&7Q1$d+
-c<(5O?%-&j)7Lv8SZKH#@V<M1!kl%2U2M$XlxHq23C)pO#FgAK2QnUQ4FjI`aelVB;yx{(TUxGhZ=#?
-I>_u%4}`6nb>0lKg@K?**tk6%PgCP%D3bOe!C|rX3Dd6Ia%%^+sybMU276;9R_~DEL!qxf94dcwHZ$_
-YrKdJ4$g?18Om^APod^yraHFxi1cl2SQHeq*%ya)OKqayauBj4H5@30$xW;^2izVH9Z%Z6|0gtgV0*G
-T{kXf739YNLLD0=ace(ldNix9>2c{eJm5XwgTlfwK?bfN91>H!<79!`AW*G?BGM)#agN)^Y+JJ!Dc9r
-)aaEWsJ!9X6k`EL*ezMFsTmfFe#Qwwgl<50s60<(j#Jm6i~ZuLA096@hKvi-=Y44JidTd6-ievDFVnc
-E|HP+M)?4w(H|b%gn|Vq*+}azumHA{Rps0v<r#Ou1G2zb#kEYn;*y^Ss8a4cWNmR;9^VkNf9lec$fvX
-2Kc)&-yl<{mr!}4_vz3@bRafD0H)YyUVEYI9)vE?$Rxz&?jIi?L*M&%5`9Ddv6ohtwvdQBwHf3D(&K7
-#~cLhkV$4`<Icn(2hQ&{-|p4fo$anKTQ=L7*ouPeAn4}%@F7py|73M9*Xt(`ge~6N9Jpr|&IGGQ*IVh
-k&I}@OJ5am#xqaA8`85aK9N^LDcElbI>dCM*-3PgE?B##8@iVc@IEUSzi9wwQ_U!9Y)y?}2dBDq;Z>t
-<tKPz6~59dL5bOQ&fCD8wU5J5NEeT{7ZfraZPj~g4ew5`HcCid~LMIK1UR@=)bIp`DEJ{x~{XKEC@Oq
-^BY@V`O(ooS-r?mu>_ok~OMJl;I}TPv?o<rt`<z%#IIvoEL{NqkNSo$~=tU%rTMxkFXr4YR*x7+)sN@
-?iMln@o4(d-;F!-kUc~oA(pUy9xjHgm_D@<zAQBbw+P^T|Y$2w|ipqo2fpDE$L0?1-$|RnKF<6fLQkh
-h-zv1xQypfa=pxom|mW^uHN#;`e0`^q4zSXRljS!yw>R*y~KW<=(5x~mK;S%p?!n1(B*X+J!nk)bbNX
-CVLBbpK8$~=<`dXlMRzp!wgM98QTo>R{^NPSwO(m^(*Gyk?)|^;9~c+e_u>Nq9bkZ<R1EwVP)h>@6aW
-AK2mnzTaZJeZR+|D00010D001Ze003}la4%nWWo~3|axY_OVRB?;bT4dSZf9e8a%pUAX=80~WMynFaC
-z-qZBN`f7XF@JVO_LpE2XUMka=mfA1D`kQF#+kRsDp*On|6EGMj|<va9{?`<x_>?Zm?{Wv(u&AaY5Z<
-Ky%4oX5^E>Bffphke-nxPQbB_IGxV&UV>{gX5h~Y=P{Cx53VDVs@M-*GU@9*iJT$SyHgW>_5qD7UBB#
-_AX5(QJLjzGE3sLWE042dTQu?nv@Af{vLmiXW2Z?S$4%rhfc^J#bq&x=CPqR$<hLs`8><33n*qMSzh-
-~@;EBvDZ9L{H1?;8a?&-w$5b~Zd%g39iSc*@6;AO@wmqA%Q<5#%X<Wql_jp=+vXiA{o?PC+&DX`7cj#
-g4Fv`ENlVo<CC%5b^gM}q4Gj?)c-ehUxKSDK2F7qhAr>I@!am<SBs{8@N-n0Acj!mMJ<?%ErYV`<2$)
-a@n&n(CI+iaR#-BZ_HI)yuAbs6Wkg^J<FqtEOhE?_D97^iU#Z%*zmXUPPE50Xio7BPzoHmAPgMn`Io3
-^{8IVS5?WSJ8dX;sp0;?(cD4pohs#p=N6|`V6^#9hGE1vN@-LZ(#I2n;{#y8oB8Vf%bIDlC)BLgV^H)
-3gPGvz=~bQ?5>Ef?q)tTK$d;kKmX(S^Eul-`pUj+pPp_Xoqv4~SwtFlk-u6~aythErwm@@QCi-^a40z
-3J>B^OBep;6AMBrhCF}S0&yRM`&e-1ZDcfcz+o$LIJD(4>Pua=m)05+~-A%^M;#h^4g6Rr!8{#Xdyv-
-2FX<SChtf*c8iu4vRa5iN((f1f>p2P_d#Uhl*{C=ez&a(8n@)tvNK;N_EiltfUvmbc^>;Qee>_UsquM
-f~qHhmTf2u10)8B%bD;d{vyRPW8QEce-mtSCwJa2sQ}6oS7M0T+yYK10u<AGUk+`y)wZ!-L{a$NQtVr
-+`d)eHUHFg!Onvm39;5(S&ex7|rJi+&+&kXYo6a2Ap0@aQmXnF0vd2ad8{X*}vFpPlloYxVGgyXAGY5
-71X#JsS%_m@SoC1jU+YFe_UIvCaA3uTM~_aZ=r=~1GFL92yN_(kfRAS>9ZkZX!sCvh!LsT;+_cU62n3
-a3o$IjumOe*Fl+$z1E?Qh=pbBZO;}sQh8Qx$OarJJ;u=E)W@SUVMi@y=bv{HNHK-qs&_Ax!47kSzuws
-Zy>V^t2f+Zt?b67Qk_=x(TX0+IvA)Fe+k}<@`5FbN)3`@qCc?|VqI5{5sl5;eHhEQ`1=fDkzT0W@MjN
-lX>;&OxraRG4waRG4waRG4waWO!HoPeBwoP?Z&oRpQCG1N$iONdK~0mLMRNDPs5jv)bt1Q-%PbpY7_v
-H?^FkPC*Dnh0tFhzAhgg7_B1k$j2dOC(<+`4Y*ONWMh!C6X_Ze2L^MERmW^gjkYBT*62O3z(o=Fczw@
-jG~YHN7i69gTsuG3^_xEASyKzsDbZHkSHaORN`FFFf_!9Atnql0pigh8_;i34^<8PrceX8G4c^kFu;$
-&F$M=184QOQmERU&3d0c(wng%|k9e`5Rue-_Kw>n6W`a0k#0d02HVX)f5FgMreup$28jua>0$aRNbH%
-+kp7$e31)}ysNH2u+j0ow;RAiCRssu#L<1M3}irF5ZAFnO*pegOP)CYB4K2+wg#_Jb%Q1b)v1{HGH6g
-3qz6+0C@6*_Uu7FnQZui~e%ras~<;;DydPml#&vI`o%BpxMVBcdacBRCWJ5eZhrH>}8#2nL(!Bn@Bq<
-%M5f_{HRx7ka2Uw&u~F+2Vy2zuZQXo%<Y*+sWjGWL`*SjU@B;SLiQ5b3gk8N3>9J#NWzNie&ab9FD@5
-P0S0w{FR#+g8V8K?oo-aQsLFQ8#YJ>=hU@DEJyW4Oh+XVHlL9Y+fkhn<59_w;Z%QAv<+2wCRZq`sA{X
-i<5oqHUFxWcb-*hM@fLANRm~NTXfAP4iC2|8kuQ}!5ipfLkuYnBnEdbXP4(#s#bk^2Ve~NyQ3R1S(F7
-4TQ3a7U(M8yB4Y59P5UmCj%z>y#%OlpRc!L<62#J;k;*_xA5t@<sg_yqjG^oFcA$}PQUijsOUw*0m%a
-hmcUtk0DEFO|J*dhI0O8pILgOyns%~%ot`z}r=aq$ir;{QPZRgxDaz#+|h<KgCDz=ggqxZE-Y<Yo|z#
-&kcAaofCA{qRkJc+mYczK+V|du)sFP0l&SpWYQk5~T-GdR^N~^vC^R$pMTQ=k;&dG@x+VaP#2RFm-So
-QYnzm0kRq9va+@T>n!)pL;8HhqqV?g!(t0$6Or{;pd-2{bc-^D`gL0%R*%7=8CJ4DJS7XJ);c4?H<73
-E#M}Gz{3~X`6&tVbvpJ(QyshCY3^1>ZMAzL%7L&AMply1z1>$iQD1^&i40IOMnW&ESRbw~${k*8Cn^)
-`PgMJN2M^B9djS5E$9<IX`a3C8l=1sIk)1zuZG}f$W!O|EgjHy|4G|XBM&DBasTrmr-YE*ewXMr1uKa
-~ZI{O(alfy7+MT-VCfXQ8_4h0l#F)b450*SJ^*4tO(X-%pi$-o{DeLfN$r3uJ47Y|yU|$=iACY81`Yx
-)@1xVqjKe(8fSo5#nuhyj5p(SkT9TUjORAYECe({~A8%MuPjAB~)HSV};X#hmS|DOuG72#)FoJG#}J>
-Ff4eC_f89JzlEh;?T^$Hx(*EmYsi9ZR{`a}Fj!9`QM7eot`qCpshSZ`tREQB*Xx2t<GPS&bE2yB8g=S
-l#e<@qeW3+ExiZ-ZRMAiwx3RCX@KZ5Zuv68M?&3hz9&h7f?o*vlEKlMC(R!<~Su54MLN$rLdO9a6%mr
--<b?j9gJg8s|7U=vcB-k~<ecr}E8t3(yXU1Jv=5{mU&X7?HeL=NS_EmK(P*kNlHFb;L88`kFe#?m(Te
-5Qq>)?jMI$xgXh;)Z^2Xf!E%X)g(wkR}eMCzTXS(zOR`kvbXvm;={Ky{kCWNFRGTWl!X)NpB9zzs`Gi
-)2s2%!DTl{MExWBGlg4#)0rnJa{%?nejD4=E7kc1N(`<oY7X%M`D`=Y0c=uo2|rJT!XgDM1uWslgfgM
-l57?AvfzU5;;SkP`njZA>$>^_M-;3WxQnHmcO4y5jn`kBO`LT>ZijijPb?;#NMnXN2HoW8kT*CmtGtW
-MMcy|^6b2G`iv~Ljrh>rN(J-=LW6c~QI|{l?;VHJU*-%$Mx9n2*(=K{$4%EKe+lf9pJiGc`u;RWe#H|
-J0dUrv_j86BrCt6n4-fCYJGWulFX2D*l>@0Mxaj7vF$xfn*ir$@?bL%M$B<hkeGh^eR%MILSWfcR3^u
--_18WwbYc3-*G@Y(`(yT3Y{VO281=rwR)GoCx=E+?9`(Ow_Trvsf2v$Pb*tF>`)Ep%6FZe6vt&|QyAg
-Jn;F<|1|9)3bCp_a-NGBVyn{uZcF>s2LU~uyMik%}iJ~+I=-b;Xtp5N|g<58~+Xq`j~SgvOl<qfqoM0
-a-!*gxqC7b-P<Rc^V|H_?d{<}p<P%1vMjV~W7o@-s!`9hcotXmEd@_GtQc_LUK<}azGWmAE4$5olm#Z
-=*?p!xdhKvzL0EHkty^e;n$hMQR}O4?X)WlIMpyhnR+hfK{w=4~4h|l+U~w*l&&>zV?gG~(G8f_W{@U
-k4#lukY`cEXQ9LBS=8wKu&m_6R=o7<iR=JrY1;Hry$Kr0J=-haaa-m`)mecc$?3HJJ{pF4bujvfx&ad
-(?vDR|>~pR#0>t8XOy*JJEe@0(h$-mwL5_R?2CUd`#P=_!5T0bOOD{0aH)w;d|M@_wF7qS?hfD-!ym#
-6|W01wfi_j)(Luj7sWT9M3P}^qO9WznH~k8Rrn$i)KaaEAxuDyhx+l7&m^a-%|dqx~E=MM*pkEgjc@z
-KhOJ8zY3_nO~2INg|7}i2ajRgH2YD!B@37MeNerj^k}yiz0mX=yxu=Memfe4<G0}wpAYq06H6U_@C}R
-S;I-k*61Vp+Z%2c{QjZsX9rHOjTif;sKf~}*e!9Na{#^VFm%#Y{P)h>@6aWAK2mnzTaZLWZuPJH?005
-9N001Qb003}la4%nWWo~3|axY_OVRB?;bT4dSZf9q5Wo2t^Z)9a`E^vA6T5WIJI1>J@UoqHX(H2m%B4
-x*Riu;gelWwqS5+o^#ehL(uNrWnrPm-JZ4)@>hq2Bl+$#ohn?gfp&NG3VY%sew3(uQ8V=>DU3hwqP1>
-E!s}@bvPK-kqEs{7F4?UpO!5>R!-U8s3F*5Ya)h5EN$gA^ArbMFBoPJgnky9^^?%^C%Q?PIJuJaca@y
-ILt#x{w}_XC|Qb>l3U6<FfspB<k>t}3Jo?);tU_tWs(*j08HmeTK3OV5#(Y)H|qkittv<*)^ZJ1_c^^
-fcuj0Jn*yS9`VQ?!5naf+8C{4>q+i9N^yDCk^EA9!!Od6M>pk=keF)MobRI@`Y4|{I2o~m)Cv?8f?~}
-OlA5=x*O&X+Y$=Yoy1ZBx>{s_a~(mGkuJcub3i!dwUK}1eLy!b6iA^(sp!rQg%TEz>vBdyLw`jFKezC
-Zm)CnAHT^j^dwg*WG`n<$(^_#~W*I1?0Pw3L0>y<+M}8gf|~LPrVU3wGa<2r({oe-&wl9^yN!)>a|9g
-jl}{a%n%Jxs-yhVf30JL?f*wcRDFho-Qbi3)p*bj|Tw4(MO~e-3VG`;&v6eK)_u3bbR&4*~cr|KmAOf
-_Af5>Pp>||#au9rQN*uA3Lln8!3DvqG>G#x3<to6!;6DIAhG}M_~iKNv$X!``0DiV@{*3uE@+?5_b;x
-F4?dpkU(or-i}SO~!yTeaA!>>xnO!6|6yE~!Apw&Mkq2Rvm9BqAcrzFnE$BY@DiG$m2$4|~V2Lc(Pl{
-ob#CL_i5K)A_rSO*GBzNgC4Us#@zE*UBqT=f!>E}BxjTt5d@s|i8xP<socnj#GC`nS6-X&Qsr+(Ontj
-8Ji-Z0-|L?18F)AvV*r@wDmR9-j$=Hu~RxvY|i=J!Dw%#l1<nFy<F6-3dR7KzBDgCxEoZ)C#AG|R=ey
-g(QM0ih0qJMr6v$X97xbo+ahtsicH`)aw0=lLoqQ?!6?Aa6uLDmZ&g(nTT2_sGLao=N)-YLl?em&*_{
-uY#LM>^UbuiznC8<m)`ShO9`hAA%+Qjb1tM%H6JwI-iL^x%UK^?j~WFgz??yGzr5c40pF{{V;xM4NbY
-rJP&Q;(oD7~o|((oF76m(c%DvhpJ0q*KE|1pE1ep74ozn0l49tZVrW-RAEC`4g1#BXJv4~+Su?JznLx
-wD1B`48P`J-_(WFMe?LrNgeXwSNHpSR3`YVcer8Uw(eB6}{!{aHYN@rw~FtE;(7IyO^VJ5=_d^!xwtj
-Zf7#?8F#b7e9zoC-S9Z!|#zKf9pX2UjDs37#jF*tmpXo}|5mx$ztnAWUbnYC#0uBPlL(M}Ec_QjY*lB
-lJlaA1X#NN@)J9fSDswKKvWWoRDysE*%`9Z!DuG6F`bjihwf?Xqke@Gva_}B{vIL!!eC8%z-R(Lrx{B
-RZhd5%c*EgLI7G?Pq_Q?J}O`YtRZO_(3$LlCX(W4Txyh-$!Co1qD>^6R0kM7X(+z+oY#)?7{&}eKMT^
-&g7p7ikWe{>E=cv1p9N{4f`k({zR^YXc?n;(k{pNHO#FQ%;<?E7V1f55`ftM&hq^K2`q*r`!>41W#<2
-=V+61;U@w{R<6&Te;<)63X`Qw=!j>R2LYB+c6Gce3X(_fwUI3j;J3F5obR9PuK_j%Va07yJszICzc?l
-q%c)p+s0>~Z`GiEF5QE8UF+N~hQS=hjoHM%myuN}Q)?>$1)93LRY>c-j-UdX!y_1<&As8<_1&&R~}A`
-oES314O~I^tSu-v6_{F1GcpVY?B2gYCTYEVm%f$09{dd%GJt5`!la{#53Z=8!LubjlO}b=cLX-J5#us
-2ZLC^D;DY~=sG>Oj=pC^YZwbWOOMi`#ynTm18zsb&aWS?NZj=d&)e0CyZTBTjsqRptU`6Q(lysCaJ3r
-k>xmqgvDfq5H^#Wp!>cw#MS3=gPuJQJg-tb4@uO!YtE1p|pgt=T^}X60W3FD0d9?tBIv?0IuPYCf{`z
-z8`JjuJABaMCCMpXytc539P}W}igrL_XorBt0UPukI8qJ!h*PgE2)T^@Z4qcUX0(GD5sQ9k013cRTyC
-Rv^aBXa3Mbh_%A6|`mr1i`*vycB}9N2qtZ4GO*b8Y|Tm7~MvfnNFjM*m-*2kPX#X*KfdILb8+de2Bdx
-Hs~KiMsOp2AJ>ahhkP-L!Z)^tFH_5yrQB|de0QV02XxBgL=LBjZWTh!Zl`w<iHG`u21cnbz?ffvn^1U
-ulcO%f?}k+SW}IvOjIB16j6z4-#u+kV?q60+~j~6oGW49HSHNH4{D~l<&bHC8KLsYsY$6j)VDb1dM#1
-=8)oG~J-OyzkG#rI-hk9FytKfMLYsY^|MG4`LG8z8+!a9WBx}HWIMCV9VOYz8o=p6~Fg_cAYYZq7eb=
-mrwL^A}I6C`!u~L)TFf9x8^Pjo*buA<l%u$oOleSB1i$rxwSB|tr&46lE*`$UUW-DI$+%Uq}{)xpF==
->4JUJG7jhaQc77Mz-SZq*t+jJofg`$AVe=x4tp54e$uwa)fF)GjAOtp)vL*v|e<;>_lNHFPmo&ka3<E
-e_Q00cI5Hd-tlWpIQ}(TbkM~n90;ZqWP8Udj~GZ_Se>1=Oph;bSshkX3>~yP~G+O%W%J?@g~FCWxdS?
-v-&z}q6wukfoq>TqF_^Gp96F|bcQ;1XI8<flZpx6%7abbx6R(bL6?X9^`IVc6nVPu{UCPLXsyQfvSHh
-B(7*e1?-2$EI_4(Ed)GpHz1!N_R#_HwN5QN^eV4|89pU<a|CVc6U~d_AiS4G+`2B#lKsIMV1Mr-ycX$
-3Cc`bnL1lq}_t%dI|Bc+TrPmZmjE0|kzusH(Vjym1()mI1a72cA>&2Bs~57hcFD$@6~Y#O!dfn9yRe+
-`$)n=~`)Nq4$sL0>BM?HvCVUwQuL0bV=RtEI)e3H5sk|8$66wqEUexkr7kp}JCFDc?0-$d?|_m8ao12
-$-)t6w~tcGMop|^)ksq`KrWq@s2&_dONeJd<&zP^+kx~wTSQJE9BRa$a9fm%25zy!mX{#M1CCy4*~<f
-9ABQjnNG*EH<MqA@d!Fs!JQm?Ss3xsb^hfzpUU^vw)3|4CAa^)yD)8$JZ5jCeVZKqH&9Ch1QY-O00;n
-48F5UHW~~^#2><|5EC2u|0001RX>c!Jc4cm4Z*nhVXkl_>WppoWVQyz=Wnyw=cWrNEWo#~RdDU85Pvb
-}ye)q39n$`$fax<=S5)xXYRiHyRT5bv;)K8H~3b5MP8QW<(JDUH#-?8Jke9H~?VJTH?SDiZNJJ%{BfA
-~=UN5_M&XP0z-b~3oU8PM_h)yco9f%b#(fo`7_U4`zG>pLEu1QSJWL>Iw-T+egp&Ub&RFv86E*$E>R(
-?rE;90wtdL3&_h9L{_<c0u+<{Zw8sRUrkB6xXl@{qpa|eF=QX@?+;|hKcJSjNQPGXdEghRug)dCp@am
-olt?{bPndvG3}pxBxzY~u&5<JpuXqPkZB_tsz`-D)g;A!0^y<iFoQ<>(Z{0%-GvkWpljEA3f&j_L{p%
-mIH2o!{2cfR#m(~^-SGmR50)AxHdzn^(X-?G&NH0`;e(2*bhQ7kj|=m`;GX*sI^mpc{}?JoQScbQLd(
-xI4`wuWd<xaXjZ&<zV@!@e`6CFi{w0{Wk8>WH`4iZNO%SW_CCXgz_41C+RRp!^tMXL{2-mX*&mCj&xj
-R;Vq{xYA%45-UZuV0Ka<c#eJ;2^!|9mFpVxDDlaA1VwfyksSIGWIx_MMpVBN(Q<@FPIa$%AXdY~?|%3
-35#*<oXHQXE+i!U<gHD5uEg(Xcno*nP-9nXzBj!_S@CnE%h(I(|vz9>|fq~{|s8V4YLS_l#}~1^;|H9
-R-xm^a{vc}i^1^Z8&>p>&(6<ozcc#Nv)jwT%?+Ji4XIDp{o(D|$=!K>NY{76>#Li=0sO2~W@0vGospL
-&egw;x0G31wIj$F_s(*)jBLMU!^z8gpaPwFp=O*MJN~ZIzeCP%KQ=%`H<Ocmr?j!j@Y|?A!B6bkU74L
-#e?q3rbG(Iq?EkNY>KRmeL2Fp*~N3cHif*>^MIEZ2<z35}DC55m)3EL7xcQ+Vm`lG?+mkmqP2Lp^{yM
-2`AXpoj5XN=&9(m<F+GspAhGzpMjP>|Fw#0>`whgqzC#R-QNIKb7e^Q8V5s(2Rq$*_Gy(fs8BeD|j_e
-;m)8G(;2DOO_8RF)D2K8ibQ%p*$iB>D*&{_pUz)UZYO}KoQvf(+pBLBbCR+B?F9-GM&2MbL%{K>d3f1
-yW|xkMBH$6do{Wmei;l$7yWDcllBeFn49%h?L84ZVr{{uzB3!aY;5x_o!LlcBhAfvGaEZaL!F*UJz>%
-zu3ZcF5?3BOM8|WdYYHLIc^v%^YkE+qn<~|^3_1jf1dDD5)3|mHO<_rNu;{k16y36MZ8xH6FVM6h@vs
-FJEE%j?ERosrGsZz9EJ*G#Eyg>zhqtKJOW1UPrqh8Wi!%<xAZsx@T)V6!E7ird4L03IG>4WUBw_$cNC
-1}>-$PQ1*<zX1K|e(2`<^Kw4oQm+dI5SUY)HXIVwg~&1-UI&1NSz14-5t4WMZ}!GXXP!s{}Jx(;%Bo2
-T2m9#H6rz0t+OMV-bi2kRkXn#vKB>tROQvGz|fmf)^)?pf$&$#H4LuA>i8Fc^-^ywiIY=7_tr3ARGu-
-UktR^xjYFX8xm|t!eRn5vcVLcI#3Hjq|HKs8gz!Vc@cVxi69vUlwc;|Rtet-z?ATh<ayXfw)h!L;7*B
-9Fo@W%U;u~&TM)5>SQ4BHD-+ZsVkAJo1}7fJGl3Rr8^mD?LlG=ZY#_nRpaRD$j7Wse(Lx-XBFP%Tw(5
-0~XfQr<WxC)Rl+_!Yi-H(iMx_3lDSxb@BQUUj$M~ZgqGYy()aQELgO+8r@_D32tFZW>-RlaT4;7~Msp
-QW(u)2pl?W-r0Rcvbo3QSv~{k!pPa6BB`kIws-Uq=^LUk2w%`Lj&BrpemTbR7DlBSO&O0o!C2>4Qk7`
-I?f*q=`k7%d54RV@ji5()uPB%@7MnIcICx#1g1JQheGOfn7vkC)()<#0Chg-4LW~<wCHLSyvXUTeU$I
-iP*&kvfu$*_d+IFn5#72!3%QvE0@2yNLjXlFlB?xDw>_+AP@2cfu#*JNqYB4WLsD|0^JKzlTwXDxhaC
-CdXUZu%^z=wgT_dd8=w$oX8ei`^hjvV#vJX2UXZ0|%nO`hEo+`goRdqGYhq%FK&)(5;nynsCIzKz+j3
-1@*LKPUy)AMfuSnapwQ(S{YM^@~+jc~KHm-_;qIK3F5DTxDqaahaAsfpGsxsFisLu(x#FL`4&HtSjiX
-PXkpV#BODz2=F8|K0){e@<O3{$=*6ucnTASfqMEdp7RR~)O$1fhFj-A=dxf^rVjRitz-55I*Cas=D#&
-aw%Cj>TSDJ;SAM1hQBYSIH}$pz>B52UZ~tYz;+z6sT0B>dBxf_SVEfIR~<R(AF^IhhEJKqQ(oG;90vb
-6nBWKB1XCHtv)MPn^CraEZ97I7EA5r0!<+f^omp$4{N-TFB2set68NYjny*NHzV89tNXD2+<fSN9|T1
-!G#zRi7;J~2_Kl@lX>*V3uYJYWzwCW8dGXA{LYK1M8c7`F5x1)8i1ZgwQMJLg%~&O|+KMk_nip1Qz#0
-U0qr7HxX+8=)4t7RRUy(Ak^lYdXv6UC<SQwU8af%)&?*Mr;=$MT9oqsDEl>f<5l+jd~3pS|kNxI2&qg
-E|q)ahCmkNLk!iXJg^ZadjPm`#zd%gi${Kaiysd3z*Ur87t!iefd&D$;u)$d8y+SFT>V+#BC~T3;ov=
-~PfK;@g^0uKVSkx-7dk7mB8_%yQzCH(g76S{^j@S1)Pmhd(_AswwpzHds%zDk3VUH2uVs*MTgo_5U|6
-wzloVX9F)3rL8(_z88YB4WwBNCSm5eQbACz!<Kfh6IVTv8g}Jd+eRwrFI&|;uv*;LdZD^>4T9?Kv%}6
-*m0sSN%4wcI8F_`@B>T6p!Ny+LeN$^dP!1`*tmGN0*`TiWHNPEffj}0P<_Pk7P(bj`HYjGJzR9kLgI$
-li4Ut&fDXUveZmsvXK@~x^wdA(RMk{gfZeA$HK~Z{*7jlSoX`8dHN7|5$o2&HxJ5&9>kk{=>F1$N}{|
-^ST$UrOyi>F}AET>L!WO2}ZvkKLkxLtN^m<v^<wDZ9>@)}jBBFNe5hvAxvq@PsvtZdqwH`<-wq{7w=>
-ITavruuVYddHtn+`B%1pY=^Wgz7c@lHyPL+aTKGZ_q|@Fbcwn3P&%_bnl27zvkkPLH4HnMc;(KeE@kJ
-y1%fZ^5H{58PBKg*zrcwAaePmiBZU(q=DQz=ymynjD+fkQqz(0pZHtNk*DHVg&;X~yhxcD!brs<-+57
-(`0Z8uMD4ePBKuAavwNwEd#3S^@n29&0|XQR000O8Q5kVe!@*U6)d~OrFfjlCDF6TfaA|NaUv_0~WN&
-gWV`yP=WMy<OY+-I^XmxI9VRC6<Zf$R5Wo#~RdF@(VZ`(Q&eb=uT+~T4w;O3H)KU3^Onwzx2rb&>bDE
-bsAHj@Zfk-U=J)VtXKzK515k`nDWw_fZnur*Xm;&6E8%$X4#=+!I#Kl*U=@#Kt7PY#dHu8!!#>G|PbX
-^rix;1yjzNIK8s`#6mfI?QI0;(|VBe~*(S!u8|hB8{g}ndLN1VwsjSh0R`|r=Fy78Dr+}^1Dp3xy&iM
-qtfFO_GhvzrqNtlZsRO1aGB4ue02fGbdlxN{b??vQqJghx$@XuD$13w`4US#l=SBCE%C`@3>RMWJvvA
-dx>U9WUCKh{-{q`|<S<LiJic8Z%s0i`ecU1X9OZw|MV#E{@guz>AS|iO=wewuWN95gs7m77Jj$1fwYy
-wODzdxs3BcadGF#9zN-3AKxTxHNh?1go_FI-?{$n<a@0RM;BAp=|g}RjaW1%_xc=m-(WdWr0QKm9SG#
-888B%WgOX*`u_At@?ouI?2NhN)u(<f;Zj#~IwO*nLkj#<*JhyUYvRA+g8xYPH86A=huBQsGB7=W60xf
-L>C9Y~*_8o|gg>>5SrZ<@N#G;{*;7=o4f`w~`ixyjvtacz`W^J-PmL{^gnu&c4ytgUic<v+Hl~VGE`)
-iu_fc;>S58I3q-rM`^hPa5(sUbb0s*GY&qSoSs~NQ|OORuFsCHuITvuk`CzN;PU$9@XP7JC0%^Eyg0u
-)+9SG>Qd6wR^pV_9d<U108JL{OGK!O;3jG_>TL54(qlf6bM4G2EhN37!iOiQT%3+eF_p5j@#Sr?Q;yX
-&SvPVyO4DCRDo$SJk$!`y$pYHW&z+n`ne<Vo36{a7@cW`~2WLe&$4_Q$v)6WN(%LM1_9S<2N`f`Ok>;
-BQv+3#C6l~(~Ai@{*ODyuA^=|hx9Q;4Uigs><UQIafamdQc|Nb(1CqXeU5R>~jc%0nL>km@+Pm%m-ga
-*?O2+u=SH%g0;zeKTLA({d425?#4&T;9qRso?A>%V(>JVxJf)d7|(gYDlQ_`8<Z@b#$A^{ooYdQgQQX
-k={pGI#q_(*?Eovg(dxk-UNuPx82eAo)dw1_5wHlL%HF~P1yUHL%9*kjp%K6talSuXh@8E)MwCPAKw5
-P3Y_D*KfyW1LVPQ`aEN;x->?f|*B|u)>f`1JH~Y#!9U~ay=wsp#hC_U-=+|JW5D-@6FcfgcF`3{{;G5
-&V01^TMfpb!0%0|tBa~cDIz{OA*D?`Pz3JDH4CJk{tRL<2T?nl4}lO7*392|$h5#s3M7~mM<7~vS>fZ
-Ygo2$zpwH-g=$4+kR{j$k-~;RuE!7>;2$hT#~7V;GL%a16UK?8dMg!)^?_34?<P3@0$0z;FV?2@EGNo
-FFXad;;Uiq$e1|fiM`zWPs10QZ@hwBQ-e0F~Tv%fot#~RLmezfH1*f%%MeaAwaSK;Q|~95F7|a*Z>D0
-3&k|T5Fl0vOcI!+GSgS*m?+ekA{VwH76~~VKr{mR7fKuh7$|{&JOa4_!V%DgP+|hnG*pw7Eyf@`0Z|1
-sR%yayFe>^A0Sw1#5a|Tl0;?0?(^y@Dm$6bIY(PAL*g!zK0%{bHCAtR&V5l6a5THf@ISVE0P=$&~LS6
-HwN`kjR@D!&UHvjJ?|IuzD{-?XipX?&Ki3IH~qDoP95>+)j=qAH0x`}E6yXhuj)lF0#|J%BWY82gW(y
-zP8pzbCLji|dxXmu0SD6l$+th$NnEF)hx>A$#}V6%%KQ;FWH;CD_|Vn12Pzb#}smBl_p#(u^9yEw;wY
-QTj(HtFw;!r|DAb0+$h!C+4eMW}{ziBWs1`p5Rh<4Io)r}7?~By4$Y3%17?oBSFyt?o2R?<=^f%duX#
-@xz}P4}3R;=Z>h|@zr_tQRjgf^iAg0wQ-@o+3E}uV7)*85ja)|_!<P<K@eI9#BLDq3W1+{vo?3`Yf4#
--){7u~CT{!VAP~-XH#b$jM9o2U?M2XDr5*QL4t#px^@_q$h2|h!$HBG;Ivlix+eK#1SdA>uer?a2val
-6`uvS^MCb#(4=e*`%jS}0dJcGcE*j7Jx>O^PaMYXUA%bHqfcL&}Y)7Px7mls##MkV?+;j52ls&SJN#U
-=#yYIZjeP6onScA>4r?GZeqL?4E(N~&rUKi>~51SZOMzN@%-&-5Z)3mXt@(x0a%@*eL**{uarkIbqC_
-H)mLEfDB@n;uk!!J9yLfuLK7qRC2Cb#?~A`mw&tEcoIV&NIO1(yj%kD{o$96S}~xZQ{1OvQ{FuaA^d)
-t%XW;+*;q93u|1|->g2{#dE=|V^(F>lS%jA&|0^0wKfYcelm4yK{U+pMuoiYMBKu#%Uzn$fnmC;1(Sc
-#bCsyBc9jKJ@nNs6344EL_rzW3pt@nQps#fIVND&fx(~P;qTTdF-wwrS-dx$y?_{^$WI;cP+N<kt(+z
-Y^G$UIf;GQ!Jfv~b|o)D%QxwUS!FX2sBUdzD?m1yEI)fP56XIAW99hj-2al@JihiNq0jlobqT(xIi2d
-q)PHny?xE`p!dfvE-4?ac2Yy<X_7EOv^(bbeEFVe|aa{aI^7BQTGiT_G@u)H*O6h{nRjWa+^CJ;0TzJ
-Fz=`C1sm^Tk))!%B)GojdmLd2co+gx5mQOh;|ql{jo+7dR2q1;=;yaA?U8itpB+a%oYgj9P`$dtH%1#
-CR(enW8Y+`g+TBAP3?tEv~GUvIxzjx%YmD$E+aN4foS41I=5Fd?L$}yyjiey;C3TFA2kAQJq7h|0iy$
-hzzv5r%LO(_n_)XFS45pG7=Oa?-mXTsC+bnFD;plVYjq1tp9kFOetHLNRB1Q}ovBV1y5;KX!0^Lb<8>
-{x5!k$M%7UjBTn@VJ%*9Y=K?_Ik1nnKU*^Rl>87x2Fm4y>^n*);tv%0B?It$&NXyWv9U`s17eoYnFPh
-#dwHA!tku-P|NAe{BwmeS!MbU4s}yOZ4A$%d}%dwdu?9Ua)ak9IAD-YmF}x4>5e>pQd^SW^oIYP*rK&
-YE3rws<<bA2-3Q+Y{SLwDZ$$a;<9QO{#3Q87;V3us9Gsw;yopnp+s!&qj;H?LVGpBkv#(4gy!B?Oj4$
-OkI}Uvhk~s83%gMtpOLu+G;cpDLYPKO?3NqJFS7R4BIMebKvU0N@H8|>pIfLYGj^Og@Zu%LSbEbbii8
-wx7(WM*{Gw}e<Sf%om)ai*n!J(cR%PNa8Wr~aJg=$i+4tw{eiC*w%Z@HipkxF*!*|F+h@D@)z&4=#n8
-=!jVAEz0o#gurWX8Cakc4g`y2$mXF~gd>POIo&`yo}cVl<Gu2uqHtjsy<%6csVdj;R0MSb^zHhdd_?R
-qVOZd6?@ZWNOHr15jG5y85j63jWXv*F&~)n71t?Spx*HfEu%1H(yM-j;*6LH%ZD^L~PUH{l-v(QEaF>
-P?y5Wa`bVo5yJWdY?AG3EETB=IW*2nR*2RbILsafoa_rAXcX3avo2k<Yt}~v3hypX7$25?AhL=uind8
-S^Xj9{6?nt>V58;M3$w@VRD@>WKY8^WO<WDj}rHPIk`H2Hy#fr@5C>w@dQgQqI)&=y20_f7yL5_zP8>
-(dp7*dude-9gb#?b?5TLCa6U)CzW`860|XQR000O8Q5kVeA`j9(@(KU|8Y}<+Bme*aaA|NaUv_0~WN&
-gWV`yP=WMy<OY+-I^bZB8|ZEs{{Y%Xwl#aeA|qev3|&aY_g=roDMc<IKm<BaY@CY#Jgmp3IDt>#li>`
-sCfgAee`_)hoV?<t_^YK#*nbJ`n(fqtoa>Z$7LBE!3P{r|+L<IkrT;_US3_~PbRd^)>4`iIys_MP`m+
-&*b>na7WD8YSW=n`sdj;yn9ToFoyR=ksM6Popx+#Waa^T8b&g3_LUSG>yv`Gk??HbdoJ}F0uzv_Q=He
-3tbk|XrY<dI7<sW=8G(^9w1m;WqI8`&2?1jnYdq764zBlImueApz5g<J4d@hPA2;h(K~z~4wFP&)7U~
->>q6(>^sKhzC`-#czF)%3onrR@Ekc|}`Jdt{P9F1kE<Ok#EJc}#t5x}wrH%cdDv9s&C|?n454qN&$R5
-h?0QOO=vZa_tsmS##E^6^0q7+d&`!&lkf1b_ahZQv~(;3Vm)TPenh2ik?#TRj=3m_Grb*gh%bG5ur;w
-dJd#Z#RYT116dP+Re2nK~gLHw_SRl0kgM?nj|x^poyyIxo;7)Ib_-jYMC-*E>;3_~Fe3P22_Ol}O-?+
-{_&GQeZ8ei8!sqK7o7OKp+hLj<6E<S}Y6wuuObNz*zCe>Fw{AUv9<W#aHpi;q~?5#qHOR7z?J+3;)%U
-;`st0I1{ickJ54l;1F<re0}sgW*mMxJv+VqO6X5cZ!eB-Zp6vuwKx=4hu62KM_<kkuf^4u>#NI~<AD%
-2S{sUq%s!G^iXR|yo`K1kE~7XpYSX{My#)X!Gw~FC({S@t$A~BqVTmkOukvA%rH_@pm|_Y2DB=f^W~D
-E_=P_aj(YNMZNU{F)5%kl6FZLt`Md_ajTyTTwC-DPBpCnn9`{Gkplr;4G5OV`1W$;0UffVA)4O%w+6U
-P_7ZJAWwc@V7j_73W0l_g^O6y?zr!Bf<Muq>8QlB~om(*+qQ^bf=h1q_8*sehD}gdrrr)p7Kwf4$b_G
-Eb}K@IVx+`90+BESBlCTt;<>R-#*x_qrk#oPE#oSv64|hyW{j;x)PJAxo0%dyG-JE|y7IIT})8L>RIU
-di9h7`618d@M;pzV|pwi#Gw{D@_ctdqK=GpNEwR-iMx&N6Mf*_p5Ba9K;5_5WsVh&e(`s)<AEH1yK~r
-kF9bXnyh2R>Nn#|43H_frNsJ;f%HQtXEGDec$bIF@V1#pwGr%*o4RP+_S^8o^_vqiJ{(YPiA90LRR$_
-*MC->33kLF3>3tYtnQzgVoh?+>8xS!Dda3h+%8jTnYeKA%zF<jC;v`Z342+_VTeFaofj-du90?Zljqg
-_>EMu8_LBMiYKG>b9NkTC(B@WO<qVK@+}U^6#kpn;tVc4E=u#BdlRV5kBr1w;yn6i_HhZ5XSF6Wl9|S
-IYO4f;<HiCWHaH_vslE6(%Z7R5Tb9LnsL`DTI;`V?rnh_aGn~0SqQq0{~o62f&XhoN$F80VfMgKpKK}
-C>mni9{Tpiz9)ugAd4vehPVQvs0LvIkvqgdfp#KOks|bsNFbQQ5`X~Gghok7&@n;>*-it&i5Sv}K1pb
-ZZW;%{BV0!z1b_&HJsQzT<|xvJbBH!@AVShc+<+6bsUdiPPzAJVNC+s(K$IBL6<UcPLbV40#EBq{xQ=
-j+Ngz3w#*jebU_@jPQDhq?j_8WXV~SO}LNG#GfeQt`6a*`fX;zQ7OKImEbyZ?g4N9J@#MV;ie=c=8)x
-`l!4E~1phd4)S-II#<P1Il%?vHFg;&{jgj0d3{kEt7(u@rnN{gZ<L5klRmenj@g?#D+2gJ2j!_$^ZDS
-(HB3NGb6l9R0940vz?#{_-Pe+iaf~v|Y8R`dKxtvbn3DRC5N^2<pQM;8R{g5H?e5VXC_Gf_7?+!Dy8g
-9#v_SReR9<25ht>1Qzo8p`62vRIJYn8;wERXzZ4a_OR8x5rJX|q=UxQ&9ADt^Xw$q4v`f}vLRKr_p+l
-uupESb7m4c8sTvbyE4C7#m`2%h&Y71?XZP^9KG(vqb*I(O{ZeD_EU2(WVZ3i6l<PKe)0$xQbt6$Ra%C
-e%HR4U1XRKF^)UMBEJ9Yh#hJ$qkCf=oEaj-1{&OGOTqZe#s8Ob60wGk1t_ZFFFI1d;CgTo*RH?XkAf$
-MF)w2VKx@erCw44F>jGK-*Je~sHSONQqk)56yV52}y}@%q@cIVx;5+2@WI6w}QoyXkd3E1P@Im20BG0
-+mecdPWLtKImpe*^uk{-K<U%rR{3ut8Sh5O<B2#L?g}JK8zNNz!+l_kgC1Fwe@?we=V}LV3JAbn++vs
-?F}1B4KDL6n^w<oZD>=>E3((~E-o)*nhgJZE%I#4y<@f`PqousvNmO*Zp=FQfM*7qWVvvAZTAHeAchC
-K3hi#8p26TmqD}EUN7+aSI#{Ym3>hdlE3e1mIxEiJsC>IOTeFN~-L{aMAbp$6`L6t&<!c;R<}I0)>9D
-2L(rgaT47OXhT{JK2Z%9<FMz=C>_eSFptFGe(yGXiT*eVWeCNhMYD6A>vrH5mJ%{6_zzs!TjtIoi;<*
-toEj;^~qtNu!rbMX9{lm<b_Jiu#ZUNM<{!^R`carOmX8%f8oU;~=QjbUrEyAR8zUAA`H9N~~?jWBq&T
-L+B*H=)_JU`5&x<JFopabUE$bqM!|Ykk;0b@oP{eT}}r=j)QkrL!8l6~W8?XB-#@^7_;r5<V-iw?cW%
-;dPy8D^j;Yu_d-mHO=nK5p-)6_vmZ$?8N@yk-l9iMp@Vuuz3gGf&=%ZD{M9JO2kA&jewV+ZJ}wpf|ja
-RA>gk&_MME!rfkL6qiigCW@*@F*Dsr6q@LqhdwE8(??-mOSl{xheZkdcmXF=9`rcgD;=qk|UMq86l+$
-mF*m5n%cEW}@;B}%&t@bt44(~4dz}AVI--=$01Ea-eCc6u|3EybvNzUunD%*)$Auub!_||H%FMu}b^B
-8H~T>G?JPM+t%vvTdbvDMAXaBCD#yx#K~w)O&l0k*}SEqdJ|oWGuS-dL>Gm!qQD+N@T$*fu^_Y@&@yJ
-Ax(Ew;e2ycqOzwojsBGN(5$WRXz5ZiiDRs%IDj=?9T`5e%SQB(EbHO`L5=m!@iBf?#po#iK^Af-_pAo
-v6lnOdl#}|PxUYNPzQl=B$wTdjs93^-&|{*-Kxw+y~}}Vll7Y`m;TzA^kh%$t>@mZ<@T8^rnl8fp8Y$
-XmCCaL7yV3$6F388CmOnD@D|V3KC;!uYXxh!Wj<iNFYJxa7nv0TQ-fH5U0?M1#}V*c_ZD7IjDvpCp5N
-XaFKo9Lbp-rOk-3K8O#+N>?T*M}a8uEzxB%0^E7ez-u%1%+O5lGlSucY^UMv44B(BGVBjAmZ$O{|Aer
-3lifzLy&t<pB_INKTE{AGKaW8GsvABlhYTIka1ZC>qt)b?bgpXR{*?~!$|E}{*uJpUsEZxry_3AWhye
-<A4Z<2?yQb_Tn5uR^emdClf(_g_xbn>ctasV{h8i`Tx_>FW`&>op%`(WeRKvxI+pLcFI>)b7gcE~D?X
-?&i_r{ekHFe#@u93;Nb?MxQ%iWSPf5XfXfSp&C`L7V$Jn?iN`Q(>D@#)hDhP8Vn|iKEJ3&{i*fhPN$F
-b1?OF&%TnhUauOwl_6@K?mv?D2*XZ~KpgsWAFI8s(h0ExXI^Gk2_rCWZ@4rw>0|XQR000O8Q5kVewKB
-tG$O-@eUMm0qCjbBdaA|NaUv_0~WN&gWV`yP=WMy<OY+-I^bairTX>(|8Z)9a`E^v9>TFq|TND{vDDG
-HNAk_GKyH!WFmum{IuXN+-d!*(#p$)KgSO@t-|l1idk>}%|M?0s*u54K-ZY<4w&6vdg-hM+|@tE;QN`
-l`C9=mqWkZHH#rJWd}DXj$IxO!SENV&EUWJ$`q3PG_e_$LH6_^!DuH=r<Y?_FmA<qoRvEeu&d3p`&cB
-C@$!I_D7r~5$>O!mT5eT$}Fc@605Y-rl?)dOg&BGGRDkb)Mu4s3zbuLPi2oz$e*jSm_-Z4)W%s_;5J`
-md36KDbeZMr@ma2-QqAdZRcY)l73EsjVuht1OL}$mn#6QEfr?)7T{=t>y3(=*U8zFlpVfTr$x)V;d3?
-8oo3D!32N)rGALXCuGEN@y_=$E17M4_Ibh#=Yv$T@<^Iv~F{P~}p-bTfz|Nc9L(9JUc6c>+l7Nrl%=s
-^L<xk_rVfNK)p<x#%U5Z~uYQIXx3U*N?XT4hU`MJeTK9v5p{fLcjWI{!J#G5-k+xL@g^WjcrN+Qm}kP
-lW;e-T4PPQw7|jcPdpmT)$l2CGiZC&*GU%3q?^u3q4jmT3AoCA=kAbbdo`R6^b{cVm#Mte^z;c5t6&Y
-tX6CE3B-66mD+xUexWD6hS4iZ5W3vV-0g+HdOD{#t<*juP`H3XIQj(~q&r2+LftPD9~vM_zn|Xxdhy|
-g4$nW*?}t}chvzpR-#`{&!BYf#ttoz5fUk3cS9z3{D;N$1?~kvJe#MN#x2I>PHy^e2C#N^($Jf_%a&b
-k6ba{Anb9(gQ?C^>%KU`g2Tp#ZeT`OfE)?oI5+(3K}l}{OvoU1a5lVa`qM})V4fyta6qt6Oqo~ao0qX
-_x5SbbLvlPrCx{KXUt=o^afDa}fszT`2u1FCkS3oSOjJ~Cvs>(fX;C`vyi2*EX`pTzf2eUfBZ?$g_>D
-7EPOL(C1N5W$WJ13~oR`f#uWy`basU$(43FFYugqtU@S2eX7`k5L}YK%Qbvgk`ael4M2mOcmNeQeVLv
-O&CqHQhhBe4SUdlP{+u+pRZK8%+qQ(JfLFrbO*h!7Rz*2E~7O?E7gt4J5_-S%)Vs#yqYKvC_qL}wS7m
-%Bou|k0)?1vqPs*LcxTX-j&AF;*J3x>MUM1@9Q~bMdGO5tk@NpW0m;y(aNnmroZ%GrI7brKV~pYX2+z
-lXPeR}8=eXX}*V6ZBZ-R#y+}pzh2!}$`7N2??O2!!5gM!g`g9U^MQlFS4Fo|#qTuWFa^>ZkYSU_N9!o
-9#f>3b+32~)<nAqW#D5v&o~8YmfIY^0TH<+9%bF$sLJKgBu0xsP*<bA)pbXNXhc6gVLVSH&1|W5|smH
-`WTUx)?(c{)#aK0hSm+Fu*ld7qCLWe}UD+2(kcF0AK-}L@<Ve5hegx0WbxkAb_p_@&cfWKtIC-pe^<=
-VGs9+k^sO0Q4@%gM^pF<H)sk$L_q{NLre~J==2ySBQmHDzCd^dfEEB(06QVI3sSEHCGeM~01$Z41WGh
-Fw8;RErT}sZMTnHp9GGhJp<GO1fd)nB6Npct8DtSclSd0;RYXJxEer)Z8anK7hu{uPv<nlxDsD#l6Dt
-96nqbuluC*J83;}VPXjio&$RbJvz-g)#z&Fxi3A6$&q^~uNaXp3LM4PJ>L&?4-nC1(vg^tv|@4fcCx>
-)EIq3RB*IuZKP5357epZ0(=_2~L<z@7#5sJ9jiaESUdVE1;+9N?)VQz?)g{p<C^N^IDIU~R#A713x78
-ap;wU}kt`tsx8e+M>a$$AZAIz*r@Fo=Klu>9yB%4^fW?bxdUScWuF1nYZ>y_#D}`-+aY@Va6<w9UrX)
-vW|tUoeF&$`pSZ#^@i<`3<+;-P9GCREhH<CW$m}Dd9#j!*kr+Whu6m4Jp%SAYdZ{HH3p%>Z8z3^wi$L
-B2`36R2GX%$t<tO+GCDUr_}1aFb<lz?CvE&~b&zcy4EsCG#ZDA9TVU|FJYX2u#Ms^fn>`&K82xUI5Op
-3J3vB374}yji+u`71(20V{d2WGO&7`tyvZPWF^kVR>iqOHpGSOgQ>w#$MfvJ$Paa*j@d3zSPk@)7mU}
-}-w7pw(MRqoG(O%}P&JUM8Ap_r-4CMK4nVzULpVVpU7_C{WhIi%KG0~s%-=DJ~`U@N$kG07yD48uUMy
-~fQ(YqY7#qWLsYsIu{UBG5e=3{2!r{)>8L(YVA(#ByQNPS|IS@LldY7KqMg(BvL(gd~IWuiBZ+T0H7u
-gEc3XvB8kcGcegax4n^Qg!@=2xCOih@rq!}jg1X&y#_1Nw~yYcY%8L<=iE2>V0$FNdC=$Irqvq@M3ae
-bJ&?`%(&yFE9A=mF3`y(*i@Po0CQh<tZ`I-$?(x8dK2P6a2WlSt1x(~SqU}aQzdsi&6SnBm+D`{|XX)
-V2Yh=6Vw$T}=%G=w-FbEs%qNxaW^Ea!8PCW>omkYf;l5}FhEpVrqe#MMAyYqAK@LYf0Udb{*`nKq}Ip
-GD3h%Mlvfy(AWw>M#LZT4Nkpe>u7C}iUH(<<_QEE59r-Wd3HTjjg6snfQ_w>7e^NVX3!B}6u=B%8>ay
-B;RmE<Esg#jz9ZuE6(3`5X*{6ALe795B_$^o5*>?H7*5g?`VzBML!-xb2GgTag9X*kXIvdUxjDJ(CAv
-!*-*ecg5Co6C?Y#;(<vNTlx7eZS$lHpc4hrVx3uqkMYUP%Qx>6c^A&R1<uF;3~c9VYrY+~1;_ourtVN
-IQDsYr?}%<C5ZnUO4|XZr{c@xi1Go2cMWydzvjGG9Zfd7+9)yiLYe9nn-#TQ=Xxq7S7g`wbH$!{auAz
-_WPM;VI2=V(q7B(Q-n49jvHakIGoA|r4jgnZuFSz`-n+M;-EHgV6m^x&3CSF$U$t^JNvvoFdltp7);8
-@T`!ij>}7ec=s1=&)-$<*QjXQCTaw^j@=vHdlS%|_X=z>>VNfUnklwXvHEZ|-_A;1M?ak8sLOy8t&#?
-9$cE{2>-L7KChV?y>C?-6+@%ml28k+s;H@7Y8h`K-sBbuLXv1or>hLkvG&lN8Ai;Ss+`CkR5KezdvBf
-)P}JA9=S0J{JR3Kh<|UlF&Fyx0?S1XUeHnG1<h(aarnwcUAt?RJQvypbI9v%K6)k(?Dr&+q0Q~GERpQ
-qGd}W)XL#AINZ({4_c3I^wR6Eb>2YA%Tj(}iXhosj;J9A9bY33~5BNHwg@Mb69wu7E-H_R6^fR$`!F_
-jq_TFf_Kkn<$bXHW|w;{eWxg)_42GUvAU3Iuevd_G>p>0ox*LEy$1Ibs}te!D(+oNrX*KVM?#d9dI-(
-`VYE%>-+ymdEG_l+g+-3^$Je>Vngn>^|BUD<`Jy`62Ka{sQg&Ec78T^_bg?pOV63>pPC7rG?wW55qHQ
-M9gp+=ahHK|j9R{YT=DTkzVef6G+=I>G!h;U6B+OZ|(i+cLY&^e>xkpQ6Rf1KRY<Ctpum=%2XFRXS6c
-QReYiOltr1p%N@ti+C0#w~MTZ%lNapt$qm#>0o!dAIND?NqtgkajVh?{oBRcM3tq=wZeR<d}Csv%G)%
-0QW*c~^!j3FG8s*Grax8Bllljlc=ock;-&BX)B7J#O9KQH0000808trnOyunFq?ZN&0QwXF03!eZ0B~
-t=FJE?LZe(wAFJow7a%5$6FKl6SX>Kuaa&KZ~axQRrl~`?W+DH)o?q4w~Ur0+Rh9o4-opj*f79GJHhE
-`EjS&ms?731aBOCs*q-;CdR4Itszv-8X|Z)<i^D((M3yYs!<hhEp{^z9C`dzSGx9MCOkB^b>aSd!0p;
-QC;Q2?HL&qxg^ez6;}kzcCr&iZ^#<$P`SNVxAHbJXEb}sfBL96-TuP_Qrg%WD>*_)E?8Q-)AcH+$BTN
-VzCOi=PE9O5Fh1I$mjtL!$8Pb?n&k<Hi4IQWO0|um1JwVMyk1jvT*_RT1`h2d)2GZ@_iVRZU{pbGWo_
-PaU_Nal;kffjISJCd_xJqqbpxw!2Oxz3%CUIP=OLKSgW}RA`N@K#;@xOS{GToQHGKPVM=}eB3-$r>`o
-<P5Q?dKN6+tJEmq*U0Z2CCVa$)2Qs4%YuR<bzAtrpfCebRGV7wHTVsa6tN&em+Lyv_R3Vde)lSn^Uz4
-+WiaF2T|2pPB`EJ+s5^HiGTh@ChBra<#i`tN~pTqkZSKT4op)l;^_Vg+M`va85{EccRt7wGgFd@Pqtk
-=4B^$RnKq4<fU3EDqkFK@9XA+YeqCtU@+j`4zN)y6~$z`eBVn(CR<Iuhwwb>W`l8Q5Q>rt61RJ5??HR
-j)pNR=>}?zj-!Fc&d~UQh*rDX>yDntd$T+0cWfI>YX~hEw1%UuG48d7Fc=R9mffjhaT!ZfOv&7r<SfN
-gG`SF%N!%nZ_ro~!CoFG>4*C<AyKfB3>@nO`6L7IZmg}=>=!;+$#fy+Uq4&V25C~O)cgeALuswIGi&p
-abR&ZB%)e2nesN@E(K9;~nxXGtz+Vq8x6=;i4k?La$v9-Fc*Dm!&O$Qj;C^__jPXFP=mrqI4rV=+zHF
->uzrFg;Uv3j(}3>4Z-4I*Kp$buC%eWE}sJeb)EyG_%~Vdo#mXpNly_!0huD@_|en0QkIC`H?5$^$mht
-kDk?>Le6Vhqr741$7d*p~pGy#3fgle4i;5t=qWX$k)S#>*uS+Pa=y}J*<(+;BVrc`M7T3`t_dml%4Q5
-h4t8cg0>0W+*ysWMh|^U!o4LOCCISnyVyjbruDGYf$mTqN5UW}DwZ{TVF6~La>|9Q)@t}xt2NKZ-4f0
-`8>bVWem<X0eERu(b>gd^&sQhD`uThf;%l7G*C4(|fe$<PqYL4#i0>-qI{}j8i0{fg8+T27*L(Sn#&=
-D8*BkNKA6*D{Lwq+W--nPKM|?Nt*|;Y0HTUuzjju_3%|d+meyXIAT8DAB#CN;hFZg09-bJ?Zy9h^ow=
-rK%^>Lrw5#QYoU*=+T7xU3wL>l3U@9zBl&?3Ip`TL<oe692O+QipBpRY}P?WA9fpOs^mVqOg5Gnyyi(
-o2LRJ|pF`GP4IDnV%2D_wXT~we9Bv@jaybfpiXEtmHzt4)JxGC*jgdgd@IA%4cO}4?wc`OyV;?<g>Q@
-G>OkNwF`}oGw==Ygvn;Ek54*2;c0b^=LDa>GJlP-I?4he7m-3ERY;cOpVsI%^$`#Ge)PjyqFq6L(#wu
-s2$X8dFS$g1L@w7V$G?%4OtW$1TOzI#HPNHJntJjrYT5@i>xI81itbc)!`jf)x7hUp`_H4AML#Vnr4}
-7`ATCIJRxEFv9C3;xgLwV}$Kf~&I!-xc{xp%(CtTrFST35VK%`R55Er>JE>s;PRSq3n9WOap^+mw8ly
-J=Z*YWVsP1Ddm4T;02Lfe^#v0&T11B_|)4-!7te#2)d9*i^njTBW2w6QOL;ZYoOqSl#b$r0TN+y&cqP
-%^cW0etG(*5&Q(_1&fZ>5v)U4Q4BMcF@G9JQq{OCXreNr&YxqoEHm#RD@whu}`^=K|3@WIV_mbnCrx6
-^st=4Gc*lq9?hNUQf`<&8)@D>Mn8MMH`FQZnPUD@crNd++-Jy6?iU+&4t>599NJ{Yu`edaIp^Dst(ZQ
-f`3T)Bj!V_PHF6$1JBSy_+*fVaMzOJ;>ESng!6|Bw=5Cwj588IQBS;v}ZzQI&&#=in5ls1n1>R1dV8A
-(u!rl|rW+D=*TD7L<{PCoOt+QH`cO$$g(#5KOL<Y9HB=eHS%xW!LWPZqwsFwFoJ~w{juhSm6PFuK+){
-nKy*VxMqzYCO+^C$XV0v|`u_+Lx~B|%%4+8aU<|Boh`LF4~+;B2~*RK(m!{$D~j0Oh_iSV}G=SL>>_*
-N4KxXLP99*zT2FLHi$2O9KQH0000808trnOg42GP2B_l096eD044wc0B~t=FJE?LZe(wAFJow7a%5$6
-FKuFDXkl`5Wpr?IZ(?O~E^v9RR_|}(MiBkZUopC<I#4+Zsru!jR3!uwR07BtouX4@8G8(?GrMTL&XxP
-?`__OB*rXS!R-)kDnK$#^{0LW9)eqhEABJNZ4SW6ZtWS5NN$+pEV0%@&B6r0!(PAm2A5%|-Od_Et^+U
-w5Pje|=Stqy&R=!TyP{@V@qcjCDZPgA4Ln(}a**(8<tTwDkMPw?VVLxV*1pbC`v|guD1ileUCV15wrL
-z|R(^To*d7#-h9MWQ&A(lh=+G1_C2(>a)?=|SU-R=OQ(!538I3~y1CggC!`jx{Slb(`Bi$w~4^`!9`C
-qz%a{zg*~FSS_HCqjmXjH2n*tdz_wW~(iJ{aD$1mGjLM$_%Djsc55wG)<%v98`nOu~=wdZ>{8!W~M|%
-<~!)z&{m}s_>we-BH1Mc`3(6o{7q^2uT?0btvyO*2oWq-!+M<@lz$k{X~YTm(F04?$Z47`ViCZ3Bm$N
-Rlb_JWo+Yb7-+@hJwoilx3h-G?Ziof$ZEV{UIHBuS=MZg=*n|L7_l?aTJ+QHk4J5s#7&X)f&uR$@rXd
-NL!LCp-d;lPben(Hzf+<ZnO5-LFU`t<y?&D<cQg{4JU%HOd9lOsrutj}vi>mLC#Cj780E3nGrP(5J06
-g`b-XlD^cf--peYV*ThVHmOo6%t6P?x4%#~t?Oqpm~Kxig*2`YlwP`5>_svr6P#;s}sy1tl>#zKD|@^
-=FhfL4t8eEB}>I=72G3A^B*V&Gub2jFntweBn|EdP5>2snBxYwLtHnXG_%uN>SfkZ#L<V4vc*HEk+4u
-a36>W(1Tbh-K0B}7;E~}g>U=1(`kR|{NC;m&1X2d^iY3%|C1Z(s#c3MCaJYwI2)}NV2|qA!Rz60#%7u
-w?hRR{X!^Z@y%BObGw3#C=?5zzIeV+sYC-HL*llTS#NF2L30VE)4YQBAr4JuIWPht&a+B;s$Psy-z_#
-(cdctwkM9a&i7l{~+e>+x^_o((sQf#7nHExrvd!v=39pfB*ZWL&+Z{^d2T6#WK(Dny}yCoa>)Dnvc8h
-OdO^45b&#<TL{`fIyM?U#a~#=bNey?2t?ITk6SIZtyb;L3Sk^seMwfmCT%LVcV5UuZ?}G}~N^eT#b1U
--P*p+83D3u`)yK9bU7<QtNAt)qMfX7B=;l?*+215p%e2xdrt1!1V~gE+Ap|DTW&GG0S>x)i~AaAh?|u
-us<t;<bTZWE(iE3UK%F|D9kCy?a2_f`i?VkPJ`yk$7;DmRYG2*%lgM(62i}Z{8!liY)KRT6WHLm``9e
-Ol%E}iqdGPBvG!^=Ni?dn$yGRBDXsCu^`81Aj|IM>d^<Vi_`jqWx-&ps(4so}U@{-ydqeksi9d7kudN
-*3ishk6%JpAD!XVWeEtt)R?WD4J2rF!?b{V>0m(SSO&I<zN?Sxso=u|z!dG8;AHggi?^f*rVjm+K%Qu
-I8&=5;;``jt8_KhuNdr%3P8?tv1=x_s)q)Jn@QFY8H<-1psn&mE2*KA#U}{SAgoWjvNDU9LQQ8}RG)J
-6l-EZHJQef|8L4Sq2RAKX*CJ9w(05o4cO-==AY2x<B7B1=+V-yjXy2QZ0`t7mM#Ki}THS<amMg8H?J#
-P)h>@6aWAK2mnzTaZIh#5vXzl007(v001Tc003}la4%nWWo~3|axY_OVRB?;bT4gUV{>P6Z*_2Ra&KZ
-~axQRrl~rAj+Bg(_=T}^5UO=K0=vHcX)CWj`(lQVwpwVcxLMCy*9b-qfGo$p^?=c?(0V;JPAtm>odwl
-OXwz<2z{ZM}}8c%654hGYBK>f)q_(8wH-qr4CzTq@8Vl5Pt6zG(bu=JpR2`L#Zlz8FBB9m;GvD{J09Z
-#G#lmObQ9T~<-I04vK{=%isxgnjAyFm^7lslWSoFlZ|7D^<{39T$XO|H%E1H=?+vyUf+Gsja}l{?1kr
-I_(td5NVqj_N^!y6tuc6gS~5>PbnF$6AWG<>rN_`$+<=oDr)6^VMzRZ$yY5n0cm9$h8q$dPnHck<%2G
-Zll!>5pPQTnAAS6-{##Zv;%}j>nztoxhC34j;cXtDOQG=(o3Eh&dKV`y<(huDs@2#Q)GB5?7k_;=ZLB
-Fy*8-d>QrQ<4;3nf2!2+_&DI{3A59lD;TH4Jh%0W;Q&_B|NKiZx30IaAvy}Uo-JJ9t`bOeIBQ(^Y-+6
-LRTp;h)_Im;m>b5$^)eekJ2tak_eE--3xi4&>>5?QoG{?%@5}YPYNvIv|29Dtcgc$S{dy-b13d^%XHo
-*WaJ&xz!W{WxXrcd<Pi=y6i{&Wv4{6QA3@0r9lmjc9?$}r_hG!BA?K@@yLMXx`ejOS0j`{8&#9mFvWX
-A$)%>_zi&u$c5B3Kvm0iw7+@&iPSdFXk<g-z3gJxz$h-Cx;1X_oF|-UW*20N*ngVVROQ9)KX&DHhKBK
-Jd|3kck`m;B<MYfjFiTfdo==k2YdF)U9g<|-S5pNee3|l)U$*IG0KM`1NBg9ZJN~A)_Led54G)Xr_+A
-d`OxkVEn-A|_t0Sa^$%~PyIL(XI7zL;g|jxg$aAAtkN_6?(-$BUb2svtaF;oh6fXNzg)Zj9PZfy$DQp
-!Ie;>yc2rrVK7b^}H!S}ENTCchvI^8O2)c3JVu4i+_^&_f)lKk^upD#uX5vqVzV*Rm-=_7Kvn0viiZ2
-ouv)oO`k7I%9;h|jdEU(1P`54RRJY(~qa!2P*g)-9J=6Ngx>mzj__%3r2h@dMI7w!qz5zaVdtuWPj4X
-wC`F-Ww+x;9L74EPbJW-V**f*;#KiE18pvmzgu~E>q`*-6%WSbeTFc=Q4Hj<Obi-iTY{Uf2(sF{2Mu>
-{{v7<0|XQR000O8Q5kVeY4+g{<qQA-iDLi&9RL6TaA|NaUv_0~WN&gWV`yP=WMy<OZDM0{b8RkgdF@<
-XbDO#refO`>j33(07+>%wKAk=!sne6z`54=oPM<Ou%L(@o$OW9#_s;q6cME~Nfh`+5Up{T(w8UC0Aqk
-<i*ho~X^bb4ie>pj0gOj8F*{IJB2j@rMm}1{*rOL)PoSg^Gwc}YXJMyQTIU&3C|LeG}RriByW<y%NlJ
-0uqIgtZ<e&+Yw_3wDV{27agJYfGb9)-4b$06zVcJ4X06*;~a!q?!=58^M7F}v^snQjN%iujaG7IBWnL
-s@~y>uv#ux{28PqYupJ^-Rcu+`Y~YT$c^Sz9Ad(kO%jCDr<7&dr{y_=8+$~4?p|?DU6+3!C&mcajygC
-mT3%17_rD_7mMh|_mcWU)40wgu!4nXrCGo^3;kL200sNV7XF;smd64<bwZgvG(^NKZ~8Ak0RF8%b!H2
-ZH20=Z9Z~9t2e)C`hF{Ju*?@;oQuc*=Jb>C<%qOm619{-s+zUCgLUt$8!kbk~9gBjDl7g^fAF_{I_ao
-yD;NsZ#JP09$HR?usv?RwG^8@zYibVP0Y~Bgt2PpJ{xo|dulvyX6U{%v8bG$g)8)$p@12Tk)K0r5O6V
-B!#pUvGG<N*7!?<eCw&o9U9;OqzcelQ#!oQ;2cgngl<0fqA?b8>F)Tn93SS_PIDEui3#!D)YZ^d~S54
-o?Or;~%2*$0y^n{%FLG&xh=QT^tO@Cr6iqgCV=P9A2D{`gO)eoTp7J8k1_|WfRXJ%Ud5>a>^siaYI@4
-A8>j@D4;uKH`YCe(`<7GdK9zZ61iJ!bq-zMyN>G%lvRU%WX_CvepF)*fdhR9dSBt}LN2TGTZ2w-*K4e
-8z)qI;mkXz01oUHP23a4wz8}=sp&v$K*V6;w>J7utHKVB;j9rc(MfJn_XP-+BBGpP|7WlWU&b>MGWjJ
-f%(mA#48^`0L2s%*(j(m9XrCq6r|F4b)Bld~CufRpej9T`?7!*>6>rd|rxN5ns|G@O0kOn>9<=4=j_m
-(^71-1^Km~9I7OqshOayPmN*R#0b8)|+-@Ect<F8B>KzbW`lHNPqNP04T6vLAuB1i#f)<AUE(^V@>oR
-`c6}-&XTGg5Oc|JA&U)^SgrIrTDV`UBT~4eyf)K2;3BWv#Z7h-&FH^g5Oi~dxGCf`OVBn;FjQ9lHa6o
-!MA2gd?NT0HGd-b6E)u!d|S=81>aWlr-DCK^QVG8Rr9&vb2Xm}K3DT+f<L49dJGHtY*zV@3>KsDa;(5
-ZO1(cEo)2r8q|q2gekzH{V{PJZlT_7pP4AW}7Ljx^9$lUGpEoTnr>P}_;m*zXyh&9dNZsZ625lc+4f<
-zSAn=2}IQKBD8}ToUANsOeoL-%tf9?-phyT5^T`LT)B5UIEcYm-{V`_1&Ge60mGs_0&2fMbZeL_*TY;
-L15nc0mMT)EuK9XV40isxCkV()i{&UO3U-$ERZE_$tAr4nyqc~t8oDS7%D$s;vRU!!qq(c6L`RW2puM
-p<gum9n-Pw%h2#<R*IrsblF8+7tmLEQL!F3OIEHsZ^4n*E*RG>*N!b(j*B5oFYgqN(tS}hpqlJ<IhTb
-B%!M&BneBkDH3`@jT<oN=H*$+i$cCBJ(qg21wjf(DT0m^BbEetg(R9#wcYSjd~)Q4WynoKZklq_lAE^
-NbmXQhH>TY5#6j)?e((76kj0lj`?ST7DG#@C&|fc4ExBn^*~p^Tpp-@St`f9IN%?xksl|G|glIlfTE2
-!ddDl}{PF#0BDci`o80nw48ZVM0^k<(vQu%7MU%VR6(y2PD!Cqwug&Rc9P=0N!G(v3<mo|$qX9bIB=;
-U5mlbFg9onhW4QuQL4sZopx(kb>YkF>8Bl?rUXUSuLEl&MN0DFr;WL^xJL@o}sqWoB>`E1~!}Rzl(^R
-zl%8Rzl(^R-!hQYCevYP&kg2kT{B!P&kg2kT{B!P&kg2kT{B!P?i_RN-$<5_u@EKLh*5|gv3#-q)k{o
-94n!$AdZz#IF6N&IEs}}IF6N&xVgsc=3*rzj$$QxE&IvGN=O{VN+=x1O0sA>7b}tD0ScDLpJv8fHc5~
-9Nbi6mA<ySSpTL8mNXTx!vRpeowl!rmWY^Yw<k6E}LYB+al7XJ7_j+*`SZ(N9qr18Qie{max`Sry6!g
-`#qBaOiaV=vIIwkx;dUclb2UJzo`U7bSRtDkQFs|gc;f7dJ&LRBjPg5uyI|LF(4uQh4Lm+YF5GWiw1Q
-JIMfx@vvAaUdnD22fefy9wRpm6LENE|r?y|hE1pQb#&Lm<LoPv{WT!7w!+I|K^H4k3$*pjh4_z=*K*^
-OSg~dD@33TRcyBo~I(aiV{mq#IiNl-JGtPe67;RQMx$3=XIt<>{3vf_ykjV5gJn{KEcBZ^KH0NnDO_x
-a^vrrTTrTlVu8tYPeNcQJ{FjinZc33P<$*fB#s1z!m+@R_;35TzVRr5={$?TGz+)LSYWb`c#ML;Py&h
-thQyJ;h_q(>?>Bi|Ul14=5VjDQO`1b&T2KEl{)O&SRZrqyZZ1H%J4JK{`jP?S?QW8@H>2c3vuC?|R@O
-SX87<Rtuk>hvRU4+(Ko=|NUvv~x7dOtUOM9)6k!E1Ck?EE(GVwrC(#RC*vBt>!)cD-iq6cYZz8p51Mx
-#=Z+p-fA{}DIK)L4$aOfyz0_096{<z=XFx@vxh<dgG1ke5+U_fYe(m!WX%Wk?)(84AZ<hQyJVp>XVFN
-E~??3ddfC#F3YwaO`DB9C;ZE$6h9j7Q9R{B0R<H!`+{Q%Ioya@I3ErJ`TByAJSsJyzfCKXN%zdQ(2)k
-GfEXMXMZMrAeU2RV_&R4v21%Dzz(%|MFseW>*z+T*odtO>%{AJU^ls3hBd^Zl9pJTbU2Tfu{fbvm%%)
-4^Dq=kUm{;DeX#@Q*6|=);6@KTS+){A_$+ihTddWP+<C~S@v4$p!2dJnp1oj}XSs_IFyC_*HL*sBJ@9
-ye)4k<7VtI#m4SWuji&tQ=!1Au+B`iU_2IzsiZk>(%<OrcPi`R>UJT7k}Dh>1o6Z_Yf{zg5wcKO>tgP
-+>&tqc?OV4{rWV+Gf@9C8&|=A9o|DVm$QKS`0^Z*=3#qN}ebqe^82|Nm0vkHX*9ov6%T@kz<bHVeF2F
-n^S}#^#U0vH2r$Wd5r9Pw;whT|2H^^5l3d{5O1uvBRIj&`^ul(S`mkXLr^$582e`p`_Zr7g=KeISd_>
-1q_PpJBOhQhM;&@kW1Tm5Qy=}53Zei?$wp8_B+ksC?7ssg%@`VpT*(J57=@hgU~Oz+T}H-c)Y^Hp|a*
-=x!y&}&ieH(@;Q?18)`XD1+1Wcn<p#eL^$b%L`He}B}!jprNX-uTdBR5N27*z*soN?ABX*n_EJH9ti5
-`yn|k~hh|*q)kF{5(HnTX=UW$*kSFdHS<Gl7#e5}1Bj<lD;vG$TU(q0P3+Dqa{dnp`iFNq`VrEsjhB)
-(U(6pA=jK@vwQNa0uoNgSylg<};YaioG2j#ZGvUuhm=OUz@;240d80faC&m9Z^_t($ICcfiZJj$2FHK
-SkS0i(9;Nhu)M8LS$njs@$kd$wCz75w6Ry#3@J7h)g#zH&>TDZW21!SiUFp4XoPKwPqJ}{x!20b@>On
-P}HtqC9b7z(#eU8d4I6HJWJlBlQmj@lYTiq){M?!A6bP#Vig8&R^iPmyjg`etFW{RgMM+*Lw2n0X1=|
--gRC&ObDKvz7sy+M5?OCR)UF|WQq9b!#Bo)wp>#8BdI*zj3U1<2ZL*7-7_4;@jf|TZY;+R?m76HzB?u
-=mP&f(NM-=L^?&TWNMGR6G0pCoh<@nev|N5!i%crd0?)6g?{yQz0NCU;0FhBAa)RN4neEk%)<T5{>wS
-XgkLE+e6ka*5tyyhH`^vx$GdIJjf7b~Q<!jZo);L<XP-@MN-8a1Pt{<dmHTU^Zo$l47tcswpZ|47%sl
-ETWWVQ(USdI@f1)G(`*ZR~=Y+q@m>wUSiRQTM8d^h}LCd=ZIi^2S~kb?KdUv0m9t$rCB9(_Z(rrl~a_
-dBr}ag<87S+Vd7_nObY>e$%BlB@fxwwf3I3O54=hPe0P{)LI=~>+E@Jbxf_Zbsy@{o05m@>RNZtTcvA
-i-4}5S+qImjYv!J}oM~$2w*5&Oz2c_iA$z*k+w)fGnOg6~`cwIqvvkec^Omzr&3bfy+WqhoU7PHA3r$
-RIvUA^hk@urjZC$hXx)oW~HZ^;7^Q)Sxq@!Q?rWN@czv`96Z&wvJpq=GS^qMGR5}_**V>HSH8Rb2Dxe
-#NqikkwA=DWWu{|8V@0|XQR000O8Q5kVe9(C^?p9cT{85RHlCIA2caA|NaUv_0~WN&gWV`yP=WMy<Ob
-7Es?VRCb2bZ~NSVr6nJaCx;@|8Lq#691jQVx*{oyysG&O;2qvPe+K8php1l<z90UXBm5eRg9N<?eMt2
-{yw|5!N!J5b$3Wf!|u%N%x7jkJKKwk@(<mZ_uW4Ax*fAWHtD7}==@G6WG^ZgG+8kk1boST+oO(f8F5L
-E;$PhJY?}J~l?4(z&dLrX3&~|6b3zf21JQaVwb1o>$RT#iUYRF0EFiI<u*5Xv`z(}>y<u2duOpv3cF2
-V<@io|pK!1T@8j2uZcLHXI%%%BGTPz-B2g=rFhoe>@)jF5dYBZWKQ7T@iw&&4E$x0eA$%0qr#*uV{9|
-n9LA-<Zt{E8K#M>}|-A@`O6U(<VnharW6hP!Yjd@V6v?eJrJLhXxvyc(edAVBKzd0+=Sh3+C?jHFnET
-X_DBb|NCj_9<X4m+|>PDkR%?KZpSOYvJ<6PAx^gi+EL7Aq&<r1^K=|r5=+Ah3=Wp0vtb#<{o#T+~W@O
-B_mtXMy<)!0m?h&$T)F??gY$h_`eb3*jHz(^kaou^=5inV$ndXRI@|nKhnKXikEPDM;_7@q?+|o2o90
-D#C>gch2-E57(}33lpoC*MUpKd&wvHU(jVQ)!(ck0cK?a~Xpcti{^aQ!WRVK&BEhjGzTS8oh7na@`{5
-3b!@#3C>O4TBebeoACr`@zyY8fKj>mL27*U&s?a`#$nfBTv8cs*U!Pu-Lxs0U{D=^DI-b1{A$+ZBIXc
-C)yG7kL->6LKMb7^J2GNjpI=qi_NRLExcQ#tg6ztr(U<pAh6;tTRcXwWv`s2!ANA-k}0$ghE}aOwtKH
-6djCFCJ1bhWZ^}!1SFbL}1X3kf9QNY(uxvYBn41n;#oZqUjhbr#@u%Z{J8h7nRB)K-1I{ZrKE4j_8p+
-)ngqjj#)U=i-{ofBNTl`z;;k+9hBQr1UrM2F!z_^5Gw{!_akDy!+QLMd3+^=Td7nW&z6$Lkn-5gE@Zi
-5YPoM908;JUejN5pYux>ZN!RrGQ@nU%nf<}^{=piVJ!|qXGRF^t-Yo>0jn*e3@Is^Bx}smQ>i=wMT~t
-<g()~Nu9tNXHXFAF0H|k%mv{>J~Z=VxuTvfE3%NAr=95iQHHOah%p$LO{1}aVUAak$pY)|#8Z?BmZqk
-P>LK1%{r9~preYbRhaNSVE??@zfr=wYL7>GR-}{&&BJt{+WJRhwHzK10Q$FcY6tvw{gWHV@MNkBy-AU
-ZTyB{WK69k^Y%EWuU1C{bEOda*r#9NlHmIqzW1sIb4y^k=+a+FrE2!B!`*_EfKg{Od)r)FWC>vL3g1T
-Ww}HsLfcbvXZKYjl<(up_;GqWz%3RcEBktg7j)KsGRLW@1HAgwICxN%f<iCp);ot&>+0$}OwWy(>W@N
-~)|V`_(CL;FH#TRoP;ogt8|T1m9EGC&mhnZiuyM<v{L}>|ZFOsaUO|Y<bMQA}nE!@K0iNM*4|+mlx~h
-(`M-voE?y##q0SlwRFG|(3X7?Hl4Shym_tJAUt6H6%^4mkek-hw1`kb2lDSuVoYt>Y>nknZ6$RnY)IS
-SXp?2z{pmtQ{e7sfUgL#1Qhu{;(c=ha!>fz%RGs#O=<gA^zZzkNHV6l;rWmbLw%$7iM+r$dwKF52&^g
-rGd*9<kQ;COtfxv77+XmMSYY;|4jZV%1HE86jk~5<t}Fg1&$M{uSf5YDSC-(9wlW&G(-_q1gq2MQE$X
-63i0*iz4YQrX^~;|NN0K{4wLmV2m0DE!{gFvt6kez4e!P=n0ur9mTx}9HL}=3~=xnuY|0flpYF^K0C9
-r2=wH*#q>IUdb}C*tWJAk4Mw--D6wwD^N>xiwihu)QLU?nq5Ld!zc4h^W3vh(tVbY(9SnTb2yONJNu5
-D|G8**C%pv@>{i3IJ#}jIHOJ=YAGeDJ-AJ+9FN%%01QGNk%!FXi`RjezfW^Xm0suF_}nlque<an{*Re
-%M&Q-qi0GeA*hFUy6S2=6P&WIi9L<TxdNEdeJ9JzrYtQy|)3G5MUbtA#Uj&?$2VmMvIIEEcYrw-`V6S
-Kk_?CnTpF*d(1c%8hDqlya@$)-MIOF6q}8kCT?tAu7iQ8}(XnRkff+@M8M2I(z1`QX86LRpQeTE3QNL
-@D`7GP^JUd(Wq4#*|~6zqyE1|R-7K5wUJpdizRbN>|2h4(>t+@eKYsv9*ISU%jx<$_s*!_niI1#>Gto
-x9@l@N=zdFZEPp%{iwu3f;2NXUQ#BeLRx@K!=Gcr@a^RU4$C-BV#Bzzd+-37<S*yO2d3WAPLvfRS(%R
-r)A8*#Gak2)E0?PnxWb78>IV3efKM(%hVA{X6x|4z)X2~292~nJRRQ*>-%$X;)c;qZGH~^698*!-06`
-rz=zEg2)u2urq@jF>H@(8^Z)xB45)%Z`C{B%D0gNgNM9=feK3hjrwqf$N^K7;s;+blF;zMmRLlb7PGT
-C?6rDJ#z!C2x(iHD;Iep%`r8#1DDG2zMLqU=Q~ySBbaue_vK-mj$o(B$~P9J`}FeV+IN6H!xhiQLN1v
-pD$mIkq#>V22e`_1QY-O00;n48F5UC{!gHV1ONcq4FCWp0001RX>c!Jc4cm4Z*nhVXkl_>WppodVq<e
->a&L8TaB^>AWpXZXd8JovZ{j!*{?4x$sb4^%IbcPvx7B_C3N2dRL_k%wS|O7-VAa^jcHnZq{>Dit1Ok
-OSOO?pXJdfwqcJJ=;7c|>1-2wEvt@gleL$fz*{e&~NcZEBcEGY~XTQEU5w4_ggY3R#;80Q40f^DeMsP
-UFWX==cyhI&RS@X*vL>=?R&8HQ%hbVIpZQw1^rlS7U618THK))YmnRVbK843k3Rr&>!De;_f8q)OzTq
-Qp=i=26Uex)o8DYaQWMO9RDL32K!}6)AGf9cXY4V{5BnOf^*->L-!3q%exjLyWJeOW#of&?o8xMvN~M
-Tfse`hX#y<QDl}<#1`%{!au^L)yvO#;|!$<!jy70S42fNyMdw<v<%D^J%55ohTstaiuz0^`(vgI5aIt
-J72;RYXF+5|q3|(Y8<wGJrFThw8BC!^HHHE&R8WQ6kHR@;9)f$!qe4?48rD{(m-|$9tRrsf2y`UU$LW
-6p%203jw&h0&)ST*Wx0JDru|km;>pzxzZGk0pIs%U6QahxRn}U6$J}?o}F0nZH0|_zEEw&%bDTJB^Au
-l5X+QM6R@;aPOpfPxdx5jwf7);)u&=yO9S}btF#8zw0kQk#<M3@L2M}mHP+<HYsquK3sC-2t#PIoeBy
-DoHwV`#vrF`jf=(_Ui?qv?1wblVOVm(pE|Z8Gzc{F&kaDOVCRi9<pd*GcH_SYC||avzptL$S;r#i{av
-V27-un`+3VSj6!nWS`I{U;zke%CJ=odk5R|q`JtmuWuQr!gI<{uc8qV9~?{IBD})_r0#GjRT-L68*AE
-cAhuGgRx9__Z<Q**)J4g;1?|D}m50w=p%5q>8Yewl7D|TewUTp80hZ7XS_?HUH7`~(iZv-j&r?v=-eq
-FJX)`i3MP@*ph=qrz1jnr6Oi{jr72lYs*6P((s_a{38GcIksFL3W_+s@iv7&xN&?jD2@+D1ozIuFkNa
-6OQUXMRY2O%u5t{)ly<IVqkvGNp}1oUk$I>66Ez95PbamrC|?sOTRYF3Q>uxDF_;v8G;b*Ia)RkGp(&
-v5!#hGx=rA8M5eijPf~bgt+&W1O(pUt`UoePWyKl*H<!Jxr)R@QBRG%p}nyyoG|tiPqpYTkb(~7Ek*X
-ZxLHpp9V0SF}#arv!bRvNac3v5O1a85mgytE9Vnb+S{YTNuts41Ab+i>dXY>c6h0L6?8uaR|0Zo;Y#H
-3z+4GCn3@|9yV1HKsDl~15_U3(H{~!pcQ<WWy@<sddH6j1Zr?w~-dLX_2~^;_1(`JznU?pDkM+OqYxX
-UI_m1%8R^QtZE*-HYiv;%K-`YFQD1w(tJV(xv?ZuFf&WsbcF9%(@h(3osI%RIE(BZLg0Q~*=D>-~->F
-M($bMPDtHJ1x~2=m#o`Q>;I54*1~mvgH_xP8uLw%&WTVLJSOj=@BQ^gp|I#;uIl!I!`+ZnjjQi@6Cc=
-SGu%v^w-}Lxo@bb;OWQd^x(jU4NGf*?krMFJiDI{smA=0|XQR000O8Q5kVe){$p2AO!#bz77BYApigX
-aA|NaUv_0~WN&gWV`yP=WMy<Ob82aGaB^>AWpXZXd97A|Z`w!@{hv=UYIG{-2p3YFbZykr5g-XYehC{
-@Q59LnUSO|g7wxXo(ocVHZDSiSxl}r<Qp4=bn|W_$$G*6ze(1J;KN!<+(Cv?%KHUx{-M{IK??vr`+%=
-<#;wvuvh`KUl#5HZ?4<1E+OR5zGu(fJ?*MZ=M!?VYpStPeikzA6gz<~dl86Egr2GeE}3m*7}OQG>oZK
-X<n0GOsyrS?EE->{Gty9Dtxm9H$;c864JL-lTh+V9{00f<WX7ImVCX4Y5JjA^ExS(q~EN?{aV#73&RZ
-hU}+XymJ}H09As@eN%PDl}vyO?PH3MaCb}M0}xqwX-TM6=S63(tJZ<H?)&61->A~LatMI2w}(<;crqQ
-ej`J^+*wmBLeQ~Q8>TjTui^c8PD7?qDcv){6xdATMZ^OH4|%|ZX5?$yTAN-MO5NE)oU9PKlYmduy&=Y
-NZgW2~rD37#R(qc<Lu`^%RQHXoAKl#Azy^xmQG{-&ePpXrf`VyCTqLk-XpcVt2%_IGMzmlQYqpG|CJ^
-9Dp9k*4WbRUD{79cWvsq{CKHk6=O5+s$OOg0y8*u=GmGXtzp>P0<`m^o>B09H&;lO>g)!z-=ao=(1ZZ
-e||O*=Dp(47xEGn&q4(}~k>5jl+QCAMN#iJVKk1ms3S$&eYJM>?hci1um}7=^U<pBdU5Fph~LA6I0%`
->7sAQmhib2q^@;A-*IbO_RPUj@iNVopcu{MSq(Z`k>XM-`jBV#n%Wea1egSmw>*Dq*P71mD*U>Q3tVC
-*X{PzW&7P#n`rL9a_*u2xcAB>a#5=-mE2Hkvk2C{(#&j?T!26NXD`txjtsxu8P>(A!^|`}&0?@!xL9d
-}QQP>znhUlM>n10TJsG7Z`w+n7b7yBd3vfOSoL<S^!8Y1yY@#&mpKTz__p-Cy0_?jv@&gO4H)TK18F`
-~guRqK@n22#_GY89NUnfLPD@}gYYPBHpwN5Zn()DUBuz|3EFm6loJdQo)d3DXAWoEaJj<M0|1yYj|hg
-R<2C|q%n>FR;V#|kCu2eght%i4Or73T+<`SGm2r>PTJk3)~tK8{jY&<4g_iPZ2)8TQdH7IK*5FH9-G%
-r4KEO|K{X4LeS(n2D7*gIf+f2Ojxi75l4mz;8bJTVJ5QH-!RA#=^wCiA8Ui2kA?Jc1v-)baC?m8!=JO
-y-IHO*$;!A0CeMUKw83bNzQVBFZ`)-fPlqx2=eh@)LZ@8Y%)7cnztd6s})2F*&<%m-~OTr|FR9S#w&s
-;1txf1*yK2S+dP3eeNqY~*_&CeOywr=Ms+p03gwI28c$qr)IW(>;EUwzft5x7CB?vX0Ch%->g;!u`MB
-o|-2WxN<Kq2yn%;`#VMtE<zk-B8tP~UYA6|BnPQ^o7ZgX9oLKp0??ox~|?I$G4$LZ?ne9*~l%E!Kpca
-2Z7J%tZXuNjd__NTn^Ix5#*Wiibc;8>*D3kp?}Ev_B?O6@XJYk2pwWb>y0dU~nm*GNz*@sip}UG1N5L
--G`b9Ioq9x33PS=d%4&xMB_y?|k?VZc?xB_Pg$2eE;EiebuY=UrFOJA>-BB!#9;*w_m>DF|9N<xhGOA
-dB{Y-;Q41-iSsa-x!t+zxev2GehhoZ`?sL@^7XHL+vxOL!kX<%;i!tEx5=KL^(b!oG3O&9d34tQgXrp
-+I17<gzVW};%e6EQup7010Z>Z=1QY-O00;n48F5T?fJZ%W4FCYeFaQ830001RX>c!Jc4cm4Z*nhVXkl
-_>WppofZfSO9a&uv9WMy<^V{~tFE^v9xT5WS0$r1jpUoo-j0;<3UknQuy<*U*Q$mArX5~v)<cEPd?Fs
-Egg?CeVBF3xYy(=+?d0Fs=fZp&9EcDj3Jdb*!}ncd$vKkTG^-tDoA?rFQ%Z?lt&tJ7cD2HO3-eKweLb
-`^-3@NAcz`V-ECWS9PL!gXzS>xp|FNQ^jhJCHnN6CQFW^aJLA)Y?lVbUhIYke%^+?)pm}Fn`KIgJ{tA
-cqkov$?<Bjh&<ugq3}J4pTW`()DH+|*M6YiI{~*tK4IgPlDIyV9gwW$3RBHPRy{pntwy5>5k_*09lI{
-OAzI09xa7e-pXi;O`d%1_afJO<<-rl&Fm`DNckEiYvp_6ZoneI`3w?II3g^D3DEjji{<B@5#{G1^N<*
-=Npi)<i13OrecBcX7O#0LC0V{vYR(`}B+hYNr2&w0Xrb1?WlfU`__!s^}Ojq<O@+R0XZ7bx#LMBQ+@7
-=NsF0mDM&OIJr`s--y3J1&=!r`9e%$96P@8mpFWrr5hj~Bu^KEx~azhzutoaUzE#~aqNn#pXj#2WU>s
-&+{0$8j%-@c@fnF&D=bB%GE}1=&s~On6G{9EXEHAP^gUfcdd8XOZO7$gM#FXxWGE;QiI@fF1WfvJb~M
-H^;rf$G4!xQD77YtR;!X(iISlT?MumuCQ<jxNP5?z6ZzgN%x{V_(-eobO*h5zt1{XH|&^QAKwhRr?(f
-!H|+ZM=K8ANws5$dCn_donv|TXcnXmVADV=d*us^1>mPBv5({)EY;NCk9J9mWRTE~zLYAv1ouTV{Gqq
-o^WD0%D#FTk{SYr=?fbGCM*G?Bwvh%IMD;%rFUNu2vdv`95pbz$rm_l^N_5Gm6PJ9^>>E$ta8?9!uQE
-whLnvC7{@n+M*+P$+!g3tcmix)5UF8xX5a;U<C&OCwr(b`ksIZN;+10L6w5?h@MXHKR><V!dw6tSnqp
-x8)i1R9M9x4=3YC1-#kYj5w!j$kywQPI7tA_j}1mmg&0IbW}qTs=p125&xbZBI?kstfy9tUKUSn>IjO
-BuhE88ab9OSO9<%TROhd%ibQ$n3h4Z9hv-c{TU{mB|mYnd(!}`v0{Lp1%9+#2L2cdh-pqS(&ynhja;j
-dn1y>0FeIkxddn#6hj85*yRf}kWY2g<xbWl}BQ8v;MiXA?6lZBmC!VM<2e3eR%_8ZAdRHJ@j2&rM`sK
--Ke|_E3Ox!OK@5Sb@W=mCn{44$dzyrM*DVzRJVQe&7BZlQ@F$#NuE85~x%d)g#f@~Uj4tbZ72Jpto;X
-q*_A$V-yS?uWm^C=Iw7p6f~?*n+D7vi%SUfP&rB9!EubHGfv2b0i$13VGLFgz6#yvETb!9)@Wu9UnW@
-{Y7*%Tm^K6#q<~h`lo?>7YnsO*x-brN7|A@d`UC4?C_ed5KA@22l471Ob<k8}6k#SASe~d)>?1%i-Yt
-O}qd8>f#Kf4Xf2qgYUcN?}sNJ2kqfmd(b`|0Hxo-;w{HtEQQOf<I1PcU*9z9pTBlGUn+X)cK>uEb@g-
-O@bF*%{{0}P{m|__PW(@)_-_AdNNktK*C77ABBWn`^XAo0^=9RWRXzxB;y=iGv-PS~sTEWaKN&--#L(
-Eq@T$bn+{N&^#PE6-!;d9~!(9w-N(`@dG5l0wc)5$Ad0683vGPq@&V*0da7chX99AWFr#0jq-fTEknD
-wp*Vb<}*MeOeM5V<u3gbia49L7lUj`e(xm*|Q#5=5WA6iKvc8@VTVV-`E}!y&@4Z5|Z_$3sboYbF3Dg
-=%TW;hZWkp8HiILp0G8I;>a#o(uJ^Ivjd7e0_LOns;u?;e+rr2pH#vHh2gmNRLUspt0N;B(O^lW#Qq5
-xKAJ#gC}8KatLGFxr-AWk!>o8-%4-NVmj}{KL;Xo-a8s4Rx=vakcBJ6^gVaQJOCU-roxCv=UEehq%8y
-q@}w~jA2<?C8<Bq{xyr#aM4$Lhw7?(0a??hO*7AELfpQo*>9NKt8J6Q+!)oA_8=G=W^v!5s9ov;#EX*
-`qK1mZz(G0U3!9s@I9v=5kyWK5zIj&T)qnU1WyQ2aIY@$l-Dj}pKD#-vmv#%B<m*k}OsUw?$5Yh#<8*
-DJtfqh4@9DzIX?&#$0^u(2+k|as>OE^a&GMneae!yLRk8&ilFJttl=XgqfOZG=$el#MnWUWbXcjla|A
-42bKH{!_*$QNJ?qfsiy4wG^co+42V;1EbgZ0Rbm5FP~31aaz}GMjTDUEjc{RQV^!DN)u)wy;s&+t>@I
-oF&PE=&8o_-Dso@A41Y~9ppBR<ODSgB`3Kf%N0+y`(UrMCsX!C=>|kS%;AgJQ-zjAu8?d+sMkSWSb9`
-qn(B(c0n<Wy!0ida!yt(8-t51L5fg9GwgMhTfwz~ZB(W~{ss@|d!Xc#a;BNqclu?@{6|<|7jD&)GEg{
-L~%VeYY6M+n4!y(7H^ZW-CDOZ;$r7)wTs$42Dp+}$%)y=VyjHx&a2ms4VEuu_uW&5lfXS)PI*iZoQR+
-TH}MD@ni3dnkJ0Jnoqff@3XO<0<hIIFr6vLIjxjyEM;=vmtxc5=c_I*f$Y-=tHnk#2$F7mBss@1DOfr
-YHHQ2-r;k_D+r*o>wa03gq0~u=Ud34_m{F_Rg8&XN~owePGmGr^7mJ)@aZ_rM|-!k}45~F0XTMB5cp7
-$^DoGyq!+QI2N;QT)Xst*!sgLe_TO@(WWZn^Vdd${;QbvrxcLr@3dckSwqzr$p{&Vk2)v>WK#bQ>R{E
-wm(A9}leF^pI;xL)v+?@n>$;L&CmDYzEotp&O?BF4Eyc#7Y;C8OTFsY-->W5(@rTh;-jU(LdFR~jmdd
-Z1uM>x4TOBgzio^m}+(y646`QaBAL=tCfw=^hqH;M#<ktNuTlAMCr1#c>bSgPcn%9KVQ;y3jl6l0S(k
-!GMNOnSp+US(>J@Cps*98P+SSlr^vSMl@ZmW2klSGksE|3@MoSXQ$z6+83pAjift|!ce9DG9(eq_|md
-IQChND`d+rko^G{l>&UmAP*3k6*6Z`DderC?WYSPO{{3dGQxhvi`_TkbGUdY^z>k@t^9=qc0_U(5Eh`
-5G)^Hjatkq^(nVR<EC{^QY2M5p_+AESFJEEXD&RIvX|4f@>EE2bHd*LL#dVEuhnR^(mr7>!}H?|k5;E
-lHl<NFFU6HH89DQ8GV3XpnJReAFtfyQS0R|4im_8u)^4@j_&6~7gsHMr1z>7Tw3U3v+v;51_Rfag!G`
-4-k#iUNZCp$8le#ZYL)~XjIm4fspz6U>p!?aACL+E)9-+&gmqXI3u((x=EnMaNsxp>rrY?`^&J@9~+4
-?cJxqYfal2Ul$>(Z8*zb;)#<F#@>30F|fcB<r~fGu#=qE54tx8;Np6%u7Nl60xmbtXBS%cr5G?-&epC
-BGw0*$%B5fjh7l*=?!152w{~y8l%uG3Tih6TWclH!qLIb4yMZM$^#!<6=zr6Li6g;FirBd3xgF4o$1c
-P~lM_AdMbdaA9i?C$lL-Tefsvw2la0)?_6%MMqD^O-GGjUqAiZFL?k}aJY7GYtj-8<lC=*E?uWty{q0
-3;?1sO+?!=Dm&o6$r5mp5!G_d$6Mz2Vt<3!7Zd$zG?}gBG(dGp7IjBfaF&}*{&?!l|Jas2_rMuadVbU
-{(pWYb*)Y`4oqjR=$Lsw0nb~*J0-IgwVKlGQnt^Hea4evxjp{*TXYc4p8mKtVlHl;i8R7lnU%(eE8bW
-Sagl3UjGPGBv6-x+`5z}X#NNt60UiG_@6Y?PfSe$fI)$@y&P;_b6D->Zad?9)dsdbSwrMFIv%KX8)2-
-q_Xt%Nw$>OP`%cEN)jDEq6;}P53yPRV$vaduqvdB!8+D8hvMcYLg!!O6XKu_h^N_g3d)xU86h=zBd&d
-TO7DzOGgOvJzw%Xt$5s6IL276KeJJLBqUeMttBT!RyF1_)S-F7!}TlZ|4KyDNRdOE@>Ll<3;XNPMA)z
-z8|X|@o{QXMdz<oZdXn3LwL#O8Hz4fhh>>Ui*{likvNkDg?cEOUl%<TqITAvXs(HenwWims$AHfH;Du
-Q;d4;gH#^(ADH07h1Ek$h5cR@ut=A8$%&u)?P#5eERHz#TtbVC7jq@0neO}eSq$jPMrK%W2_r17s|U?
-=kGa>*Sr6^>5dO;)nL`+OTM{X)RhV~iyjg5u_KrKD!XoBP;<^i^G7(qmijyXSmTlk@pCV*Xp9r!?qtm
-XjqvIpDqUb%hlBO*V_vNQ3CN9c$CfS;so4yFHz9Bog=hg1+3Xs+=<UOyR73a(iy>d71lxTY7<O(KRV3
-<_MdpvBV-;(0wkKbKjj*)(?vCSAC8)d@>5h3nwJbOW0zjn=m<+l)F953#=JF0^Hy@$&RwU<ONw<x3Wd
-AKS=h2ETYj5a(h-_c%EAgtcysj_?hfw_*}ONdble$1TlL4CtCVW4Sk1pc523uBmW0bO9KQH0000808t
-rnO!dFKJw*fn0L}^k03iSX0B~t=FJE?LZe(wAFJow7a%5$6FLiWgIB;@rVr6nJaCxm(TW{({5Ps)ZjF
-J~fi3_Ptl}l5VfJsonMz+yWo-AXJVU_hR+Fd85zrN!Oa12B}r>dXgnfbo?=Heljm**dNvY#goOeaIz@
-ojjTy2C%=li17FB?M~(SFsfn5r?5n5SWHc{>?a#EU8uylg(=FLMMV5Mv)_YM=m$0K&D{Ma8SI1M#s?x
-$&_WeU~y!a6q;VuMym3Kh+!^OWsem`1`}9rOUBbwkt(=0TS~Py&>nW6e|L9F6lcRN7;p|=5v##Njp`k
-fs*<4;MzLjXq-yKVJy`%|k$QtU<1587xCT;az(|;H&031OergS8OBJbY(WO)&f|jZIAYl)%l{v(b0EG
-$D6+Jb=KqQi%r6PPL6P9iZQ!WxJr%-KBWqQ}cXJ-LZ)T9)iQJ|t~=J}Gdn7~sOqtFPEhD~A9>qDo;g%
-H0M0%J+^Wp^I{8TpIc@2E6c;Ku6jvek@TkP6z7DfH7cHwCamqPM_l8fu5M&bHuCX#z}?v}@`;{Xv9O=
-m)J4ED>^zY0kUEK(X+361=#J00z!0d>we+zzJR-D3&@+UYcLU#Ig-%L`+qwNSG}NCxV&n4POW`c$!Qn
-!E2#@JP91z_hIaMFo5~M3ns(Gbl|~!;muv&wg7y@U5krmo@?^H#VJu{k~*27i5S;a>8~_iO#*oW>*yV
-6%rP?BD2V72*=&DkhFpqOSua5j4SfKXf{>;QABxfL(Dt27msk$-?b6c6Ru{hXDJT+eoJQaie9Tg!9&;
-&G7oMaxMd)lm*xpUQ-@ESr((3~(e6oD@fbERF^N3uwTB(v5Sn)bi8qG$@B~?$;D?Xti8GSVK(pU$g$Z
-6^8fWpJX$~Uxaq%w-vOknx8qovPAtaM??D({}V^pvqRu7+gGSnF&Twg|?zp+5^}?#Q0D=!toxb!o0-w
-HqSo9?&@e*RexdG%uWc?h`yh&-&6T9SNoohK$Zl7`8R?v<4K9&gt;956oRC1FU^~=MYMcy0(zCKAx$j
--B5l64XKG?whYUz6Wozhej`HB%`=p7uevgPr{o>_yx#NfV@<s(_aC$pl*DZJO6pY!MU>&OAcZDZ0xoi
-sUf*7P#=s-7%A?h%=!-+yDPmHFb?IOl4C!Qj11P@sxHw)r-@#QpyNZjkP(?>w5crp=eC@c?z|p7Ngg!
-QQ+p;~+^_r;;ZQN!1_S>)=Hwb6;31UgVnr{s&@_$P{34EgZq3mOK;f%sb@W15u1G>?t=?Qk!-xcjhoG
-XRGluN}?v^((oBix*#4+S)~@TW)Uw_3+3_PQEHj_kl51{3G`{&<!ps8l0G$`TYY7D6h!|KfVVa1n&Ti
-)YizboAd^d%VO4rH5rc(r~o>x!~*#%WHLacT#k-F~7mDO_??Ls^0SE0ld08!_k1(qWe~l{(Y*r_I~6V
-@6ScoasL2NO9KQH0000808trnOh?C%*SP=y0P+9;03HAU0B~t=FJE?LZe(wAFJow7a%5$6FLq^eb7^m
-GE^v8Gk3CBSK@ddq`4z<^cb5!;MhAk37nmrhm@d7$y*rKbvCQ<G?!R|APB5&h7re68nh!4(F^?@U_(!
-T%<P=tDMwPe(nN}3mB7BxKLp|fnrAkgnE%scHCk&p-$ZDpNBfdqwBvjV6xMc;U5trdgp|*aZ;frRj&X
-^-L^|>7JL<x_9(gnkQq~!X)_%KJ3;D#Iz#%|W8>#i1EhkMvtcjNA?`8>V7Kfk_g&A;8%?S<}lZg()hP
-)h>@6aWAK2mnzTaZHm2*D?bD00031001KZ003}la4%nWWo~3|axY_OVRB?;bT4CUX)j-2X>MtBUtcb8
-dE){AP)h>@6aWAK2mnzTaZF#`t+|&3006QI001Qb003}la4%nWWo~3|axY_OVRB?;bT4CUX)j}FVRB?
-;bY)|7E^v8`R!eW=HW0q+S4<r&B(*m40QMq4hql|t0^4n{O%ID~pwJR!6Ol-Pr0g0&{(EOgNw$+XSRH
-JUGyG=en+J9F!+CGb`BJKLp*GO%+*+$>Hk(ENlty+Awrg3g!SM%SK`Q~;K&y>_S~dbY?$#E#s=$a&8%
-HYO)<PPngcGF`RU}lYE2&mCihlc#w_PK$EQ$c1cTldm35sBKD?BE>Xv8qI@_M5vgRNAR-rB|G)%z=4x
-HXho)v`hx0xsD5NqqvyfZI~a7s{9HB8ooNp!667#?%?TL3uR?>4uOc#w1nOJE)Cr!8#0uMV_F@?-WJd
-yWWVR0ND};z?W7xy%R-P&k<HChia;HQmZ-iN+KnqXrvQ{H%QEQ(yTgetQgmJX9p_-QKN~X*a%}0tSFA
-;tkf-rGpb#Gy*d`7Wje^4Ksx4f(EN84d>8~#6jh?eELvX%WJ=dbBbBgoP`nj+?74{3%#%)p(Ek^KWGL
-Xs6h^%o0G9NMDItcJe2G~es{(Y5%0BUEln@$e9qk4H%R;SWNDObmJCMN*Lity48dk^)VIM%UaK`OAF&
-_CyT$5#lUhbT*hp-e-2A}bl#Dh0jE=?nR&S=-;9N>mC=;cxTJ>)OROj0ka5tC4`pa!q}b_g1`bMF{8h
-VMMn=_Kx1EkyNf^9<}7b5~+*>fTdEEHqko#ERt`fnCWxBXw`6Az*>UZk#OphMQ&wy%lxefUIE~bTJjb
-{QVc3OrWG^6}J7}Q+k%D`w+rqWuvVa0yM(*jl(#47G9$P1PgJGK*XUA{jo|=CnQ+t4AV%&<Es<xn9C%
-cLo8PcCr+G>XaV~+9+l#|J-7+=7e8J+W$<|U^rG<}ubyItnP|C7$c6bUaPy;Rzxx@1_SWLN;IwG0IN>
-7>pm6TUt90nUmP?i3SlHyBF$>Rn?N1!MNEk-fwlsr%5utLA^tmvWkyPxFH8m2JD&}5P#|=f;8GIUgZa
-O^2u}M_hPL#5iq8bMKXlp^X*h`vlqLQO?xWA{I68i0Bc6Wad(o(rqSo@e?ULAI5@Zq5EkD@$-Kd`}Hk
-I^gmk!i4^#_`F19^}_vl1y$MOtXA;^SxKv@qGs0UN4U6nwzBuUNK%(#prGl`<o;_U0!R^bb0(c`LSJN
-U+rfaHt1IO4H57lsK3b{(^3{rc{Du<Ruabw%fj`QzTp7nBcFIAM{aN@iOn)jY3`eq&Ep^602oZ=x0HT
-wZs>pC12FBfWnb6A+`U28VliBDF;=4=!+AXIoOEE&$m4ejUN)=L0=C)ITL%|s8cb72SUZCU{*QdHzU$
-Ix8r(HaZ4xk_#O!cJ)=XON+%8Fv=cK>*li63@`_Bv0D@D0H`07D9UP~C<Ml?GH*Ek9+%;2Y2!khhi^X
-1dx1GufkF~-B4=X*Nbq05G=htMB1{&8sX#_ODb6IkMSaHo3{zHk_IFD_xrmGh-ICzlW1Jpr{?koGq<o
-BJNhhb#+Y_P15w;@S5^jR%;YcQo*j$)cbYeoN&!#6>~luPEZcs-J~v^gmEb0|XQR000O8Q5kVeSk!4b
-vj6}9@Bjb+AOHXWaA|NaUv_0~WN&gWV{dG4a$#*@FJE72ZfSI1UoLQYO^vaN0znW&^ZAMf1Cw=7H!w0
-dR}YoLWCg>aSzB#xc3OJcyW78aMTLusdeox^P|3AZK3@#BlF%-gV2x^#I+%_prH4hmgmP3xyk&yO4W&
-#4WFq+5RI6RRf)hvb?xfO!=fuVsx!-bo6*YK}0*>@dePtt26k7~NfA(@QWqw<qqW#MPo9_Z@>tbK3n`
-Y5}Ta#Z-<@Bw5^k^@K2XZciAJWW{LV!68$G-Hlp>uaoO9KQH0000808trnOg<H-UyB0(0Ne=x02}}S0
-B~t=FJE?LZe(wAFJo_PZ*pO6VJ~5Bb7?Mcd9_wibJ{o%e)q4?Odbq#9I?S|rn%t(jGNFB=m42qr|ozY
-d%?OI*(Zsk{QFzU4#sf4X&&kaK>O+YcCG!^=8E`Peh_SvDDolWR3(&?dn!~42hwxgewU1vW77ZKPw7q
-qNm&G3LWf8IGM)IrY#ER>OQCDowr#BvCdoF7cPWq!a1d01B*WQqLZXBU8YvJY%3=(vjO2oG#rOszX(m
-hv@h#&tm0fEIa7z-U^4sfc;N3m@&T@zu?Pg+gtykAtHv}2c96~K>O0axPHX!y_r{Di#Tl1y=vifFQqh
-MOBoEzL}#jrNjgenVleX^xj?OTiBB|z;2CtB_|B9$mG{B3XTf+|6Uis4bU%x9ga6XV|AA2xm&9KSJtn
-KcC}LKz7F-ogWeL9Z$8_9g8H`;?n94nNEMsBbn(sl;Az$$Z^_R`&cCM5^R!-7sXFsW5CwNY`atUspsW
-K;-V(C}8Viz+VDLp-7by?0Kgfy-!$_5DoF&_8A0ru@ZUAGfo(niel5LVz}CaPK-BF#v?dU>zv4$0_YY
-_<ft^!iyH8g>;=uyD`d}9Vs;q^7EZyg{k;QBb<|pCf^ZbaB1p`{`R(hAtqISR+115Dg_2sjWrz0JMt%
-K5(;cAAHlTD}Mz3SI?TfwgVo&GHkw&fEt~YQeWF{^<`1t8XXyBd{c3})|Trsqd#PR%T_8RJ_qQ0Lmo`
-#F@YuJ9p9u57Euc3}B>Zkd#Wd0bq9dh`8`oYl6FzV$Gv%Ig*#rsS^>o_2#+GvU;o^)(L`i=n>!MN5+1
-Y85$ErMWH2YLqh989P4ry9^Nb36uTQl0@GhIheiH9Q607{LELoSiY=8sO=EvI^?JO<C?TSk-}dmO-w_
-Dgk`9>p@#nCei~AW}4!}=XoX+#2qtKdH`~?KFQX_JmSE{RK&%MPbYWxD|1$1@TZY~=TrcmRS`CTTLI>
-*j*MOf6lY}+1p22r9)nT~0j~nev(gv>Zz@2aRmFH)0p_fZ$!}_27}4naPk6y=@`Bgo1+U2qUXvHRCNF
-qRUhtZ{;5B){`?X$hohCE5PLms4r^ybk)8q%&X)=WCG&#a`nk?Zubx$nSA^ndB#6lBGEfX0}9*zfF+{
-0|Xco<I0NU!QaIGpM~B#ve2XODr852CiEJ$Q^6L$)nb!%M6vsBIPRgECmY9NN~uP)h>@6aWAK2mnzTa
-ZJZ!z}avL006`#001KZ003}la4%nWWo~3|axY_VY;SU5ZDB8AZgXjLZ+B^KGcqo4d97O8a@#l(efL*j
-#}A~kw90lKw#r$ROI9?ACyujaJLSzfE*4Bd5+@YMA;5Jsmw(^x21tSz(c0N{RZ6^|54szt4=&6ho2A(
-{k5_BWeo7_RYcAP)p6f(x+3E4g>oL2yeal`S%@STH!IC%<Qi*^mA=uUBY<_(^XUjMd<AZpUrMYIgD6i
-C3m6xeHI9TTChK;#YF|$vnaQ$PN0~%gk@aUVly4BkR9@39Bdyb_R`KGkIkL4ZQ26!<`lQgHRmci@OvN
-_x=k|e-ip2eXSN*^2?l$aBCol5X}Y1^?_F_~(5dUn9zuWo5O_D5j95KCwpDxC|y38N%cV&R*+k+I8#E
-^<j=Yp%G~xqTln&$RbOEX|pDI5v-JWFBh0?M3XM#dyC3G%gn<oOwpBMhRC65{l37bDm`)_tU4JMWijR
-=XvytFBRh!g88b5){HB-U!;W|1&l{JmMeV3na*J}GoA~nS(c~Yw`>W)@FXE9bTED@v;dn(K=&M)YDUA
-e5qh02nD?B=TKFRmhGrc@PmuYANW_Y3v0yr7X^|7wES3KjIg9~|rP5qRz&F=zOjsDkGS*?}E0HV#kiu
-L9EGlhnsQ7otAe^T}92IgQauopynSfSXy~gOE=PZYNhzm2f778e!*G%#aT&7D0r-~AuOQzSN?6^#!N%
-OceLGQ+4Shkv!?b{8k+mO&n9m0VV?Mi6uyb2hdb3(LCv90`Ox3+Z+X9mImY4Ke<Ky81<rY*IqsD)*Fm
-)>L1^%LuIlO<vU8Aak$<6aVhMnAv|0>mPHR#>Z0iIBrMW7F%~OBStp4&)Pt5K8<~2%v#7e8Rk=Ljmz0
-DjCR{6<XWD1gh$-g|u;?3CM}mX<6YQ7t2Bdy}^qJNUWL^Lnp!+{JWXMh~#1%rJD?d&-cC_AD^6mJ%0W
-A>x1u~pM72Y{$})Q<UjDEU#Ca^dK|&~({m_ILl~g4&eMe5+6dSs-Y<&CMn?U7x}6R6^N9V7v77Ue|Mm
-Ov-x__Gem+5sb4tMNR%wWJmToqXor8S~W`g<`m?5y&ynyi+O6bXtJW--iP<LJG`!dZpkjX7h1!E&2Bz
-NXc<oT${vTjj09jJ9$BtR9x$OUi{bYJ1{LNL5YkXcKV2r6V|Y1-<ciU9hkuH9ZD@Ejxy31uXWJi#=A7
-Fk-^_?pNz=1EIstE^(9QQcE2!)HTvFiF)I>yb?+%#+%4+_^_yD~*&!m!LYP|F~q&Y5omL<Vi#{DWg(h
-3rG!!u~S735WL&)Ets%Ek$^Lt(O^DI0GMmgL!qPxp%ocTnRRath%d&gF`I2y;5xgr_M<US7}|q&M;yF
-~wWnB-;lP-(G|e0sc;j|s$~#>MRjZ`opn_TqZBwF!lQk@KXFm5w{akSrq@@}4c%E05kVInu!PL`#HO}
-;E((fGb+Q*5$vm&qzFjKQ_VP^L7&8Wj9>V|%IL}ji@Eo+5`s%909gsc%?Y112F`Eo~$P6PuncH(P>*Y
-2ZHev3E)iC8jPCK4xD6-%kkX6#`x0VM<MQY{U^wjsrhImAaW2Zqk$CRMOvo<&{eMwrf<pqK@EUP6{i1
-zD`std>?YJ~Z2sx;jc(&L{YHmlwj6HWm*}q;LVVTtTWSg;<CMl-H6iQEvk*7qiGP#I2n);zJW04iJ<%
-UoK%5rl}sNNpBoVV2fC(f|Mz(aNI1QSlg9w<xvhCi*xkp4qYbHm5?yg;M*rr0nz+`N+eTxWYvge3D>Y
-f+<<fyGQlNbn&E(g29;yWlUQ$Im+`HJswEp%z0e0_0NsF^hx{8c`}WN96)^>8G)ME@WZMN%gM&C3)g@
-QnwI&7}&^CoygNnN0;#zS+?Q0g8b>g?iL;S1uJ>#4C?ffpBUR|9r-(rl(n~>ukW)uwAUff*1dw=H`Dz
-lX;H%GR?AjaFvj{^YLpKd-*uLc23lRt}r8^ZC$)pYj3L0Hl*vE1yL*F*L<^S8UL;pLF+yPNs^dbc&b9
-<u*3zq<N#zZ<~3ACCU>d?@(O^C9bx(|7ahyXkHK+h7P|_GLPd0(?7UegFRQZXf{2;FsaSg97N74_RCx
-sfiTf{GTt-CLq;)5e-N(hz0NWL?XfrVo{4d(F}VA;Y^b~@sLd~B<=HjPb^EUK{(rHPef$eARIQ>6N^~
-+(l~q>1j8e$jy65fxz%3UMD|T>YFY2rCbDg7Q_Ffto5;SSO)Y>yZL-lfw5b#PPHiIVt~Rv*hP8<>TH4
-eC7|<rNZfjFFgS)iJ4qj86jQNnoE^X?g&CBHL*QPFs_C)H@ransTiPoo0y#(76ud7WxblVfFSDX6Dw<
-ls(n|i3YCsvO(^$@cc?2q;W7q?LUen)%dvbDMVwTsx+-q-AU04jvVZFw4KPXWtD0v7$fX0%yq931X!v
-`h-Mc9!s^kJX~Qr-N#FOo!cN;Punt)p`#gF7nNK-}g3N!2IK2<c0|dxG!>&w{vUk1~+;!Ijt>#8%{U*
-y<_TbdG67K_KT|+&xo+8Jyvg>)!B1C+WT?2r4t2b3p{YxT5jQB|7ZQ8L)Y?j)oeQJbDjENwe4(F<cdz
-akE=)I@1!wUVXC4Qh47=phHLzMV7GV9S?zcUn@`9>?zi$pfoYyY7((LN5<!er#--m&Ps~2-U}G5~l5a
-9#oDK|9k6Gz8o@e;4Oc$#>Ei&bgn$4^5!JGD}=wR20kS4Y+Ssa_1D}fVst0?d}`#ZkatBN1U;0&5S?o
-rUSbB&}J$LKT%DJWNX08J;=`&O*6EqMZd;dg@2JoPPBqldn6stdkl;X2;JHm>*f&~V+hKze%bm);KVb
-&(~)hnn%T5nAE6!qs1(AV^r*2{AoG7^f>>Y!YkVd*ihT^}LP~VNgsUFtVr3zVYv{IzI2dt9-K;e`Wqj
-FeLZ=!MxyhE7)cf<vSa~1RDHzF|_jk(}#`MZPf4`#lF*mG~Wf9Ud-OUh=kc{&(G$qTMjk%dKuMECj3^
-=4uukpHg&Rl6H>KlpP2T?gNJh=ov=+h77v8=xYG_yD)Wcq{&p6+Zg+Cl-_V}(P0SjnI+UF>&uF`YS32
-XrLi>QddS#GWQ+k6Zt<;vwGLds7LKWqrVkLxypDtf=rqjiT!7h?mivO_#)EatoSk5k4s$%-UdBpgWN|
-Qp1UKeoTWK6=+#QO5595J=B!;xGhT*LCD;fSn6r%jqeHU*<13)ltxF4AWiuo+wd_hC$-Xx_pNE}k1!-
-vhP<$ltsv_yGmZj^rp{-i5uRn;G5!+A-dszy1;3{qbO9dF;)V%@bezTqx~hM?*R4&Vsn0>0Qa~Sl5_u
-!~chMja^;QOnyctkD%~$iz|S~9%XM%&=q*OqG>C)%K`jMZRv=Eh__&WF~53g)^VqcAKv`Xt?omZAdm3
->2gnsHOk)kR9(4){hV7IvUnx?F3sk2~AI?dQQ&}(4=4a7Z^;w>_JlLta$Y;vO@#&7)!>vKWDplabS!L
-O|1PANjKTt~p1QY-O00;n48F5T~*4QtF0ssJg2LJ#f0001RX>c!Jc4cm4Z*nhVZ)|UJVQpbAX>MtBX<
-=+>b7d}Yd5u&}kJB&^z2{eq)WfE$5WyA+sZu1M6tM{HWmj+jRJqNhH8^%Pb}0Gx*v^-e?b3}@)t(uT-
-<x^k8LZT?CcZxy_^c!|2PWYYBO|beo0qQ^DZIb`0E-tZ!77a)_ztDU1T-Rixm~UA?$=Oofoa6cqap*$
-;9qXK-A+lnH-c|Fi>`GP6{Jc?nbh2<6PJq{Xua>O=|O#SrYMS(1-8*9SCxSb?v%vdghZVwIuSb_F`q;
-R)-brix5@3s+CDO&tue~6078vs!-R<E%Lwepix3ZR4N@7OX6f8BxYfEsn7w(u1hxHzJENiWrQG69mFP
-olLBLl8+Al~M2L$J7aDR)4OKxIT8RcD>2b;K>{y{RC%WfNCh#%XvqntfZg_c0az(IC)U^2JAI{w}#>{
-GQ_ezv^bM~vHce`TV=HIbtD$|v^_+_Azc!O}f(b8uNfnFA6q+WY&j=FR<kp|(uGxIqbwTN6eG1xX<2b
-(3za2dkvC*^Hb`vs-6>)K+4Mcdhho?CGADkn^A=Jj4Y#vd4#h^l@EI>my`kJmNL3dICX1+?n|Vup{(8
-z=67-1l+_tI&>MZje7>*u!X^Zg&GXZ1G>g&mA~iOAjSO%%qJn;ygG5U!;zyOk6~6rb%e8ezIj3PG(lV
-NClfTa8>usTJG^vhyDXVxdn6Bbr-UL_vW;`Z*LF^H0@v5SPj1ywaCD|F?=e&lAZm^x_q&2iTdKg-m85
-^rCKZ|p_HvQN2hOB<Ua2PY-k=NB*8E)-+K9<?7~D<a<Ju-2NxXYI#}{SO>#}||2(c$lsXnMm<Qun*gE
-!Oj_LugYZLBx=7(!E#Y(s1n{sB-+0|XQR000O8Q5kVe4Q--5Oa%Y{^%MXA9RL6TaA|NaUv_0~WN&gWV
-{dG4a$#*@FL!BfGcqo4dCgaCZ=*O6{+?f9wb~2pQPh`j)%8P~rq`UZNfokcSF05wFcj_xj%?F3ce?+6
-V@$v#KsQ>Qw5W>8_?huM!_0VmN``d3W${ZS$R9NIMC7I9!DAwUExA0uxU$Kub4RYuhKZMPAW7^)%E2N
-WfK0~2(bO4{Fiybk^-f91=!$IObm?)hqn@+4n|)r88*+AWAzw!GdH!<Q>j}2K?h$<A)tWLve6d{v&n3
-AL^}bu3#7pL}?Sy&(upES&1WAI{YD<Pvv!CMhZZa|3%%QT{4&HoN3t|j}VDT~&Fk*}{i;Qzz{$gI&_n
-Xoba)|?CNK;M|SiqYoEg&TER?EO6AKmK;jr!g?b_H<JfPjR<b(^=#ErZY^j$oNDGKR7DT|e^B&Bxhzx
-){xSx#n;-o8O`B9XZ?0C2G-6JkAj^b!L;1>kQ|k(bT>De1AWhyW{Eo%qXoFeC2a;a>8>liBoCTr>Py;
-C@m3g7()_p7q|Ud3gu&*1RE#*8%`|cmuVd=4>QIod!#%TF-=>6n=-N-F(tXDCM;+8;RCwSfzGGFWa7?
-8!$pG+pS-ttm93Oki@)E>{{je!>taY;*Wi$ZTBzj10OOaEzVRWjI{(Z*`9O@Cu6(3PTZPU3V%1)s55V
-PmJ&c;--a@MhEx>J%U0m%2UGIw~5Q=@-Efs>U_N8;#WZH=wd<%`s;aZ)Jsj}St9fTu-2M=o%R4HK5+J
-6B{A-TG=_2oka+hZ@P@bqjh6X{N-oJxyt4ay8F8*zF8J`ARJlTqbb(JmaH0i?HC7y=uoA#HZF1^k||c
-StCgs^l&@h|%5|%zesj8#e^tb~c+7^xM1TKKB-6r<o&J*SbiJUz`2!C08%HPIh%@x1l5X<t?m**Ph{S
-V)t>96ne8vtTQphbI0=qut5X24)nX`j$~MzfSpyk7YRMx>+pJtcR6`vw7Sx~9sHiLA5ZrGJ7UMz%_7E
-u^QpTVNXVdB@tu%N9*53i-cskvK&PWo-r}Y4e@f$Ow!N;O0)~=m(}S9N8(=6cVE?L3<aD7;iH0^^M7s
-m6aOA7nrkYHAzKn6XW4<#>EYEx&xFplj&Fj;N+SXE&s3A8qD|^M*v!paJ3fpGIsACHpq`+Ibad1;at%
-Goh{i!%hX+^c=?5KEJ#6uxJl4r43+tFm~996cP+^M&G-Jf+KL+#+tjEkEE%k&$-x;n`6zF>UZNvc?!l
-5t2x1Qj^ugl2-!kT5TOLDvFGQYxZ2eX&cmI4l+HFXXoya!x3#M9;aXX~5Pt9^_7w5Ea#E$os9duQfe<
-E^M*{bcmdv$;&FnViVylmJFuOSQ5BUV!N(&X%l!`gD<3}@n&t!njT(|IWe}@n_20pz(U|2#8RVwMlLL
-!JHDHGq?D0*G-~u;W7x>cVxJT4Gm1CWwLVysb--}<jtVFWv7Fg!$_Gr)@n3Jyro0xsgM2QK^0uIbbPh
-aQ0VW4qdFV2uvPv<wKUg4p313#ozFS(gw4eHVy{Kz<0_ls0@NyzNCXVe|XaNywelg^a4S2B*z|h)@+C
-V>x@>ADP@(Pz`D|f?UAs{^jpX(($r8tC$$P@U3*^Pg=b8sd%4)O%b^VfLgXe9s>yB?lFc2ocC7>}A8X
-hY0)T~+h{u(@iB_N$j<(DAWan{E5Y>i7Fyc1Tn#Sb3M%Z^_utHn=FSp}0sX3sfCh<QHECgFh9Y#Kb+0
-N)E3+FIHolAy<Cl{MeOXM?f2Mqa^%Y3DR`Z%IVDz@>lz|4M%1^<rTo*e^5&U1QY-O00;n48F5T^duJi
-y1pok&7ytkt0001RX>c!Jc4cm4Z*nhVZ)|UJVQpbAcWG{PWpZsUaCz-m-ESH>5P#2KF%nV(E#V;P^{S
-Joln|QcE`<}MYV(Bl!-VY_8+pAYoT~fVZ~U=~y(|RU=5!CoOLpw}_HV}H)S$-~E0NsKB>cu%AZG!CcY
-%<Utl+fWIcvei_!7=edNjyV0yK#TOGy(_Lg41Q*B^}gFij|F9ZdzFLkp7mf(r@Dgq@up9Uav`uOk_8)
-|wqfG)PnUn6MtFT-15^nMAVj>k;7Z;^w^fJO1rL+tMHUpy`gLuSWg;K+~t1?%kaa%>J3CNBv7M^h-^@
-Kfme^ZqJeaS<`p@o15WBwf`#DcW3y2+2QC|t|;*x9SleB&u_r{q0<lTHq;<a<{-&~Z0fHti2l46JY%s
-5X>@({?zTemHA;r&93By#Tws>2M#B$-ODp`^H*3{6!s}peiI}fr(OP3Ng~=pgiJVO8DWOvvr1~kcH9?
-LbqY`cDQ*B)l+2btbl#C-m2)oFpQzEX}l-CWz`1W%6;kMCQo=Yi`Fq0(pRi;Ev0^CdMo`puW;mMQ>g4
-WHVBDV0UkPALVY~f4Qkrs@aDmZI!&47!T2#_4eJfneBP*<7ne}aUmB*c7~HepF1<U;Tz$Qj9xR%>fH>
-c$+m1G!caDdeXRu-KD<m;>VyBFe)Mt&<>{0Y}ZE>1acnQm8O-V~znV0)hU~6;>o7*L5@n{)LF8NTehT
-!WF#5#Qk*PW~Jsju_>UDkM71KZIv=fHN;e*78tts&eQ>sATkroIX!sc91%Q+&MRE0JBI;ZT{Dff4Iej
-6_!7{JY~a<xMQ_40EN*|>qNHy2-@JjBjS8+DBe|A(-U?baUtgiL;uNOivLM=NO0CPBp=v~z=ngpB@O{
-6+P+XCzz`Ew{mbeS+DizkS`qVa?pwrrY8&K8B*AD3g$D_o^D`Y6S^@jR+HR%>=^<j8BHRzY?YMIDcj>
-NH7km!Z>*EjFN@N2hx6a_26h_(wp>%!mLBsUVh&QtN_BwB&WCR%+SoM;Wo%0zoj&Fys6unzqK-<4?hC
-i(uHJKDZI{Z&d1JPBR6_9*nXJ&T>`H`QL5fB&-Zu8=J)qhjv>_Z?0XgsJd7g3yfBL6|KY#JW?j`wGr|
-v3B0Q!CmErWnb~8Tz@nwIP79EFWlmQQp^N(BWnX}_&3Rdr-@8BvpF!VPPqC0K0}EWZpF)9CQ>f`u(D2
->T#!i5w;#>jj+Y*e013{+1TSiAVC|DINJ;G8#OmrS$LH$@^02@`D}|1cZf$tq`UEfX>DF7n^VjVans1
-lTqK%d_mXrGcr$}Zcc5os(o}1Am6M`^FS7ruD*u9>7a&fFTHR}*_WiSr5SXw1@&e;`sEWB@c%qH-E8K
-wRy7BJ0SbdYLOAH<)tRNBNpG-0(X-%k_6&Yao;D431EB%U}@br*Xo0vDt3&^R<(8#eMKn~-%9iNNBRq
-`GQt4(B*?cH6tMSc5jCGoH~H2WAoo^LkTgG-slQcSRAbQa;t6#)3PVclJ^dlKX@)1@^6qPJKnjuuMeG
-+tl4+j`OvnyWVMbp1J`?X_y?)BAt*BKspYV&DCoJLyu<o)`%n$5ur3yPa&Hu)f6Dq+SZm84?ZjH!J-q
-&7wo~~<S&AldhXG8CCl5bhD1-4xmBCaMY*LL^M=`W$n7rp5Y`1yz4OUE5Cu}`;v1+m7$b@%`u<oO+;Z
-=%9hH2d%Rq^g5_eJ+OO+p;9ex-9^oGOHWgY9P-Pp&6YKw$AHcx-F%_43G5YvRx&6+ZkY)Aw4XIg4bZ&
-AP^eVEBbCVM%EiuQC2$IX%tO~-w=5*R-4Q(FxN<j1L=S<HVnAc!J8EZo!8V}5MTKIMUIKc}{z0N$>db
-eq^x-^YxQn8Y6Eo_!p<6m%LJ?V2WxJY}<1`hP&HF00wzsC~}=RyTgaX5%%)lSA6x0qtf>n|-VyJmSl@
-HlpwH#$@XM=2YR7_b8ExEFQ4>+i3?IuR_ghxQ_k-P)h>@6aWAK2mnzTaZDzhQI}l-002b-0018V003}
-la4%nWWo~3|axY|Qb98KJVlQ7`X>MtBUtcb8d4*BIPQx$^z2_?|?XVWHYD@^BO1m(Mm^5u@9bBudb=y
-FjRIUfx-{W>2+Kn6%`{nuhIT^v^W&)|pj4eVqa6WnL5H(UGSh(gyrYIS_g%7jo-E1P;1AG{(PY~-*(*
-#0WnG|h{8L$H`5#CN*It#JO`9~ANi#ym%vk^=JB+$~&GMW8>on!?e)@ZrYiV<P8Ttw?Q3i!yNZ3c_Yd
-beFZz3(>LxC4c!Ox-wQs9aHqaix;v8>y8RNdj{iPlH)-KUONOblbwSX}L1{=$K;D+3@}%KU5&A5tdR+
-r*oQ<t1r?pbXp&(>Q&rSNDBLMSoSv&k)ses(2y=_9fEZ-p1A3y&IYcEy+Jn^^1(s3GR&duQLn`+zXih
-7QRatdf7dju4gX6@2{q%&rC&W&DBTfM0>~S!okgWOH}WI%%eX;-yy`J8Nvy6hN&JBn=q$SoaXpalt6x
-w{0|XQR000O8Q5kVeUkP(yXes~zVV?j19RL6TaA|NaUv_0~WN&gWWNCABY-wUIV{dJ6VRSBVdF_2|d)
-qda=y(4LtUOs!uFS;FOkaFQy^}i5)OXT28#`_9x*nAlDVsG#s(i7d$>zWBc>zEG1SKWiK6mFn>ko+}0
-tW}@9Go{CfV*OUZ(q!cIL&X4L{rcAzr<g5c6WBgaj{&L>CJ5|g5!}md~)z~AO87Ve4pmgN}NZ(q{|SR
-y-a6GUL~=p3sK)D;`OS&Epl;Q%<G4!OvH<#$>XR_;Wzk@lp=!h^14i~o4SB+H)WD6lDtM(=Sd=7o*tj
-PIzI{PceRM}SR9|dx_EQ?&D)E!H|O{xwA-1N#X?M{^QLafWI7e;Vp){X{JJW#rcS2(eP>7hUR3H+nW#
-_Is@mD9%hl12fIszPmF*<&X34S^r}WE7Sr#QXfoEbOUKM!)aOc=Ryidvs<~2?8d2#vVO8i+oJrZJ9EX
-(L-5gm!VfT=<w>Q6YI!@TpG(=#=o`pzTJmubCPCKU{I9aRbcG^WRO@~)<b@T|#GU|P}w=1vmoi!@6vu
-whh*IeeyG<~*m<>n6?WGzZ#28~LR&n;aMUJiU1xl@+qALY~3*C4Fy)4X4-9?2bAp65cj-nzb#OGNVrF
-x%xiFPfgx_{-sEB`cN&iw3d(Qvjr?muN9~OzLp74D7gm^zcxipGoI2X0FbK>Wp=oX>f1b8Buq-*pK5U
-k&Br+X8iewqD9&${9E=5_gTx%|5S%!f^SD7ZI?|9qI?@WrSx5N{o{SZ@j3&fx;A0ggIX()8wDyK0-2x
-`ol)0P?fZs8h!*n=w33I3^^CtPV0pX#!7s~_)`}WOCIf-vCE?)D;URqF_Z=x!lJ!|UQZ($i`iR}40s;
-Y;gjK90t)Zgm%CW+HBnbqpY{;nvD@f49xN+t)cwkm6h=bJH(aV~+Il)9~J;MukL)4N4hE@#e<|JEc8N
-zbqNp(X6M7vH^<i$IU0ezC_{WFRkTy#krwg;Yilpc$4;4Sd$0TgYjhlyy;Ldex?|RBK*r{AqLBd6ZR2
-+kw8apiCP;a9I{NN@po?B@xDl!EI61hDZ(ugZ9}F|Ghj~BD3SGzhG1N1|we$M`C~fYhgDSj>XVy69O;
-|_$Di^qpZcqTqiA>X+?P2OQhA>=C9`5$|Rf>izO(zVEFeS+#CG`|M|mEt{41UMD^?zn(A&L{lfD%k)f
-ZD)XJl8;Z0dI%iv%v4m(Q|(H#qfva^!_;Ww!MwAe=J!`H61haY`#E}+Tj*$-v3TxzlD>Uy7Y?<n(r<q
-hj3v=n%-L4#`{k}7%4Ql~#tO?OnkrE*=gN>*|vVyx>dyI`uqEzE%Wv&_N9*1uI>8el$AZOXro(w;5_J
-4)1So1n=sTS{}%8Wx|;bainEiWl0Tw0cytgBCP0EuE#m4M1Ln?&xvU&n(AVDDsdrc?t`X&|It8H)(ZK
-GgB*8@)M=wTOXAAqn9ark^-8dej$k!#{e1h{w%5!CauR)?bATB48*VlA^1MZ8vbY)0@Ud{t$#C(^9m7
-|vet}q)_IK6B6>G{0EwGLWn4`TY;*D*b^zrjqS*{q0DgiP;mwO<@%h2wpI~W&U}ISDdHBchX{)bME{+
-~QCMt$$QqRMpym^dlcwEkB*mYO-+~=Ogkj5lxRHv6$rh?ClTEw|+Vx%&E(V9-~UQ+)!4@m(9!_e@}vS
-eN_3e+iOvWQZOY9`zV!ho^-bZ~Ul0@Or;hN?SQt|kZ2dqc|%wN1aa>1!jtD^9Ble3spVFTVQn$&rZei
-!=s~<ta=>6tL=(@*ZL{alHaG=S_w5Ulfil-G!Jf$_1D*J+44&GDj)Gs7#1wqH4<fWQ8zcRYuoYTHPkG
-17=xd>1-vUMFGQ{pT9&Y&M2^>*slWHQanJEnARu+*Wk4{0Lmn)iX5OPVs={q;-Sr_C<PnTk>HL(9Dv*
-a+47Y^$21qSwxf9d>Rh1s9*KeY48~oSAk`zoW7q|&lK`&G5|+>cW+Y}1i;0KFMGMrGs~#>%@d7!@VES
-b+5|fEuKk7Gg<eudLUz=-CE(>uG8m%uN;FgN;{M)m)FQ1E7XBQ%>q2ZDU&CX8*S|O>R6*3@3Z8lF)5$
-59IHl5uX05O8sf-t*{%4mk_3Vo~+7yuekWYKk!i2_=dEIil;WqKclnjeQId6c~4)Ir!?G5+B;$?<n|0
-V6GVD7I-`CE0w8GDGvA;d5B`IJ=dIi#kiH$^oY(*ZLjxL5Pl09tXqAzlT?!8H+B-3@k$saag_&X?+_E
--{t%J;PHat(>&`wb|<uvg-=7L$8Tbz1M30!lJxNrNSrLLlQ;$lI0cXZVBoWT$x|2BTlHX$%~BY+%xO7
-CS^5tE5f`ZbXfgGZ8(j3HnnlYbP$V9iq^}Z}erG6J4=H+;C>EOaxn{Zan#UpuZ$k0#@UZtWql163%pw
-TQ%i&LZ7`mW5fD*RWVHC$iMAq=AJC$HTK%d^^ph$(KWm*TTVD*X1OWTK|EfB;`CKAxfj&K0qXG2t3!=
-J)oi0*cPkVgE|zYozKg{Oagb@t}u_}TeMCt`udM(l%J8ySY)_BR65n60U|E&KOLna)?Z`fIU=4fjL<v
-yBtXWyDAU0EW&J4-7wDuXKMf4(G+}E~&$tqy{}(B7k5t(u_v3@2P?JzyjfdI{fnBOUehT)zwa}$xu3g
-AM+wZjT(=^4F<pHH8K$vOeG(qng&+{d?v=x9HgbXYhrNCknxGZN{V@uW(`nToaL~b0ayj%fC$f<oYuN
-S^9n~rCnz-O=Nb>BfMYkv+_nB$Fkqbr_@HCg;y8BrCUUS`s3!*&yw2YMZFEI^K%n>y)3Oj!l41}^N(z
-1xl;e{(7t^!X7pG^hp1njs^uwEze|vlS=H&UH6+!7mI!;*yYGp#xL174npdo(&o%t-QUqNFK=)lkw$g
-;a+H5T_s7F=G?-ANeCu>~0#u=0+nkqsP&mVkK$-Qovvv-3#JN-bsrHgegkTDgi2)xMlDN?DO-E6~*m@
-FYexPL>tqHbo&4@vC#Bi2w~$t{gx}3X5{qbEF$QR&J0*X(n-Z&K_Df*M8FMiXVUcvFqdGg5{+_wjVsI
-8Hy}KiR4jrux!CC8fXt5VgqX~^tLhB%nlk!iyuAN{*$<_{(88t{x(YiM38}MH3Gl>z_;2v&h0=i>PNn
-nIEag+%7@Z9QY#j0^`olW_>l<OunmnK+mA)G4A27}>q(48qmE}}A`e9WJ+OaNZopY#01?(&|Dg{XSVF
-*_vH(98gMe0UP-}V6vlkSE>q!QB^&ufU)8z30ZKoZ)TbnTF6aZo0Y6;E;T0=~bfIE=*L-!4_yXqShgq
-LlQ_2*~e22($<&St6utz}Xtizcg6K#CW2MW#YVW6Dr_fl?Y^3SLk>od)cZ@9o_^MCDE8?rFfoa5|0C8
-8i)>WelVaWXle@INPY`#gWLz5M~#f88Ie9mHUrRWnutvC(yxc0gk}}9F$2>g)gROe-r;9;M0%rX-w(9
-31)O{y8bo22f9ThE#Q1`|1tR?k$C;=;#=*BN*4?D9l~+~D@?e8Q&g!<(i?({z|g6nZBqa?Mo~m0P-U3
-9A3Ti~7G`-3f8}R{@-xme0`}4fo%x00XGF?w#olcNUo|Yy9R+Sl-KS-dlbskKUV{-~HUnb~qJs1<QwS
-k)_7s3Rps<mjNmLqm;)n*Gra<kAV>EN@Kt_@pI4?CuM4pulQV3J9E|>@<nwb&svp7yUB2mVZq5h2Eer
-EdN7@S8fN-${=np*J#_~pezWq?vmF!6^;Fd7%=!N@T1&|Vb$XiATQdCu}N@}>X+fJ7uo-lbJtLF*C8k
-shG!?=>{o7N?@Xq!r+cP^_@!6r?>FmP*1RDU8e~O#{kMjYU=zcNknZOZf;$SVky#Rz@JgIA)GaXX{RK
-ZxAa4M<&HA%Pec+L=p<ymPrN+^FEQ%W&oWvz)gsD4X#iq7e20LWx8x7GM(!QLt73^7V)U#_1T=zOWkA
-FB|D&rk4wD2ZvZCxc{iu%$;7{4#`rTx2)60CgZQIYMD#|T0iLGLIY>!}Dp`&!6tNTm0@@li44UV`Lz+
-K59QeG=4&6l^-J!U{*92DdEHRcw=n`3q9{_>==o5BlqA(BByuz^V$++!dV9gjIsZM^pphcP>`yxcBkj
-uCa5d@E6il6iV52!yFj66iMN5^6l*0ZJpGP4Z@KTY0&?}{-au>^)raxD9(x>+2U$U~ZCBEmQn{8yYzb
-xS*LX*p}sn(Z(TH&~LT0)3DSTu`u#p)q<$jL?{agBo{5NWIbCW1$iyu;#^WBo|sII-q7<Zo&+4p{OJz
-kTT}97R*rnI3ni(sV%t;AAQk6nsH<Y@UE<<UH{B&FFqsq-Emq#-Xu{jQ;<sXE3qmXAQ`%pObZOVE0Lv
-liIy~^PXY{rrk%7|RI>zB&3vA|lQ{!m&aA<lH;}t3#4i|{kZmYPg@7&DPaV?Q#Arj^B*9p>0ztJy+TO
-L4!>sV(M5{pj1yj)httN+`xH?rAjMreiF6HspFpA?qw(Qy(L<tB>q)2&DRQ~9QeESwTiYEZ%SatW?v5
-vBqJ4t?Rt^TBj%+09LQrSDZ;@{Kd3&OgRHD)MJ;I>6Koa;Uezu?ReQi{HRzQd(t|45fSUv@<mAaE4E0
-cy*yRQ7cnRZ(4+f$=-UQqw6WWy|SwIO=y-71W6Zw3Y21Oitd_4l?qW9V0que+}$L21z|$JeHVk<H2J)
-{iC7A8Kj&$!Swq+_@vY8of%Gm-%n+9K5S-L0V40JZ>tIemL_R5!SMqI1I3JtT};~tq?IxFi*8^(4&_X
-;d1>}fIzfdBRs$$BFcRyH-jL0<c!q2G`siTDA<32-@@Y3k$~T+9sl8YDF&o=BKQEBL4&>f2evypV)b`
-1WT-vs3)rJu|soLS|)$7%elxti4>6Hg=>3FfMFDGL7OLQL%{r&zA;bHYO#<Dh_PQmYCwB0Qz1<YvSD$
-U`sdeAL`T~%Bk^f7$ss|MAu+F@qk9nm)LM1NExVYWmC{cA^>6<Nl6YdYU@tYB%mP|z`BVo*p@z$np#=
-VRU9&QnxepUGxUeUp!PyF)$VZ)zsbYOZijHsmm-5+=&wgjfxpEZN*uRih;Gvq0DKSRFu?7T2@NkR^PK
-BccN`L|LEJ%zN91vYUY#DNt?jKGd+Kpqg-i7&&=TyUJBH0GqM`FV!!Qs*#;u^g_|)Z|fnc@>zo_<92e
-J(}Y+ht@c;Q%V+d4+kusM<S9I=2IA4$^f2Ptk_ZeXC7P!rlaMSPA4AA3Nw5Vmw_r&q@%!&eNGH)++$D
-MX5A7z!Nex3z73LqUxNzz-tx3K)`)>O7;>DMoAZeDSax9he08i3nS|;`m?SK)uJepknRP6<q`#(K|SD
-%drhA2#7fltx<jxw5FP?YHnqHY_k(?tqK2q@?@N9&`eUxu^LPOF{K77_+7(RI<(yfc}W5VRZ|wq*cDz
-yjl<0+T3Q9vvKB>3~pelMkjCQST3|L<V)7hym5D50KCBi)o+u3H0*Ho$TjAgvkX1Od93;2RLY275iU)
-`KPbiZ|WfxW&C7<cE;Cm_H97>4kW;^2SsCW*LWy`wQO}nFesBK&Qdp@tUqHi#_clFo5&c#H1bRhx8g*
-EQv8$xsBViUYm-=V!;HI-VTzPjQx#1)OE_^X#3@SguT5Iw^30)GdDEcFgE?%*xh*qIIXPXS;5|eu3_|
-d`5<oziwi}|lD2-I_sq{zD0BfLt&LVo3E}8}9RUXorOr#r`b3H+vi3S%$m3G`lGWVXPAk$QqvJwcr5>
-($or&&nbp;LTI6$nub)3C8)npXChtXVLBPenGE3Iq7^P}DU%!_!K+Zm;37D!`HD9w%1kKs=u;_n#bo{
-uC)bhyIj-MKC-8)vHwF)h*RAMvc>ojz$5E#Q6#w(sx{qK!n8&8!Aa);MO!GU<`tDgOB%7mU1Ofl_0B0
-Yg?cJ)+;<hL&BBXQwM0Y>DA)M2Uhm0^o9zz)c%o4XG}@7c%=q?C`G_5mpc+jYk3ByouY>6TS3|)s6S;
-lNF%e%fd#?X1p-;yQhI%~K44Z>7Kkw=O2C5`x~P|cwr-r&Lrrj^=4Zubi0QN_r&V1n14j>aW{7`swWt
-|7QKOvMIY2wDab0!-6a&WfaA*gL^E8jAEI)yxyL$2270;!%sRS6!{VzjtlFHh^gq9|YVoM*;PFcjLb?
-e!8bx|VMT&7CTp+GDfSS`=ak55l&KMKnNWvKv->;Z<Qtcn2&fo@3wVmXz8;e@^^cc^nL%OLVwKGnt3_
-lOYwEh>aKP|FXHUZfRO;`+$Z-Gxr)tt85=tnNmHJ=pO52g>2S|CjQ^FyvCK03MAsq;6i0wSl1vu!EDX
-SBddS>-&T#FrecDgMi+&r0m-(iPnN461R(~<1a~ISO>6KJjt^|rjjQYD7apRzN9uioRsPP>*O}NPr;r
-7BNyqcvXTdwCIV$%J2jb-5GErxF>%o3cX{#9t{SdY?${nZ18<sr4LmI(N8<g5ff5rPGOYE|{Y1pSZR9
-AOw@TDopG7R=WXZp1rP)_{^qZI>2i%S^Eis3hh|99L&XR>ZIX(3D>u1dxhz5HYw96rXZoP;89hB5)pT
-W>%!hQa)7B>BmBZ-M)v`inKT9{tAily94qhUrb%EqZzlf%&emrsxE9VOSE+W1R_LtXuq_}qPrRfs;@Z
-Q4MB;zm8Z9M=&HU{g<P^JiAjWcx{nXmhg-c)PHBkY`w*j{R6-V~pfS#b~%IUSOR_k>6wa6`=I5;?MhE
-i+_z4%l{>kdKNlyJRa&%ku@iudXL|8oPLu!&3z~Fj}GxDe(-cG{wT$+$+<a@s6F)s5w7~(-Gwpn(rp~
-veJRM>D9yi%mY<M+=)n4pcO3!RQm;YF!cj*o-7`+am&vRFLfoTqUeb}!sr?hD0((d-SC`udbxuYVW0P
-SRhHkQXIJC6~`a={D^0|dOj4}ut9o)95Ck9K(E^3jtz+nv88P8P+6!D@DmETO&Fae%H)!)2@Aj@)EHh
-C^{ue34SX+`y8e8kqb|D*n>995(-w;5B`hV~eO-d#}aLPrEzG&b&kYMS}gzX6Iid0`0u@Lpf31yiwtw
-J69l^L7HYgXLH2AR354WQzwT`jOKi4%Mc4Jh9^lH~9fOmMJ<Yh&-x-k)W!%>tq(;;{tt+q6W`2T7q@2
-nxyK0lgx!saZ$ughS!NqkbShxYf*qUdR3!g7xxxYT+B9rp%!alaO!g{5N@&-N|b|L;S+cpfLSevV{i*
-S{vC5hg11?tjYDT8n%k{PMFzHhGgcL>Z}CjG6LbK-YD-sf54sWoXbdj@STKNU1nLGRXV$J^B@x(LycI
--X%!OO^yrE6oPxoo^V5BQBBS#n1WV9)$;8KPLtaZs*9nL(3*gUE^3k6=|vboOE8D(~6M%G1FF#@(ca4
-h&7CLM8sA*ww*<;7VD0@~Jm^7JZ90vlLzj8e&3OM>G=S{_XSWty#^0hZZDtZ-x^rwxKnbH0x!LQDQor
-gc&&GF6<Qi<2y2+eAf3#S#+>x^R_z01ZuIU|>9SvkYz}F_NKcQ%<2xO2^Cqb1e<mE7a5ET1fKQ1+{Yi
-c8Jf3D2t)sX5WK)j>lRwggjH2lE`8qn#{q5J00_5ey0t5M1?X3RUOcDkmHx{KU}r#c14suL@O8`#3qR
-<D&az;T;j+Cfu;|tN#Bmk-;x!(_@qZ2Ag~hfq~RJMXmce=xLQa~qpQSwZH2xlgP>f(7+2QwU0e)OQ4g
-iHlZ}U5k}5q(BziYUVJ}5Z(~kn3RrlZ|t5{lEA^~jNs%FVs)Xg=iCOUW)VQzSiNh_nXO<b%r)I=StDY
-&)c4lYcb*68DJ6d9`iE(0OTTU&6FQCUV!J}esNJ<Y(;NKUX!8l05WUAIwntLpx-thIp2>D}^n+;mf=3
-pVH-*@Y(0AXMvwSr%sGt3Zhe%cdoj9mrtTv$c34KwtO2xZdr^flR*2I>^KKPe8OtW~NhZs6Pbn4?c`^
-oZgXEp1<$ljX^&XPa0qW7OjXa4AJigN>#xu!;`3(<)!MxJx@W;@L1VDtwCiexKw($@}!ZB+YJx}H1y^
-LVB7%vg&GqV35Q#=V!86sbNDKGXc6N>YV0LQBy)I<ozag&0^uENykj)4IJ#KUH49!er3#RIYGna{goF
-`z>8<P{7z1q--Q|irCj4N}2hf_%ZqrOU`$sOT)!#1Ho<9F2%5RDxAK}5;+GSJSI$?oL3S;`jAa$-4&0
-j=yUJ0hVDk6ZNNzUxwe=sL&iW%07L9o8EX1I*7O1#=Izcn+ok{jI#lB6lJZ#98lPVu6xy7o>UUG&x4N
-ikrhJmGdOL~wdGSWvHBgl^q2e97j1yXKhpA$;PT7Uj!Q!|PJk^vF*3BdQLCfFU>=?<#zgEQ<TY+=`7z
-%`ZR<($e4+EFAI1LJoZ-wJ_;w0dS!lcCOpRveu+R(VLpzo?5R8WL33>TH&xu98+w(ic}J54_fS5Br)l
-hLS#b1)TPs0c9o^aYSN!htH8kZ|Gj+8z@_!(M~27vM9p`MuJ65!RA?n*em(+Q(&JQ<vL@J_8lZHs)Yq
-9sv)g2fzfQT-;bSXEI{@%rg<Ev)uA7^wJn)vdJ{~%aB_HQ$4^Irk<;uR##|GlxWN_L{NCDwb(|$;fVx
-v<Fm=&M3wCwIZw9Sf6O(-32`Ajz1BHejbLg1Oi&(V9|lHj|$;{E&g>WU}a=?Q`R;EQpbJ1Z8C!97ctN
-%i<oUwr=gS5F^{p!{mIvn#$)m8IYd7y}0*nOGp-y=*8*ReL{&;UCBF&!6z0&+(rxXtgd^%N5=>`<lIe
-ZVV5>fYAY)s!40shiN`5$|dGA@HhxqUfR=+sFe(n!=B7+ean?6Oe&oYq@1k&wlN(`pyFn+SWUMB*n`b
-9x<&@7-mv7W@6+UA%r{KP&!?b%>ElMUj4Q&J`X)!vWij(P&)blinUpN>4w@2A4B`T!T6XN;3goVMhC6
-q+38o`rc7iCzCe;p}9|tn-O-N1;8RS=HJUmvh)z}J8IMD&ET#)VcFYJnQ`hd{gkMMqDv%@#(&HkBCDd
-jrF>n<p_4U{*#>yoO7pO?u^lSO5le85AMJDthV?K_!{ZKI``t+2?GrTJaO>8iMBt~08U!doRMdF246q
-iHmJr>WqbJR%NiI2}D;@q7-hPLd_|T}$#(3+FkwvatG*z7=Pa0De&8)@_9q_gE9eo3>GQQve5V7b6qo
-38-g6i;9Rio~4>FRRsndy`gi$WrEjmUcP>F^8Hx6I{EQpEdF-#f3L#z8L0MPL%bmqB_&l#7?VB};yk^
-{BfN_m5p=lgIJaF+^O+=I9bOZutMS?^Yd|3u3-~E^?p#wzZWxbFd|7LWif+p5v@Q|D^(icQ#RIt#-Mc
-9WZKuX}sE<TOHDB*>&>}t-H(2Z&55=Pv?iQsQQm)IQu#-VsRBJiiai5j{yS#Fn(cf+>p}DH(x8@7IFO
-M)bxWtcR!T+M&zUmto*W*OI|Il@0rc-&0$`-WkW0*0?i)t{T;M-{Lifj>^PlI$URwMD}$>eKM#Fy#SW
-M#7-Pr`Cal|xQ){W&L4$)9NLaaGn0o=J^VJ!-7Z$g<LK;NtRR&02S~vyo(#nQ?v8A4i1AKjzIr3_?0*
-SMQ|HDsx00iDmxx$rS!&QKcjW+)VG|%Y&=7MGFpCtzyT^jPm9zADvjwWLq~f-6G_aoR?1&=XFCb=UXs
-}?HH5->sMDU<DXMzA32W)%Ya*y4MzTR>adk;Fe+GFpm{B&A$4!xqq@$Lf+b2<5OdXzhc-*H$~LA$-&9
-r`t1Sz<;3`g>6uwCXBOtfhAoMAwM#lUxPu?+4EXJwWsi!Y<T=(xb!e3b!bf4{WsLUYwTr!6eszp3<vL
-Nf_7f=2v$vm)S4j7a1L4Q>-h^@LSWQ7;nP`k^+uJp?R=<&goJHryqd6mTLW@)sMGgZI*rrAFEy=VL6Y
-TM8jrYU1nvHvw02fV9JW>e7FMt_?9Z)mzjs6Us&uT$SFu_z(z@VXVkEuL)1E|0o%+d>n5qPf$Nx%qfY
-Yu(wnA=PHkx<7w4Ce=K_vaznS287m$B;-nP2ikTtZZli4)J|a80z(&j%*<=}g}pF+iy`pk<>`wv<zmg
-*hM>;}$Y2Khh4qwfectSRapjlSiaDto+i+64&Ds6mz-@_gcO=s3YmA}NbyDxGZPQv!zoa?Z(|qnPmNb
-z&=ovWYD?tc3PaD~{SGQYm7{ks4*p$!+hi*+`=K2QKbM|B=EaX<Y(R+%zl}j@S+~4QS9Bl@e5ouiTEr
-ZFD9I{+`TPj=x*_=^qvcGRHD%!j0QEc>#R*;IZD7J(JP{iJRJ?(vaR<2ZBJ;NxqW)7q_DSL;yY<E=UH
-HAuHI;xu#aNp4U&>Fd;5Y}SBtu-#A&B&DND6XFqN}Ph{Iy%gp5l=U;KyJ-;SYX(XHDgP%_l@1p6`FRx
-C(f3a$>br)CLVEvUbHNhannyl5lw|e(;=WYeDj$e+3*A#y)eCkxAXw;k{LbF1CQ0NsW>6C^ujR|r*n8
-fSD8>UOC9SS)2%?}o}8ZC$q{<_cc{Bgkk%b&x0EzdYn#=F3$KMH+pPh5Mpo`b9`MogDdfs)K@(75lY^
-zL`%iOqg(aT+!6RaLsaR$1ejc?bN@y?CIyRwxOt#~2i)@Ev>quUfrE(sJSVbW(pA-J#e+!W|wG%vwxn
-gOANs>V0Gj{SMbflZ^uY;$bgeaF9wb>aFJW(UtLs3P_ga&er`>yy7%XsnCIi)Ttdr06nEHSQ{#gexL_
-{i~q3fJtTOkB%05kcp4P|J$R#K#NOlkjrvx_#W8T5`PHf1fQW2W;r~qg%r=;bxxg+swEHNRElcO_f_0
-?Hg4ssZSr=dz)70uHG%D*sUb)f<j%V*O)gL=-EbBSud<3<`0+=O00q_z2PNWU<wFj=(+^yLKjD6YE7_
-<sJtVY;EPa$^}D&MK1=oM3mJmD%W-@~I{SXCVubcUFLKd2tV}mjR?8x%!xy~o>*`!ta;djh0Uz_UEQ&
-C#M)NK=b8}su^4+M>47bC#gDmU0HMcrVlmqL3Y8PZXL#y*RsgW;2LT`*_`n+FnMO>BC^7k!^?~tuVr<
-S|$JC^X>jbjK4AwVk-HXDx#G2~8V7F{o5Go9^vzm9%YD@Dz4+sRu+X=5=p%jx^(uKVcZ%hHo(lIF#Nc
-w~R=CbjWM#?(FVFzq|>kj~o<K)UJr^A4)U4iB1G53PQe3L;YTU~^(+ZIEpa`v|lgnPj{CNLTrddu!sc
->!WggXI>yunc9$gk5J&s?3sI4NaALe^yK8^1z5DtF4CM!Iq1@4&@{_*c9&sUuFW}erzhg_vh|FwY+u?
-j$Y6`<k~p#krF83MwVmG~r)JiEzQ@XFxU8r-Gu4qY-Ktlr9L9`Az<w%-ukP$sNqzmctaHRfA<=-s7*X
-Bw{h+F}u_v7K6fpjl`cOW><<l0!;o0-HnDhJ++On#|n!WCRCvVhnkrlnu)`EscQpSqOuMIfHxLYp*-Y
-zh&pC(K;ST;N{iRGpq;bCo}rsr8V{Z5WjwVez5e$^_Ltg+Wskj>g1waEl`fRBsCGAh#wvo8e@f&JFA=
-k#6&surm5*4WxT-X`<cc5l5+tPAuN5ZvXJU^Y7iUFX<XX#F=MXY$6s(PV-jnH0Q5W2i6m*V(6)KX^&Z
-`&Avnx|Gk8wUk$ve@Yduhu$hXM)ewaZiQ~gNsZ#5FFF}9JQCEGqZwejN<CLAIjQ%l0+wA-S#iQ!sn`~
-iaj?3%Fk|4Gld8n=rq1B^{=ALC$4sGNeZmGzxVaaXwic)lo8DxNLdHm{eFSx=mlq{nlB6)Qi_)^<<_0
-S|`Hn$-e^*o`{QByKvPGo((pXkVeMD*C>GP9U7pE^yPu{q1n!Swn|1rJ7f1m7sHND#VgM9ar`939MQ0
-w*33jo$amM>(gtdc>xGsAc2$9N&o@D<%_&liiR%MSEQ!H&eE5`7T^t|TcPw`VN5Sm#(D*T(m_sL%|Tj
-XdXvU#K<|l}U^*6qCd0S4>o62~Y0zuju82bRD%k3{Dp{VPPE~z0=7=4x}U)yhuKgkhmWn>Q*2szMqs1
-0FEhV%Y{jGv&0LR`5;(YN~~iE2XDH9;kYn`-i;Qi*N0Vd6I;Dp%@|U>!KzHu=o+B$5|M1h0pG5CM0HA
-%XzJP;x{5lIZ`@^hY>)hj+ainA?szn-!Cto0Z`;Gv=&-9kTTgd^TE{9i4}B$ggTdgLc`Dzu<?^H`-mK
-&(<;`cvtZfZ{2WL?mfoNz>F_hT3ug)Q2$Q!OSBUEytf`RArq@=scDx@=QpyEal*50}1Q1{}ZDnw;{Lc
-<g9N>Fr9AwM3`opm<-#|A%MVhzm3+#vq7eJ)U<dtXF_qlSD!Ly~e`LyptnU!Qt)k63@)`8JFF{%-%n|
-9=|(ugRS`yzk%5^zi-TdA<#+eh(gOrvFy7@1?tk=C1NaL<6*JYm_%_R+?&CHT+nuO|`)PqqYCJS1tb8
-D>sebP4*Ag@!V?rU%~5b+4SF>2U{#qf*;h*DDD!a=l>;Zlpy_ni}e2!#yJhQUOdcQH(Xr*g1rmYX{~c
-kL5V!Jtdd-GA#GJG=t|yslj+2leU+*Ha(wpcdwg%|>t`1iCvRQ}=dHhg5B~S-KQBvw`|fLuIj=q&9X)
-=GKk`|vufx63AIwvYKb*aJ-U|#brvB;Svl0An>;XSN>mUB7(BJ3u)$@}d`+Hp)y?(lKhCBW1>6!uK&#
-d{7kWQ5;p<C<U+u1KLA473O|EqRGTLy=-`3*IJ|2<7Un8~Cc60t~cZo$q*d9A{)s5M;t`Xzc}8Rs0b^
-t$z5=oi|d#B6&y<4jaAo$?dU8&s_0C@fvx_k?hoW8#K;vPWMBOC6~7V_^V`qR8$OiGW+%Vv0Zhz2Vk6
-ipDn%(vqp<?KV13AQLil<FSf)Z7k`k!f@?y@*3VszR+tJI+Y8Q*PHN5$kDVt+2X8;x_gi_nv!97DN@|
-s;4$Cljf41=6k&n)DTerlZfx&uw)WyJg_XLbNp2a_d%?Y(wk)<)f7{IVlW<YDlVKa{;krYFy3JVB*Me
-Vuq27`cjPP)9rzw`7nklejy0l7(uXu!MuZp+eV0n(Zh~DFd3Z9z6T^#&Um(eW2x0cXd4}?m0c9eQ^%K
-QyQBbSZux&e^o=W>5sYcKVNEd&8-9Mht8F)Omr6?}6aNUc!c$q_@LeJUydVgo8w?cGaRs6}L&9GTO^P
-91+^(SOTo_nqf&b4nK)X~ak60NCqsW&EWv5^wzPa)F1mgONw9V%u+mmVE0NNa2&KZu8wG=)GFRV}jdx
-%v(D6$iEUb$qbX*OEHsj{R<l>5N|>o|2AAkt1z<+`$pV0<3}xGJa%s3xW0Y6XCGSLg2V@7m-Qp!A5#X
-}t{-eYUDV%N<!%1qi~c}F2uC~=RnnUi@&=DR%c~UvDj~$}k*wz$ME_Ls^%J4Vu+r6af!pD{fl})kyxl
-q@<knKUyUWp40h=o=_22LjCfns!h<fKc39^%{ApF~l=ILaGPZ!7Tj{g=~*ZM9!H?;#od&Sm!$uZ6fdp
-9{C1ai=#SG3SkJKp^;!q6zABLH;0LMYCqw?=y!_~J!+SBT>?syCvpjC~7tPXwJgb6-SviHr4)oLteyw
-zTAk?auOEbGKDbWv2?29iP}^B6Mr7Lu|Ivb+_wq#W1%IS0{(pk1J*Tet%p!yhdby@~@t5XE({wKL<{V
-{Psz7ao`ApUV`NYCHSZ9l@mWp3(<p7zb1=Y0~J#(lD8EH;-oEy{CVhCb*-Bv(R9OD+B9JhzM3WjVcln
-qbFXf80krsY4_Yp2%EQ;uCqL;oN=gEB(}2hGmVkIJ*HXd&q@WkauZw#@hp604Vw5+?dnoW0+kL#qF~b
-_&c|@<Y?l`YA#uX!Bj1Px_Tl+2-kbYm_%p+?v#YE+a&ukc|!7FE=aOh*}t~jRmTchvIyZ7z3y?rK<U$
-iNAT7pZge3KsPojPuWL8+>KuuBf^Mpr#4!dc*dhbLYOiL>ZAm`bmb({<t0vcE7K|0*e1Jn-0r;1v~LU
-OTF$q=?p=*td0>rS+=4VqCsKMimaQ9mNU(GNT;{@hYDUI=t@FdY0h-Cs0cR1QY-O00;n48F5TH3d6j=
-E&u=s!T<mt0001RX>c!Jc4cm4Z*nhWX>)XJX<{#AVRT_)VRL0JaCz;0`*YhylJM{PE3j6%Kx!#Ek4<h
-%ciQi~wvuyQ{P=8VldlvP1(8Du5eP5<D2cmw|NHf0-Vcy+oV~sJ4z(MLz)a6fPft&GPj}B@c6@Z4&6`
-D8U!7!|etG;yd~<MkaF{)7*4wtcy6&^lvvKytXP<v@4FCB$dw(smH{1TYsk3*@vcD@@k$ux_>P69)O+
-AI0?}W&{d-3e-)w{E4f8S?Cy~v)ue)azCi$8z={`K2;_!7z;JbLu#&Dopm%YXVhD_84EtVG>25cqO%u
-xy)EHk&Os{iYSO8J20<KHJnKbXd%)vKMVpbq5FX!)4Klum7NaVVQYne$~CW@2m1sy}2&BYwKs#TwMVY
-)XzrOTsK{Lzb^V~^`hJAZ+|V<{Fm(PRQ2(B*<o8}_j9qv0Zp=2bj_xni%yoDH!A?D%D?MdX#B-%`SDh
-?9n?}^uS7rV=GTCqN%no+ZPxf!EdIi!&f2zVWyO`~3z&yO)qE*`PqLS1@1H(@`u^$cn-|}my?XlcY?A
-%(Z)a!U&4LdS)TS>h1!lA^+D^<`@yn)cX__Y4ynr4pX6v?Di?-iRGA>gWD=~u!pUE*y4zloRMX{KPdx
-YIhvbz>$()@h(?k{iQyJ+dpAMj&4J~%j-&5Ei5GC0l7bHs03UTzS#`6SE#3{(H2?s_O87Vby8{X9`7%
-g?T^UewEGpsM}p4Uj|r0s4egBU<Q^B%div)pzu6G-FiEpzCKpzIpxj{X30eD4(yl3jla5M?L+yg9Z<t
-y?*)f>8t0_l0Yykz^f{H@chNQ_f+m36dL6(UcGz&^t<oQ-saJ{&flIrd;Ru#PJjL1@6X=7KYO10a|55
-=z5f2~v$J<l&hIqTeD`lp-$J!9H~!+)H?L=BKfcF4PN|C}U=VtCFt3WP%Vy7zLPpKy&tl$>PpB<i*ZA
-+#tfLjrRFtiX^%}63A;vml7Y1O4Yp=`tCR<oD&^h21VhN0*tjm5j8+D>u%I54c_`HA;Wl@!#fJU+siJ
-_j0DY7(RVr7@rO}hg6*k(;FvSrg|0{WNvQ$LLY$9AVU0zk;${?mPpV~D)I5;d?eSjzD28(?MPKo4hLi
-J~1E%QGyH_16-I6M)$Fh{Uo-WR-oFl|0-GhS`f9ot|=o<FMcHF9TgK77Ob5gk~(!{ilmXRyb3Nz1G7q
-y*&ZGQmm-t3GF?89cV5-wsJ{j8ToYs%(gb8I&o-UzdqMBKES~6M_7)~1=xnM7MrRcQI#73Eb#opcnYK
-}>IJ<V>$TuhP<&Oq6>HcgfV;vP!0F7IrAzcovdF)HK%oqcY}9Yp<(#M%wkGQPcsjg1CRFqE6;SyEV9u
-)z?5E=D>Xc?OMR35iduQQfv{P_5CRsx}9rc4jA~9Cts+eyxLI>_B-4lz9`pvp;8hED%DaP)A12UkgBQ
-l_|!}M=D7(;;=gLN%Y)&g#uwiMkod$FXc@77{oE=#e9?njx%95MlbxCk1yuylez-?tlRx4$ksgO0nhs
-$eH*Zisat8*5>VZ7s17Z&^O>Ji~bI1OS77LC^wrg|ZDzx)hj_6t4z>bL-N$<UwkrQ3e%$n5ltd2cZOx
-J5d5q0|l&K2VOyD_NQuR7{@+KD8ohS;<6&n6X^{LO7P7{O`}{cRouD=*|;F^y93YXwsP_!En85!D3nQ
-dTT~l+CB^$sr5Kw3NeNb?u%nYmvtw`T;IBJ3kd9bx3Bqv;OV{VU!A`+Y<2!<xKmFap)3y}VV&+i!Q0M
-+17PqAUSWQo0QB48-h~6YQg$?E~`$1&20E7akfZok-aE;uF{8m7x1x#)Ow4!D6tf){l1x|h`<^}KpSa
-B9CD*RnpZ|-pw^<vd!BQd?2@`vZ*vMlN+-(PO(egiYx!mqv?BZ5J=04>Rev|UwYeFLlfx&#3OL=sr(4
-VKK7WhIcO(8P%PwrrakCGM$(ZRq$Z@=t3DkmK;$Pi}I{vR;s|s>eI!S2L(Q!}25AJe*2^E?F<iRETmx
-w*sUH=L5FG6{(R?o(FJ|FSi-=oBo)V-3%cWB?uP#HiDZZV1m@4Q9IQGbK4?8uI^jhn5a$&-tR6I9|y(
-kUbj<&Z&8OJlf9OJBJ35n3~G4_B1Csr!i?CG_Bh@MXsBHYJYa^T!y+{3Nc$^%AEHnZX-b{cka4tObMb
-EBqXDS>MJdzMpPRB~EKkB_Ld5H_Zsk5?PnOe4x-RaHR6X5ad@g|n+(b(V5RTGy^;}0w;AC1>2w;(biu
-!8AJ(?EX449cHR-^G4cYXe`8?k^1rQ?qfdmvYya$QgeX!ASGS^CK1h+z$Ox)7I}t5HsNoa}K2`X7^by
-b==p6vh0ZLd5Zb`Q8z2&qxrK70i^Msy`BPS?mF(cuHGGP(@V1x<YXxvaCiq?j)?SKA`E~Au#zku`+*a
-<Ti3k^^nWRu_YbW)ppAS@8$(>JhWbs1$c5P3}D@?Hx+6ET3I9F)-YIL?XQa-H$4CXqmJ*+&@Uxcl8kO
-i7+Sq_3bSk&pI{FH$sr*Wpby<Dj7|bQ3API=ptjPe@DiDF0A6-V8z7Zul0_{}339O!fCRugq+cq{h5X
-?g82;9)a1g?YPJ%CKTTlY*#X1rIq8k57R0|B?x>;yq#a`j6gzmMt6^!OpHzC6i$kc37OwcYWg-2NMi0
-I)+mOjczffFF%c0`cCgy9o*2E<-6Ih3stqvQ^BEV_BIhB815z)H)hm;%&oc5#s(=NA_sO9IfjhS`dBR
-m?3qBX$pkXIPj8J6I9Cw$Qc&qy=A%)eK5ur{!l$)Wgn`SqDGS7EDSv{!&)rdb7F&E@LM7M30zioS^7t
-MvW#DGzry<qFuPw6oP-bmBT@Ec#O>GL1eTWU<nP1MD;Pquxl9LW+mEkZli}V0SyAQDwKotBN1!q-Tih
-gWdA!dkH^L*aWFVUg(rqG&EBmGw8JO60uPA)DAF$)G)Uvbz!H|zh=Waxbr9r8&|v_<9P0*(?pmM;9Fe
-5ZxdKhKTn`}&9<GUFUWmHWV<s%qM<0_KQ$8|T&FxOK-DFExw+di=RnJ~=(%4D%Fu4LoFpHB6$lmZRsY
-b&G7W&Se#r$EM{XVmWT(fVX-n+NL_@-@c%LQ4FGddW8f$%1T2AM9gm&vi4u@Xx<xrlOYSjcTqGIDTmp
-)Eq4u_5E4hq(n3TG=aA;#T(<itOkEbUPr7{W_B}83j8hTNFOgrpS_tV@VBnFox*KDc-gf_JDUOQYXle
-va5Z6{|W?&uy&$R+SPV69BVvA*3w`^dQY6Tzta?4P%)2dH%4T$Nb5bCCYPIfF3VI~MeS62S++1LP?&+
-)u#84l)Vj%5O)Ge_vUegHCvsVFzXmQL7Rt1GO=k|Bf^l(yMgrK*;1#!r#?*k|hlzYLNYMeN0WqrCDE{
-OqPsx4}<z7{DCv1b(Z@wzj*~E?5W~bbVI0fmx2WJuLarM=YTU$6@sovX5E8Z>LCBG<f_7CTuxdw#+r7
-Y4Wt*rgq)y2cM<-WtU%<@~yjUu%M_0B}cBdLQ#;@8068z@Y|fxEZBW{j2zY2I_c$qq<a)ojzSoC-^7E
-p<s)Rb|hI3zvdUCm4R!3qAnkA$GrR@q_3v7tZ?E&~Wc!K1af?!vT6akyC;L9ieKFs!6pt<07gSObR2Z
-$<rFSg99eZIicGUdk3W>>8SvH009X_c#@#`d=Y;VQ0Uj2vp2_I{^2X&8+*x}gMySzAJD-3nry8O%aLq
-FyLZGas(rf+N#DS;4>_jt^(cSbWuwR4IL{tuBUe{)^+zd#{skwK{6-?Htia=O-+^V6mo<<;Dc5XcP21
-yk0{@4m_cWsf9dvBi4mS-YK#!HG6(afLR4wjMa#)k;QWg(Ky`FKe*66oF2VpU1meD$D5>~U5w2;ek+{
-iG$$0s5(`A^(PnKlgstrP#19cMZk(byA$%!9h+h&rfI^WlQcV_Q*yT6@c15={0jGw|Lz>@D=!1!?MWv
-ywC^MJZ_HnwRA^9G^K}2`GGR*0fkgdEJBx^8%=!IUX)Q7rxwsh&Hh+s`rc#7YQ!f*fB^fW@xx9MJKU`
-Z1Ac<qd7J-v_(nmk>bj1T7k?YNL&$kc;EKrd{Y&z1|INf{e_R-)i0cpP899@S|73CnY&+^c`57_<`AB
-@B-Ibneu>jFWs*TfiH@<cJ)BXribF_;D_{E2L&6iHa0wuTY0p)m@W4dNPrUyPaseguM7WT8<Vs_i<^i
-i5@p4PBcjzUik=v+`O3G^s-4HS^9w^ikkah%_NGvavmd#aoSaYvP<E*4ocg2<jo7JX6Z%jOqMU#j=5P
-+XV6nRHPEdRvATxn;+9>DevUD(Xo^;C71{<z$fAc^-Su<(UIpBz!ox7u6D9@jfTE>mckBpWWab5l2W<
-X&_sm{<!2c#Hru3*ZQCg9HX=p1YS7%iiFDTw2Fo?@&S!o$Ws*KLe7RrV?Z;bYvfeU0li+7ut&tR4siN
-ggg;wkU&XSBIsW&EmwC<yRc@7`Re?pxDqfIwr|np7NyMA?kCP93ZYIp^13mo7*F-+A|6MolMi#v^LdG
-a!i-3J-dJW6bsTm9o#^I3ooqZU&62mNcEH!cI$~3Qx&@>HsXk5}s~MFb?ap!<lWHb@KV<TS^>hrQ5Or
-7LPLPpXa9ehbWt5`&N@ld$^95llS2c4oBzcl2eOr`Qq6_q3`XuiAw&>(1et(FbbtU_BWlK?@7j|dp)~
-zp3Hf;chw)X;v8tn}b9qLOhNoa1*V6jzAv6yYzstbG@tj>4rMM<CjRk_G$l9QV&02wkBBIQUS0{1RNy
-J|oC{_S@(G33~_n^0^QAw4gq7jiLJgClPR^_h_LXIO%FXr^Y5aG=+!gdrtH7)Yc8<9wQ-#~lFEzC=bJ
-U021nGiM4Y3~H^UMwtNS>>3zI!mmczbZxyulljD<*l}toN>(2pLc|Tyaub$q7*!d0*TCFKWA}*x{D{U
-sQk{JywYtQ(*Oet(>Iv6chbCC`iQWr0ss@@!l#ePk;^{dRISH_9X&1<s^x1Q5vz+yn@CdJFMc>;p{%Y
-ZmMt^b-ufLVv#Wq;p+clpAB@o#BV%j&bWx@KjyZH;PT<90JKUyuU&V-AphXT`J3<PA7F{e7UxYpk1_s
-VfVajS8XHrq|D8V~5xaSIH3ncG$KWCMt_k8Q!Jn{I;TpO0+At(<NI1e5+_+i>cpn^=h3k8Q!OYWse&-
-rL!w%@RquMig6IrLM=X1eA@In+k-lsvDDvs-Xt*3w&eI#VUkSCIPbf6q%Z+G%%!)e;HX-^<hGK0n3sp
-XUMl!qbnGX^tY31Dm!Mg2ll68AC9K8y%uS?-?1FN24Ra0k^Qy8gXyO+q1Y%!<Qg6s@zeG8QF>`=1eP(
-&D(2e5&=XKMYXC^=S0aSUg?*U)_~VaqPd;8X3&C1qP40i9SR_r6l5N74UZa0kK5sS^d#6w}waY$k0o|
-KUMZJ)YG3<%tU=JTDf5Q7I?B^wLT;KGbL=amk4m?Q89E4&kV!)S953F@3P4Px`!ABd~*aKB=i{4iDQI
-<AizxrLudKUGyj9OE5?_>6_pmb<zdk7uTkYTO(EXzNZn88X}x5ME}%A}Lw=CuK-yj1}s1>5;O_B4q?Q
-KvCR4)xB9Hp^vsj}lCF{<!;q@{3pAEU56XNmtGTVewyV3qvNwqsQH!h9snkglN07%|LQcS|w?=DUL0K
-=Gcz>ShD2Xk>rblBtZ#yHNB0;9I=|lj&IZKJy{8W<G_@_M_ajaAJvj~B4jKex?9NprL8mpOED4@gU!@
-LL|tpEum-++yFk=IFGh@FW!j=w9*y!OM>#@BA-bTMa<oY^Vw5tH7_+Mht4bCohU!^*m#%8w1!8EpKrv
-!?c!53xve@*3VvE_jdRHi=ONk0(iA7RD#SBHDK@AHb8APG4jCrG!2<N3eB4yc2M#qjKPKl}$bc84g#x
-wgF3y@34BV}4rQQgvCh8>W73mEp<9FgrZ8%<=C8OrcO2eS_~BR#EmSdpa4%(f(+zw|EcXq}8gI=9tvr
-L@W~F@U4gJxx(9JTkz}Gw{{Y28bAOT;}W;Ii5p#bRtgxps;p1M88Dzo6vsH7olT?H7<3+%f=Cr(yzG(
-FiG42O+^|3SXUw0kBS`VfQhlAXqu3xqh)fy)fjea5POmfLHbNjHSuX{rE7#rhRKl^w)_gCch7S4>YQX
-u%1ru0bo?!vq^~6>X_jmn=gKTJItMpYs;I7-7WN}_S6!OksWX@GP{-I&iMH6*O<h~~&VyX^a@$)*4he
-<F!f;rUML!1SfKE~e+{&f6gjO1ve<3OIT24LF?CickSmYkb$IzBP!o@}2T^FC{7Z*ujT;z){{(yz#uP
-^_|zu-Uk?W?cVx7Fe+>5n@M?yJwgK#x`SgHr4a=+Zjo;zh@w((4P&AQb(o*69uxK(!cB@Kg+|^3O0`T
-cF3qs;pUayA&G5lkDa5uXe!WXjBGAB&Y~35IQ<02SvQSB(W*`xXA9{iWT>uxXjBQW0!{_blJ;=j|3U4
-a)$u{7{o((D-RKc0VErWfLk^dn&OEL^V8hdyIq~zlZgy6!&5%Jr4di?n%}psTo_XzLsxO4k-DOFC|+q
-W%GRdVnfx+Nz<k`DYDwSgxIQ-E_aowq(jISF>2)#A!!kuvez6p@%dh_+YRtwm;u7O&i^RMhT>|O>j-Y
-RO(ap;;;x_!ad)$$Rz<r&_c8qirmu!-(-V<{;s@)==Bjn;oi5=7IgWBNC77&7^4<j28@n5jQ&r3#c;3
-~p#!Tv`w`U_KfT%f3dazU?7@OYVnkbu5c6J&_63OnNbWP1S!N=z~P;|R(uHx=#E2#+_Sc6;1z>Wu9e9
-jqH%zqqE8LRl_(Vp1^k;<z}MKtwttiqfH{4~{|I5r3+Z^eis_8UKT68D@Q3AR-(X&@mYXcI!uBQ%sYL
-<TRfn@w3)}pjYmk5=Mk3baH((IeDT^CSELK5S{5R*u(6-z#$hvg2yz;KU@n@WuHyI_)_h!zTsrRG0AT
-|5h1#(4>HTcuWvtBO^4CKLr}<3$2hf-pUz_`58|{+4ibjM4%yoVA0kq>kEsaHcJJWMj|%GaMBImox0Y
-6AK^j~yZnv$4pwhlrfCB4VFyAH_QDCNhs-&WbRc)_jPn^g0vuJJqoZY53ZMTZz6fL+wV?_^tunEgGge
-C1+N{?_%S^ziMfk)8H<L=S!Ggj;DZ;rkmL#7I)V5p=iMyKZl1Tj4?v@Jc=_4|#I&zYiFB|+O%`ByOoj
-Q27oRDB4S9+u2jlyT0IOsOZN{wV)4qt;S5LNN#NF@#3ztZ8|lWT$7)oky(Bmy}|q)ag{lDI*LyR%1B5
-<yY?e7E-vP+RsKR)0UybU&k1zw$6z*;v$kAP$i!1SxetTrgBK;pN#xMr16uF_feR^`LdF1EXq(?K16Y
-DrmLT34d;)UssK%kp!cp@Tz0hAJKw|lIQ4CFM^1Ueqr_)bcBC4^Y`s$XyGp8C)K_9uiFyRU#*^&JaXj
-S#Q!b?m={Cq~kswd02ftU)qZJROW49V!*}(uuo@=W+DVa{lLp5~x+>?BQU^)?THTG+&<|wSrK_&C`I0
-O|fAiW7ju~Cl`=Fm<>?z+kUH20C-m3tgwaM~I6#YfuE&Z&DlaG;X`Iwye?(&&~aI+t9bU^?!q1yu|2V
-wwKVsMZ<g3$P>k9B(o~etDn(Y>FxbCfk+#iUUY*#Fhs~j$i}a#!VBqgW32=`W%_JO&H$gzGzY~j&>Tq
-ozjDoTP)O6uvJM~FqPqQ3Id3Xz;L3%e(kJQQLpsha900YrtsH`n7V`RjPh=>iwc}Xol*^yzY_F7**oQ
-;3ucvPE=n1iFr+=1D|{?{B&B?lGwwlTl7wf-XFqCLMo9xPGC&qY1i*J;Hv|0VcR5Y?(xVh-sx+FGUX+
-0wkDy#&c86xXdj0<FgpK=8-@IU7l55;$wXj7=d#xpIv3=MZn+mO+iKq@^i@Abs)Vf0&mKW)&U2Cj<n;
-d~=K-iQKb|%WiquSn~3zCf7i`F@@Gl#6fxYR*~X@E}C$m%+9P_bLOR4H2jjsm7M)g+}alG7xXC%9Ok*
-HYT7_o$8!GCMU-r>EXzCZ|Tl*O(R!BFQN5?_z6A0ud_HZPJ{9N|&eF%1g`j9re9b^bWF=nJ!7Id2r8k
-V@Z{FKk5*m{HPEaD_H^he{AgZ5EmCCqjO35P3ldQdY~$65pK4fn{^-r5$!C`H0>d!>vzW*rzh`nj7fY
-SiJ^$)R$x@x*xPPr?WP_~OiG(f=VK0ms>3pKT-sq|Iu84?62^`?&7Rgqg%tO+?5=!hbhd-}Veq&DCkw
-~Xi`v4iw5O{B6HHpHPF&c!3vcdtPqdju%G+33=N&;`p~lXrM+fwKsb-`mY{=rO!Q;CrOa^QblpKpcB%
-y0{!|j9A&{Uey__h{m$I@R8i;VI)TH_J*oF&UZbVK%-D17mjSb-DTpjaCx5g*y`D8(wh4kP-NHJGL*8
-oO^4JwP=pdYP=~<QQ9T=a>!!{%w*;!Va@VL)znd)3eHni=7vuHc}ja`A=U*Ym-w7CucZS3TqxRv4Nyf
-vd&{-YHDCGbNC^W5YoXdi6P86^7c|nBI`82c6+NxgwDs8Ytl(Z<FGlI*48FbBtJs=C?x2CgWLGy1DEu
-lO1J1L->?nnV~Ytbm2dz|XjA^Dxf@x`ma(C=Zl@|m;1KiTRU^4jkBD>4p-X$M1bB+60rpz;hhlw=jVK
-t6Q$Ej$Eku+FUC2sRi&lq+Y?jZ+Ou?2!eYD+aLu03eI-Nz;;^B4*R`$k{)&^A^lk-5^w`gO0t2f(`On
-AA?#A@Ad$4X}~u*yz4cTKZ1+;DZSQ9AmQU%8q(ww8N19U1a&qru4$NNmz(gv>C<@#RSJISx9{ia8=wC
-N@B?Y|xDsbuJykHMkK$5H-u6gm5zQwwRr+$2|!F%RdqFc%q_(Da(Tf#LHG?DJ$mWfl4pqyO%+WYd_t8
-ulmRxMX~U3foYi~Dx-Pp<RLb_ltC_Lhf_(qNy^m&+|!@g>l9N*s#g|ay2d_3Rh-70r7JI0MCI&rgzH2
-*Obau)lYr(hif$uO#;!L!8_4f?D@&Sr6QiOPGLiIb!Hcv^qch}@)JgKw9EoOENqig!4lXSH@&U*s`#k
-W@H+>mOD;sf>^q=%roCYh=L#HvpRxEeoxX*}(Asf)|PWQqTKIvH`?&hvttBr7DF_3l`r@L#|0T$Xuz9
-aC^H8gQueTst7*cc&mBev{=CYe1373M5HSiv0mdIMW)d5K(n4N9Z@6HQ8M=Iz&{8PlI=HO*;7<P_(K$
-qFqGCCb0hw4hS0o0_=4&de3sR%k0JEL+&p%3v2*+1XIt7dNzXqFn}dm`&YNu1AuEkxpn+ko%^Fh2i2E
-MXQ^L_lzRtIYIhuiLNhnfz2_hqkyxk4Fze9r`e0zfrU{gY7?|jkkJhr)ag44si9p|+3#F+%GnCY1k*G
-<r>a!&ROq`*wH_QeI0)x_Ni-fRs^e+#9C1Dus76ktt)~*VMcq4R8>JonQ7lXbPrgvc@#=L?<Jj3~e_O
-L8@z{2x_gDKOA8Q?Ztlok&j@XO%cC9Hf9jhqvo*dl?_)4+UoURm0G9x4flnxZbVSY((M=sMLFO!lJr_
-%Qj7}1B)Ey(8KaNpSGBeSnrR5p}^&A#)+zwU*vdw77_#URfC&If%Dg!wjLevfi7Z8zE5UgC2!hhSw?p
-GTgCG@~x(zIndTW^;1}zi8$g?GWs6qZ7;nd~)HBF7$3!%D;UH3yGuhaGUH2z#TxDt{ZK);T<IACm<hf
-%hAo*rd`{Ko{fiG959veH~+|mIA9I2SL8=oL)2=sWN}<pxCmf+Mta}Ma=AfSyOOn6(FWz`;W9_r9nrK
-ew1x%~E*Fs|shetDp<k->-l8SvJ6_=c=w2jgM*|sVWG&}OHuBYY7rZViTd6xs2j9Wz?)Kz#OIDRf`A@
-Y>flGY|B^e8Rm@d>k2QZ7?8lKWDWF7%?LtHGcRXW2P!QgD8W-~&nKS^81?I(ZSvRf3p?G`E}{nVek-M
-*j^rErHsXliiZllK~OHb5vHI}!{WCeM6S|D<WL9o9Tsf2fW|CnofN=+y09#OZ)vkp*ke<=C=G7&b%6D
-oh-xGImE#$SB()AC46m!tf-&xHy&>#)X`A`>bp*(kbZ}O*db;^4LG8!2lDN4%cND)FXLx(TEPM8f4T;
-1JY-PX^(9r#591y2}`nxhjZB$PNWux#V|760R7<rf<v}onRv`#%rf#EFCUWjxCxs9G5d|b)R`!yzfkt
-4)9f=pik*^K`HlP^r;wj=f8uy1u@EJjI6wa4B;f6SeNx}mYVzxU{$cNwlhL`#U6zDLc1R(_^Dafzm^`
-2CpBd*^xh?GbY%1bkX>AIJQX_!2DQ@>tga_3BLm08o=u%=z?10nZdY|@ulT}UU_|lGO)A=A#5rdxg(g
-Z49NfblXQIc_XV9c$p%FT{fW_FuP`})9Lr>3s9X^(n;E2lA6dY*^-9I!I8K>i>ZdDF^35mYrR#X=}n>
-+fmZw9g>Sm_yKfK<r99g8}}MR7ciDD^w(P(@OL-$cp7uk>D1M^99z|eZM|=@&q&%7&cvZJ#E^nCm<t>
-7Om+|P!7g`n(B~~B~Dd@H~~>V5O3aR6}S}1ZN5*~((Z^Q6VdDL%d|dJ;1YpTSFS!Va7n8{d=@oPf!^i
-Pa@!&NUX!4${9X#vpNR{evc+4b5dud|TwJ{Q_ivB!b_f`bl9K4KL&-(aoQjn7fF_gf(&WHvPzW&~A25
-aK9f5D)2`el(A#)oN6ki3kGR`H#pdxWkWO0Or8)j^qWc4Jw^%g^?(h1hyYtA89Te$-tkUEe-nB0N4-j
-$rzM(=*`<C(4H{oqh4eObaD;Z(Y8Dx`{g7(=U*E<kSLey&6-$Rx1LSp6|<SG}|afAt(@uY?YyMa%D{S
-YqyU9Ek5J{%gAI^VfZ2b7+_@W=)Ka?ifW4MOe`TVup0wiN;n`3sRZ5g0l?D254uC>ShGROBafd=708m
-zbXSM3KG)aSOJ>$_q|LN?Z7!g*heRd`}LI0jw091wZzB3Di@o%Sj3=to$`z?zj$^Qe3bcxb6foiLnnP
-!CQgc^jT$%QcfAeg=f2fO1N2f>eP64?UjlNH!RUkRe_1y#DEs?<_vay?_&HKMm3cgaSR9JFm2<z*y`o
-fH^X959JC(%NYJ-O~(BGjuJzJTQaKD~VSvR91`Ab^FhG$Fr$@+9(iAt~#x$IFPY08^D?B#u;n@GOOK*
-lL~9%9&@^Oi|&Pb4Yo2<|!WTQo+y7pX9nUu-L&$)(v!Mu`x-lU;2%|D_w`F4D{8m)P;fC*v>*zT`5rF
-Y+Z_AID+#U@_5bXMq({bxa=CIF`$V@0M&X#-tN|TQZ3A#p``?q9x}}X%pI~PTsc}cxpr(^5XHeQIovH
-#@V+lXd+US&>2}tu`pePaH`?&ardg4ggv@q(?%SU+Exe2+?}52`aR6PdGX`RGZ2>RMWrtI>{Qa7zm{u
-toPwOBxGl;G#f|_B7KGlwKOCn!)qjaL;ZZ2VoT1h`GHJee9XJ0VXm$cZtZOtqG1H|JN&s2^F^{-@3`J
-SXfA^Tb=u*Q+f=+dG$7JG@o=`0n*@HZej&j%f^BQsvipV)8vhMh*%8y)pI|%-_AaZ;LnoKP5<nrFJvL
-mVP681gn6B!RhE%kVf-b`L{KiPBJziO0$&(l!ICzNp%*K<%A2r?{F`Ow8iX<?QYyd!2lqEY;VM$G@O5
-9<GaKB#g3=iqo=6U8x2j>nrU&L{ma?Er&#SivNl!T%oQhbo&==E^~zQGAB<ll^^1J)(M;|7gN9?^8ub
-MW*Gq4wW*xz>YvEN9~xc7GK2>jM9<suen>0mv#!vU&;kq*6869iO!>dKrxEyN>;Y9k!)Z*y%zU6y_Y*
-6<INlOH^F1RzUa9G{7K~xKJBv8es9)#e#lac=tFk+!bAMmY-3Hr*LELc4L)lNA($+a#F`X_$T*S85Ak
-UF<PqN<$rk{TfkR%uaw+;dPCn{ndr3elD0`CS(dpzNjn_&rnSpz#Li<d8Ecc6Eo_3P|Qz9XTY;^tLxG
-VJ}`K3k#oe<rjEVtyFsM=<8#oh@^(1G^BgA|Pix*~lHHKUzK?g3k&Ty^8X+Tql2$e7cy(UHW?u>RC}?
-nFBc47wBkIu5N5dyO1z9r`}(u-9Vq$uqFM&U%fzjKTo98y=}&<gIdXftw$u&ZHje^pvu@12osSMctvd
-CH0*1SHM6j*GXfVz1DO$=!ye+#+{Um$TpQizjGtA9xFMrm|@Dx$0A$ce&^nwgvEC^<yxNM>35%qZSP>
-&53sG1=kWAN!ev+v!OezlKfA;<1ds?o{6t#?am_u?>8(1NRtCAMJlIc`84h|e5U~Hh+BG1ejQ&G92Gr
-t?81al91Ww~V4F`?9VO$rBjL%%_sPE_dwk_7z@tYmrDhERMM!)O|t7xgg$@VV!C8dux71$LDK3|t>j*
-Kx$*b3Byi^b2y9E;9y+X1dbYV@jDGdl^c(KdoN$nJ7FtKw2rD7VX`b8Mc30`y(xSuQ*2Hl@uEN^KO2E
-7C&=jB=#7xS*c^lrD4(u6NN_QcoyqZ37%16BsLRit#jiT6N8Y_zT^jEtbo2UefhGZGn)AYNGc!0WY?0
-?=CLxaW66Bg&6^6C%Ud_DTVqC+Ve{8&BaBFATZ+>ls>=zfO)8&);u)Y1U%RUVyg*I3|}tk0?DG51`RI
-CGYVU}EWw$Z>#dUo%{djpsg~D%1M0Tk)L&f4ia11*f=~8GhYV<17@`B`yo_qx;q(K~ByjdkaM)wM`_d
-y_Mf(<GvAjC`?6oe<dJ#9AOv_A0<g-akXFHOh`7Lq>z5U9SxSq;j@FTm(k@Df8rD_W?oVeX8dZImC@h
-#pB*nKfYW<~iQ;<?5LIW&;^5X1;qy0FJHgyeI(;~!jQFF^TF;X``{Vg;S~!1W{N;eL{BC98=f>c_b#l
-I!j0o~Ffpw>|O_8)<k))XGsXdG{YPV_6f)c>dAT#2wlGqjZE2bpq@Jil_@LI8Er@gmwQxYfNf>E&1p$
-TY+v=qFEH@mib!2+2ZL&;!8XdYca*PZG5;_uD&5{Zas(RSP9i5`<f#pM@hC3&M>jrU@C?cX;f#$JhCb
-r>A*;K)pI$@{~RWAqHf7E&Kr_6q6l$sw0zuY+>pmd8og0&Zbt*URjsf<2a4Hj=<Eb5Su-0sM4?j*Iw+
-wm@qCIwe}<<R1hU36K?4%V8|bV${oEyxH*HDYPJF91Xu-5~*obO2Jtm_8{>YwiroYrvH-5|(%JdS5aC
-2`REJ|~es?`7s^-f9Dw;1@)?dlR9B28UeHj+r7HSSd40c!UWe3fTMjIQkWl)`{U>ed2OY0SuFtdOpdA
-OU<HRHR#tRecqi`cs`p`z7vsy66?EoqvAvA-ohpN0M;`iw^o`wrCVx!T(T=M9hM^S<_j{DQeX&LC6GJ
-MfUvldo}l(L68O@WehD_k@4kdX|oEnj|7d8p`_#M)s4M`j(O0M=165463KK0i*#DZ>@$+!WAYr!n$Yy
-xz2%0O!}0`8+}OT!j)Hz*?=LQntMW#m8NMyt_PJs(7UV5x9Z4`3yQn2u;G+TnA1z8orz1K4?Wg*Y8x6
-o@3rna=tfwhJTg4KVV2)#~H%9&SGtzjJEx{d2Z29P~YF*G02&^amddK#nCsx?9Ubyi^Yhx#Wgh#f=f6
-D0JbC$gD?+-s=h|b_9Vlzl{lU%sHt0!%Ji1y~E+ULTik+E|i7{xZt15S<oa-99ikJi#{E1v8U)!zbkp
-(`+&PqRnQtqPCQ<u9-1P1SJh<${U@(@gxdtg~UVanOZG(m0Cv_*ikUiGKa3^T~T{@wheg{;Hf~eivBM
-L+6KYM2nVIJP9<lGOVQzxuxQyDp<LQ$-FR;hx3>LLhyA~Skox6HekHRh#W9O+S0y+HqV=AqeLeF%Zqp
-mdjeCrK5CAIlRbgI=Ea6>$bA1?2yR}se36)|($me7nMB`wJFj*nuD12A>}7F-J_g-2iO<=*S#K4}H8*
-qfHW#7(OabbX?Dj#7kl>u(P-2C1D_#*W3fmU$LVgex+V$?(lz<3?5v`hAp;Lpj8#gMW$4G1{5x8L59m
-Z~q3cH_U=uVPX-o`nSZcMS|o47f50USV$+}{`I=1v7C=J)pl-|Ae6B`tcMiBU;LpB|$b#!TxT6{sil;
-l|6R2}3&Bi96{?3dBUaB>IZ<4C7<X^7#lalpizSn&3SjHG+Wkq4Y96c+V%_(Fk6Gbi>C>OwoMsnBI8K
-9lzv-641@XoYWt;`REazl=pP0#F5>^rYKB3G#Zb0yJW#ieH*zaSTer2*zZdCA1RNxLbfL`d*XFkusz@
-l+i%2-`b!l%<Ax_yu-q85Us3|2h#6Z`A}hTyYqoXrNA1{-AEB^nv|}jfXA*yap(L8H@}Wwx$yUyNlY!
-_~Si5@=;9VoA=pcG6yLAyeqw+L3Rv5d+S7hR3O+jNWCE1``<q=inM5CSihz_J7U!Af@$FR#ySuHFjgw
-ESb_z%#AzJ}h8X7t1sJHCN8`M~7L60Sq+YgIdOe>pF56H>R|{pBvBAxmzfJCA&3BLAOH+!iE;9AK)RZ
-GzxRmg&Jmu|C48VK2tzq>n<nUAVJ+Z&?I}?NIyQX8*y+BHwrOGQLA$L7LT|`a;~!Libb7HvNko72{4u
-)K4mT>pj4T1}W@)kvm6QQ=nyk%$MmcmB2;etNy7`gaovo%bc>9>8gsN9=F-COk2&@sn*qYcZgLmG<;-
-4DSVR#hiD4IB)V9N4~QQM$`TZtidgYuQQb<)&oy=$UUEt{O5mebL#Q|a8E9&j#ag?{Il_ntR`?_x^>x
->*0nxvsAXwCX9!fKQQ;dUXF}y4gOQnGrHby5EyfG_`OyX4FbU?>OCyRxmoRlAB{jhVUQ_5b={nEXWn>
-&@08#+ZsDANw{<WBAEmNAq>m-z<Jdn-V-x)L?H8l^U6-r>oZ-5qH&k`$0EGZK|Ja<=@vwtG|Z#5-HYu
--(<AAm13(KHtEJI^3O*IU@P`2)SFS9am;hQIe|9d=oJQp$vnZLxtw3?(B>q$fYcZqmHQWYPa|0FD-VW
-FA7_CDUrFxa)`aYSu`kC5U~WOcT`=W9tA`S+V8H3M*?R-KX7i7l{kcE#o7a4d^24)w!;o|N1L+TO{Lq
-+DGo8#n-76ijY_NO5fQH(YFo*<P}rb{di2>CM<+E#nrl8X6zd5&5%hdj2nqzy6HXq9$I<BD)=0+)ebd
-F-T0wGCT>KptkZKB#)&F<>e4_P(vJGlmOdb-!JC;uDWaSes9$P{{!6CkW*3z#d-lcE_QF%E*0Cji;VP
-TCR6%=YKf^<;iNy$e?Hy~MEb)I9>Q}nZgnJy{#1anL_3--||Zs@)!rX8k+pD`q>V1Wdc4GDbeK<qZF7
-5b{2X51j5EthX8auhG}yKX9#UQT^t46YV-T$%2*{HBwDz(4AhmA%7~Ea8LciTVozb5hOQ__P(r(F&0L
-Ur<W}1QY-O00;n48F5U5IN~ia6#xKTQUCxP0001RX>c!Jc4cm4Z*nhWX>)XJX<{#FZe(S6E^vA6JZq2
-Kwzc2)SMb_3q)BGwN7|rw+r5D6Y?=ie$5^lXfNRWXB+d-88cCO;c0Il5fA4va67`y$*v3T~L@>M>i99
-?!?{i4%p*a2GR3t^J^39p3&HD8B_~hi_$wTp?DEC@zwnl_6X5!hCr(cP`s65__H}Q|EjG)C!mB_r3sW
-62wTPa@e&9=zJn__M5VlBnDMV+UyQSc0Iq!uv@l^d;AwJG4&MoYPqxj|TOq!ceNUtGL;a}k*jM#On4U
-i|Rt`s(seZ?Av2dV>$4-HF<jg*IXvSKCaj+|R7oY+wrRXHmJkYFitXHNWarsf$Eb&3hwv<yvL(#OVFm
-iGXXZiyh2H%NU6wY`bfEa3Vh>vNYn79$si&Xs=UR?{@peRM!(~6S=3~sLH?uE(jn{$i7aBT^SqKDE#j
-F`t_gUN+r*0v;7Wel1V)mSMq;rS(&-O*RSKMx+`@0{YK9Tm%&x*tc-Of=VDc>EL{|(%n?iloX9r|voB
->ev*RPR+~`T1Y-PFtij`8E{apN0m5WqC&o@%vO8r_FAND6FNPFPzxnn}Kk>({m3m1z#-pR#cc5?E~#k
-bGjzPw&szWV0kZ_qf{8dFwhj~|!&Qbi?6PE_a({SKPuR~OG;evi%h@kx@wbj9m9xrsOO5`^kQSgd}Oi
-J37Y9z1wJf3LTy65LqJQp*a&tOEHfxu;OrRWP;HDwE<)nJozL>&v+($^^;|CTO&%8HH|EB;k4w7_NfT
-=DOZqRtxxNzLP*OV)TMWTtJ6cX?*qf#cu+Jkjk}Kz)NKoi?EW}dXD@$e^untPRXAZUYF2T#hI!kC<#o
-YGI5^B=%i_I2HcK!2<8mvAjR9Om!eqHv<QhvT&_i4fI5^iQEMero-?*vgI*#PgsMh`sRnhAM$tmtBN!
-7%f&T-X4$HgkP$L##3)X5=YqAjGtZe~ew*zU-rOAq94m>kk{2wM&%>{_Q23cI|c*8@HY=>_67K~ckK8
-OqT!W-%be|ZohgUUrn;uy@WSOy;H@zOC;yRWigpz>Q_M2aF-R0?d`{!Bco0`W);(V-`$Ro2Cpbs1)Wo
-bEQNs%!!3g`630uqiiF&llSQW;OOwmkFx!hkgGoNj}<yu&AO`-sW|d0U_>!nTRV<sr;r(jECYa5Cd^o
-?NNN=Ix|2akRT0W1R@Eqp3Si@-k^X2-GB*s4+<c&13H4CM4@w(>53h`shB|k4EcjF`|QE1vEThmCotj
-G@JGP+<Ytk?Sr)znaRRLcT35i%;60kew5ZKFPI|(aPG8VhYE6A-qkTaj5t(!GWE@ih((-p)0r6Ua`rH
-iOTHo};8_zHGFQl?(cfe9F(6H(RlySEMnIt`$Fg$;jhU^4dH1rddu$_oaDmPNc2{E)WrlO<cRckrUv^
-2HO&j_FeGj3PdwYnj}K|)~R`A`ZblqXz+_K1M%fjC{gc){Z}T~eU756iPfjAplAn9f=nj##n-B)o#w*
-1rI8;shnKOC!>`x<qUtutE)UQ<)237m~MuMnE9;N;&)j;@5E|K#Oi7c7SD3)>&+1C6-ID+#0>{ayf@z
-PTk;F18%v5$z;3bl7cVjp)<TUOcwxRLnGP6c${qy5nE4GS~L;ArWq+G%KVrtwrohE*2KCVfL{B4jT)0
-g3t|U@346BJ5da&mDM|?g_biyO(|%j`tlyT1<~O7VXsak@>0?12(rfFc1sz(a(TG<S-^$~~>kYI%EMA
-fLdr^yBU110fjVoZ1FB`(w3tvopIatXxY9ZQC)OLfSwv!MrrCt>Bd=smD?nwYNs%^3`BCyjjg*Dh(rV
-ztH;8S^w{oGQvsDKsH2~bCD=3U9~cr--t0E=E=WAu|lx_9YK>{&^fBai0vp2Lv1wRO^kBIsKnlo_WYy
-z43eZ~`L$3WGY*ZeJW1{50SYwFU%<)`|qn6a5kuq?fIDgkQA5-lF+;IJzr$QJjLRTX<osiY=_e{ObtW
-NMJUWdxhn$WBWHi6?n>VJE%Ym>25q}`?)n_A*ttVATY9dM_sWtNeqo{RSLS|Kn|mO_vTDI7iW~{oGrh
-%&z4PAfM`N)0boJiG8qGJVu93{4sMW}HX;&vy;}jo=-!><Z_ox+TO9!7Xyc~~jnl`h1j!4nsuJP?2{(
-yUw=iS!F=W1Kc!Po4PE~{qr!a#NH7CO#X+RnRQy>qn(tC&2zj<$pR3*lL`z|=ca0dfNOi(Fe-v?ggKz
-KRJBlDz4<-$G<(?}V)15D=P-FrXWu=KFKAZ<;XKKAc43PddP$tY07b71&3enfBEh`&`b0}nw5A&g$tQ
-$~<WB0|@BZpF*hOu(Ulg8^2P9K>GWjsa!?PXOv#>Y+m5@GMzbu~Fcg=!r{w87&c#2f_huu>!O&+s~pt
-FmBG^Y*!eZkVeF8cy*_;Oc?ML=n3~&T~OtuN`M>AWn$WD8BnOKjROyO`m-Hi#PqZi1kFMyaS2%)$CHE
-_6VDXmx^TBunH1N$?%DSW<%5u*v>bti-2_J2a=|dC7-k{_4bn&yHSiHwQ4D60M#E9|!19zLo<&%7Uvg
-Cm0Iljx7(A+6VjWsBn|TJDkx#OsLd+ZSL|<R2P2S0E<^s!o76`ngLKrr39^gRUcO&-{9~`RAT(SBfFO
-`Y0vg9X8I1*W7!eS`I4majA7CuObt;FD4w!4gaI+R<Q5%*SP?x=|1lz`s4UyQ*BfQA$fi>fNOItHuc9
-03CgrZZH&O090eq$1r!qj;7CgOMF^+o_X?gVO=uKyg0^aI&QeGDMaYA%dNzk)SbEF1VPI*Z_F6_%#j0
-xzYfWC|6<e<KZT-#g?Ez6aLPz-ibqu<w(-xMp7nRDl&l0hI90uop_Cvo8`F1Cp&au?_5oRiXAW+Q&*?
-!6cdzZ0X@r$Q)BkQdp}}y>==&;o44oP%F`HxZco4|k{=9e{5u#LI{}9Q57+#Cr-Ij!N5lnLH^iq0brq
-Xr%X4d`*UtG#;EiCAKyD2n+TEmh?<bCHcwbZzievO+q4LmxytoG|fQtGVI<=jNFGUc=RpN!dJ=9VND3
-a|d&WjO@^{&u-3qfm~onpWmj9VdRu%In_4@??8ljhB=Yd=+fTinnZ4_Hy?4_MM{0J+(~^}|C1>&3Zs-
--c2Xl>-I~jE)W(#5$*SAC`JWKfn{E!uj<%2{<j7;Ihx2;R=M?D(TQv0t&2H4m3LGIv?1T7RxhK{f^pW
--fHs|2rTwS+BFepWc*^w$VDhxdknVLnd#2-My$beVd|0`1C>T83b6*d(dz(mJ0J&o(Ydn|#d?SgyZk0
-F89-Ssxul6zAF?{12uf<boUk@Gcd_1}`~SZV?0^vn&iv@+_2uh}`Jfp9Kh*4BzF}zDI&Bpgqjv~eafs
-Z5?S&ACBO1&1{xd+R`>gE2pt3nB!xvxhXnt+tuaGi9Y;Mp!keJpvdLal>#1=9mkeejNS9enE;yt9TWa
-WFsjU<!czqq72sIhw0)7GXv1tdAb4h^6r%{kXTI9dle05s1-#}`n)h;Lo_+p`GfDZGodpZAz&M}tRxT
-JUf?w-oikKO2BQlC=a><<XsnBqnTo%tl*vLPLIW7pu;!p0Yvg;MRL$&0`ty4eO>yI+&YRxI@Q<cKOJt
-^QhqR4RrZ6cKm;h9o>)<Yo={<I1TEP!p3-26&W^f80xVAriFIIkrg643fP9I5OpRNSlHdG4M}Sg(Die
-tkI$M$FUK)YyOO>#Ib8hk1CjlSLv`@9MUW;l?HC@Ni2oX_&P|m+5p0{=#Xz2vZL-AWHxV3zWq`QY#8x
-N68jNL1YgHg_DB{$&E3QB_v@m2ydTionqo`qb+zN6YR9NRj!@ak4KzLNt8if2fEA^I;1ohJrOOCDWX?
-Gy}EXtXlNo2Z?7{v*r>g(V=5dMSBsuKww6z@6{UrFRdGjXnosp?=lJzP6x%M1}!S|=F);K~Ssp9>jzD
-D^LhMiCZRRG7eWxxya{Fo!bp<5N44Mv{3ZP99(~cFP(g!G$!IS@??!rw7Psib#A5gOd*TcM@S9!?10h
-aaYt?dH@=T5KM{G3}f{Iw^Q7q<$)}K`eF;D2sHaDdNwl2U$7JWd8`%KGN{Y`AwjE5)#m=kxebJ{#$98
-spxN|qx_|tdgy+ROTYPLGMfP@uxVo;b;0(*Vwuk_U4YD7RZ^~Gpup5-R_!e9rRj*DN7zLL>Hx8FsC5O
-=aF-IFRf5u>A7-+Qno!Vgnz2fao>n@tuf-{kG!MoP{wWIWRi&SlRg~e`2jo@L}^qNIm`GK4GT-wIZe)
-sjTD?h)lcN*0t2}Li>b}K<=A|MECmwSbz0N7@Vq@WFEm2LjC-^kg0c<FBYVD@eQ=DydaB@Z-efArISp
-BR|^`@g;1za;>ogk^?zVSuI#^fWkBlAE_ooW1X91W8+$<E?bK_tVlr%!F1`0@7gX);MSv+oB28$MANe
-&JGB<8*|njiuXE4dS|qhp@R(OzYEw8Gml&!q)B|#5}^%P(;}&Hr+2%9#gAO!E$%Bm98PvX{0yVX0e**
-8$0wsjON#Mu^N=T>j<|fhY>-xMT}06Zi^10<pibPdTr%mmW`~=^Mv3sB<jfUBlR6v<A`NuFm3!e8ICP
-B;-2rJ0R^DGkuuZ_Sv{Vf44K(tP2r&pF=y_Cd!M@PRw-;#ei?%DbX!_B)0Jeelh(JS0EF{24wLc65j#
-+9gxbs>-3hZK?)~NA=iQ!H?-e>?uDGZzsYH;=p{HT}Uc{p^v)`u-2Bm6055X&jNL8P~k()fZ!8;l@s?
-axE8&ZjR(Gg60^q=y(DC@{9`CWjYQ+p7UTG=)AHKG&EWo(kSm)f@1az5?Cy`qwq+qt~E&ZS5|vBNX?u
-t;M!h#9EMM=+9t7j<Fzrp<&U2G&N>49lsikU$nu{wL}f-t}Wbw#jr<{00~U%#kUYw$#LC3SYMcmUi_J
-hI&bR>ZnYFo#~fE(_j-3XWcaHbeYgBc4%xdtVTGf=DB%vNJ(-KAN5+6WtB+rwxMyX;o?~iFQ(D~R{iT
-UoXFxj$ggA@ll-{mN;JF8FwncGs$nv;~GMyW~mAR6bw((H|vO#XxHh{4kM{_*Q*h=NALho>orYpwc#!
-cGv(ROLlNo-Tp8&KO?Yls`OeH$PbyxAXd+Clzi^B(vWsz^o-UIN3fWP_YdZW<_YzNdA&nP)rEfY^Bfv
->$O(N~Uf&KRa93d2)uwae(?-$y*5t7d+yP|9Qt2pyH>o#=W2`9pgbsdn}CV>bSus%Zj_oGK0$2^=QhP
-;sJrQrrj`ZB9#6T0oZoN_B>cSPt=q))xcd?GNoF${7~}dS4swsJFM!hu6RR)5Pd+7nI1^7TbpsKVw43
-+Isbfd?c)65hF>S9J-5-WulmeHyi|2xj*mxoMiP7?{5@NdLM#bl*^{U>ewq+2+D0_DNOBju{sL^?6dJ
-UB$96tEw3f15Vy!M%E@$=>3XKZ>!ouqFt~aArmF-4HIulZnZj6a;Ph!U?*AwDN?_#BRG(6;Y!xOZ4bp
-x_jg#*-Z#B&$J+BI%bshp1uZKYC#7)Q^UC$o_Qs*a^i*_UsQsFPdHo>NIRn3^Q`GW74EttQWHw^^?q*
-`4|~y?MJu35M(MWkSxb3p5^_K%}GspiT;;!ft-^*c^FX|0><qCOn*_jJ3h>UQ`8Jkvq1TY>i|`JRUlN
-`9=Yx3%YE)jqYvPwskncoh{p@>#~1@IZnZ6tP4DiXZINKw<#dh2fLNW_(cP-iO-@By^etLo#ew=IAd_
-WM(-c5RgUhZTaI0qqsKVx*Be4S&eY}2=o#iMZL6Yf_3JW1q{E>>SY<_WQ>lMqGW7eW|NU&FOik}jpN^
-E#VvL8LjKj?9-RMiufd{s(atiF<nC$~pY>Vvp;bV(~%1vn7y?gM&!g$Fr-VdjSAy8{!Mgh0)Lx=RdCC
-Quy9s-^^57C*wB|8=N8;Fy~yHSp))${@H@w3}J3t+^T=K{#dLyZpu!fbcF9ca|p#{QCD2a;{!7L*RaY
-h(fN8;Xz}@jf>3B!4QatZI#{yZ|8v8~YyG0L__|O~EnB-L}Z2-B$ppvcd6P2?^)_fT;6HOXS5L>ETiF
-_5iuS8p0UtOOAFelLmqdL<dhCiAO0Oe?g=6D5agp)i5A`Btpc)62&*hJOeU9v2YFu3@b$t6m~`a+{Q)
-0p1wVA<zQ^Nu>%6PM{&0yJEk&`M@_J~Qx)MxkpZ6QX#$I*(m5jQBRmEVM6`#28mH=v{;`1imm?z2Zgz
-yvbZM|H<2aAmWJDdC&j}Iyn%dYYX>WEv@M(%|)@Lly=kVEX5>m>=lxgb;Zdqj*V8hrPp1D#tKtdFcTB
-K>$X2KC9vF(*@IvbDG?5WzSyPMh_Ozt1P?FyIc+Z+@d>oOYv^}nKW1VF!e3yeRNgkSgZzMK?(;UEn1V
-r~#oAcEX(#i6&P;5G&O3k&0-aX}s3q6sDQw6sAVO)2>J09KuBmQ&HEnZ|YpV}E9@g=Hncs{(^L;>8ZT
-5_Es|F+8Y9*tu~sdBiaHRaR*Io^0fd2c7!j#Pc*Rjay3OFFgTu=C%rlc?a?cYgn<@(gT1W|2cd77zrN
-X!qlzAQnkdday`}%BA2py{Pee9fA!>RZ!3AMO;4`9uR@V*x!+9#<lT*>FMZy|a;I-~sqoXL8r=T=RKv
-mrocQkjNv8>|`%saQ-VXcIlw8$&=-X(D!RcurzHFvC&bu&h@g4XD`p^aK!2<+#r&ucZ1FguNKX_C<0C
-PUh{+n5U&+hnGt6<{L)a_u;@2txRx%W5E5>c2ZS)Vxf5axcO`~-shp}}dIK4Ay<*%6c)r4sA;tS8gWJ
-p0qaTYNM}Xnwa<k@A<&{-OVo+f@w$<rQBIHQ3deQTXbyH+2X9+#jrUAx$3C+xX-tYIiIp{T)UxI%x`S
-F@h|af^0z7lZEzpku~O5o~@3kn29~+4wH_rk9D%OMjaw4{7xBuG%q%V?$<ZF)dSnO^C`Zr%ux%RH7|d
-k@q^A;sNVOzM#~|CZ-9B<@bhM9)K20Tu)d0(j4yOIAR;^I-gI$0ZU9~?n4SC^P)h>@6aWAK2mnzTaZJ
-(0c(1lH002eD0018V003}la4%nWWo~3|axY|Qb98KJVlQlOV_|e}a&s<ldF_2`ciTp?;CKBBL>ezZhk
-|Y8u``;;xgN)v_@2b^+RohUkrfIgKnf!gU;t1uGtPhCdUd0_(EuqYvp0Lr;v^Occ2~cu>)q8y!SVg$U
-{<Diu{aGj&HVV!_~zi~;3#-nuD4abxN3sv=_ojP_~_&q{`oBUM_we`;C1rPd>uovZ}VAJ)L9xdWzbw@
-!OLxPRTjbPa^Bn~RTg|*Zi+N%a(D+HvMNZRy`rh|>82^++oH;{RaP_z>vfg|-#&l(?8WP6ar3STk|GV
-Be*faltLK0F;m!B2UgJwBcW{ue)@9WMi(m5f!MrM0L0$&(?r+;BtDk?biu|)K3-x(fE*3CQ^|h?kr*&
-E9@776krCwCoK~rr{4+41PRdZEk3C`0&_HLG~o8URUe^ymxbs7Xm!MaKotK>8&N*LfxR+*L4&1$usXb
-?eC8}OveFUx#-z@v#(y|41Rf!EKdMVLbQc~-8Vx2jOIsh0mN^I{yphjmib8GYIm?dKC5T#>BcoBDJDu
-gBEK&hzso+d#>mH)Vs>i>#g{Yxq>dsuhb#vt4KPIGAqoWjZO>S&>yefWCS2=H;s_&8uwId;^QQ#O1Gp
-za@3%ydDQl_O2n&J+NM7(5<=|6HuD<aqz>dZ|T!W<^}L9nF4Tg`Uufr>c-Z$moN+CV3k~FlN4S{{Z-Z
-^2t(EXPQJ^}P;;p#eU{9wvUIYpU<RsYixUg8J(*Qm3fP<{OPC_q7@I1a)XSv4@(!zBFY{(H&zBi5&LV
-3N;y+<xCfKloTEXC9x^SO(;czL0F@gD<0QS{1<kwjRpI=txJLq6hR;y&0|H1{;oJm<VF6==KBg5YO0N
-r2X+bsPDm!jF0inmu;rl;e-@XI*J>j~p#K3!%92e{#2$<Nfzivjw#^e&okZzrRJgKwU^{^r@M3I2hiR
-YvFyQxb(gMQ?9E9-T$!$?^Q*@n0@J9)+WWr{6qz_4?TxyJ!{u^=*BBc7^lMz^60#KZ@^<;Lo4JF_wHj
-I{4<zci&Eso;-W;X7c8LzkKF2hbZ{qs#z`HCu>-k8BwhV@1m<_^yO*^O@H<5>nA^a`)2a|#aGXMgv#M
-n)2!>$2M^ZUbsn#Y^2KGfpzq<qL7L5JLX+i^&`e<;jlITwd-kF%vJn%S!^6V^#`I=W6#-NV%t`@O3a*
-Rtwg{$MAdW!}1od4^l}-T#k`?at)8Gw|Vb~f$IVXy2mZ}K$Y49Xi0%$CO%`nVvW3kn*e2(B@jRWlTsm
-4Qmc@|i6L%+?IIp8b&WMCnV8TNX<%F0c1_DTG3L`At<QX|H$P1ecmI$6Lh0fx+A1J!{;G9nKdac1&Kz
-%_w2-ImpLkW|QwfCEi83z(LmE?1gieG;F<@1P^g48S@gKf)=kvaoKe;=~fEQTt~O%#7d>AgLB*@gk--
-CjpfCVY(@rP4In@<yAf##ldr!|KQt_F)g?Ph9G?7NT#F?2*QJ8I)mNSK$H2h4yM^G*&vx~f;!pO)EVB
-iK^RJXSf**Y*Z>uRjSAQ_Yc{adTdH$aZkB0)5U^&&lr^lSCZZ0GriB_4XO@Y|>w1#~M~^=F{4byLG$E
-SfPMBm!9wwhWJc;UTImd1H^EjBV$0%U{Jz3R@u?(^vwfF;kALp$mEUAMiFJ@(hi@My76lSb8%O+nhGk
-3CT14>kvz=X?bGKFE*fWN__gbjm3`Qg=bnC;*P81X!>0P(qYtZNt9Eu%4_wtkCMud^+#cN8wAWgsWvr
-piNO1hPA%sPyc#L#TBlQsNvcTy#oJK`yw~Zvm`S>+HLB<Ct3!=s;6L8%h?4xcbP1sEWmcG-p7{LL0E|
-s|XhntR<4~$$SIE3|>Z~ao~a$@K;HlG))!BFk!x`Y`sio*@WM?Q-_a~jqQ>V%#gpCY*}Z$P-tSI?_5!
-r5?u1ojd)-5^~)xMk3#qZs%tg$2ywxD@rnE5f4VPD6g8xcP*zbnMQNc!_=q-fNyOqMm#%|j*w(;_k!B
-<fzs@Ym?~uN_+*Gg}z!^c9!JnZ+Q5ZK#6)%3ltw0~AznrMg^cUoE{;tYQe+ha0rl37k+YY>Jv7mz4yN
-v$cUM-~pNZZRz3X+yvWu4B$vCQg`!O)rnMh85P_&3Pfw^#Y>Dj;d44z}ecxJ`g70ZUjV&Fm^BZV41D0
-SY6qZjvQXH~@wFjf(*tNft?7)D4kEYNM5Og4?{gVp_T>3Y6&?5K~Md^PPr+63SQH7Hkm^Tey!Cf(-;N
-QH!PsIy9aXvkW05?PxbZ6@h53w>Kz7C(|7Msb*Ir8FzQU1kPwmXdY8?kOP(_$h<Hpd&0YT@G&j|u9I2
->WCN2)UVub9ksZYJ<t&u>H8;LOFnpdv9gvuFKv|M%c%UtH7U71Wod$ms_NS40S(ev?=Bu(s<!y#?hcI
-TCTbSr=-^ML6R$Wm9q7_v9Tu3AQ1Wh590R64k*({&uS=|Q>0n9eQyrBJ;&t4uwSIQMg?SQ`u;4$&t%g
-b<?Et1(byu9oKmNV9<9*Qgu8v>Rd5!>3eh%qm>FQ3QW3C7ikC#15#TK?--`v=7Zq>BbiRWl8U269iWW
-hRj<ub6sL<K}xH;SDUusvaA#ZZjG=;8B3mCM%9XmC!Z-YE%UO+`#H>Y8)GoZ7dMm9hEv~mhKt3a^YxX
-wEBE*Dpk=4+2{-eA(&HAW0(RWGsBMaUavF?8h~*5VUJQJB{hjk2I^NW77zuFB_<^*{TY$doQkV0l40x
-#i1IWqz*ZF+I)heya%2<wjkp4CPg2?A|AqfX#&*P^a~ax@J=;$y9K|*efJ{5Ck{ejB86kA)N31HVVP8
-WB&RanSDg#L@%Es(toUPW)HX8MtO4OqbFXltoX+VR4MPGxCosBw0xl1vqaIo(pr-0aQOi<6TW8D_fNR
-=0x%=*Es*Ch4zB!wl3M#gl|OmY|6Wtf3dQSGr1PqAEg9ahPf*J7H1Bu`3p&vG0E|A~7DW`}T8pr9G8x
-vH4Jt%Bq>+1hAipvlPXH4zQB(*`|>shC-B(%KN*dNMy;U8qf4ueR%rnK^cv)#QqP=KA`bvd2Ud(~@C;
-b~~yl1Gh+)5&z<Rjn>Lwk>9`?NF_4Zz)O%dkO+fd18cQjlZEdFG&N+Snh)XjHce2iKrX}vBrpAr*$wM
-yQ?h3*iPQj<K^nZ7l4xgD0ZL~QwnWn+rQnTidUBhC=0DAds-Z}s0jUB?2Q(=i@*$9U>N$wzB*5I}tcN
-OSNTYg4MS?|Nl+E*YFl0}P!k46Ux1&@Fwi;*XkTj1iWe@TO9YmnLHWe~p=d}_m{_Ugq17jW{Qf=)Igp
-rnd649J8Cc;8YTaOtnBuEypBg<q9SXAP~uKkk<5{@aE^k}%kVYs9@acss^1+yjU%Bc3|g$Z^L9F;i7S
-{DW&SGA<F77-tPSRXYovthDA)=K?gcwRPA&&nzz-J4Mcm0~}}{2g!wMQK#w6Rsz`q?I^GUYT8$CE)D3
-%H|nzc{KjC((Sy9c*;WNU(m)hJXktA>Z7zcXRWs-RxhI_#_w%uL$x{!-c$w`&g%&qp3gMM82EgR8dzl
-Nje=jQyuF|ne9LGZktI7)ut!2PTYag+?4k3*eLhkaVN_uqlW<7XATF{7$V=CZpt?CWx;EA$GzbT;l#K
-+B*vHc+RPYj`DvRRzZAoj48XzFW6o`0$ZaTn=G*5wFu)QGlkqgu-0T=4lI*1FZ6ehGK+r%}(a@o5Ci9
-<VNu^j|AbsYSXuSXW`Y1Jo9QrO%#Pi{bSr~_qj=Ru(GNUz|{Sog2RUu1-+6>&jW3p4=YOIE&>Nso=Bf
-K+Po^JU&_g9z}aWs6i|B*Ik2q+MDhva>@##uajGaE}}+^GH#UcB5k{hkTrPOPzGAZ~*Qxl<rElW|tnh
-wdBW-xWnDb?9z$T4D`V$1U?wB#SRJny^0MX_s|Gr;N>2MI~(k){XzDTO3Se(Tc!20DIePa(|yu3sIrj
-6gTMf}RejvbiX1XLwFeM6#7r))`mloKV7r$+{WB!;vH-9RuKA=XC(2qg$%}c}l7qd5N9rl=ShV)%%(j
-IB2-#QAwLc)ygN_>ZFllI4=+Fj&HzOAVsVViWO4eE!Edq4Dfug*~Mz+ifGn>QyvqTx_56=+Pr{%xSws
-mlb!#NxWhcdN?EloL8Q+G&9a0s(-_}5lI9kV6R0P9~C!W?u<n%w&l%VsAdpXJ?gs&a)98q_^MoQw{-b
-ir2YMPCs%LC$*e0Vk^(9r9TPa`zmx=UzSwYl^?e%kmaYAu$MeRU_OnTP)68+q=E-?$xInmqCUj5f;HA
-9X_Q^*k`N?ETrR3w!K<Ge+@S;>mZR`2711-`<5&h<rwf{0m=&iSjCH~+^kLEt4mCrIyk#ydydO0U*No
-=B!VFyM*H*{5ePq=A3wSv&&UJEHDXjgKZQargpNF7SNGaCluX0Yhb;^l;B8SwBnDSN=|WeXGginiY+D
-ryGQ7J2nECi=c^81Sr>Li~kIwaUTj2CJr1#Rl`mqz95L*dP1ET}O<z*-6Dk`jExRxSCx|$~I!}VYrLz
-OmgCyHEZpfLB&UMPovgyCqkqcbeH9=9_<UKw%(?ri)#jHM_#DWaS6lhcdQh*-!C5)_^la#&mp^y63S7
-ct!FNGOaW%61zQ@evYtn^fqUiNd_N0m96ioO;CyLU0e|c6;lQPHFFH+HF04l988CXtBYo`gHd?OU;c|
-V|yCw?uSlap>Pj1uxS|dkIHtP(fDY^))7~PIqkEB(HPwHZ(vub6b~6rgn)k_nCM+4^BE>dmb3<75C>s
-&O+O9ezFU+N13gTFW-~rV=JGvz(kpxv&Du>rsC2tu_o7u)$DmjHQ7WqSZ=_cE+?itGa}-L@5QY&V&8k
-ry9g<lBm&~{iZYe~P;RVHq7xmnwoM_!42wni4SPwxBltECE@!77<K}wsjfD;Dys2DcFZ+7WL6E>e>QB
-fFBcj&VsiHVV9DKRP=Qu=gDj#sidHY}ox{||kC8cK*gR2?>C|5p;=lmsWo<i!pmQ+OMZD2wr0W7^bgS
-q`4Ed0^RkFt88kfds_^3C8Pho}7I4`IvR|@4otMhg#l=_rX4Jz)yXZ03>95tMoHhio;kRkPSOa;p)>8
-6NIxopoz=Ku@uFwbZMK7DSfNES)&4{;y)>bRL8Pl(ZS{Zfhxm#NVkloCWUXF7s*onNa$c%I!COjwe}L
-DI%|*OJ)gDomratb;&@dq)0(;nx|3ykS}e1qXk8ncrBZB{sHcTC$0+-hX^ryZf$(K)GG3SKi0N%R{Yn
-`!i>R$_sV+K<R;`M?+Sn6q=RKFgHoIM=w2SLThanHBIRZ}yFh>q&lfVnZy+7KwF?y>NDE*-|Z43DzOw
-zSDSd0*uc*BLW)y_k%R)-ho@Vkd%q5hY~5@&+oKC<AQI{i0GO79HYsP#Kr%Dto%et;gub=F9TO4Lqa)
-<mOGoTRC(VblDGk4Rc}$Ewy>=D6LU;*!(hWjd%E?Yb)V^o$+bJ-(ov?T=Qdi)D3HK4Xqr!lGorH~OfX
-HK?(K*cd-zkg)0cGiW;q4P_ZbkK%`;5VznutFDrDZ&VCDT;=gu0JX-!7r_bs`3S#$G78;p7_)JTMxx7
-0)Il#V$LN46Z}InIDWJVvgRM6udOdjh(>VCPwG7=E6k5v*vU|FwBqO@|lstZ?m!{k8Qv2IbID#=D@43
-8W88fIiv#V~q*2>P5J6Mh54y>&rY2P_Z5E-8>YF735;>h{w9!g;|a1yXqWns|03i+b9745Niq6IqS$_
-avLKS^w|yojpU+m5YUNMTeXg6Lj73daiI82L~Z$+uD59#Bw_v^({zjhaw8Ko#5i56mGdRjSG;cpRL7w
-hHPhQXG=+gdVcsgh&OL2s)vyiyTp06~@cg<F*4>TC`ZJbiHJ@aBg#!o7u8%XHJ<hCWN9L&GQ;rm}<$Z
-V_vg(M5GghBSqJHlpb#!4L)8wm^6X=OLdoRh1UZ*m21O<sZCoD>^sn_eElJMBN@*$Ny6QW;Bj7|V{u+
-j+Fyq?1zI5$o7B^l-QDR9y1vfY`)`u7a1em?D4_=T1rT~tvaj{5#eU`9waM&fjxjo~O)}(F=hn#UQyX
-5NT`PydceqamW>$716~V3es5`Z4>(q4IiHnYLZ=MO6fsb7m8<yJT%wmWXuq)OJ?nkFuD{E4LbJMh}9!
-=cU4(-a4T8r$QPpIPTT~j5VT`e(l{4>g_^3fwRX>-(sC|TPRipf({;a|Uw=({6L*)pshib|`Hb^t2!L
-NGhjiVj8;-mZCRmz1wl|K>`SY+Cat@A!pogKXEwqioJ=>uM6dk6!6lFQ2L?e);Q!@xL*`kuYSV4u1UZ
-+heHKhMGFD`@wUH`~yL_thfuaq(EAwVm@eJ)#O|cRyoH9MsyZ{G-!TB`V~=bWTp0j08f-RiP-n=U&D5
-`+z<PNc)OCHb%2e7uW6xW;GLLoZuB&GsY7r%<O)Pmo@f{aOweZ58_`8&BYQpAse(d)3{;QKUUIbJPV_
-k$`?o!hzv)T+?+$EJp_yzLiv4Ht?i4-Q+BumloWd411P1)tZhu$0lJ=$PiQ>JY=%PB%u7!3j_~jNMR3
-=yfM}$J@&JK0LbHM&eWLEK3(g%po^x5HPrz$Q5W3ffx=X170T=)yNjDpK*Tcf}Dl27PMai*&BF6`+FF
-uU8bN^7f*dI_ZX{Gz8~y;-f$;$zm6cTQVk!7vr1NP+1v+8%md%uC*R_4&gtuWUPIS_*t73bRk~z7`Lw
-Qja}AJ<2YiEdp)<#9$guUi1tWpWP$i4&7}4MhAWNkbX;u55O)fkHZaHX8514zkhL8Ziw~5I>4$hD@|6
--6W}Sp1K}lXiY*9Tt6XBH=bM7<kr>)V@W|1x&Wj?C1ndUpNC!|pnCG?J#2C;AuoE+N0MGg#hEeoKK$9
-InhabyPnHFC7@8cf!SygK?$7rR0fO$aB7C}iZI4ZZD{EjLLZLie^;!{TSr;GkV?6G`|`8=W#i2Zn6G#
-Y_UGABjxwj=doXJQmo>!?fa$TYh*_mB>x=OJ!xmj$G|nM%4ZJ4x@tNYcBrko31QkF;B6h%Sp%kSe0*k
-@e5p+3`|tlWJ=?UDCZT<1w|DerjtlsamTm`%(ISD&G!tH@WX6^?UT<2nfe5on7DvTqV|Zrd9U_Vbn6g
-sx<T+$odN8QLmDx5&FzP?_ui{_bplC9^MA2slTbGyxYc<Dry7DCvTB<1InjvDIda@F2?JU`-&qiYL`2
-u5?Y7fB9@eQL2{$Q2VuG~$`A4J_`vLo?niwy$a3A03*U8Rne*5wyqARPujSxGr_df<#b=LB4p06NsTl
--yS9;?Q8MEz8#(B>5ripYCswi`eRbtc2TBip|o%4(Wl|balQnBtCbfCxd1Ny8#Z3CaZqC!<B?tq#O@N
-g`(j-mFXr-AiD*BF{l>m{abLw|abSKDJ1q)}yy>>Z!i;+P5LCKp2wT7Cr{`qGQp6()|zi|esI4_wnP4
-bz}3IJ~N|`C*XdM9cHlDogXE$)M#mdM48>6?monD|ZzJglUX|Lm=yiEmY3P&^E#u66D~Lzyld;nN-T0
-m6jWnH%YX^R0=Ry{grL?>dUc=1lUN5$KnJWPQo%P7641UoY^~^{x*Prf+G#AbWu3_5p-Q;oBHzfF#7W
-47x3oM<MW>mFYb>H--q(%1m1-3CVVe1K7kjH-_~yncsY7oe?0o~09$Zi;eiJm79M`EV8IIu)<Fc&yuJ
-Fg)2q+iUVUytf-b=jId@j@9{;@NKR+^pPbkHRorMc3e1Wf_55{oL!^4X&BWUaJ@x{j@7ifR>2+n}kf6
-C2oQ*4uQ{7~d5iqnp1kz5Y&uz}Ic3^7AajY`Wv4h1D{n*kH9>PFwYM!}V)SXdS)B1Wr38tPCWyxW3A!
-bgu}?k0FPv6xiua)jqUCC9%!JpRj{{>R7T2d95M`|>~HqkEILZ{HtZ=&Wc2;Xj;oc6v#0|L>z)%8b@3
-r5J4~tjnoPXbGAUXf+=_h86OK`6SbFLk8@;a>>G&&!uIc<*)LhP3!`q8Xa(LKy(A`vy~*3q`@n07p8O
-x1aQ8os7pj*wc_s%QXPk94bWbk!#6pIjGHy$Ak08~XfNGwKGA`XFp{BgOIB<tFm`98q^J3j?`#UOXUo
-dU9#wt77B_i3$7DOOECwz+!Ai>c%xH^&VNn>mBSgfGSjc}AULf7(FDK@gPw0zpeEj>TX5r7wFQ12w!p
-U2S)wZ@lB(Ua}PaJ7>(9qCXHz_R{G`s6+5DdMCK@FZp%Vaf86QBb@c<<i5lXqyk0L3{{JOANm)Em`A;
-uL!tVBA(Vl>f@e!70c3IU?|?B*!sE$W-*f2`=gc#T+Rw3((4<@n8+RP!)Xip~`TY)1Wzjc!B*wsM(oq
-#`lX$ugO{UTK4C#iSUWG5AuFz!KrQqr`q(KX#yb!-a65OB#%{_qHgogaoW~ej>F?DJb&>0UoirTs2TD
-fJWbc2h*2Xw3KnI_Vi0^@=j#v!K=Nr|C>Q#*B|%kLU6Y<mvR4A~X1Rf$CH0l=4vw-F_>k*W?Md!5OO{
-MnZ;~p<x=)$o9X~5L!LQJwS|#m6-bl$~+AwrX)U<@T2~Q~<E!nbGBnh=NCB&?|P(apndP-?{<G;f{Un
-AE+-yul1XOf6FN<qM9)0hFH07`7ZnDURm_6h@*=Zuea6`R!rrwvAN_UPdUyCBu?t_QLz%f@v>cG-l~l
-Adu*`7&lg36e*OS*R!kjWUb!ib-0II_@Rcgnyzp5z6V9u?S>ZX+>wHN=Kbu88gH^gBMdw$}kW3wZ>;N
-PZ%IJAoVa8>2&SU!#n$Chy1bLUH`k-(XEnd4$stV+CNW_X7uLGn$&pE)n$|XQ&Ub@H*|9|*~O+wI=L!
-2oWKJH!+Pk*PX!bK%TQ>jUB*~rC}4bZngXhKjpI~#r{h;JtJjgq9*mq-pMG|V8M{>Su_^J3oL$<t>iD
-}Nwtxyqh73qZ$E2w-r!Xbb1Y1GQ_s8=M5PKj-$df>~3me*FZC4FoKsf1?Fzvuu34AawIJX}r6C=kDMy
-4xNKBm5rs5e8Q(CruoYXO30l8@U!Loq0<d#9=;P7aJA3Hgomi_$D`hd9`R=F!ZtqH~jRY84iBp}Yn)r
-MM294M`76%JP;#Q`iS6-uVjXKR}07!)*xQh~&YJ4x&6Z=pErF3DVh=nd4|c^HC$U!wbo1L=iYiv5){x
-0|niquhyjUyhIIb;H+UoD(@LvsA<r6^i`6r$|ADm1^E?EI6DbhtRAbNu*O`!+XM*6K8u%uGNTk4gZb;
-V38Lv1+ABD(JAMMp1YwqQSK&HpSlFgAx~zoI)@5HNuNNTCbC%9F3*apZFXftz93X1oFT8o`WXpntDW*
-|(IW-fS+_MBlBI%&DgzaHNH76bgRMRvvl~LkqZs&tQHhe_1LpMz<YnSWy^%imvl(E@8qtyVN+&sE~bt
-dpE=veo6x+Htuk?m|CgV71rx<9wvX{eAxshs`ei^8=77>RRnSZ3%^I*he5@nfHI4hG;uhm4k<K5<oR+
-dBR}*mTCq^=TFOO68}Vq#05M4%4y>CvQOo%Ztss<0yZd{`vFw@BaMx<nvG8C)Elw(!bv?vbG9uVSJyQ
-ygyD>>F1x0-mj8bS-(5}@@@L@=<U?Dzz~{aByp#2JF`7~g=wzY`Vi0&7)}wZARX(2S4!jg(hJ5+&e!d
-QGFaKM2)HR{pdRR4Bs)8+5|0#Z=8<}nHxx0TQ;t~aM!fk#s%!!3T2`56B$aT@bAHXtziFRZ(<Z0R`7~
-%MB$>nLKueUlA(}DH7o68fhjpHH(#y&=xoJYl<I57Yd<~9j?#PYi$BC{TN}{2x*wbzpxs>9twxM(~M5
-a1~uJ2rhiw1PS;`p&98FKK@99{QFq(PR6DC4^$;(X{TkW{oLai$!J=m+Sb7JbJdW9u}ey8-Z}nU#{VF
-iuE{7wl%Ih~!MG*v!(iHN{?u>DSoynNV#$waAAV84d;Sqm`7bmG)6eOxB*yHp`@A6*Y21QU}u>E!7g|
-ye7#B|7V&Zv7^?Kc`_mR@<KDO>m>UAxSwdUAFi9}yOVQAc(SbqQI-auzJybWfn7KdGZT)*jPK9}AN%4
-}|2^QL(Gy|Pd77(ol_3JqnHt$f?xC8&3E%@&Exe|oB<wmP-5kE(bwYcn4`Ifhpj--s>MqJlgngV-A_`
-BTgO5gT6er##P?GDKk{MAp9@IIP_%`gy2t9r9_rt1SrMPj<Zy5VupBv-7YtT4F68i2`GKmGYxif<qi%
-3JN2_MfF1C=<URd#B+?nLf!QrUpD5p+yR`H(2(O=~4!Zw)zF6dN{@0^(M3as+l=Cx*%kq?vd-rU>6+D
-DG9sMz2j_8VCFoiZe*#nsfrWwYgjik&DdL{=70RM-lgBLs{qq(<B_AhrTx;gb3lH&7g$uj@ZbN%uyr(
-Zci}<z4Wg4OdLLQ?R7`;fT`xt;ZLhGctDNVitPSYd)RRtt<^HnX<!rlo^~Rg*}E(J5dcf)-O;kiTY1o
-}-(q*pjb1%PZBM;1dl$3YCrgXz&d6^_M6`djNv{@!F>1GX<xk3?x@1;PZpu8xowlfh)8n05moITSKEm
-L<yX458>etH3fvAIi#JoX!TpV^A=foA7tm*BwOHcT_Nwp-u1JJrL=1{704B1wh1@q!~m90t;^H~*c$<
-U8K{usRZ{;TgvY(G^g_a)VEfj+2KUMB?_&xTX<cv9D!6<S<C)YsrBb{Yc!Zc7yPk*<Oe0F+9yi=xMSP
-KR|l8LBpqs>lS~IvQG$;ocEjU9~Z?R<KolBGr40az`rf=^ExYZn7m^HL)r3W{Z04gRioirx=@EJ$RPX
-+vnJY<?=|5(;U;CV8=kV?=BT?oOFZ69YW~(35ivdHD&aT^E%Bd%1^599b^~v$Vb?ft)yeK2jPV;F~iH
-*Lc>#Soal25B7<3<+hW~Qer_gGWX>j0Vd#cp<MQ+0B=PtU@5@jLjvlLa9qh8-yjEv}@nrOdt~7zV46P
-joe%&WiYnA;B-ILoGSxb}~j?VrSKA9m^JkG@9h&h;Yx(>0~hQD@cL+=rAdjMZ&`do0I0ZQi18?;Z?I4
-RGe>Gko0@w5$uV7O_S0d*396li}*2}2^XALyIFIM!V`Y~Nt|DoT3QCx3KqGL%#DCiDURN$f=&WYpmWq
-WQ9?%lLH9IrJ7)i{Cdo<&N$dos3XH85RP>iLF*$`Lxef?TY{jC5C4z?nW7<hG9yG7sK)#(C8U#NZ04~
-TLv-yOYW{zwlr(GhGt_mJPk%KjL@*Y(!IM*Jw}k5I?bY57?=r`izMc5$F;b3XgOS>tMB+xD9(mCu(4@
-k_y^rblTeDY<rqSZ@csSoa0Xq+lc3)jw7!zo6Jo3$#OavA5kEQ$K7IJ<&U6+=sPWfMl(ETv`tvfV+i~
-w8q5dw-<Kvq0c1*kGWu%65S&=cS4-ve7mtpnF<n1sVxkBSjKnfz>qL9m_auGHQLe8KWfKK^Q78*CQGy
-DQH>nfX{o&WUs;{N04{HHH2J|2DXN4h7)A4BNXv~Ba5Dcn)+O(?Qo8loQx@*+V0P&9|d4DJOzusyMi#
-$>l4jih^fLK=-oJ0r3YsBZ6qaxmLhbW<7VDtjDt<r*BURy()7kqISLz%ckVb7I6iAyh2V|2|Pt2+IhQ
-lCXKZN0d9CINfhb+t3?`BoqPGvX{Qx$0){4Rby7bW5g&lDsehPQM2%dkIhtdJkKajqn}AJI66|?lytK
-r*&4?j(Lq51<@$IDn|;~NMn5>ZRSst;OUK^j5O;+d!<oz+XCl<^LpLJ=2T{4$wnzMwBnDRcTQaTjual
-)%cBZZ5QIXyBcsPfco-&m?%x<{d%}_9q1nwH$#hN7f!n>C~Bp7(q=aytYiji7!N@oUY&|mPNN#eaCVc
-?dOFM}s_a7)o6oQ1FLh`m$fULFty@qW=DH!>pD=mNcg9;8^Q+$^rxLR0h68S}PD`?{3D6d$T1d*-zMw
-?$##93t_+jIVf0F!qZm8{pM#vb>J0)piIl8KB9OOx3*hUUmuDNHH(Q)M$@(G%pO~=X;N-hx5WO=V-%)
-j>~5w2x@QpCO%e{krPzG+>Hkf?~(bKpOBlSY{`BZ^iIy-9ZC6p32oKW?|$`rUInPOENjBnZDOxPxPMI
-H=l>%-KYvt&r;xS}LwG|T<fE~iYT@_CaF&ifBv}fDw<ODeNIOPU=wwCY(P{H`$W6k0)m6?8LfjL8m^q
-#A(uW<IK)HlxTkK)E+^9I5lo`CFTGdxIAMlVUPp3}T+#bY`_*M-y*9SlK$*(N^2s!Jv+z_l49(4uomn
-`yvSZmU#8ue1$rEBJK`R^tTf5hx5Vs<frwmGgWsSn?F$&yZip|f@niQ*(5UP8rtWKDVcFX-MpPSqa>G
-)$x4X3(eKDbB>>^T(&xpGqg5Qu5Z+4Pur`F=E`{rMCfxnPW=rZUW$=*7-Bd(U2gyT>#IDY!21Z4Mp&@
-`@sXE-65SHJNdlLge{U7zD>-s2Yr-*o^>;+e8_za;mc(*%P>8=j9jN>*{3UeWXc%GN8T3MKatlFyZ!h
-s05=7ddH@eYmAqdPTrkNa!19YHoeMs89)^f+2pBsxeWQ#m(k5BuX?cv~#lB>hy3y<%-U4sem3KYWB!2
-?c9?E88l=Y--FsoaM8;o_>Y5b_0m%!uiz`4*6Q?nI<t~T~qK}dSQyqET6>MG(Bx+upR;b)bW`^jQaWe
-Yk(BAvM0nehvo{!JDX*9M{h_T>x5scLhE`-~~wV^hu)@1gLc0j9!GO4U%*4%F?9qll}5f=sqDzMDk}&
-9gwoE_?RyAgnfgRq#GMuj}0$xR%F6{!{warF*(fyD;t)-g_<ex)}ZHsc-bt0|JK&^{i^Y_U$*>a9uRt
-ZEvIm`+Odd?gvijNNV~34W?Oz@u`%`80A1E)a~3l_f^T?ZSN?6Y=U$<^oKA!@@$dOkxYcH)sbyN74*E
-`%rF!Ls8&BS<>9E9m#s3m>JgiFTcTAG&4B~Fxeb$-um+TFH84C*M%_=b)47#=#os%?nW4jDJQud{lHL
-K!;@d9l^13Hyw&p+uh|qOWdw|wyyyQE)$wT8x{JX%KRc)2N4fC-(Z{vp23T!y-j;ZZy5XN$V?9`r^iM
-}?0e*O*pZ~##m{Z6F;QRG5O$8#XhW3#UxsFVEq0Ub|UWU#JY=$fgJN%Y%C2=97~A!LwIUOP9Td5<8dv
-VohG`jeKc2hTOUqsa73?)5-R`E8XqnInXa^>>{B%L`H3XQNx>NexHco%@E@YxLj=q1!6v1K}iiZN!)}
-FjI~G?0gP<x=LaQbldOq>x<w$VC!Jf-Pb0x!1`dNY0qNz&XU3bnx~%3@(fw84%hHFxqAm-oz8yrXCm^
-*2vAgDicO&{e0(GWbwXXv)&q^SICbKQnI5qE2CqWT*qNoygW&}v6n>R=GYK-RMEO!{?nE4XZQT6M_e{
-IKs2)&qu9?%6>05>*BHS8RFz*GTt{OUlsyLnynA;j4XPo*8VBCVTUz9v7ep8n{z{sRjZ>BYdycJE$B}
-L!BBs#fusSvc-1M8M{I*m;^W6U8^8W1c&m)BvEGSXZ6M#&)r6#b94LfNBM=cUT7{ms)am;o}9h%Yj>4
-!Y%Xy&f!bgHdjHZoLN(5m&yz%AeLkQ(?I*Vdpi(jMX1}39+i)JrQD;l8bK!cCV-Rd)!U4_b|-Iwg5XF
-AV|9`(Sdn8#W48)=UgcJi3{E+H-Y-zmLxpG^v3*qthU`I*5;*3u3AR+NZgg6M1hz&+bWTZZsgeNO-uQ
-gbW8;jcrnUTWv&Xq^qmPzJJ`?(w4Cl}gK2*G>}Bxj$>+fX{`Bd?_`nG+hY9v5iC)YxeGWZlKYywwK7o
-dj>f3c5^ZlrCSuGy$H6#!2WRW!Q&hXb0b7RP}gjRFO_jKk))-&dS?EB)$ch4sOc=qb`^Y33wUOjUUgJ
-X6?M2pAgZ*Pw;J|4ZT@9#JOUWIQX%)WSr=?_O=A^=#c$LBwdu=?mv*ekJ#X@fDRgYqW^{Z=wonZ`pps
-byXMqO0`j;WBPYpL8b$e9T$#&12GdrIEwQ`!1#F*9%)LRG%ovpS4PMjoxeHY`w<NOOiCTElRC9uV)UP
-q^T3!p);P*8pUicp}ZO_(6vcu`m-9|UX?1G12=5abZiqTT@m%hrJX1Oq&+9)>|k}Vby~G4rZKfHoKiX
-A(a3adB*4^`xOy_(5+OXte>%qEw%oZ~gJRmNMxF9>kGFCP#%d01(rMja8mPMpDIO0bS`|YOt-V=!W%#
-&mjh<wR=^V@d;n=<V+ny3VELGVweREC2<Q>^i3}maa73gty#J5*e$wfJRmUAc4wboH17s78xIv&eDct
-<6F3+CzE9UkoKDdb1J|LZs>Ye$Rq!HB1<;0k~<a4Hk?a&&ReETtk0x?+i*Jf{sy-cwg;GR9Wf&wUunM
-~~IaDOsL_;;j2+9b`k05;fYEY75b!7%l^N)V^=;Rdt(;%*4N?M?Y1L6%~&l0OIc$z-5osvLihj*N(Pq
-sJ(j>r%IRCM<MFXdQHhN|G};9c`D+F4lbhnku=9EJTd_5D)+ciMkk~SzN-Rcdtq<nm|5q5+3+}QTbf9
-(@?(oCNRTFiM^(KWTlAg9w)ai~9}~QrXE{f@<{-~r*kh=fd*Dx<kzDP$Fxl)!)7OMKDrY9m{bQqpx&c
-CTM!XRo*LarHcn-71ILju#F)s}ChtA8!b%{kw{pZ{i$2Kq}vew?ZS3|9zS)6G?mw5D^7-F-}nR8dGqQ
-+h8*6_v{Y=RYdpH-Ji_$wP>S!%p~E8bozF-!wSj#b$jqajpKy}%u_rG;KhK}YQKa6M_7Y_)Ef!4e=$R
-oE^Er+z62SgaE%0A}YiomWT$qYQ!+R&rxSpOAilEJ^3BW#?lp$r$y`-mR({{Vm|jxs|c)sV<{`do(gO
-<<}GjqC8h>FnpW&<)s?W<t6l?#wZ(P8Qr~A8)Lz3czH=9hibAJ>n<Hou$dOLGsg*WVU@(;ujUu0w8M(
-1nGS@|2cUcSL6-Pb$N!uDw=tVHNK%uqZW6uvRYnC5jg&WJTrj7z#R3WTUJe{6NP=dA>#h8Qc!~wo5+r
-vprVyxHBcO-WZgc&{#+vBl`9ep%3)y+djA)?*c|6cqA&cy}L!Az4!0x`K^q_hz+rH37u{)Z1ZG4V3(y
-}tCTYotu^Jfq%34F^lHwDwS)N6{O5R|HW3-ADMsJ#-KO+eL{v|QVzZn|GY+-fUALjPu0JCan9n(VZ>_
-*H{ed4-j%^4O@;A$tS%5FkXq;2mL2q&qfp<kr2D2OU|+uxkXetX-9iD)y!i^q>KaV_?CJ)}XejJhl^M
-D3G;B^X%9u{2a@lvZ#k+p`_NzXKJgCDdus)S3FBDZR2`#Hs24)a*n2oL;*>=6P%@@gVA{D73NfbIx?N
-un6}E~<Y=aYwl^H|I3P{L3}5O$$!5$2N{A|!1YZYoAvUnND+~`kZ8BK+ad0}_<V#TVb|t#0%fLK~qq&
-EkYGNRlm$;NjzbN*`y24#scqs?-U}K8?1joED&=WNlo3NmV(efauO|b;7PPd~VLu9s{P+k-jpKL6svi
-mEh;EQEz<Jj0ustTLZEfX6viIl4`=pnXQ?`UaMLPost=!P;Ow{woE@=h-WxzbBBbzatRPIaDsq?`l;o
-nbANS5}zIO9Mfn^jZfHU0%{Q8_^0ff9&rFVa^1t*poI^c&Jy#TC@g5O!QpV&9MYVvc<=e{)GQKy>@0-
-%N^}}D*1tqzSW#$n?bP%q3d5>hMS^>mTR;HhtN|c8<-ne9c~kLj|--%Xh?VolsK~WZZ$kbncq=lTO$q
-S$j#Eu{*#{f%GBifohUiKZ*{(wR){=cz5$|R-fD^Q#i#dADY)1qGPb19{-7*8RLLg#N5Lr;B#Hwf(gx
-%s!~yi5<g*;F`jX>5X&-R(c~Kl;$V3cJ%?KHzk7;&uiUGW4?~RyHi+h+G+r8?A<tcSvq0h>LkCQx<x6
-(aKyJS{@j+M5xtSb;W4O*@Mc1BozA0&I8$7GAf=We`FZ%`^eyAQ03--OS+8XX=oJ#rmMP2)@ySv}=~i
-LB#y*8AR-X`3=F<t4?en%K;wW}>zel_{M<tT`eS?<(OB6#Qoo%dra6y8-)%OgYsu^W9k+x<@?g2w7cg
-tUsRM2=*G@oU=}+f5m@L#GAmznz>oj@L{?1%+oE8Wmks7bw1*07)UbV7$GPYxnp{;?IgJ(WsDUYyk$r
-<`}ggki%G{MKy6xenR|H)W~yM_$;YVoM`2@8ca#)|k!?AFDbgvVP1Go5Ma^#91g5%mOu%z`uRg{7V|o
-^xeq@8h*fXB@<Y`3qEK?octMvp(WA<oqcxo<W=HIJnd@o=-dIg!`bWKlGfwHzLta5Cy9<!E8pP|a^lW
-FTkX|%*4E7&_AOQ1mbEoa(z(nEa5`_WMK9HB&9wB67#WfIs1n3PJCL*3E$S|CO{V_lZ-T`1J4K+lAkt
-x}#Al|k5)*?UpuZd1{{%VMA-JF^AJ0zPFg0Sj5%!G)6^n<~C3&|y7)#o>Uf0s}$M^Z<~cx7LE#=e2N#
-9wCHLm$DDXSP^U4ZReFiGluV39uqYa?czO5QJ(veGYg7YbkCOY>A1KhlV4NXAny`IqnE?=b$YTMDL?8
-CIwCxL9S;!SyK-#x^cYqwi%QQd4&&;b`Lr<@&9B$P>yFo>WNifr8Wr|UX*|}$HUtmTUk`D7Q$TA67V|
-Z_(a1JnDn#}mu)**hbycJRwUibb`WU|-%C5AP_auWfRX(Pyszw(uAT{2F^VE1hj@#`~3@xU`WtQg=s>
-O;z<7}t?;Qs(nO9KQH0000808trnOoo@Wn`{sO0NObK03QGV0B~t=FJE?LZe(wAFJx(RbZlv2FKuCNX
-=Y_}bS`jt%^PWR+cx&QegzV5hNLSojWe^mqsGZ(9cSxle2ncLJGRSEBqXt>2$di$Yo<Sb-+KT^@Q|a#
-ZKldhOcB7tyDvaHY_vOKk%*IQHfCip9sL{M40Z-P>_9Bnc`}<9%suef-nTFIM)2QDcD63&B4Za~TCBp
-Hv-hIR;;=|W=EJHB&e?~fgTs@HL%+B$SeV7^;PmA3{OCVFUY?#`;7gb{c>46|;2;g9WI12vT=J{{99S
-{uEKOv=#FR~wluMRmEMzgf%9BZ{b{QQ0UM6>83Ts#)Xb?tH>EjAqJ!CKy*5AW=DHfb9b1_NzLi)6CvR
-H~7#<N9OM04{s6|)(jV7>}zo^o!U<XR2}(_Ac=&-ANzuw9x=4(}trMC|l%Bo@oCFq5V-=D=jG2N78_6
-p8GP=S2Xs=Yzo@2*NZC0=CbtoZ~P{rd$@z&0v7Y@f==jEd3cTKF~Wi2(oa&gTNaA`$KlkrXo$nipOlS
-R@BR77y&1~VTY$52EoDUhYxShE)IjUx0jcP=O+L(=Y%kD&vmY^uUEU*nKQ(<#~#i<K0Z9TJbV{?I666
-O&ED~M-?(q~uQTtD>kJ<L;pv6!5Bzh1NC8^!N{*63>Bh-)%5xMQNWDx8RDhz)Glj2~iC^SlCeyIsL$=
-~9<2(i^C~LuFib|QTEl40<AW)(LO+{`rbkF}6sozU~kNLh2yC;%B8DJC6Cb=k4#X-xgl`s8&GLeCH#}
-ailIQ!q__opYpPlx9hN2kazPy`>uCPCmql1;_ccn^dWkv<!-xnlAgj|y)*VDJIGd)w0NNtvVt5)C`@`
-(-L}V*xb2mIYrB0r0f|LXklPD_kzqHO{>Y^F)-Af%3qFOd?UMIq2OAVZcfN22wBx4Co=|Qx*W$Nf89D
-<mnWwC6s*sL}XkeYv!BhBbc0ofISC%fLF2zvk2f;6UNIh4;KVy%r1cfd;$UGzyOi25idm{XW%S&?)Pq
-k$oRB!AI#53lkmfd#J{fjo{4-xFK8Z!3<kg!qE+mAp4S8geg%90imL+r4bGQ**_;SAr$n;PkPFR0Ga`
-B6dWz&7^*=i+CutI~w`WKCb;V%hK0qb@HktY!<pM)m35XpebixnC4I8nK9}P|)KN`ycR*1ALYV?o~X#
-29(sVO?+e(sX*0m)Tf=^{9~I6wUFkRIM0ovVirCqE1}a>shSx~XR6LKHTa>*Yll-QrxFQO{qBB~HgdA
-D-*?rJPp-pyWJ@YgATq*jSC#{IqrlK(5yqP^=+ULc;@XbaAdXXv{*h$C>B?Xhjn`O)1lqrqpWrn@BQ(
-Hl#%@m`Xd|-iagzy+_xi7#{)uBpZ#`ZzVc{jI&h&nh=X22sq4c*;<rOI*@27ZH-T^!N%)MTtJ9X{3~E
-;fL}XvlBtoqi{oCGTKpI}Ybm%UfYqCKcZbM3HL9dwlQw6fFnaaSjwpMJw91geIMz-o0e85;KfR5?q{s
-q{tt_+??)oSMqkNPxA6x_5`0x?}L<AlV0z=Lr`XqN1K-BAgy8^0_Mudw3$_u$lz&}|Ys6{f)Y^zdbJD
-ScO7vv)=I&P3=H~AF+@oS4|@<FaOW71aalTH3fi-C~HeLe@#1c@nNf(m|vU&;vq@rpAQsS=zRH`=iZG
-qiBI|2|CRrZ{#^nTB3i=a+Sy5;=I|#?tDGVJ^B6+-S(+mR#{I;TboLL*;IM%qQi{bu<iw1vosD4gzZG
-$CSnFiRDkb76Y<?yl2P)OONC-O^Wv3_<^JZGEBWj>1xJY2R3$|J3Z4IM5<Mme^XhTj)%2&dN{TNigOE
-r3bNYe`iX5JMm$}PRgu*mK#iCpnrgQ$1DZ%07Qi=DNO#(DPa5Yx_Gw3p6jFz)h9&OeV^EaK6dV}hQGW
--7y3ScCVN(eBSTC;W@NR1DjZz-wJ^8@_zNZ8sf;=Ad(rBvRNtK$JNn@xPsH;tNq8uoV2jkS%Q+?lHIA
->}dRbqN32IOeYc!D`5%0ri0IuF5Qqm{%|&^~_DFNc`G<$NLTc;9M0tLua+B$OknaROJPNz~q4&PAEV=
-#Hq41d%{}(Hnr6D%ldK6B#=2x~v3Dj^Cafy+6FT^pgxoA-u-jkWZg^Q7p&LpT{Bsm7sFM7y0aY1?{;M
-Wgc<-?$3)wx&!-yyNzWp;~~ckbMUFEF3x~p(lBt7tXvM2xydqD6I8XHm5T{T1YG(G+?ljM0Y9i97*b%
-?+D{94%J0BJ)e4_6CycO|b#O_TuEMnq1{4V}iN}D1BXzx!OSKrcHMjztpGimbJAs>9aEf`(!C3(E8Y2
-9~Y(ru}L<uh;@g431<^VEO%4UHuh0l<=<Wqqx^U5RT!q@tZR|g*jcxWvLxG<9pLBBK!EmY<p0Lx-(TN
-zlGoc;irpjct$b&G!sEW>Idkdb##LB)h4Oqz#xBs2>|ulNivkfG#J2(ShUnWTh@&jy0QmrMZINou@+N
-^cRSjOV$?N70-|x7a_howJ6vzt5Z`i_$XY&bZ@_4O_sD4BNVHS?5BEaT->jr@Q(uYF{)L`Tk{IZpsFA
-$b<?!17uw%6Lx*Ws7HVW@Uz^hq-cqQQc;U4$iW{&mD<$kg9i36S>19#vxZ=Gx7gW0H6)OCSmLMak!Gj
-KTbzCvt&j6%44b855~icCsSWMC&Hik!4n1t?;|e6mEA)ga`>T74pTnH5s#J<Qe;ci`Ij#t?Il3i~&t^
-RM-7=TpdB2Wgs^V>5g@&)CnW`UDS0uK<nlQB$i@uI}HhJ_n*3Uk^ZUt+5-p}%ITD186pr&E3v0|Z>sB
-{_C!y`jV(jOH+rEJ!An<-l6W!Bc921RYXcoao_QtwjvNi%Yq!OkYMrW5<rltAX;Y!QxuB*_2otlW~(u
-w6rB9L6DU!;TpEWr;a>U0y_?K1XOl(CK5r7fU?O2r!Rp)}|r0)!WBNZih-p&2$2(<O9U9XZlOKEuANK
-uvcGSx|7XrSO5KlJ0nP|0IXBUEvm9R4ZvEY>W?vd%T#eKrVr=kM#=gMC6z4iTj;4$ycRkrZpt&4CVHs
-eFH|m$-><&CsT(6ExD4yW@ssA%`Lt80FNg359J&GXQ9vHU4f2gc<5F4<VF&F`>-7wF0u@L(7MG<ieL;
-0Y?BG<gX)IS&Ym#A`%l&p(&$3*b@oJU4tC8yPY+q}e(jud7=1i!kVESBb>F7j9#_djVLuFsFy{;eK)_
-u_a5DoeL66`~=SDL&RudBzs*LY0Y@hUxhy0TBL2|d;Aq7DFXMe+E>_~xcRwh-fbl(SFSKEaZge<Djj>
-aV|mF_qSIxB@)5@gB#-y@#3juw6Bo^<@9gRG^UIc{}*+SC+B7-pHh;MQz|zGeB<>CLv$Oc1!j^RHW6a
-*R@rAv4UkgVN=1fui&qe9?F0=`^Q8EIiK<SzGI3Dj_qECMNu}B%*AUl<szJ<Yf66UsKrygQK#<zI@A%
-W;85}d>Y#80%?R0#S#m#;#hMzMX&i;1UoJWx&yZquSkH`tVqXqJ;_qcrC?_oOtPJxWNM-nfXN9`5fkT
-eIw^94$g^0@(G684Tp)l*baSU>q$VL*BC<#**%^`J&U`LRJsvn=~A?tumGR&Q@cRNxYLfCuEWE#pjw#
-SgZ@332rqNTU0!8r+|TQjKw_U`oJ`Oirfi<SJ2X3;tXa~wwO^ul7r(G(j6C}Qe^79eKkTG7ZO^-=9Pq
-uPo>n7t6WeGZNyC9I$B`pflGb?&PsKb;Ce@9@qNavWbgpM*KS^bw5;j*ZR~6==vNqA(3s$t|!gI+S+O
-LRl^$GvcwvUSzg@F*?D-<e8d>W?co#O$t;!&?=Ku6B9uu)|yK9=zEy03rfcmJQgfgoY&F-3>HHh>n4r
-KEE9O|CCSv~orsPQ8-y8yszfxbA&}k~%2A&+JW`LEsRmzac1tih*iqdMGKU*lfatc0Fu{Ta-qE($V-7
-7hL$B!G4>o5Zt1%aubPqVD0!j7UaW1@~y8!w^RgD$m4%rW+`*M^>i)iH~V8HkZ;vOKY4io`#>&UoXrj
-I_+S7BIC)im<tfg2+`?3Z7DVR(|E$XAz+!ifMyU77y2ZOH`jO|{<i5XjfH^DPit)n2G>du{4}8TUG@9
-B8BY9`iI@1M#T{Ne{7<Fb80GzHR4j&EqlPKYHw*17~xC$J)rgD$)SciMln7zT{yZ&0V_I(2c&W<Nf}7
-9fpr6ymm;VF)L)XEAqcKWS!I5-F6|%idM?lyB28a>nT|t6_y;s1L>+Ag-{qyJ3!;@L(osVIK4DCN*gh
-gJan8)6XjhXzC_&LXe3RIwy>oB0F>Djqts<EybFQ%FB$h|J|l79H9^$Li-TkEz7ut3O~VlKGRrWc+Ym
-2zGId1Q=uG!ly??ER)w}4^c;usf=D&sBPajr#b@&Uj9;NhM>K?E54=etq*%5=ooTuq1O>V9H%H#v64V
-808pI@e7-DHAXI>&pfBI|l;)OC9yzxUe_kHVcDOS5J$Q@s$d#R?9gqau$B;-Ujw6WwYNfVe3rRTpz91
-~FF!M`@PX(azg=H_D*f(UnA+i=?$K0wz8BqNQ%#JMMJ!h?||F!CKr%?llJOd%drj`*O(kI?ahV!90yJ
-Ba`h|iEA@-;G`i7hBV1oA12#DA%GFC6F8o~#2ic2FM-{ps4b|8LXSaPAbXjyHF@}{ZV1)ZYh7f+N6$W
-6#|d~&Ps8xgYOHQX-EnGK^*vt%C8Kc3-A(u59LH-k@${`;yvq&AayNP#d7%JA#n4({pJLOi{f&I$i)F
-F4%Gj=Sd+t*yd^gEXT@bt)kFZd0!1r#p(C%%3Zxpv#yGh#Bc)zgwaHyWIkRAnWOihSt#A73Rfv}n+O1
-{+hT&)Y*T1x6Iol0C^JAE+)*XB6*2mv>>^;d^|!}PUrfUh*OCgk(mp!jk8T?AY2<Za`{8i>_jx?HZoZ
-e()@UhX`T>Yu-h|6>cq)t*e*U`;bJ;!6mxHze2CIg6ndur_U|oFFV>n@I<5Hci7>TdZoR_i*<!B;H|0
-L+bTN*BA84X(MlYc-kw)n{L;t8~0GWR{CR^d?WAKDrLdN&2&X)DGz2ReI;>K)k323j((e?Zt~T6e&^R
-ckg%)b9%=&Y6vcuox2{_w-8NC3Te#{1BGv^}dx+*wlW0Ra(vVCSneKt;4)v|5kFcvTZE<YEBfPih_<E
-XO&pSUHs!Ng<xTE9mPcd|@aseCzMYrMORa>W^291y^TT^^cU93d4x`q}wYIChYQU%Yb%7A^>`cx7@>E
--1HUaC{^2D~-)z!<v_I4_%Vx`~P%I~Ap45K$p(3Tqr;sRgLogns|9?6wLN2F#7h94{EB>#_b(1o?SOe
-!W5A69Hj|t+<1~HIjC#hEUCtWvPvT-VW6bI`tE?CJg-15)rMhubXaSu}Y$*Kd6I`9exbQXynD!ug~NS
-dI6h`rmKKJTu$8Faosnso?KshF2eJ6y=x!JS`E$i8(!N}SnlfoP)h>@6aWAK2mnzTaZEiCt^$n*004>
-@0015U003}la4%nWWo~3|axY|Qb98KJVlQoBa%*LBb1rastr%->+qU+*e+6%XKyvE{ZMNZF7|VdJ$c6
-wzTP)eW1cAy}w9Q!-bxA6TH}t>n96lscqH~Mk3P?;*=lv#6$@!~uvJw?<HcQg!_4$8rXLdR}CGSOhkb
-JY%B!53A7jNEPoWs9w$nU(N2XaII;B5h5zwi}n6sw39L~j}SbkJMTkQ=eqPgFAUljxd?Y7Tp_V3JVa*
-J#NfIxXOBBN^MXMkB2o#>g+%@2@`GTow9R6WUbd{l^ctzh3|N+wI3+Z*UXfW+x{npQuzoYz-ukD{CIP
-6b%w0dn$KKDzfJ*Db8!!Y&yDOq+)B{fSkM`pRPWUZ@&Gm06Mc7-?u^nFQxrbD8EvNe%aPk1GoKbww7W
-~ij~;6R1^QzXkEfvZL~28FNgv?n@y<?EmID!)4cXryeS_+^4Y8`X<e5kxg>WPZ#0vwWIDT_&1S2bDn+
-gyY28t<S1um@U@JXe&ImjxKmNWWHQ#d$$}taUEaQB^o`IZFAdxD1JhKojlL)PV^Iv8MpN#!CTaudYA1
-X?o7v!)c&*buw92Nt}Mo&S07(uWENKAz{QxNb^2vR2)eLsRoF#0}b)QFJGlE6EFM&DCP|7$`eB{32kr
-2b+}3l0@etSZqVY-C>utJ234kb~F4zXse~Og%y@gX;h;J5$A(%E+0)aQh{1*5Yn?aX(<5k`}T90xzOW
-xH6JTR&)ALvju?+#N>e_HJ^yUmw?I><T+&ZhH1izO+hY-e-{_87bY!DszVw9rcbOVuD79N6HV3~1o@y
-&09vTF<~q+vwjgikcW(k^GNH<b?$O0U6}Spb<a8@tCLvWVbN80d=P6h)0HX>C`mMrk<w^KK;vU{@rQ!
-E<wFQHO@NO#&pR65-o!a*#T$F+BNeS9>U6#3G^?G5dD|^<LA4J1koxsP}3Vf~sp3|Bu2EK&QRhl*{R?
-K>UB?J)Nds0hsy(X$<E57EeS`c)CB3RsOA$H*TuEqG*TL^|dZCi-EBFPs8EF4kD2)}|#_1BjeNQq9a7
-{H(wgQ^gU<yz7Wn!~9p)@#M|5k-GyCc-fvfX&*h9qFenUu`jbSF|&^LP;wH<i$QMyJuV0tO2>+z8M6D
-*X&GUUgm-DcUH2c{UNU-3itCKov%p}1gaeT4=DypTE4G=aZwamzYSfZlMPX^#kP>JHIvR@ji{LENH5r
-o5{J__*xvo*-Oa6`L6An;R!$7yO||xXvr3e<di4@4jC<#Uw61-zK-2|UbFc%1+)EMd8YINC_pfce7+a
-Q#b@J!Wp4#Wn5CUu{QWb|9L=OnWq=c53Rt>zxmCu;mk`BB4*hf(?BY5<A2P4wPG>2>t->}A`39>H{6!
-7#?$J7TBcbSLC?tz?tiJ-MSOwo-eFLC-QuxWUeUcIt(=Me&XUa?k_n*$W1=PR@lAd-YosFG1VN?2C7W
-SziEinS=9n?sMp7wZe+y54};hmf;sQI=*>Doa?Q=CHv2EAs)zhjbvC&x|1_LPvW9C=wWY%dt~J=O$si
-DYD!_VgIF%l-JmR=UHsrT79)8jmj%gmnnlzjd@Z*L(yc{h$pgzKWOSc)5sZG_XKNKGB#YEs`-4J-J$K
-~alyf?FL&$^q;ZfJ;3kH{?>LPx2H$CWGGKEk7}USmD1|W=MqgG<%H1#*S;Lr-tKgO8Tp*c1Kqx~!;k1
-C@S~Jqc0$Q?G%nuM@qfCddyaH$aM8S{!m#I_1ETKz#Q&}^nC?W>5*Qj|yPK4X>usK%55L*6^7=c;bG8
-|3|OP6=RDawn4KqKl*b+z_tI*>a+yMMtjF;c8ijO*NP5hBMv2vLhR?bVom-)RQdDwsP1Jyj{BuP&k;3
-Jj(?#=u7z!s1N)0`R-0n#Mme5Yl0X2F@Kp{Ig=u5iqwXxN8S_^Ch+-_G=vJNT}D_<^8m>9J9x?Iy;FR
->ybcS&Z83f=Rq>M`wAbLgS9-8nh2vPjIW1swPmYaUT>AH9?~w3WaX{w;$|54@tz9$>ITY%Q7HhBV}Pl
-S=>mYyDV(^B3Df+Bnipf)pO*v~Fh}wj+#PU9mKw)B!EPsypva>reU(CPa9&0dV@n??LiqfH{)SJYeqF
-ozW#fmdp?<0PaI$f_`&_NrT8G~z=`gWXpEglQVcLndk3vkqKY5$GdZ1h<vZ9#_m+_qVVoXP%q6Ow*jX
-6H?IP(LByP`0<^_M=0nlLqM*Ql<=+bS6SEvD@Z=DZ`?(ddz|U{Z;=`1BIpiS{1VH>ywc7)s1k^0>MT-
-W*5c;D0CAS5%~-BOdE4_S7})D-WVN#G?m#DorI_KaAQHPBSmJ+@pmq-HRQ~upcKl#ZCAhF&y>r3E%(I
-h~nr@hSY>Nm6k8M(U5`@^bFzq%h=rBDldRHTXmQNW#Xd6pA@e>8k|QhqHCRo1NAnlSj(Eq98;U{3ftY
-pxLX)YU`cM_819I{0N+by&#6mu81kT?V@P2lvnA$-$qujY&ENpRY3_8oHl&(Bch@|T(oVbKu6lwuAJW
-50THw*S&EatIH&9Ch1QY-O00;n48F5Svrfl)IBLD!gmjD1C0001RX>c!Jc4cm4Z*nhWX>)XJX<{#JWp
-rU=VRT_GaCz-Le^=bdk^l24IuJi;yfYIZ&fSHCOIUln%dL(50PlLk5?PEIP?(WsB@LMD`nz9M^>1}cG
-vLijF7J5B8l>*(>gww1s_LrJ78^Ysv1ys*#nm2LHkYIS!Y3PB8(Zvoxwx<LtLuiv&j)OGduNxOUUT;L
-zPT<7c2Zt8cWK4h%W_#{X_J@57&@JB&R!ippB$Y`#?8lurA5Y`zd1TRKK%0C>6_ydd<g9}Ha9m9=ZhJ
-i^P-{7th{6mfPc-K6u_nIvaHlti*$OEUh$f}oxH8b8yhFf#iFd5nx(TDn_C^`DLjmK#@j=-Gv2}f><$
-Tq-SIZ#9~ZpJX~5ZFj2LWOR^^-}$>p+HRy;{qK1aB0S>!+xp3L%wSLv+Y*pM&q>9iKz_&m*Ls>htyHD
-H+Fo8&T|an<8*by=w2XXVuu&{_Ri@r?}uYOKJ#$m?d7Uratu`2vYD1mtdcRl~1IBHK>O`66vpkCUbXk
-cV%Etft?R=6=EJA#3=@hJKg5=4o{UfK<1<fSD~S-pJR>#>@qJR_U}!F7A^Xem`Vayh-SpocLH`q}t>A
-dU_2@Im88e_G~-(c5-}j_~s}%o@{L3ta-)u)%3^E{uMoolcY%JK=%O<VmeFfTCe`=ysn|`q^im)Zc}B
-jx53~C7VrRw_~SCKcxKojui0Gm#uaV@eqI)rvwYgDgxoZIzGzre!Vqc3fEn*9U<Zrcaz4vy;8|D<+y_
-$$d6~|}p^@Je6`z(@MgDi5eJd!q3W;~cO;O$zW=uu-VmZIyRdATY;x?V-*=ouepy_PMk!-o>N>I1hVt
-E16VFzyy#nwc+me~?mJ4s;Q!EV`SXOS8<8nWo^H(w=(M=#$blcVQvUK}2M<ve_QJb5`eKAyZ#+!3AQF
-q1+^AGWMv6>-y}6o6hM?8R^|)f*mU7&{_q6%ncxzvLBifh5qFeO)g2<#IN=XLmUWi3?bt>$JGy88nAA
-1;N0|V#<+W*>9iy4yRuWsRB?qfVscB=CDJ%(MJ?O$N&P#tHYxSH8^~q>?FJJrsA|u0r@!kp<v?Yho7T
-?+Zg`o>%g%6?z5fb<>BPjixX%TYl4p?4<U_@U>D)P)}yzxv_XLw4L6wk6P+yQAPw%Z)eBxvtDIOP(C{
-06e^*vnjV-?}=X|sP5r=;qEI}++=C={a!T^L<`IHwmhiPmizukHEOV2~D*T^*br_2soKF2+ngGiu$FJ
-RNo$}}6jJAQ?KzqzQ(8E<$U0P?mfZ}W^38plGI)tX+f501Y9ZX<$OKstK0@MsU!!i&au_Pc+xHF=%F(
-FXq)3t|3J9jsOJ`mVW%Bb2J)mHZo@Hmbc^BH7%mQ&)feUT8f|m&r#suZwi1SIy>(RU-vJ`@GSfUTE;4
-OJ5&Ih~73?5c_Al|MCAk_kW7#2ylLzHry<d2T7rtjlLwJpYUe67<rtCK#L9#8v6-qo0?f%R&U|q^%}N
-O@ws#*YB=)2t5=3iYu>~I``LK80H)=!bvlRNn^Ujjy_Ue?_hz>MQj_<m#|NNPyZS;EMG@)eKh#h6_u)
-VBW_<S7&GRn?n?FbJTLiyF189V5cE&H6GAVXRg`L6lWBEkthxw(}H1|o%*^c%!8Np~+Rt2+WPOtdP>$
-MZ;W$4k>Yd6$OQz_hQH;AF39lfg3yymObaYYJ6tP5T@iej-)`i&a>0@!TYkjjefG*TH~@PgD@_ygZcY
-XOy9QrodVfxk}cL>Ol=SX*GZNlR^D=7UPHcnT`IdcWuJHPFMfKsb9I+e@mPR!iQd)Jw2&!5GCS*cTQ1
-^9?mJ*?`hUDC9iGU<u9Z*uoJPM74>}&S5*fJNoA6&38wzvyRGw4_t)6SZeaZ!UV@1rwgPS(qSO5S(G3
-gFJ@fPpHL%y90~>-3XT~H7C0BZwgAft76W8J1O{4lj~ai?IU*_THq`fvvSEu93|KI407K<~kVDz?_lX
-LS@Hv9WoxMQb2Eq_uc=)?i@LrEAJ}+;<1V8|TuF)(_T8_5!xufm$jAnF1Ioj^$j<(x9nx!4kXuF?F$z
-7tP<coGQ;zKyAYxX0U?RX4p6S7v4aK?++13y5qv*U>zuie@9xnM|ilCfVI>D3K&+k)yyEZ21rdCmbiq
-|8hO?@Ojf?p_x8kFY(Jl&A$tVv;o&p*zZ+4N{vH!<SXIkuor_cG-RppLD`9YORK~n{2cF9xmvDW$6tA
-wUD5e#bT-h_J#Rt*ZK>F8?gU&7PfB*zAu-;ZIKtkD~GtD=kYf%`QM<=QHV>kEO(q;r?;F0&GfniwGf?
-@+e7p(k+Ty1g?_R%V<UVEU0|Z@qAG8A!K7j<<=DltVW7U=)a)*AuE`<Vl;x~;Anf3JgA7b>%RF=5>;j
-mNyw*Sw9F8{2n+B$mW+kc3Rv(;Inq}w=s^D1TDY{O@I=~?4IAI09Q#7Y-E!YcN=s$PuKY{9o;6$Toxt
-wK1)BtwSEG_O?z2H;WpHs=ew)p6A(X196a^rTx(A-0_@OHd#0oiSKLv3~=!2#+CGBhfgr>DoeB<_IAf
-1(zV+RqB%XpaSqB+(Y#r}$nNOyZf<t<`#=%%eTeo{F^dE3sRJOe@u1m{)t2r6t~EmbJAPGQOf4WpVA<
-)|Ys94Hj5J7TBI+j)}LaFv<3eab`bHguS&FG}xlKvC{SecC7W@!0~N4(RL>7xxKb&7fp>lw-<27M47b
-kl4V6BxE7yiQ!1-3$<Q>}>#zf(g|vKhvzGZMT1gMNX%(^wqZ)0Z#A_Qgm0EBY!gSp0ax<8gTv?QRK{L
-~BZ8vJq*q*FMHHTnUPc)Pj*&VxCwII{d-gaTDSC5n>7x(sHmc5AvnKUN%e52Q_9NBHo(n%|J;}eJn5J
-oQ!pC6n~Y=?<wxB8wNmk+?Ol(Ot32uCfJX=gXnb0^pJ$*J|qcDJ~Gj6R2_?XI-lnCtjD)^&5Wc&Y`(_
-Ly`yk2={th>-R?*e(R3*6F*quO>Fh?9tK9FnKk3Jvll(QHMZmNkn}A?&$FOn-?|+<Cb#$P8|*}1oHau
-<V0MWlovRBj1ONPzM7mIylgoWqO-pqjQ*02{=Pl>{rLO~<1@fpKDw=ggIk-!_+Y3s<{_F(boq&o_sOU
-<mh!PU`B3pe;Zo(GYS2{{v=zFGy1Nl4<>93Rjx-oBU5DxjO__Q%g4w1Ead|Y?#&z!Yw-t<+pk!T?Fd_
-j)MMRkcsA*J7P%BGRU5ZgUTU@8ba?UHzJfK%Jjx0FS>l80a@mdux04okh=M?Y|ni#_?NYJ68Q8Z@kAj
-@)`Z;Dq^FpLGJUO+FreY4F^d7aBHIIIkJ1}3ccnO?wgy}XEFlp(z_mX&spgqkX1OQhq7A>)jr!NAc|p
-46i!b;O=9cd5;V?JItjPVbd|5)1w^tBwH!GiqY&loGA*iqCjjbGg|1LSO6k>JFcl2ldn#&iHbak-vp!
-gE2$pdzuQ>6fC$VEt(vJwNR}IH(Cc{*@GURR#!_50H|3Et63Po#E3lw_5J$kkh<fqq%YgIy)&*_;_oo
-gr|c>RRbIRs&GH*Ax0e`LcLjAC%}f|p0hp(Y1uX7UWa<>Q0|*4GyJ{uw)MX>h7W9x-TG3c4=cjL8ykS
-{6r3unB<S=xFi)54@8T31)%UOeV_l9vqC3%rINfOt5b~z*x?4#pm$mDe8UlOSJ%X2bG{PrU`M&!DP&J
-e7IsDYh>_*sGlMvfx(N4DG2(a8ooy<c!?cR5gKYHF&u5BbOGY+1w7SY8I4)Hsn&I8e1exo@<FLf6g4|
-7E%ghaNAcIlV_r-4=3T_9X@ESra=+hZA;mXD1Ozvl!bMl*vt?=D4~yp&rZjEhvgQ{ZORKSvDT{4M0as
-+SW-tFf0^&k3B6WuovRYw`<N(S~(t9yMr}WLeUuFxnx<*RZ>);JJR-|iq~W67=vWnV^8WI3R}2Q4|@<
-i_0ZL+w*^U9&%h%bp=m4xu+_f~^!HJ-!PF9rYGp&q_^b~bB1R&Q2SGOwJU~csa>wrR&{X#>699B~c?>
-+W8#slMFi=uxFNQX%dgoI^dD~WyGZqJa;qKb9@}y1I9NT?uB%IbkEYNKs5wLD#f^GvXhVe%d9{(}NDx
-S4b5)H<)@{U*WpgmX11)w=d9pnaSDNPe%iPczJdO99+>anA12IpgmJ*5FCH@=09aIGdY&^!|iy~#gHl
--hiqUy5aD3kA9)u-*8BAU2^;8KJ@afH!|~e`wAGb#pbCAP9HEr%h9Jaj3%^dgX${V*fLD^N9U%&<O39
-d%I*y9_4R!=#_lDu_Z8c&LA)%7r@E)G3n;^%OOL-<2<q^iLEg-%Gv>R?4_5k(vClmP~7q7@KS?(u;Om
-7T+rws!U~ty`B0EqTdC(}F4m0m+Bqm%YYGEfcVlLWN$tXbIHSse#$=<puBf%7MN6tUIL={<=Y5zyc03
-~w%y^`6nAIoUqqXj7Ce%nLP_Skc1S(dMR2ygIE*F5H2$LNHdls<*4m%yqR4&8)_GS29&w12VZ5F2OWl
-n~a+x~Jfp3cge+bW6aZtDn-n5a<AovF_2E10Vn`73p>u<qHR@&Kqa?f4xj57fEYP+RP~YhKWFfOr&>D
-}4RtY8l<;(i|dcfaI4~ojvCmshHSE-oF7N{>`y>S?lz48O-m!B{35hAH?GeASj+5wbxiuo+yInAx4^t
-OZS1-*2BPdwvbgXfOTrU-k@jA5>Sij?{U2VWh;(`U=kBC_4T%Be(r(N>KkDt50~1-+drfPiKMRpi4vx
-XWD)}H4{dJW&0Gx$*su1@IUXiK5cd`fuTuYoV(p3)kk2>yB3X*N%Fyxh9Ys|;+fPMSmm194BIfQ9B1T
-yfBx78JA0crpXpUI|(&Hh-Fagk%)xd}_<dWzTM=RHeFm|MZ9|t5(Q(s246g0hKwB-}nqp1B^^L4f)>V
-GCc1mi`{^xy5l@MpCM>QQbrbsVG7UKh#ru-V6dEAt|jTi2I4{dlM#hCXqq8)Mv(?WhfJ%*U$G!POGK7
-~_O=U^m=6)ITh=9t!>E0CXdHl~C<JV=M{pBV>TN>)0W_-JR^Wcq9+CO$zB%5wf6!tzAh++S8{ucWHH1
-yAt4pH(@;lg#!8;VdXI?2?Gs25V#Mtu>>qj1^<%6d7GCM>Os!M59nu<PM!~YsG_U>BD~<k2aKKg@BxR
-vE;HlXgGTq{Seun4YU^P8RW#;@4<s(2+c|VYeYvjltAgVj0xe&SHK+-2(onsXeXI$UfYXQA1e^`9iF|
-3#?HdeIqr{u6#3%s}kkf0|TZ>#nxg=>L6b~2&6MF9DGQ)f{xC{&_nAq4}2lEomLOdBQv^*V3#)#SX`C
-8g_@DYLxDDoKl<}#5S0%Z%4&4srm9wH^_(1$sTX-Z!UcfBSHSR&Uq2#b#fZ%kl@bU9zQg$aeh;RLDC7
-@Ncac_YXqx%}+ryw5f#kT6jVwHw^6O9;W~-O%Jt@FEnuz)H_$uY(R4;yKW>DoNu;+rIJGZTt|+(4J5n
-hdngfcY`N|zMUK(XE~D+Q8eNTWGc1SA&c=mA2QNt2LqpF{T_A#VSsK*4L!RZW6MP><*JsLmd5OAsNwT
-N!#j5wG7h=1+H?LV%o=}r;JoZr7HN><yq**&&a#(f6|0QM?+%WS4v)TS4X;8LEM8J>5BKoWR}Ur=Gq&
-y|JgrO<*o!YPCPS~$<gR;IHNfjpKD`kVm@YQOVTK0@c~!d99UN954#Y~RX+i>?SMjalu|GtEv+a<gsD
-325K^7E1;kdIM{%l51C};$4I_12D-$!V*^kT3Xxa_ii?8O54(Y}in6nT00{`EwpQdS(B*XmAgNNzGD6
-=huisl{jZqP1f=)?Bj=%7Scy9e{xZiAV$p9B>^p4UkPa%#@P)00M^TDE6pN%OFX98Hy;Y>0g)<j$WXM
-;6#def=?eL{U(PJUgF>iIQrX~iR0WNZ@01p9EY=Wy2{&(eHEAD9<*P5?%CR&wY17?Og-|bD{)vog_Tb
-n)kux)-pcq)D&4TM*+Uo2T?(7Rp+N-6)kAlCbeW@Tj$k{N!aK>oJrYk_H|h8z4XvKTqqS_S?LIk{${q
-o*zM<J|!fvrs5W7(=>P?vNtX0F{IB*2f&OF;W9|V^k+HZ6$N{_!{{dIY;I%9K-rLS$Y-Umk3yP1x4xu
-0>gX%q5fJ*UGzzjQr&IflZ_Vc4{2#%O{H0Qj8lUP!qXw`BRH+3+PpwFmX#Z&jccXc01qGJCKSY>T~r|
-DM&?7-X)s6mDXVVu?0++U_tKzD!{pLnT>XV#wqHAozUfsC>vyXjlnHO*^A?u!m^q;uRP7st`eYg$aZu
-!Tcqa$SA(V4(<sdX-r`<qAfav&(2*?;x;2vExfuK7%hRZ5)>vz&K23T#rRIXgj2=?Mi_L_CzN>WYww>
-+45^di{4`5aY#H)H!MSic3yzTWW44|1q{}@@9(Ff%k%%F7lgBRB@wrNMcl;2*^`6>R2Nji78u~AyXFJ
-)0fftl&=q$L9C_{2ifH6H2`HFGuSt7&mTnB4uPH|gDUaQwC)%by9f7Z|{%rda5+94X!Wbns1J+91^4h
-7eR7$JOfgnyW2>eYr7TdQ5S`CV1Q787t0XQ3WHsW&m!%JGw04Bo$4ko}tyU6|_V!K($?xF>8u-X*0f(
-9-fEz7#%tkj%9y5+l?}kb58qmbJKxSr!?r$F!{Yh@yC=DZHqg`<WHx2dqM6f-c$h{Q^$0(LDbMP^f8~
-kNKGC%oe+`mV1M+_i?TBOh)V_JCrQv+PblyPc#hV6SbH-7MVq=6odEH0@VqjHu2~xG~H`svVEN53tqd
-lRf?gjMWQP%I2k}*>zS$CqD$1Y+t_(b?U?#@+Z(HfgpS|$S}m*$1LMzYw=x+-?TRiwigq$lyL^Pz+CE
-0`%yR-@b&j_cK1gZinyGwa5|0jR|1l+(bnk9sOCdpb1In#sM;fkm-uk5i@W<f1>um%<F*m`<%OMHK_}
-EKy3e;2S@5ik|8i9%~p}uZvm!HxT>eEUa^HXZNM$(B<?P@Kd_VbQnC#zbUt?4DzwR*aT)Jpc;?bdESg
-GD76yx2kA&PgBZJkoplI@F>6X4M8~?lhOe@4i%Xum?GBS(_{N&raw5+3DCn3oBtuCvWv~zgyR;mv7z7
-vCrd*oqrfttS7vb?*|$i1t!fhm10R*C{mTNANkR<4_H4HY8A;lPt2duhR##a>Yg&nY@-ZuHEit>R;!q
-;qGQ3#y?{<=U)zVxG(nJ=ML##+;;bc?&)FCI4w+Ow{cDrrBA-wi4CRj_x#{}&DJYv2x*RNBlI}2Dxe0
-R3$PfOI*cc~(7zdQm!>tl7@{*W1EOdo>Pc(Cqa>SiU2cBp8_PqnV<+KsEp&f9<)wYH<SPd=#HeLj#se
-;D;_@rj^zyGH63bCmY(rl7stjd0hF~{T-US%dxODp^A_2l&6#lh(TrM4X%yv8)fXmO7x-xzDIMjPLKJ
-(;{pg6-6vkS*IKG`%b~`uEg!WH~u(@G7Uus&+YBFdk|umJt8X$(th~y>xe~EvZWrkSC0)(Z~lwSTA;0
-r3<uL+zdN{qnv&KC!b!!UN16CTS8j}mTDvnuU1{$v7QY5qUoZ{)z=57&%d4=x3WS1`a||b{KFXjJ9zq
-QRmK9z*wy}Qd-VH*(O=GE`Aae$oj+9%2Y>o?gyL>|C?WZS2MWky!;^QfUmqNQ-!ba=r=8*M_Ot)|q%d
-sHPSp?*Z@-!xO^y#v-yoPM6D3kv{G=Wrv)ToB1+0Uk7ufjw<eSO&C%R4p{;2v3v2|8i^%tDSreFe?AG
-D;=P`>{pGhUBgOx~+OgaxLrkEFrEBot;DCrp?=EDCHP$1GyXN@2<nv20Sy>Ig$}Yz;}~7n8RWK>FzU_
-XcfIDHyY8bu|IjU_zJv>tdPDGV^C>G&v-{HO-XfL40i<+qw8Xpk#Rq(8Y_}yebPiMAS4+zCSuWc%OWG
-@am9Oy0yrGf*f(z_8G#W+pDe^#NIMPn*%yH#|InkVsTY#i-fvJMoW@<Rst;&TCha5Vo{<h`3iqj<Q{D
-Q_UWNAQ8|>|nMk{N{k+dDSsi<kUHk$6LtY##tj%M`rMxmX(+gTQNRhJ;YgR}gDtB|pLXjWdWMpfnk<9
-N~RVA+rBTd3qUbte57J~b|c&h2eeSu`5g^{F1KJXD0S>YHruF_I2FsQ0#U3#h*K<4NM!Vn~*h20$3Qz
-o7U`s2;BycY}KtZuPG*mgM(qE>|kiW1Y<Yc@g`<ptJg%D5j)<1F+~!HI<g8+B_7x3F>+U2!ns(}wEtP
-(OXH`W-&C$QCktb-5^gr-{f}rR+Q0&vKHa&}AGG17a`oU;P9(lSeO93&(ia)r3MgD!O9}8bIB<P;Rns
-QBUjGPWZD0OwsVYm79@eB`4|80VOX$-2{!2;)u<lEY9)XJN3Uh&;dtioATaNT*CzcTfS@;0IJZ|_*mJ
-(if-0a2iB$=*tBax^>R9;+d7o(VDeHn6q8GVDiKHcLwt3Y7F|$8WLimil<5_$Vb3ym$u)KOsn0M7ep&
-C*r!`K$K-8#MLXjE)5$B++%DSBx$ZDMTmYd%4c-ziur9UVe7E5B#Z5OHr;zXyrFY^*FQOryHOLoN#0B
-V>-#L}N^Rgl!*cHN%V?ONn2h}0!qvbWvQRv4k1o{ZJRQAIo2I2vY08=>YBZeAInHd^Ad30;ur0*Xq&b
-Ph$Tt9pwhx8CCV!#3!AZQUjyvQC|*HllU8tfpMn$co$5s7d{5k*Td0hst?d{XQv$a%Roc;2lWBrbKD2
-c4BnAk(Gk=bycHrN2kczBG!>0_;qz}i?98%rPAlfGgpGoZcur>q0gR(_vBe=pZ&IM37&_un{L$re}F$
-lKpI`!k~Vo`B?I6&D;~uU35n8BZT#ped3Li-I-|OQegsl(HQ3m2_t5Nvq1jPGXZx%ayUuRt3~F#DPg=
-#5oBr_tQf`UDmFbLbf@P4|<Sl#lyWe++c+4+@?O~PbT7jkL5Y~+RX_&%vbw{=r>ZILw5^{mi|7;{rFW
-oh&nLt3?qK&PU?VzgqAthT6YRj|UaWiko4EA?E>zem^^Y55dA9t8}^j-FZQC2*^5@p;mYoHzCh=&gK%
-Tp)6R6X!BJd&fkN72v&L9dqd5MsX_ktMtK3w^3U?!fI9)!ovv1;sB<(kW@YfK1WWIv=&&VV8t4bk+uT
-tM<A%wrEh#^VP~g0m|^I7%HEMD8L@>89d-(=^X*7XGgWE6*6E0k$hO;M2tVCu(Y^?fh6<KJH)vYkLY|
-HYg5JRV+vv+!}WE{(&kDgZ~bhd4MQMRVHOH^63g)jgTVhm#%NcUa*EXiQxscvs^FK<j{MhFr;>lPDn*
-O}2Dkn!As2ko>*+e1-JE-Z2!Gnb=$BPxRw*(@qNtnd5QZJ4DArb3T89a6qjc*!TE>w5^r=(PTSJe?&O
-DVNJRyhd>*)&Oz_k%?sS07_1zMey?WS(;n1(4HIOaMBpWc-{GNb3LvZ!jRcZU}B!5InoqYMU_mLRfAy
-EKKKoWlSt3S)kBSpz?RWu>Tbq{9O@U)Q#!hJRMaiar2>m9hNW`0grN;_BVGTOU%?_MmG>bqm)X>fsvF
-Su3RNyodWjnv%1DOjOdDm35BF3LMD#YPW07Ziv6yMPkqpA}Y?g?p4$Ntgu2<8<~gi(XhK{UXYZ%6buN
-4HYF_%GgJ$w>~%ycHT6(@A-0w`e!RGCYngTg^OqO_ElNtDvlU&nZmBv^)Pg==f?*Z%OS7swez_-Y^7`
-_goV}o`i7!&X0cBm~iUPYI8{>H1TclMw7YOgM19EjC___pKayVy4=otou#X+V+8o(a7#$XK9w!yDD$%
-}5p%EH9MKs2*a&=bJ;1t1)jBfj7&>4w*hU5Y|MDQ*Eo$K<W=LvdV3`7!3uYOJ?UiE8WY$ChxEB-yt<8
-63-JfZ~~~);AW9{D8hpY&%@B(9t4%u94cGnfO4EMF{h%%NesQfKgN-?(hLqfJu^};CDWh)lG{Y1iKFx
-y4exr8X2Y<0b9-P?WHv@yB#w92=^oH0?4$72*1833^Zpmw&p8)uAU|}%dnPtia8Z}mk(vGl{Mo|Sdzg
-Fme#s=yDao~(fWNBh6eh>*s<tG@-3*o_Rd}&6r=`cF{rTmI^o>sdujQ^;^G4>fsEhcKX_RYQtuJbXzx
-kAho>3_3<l8SX8pn_ig)TeSsk94Ery@io-Qj4m;jStHXG76g7QY)0|L3`d4Yx3LGzn(iF5}rtTc4Nsg
-NO#nwiVL9!?{P5b#?)sm&#gpo4q-cdv&^jdG7T_i&RO`e?%)k40pil{$i}VBs|gN~h}nfhv}rw~M7HM
-JvDHu%Tin3f77EFeFx*(494U-EYpjm+1I=E7DBqr#7l>HOrgE168fZ%*J9-S@)}54lEonphKN>%z%TW
-d@0!8yLKC3hC(oKBQ&9v-@o+IoZWL?N8VdLLFG<#LnXr{m|Rm;&MbJ|t4|%Q_7z&lI^U4ANhn?ibDm|
-EvX!Qei2p(f&ko&Wi7K_8K>~&SbyQQvNeY(n;khm^w=QFcvezBowaD-nc3^8wth@=;+h2}WbrgLkyr)
-+INNa{CLa!9G9@c&CigjXhye#Whis_?7ucV*^<C3sPk6tDIOlWXdnF;rHz&-(5b4lwOq`e!~qVj#Mv%
-y2rjUjtv?ATf{V<uK?HqY9;X;YTkY*9jwVNAQKu&!ITDkR3rRn7W77S7x+yahxXjs|E41=>x^E7{?cE
-N)oKdHDb{ggW1Nuf#H*738f3{LXHSM8CNc&&2U!eGc7Lrl{~9;(r!Jt;!M9-}!O?jb$8#IOffr8BatA
-#er;0CsZhyEEf7s-Ovje8n|+|1o2tigg=c86D!rK(MCY(lsD%-c^w*_{bYZrPWJia6Txw^5GSiAW=D$
-neJ3f`<W0KI0~`L;<g0_{820`4t@y^5pPyiVACjJTej}3Jc7ENE-gbWZk>0NS`XjY+qmum3B!04FSyO
-gMGU-d3@*2bXn+o+j`LFjq31vaFeZj~b!cr0)1GW~5W)#tmaqKrMZmmYWwrM5f>$q(ddaV#Ms*XX;JA
-Do)wsCAF!U?~=t8<{lIL)%SdW=(C8{tuBss-7e{YbcwB!TzY=97986)t+v3%<BrVa~5-^}BeWmzc;XK
-X?YCsE@JtheWK7>u?4FxN9s=^arVQ#+AmRtH#uija5;`Ip4+i$DGq$>?QwvZw0oRp^CYC&*w<i0?WPL
-Xam5NMV$tKki|vln3Qs}Bq0keP}~}1F)g{h<!N9i-RKKbGFv~i?BLxlAg#nC3C0d8^@;(FLmn0-`&)s
-bbOO+~CgY$RRCQ~ozUp4pj^8*G7;AUgHC;q*?4B$bEDNL5ORStMzEB4mXl)G;R4wfy|D8!dg2zNvmR8
-YwQrvoye%xH2UpXIHC$z}iGC|~VH2Da4&+gTS{^(<C$ny55(>Tv~*3S0{q?cfvKtRP`dFdyfC!V_MGz
-`lLzpFX$Jo77@(V{`fZ<_@^yb%7V!5UaOUq?`RS!;j}ULp4r(NG}l!0N`fLqN$<JM(iW;UHVi7jb4Ko
-q@iytay^v(>y139fGhz7ySNipOK0ij-p!jeZx77HD&YI-?6a1VWAROdh(K7>>rJH2zR~PA62km_08qj
-gX=)-vzTo;-+3SGm=V5HIGx?4_uf|=@rTqwI1<PoZ$s(0kP6&AiSFWR%DE1r7vZJU2vM70lZ%R{H*L<
-A{W{~CG~Az@&uZJmZe?b*X*|vgR43x?p#-)LV^?^UE3|FV$+`YuKhvA=io2NG{j4($x;tTT;aUWCnb<
-;>kBs7?6g6~>{%SsxYsUmoYiO)2rS`dKN*qvlL4TctmC7OhXr0A&tLTFCDpKKp0Z>Z=1QY-O00;n48F
-5U=w?&w!3jhEPDgXc=0001RX>c!Jc4cm4Z*nhWX>)XJX<{#OWpi(Ja${w4E^v9RT6>S%xDo%~pMs5Xu
-zdBZn@f8rjBeXxn-l@k<d97Yw1%P37Hu;tOM)oxu5-BW-kIS;q#j=HU5y~C$INgz&mT#R*~Rx4Y+a->
--_F^g-dy|{pNz(%F}p6xV<oq{nnl-B_QU1#7Z>o~kL=$v=SOzKzsfQOvUhSVawSq$7p&e1_S3Q66*;>
-pHuXKP1bb5)@|4#Sp23Bv7>Dulx{|9yUBKP85@Ij%8fD!G!QQ>Se*OODbzDExjOQu4{_y_O$G5LOfBN
-w81|I_5Xj2t?mL!`)eW*l|Fu5;_ss{NIrXrF|)}rE>8jZ}0l~iI~+dEm<tE|{=VdnO>Q1+_4-5zS0*;
-};>?v9SGK9<7We3PZV8fgV%tJgoIsx!HI{je4#8p6CrnU-YD*E^9WWmS}-s*f|a6?H-nlNDED#!6oAl
-DaU@Qd!N|HC~QJI0-Q8m7PrttncVqlq5OdgMp@_(TEs<>V1(52EQ>|SAy5zxci;RSuR8>Ql!hcQtYEp
-#i3dY8Y80rr}Gi=rD6l7m$|HyBvK;V%ou8Tg>nrE{^W)pGpT6A=7k>nGrY<nD((bR5DWPh!-wA$G6fE
-G5Q;&({189PnG!Ch#t?shyo>`;G{_aWE=CK*UkjN>q3xpS49AEjm6_88y_-y@PLMi))uUj}zyoue#%`
-)83hZc2AXTDjo(W?DD_c9tv%|Az&)oG}MH!+!LELNuDS*$mV2RvG`P<0x%u8PJy?ZlfpMZK!PMUwQ8h
->Fcfi~1p6t|gCCC!Letk}?yRwR>oqn5{83COM-_^N|IcQ&enPf7c@ca~!vm>~9!XVRoTuyD5HRmvd5S
-DDze`9))YJrs@9SQxz6GVXv`|0$qS_|q|!h?Je3Fy+f0L&_YcmalsaVGM{lb*2%0HOoqD<bw_nh*--R
-ZzPt*xCvUBZ;Hsx+0Q5~qCcmA;gHoJ80EV+B2z<jLCT<^V_j+JQjdfM2TDz(@1`cW199-0?9s?GPa-`
-~NDXtyi`tP&h0+bfG}IG+K)2_&0tl3&Iwem$K&4f7<gPrOb5}ah{1;s_`Q&5~m+-ArZ|g%uU0GvxUqM
-@<AXy!2EO4y|@}m}N`I-`^Bj;XX2A3i?vz)QX{c190T(M1eRQzpX8rkU`)9{_-)8aY};1yQTV)YgJ=W
-qkiAv|L(H<I1-JFud@2w$4e!9SgmBVPq0)#lSnrfDkyp{W2pVD;lrX7Y=YuW$KQcokV4);qKhXHbkd=
-mC`rk{Pl{Dw2jFlo!>WXW7vdfLc;(Tpig#f%XV1pwAs@R)Npq0leVE+pZvQXqI1~sY)1i&vVd41&)q`
-nLt<}9O5!3BfSCGBAS?a1(N|3l`7C+58)<P62Q%|DUuwc68iX_JaM8x2BAjA(0p-IAB{=K9GqDwf^ms
-S$Ry<1>P{91oDQ$?UWX0}%f-DB*pwa!WLC@lKshvF=fwz>Kz}w`wZFHpk()a@GQk{d&wZN}E1v00^2?
-{|Uft?x(NTzdI!U6-yX{PmDM*RdR&HS49_=GimHZ~o6xxt>ft?MyzBFqEB_V(_0&-Ag8+hj$qeb6QUM
-E>tmTYWU8dGlwVPT{oY_CPr{#BEQBNHD$5tkXSfn^^<6{u>3<u;mp<#&AI7q(kjmM~HAP{Y~>%CrJ2M
-U%KZt|w5C;cr2IN$ZJ@qOirBBf&$Pt$MpJ(nHp%wE8K?(HG&%tl+u~gME1oa99(;SV^MaB?*j7C_dzD
-A#B^;d*o0;qLc}O>qdE=em$tVN!1QWHeq0gfC`Wiv2L)9Agn{a80*WV)p*7LwP6v##(%n;)5->m7<Gy
-Y796-}!|toWaBf!@u-fnhWD-iARVblk5~W{Eq_R*k3e=eCw4ctk9JMPBSqj5IYuRz|dCpp6X+xJ_;??
-92lM~2I6ZteHhNy=nNr70Ekdk1bavBoGpfIFmbUAAr>sPowT=+e4cIqJU2Y$6^uW=UU-&yW9sIBGf79
-Jj42^e7*xXpVK+{p4&844ML%JsyWI19;r|6`Zb)Fiz%#lWJd+X=s7<sm^(b|Jf<q!rb%PhcRlTgdw+c
-m~StNPJw7W{Hi>f(1tlP5R#STKg$aT5#Jq5(-MSnzUl0X_&pj0-W3t)dQE!=o_p)Y1A6bHPVxcn|KBW
-q7Mdc2@E@2uT+9}SytSOG}?4Ri$;t#>~~jKd7*7ksw5NIGlSS1SPF<d)jf?OuG@vCJ*i$ti;ZrhxXOi
-DW{|JAa0@4haop&;4EIXb15rAF1;SM5Gh{%4i3{CGuJ-~;c^U=lOJ5P(7X*e!YJtPaR}C^bQ3;wo0F9
-ly=&~--0)#Cr<uZ5+ONC4jO>c5qRgfSqi!!>LcF2xWK$Ee=o!6d{vG0uj1*2WiI~H1=^~Mtf1rf_;?<
-#ho-7nqfgNCAkhN<ue>x#r*Bo5K_m$m^(&_Z>0TU5GZ<NwR9RqbyL4oZVyu)>CUaJhkOXV}~R$iV~=(
-ujD6r9VDh9T6nP!RP<VvW1|-+cS`~b1u3({w7Pp)+$`no`qOx%eA9XXWP{<IzC>(obFs|YUmo9ry+1P
-dsrDjt}FJO{hq;9WGEYfW59nu9a&lkl}~EGXds+3!m_Zi1%!)u&28<YhFD>b#Q_$B$N=?``TZRnzvGI
-av8N&8V-h);wn3eS5I9;mC;jjw9`sqAig5y$O>NX5YGLNR3{8YKf535ZY8oOLiN6NFhoI{O0Q7*vqUE
-aj(zhfL%G{so0LBWo^m;KC$wJ@Juousl*gK(908s9xlBXdAj;0C)B3`FsrC9%o8iV%j4A#~01oUcn7j
-o$@J-dPgog%TfNc_60ik_n4#L{k38?@@TA(uWwic_&VY@-Qzj%_%YJDs!dD)=|ibD9MaYPN+>n7vQ#e
-No*$P3{RydCm&K?3$mh80}qo3KCm1j6z;)+KBh|^q&MzeXwIRLN45(Jc%36#L%*cU!ekTKj^S*G;%yo
-Lb$!w8P41Q%2C!XkYl-cv3xQNe&WziNpzjvSMBsJb;lsb2kGafYwhg~KBW|BtS8xDNPI&#?UXCGz8ow
-I-Nau(aNLGHqFr1TWoWNvUNKLhT$|kkZIT&#K3!ZcrwrR9ZDGj$UZl7;uAxOG!V?OK=6wEG;)dw{|Ii
-_RgR`IFyiN^&YW;qsb`R9;mK75X#~^pMunwce&(B1Q`&yAchHveZ&ggxE5Ii_D@1nxdFQbv0>KL@OJ7
-h27A7{|ktKyr;6D=T<D|YeM?n7Eq0=mvd9mAO~9)?+PaSoFl`4%IhmdS<$`TT8TE#N_XV<wx4cT{?p-
-sZ=f=9H?J7r8Xe09Pt98r^6fd8*IY%UXZ<BIw@4dkNSaFuL9-$Dv?MJ#=KjqtOKSr7TxRJ958fm@eIU
-o91bv#vXM1{EHdVjAV|@I!gcwJ@0hgTMKYzm^Au#9~;m!eO&Gzm50RkP`!HwZ%@$d_Nx0vA`sxt&o=f
-s;>2K<!Gc~VR`7md7<D}f!HXvr3o$~_qcS_}EeM*J$b-d-HKKd(w&XqTa9CHGdUxjOtDo+^yhFyl9|C
-ZwW1Vk~qRD^sk_D%;r7tD|SGqw@t}4xMLcJh}fk~s?uR3b*qt$bijcz(~^CLVkM!@_eqkPW!iZ);LiF
-**=fKJ(Wtm9J`O#Y~yb!va4X&{4TTuTa1-jnpO-yahfH1u^@{4cuwgmb6Qm=Z&l&>@SL!wD#zH0LHy%
-wz=N`q0`OS-7)x^Ti(RV3_0L-Vcj@OJ-Yct8RDid<?;xWw0dAk2?5wMRBX>LpjB4H`5>gGzY)tJ3hj{
-md5MJE>h{_4|B~DCCy21L+(ChI5Rq3WX`(<A@FtUb!?B)+NUvQ2Yb>kFmaPu^c^7gKeTAYYY?en1pW_
-DO9KQH0000808trnOuGN;+X@l@0C+n903HAU0B~t=FJE?LZe(wAFJx(RbZlv2FLPsZX>fFNE^v9R8~t
-<Jw)J=Y6^Jw+sYasnvGqD%mCQ};JMG-W7du_HB;!FOBqOFs4ghVdw?BUG0U!yGl<jn7a*0R+5AXX6;D
-pS-o0FtSdA>O!m0Hh#z$c^0XhPl;<xcR;l_KGrDS7ei`O7){^B3|f&*_d_(679VVAvT?ST0#gR6*1gB
-j-DHRpjKNSgTtq7&$GfJf(`mGx)&-p|D=A1YcFEfV+)gY|C<mur3%QXUjJyZ!b<Fb*Bi;Q}X8B+spUM
-pFUi^dw+osVccjfiY?&<;oGthiu|-wOfKJz>}^(THb75(TgdvCVD&GlM3t!KZYM_uW|S1$k}A@^09@C
-6Gb1TeEKxDb4YOwCU%Wi!8ME^QlSL&GChMtdj>OuxmEu|bBE(tmN+u|fKO-9kK=1Gkz*b^6L+;!#xCK
-0}W+T$S%oLVXimoy?BRr39Sbj4djgWHS@S<ix1VhjCvoMZxx@B<;qvD@WPLDsFUB<s0zg?c5TwKD0AP
-7c3zP{UL1lE=yti||w^lVIOdKcplm#6a|#=toc3eAd~Eyg=0$FE<Fexy>e?JC<5n4inVxDxr1Os?3L%
-K4TjqL82rb71WemD}j%`Iu~J&eu$;U){xCjYtD(nF2Ss+Ii^UpYe#4q5wwALL7_ailbO60oZ)};d^+A
-R4&E`5`L;(2|sUn{_@56@YM*QKbg;ofxO;nWu;}A@x*AS1da+^Qn3G2Txg|~5t+{sFVGjMmifAPB#kd
-MH8n{5jZlGNmYxfK11hj#(tCWOB?^d~u^X0=4F6q>sa)na#WfRSQt{&i>0XT2G?NTTB0nDP0ek2!eb`
-_R!aA&3{0d|qfg$iR1f`e|ASSscd|g{Gmn5NC29^ys$gDLN60D2ojNEc{1<zmz=q~6!ifDAYe1CBnpD
-o{>#P3f)rv%gH1W1Le;NO!c(RZbWeEa&-v-w}6FW-fq$Y=E>`fmFAPr-C_@#g*V{4%~g`Q`lV`0~Uk<
-z$b80yJxlCJPuD$6E?^5C=!vVp{v1q1EeWDT6s^r`Zh)w?$f^?X0UjnI1J(7RP309NQ7o<`vunN&qo3
-Z{#QQ|CeS&NrjRy24O}L6ibCc6toav?J83+0IZTKC2)zEnH7~q89tk~W7pssOR#M7`p9zwJvin8fO6L
-YqsZ-0Lq9l|77o%u#pdSIvoA(cvRZ{A2<I{Zg;1ZPa(Daszn>%UGbo)I$YSPBnvPmjfn0#mur@fTc_(
-q+L8y5wT}C99OW~AE$XoCwK&fH^Gzk=$P)VNYvFt8kr6MQ#KQvKz!;T2dDRS^OvMNzlpc%EwzFLqM(f
-1yaQh^&5(Jj~lqIMuZf6fDPa6niGpXZ}`3cCZziDWuLr#KpEy<z!(szNcx?}qJ9t3aTW0sH}>wXa%^P
-r&J2Ge8<*;w>W@oS_44tDS-K6Dr}|8ocj~Gaq$=-O+6cgAOYx4p%%sgdt>nm~vrkQkE2agnsi?^JMG*
-;5j%7nj++}2jG$O3&2#|a=`8Os({c}zX8Hq{DI@BvIs2<yj6m!ugCCgMjVcU5L__EfC%W&^Qkwl<+D2
-(bA`N6?lTXSad&y6Vb0>gfg~6?Ks`v<MXp7Gf%84;B7`gd{)OvR+oyVhHDc%KXq05&zsZHR(qBNKL|C
-l8LI|{LjK@Y`$HWYTq%46vj)3YUf>BU8W8jkL%)}%u%`+SYF26xQmMr0G8z5!mtzhQFih({N+y&`4@X
-@G8s5W)0$?}S=Xugq-bB=k=(e+A}t!Eau7*umcfSs82=-)I=<BWp$0A-YmOHr|bEGZScSXBAq6hkGrc
-?d#9xxn=uVc<GZy9~Pb=Efh?t`CFS8-I|87>x7o{h`2s1R0{y^Is)dv0CXQ&VM-}OJ)28`Vk3(A?rr@
-N~SP4F|y()!knDHyI6jVI#dF}deDM|g^VzA>bO}JlHUbWl)U%+E4`rs+SE`2djADr;x2q2nHwrN&2_8
-<yuuJ;OYkxJXE5yyjE&qdT9_Yzrkg&8R?JQ`GV{2MbBvHKNx2F%nWGM}eVTm|VBXYGQWQPSAX??rj|W
-C;-Nd}mQA;`+2cE({#MC?tHWdfjwV<bZWe0s7=t@C1TY3ck1?(7dVGsE<2hGk6nOH4YpE=~T@X|xqIn
-*j(u?a*&la3+tZDJPq6Fl3k*Z5lSJTxo!(hb*BS#mL;qJsd9-+FFQb9;I}k(%Ma4Dc0M)?;wTt=5jIz
-J7*eLToWx1vD_mT5kp!h8t}q6r{$Nd9y<-QX!?p*OMnY>z&@aoR?nJmyW4L$#PdHn8vKj{$PiZ>k_0y
-)9}SqtKj5G&=HJIjKX&pCqiHqxqPR83<Mfe5=Kyp=a49c!71gLDb^7!a)3G7K80}*GQP+c%$ncDCP}!
-@45qzU+32_t>)xSwO~^kAaZLp_5p>x2dsCcX$juo`O@VU8^Xd+@4FZykdT?w(fJ!&&zg+7VQ3mlSy3i
-odJkJHNNT^*HST7M6Y3QYbd*#;&<c-`iKUK<#TL|FOh~;T*6`DLuyN9xd3HgA@mw>XBVJ^sAmcZYC@H
-{PU<vt<q!OFh%lQmEbKOylwppD+Ow41I7_<I$bWPY(izi!=KH}u+k8vF_daMwR-?HEd+^)%Nbbw+k_%
-NoAcT+2Pkh$`^vx^TVaSw>cH1JM*SZh;xMljPZ?u4w^9ps>bG#;b~FY1qwXUDW&*O*r-8+J;T|fcNV`
-^;~d^7%qm-!@%Zo!E~^1)Lhox8xi|(%+DAibQqj`JaHqk&U^n4gnKCMU-_ry+n<;32gqnJH@JuULHv6
-1{$ly=?L(}%7Y)OJsjHn<ogdQ5{aM0LelYU%|NjY?d$1Yy)I)9`%W<)#85ViE3PlIgbt{81&S4(T*aL
-QHVsItFaiu)X17+j!4)Pu^YvPd3(jA&+&amG_1(e8z0}9F!0Ai})1`)(Tx-~2b(R?BMF1B0GJ9_f8e&
-QZ^K2Z9*B!YKgWb&8iM<gwfzzX>%wQ~fzB+nCF`ezz{)gw#y-_#XVCR;Hc79(BC0D?xRlGyFgZLnxq9
-8PpG3x|Oo9=Mn~Erz8ia??El=bZuHC0(0hn&legT0rEJb+g6gUFfQ+j*LmhO#&UvKOUXxiGlW_*vM)l
-gU9S<c$H=Qr#wRMozdj!f~*44BGHxymaF(4vMTb_<=#^t1`PR}2M*h8m#L%zwb<AuW>T1{HCd#Uk#3i
-R`YE2dj8_;MbWUk|ns;}1KudAWSwt=!v0qUQ8UxgoTLd~ySdbpoh0#naOdlc$IY(BmTmaY!QxNf148#
-VDUKF0Xwd=N8hphq!f+nq1zh2^NK}8zCfd1L+^+V3_{m*)oPG29Ev7qRfex+GuX7qzf;4(2h5YswU^v
-N+cq~o6%JK(FVJh92GElFq1lq8i@0HDr!NQh=mo#}l+OlRN9V`u$lAypKS@4M`aCt!Mp9$yfHB}qp*H
-IQ!Q_q#>(I59m^RKf5>Ex{ocArzAs7_e<>I_(v!c1Sm|t=n36s!48vk4~~zPuFdgP7~|^Vq2nY|9hcl
-Mx|g7e;-Uk+zWf-cDAh6Fx#dG^|l#?rS2wPO9zrsk8H~^EMOceR_OoR=#95HBCJOalH06*pyxZR)BSb
-JJi8`>ku%ar!t!c`o3*ARXGZ|59mK$znyy)$!1$fDPM@TiiB3_n(okh@_69+l-n*-HyqJS7;$ijlX|v
-2zZ^$>M$+`|yrbV_Js3p4`(7IVa3<K5e)bx7Nj{wqb_eceS3<7z*pC0<Jb#7&My+bp0Mi2=0Gk#n5m;
-Y^Twq0Os*lf^6K(4O~{wlxmGES+Yh_hY;v+^7CBpq}*@@Z&&Iw-0dYy$$*N8RFsJVWcDkAG1q(*W!gU
-4ApzD0y#p!c(e8IZQ~tShtUd9>}86Z_A+mc+~;&b)aM5(~|ezx9@@jsoM@<+xB5^@L)XAvT&NUM&|K~
-=a9JTXEhb~i5;)*cHi(?6JlFfxDNV!uY4eLT|ek!D=RHr5JtZpgxCJgn5Mu73Z$D5yeA}et^jia2(cN
-1(7<pho&<f0@k-Z@0O}d{NdYgcM6Ir{J1&(B4VXO|fESDxYzx{~4{iAQ7W^R1uotDNUjrWqXzuXJ8jO
-w<jZ_<W6Hsumf9fBjC3soUrEFD!;Eqv5It|x-ZC7w67k`Avg2xGKuLU%$aXCCV@^M;@SBV>V1lcMTHm
-i&>qlRyQ&p;=pR*wh+Zp$@S%|@x^x6^!#Og*F?QEW9dd;Y_AWg1B$tRZwdx?6j>1~qphY?wb?<Gr}%W
-r?!ZAn^z4lxc78b)tA-o1f=ZUt|9mZLN7<@4r35e@d@+sAq+r>~dc^J34g|6=6p>PuqCWW@fls=qG0O
-oSBn>?P=1w)i4&!tsU*_gh6D)VC?O2wMRQdjPF4rpT6{BCcf!2$HEJ2J30V6)o~b~_nGbEi(~ete{CP
-2&5Y`vwjJy>vs)fDO}hq^sX;tQP7z_shrNhc>oLi`=kE;=Eg`#6>SeEiJ^|tFrw%2sRz1=*^lbnkeEe
-1rLDP7(y1$c=J)nnYf;!NnfBp{m^Suikz5FuRi#0p8`*u~kojnv3q};cyF87^gGs@{3Y1#T!PK$i6%I
-VcNjzQvi4BsGoa~!N``nA#pU+1Vmt#tkL)IB%ho+Y&iJ3M@BlG`g1dywkQlJ;za=gMo>mNVS%s>!XLm
-Ct-Xwj&5+7<%*rNy4g}t6~nBJexLUgzpGUz1p_aC*(N0r8{Z%JIy&pY?-YpRR>bccq)NscXK>AG8a{D
-PE^e2UQ3250+43pmIV-wfjxvKNhPrGUo)1js5w7*s~c~oE9f`x48HfY&eqy_vb^C@AXfd(nceMuRF&D
-tz#f(8`&iwq>0yDP;2smvZOB-+As1w=H>>d`?D=(Eza9Lz#G)JA59ARFAGhiu*WZ?EXQF#3ZPW){cqq
-lwJTMzP+bt-kKHm{eXJk-`G+#Q3gx8j;<O+?^J?a|ir(sKFbHZX3d={VafQ9ZPPkYSK69=MRZS&sVXn
-pxnPJ@UxqNvL7xjx5(ak^`m24Zg~exPXAd6(=J+pZOB2d0ytt|fQjKal$T@o7&zqOY)4r+B_D!l3pj=
-%fs5tbdumGAW}aY_C#vT;!nEd(`c<zIN+eH!DD*oi7c-*1GySiri(_;j{jm`x2bN?fSvob=8~<Lf`nU
-cC6_eh`7zW!E(i$)t}^^cWMIC-V}czZhy+ZIPuzW7ac)2Vs}_^udV1;e=F^QktWt#sq2Wkr-R&45DUr
-Pp;0Ky*e<*o(Ot3bamEfjV3r=%oW~kE5%<VLaQ6#+LQdMcyXnT+ZNtbJcGfm>h24y~QmT|khleY!R#k
-G%R8)w~;SGLh6iNKh=umPz_S|&U4m(GYyvC;C&Na`|fwM>Y!=EUjSt9vwkdL36Lp?tnY23d5^Bi#K30
-j}51TK94=gv8-K?SZyzkK13ZVTnM)fOU}Gd;!ExOzMJWwV=nMMa7=1O`F6l0{Z2-1bhc>4p)LE<;Y!0
-g|?d;PCsWj4FP^>QA*GcM(u{)IhwcDU{I}U&ZwTi{^WaNHpIz;L&VI{5$!V{W`&X0Tp%tO(T46ijm0g
-oSWIb?-nNHyjo>EA;;%SvM#Vu<s2Hu^0rQ+-P6i@i(2>G9v+}>Hg2O<r;bW0=+*~#WVUDhHEyps<O8@
-v$nk7EzyfRIc)-xxEFZpf&F4cTA&6${Vr2}3J^-pdwXG8X+PJa-aI4)zplob3>((d4v%(-ajk-*#`vB
-xv?|s2<Jg`x;<(dB455$H*EfO1+;{jfH?SM0)M>rX%jNaXbEZfm^b!Cd-dIwuM+o7&h8%GXG_^DM+!|
-p}zi@VU1K<9J_P66?v4s}Xb?QFeT&R31Ln7bz{F;LtV&Hm<0uklcy6|IN*MiFnpf_Rw?TF3sLkITqQq
-dB!Wd<Z&5m`_^VFABg6wzGQ;NxC8)`oiG%YQyYXv_XG@;F%t_DttWmB%P2QVA5%KMA7{WI-dTHb1SL;
-0Z>Z=1QY-O00;n48F5VYn2-#-ssI20Tmb+Z0001RX>c!Jc4cm4Z*nhWX>)XJX<{#QGcqn^cxCLpdtek
-rwm97LNYY6r=>ZZ9?}$N>prQjv90C)_gdhY5VrIx<0<IXxkyQ-cfV%_|dq&e~X4SoVcfD74Wzk)H>@K
-S!_yA`ZOu#1(7o)Hm-KaHm)F3e#Af&%@s(U60itD}K@Av)nq3N!!I`ukr>eM+^=hT$_>_NuFFpL@gRF
-z?NG1@-|^Y8x=_{$vkN+$DS>N^+jGAw-O;v2oUugP6qd)IBXH~%8{mYeUq^DaL3=eOq83U}t-erIm+4
-duDNxNGIDS7v0S<>_Tu<WF--Pdu<7{&(!jix$j>clo-!1#bEtvS1#4PgpPm-bKF|y`YT3{(6Cx#$T+%
-XY22w^u6TvTfA6aysa)L!z?r;G2Snic;azwjM0#8NMo2+;N$mNT;~LMSmE!Wjs*-G877G_(DeA5dBQ-
-E_RKv7z@MXm0wQeUop{lI+rMR)nHZR2V4igS05TsmFz>SrQ-6qIM*kSnzdmnlpq&oGg~6}nZ(YyByJ?
-r+AndDoFibAPthlmv<<0!fkTgl}`(*grGZ+r)bzG@|G5fB>7=u>kiSNOMuB=^CdkchVU!l*;5_q5af%
-0l^U3C`#j?dI^K+9WbI3I4#g?sq_|NDRQuR`u<=r998Z1Ee57~30?vsbKR8NnHJT3xDO2?l!4s;XB79
-^pm0agpa?<i&kiT7t`)d&0qxFH<2d<ZzM0nV4wt8Psg%po5XidTsBJ`V@va5P_QHGS*{LgC)H#ZckDu
-vxspmCU>OM9Dxu&>Sc_QQ|+u^lw-kCgY0DU!@=Syy~=xX%knBLLF}09@j9T&ptIMedRL5sGNig*sjic
-J3ANY`*ju=V!!Yw5%wm$Os;bZEQH5SIb||nncwaVzVIGy7B&oMgRmFXIQbmX4jM-c2Oj2E}+zqfX1p8
-(P1%K5Hgjf!p5m<681EW~Elh{<unrm<2$H<+&q{?93`=_3g>)8AjlQZ_H+zDkyfgj-Pv6|iFTA0<6vr
-C3bfxVoq?5{6gTZ2}c8!PG}wX~uxsOU{-qugl=*?YK0Lf)0oCrRjVk@*<y?8tX^`I4Z<N&tRTYXeqI$
-^Z}08gbv`e4#yGXv;r!kI~lcW87HPaIGrnlZT{2MYQ<lQK6nzZzGiNA|2-_UV_E5)aqqQW{qrp`AJBq
-u@B)>O6@IczE(_<vlEMY5sH$Xot4Y!(7NSLHQNe9E?&y`j6MU@2js)L)NBXRL1&;_u&CKH5FnN;7)s>
-kYHdJ~*oJQLjwxb*1X6tr<j4UiTgaiMx5pYfjx%xk+$Z_-S{baEh0(I99*<O<H(Je}f|axei}S25-)e
-ZRcllDw)$EB74aHi-4SCkpLJ}0J7;Pc%bF`}l=xW2}yhfY`Qy8YQlIG;KoGj$@zD?mi>;*C^u69G>RF
-8{{oI&Yd;`1iT)20HLuUkFpg2a`i3r42JoYz6K{SmT3ncr!NUh;vK$SRl^&=R|}#8u=KEisQKdbLD@w
-{EC|X(`UT3Hhv=Jrn8z;2g{`+2!$gU=Tej4~<f@EszGmEU$x>a4D1^0~Aawh|SrG=!H&=)}R1i#n^6D
-3ukHN!gQyfx!CiSw3tuMVnZO>s!iv&VL%oG-sQp>haAkSjQ~^*gRD#lmaxD$xSdQ5V0)Yx8_$pQu`Y5
-j9nl&H2^IkBRX?C)aKsi0bR$7OOzZd+)B)sLSt&NNHR9~?KI1ZBoGnx%&KmD+1qklpkc+qh$QG)sk&;
-cPDotng<lGKOegu-Qg=B7La%Ck}KLKlY>oxNi0j!j)WMX7dJTlF63cvwaAhOdUO#$vwy^NA^Lr0!zAT
-LCgkZp#p*N8L5^JZVJlH?mNhRl_VU1YZ@-n*7S8z6ie47-vSTy0c_U~Naz^xD$JW}{x+m(mV|)cDFC<
-X&zcjBFmQpb)>u^Q^Rk0F08+62SM*AyOnp`4RlE9jK8kbAo|R2)mj!7D_%p0~m|}R#iX-5Yeg*#Ooyx
-TN%6`YqE7$%J11@YqFb$)St=VE%j&8_>?01{@QO8qkJ+x9DbUu<1`L=c`(p*4y#CJ@_XDKAM1^tLlT@
-!=dvwiJ7zzHdA8F$yH4Zi)JT2-GgVdwci_9G;BkEMBcShyk4UPH4;JuIQ!rNek`Ch~-s2tmD6gh<`;5
-!A;rdN#Vz_z`fA)w#XqJn;map_Ig*1x>|MMS!4+c6ARc`5Ve3O~bASuv}m<$y>j&HByE1ihGjcKt6=v
-@_$Jr1!l%^~i~36>gxA(~oh>_>#|{P3Ze+$qxvzLy{cj^h-hBl!JX`(;WnK^G+CKtkXcB<wvDGwnA8F
-`p;MU(LG7ZWz17z<RfRg}7b_?NKQasgz9A9Ub&Z`*IvW+-?uqXGRt^#Y0{NB6vHR2femuAWaL#Q<10%
-)@Yx_d+=*mxW{Azd8krdyDcPFvGz}(B72LFMgEe-FfGh*;EcotL0d@q6+j3Ux)j06_c07a!7MF&n5-U
-xOB@S1Gsqg6GY4`i2ViBcDX<H<q&iWYuP^BAba}Bc<iX)|=~uSEN?~=Elhsssuu9JM7ALOHDoLfRzMZ
-@Z`6IXr?*~!5G9s&V#SvIwC&P#V5`Dv~r77g8VF2E&<az5ET;{AGzmTDHwYEsfKp1A|M+!NFPz)?Tv=
-~@PYUB!w!q(W|<cEqOn5t||;DFFsQ()y`vCzSAo#L;6Ccu21mNT>nCPOJ*T!b7q*@Pu_YRj98Tm@g1Q
-gXb4#p12Kj2q+?6sNEcsTUzM$~@gdPJy$RA4X<D79?CU4NEHPl~`CG4`}(zVPM3wZR_rGd&EMlnGteG
-3g`&Fv1IW`5X)2?rJFCJ#D9!8%Mrx{3!SUKp$l==#saEvsn1efkhCGEh~YEJNjj8)?CWX3$!?I30D&*
-j7qUYotDKw|1pwraLvidZ3{t_estD*2MNDK%=t|^WS=Ep~Wfv+)O0vDVE=6wMiYY#`i&T%r7HxfUEUx
-UrSfAM~O~W+e9F&mc8@aSPVmtgYma8Of!Dz{16vMgVUUS3gdLWbyCwzU?0AU3PkGwY=OOnljdRWrrGv
-b%y!e1uK<`gle@~pj?H$#y|>1xP6r{VN!$gttv<+f0DgglT7%2i=8;*U=v%b*SFG^~q^0ZJP{QnY{e&
-f4(}eJh~ubtC0>^Y@2OCy8O}V)D+#4AZd4!T^0$DrsVKu3OD^0d@xvlNigY8!m>dF7m|1NW7MYQVkwJ
-oE9;Z>(a9H=b$~ehik_b(h74LR#?<cs+u2$j?#iQ=F;q1-WvzxEn~6B(^+-H^gOhYH+&!b?ZiKj3M}P
-7YD?rB^H|%lrknCCJ$rEjfFItJChj#{^A=w#5(9sY7Au?(iMe*DM?M?=7i;<iUsls6%BbbA2J)Hl91h
-4Ke7h`yu%F9mwzpna`}#JTPKzg1+j}^SpE3qR1K%cJ-wV)}T%+(K!ci*(Ef6#+`<DmjsLLY3Iep9Vd5
-%7N;YoWLbmkx}3t8HP#u+qa0y2u6_|)vM0w!RZSU@tVvr1(#sj4@i@*~B%EQZg5xqK1%Czs%7^&C<%U
-GQZgC(sSj;eOS2xTmMUnYH#}@vO>Q%6*_cTyv$Sm~`{uet>m5xWCn9^^{mFz?(tqkU!yBxg-bVdnKjC
-*@fCGaBKfZP>~MA7t19;lzbuA_$_j?v-Z|nP;cyYz1;n;LWD=1j<S&uBeSnyn9Dbs4YLe&vHVYf5nf)
-`E7x^K0{~^O>Z-j-tm|U<aW4Zy+hjXz|8Q-p9PR-{A*`gx5e!7~_bTbTFxlR^&L~Ih&fay)fa}CyDFJ
-o9(nUh~ab@dQIAK;AoU#1Y%bmSSo}0Xt2Ot=`M6By&`0;XCOm)T@4bZ&>DzGGHSKt^IxKu^uBP;qE>Q
-8kbUE-MF@UX;i1udN1or$;}53P<qfKZDpxpGTBOz|GU8ue>2R;2@$piW$Z{wotD6iH|=5Ul)F1ws}-s
-X)jPuArrJP`Vone{!-`cvfa&Aa`cqK$1UX(zPLn6rk8FAue+UQOgHZrO6twtR!j6ibAsqy@~ms$OfV@
-Wc(RjI<l%F&{XR;(A00R#$!?yu9kJI{VcA35h!9)Mxs&UAqeCWeS`ALf+`Dz;g3sotcUy-<!K<!?s*o
-6aF>T%man6Hlo;#dhsy`UXOiUo;-}-npC+3uk06Uvl3r%aMND^5-X`I41Ra5(Su$lwZR5gi$tH791Kd
-Rc9eMS97WvAOXwicZ6wBJxf~t1m5)b)DKCV8f-GfYS@sRzKaqVvRxQU0Nc=Y*e@9YeH?Ok{_fvCm1aI
-dhYz{v`*rXGMr!JvJvv2r_|temkbxrpI*nv0Y%xbXQ5K_~0NO@XD_nrXTiwFUeuvs@BB5TD1Ea+tutm
-F#B$sgwG<@J_mh)LWqz5N|p!$1cE7#|oC4L6cr?_8H3E<X2QNvw+lYk8qpMV)H$~+*rsYu=(@M(FrI|
-rN}q1a%=vFQdL*?UK2l4K8i@sqR1A%7#IE`xx4rpb3Kg4A^X8KR=KnOx-`KscaHsN?RSs|=Y}v!jzm!
-l^&ejU4Y@Zx-p=U#@PM&3aQ+u*?dHH?fxWn*EBX|ER>fo?mLE3l4WCVdnu4Pr$2vi7l1;SMDNyS@pgS
-|j4E}m8?F>v|Ay=Nq0)sQ{S5oU|qzNX~$vR-UIMp-Hf?Icr19MOga?iE;^u8wv(51|v3p0$$I;(txr8
-~^>Y)=?Bad?wFFNao)wVHV>5*8w01hTWs<m|0p4$KjVehL!(nKVktP8KK`hAx{tl$IEnscCdzl!-_mF
-N0`WiNX$kOu|+52PC<ZX*xCa#Re_Aa*1V|C|GHUTH#pkZDQLuVx83>l~{yKH~9z5WCN^tw_2G>H?g4{
-Rbr|1hwfp;wqAfyhHo?QL$|Sf=F`|sA*H1x2T`C+YB$+=8RddYrsGZ#APVLa_eeNcq*l{8?!xY-pWod
--rY5@UOx2n-TNbRaE~JTl20lsbGYTKk{`ctpck7I2oGyBP9}7yVj)hpyAS`&q_f(Jyv&a?wl^$dnCcQ
--|?k=&2{0ujl39)WDMnW*yZqj}!?#Xpdr;;-r`1e$0s9Z7{6;Bs&d<RXa84X;f#=@XnM?1P2J32m9;|
-nO)vs4A7-F<;g)a+)p?q)#M4nBhx0gb;B8}BA>cE`I*W~ze+8~Lm9J{0RF7xi~gEbIV%)d<qpe7Xz8l
-HYJ~@%4`ulnJ46S>6Y+aRC+=g@S2MfP^NbyWKtmNLnj^dF(3t8FHE=+!f}NVAW8jZ<z_<hFutgyZpk5
-m(wXXYRrKc;kdYqhj-@MBenwt+X;huU05n>Co9uY<_3X&G^xV&lX<iC2rF4gBTm|ZH442XZ3rgZ!}>;
-%$6&FkRI_h_mTY|trN`+2v$Y-iMee>%hhoWEgd!)d)gw~Ltr+1mkeS#`kWy2C2r+8QWROR<PJxF@otB
-5f`m|hllKJ22l+#uqv<t~D@)0m$Vt_2lm9n!#X600=?6_+&nK>Qt7Ljiyvhz5Ai*@Y`!iNyP4VNWtNM
-vUlS(^gmMvg--qmSSgqDuEWCW4r^HO2uW%ILypb|*f^bl`Iu!DnGRJZm;*TdnxYFw@tVHX509oW3Ts(
-$^L5!|SmJl2`zdoy^u=4&Uaj41B{1u+@U`RP}91Dupxy{I>-YxAp=CTar5AnQCT2ElFLOMf9MB?!-ue
-R>-oYkp@veR<l>*063rsK<ZPo5xJn}tiqkE#|}9l=*5l3LIeQb4=@b~<HfSIT}qIQSHdf?@>sXTMiw!
-)!{smwaRreox}=JjRMDxJaJNF7mCNIvf*8A*pCZO;`AfvuI{qSZUs7VST%Lq{BYHEin^z5hQzgT8Of2
-g)D5<Ze8gQod8nt~O+kqlajeRfYKMK*odp5m-=No|ooPRWYb2~#~tekt`KTsmyB$8at-;KPGr1MKk`M
-Dy=;ja)$8h<f}+FW3Z0oi+u3%t$XNXHOk;#<~e1m5YNL|?<@DB|D(f1&Y?=(7~86Tza7(nKQ{c#!g>U
-h!Xjz(mEjjOi`V|0rtEVqJ_8_(Zw6%AF#)k^h-UGI?hy-~k$yEs|s|FaiL2B1{O7?M(kjnTLX^U~jm!
-SA89Z+S!Hqm8)s&gw%@Oc+5CG&ya?<P(xC<T~vN<1wH+MVoYyM?3;0c<5b-2WH|p5xQURvTpO2yS$xc
-Aa(kbIK_^A?^wp0G;GVA7oZJrtBUmU1i7ZLp=OBlhtS-^B2<c*T8Z-lz4W-D(dUw&}#RHSAm~3Q}@xB
-!A+cf!_MDi%HITMo&%m8|^saV-ia<eHxBxWRx(cXFkU6X=N+!tkCq`jDKDeF5FxgcMwNo{x*0%CWmMJ
-}^Q>&?;(X+0~gA1#$ysqW&ldbcB|TxLR<l<wgGolmBF4^_P=P`BBszRd;S#EFEuZqU5FActQjGqM9$+
-tQ~I?Ltwo<eV6@t{WOG0cCUIP`WF?`5%twQm1ZrlQAc8qm6#c=Iz}MSc@z!H{oe?iSm#fg9a$K_-2rc
-k+I1cRF60R9c14{-X}P{D9Ea*r971bX`C<&Dj>i88Vb^s|Iyo(Q3*g)m9?xhw?hrma*O>eKfK{Ks#Am
-HCoN~Cankb9;tf_czWk&kMYoXqU@Asrik6u}65B=~=WNXa9;+*l8Uq}#;VW0cDhx_sN;z3*NAdhA<X4
-PuVUX?u`e3!q0jVoU*_g(ef`KXLG=5FFlN4yfZN}hnd_K~O&&S`#=Z=H;-2FCgj&6P=Mqj}W`g(jneF
-gT>*Ha<-`pawZdhCHf=Q(8H=3tpw3gVV(3#|{CrxYNVHosR2wqpP&C5Y{k%d8MX+tQKXmp(?0X-qOmo
-9)urB#^H)01}JdY0q^yd}Y1MZSO22&5EibkA(Gi&qcsI-996EgPxp$RyL54R_hAXv@E*gv_U&}F;%H;
-=WAnsgXX+#3%T$gY0)&S#K_nV*v;=e2xGwyD-us%QF}62`jvQk$hu5l#!?tC^E(e4apaPU@nkQv(!PI
-G=#sD)VyhygWg1<*lXt~TMN9<ZBILz*RIe6g(FHB?8Lo(B>|%)}_u@(~caqoOElsH&xK%>`dF!umFe}
-w*ct|7{=UJsydDbBO<+qi)J(O&&cJ|uda7nikkidbD>O?3xV?k%<%B`3$BA0cplrk__xf~|1{CU;lcs
-=_1lS8*J<Tb2q8kXsilbf9?qch6judJx_Wyp)nruS@?8RV)H(EddhxrEie$Kkh=?RJ=JG-eFrAFLo!d
-9S<-Rx=`%b%<yC_~pU*zyg-Z3-8Mc7T;%;oSibLAF;pz&?i42SQS)i2!z%<HqDcrF}W3L72d6{QyD%_
-P9EHZ=b~B@+_VYTk;m}c*`@U^f?FYU2N<y2P;kqdU$lYpTKK!MxcQdr#W%TS4)Q$Q8R6s#SfZDx*%&Y
-G16{`gG2~$b-99T=YT<`^HKZJo_mltBqUEv}vc~gTHT=9*CDT@Q%B3uHa1!Lib2hc0+`{>9fPh}?Tci
-k*q9c$p@pS9PJSz-!mb@@8r(%g~@nY{2S0!j5ehgWh$F7tn=u|O9UdjUWWZMXNwMFdf<Lyw!RPjt7Z?
-=EC_R8SYwZWTSu*&JsV)0jIMtIw6z+TK{$u)Bs=4BjX{3wPGW&6qpP<+PyEkI@jiZ%BXnUf)A7sBy2s
-E>sX+4hr(L<Q>c=BTSJ>T0XHI*ZKGG>$3?1Kp5}yKomTQUS%V^5yE?qt&}})Vn8=Y#nf~nW=Dl%H<Py
-reiy7>$a)tp=GEh$S35Jau|5$19MQYfz$(#uBu<)mbBaBW0rVJrr;_2tlu#Vv=mQkSLLxw7UMA_+0mz
-$&jQ==;<Ancnja5#55VH`NO&u5P0QiLMkWy9C|{fH@Y0@>cBf?xNAgih)VH0hBHZ7~V0xSc-N;a43yF
-Pg>xQ{~?7$6fnCRDtg}ArP@T1-2$|P-b`>^Z;wTMrS7o}vt+<?lGTMQTx-?;U5P_c2d#<#M)#}84~)~
-J0a0pn5+R>e1oSh63v21aVfq9F3WfM<&l2pme&mKrzdy9&1{+~i?1Dr%cfs}Q$$E{6X?pMNaEr(8tGy
-1HKpghq16l;uolr%^p5Hk<8&rM4s9R<ZCwI*~?r@l8g~rak4;XnQcKk~|3lg?9z?!CQ)w(H3kjV&g`)
-$9wI~5VHyZb~zwzPcb|y<(R#B4JW5SF-G;E*kZQ#)t(d!AI5r?SM#I17$VzeX*F4V4Be*4##kI3U#|B
-c$|CQb0k+JNKO+iIGqi;q1xX8Gh&VrPmuxMCV3X7ON8E)M>nscxKxs~$)`;u-G+Z>)qjIZMbue&@_o~
-zUD1016$>M#f>bO+bDt=>zu>EZ90<z^w5Pehlui#^rdM#!nzlJC&MLnXGhf(n&3aX9^Nd?YUJ`>BSIw
-(0?X{mD6LFL&NXZuRPK|@{pYIv;~0xGV|=!kH(o0TtGoNYV>Xj`uXwDkkDQ2<Tu$fYu~l@Ts)p}ofW3
-g~#9MV%3-W;aR+kj|ry_%y~w$frOS+OYZ<Z5#D(`qW9pQuC8X<FRO3;bVxTed8xYkYDPbG!KayH2wM-
-TyZo7n=ZRF74-cw)^2&D@gvZn(;Q-Kc<tBpn9Kae=8qixa#62g@Ig3kPq+#0KFcxNu}W#T8S1p3<@~D
-v&}SkeO6X>$f%B(m5p0Pz1vA7#JjH>8uc0LkeZBDH{L=x*yYCo~Xcn-j*Ij@w52<w~M0m7U^Wy3Co_i
-t5U0$=bDXU07D}VK@k*@6HybnVG<!*9aJRfg~ix%^GaK0r&f&*GLbL}KIISoV~G&?QGdG_bO>oXlX?c
-EFo<bPQ1B3xVs7j}F75V;4N<@S(!=f;Knr_>$TWr({o5%-YSnrmRZGa!S9C`H<NW_3CKi{67mN|%~Fl
-^&YgPw^#UpUM~6LQR%=jhmC$K0G5IJ&$J{g}C<ClJZ~xD{ut^nC5D%I!iK&aK}oI0FmoK&8TX5HA-g_
-KSSvZF#Y>t4fT9Bd^}XFp?#c=c44>|F-|7*p&b{7M&aJv0C9MIPC^`3r{PCJfa56R!#STs4RZRALpv6
-_gU%O$MLvd-rNft7?Ix@6aJCX;xUj(Db}a|r!3P;2^sRKKa~cm%``$Iv#ZZ!1dRDDzai~n1RBD32I3}
-&xaWQ<@8cVN|r_tTmkR#|i+t7>!*pJq}Q|_rLDEor*XHp4(*u$LPguxs!WCjW~MfNb%)GB8Gc!N>?xL
-^!cS9izjet2OE$=e3qKwz<$glW0KMw%nV9$s^`-X?K{iK$;Pu3lVWW3=|cGdB$ycNHUZ&?M8l&?x(%+
-QYylwJJ9JQAw6*$fgF4ZLCGniNUS<n@~9Mz;HFCc83joS$CKf(g9_^(~w&z_lRGNlUu^Er0^HXrm5PI
-CT5nBL6B@>8cWPnbqbbP5-JntN3C8hVMS-mJWqA@+RtwIwe6UE3X7m<LzzhB)3NU4`bFk?<?iMZb3@>
-mkmT!Ls-y+ysy(fvLSpDUmrj~7QC0al0hOQSNwm#20VzeACB}>bmf}!S#h6JjLy-MmoA}Al9wiOIT9T
-0y&K1v^xXoS&sdUU?rJyEV%a>Ijh~SQ5x3<`MY~9GFvOh(hQVB}PWd%v~K!0n;0jWQUipqTiW}#h+G(
-k?e6FMinsqJJY3PHw6m5aajU`aSNe{xxo^UBgoYAQn8i%M+N<N~LK|B0oA^*vUrw-Xn{J*QNa9vFcf^
-^i$Z&3&fjQeB(95Owpq8|5CV-4=}A&O76ZHRmFp6S%nw<7iTy?V_5sVd7x@`H8q%jJor(PX_4D^OP;;
-?>5&#D`24@)BBAl%Jn^Wd4K(<Cfl+4(?-GZG@g|31)x=U<XQQ#fVy$A2UPrft#s4;l2YwJqD9~!pFea
-DC$^o#J@*tm;1l0cmqSLe#tg(;Ek~AB^~*CLw57TUO3#(bRc^8Yg%RW^NC@M4N-Vhl#b>$62rF)7KLG
-Vq_Ow=x3Zbc9HQf@nb^<PIzXe?4HiuMq96B=xJ0sN%-sunr?sUxHt7V2F)D7LZsSTN)?eH9_qBo99xz
-y4f7Wu0RDp+BNi(IejNFNJGS4I@nu|igN*ofnCm7XM+Qk@`)^b+73Oo`&Rsj|@4ze{o}tt1j3fT2_%U
-=1(`yh(N*C#OzoBk>$Vr9}fhBB0VDP~Pi}KuhAx?~2XHwZ{a_-#H*8&7kv5og%j6Bqp2%mXf>;M}Q|U
-ua1a$6cB~mld@Vak3r&a@4+}2NSN2d#EoVHpW#uDc*s@%1VQ0a2CeNH`c@<X_c~4?m&<4%lZudn$)z6
-YPyeENSz@VBr@n!}akB!S#XAFs=7UZgnt5nObgW<u%H%>0SqYMjZ!DdX+Oo5!3y}i^5u8dJTrie5%Pq
-<;d^zMRJX!=H^sK;<YdZS{f5qiXBTE@=;uMS(@+mGnaXbhYc}Vqf+^RqKO*|7!HYHt}rKEVsTueHDGO
-X^zAxI;atBHdN=$JdG^-P?_2*ZHbH5wII-w^UNo^z<v2OD~b9l7Nm+c95?EmRo<lB{Yw^=v^^7Ib?JZ
-3*4&8xBES2k8!LofWs1?PvKB_ESPOS=bNu&DRu6xq}|vOU`zCY@G>ksS2ZmPTW6fadyn122EL#KwLoX
-Y6VN}q_RM$m}ZY`7_XMKuTKHFv@u5+0(o5JWHMdrkeHKXXO_a@S#*2jO|w+)@sLQ2^n_10Y|3JwJ+FP
-8XwP!3Jynr%xynk#K3F`gFpI4Pf<+i=3q_v+us}DTBG)0KwUSMV%=8G9+y&pzdTr~+es=97dB)sww|B
-W8Xk|B*RC91^VIC>Ls%DHAD#=U;Ni!6eoa4~}AJzbyi)X0}LXQB^SrslKL-jlp2#a}gl+l6EJ)@eFDU
-g+%`U=~E)(7N2zoH$X%Bilp<(y|pa$2h-ZmNYt<R%ZMqZnbqv&C)qLXA(*B9VY7tAi1}3b4D)!Do;_q
-BiAU<+fwn4E%7Z+Puxm`4JKFB35kclQMx#LScB8x!(w3fB<rS8m&Ww$>iCOpb4Q|dna!pf1qK9y;I0Q
-+qGwwXrf$-o47Fu%o2IDhx6n1Jn&n2R<P6{Wy*_k@?-O*MP~cijbl7$XGZur@xySXOx&LfwIYe#BbQm
-k(`avS8to0jV%s?RQ20y|H6wUrkQsqFm(TJU%gYy&lP-q2WG@gLQqu&ewW*A4WR>AC<2`t;kJTk5sw=
-4L1vaALNx@TPDoN0lKQY<llg+^Pp<}lY32-MtM@m;gH%h(G2RYN8F)_1<;fKl@ZRtf!pmep6LLOblpj
-cF5wkMG^NF0v6Po%RXR*vPEA-3DG+9+g+rK^oli9tz|St!|I#>D1o-0=7}6Zm;0F%v2jZ34eGXabLh3
-7kXZey}Tbu!rgK3Z1JkQDL4opae8~Z7QgkIJK4Jpm{dT@5ICgQgjWR%Wjy<b8s%F(YdTT+v3x?iW=79
-0Q|sQcO(+&T({D>ULzH6?7P5ZfA2)1?X@TV-DLmkd6WG&iOf+MOSt#M4^H;<Eii{4>YwcMN#zM`;#QF
-xPSDAIBc1FN(A$T`%>Y^>E!@~QaJpZj=emrHI6<fTSeWi(&=5LPoAAaHi3$Hy^t=hLiyztKpV35*>me
-9DL+6iWo5=aUVQ?;UfiLlG1i_ik7HZ!i?nlc5ZK8q*b9fPoFiAjTQnI=>M_tRh$;uQe9o?3!(Lb7cae
-l-L+7|fl#Y46d%e}&4&{0!#W1lH*a-|mT<MTkJz8F402XF^xQVoC%fp3_Yl{hI=DwpdsvdLl2yLaZjL
-JHa+=7Ju*k(xFL+1QQ277rjt$(iaRGxw6ANXk^QsJ!216+_lkU;`kc0gn0?ve9w{9e7{gQpwpNRkQ>5
-8AV<vfXZBkJV_F~4=B7YiDAmo_<I9ur;>f`IPwU=VIjXt0Ftppn-7bU&>R=K=0S58t#@(?C@M`0r<g$
-_60*orE%U5IX2siZ2ItDUMN(Cl{RrnzhC)CH;{xZPe+5+*ep*xUlsseTV64&E$L$G~`plL5h*BX_-rI
-8!`LFm{pHyL$t1MDgr}9fJRv1CP{*u=8{+9_tSO-C6y1e%gk;<(0aIHylT9Lq4fVeETg2d4YQ(-Lm<C
-k&Kf;>Zmtd5L3p+VYi46Y<43!t-{RGc{xr}K@OlV#5IZg-KnRF3e!Y?_}`e>#n?rMo|?)G}**T_4k!E
-_1=T27Qyixi~W^jd#gh)56RN2<)W5vm05Nb7(mb)Tn_@NE0Sd&`S|?Bn8cig94aI1G_ZM#{|pBV(6Aj
-PEn^OtJ&LhHFCWPj|oWN0N3~n)MU!6-2E#tF2zvR6)a9RcQf^zza5$eH5)m97H+v5;M3~uX+lyxYgSD
-4xo737PP7<`NL9eWy6ml-c!;5=4^4)dBRT)y;A3V6Z)r5mEdm@zAEGi?SE+sfnw(&f0j-(R#jp{QnoV
-hn0Qgsap*pS5W+$OWW9r~m3u&5-HG}{=1h6BgbVE~1`K<anHI09{*_0utG?l513zL(S3HGW^P+l?N2^
-c3;GwS>Od}=B~qs;(67aCOHv~u^B0NE+oa*Eb>2X@k^BsCeJ@p2^J*@*)Ho#X=O9f=s+5AOv{>HY)jl
-jlb7qw=bQd+C6}i81r0VNiK(<^t}ebVvQmC`U6qX&T18^d`4Q!q30~A%o2O9O(%?E|p&v+4l=(Q>)^T
-x$fetp-U6yHr{x35-8vsQk#a!T;q+I6Xv209{;*@ZhosWw5Rn^pJ55QT9JKJL$iXAn_ty=h~T<ht_qz
-#W`OesT5*Pisc}>Fj&@XQ$~y3n#12|+ii>0(LQ&k=0o;iT$aJfvD=KPl`6Al^dxU!=Yzjd^(!$|WlxC
-ob^cwNUiGrSX0FHOE;%Oj@4{-vW&ftgCNa<q4D29wM^3ffXa=OHDpFO;0EILhy1!+PC-Q2PI(xSh{Wf
-h3XkGY*zqfRBppfh$sDp^LUq#{lw6Klk}SQ`JlFJozqWI{@bA*Ep8Gz2EdDb2;nm!>I`kaAKq-~c6^K
-1A>>)WE>1#iwe8K>OnaG!hAD1k7nZ)7+hm1e9r1Qfp*J1A{>UmKOaDY9q9LzNBh<Gpuk$|4MMq`TxRG
-$fysO&Dbxvz|SynYX=j(3D-w$|HNnYE=8s5=KxDx1NwknTmPl8>+e1r$gW>PN<FrowbR|H+L0vsnFjW
-50*u@ZLFKR<0X7|H(Wf*!NI8YuQ#{2iwi)<l&8paG9Tjq*Nt|BH{h!5|sj{=2bljqE`y;xifX1oI+2!
-Onr{jij%0*;Jf89UR%0Vl%xSD3s)wBbj;l6kkTTZ5~9C&t5ZPd6#z2x~%b@@ehSo;_KELil>l;URUUO
-0?=3{aYj$i2AN)U1?JjyW7;oZ2C7+Dw)_bgQ;~+mf(ozKWj1St#tQ0J|oWJd7ocuasE%r1HFP_|o%Fj
-O82iEO=%YILzN}3pEwzvHp-Syx|NA?6sL<;i@sz0U;Xjf*dcO7SEV#ukQI!{M5u-@((qph%E*&Y7n~R
-{oyv&6vmeoUT=z@nZi*cpM2_BC^$`nJArUe!SV<^&HVz8o4kj+#bi~9zTLTj%zIbYF(_6za_zfuJ!1t
-hEzQ_Ow^tVym3x2?T1S8~JezqHg$W_IoGj=-6TcKd|FB>QC<YP=K})5Q91wYw40*P+k(Fji)j6QsfPi
-8gLT&6F%k({*eixd{P>9A&A1j_<xyhZNKsD4@R8;C}a?pEJtYMi-$kSb9aq!9FJ&-9+oo`;BE)Qumss
-`?*kYa&#f3b^{eyhv9f+;mQq9(^rF6xcvS#(&mV>ORlha?#cJ~_Y|qn)~hy-1&(^tqot34OjzpRds;+
-Gda$ARLefKEdyY;Tz~IpVWVnAjeA}SigHaq%eG%9C!{-d{(SJhm-NzbSeuvgldrgP-1@t#kv93-)Q(P
-cZU0tsP*>_s*M@tH>v6Oe-AYMM!WCRNdrv3jq+Z!`{n|7t0+d>Kji$kL8xh%ZiEt~Mkv8u@N9hK8+iH
-;bN*kaG0a?BxAZs~n-uIoKyLFr5E-1)HgoAZj@z@B+f(0p%mKnEhvUfY@rSL)fp4XRW9CXJuo>OT!rc
-A2kVnl6>{tqrK|~wiwvl3(;%x`T=MIX=9TdYm5R=g;umGq-B)R<cA~EsPMZ)qEN=wnE%)|xWMDx@j!n
-4smiLg2Pd?IX!{t3bjG>p?L`rAa3F)Bm2{>&s{ve;tQ23g+JEA7U%*!#HPs{RstsO?SkXAmRPvA-jf#
-_f4CSj-;OXdyZqlB6Bjv*=X4*h>c&OY~y1X|WUs(NtO>Ij=xk%GY?&!<qSfMg18sUtE7?6`xaoW*rwe
-%EtSHLT0oD!R)Jq;dAv!m^0dNMW18i?YBmsNQ85v4@0=gG;_Kzw*FU!sX`8{J9^&wMBdc^Gt)*PuF)W
-#LJ0I9(jgWh#7fRzg74co|15mp#rdb>Tj2ax;(I;kzZBm~IsaHZMcIM$a4{X*U;t;Bi+gFWi(GmG-NR
-@KAl+5+<K-aEyC9`ElG6)RYMQH6>j#-?I~p$ygy=pC?b(x}kxFbO_rObNCFx&kL=CH)djPMq;1`Odh_
-?di<iQ_XTFM2U1+AfeZ*EJVky=VIj7IlSH{|P~^Lz@lnG4{p9|JJ{05dRINb66M>8OgQRUwHw;K2B6f
-L82#KP8~)7w7LYqaTovzGY=H+N@%vOrI^3i%<j1x6w(H0QSa%)D7+4lpp5&*gI^$0*Nv$^#>~Ar*J#x
-^}4*M|LKmp!2nKi7b#n*8-nxWS}5D1hL*#c=JhrPG}EzGJyOf4wJo{<t4m4HG-S8SrDhQArfPK~2DsN
-5DTvT~)}!dGI-o1pLUwKBqm%I}i4}=nyT}4`D~e`gXJf0m2MUcid=u#K-O6n?(fHfAU+<(U^X>cwF?J
-_^r5L*l6mq~zH?6*2Lxt9ORKNID`pBT;;R-Q;sb-nJ<kh`o)dEdI|2e3VS_!$lrA7`QMWHu1s|BUxej
-G(-B_%LUi*{(WrJ+1RBYMI(hd6(m=0)N$i!E%_VmvQbkUBk6#|!CkY6lp2g7Q}+pE^qmWdLZ+qxgg&^
-=EDqZqcIXIC%<acw@50CmJYUK@+l#g)%Lmp}7iOV90Ke+nXpw10UX{jhI!pJKTZw$*oG7RxoCV=2Ghl
-Xt5Ni$K-jvQo!FoQ&q~aVT!4=8jT7d_6Z7tIm%t?v~9^~Orai>cVkz@eWM$`M83<95otpiAxkf=T%Go
-!4qI7SzZ=_mn~(z&VgSJQegOLw!VrBtp?7mNyp>18bjXQ5<WdmVXl0T})^Pqifla_P@h?UB7*~r|4e@
-bkp=<eNOoDc_akNsSgKGf3i2|4xHwVxtb4p|2A2b)PPpDi+GyCXRTai6v_0b8~9nR%*G^BKgK`7x~pV
-zCHaS}eN3<F$Zr0G#uBM<ijjSL*#G<<_O5L#pHX&rX7=cE1}>T~KrX!04kRWRDlBM(XoBSp%Udo&-OL
-3ANU(p!Y&i|LXY6i#W2j7k|)AhanNlld!T+U-Y|xIE>g2X)@?6zOq|G~_el>4J^PCW_I<%tgxXpz~CI
-bBW$ABwd<W+CiuL&w;p7<ag@}rtlt>asZh=n+;PO%Ix_y5T61%9B8zs@+k=(iYXH*_giru_ft~l*Utd
-y*8#BKX|P&N;%=OWfN->N)218Za2kvQo=K)^V|9fx63@}~uYARVhjT-;uUu^esVN;@wexAg`ML!61TE
-1bOps&Bn1Kt-_S_rDZ_r6*H-4$SIiPO(M5U;eccX+SKTd&ZCBSCsqO@;voVwV`O8!bMXokXfV?D|Ut!
-VkJ?Ne?b)6OgWU*c|Ll#Dh$ybuU&yj$L(q2hPv=sgx{5Cbk>a?sfYRX&IxVzZH~uGX2mFuj1r@>i-m9
-z4ILG!Jd&7<A~{jb(uzApA+WM5N-Ns*Kb!zyxojeWTFd<kJ%)+Eix4HF~G`%k@ru4{JAdorg7XH*z9|
-AExfuMX?kDfTw6&rA$}&CQ~C71N<R=m>k?pTaNRk>0q?>yB`#sHAbDVc$xk>TD&}XgUi7zTI66h!ryW
-Dn|OnRvBBRx@b@&N4N!%?zERtC6|CgLBLj3}rOX3y)NsJ1W<M9VgFq8H)Xh=e#dB5{IdBBGNFc)~x|O
-MWo@*L%5PkM?&n3?M*P~wk=8*w<`T8T8rd&0!ZhBBKNH1TkgH2C>kq;056urEhtiAC<T6cHf0ImD@;Y
-7*phcBpgmmi61-Ft2vbkTyxO`a^*_pe=BC<girLTYzC?#38|baa9n-R&qg@WXvZa!)z#jLI>x8uL`zT
-hJnNC5Bzv)ieE@G%z25|G7zMiN04n2*H)j&?S(hc#DTP4(kJ9MDJ~i@82Q5e|C5PzFDnr<f}si@$Ek!
--=7}Rz?u_a<n}{94d2P-=iwVL{SV#Q5j1PQzv3Uj@2Nv^{8pC_!Y@6G;Ky!b`H|{cmPos)R@|dqdm|;
-Iwq0T#aLa(qG|Zr8)sw{aR+Eq?JF*IMlm24_pIvw{zA_8P<13|*aXe}el1RsJYDc@*%y|E{%%S^A*+O
-xH_@-or-q8drBr@PdH^~*O9QG7g`3x~+3BHUc*!Gs%ZyLfh6kcQ2F2|rNgNqFu7E)}X=y%xbGf9F)T*
-2aIXtbS17&Ploxy({7SFey3tpL$dJk4?e+@A8~RmvN05?2<mutHfHPGk8SzLFVv<I2KcGfYTGZ7EraW
-*y4L!UyBuc)ONzXW>KfZyaBxy6`{Z-{>)~EGi7fzwsDGnN|2e{2MoGl`9K>6aQ|)@3DnDjQV#FzcUM8
-#P1aN#;r$n?Mff39<G!&u2fR6gNyN_dc`t&;8Yb63pb;+Ea2KY6CE_Cp;Ms8hC2i~NQ1cdJ+qKE%yW|
-&BVg=<e6pb_*&h;4_{{S>WXdsW163&%qDvr9{99TH<%-QsQXoV9tisCRQUgEUXDBDeW4QBy+cErXce#
-tKSsFJ;oCo5H=~VqJM%b^?0!ZPjK<g7Q$cUFQElKrbHOo{WtYyoqBkDA)kX%HeFi5#$d)$nYc{gr1x>
-zo=mfJ#ZDMkKPuCTP=rY<@c^Qk!doUB<ICOLcSXN?!|0Mgm}!g%iCPzfGD&s0+ahk3RsxzRXBs<1ST<
-z9-oO33P^nmO?>H3f}<f$f)BnvzwgrO{9V6+m_VWBfJL;ri+Nv$=dy{n=FE4^Wc1d5+596ohVa{wOq~
-DS2itZ=RVdB$p_s7AgOt3Aj&B_ncDkS`KWWRW;a-%|++3lA`)qH}R*jwU^>a)Hr(QfhAaCsGl)jFw31
-v2HLzsH=q;HheJ_NhKA0kl^buG106aboW#Ds2=W!QjVv@_!OT>CUf>vC$n6Qa0QeFjd$dkwG$lj#w9c
-t1{XJDOh*t+OK>{RISW2R9U>cA;rP;_J#xR35no0dQ+3IBo3*1XJ3~-#c9dmmM#vlm-1^&7qZadpH0&
-Qm-$Fz?`tDWs=HHL1h(zKZ{()I|S0)3m2BbX$iSFY&At@QHpU|knUqj$`qC0!vNVXwI!cjiy4Yv#zY@
-R!D*nX`v$r@P3sR=lCE(tZlW1TDL%&*R1d4xEb@P`VXeS|#e<Y6~eQ?SOVb)7@(JYxMdyTetmVx<R?F
-rohHqL8b)RQi$pAPLEu;3oV=6?)-@RP|V>fce^ELm-+#kd^YnlT;xw5P(IuXUz6N!RfxG%p$nkY5Ac>
-QytHo0F71wpay9!!tP`j+RS(DS1X10)LSH+WJ^1kapke&-Y6`U<q4xh66xztIhoU2Db_ib7_Q0)9<5B
-g=-WR_YZ<IQ%V`SXuR_;sy?8ndM>d2PW$=W{QaL~cJ5|B_)2BxT6cs)H6R@b*t&C8$#M8EkE&GEgvaF
-v|;ma2MlK94&&z>?Eaa?|>D2i<N(+pUdR(#F-z_u-+|+~)fhpd!{%;tfGTz6|n@kK(TVYrSgrK`0=;v
-duysZXqusfK=Cu*Qu4PLd&TwXu|<vb?quL`dXmyc#dpbZBM)j3n5gC=gt}A@ek1!3yOL8!?-z|CLO5L
-u!kT>?8B@FDY_PU@hH+~Am{!;iLWxy&0pu%Ak}G|1MmaGk>dkxIY#ZB)$CTp%_1}C{Yt8vOn3=mZQW4
-Q`w+hzF^ygun{bw4J?IDimxFj11}T8XHbmoB2OyQY%ll*0gdh)>Ko@D<fq*5GwXZj|uc_MCYueXL?dz
-}FmqYt{Li;M#zJ8;9m1<vp?dzsO943rdgAstPc^~SdA#e2JJvY#W<C;*#HK;gZe2RyZ>=<DD=Fvte^F
-u9;YDpVcLEcL|Bokf8?S<6jCaXbpWx(4a&SnHCM4moi;Knkz_3-tJXm2+O@POn@hwtML=%_*1LJn(T)
-iaRT@b0NpGW8ri!-~M#h<-KR8v($h9`%;udn>_#JL;WDKRUFJsq}*m=~1x|AsBfYPK&KL4fx?=Ap$ZW
-q!f120N(zTw*_YwEn*AKhL$AESaY)jco0Hu)us?m$gTR!;rwA-;psGVsYh|^XggBr^taK18MDjN)>H2
-k4MuOQMs0dywW+B$mexTg9HkpGx5$M^kKW5}L4u}PKTr>DjnC@hI6Yr+Btg$p2GjEgl$J*!El=(}pO*
-1b%M|hf6&0(O_dB%X0f=~Oj4qVrp4S(B;du2`yyF?9@r*!(PwhFl6+P;eTiwXF)$9(+7J6+$OwA_94?
-DG5@ZC<|cypVY-A4Ilm(AH}>$LX>DSK{!k`-&<lwgsYGltA#m~fjly;Gu&j6FxCX;=$2K@umd#?!BO6
-Q{zW)$O#_yX8))>Ud*SpHvlValWk?aUSGTrK<OvovKwyYjM6$w{WXKxjpV8Va+Oz3w)f6_f^+}Z11!R
-LwlT7#*xCHqt9{PTwkWv%TBA<X3CGe44Ff?QC!c@E#)Vc^0}n#4YURkGgT6KBYre^+Z%W^82y-@Gj}P
-Yplu-BV6hAo+oAb1Iuw&s(Iq>xeAdeRFn=xlO@hBM@Mjf?LwKs7qKk?Q9m?1iX9wD0DA^FettG_*0lK
-+klBz(8x4r@eGnedr8BKRQucK6E4{x&Z6JcS_gJHU;5cgvE8w>G<ZsCd+C!wX>2m!poSy=!9TEUz`CJ
-6wi7BYYl$hw!mob>IB_wdtw@g4^DVGrpt*W%P}=}3V9Wd}}ci?b8A^8zjWa5-Z%tkyk;E-B0LA6TEF-
-x;vY!4GXH>x7WGp{xtN-NmvF^V9Sw&y-r%xh<DZ)zVodeVdg}(LSu?cjzep7SO6aB3w*X?xV_=G?vWU
-hsqM(6-Z`c)0pTAO~#Q6JE_C6Ds;9`VO14K(D^nj=N+)3qwOXv`fX6!YLH9NQz&%Fe*1nQABN1pPiVN
-c3%BTLcE|;Jzn}41dHRL)`M$Vy#Jdq>b$^Ut%Rt76)|jy&ZE+_Fq4?jHf$o2e5$Y@0rfa_4!e7V@5$r
-cQ1S?Ny9u{S4!o#9WWf6KhnLHPUC0Ra*$9;(_iqI;ovI&U$fT3}r(fqx1NDdYo^XhZ!8_Uks-+HdJu}
-l><b%*OY|2Ci=K#-AN?K74``A5Ijoh9sNg%RZ4y`XZ=KuwExL87r!Rii33KWJsp6sHwq4}3_s6rk@TY
-s9+Nk-{*!<<TXW^6Em(Js`sGr4~`s$-1v8EW~W@cB)YSM5zCDoT4w&8!zgt0w+6<U(zBZrIuM0Q>xPn
-M0iPyJ<JyuB60DT7vk0C{P;q=cY%HxwJ$S6HCr<yjBR%I8I&9lk9Xmv8<YytAkL_m;mPQem-9b|*PyD
-<4u@3N&IKOV>{%#dxFlSN^IBv1g_KL&Z4YySdvrIW7Vf?~@dA&Sac!m;Gq24TV@X_K86HFJarW8NQqD
-gXPi?rsJOkQ)wyS->&W+Kb=mlr=cmNfX=zVq8^u7Gs9vU%Xf^Jf4k8u891D1WJptBwEcw4KEHO{}5T7
-ejOAJ7FCK$n4ry7q5geVq}OVy~mxJ;=0y@6gi|BX{5J=+_%FbN73+yRWgb=koO0IX`+hXf61y7J12Ds
-40N@Z8U|7{OuF)X0O6NcnBi_?#x#>2Yw&YS%@UWqRXLUh1f}9l*eZTm|#bu&3kcQ7|}nA*0M%RQT_|i
-f-U!%mdTO)7FV#ikoNZ7Y|X#|m*D#$t0`vxWYa%^RRCS%4QH~29&l?Hodt^xc}?s!WqtLZZkobg2m+1
-Itl_9N^l3`{XPeUAtgk!AG_u0Ql$(#jT-x!uo>9wXu4i)xagvRcldMln+c+=rnUIwL=}bTlLvQrVMpg
-wJC1F(c+t*d~g7pArm`;wM%WiZF-h4b=es@4GC<l?unV>mEE6%7YbtEJk_J9uV%kr`(K?1$wb=?gH?`
-_J_?_(8)k+XZ^T>cMxsEJD@@P1Il>sbB9)`GgxJWRN(37hbMqjgls!M_O-`#^Jeq(Qlv+!WI<%xfDcv
-&+CYTR`!I6=m}4RC<T{3+meWi3N3S8fFuB(&_!_@9|xZ#C8|;XB~Je1i4rpXoL^4i!D^{L6a&!-fJUQ
-v4La4NHTIy!pdUzZdIigN%Te=YM9J_;>P2pvQF}!hp5lLxIT*!it<0<cAD*Ctf)3ajQwmKD~58pot=t
-N?&Nl+V01c0C)4PV*kV-6tbB0|NMN&T?45i>nSnA7x6|Yz>#xV#c{;Uk5XQaN(+Pz3Ycw0==hHA}66V
-~`?S%iE^TYLZy-YO^`g=^gdG)z|L+nD=D0Kf8?!mnh=qYY#X~xPIktw?qJw5W8-c#ikxy%wcz<-v15_
-*(*UXKn!j}CG>4d3fgnDz+Tbr{=qkdM%I?adD>!+cD?8-z%=imm;YI#vc1arnf27#7ROhT`#h?Ti|`Q
-DC89aj#MN0wTGcY5C!*LHAie7X6+s1FscRG}9Drm_e`S`o?xxzo4r$hkJOhymycVRbqp)bfyVfT9j4p
-=62qlY&+};7PEL;=O`F%xzu7mU7IQ|WlbO2&(@~R5knL0M{5aH;RhRJX(ZR@od|PByUSw>;FWQS9c=#
-v9x>Y+uEcE}(yau@9z$NdQjAQZ)QJ~W+z9Quf?hMGrMPGc3n|yhj=V4#*8^*@A%5f5fIC05OEKuhUAD
-swczIcf_8jl+(!tRy`}_>pe(kn}3S3jYyY6;Sv$VI}3{w>^^!)oFuAx^~l=j;86ZTK^eh91Vnz%%E<t
--suxJ>M0zjr+ZUV2fSXRUAnqC$6{f7b=xH*eN(15gw3t_!^7LglX$H{?xL`D8nvH+k(9!KrIy%L~%NJ
-PTfPvEc<+oiEbvxhQ^tCG#0QupFhHo!D%>xB5jFw$MtMemC4>#x@96d9g)aVkub63Q4qUk@Cf_)`L={
-r0W40>sr7{bIsBnmWsu$rIl5c%Rnnt52C(airljB72sYIK$ejm>tURR(>;uXN(v}V1CUSb^YFSmfQ@)
-RsCDSOHd}i^_v-hOW?;f@HRFTDhh<dJfIEEUj4aSq-32Z)@Ys`gbX!a?M?w~Rb8W{R2P~#Cw%Q(ElZ4
-6iN@;Z(mZ9xa;Oz-sZ0kcWCmbAG>48T2rUiVq9Pt@Z(-;qbEc`)Om`gsSvKs*6p*n6a--x??*u*XPP%
-6}QH_1n|i|vA|VX;&e%Mp=q{52v;<}WVghmtpUCAiElAgH{&2ivp-AIk7O*wHQcP}25bSGV8;R&g8%m
-)3AtA8aA9uFb&tkJ7E+HX+4lB2HKw3Y_h@Ve$L@xW$6|r{Y<bPlF!uN#a?vFiO5*g;e&wG;amO3$x@K
-R!U_DTjs6YjN||@ljRH+&?%K2moqF7FwxI~vg36l<g(*{P}y^nR6K-LoyV1blK<?WrW^y7DlB81x^88
-;TG3Xii~wZHb**?c9?$w1a#ag%QP8x(%^D&*<84Zood>0PD{Ud-*cHE^f!-W7Xw<jn^nWfccWXu#p7{
-L}+U*l~pGB{F6fXea?xkG5FaK<Co*AUHTA`d|0ZWuy;k(k_x~6m&^>uGuW0WJNh&@uvxp32RMMS^8V|
-Z{bNQ||!XzcZREPqv4HM)XRcj;71D;Ge8qB|BJNXcTe*{y!Cl{Uu7YR6~VMyJp0%Ox-ErEZy>?g9BJF
-swyMzMQ4i5%E$6uh8~cyp2ew(U;Jj63+|tyFPm_aMx$jPCy+Yuf!3Eun<LskDk`b(kjjIRaJLBNH;vO
-dg*=)i!EkRoml(D^6K;NW1{>nOfRg?YchyogFnPC(jtU!=*2m~C-VlpWWy`;F6x6~r)t|PhCyA$tEh=
-w)C)PU@wfANPlHy+@WY-)HIp|g?*xlftR+7j2^RGwLgx~pUOl8sD|!8<rueHQFe_xI#q9xnklv_fzAY
-Ax#?@YO5~0q!kM4_g(H-x=G0tyA7FkGl#CCm-KdA8m?mtlnCA#V4QjdDKVZv4{MEwB2AEw{AiSPCFJ1
-_pdb@C|sb1GKv3avzpn~1X*A95MdC>1oVc?B5=%g=Tpy<$*~;ms)^P)!aT<0oQc_z}Uf<BNS35Uv*c3
-@-Hu-lx;;j2Q&b_O1ByQHpH~w#Duw{N;52j32Kal$;%ycT1k0!f7cis^XZaPNV(7I4hMz+ELoZL?qF~
-k^kI3XjhQM52E{B(XvU(i*cFv*%!2(4InAJ-Up8((a`Ik^3fXcI)+aMVdVy)3wrfs{vi}(By$>wFeuN
-MZV<l4pI8v~LI$$qg?{tyXS8Wvfme%Xxi!DI!-BP-g8Ic#NdwPlw8ji0zkDIyn6b1m%0D3oZHG}gIG|
-NV<$ZatcormJ`CAm`urZl>V=jZnDC6am`QLIoEy*<!i)SBrThR@?X@Q{NB@XEM#s*Z-PpQ;^1zABf^t
-o!J;_LgCMpvq6<7Onv^NF5BeX4%lC;hPly-?x1d?$M-R$6rd<UaF!yg!ScPaqdBQxcL8wV%jG^AF;0C
-E#WKS}PN%d>>Ki>u-SaTK_dq>&J?xjT<fEX_Jt(1uulHiqMyop?#2Ro=>bx|M+{{xIb<`E~KNv(EfX1
-I8_leB?l&zfqcdDd%DypWgcY;y(P*$=(ieT@onh%?;kkaB>h$GB7!kuU)$QZ+~n*lsOrA(_kQ<t>@xY
-|-*H<uuG}s8JMy|@<ulSWDE>MvUT#s|q>bIxJ`!EtXAiVQN4|hqhDAOw^>Z|{n?avb;8{>-rDy1WO~#
-XUVH}zDcl41Yd4Eq}qh-71RwpONO(puugQGQ51(Wte2u%xT<QWefJS{z*2W2(}XT!7pw2@D$KWz{$10
-w7>gr}WjNZWSJ0OF19iQ>HwjE;e_yNhR-b9oN0c)}g$Uu025$4y2L*KdY=6pbED-Nh;9dd|NYK1k#Xl
-(1IW4iuDT1p~QIEBA2NC7aZ#De_4*n>mE{e&K~JD*)PllDEvDP2>D7yq!6_7f0uDiV~U`M25g*L<(p|
-_g#{N_GpgJ(Q*$n`9oabHsF~}>GF;|3S56W4Yynaqd!N*+tebipTY3iO|Gep6<v*G--#<`Fz6=K<x&=
-Kd%`aA)_Co}^*T9-b>_ciDg%|%Vc*Z)_Y~c<2?mNkN0Uc#!}$LFiQkwRX0A#bqKxtx$~7Pt$sYiNE`f
-M*?n?@mbpf*s1`%elOWlFp(sQfXyY!<!&R>W=giMh3*5$@F$^q<@%mC`N>wXa9X=tBIGs{7w7E@RXAn
-g?Fz>M7HZWCI1VgDJ<kDEb>GI8s!ztCo9SH_@%|4uU^q=DPK9X`|mmao#%qqrM56I8gFM&V*^r_FXi>
-;p`PQRk(NF-kkIe^L-@)&ZBOG>)vB2}rK7QzUVL`B)Dv)Tp<UzucFx)Fsh$a{VCS(X<^iXgjbqz;y~}
-ecZjL&q1?TbW_Z18m7TC-pEarGo@l~M)VsaUhIveIRi;^3w+k^Mw(%ypjPxYTvjQi6@bcq-#Mh@w`|?
-{ln{b}Qh3_StZOc98aB5`dK?F>{!AJ$9omj&Cc{zEXmyk{^r^!bruH9lr<NtZ6Y)J!8$%lN!^1citD|
-rR+H`v}x7m(yk$lP!?C3_e3Y`ZgB${sI0`ClNbSWB7KZW>!wred%lErGPvGH@cox@BYo8HyhFGBlA8g
-^j&eHqJYq#T(>o0<(fun6s0BUw$&4ZAVehdtZ%KkeD=hVS?6X2W?sn}<DHKq0lcJ~`ecftr2dr{1vv-
-8!vz%Pv1ciGAl#1EqS?yV$i%ty355&Ng6ZwIN%#+wH9Y^)eXjRA52|gIH{Sm>ROX<gm-F`$*E6*=qlo
-^Z!<#MYQkGjb>NSKMgbg5CV9MX$Jz@Ki>3~qW{jFM%oZ_lT16BuXlPz93AOsia8tFf;rJeSKWaS>eLy
-DVzV`zicb|&BBpr<moL&agb`MWyD1ERg)gbPfKEXni+u4+!oKb6XVA4!nXOOHZ{f32xjNn#WabV~U1=
-NZXN;s~7<uGRG(Y|xDf#O&n$_TbXn;%`l20eaGVQL|YVu!?(A&tY-fgHP?0aT_RbH)@mw2A}Q7gy=I@
-px{Rv&r#r&;B#&cBcq<ejkrR**-ZPL%xd(-*XYEPEzyrMD}e-qU0C?#DiLKAq^(Fd{!aurFH%_hl$q)
-n5~befa2teMqK#c(<H9H)%j0lA#Y*my@d|X-1RgL-fQcT_1Yrj9I+3ouNAI2r?8KR@N@D<hyM@W`4*&
-9q-sDlM?%}i@WDq9B#Q&Mq400L;Mv;St%f@7?PD);$`%n#*I@zaBO1KGK>5cS&5flI$3d+DrAbYCkdS
-V*7n(C(SG`SFwCZZpy@!8?Ch0N;#YqB1dqJu&Yka(x9!}IdE`+KKFuTVPawvTbAQI~$Ij^<d0+oIA=W
-(fXEZF{6*nw?@m#-0-pvC%@*aER|Ds1;H!>96BahloOFK0Cdd)!&?W_C!@}5tlJ`e-F@}$9Dc`wz6K2
-Lb%$w4gSj!-K1lAmpZcpn=k=4#Dp5!kT*8$4c0sT|;`x8^~#c8dGzQ9r&oM)wcEac2U@(J%Xb^-9rKZ
-)$!s^|i{P&KCzDHI=&d{U7$!12sqbAA9PFPf=%-sO`e8dRT7O09QTs!mfH>UBFfEAA?=>nlJ3C_v`>y
-y*~_a)%%a1;Hr1mzjf6s(_QtPx~pEH?y5IUch$Q>ch#GqyXuX>7Cc40EySm&BSMfG+iT8x_gwTN&U$z
-3JI`6~k@KDP<^x3Z)d9|WJE^l?#lLaZ+ZK1$+k9@2vtIfCH_m!ze}c2#fw;5Y=mE}pFX+yC<bUa`_r&
-A@&U#Ot`>D=)_k7P;Z>Hv~H|-}m>rKV3XhR>Jc)qvZ<LKrc9TNA}n@+v;#>c(&@K>Ozx84hk=B>9Lz4
-azhZ@qt=@2#itxPRlRw|AK4sdxRq_tc9c=%;(?{S&}Vee%4R?CFiBp6{urJFWeI!ybCf{2z1G8~T?4u
-6j?L8|<owHT`r~JvvWS>Sz0XSH0hz`=7e%(c*s0RWA<k?_Krw(caMZ1aaZk-Sl|fO>bG;O>fTtH$8;A
-fScYl>ZXSP7k1MdGQdsmqW`^{-l)LgO&3u&y&*lV;$h~;{q%I~{SO`W0zcVNZ_!ZQQBNa`grgp!;@>;
-!-O}%<xAc3CdXD)u;tVG4srT*w-ct|f;r~TXz2BYt5l=m``vRVNDEa-6r{2i#;(X<NPd%(>u&17UUg1
-CHsfS*7)KiZ-=fyqs(216M>NQ_Fz*7%n(NnMS{Fe56>aC%^bXeB+J@p<tcfO~dlU}6xL!NrHQ{Thd^R
-Io+Qx6#t_0)TUVo5?Blg54DQ;*XotgXB0V07ho313an6lfrY3k17<P{cmZckh??qkb5i&z!yA!NdX%X
-3~8Q=05m441XWPUmnD}8+Gr!#f$abQpp*UomP(<^agVA7(nZLYNfqJ7(&t>i>o?vi~NCdJvIO6T}-Y1
-sY4&S1+)mm;+FyOsV>s{->CJzcVSOHsH_6odjM~pC8+aZ4m4fFd*j>a&%5>sqsf;4)-=`o{yWizh<rr
-T0z;q$Cg~dOJvv-<0*)9Us2rlUGQpWtS&%z*Z4iX}g;$%!PeG$~k>8I#Poo_@_(v@@iw((nT&ieOMv&
-hBO4MN1D%F}iSOq*TSG18kA)WsC+()AmN}zTH4E>=7vf@u@cV5OyMQGZPA<nn3Ek*QJIb{fZn1e-GkO
-Wc4hvgzxyxGi1hJn9;+b3}3jzoj-z<U5zh7wnQTTeX-*!cMSwo;%M8$d61R7I|M5(Eo=yhzOaMIy=IE
-v3B47K-dLgNzc{HIzQhEIv_cp(l!RC$&4Uslk%b9v8WN7j6=BJNL_BX`>l0s@Z4>e`-w+2RB-uefHUx
-(PCcQX93{+cVEYhO<9IUtK$ZtCwSi&daO?4ScqFB^enHAE48DO1}U|kV1S&#sk+vzX0xELQ-fX<Zh9#
-a8vRK)6b^e!ZC6v^YXEHyU_>s=u_?jFzkvwurTyGXCj0(%!}G%qSMcEsO!wt3A%EIQH!+&#8bAl|hlH
-a(MqO(O272+XytQT*)QzAn`da{vlkgXz${`+NVFr2<$sWj5PVAQ>b1K#WdIthfDU|{Zr$Bj#x6Mwh2K
-jkr{leri)~3x#SgbMxnR+%x<zf^R)VMhr5vHUxK1KuB*VmOL8X8*y?NH1g=nXZO)3E#qK7;;DOg0@1{
-w!BKJ7Qg0{ld&K*5Kk?B||(jVx0v)bAyZ98m)?{nPH0T@6|TPf1l`5k?uKJyzIAVkMldcpyyq*jMzeN
-2A#JW1fET+82%!8otL_F<dTnmPhC2Q_jh;?a0WT^=eRS)I<F+O+o#d%MW+Y4`H}7ceieP1Uxk}|E#hU
-{2qew($`l&1xd(g2P}AyP%R)O;5c*U9FCcbU%VA{DO05&O<Hk%Gg^sj+!q}E13{p$yY%9>tjH+JVsT+
-+cGsV7h!q9;r764I>iG97oQ2cothq*sd*@t;k(Dw>?aC5(>Rqpq9U_4}{_InQ9QXOmW6Efupd8HSpOB
-8=w4mxHF73}Iv!(Z?~2S&V%JT#>ct-5Q!Y*5KLl-78FY*3>#>_vrdXA5xPtV7z)up46VqBf5<DKP3<h
-@vwzICr$$MGm|O6&{|0n{>Z2OKU6z6@<GF=S+Rw*HGjU)PIC;nlk+dIDa$BhcA`DOgRw61N#BR-1{Qk
-1cPGkI50&L+Jb*)(&^YJ`AsEgCU80T(k#3^3Q*S8RNn!eVvFr#pftlgdu;6qxsHXU8$Blv!oaD{HnEu
-%>)OmvLTyxTfwr~G#oKooa{Jl;hrKreh`M<H$A?Q+MZwg>D_6y%@L29+ITisG0z*;oj8GOuxm<QpO95
-RmamDo0scC6ySy^d$bg7``QRb0lrdDcJOITW(VxseZUh{sxmj%(RPv7t7_xt}oZ+Ld*J?HbxJTvpmJo
-BERR@tO1+O0g=qrB`gB{VwI;*(jX!LGOp$9U7PmP_J;jH*q<4J8Rqot<^s%EBv1z6i3D22x=3eec}_k
-t&rg&UDQZ?QCsDQ7F~2WL33OS%FIKv!t%-F?3bcuY?4kp504_-xRt)+u+){L^OmplX{~e40@V;6Hjxi
-_b1Xep;J~|_+?3(M0IYR3JE4wrHyuWpPP!RP(y_`c_rF~*pV=h9N)tgdekH=*DtL#cW1b#&WeG3)Tpx
-9)A;zJR%}>2B|Zp~TS+U+z)9g!J4v$cDZz~A;YrDs@WWyw%9Vlnj_##DLE?8o>vV80{TgfREv(blC`~
-Zhd9@CE5TaG9V}$9pdT>X4HdscCSK~6vBh!))?U7mL7VA&Wx@xQN2?rC*YOx@}v(x<fr&aK%l048NW>
-JUbi5_PDd}~wq{lG=5wV~Zwv}POPEd=77;g-z5R9dw7@<Kz%{`wM{b9E1#DWINxU5b@#{jwO!<H9Fx2
-jV%K^{26C*2>Av_I2<*lW$m4uw7=a%R<|CxV9tt15i@90y&i*vpl{*NE1e<B)q(9|FX&crK0YoJS}N&
-tO`@s*^kwnqcS!&wK&Os=ErIwokcq<@4GyBqRK=Gd`{tAHi>;*$LfyG1sb@@96CUtc1mn*`VXP?@EFV
-9v~l)V7tF(%%zh_RwY!XY;e+w*+9b<7phgZ4hj^MsTjsqhy|tsa)=AdDBC5tMh-G~o*8q>Q%-d8iK-;
-<iH+muf-y%K&yD`h={@X0ERcc;^6fuS(>MZki(_3FO<s|D73SgOsUCTQ#-S*y_WZf>D4$E&FL}G|<T{
-}xiaF%%>G~9|}=@{}HZ~`_?-Kn?T0x#=Kk!yL8tq_Z)LTqJmB_x^?62!Hs2o#c5YrMxY$hpp02WRtMQ
-KoxStUh?HSI5{otrh1g8vRo&8tqkM@6@tj>tr-_?6#!=58`|T8-+nod>lxFU;$XzviD)JnM~XRFc|&L
-p~civw(h~c2x$Nwm`{>h5e>kdtSjN1pDmBV!=IH#;j@b|3cFd2E0qsS1MnfDc~5qVbrhGnn{)Nr;C2d
-~^CDuK&ei|e&2~?b8y59b-Ae<-0?f`gDDVf$%6`8T>&7?4T@E*m-BPS;$!>r4^3(KQclL6%qh;3uotI
-Z}n4|k#D?@6=H{?4aD4|Jq35{)#P{M5za&VvfqDaWwE}<@V3AJvJkkc&*UC}w07{`h2`j;oWVB>O<b%
-dv~l;|q1X0IOS$3tdaEYk2H&eQL)G+B@ketEvi(o#MWx+Tfi;g@O9bXlbw9lmdncGkt2hcmH7P;DOQd
-~<pWOH1q*DswP5ajb5Ed)+BQTo2K9lyPV642(O{w}$&1{Pu^qBw&1cs?t(fC-R_5aA>r#ZOAweqet+4
-kXls4q|#<4zY1(ely~nRUnO?$hm34vx=#w!#C=Ok3S}?V;FHHs#7_JzO_Ho=e_|u#EXYFh@u7_QnnO{
-KkVKD}YQN7y#;M$&-Z_lQYiP>kraa$SItjP5f<j~Kl!sPCF{pzdb})9dl;DLjbDx_jc5w?4tZFp)@40
-g2xL$i?ph?n-y;vfr3Y^7DNl$jDpPPGWC?@pp%eQ*f&E&q2W^#33Kae|0;^0b52x3*1#EX_Pe3tFL)j
-6sMRyOfXf$fum{kv=_s>JPFxJJ8fzhnxwgEy}*^|mC4TMga(KD+v><v4bLlX=my>uLtM@3ZWI>2#!e5
-ZT9)3yv|RFh{D6oILW=k>kzxn=W6yWVuM8+E9oXFORD~I2|#x)Ka)<DucV0!WK3i;!PeMhkLd0J4rSb
-+1#$4xO&`tf>}Pc9JPFfd>-EEA<giw=*0P+(^bsaL7ZRQUwqp79@sZiTWNAJx8&n?@h0Q`R81MJs3`-
-8W8AkwPnkr5>@(P&AFFaSM{w%ApsMtk97*m);w~5HDi1fNtDNrKKv&sD)>UGo-7L5A@=XxaHh+%a73c
-6<x?cR&h~MMl_p<msC4M)E-^284{evbS)}a=mtGq7jDhF6>y2|etU?HXAy1bC`;q^LQ<<Gd5{)+ad@s
-Ru0c4eEb0*CYBcenUmhu^19({HBsnETu{&9ISal+(4cZ7Z*f^XINZlQ><{BxagxpiA7^P?spul5~k0d
-tD-&p-X&7d|u}2{&)*Xllc02Ns|b2v36%i?{T{lsIiqm)oExFw>HoudRNMt#4SRTh~QOQg?<iJ=c?Cj
-c897Lg(eYpp-Ehf7~-|6l&qQNKOQi7Tb#_hoR!J}BGmlKGV2n&x&n?>!-d-K_;pF`w^dgA39k^LNCa7
-|s;`o6k9z4|meXx1(iJ68<tS3T+#p4~SN*7x2(O7V4mH<IGV07V*+x%u%{2GY11g0iq1W1`LVl6irdC
-eZWM>a@ep#j9?@_hPW>;4&5(&GSYXVK}GtI@0{-%4(d!6NoR7O=f2wdYQ`T9z}YvBtuV%0;!S3d01Tq
-COxq0*V_FDxeax!%Gu-F<F1VHxQ@x4lp!f-Q(%G=*X1g2VQTS{AdUc4*F37hPqtGu)r>5!$33iZ&4Uo
-#T%4D5D24z-a0F2KUl4G<h~d8~B`@lEl>(QN$9_y7Fzc*A=DBwu_=V&=yMfyO%9;#8LyoLRPB!M(7X`
-Nzx(iXLTjFjoJH|TxEC5HjxwOCYK#Td$`N_iU_5as@^iDwrmA5b)S0;s>74E^>a9y*Pa)pvKcQVKrd?
-Lg7ayhFLian1|)PJGz}e^WNrS3yo29i;6N@22-$|;nTM-RDf-5534iDsp9bDmSNFM>Z(`$;d+GbmC|E
-G0-<5$1ewz>5^-625<6gJ<rTea9<rvu}S%k5tbU#q!8`cZeBK(ueOHrap)<I&s3<(l5+{-qjC0Dy<mI
-*&8ghZs&^;88y6Is_L#Fk2-iS(0-)uxF=9OFGpy?55}N7b)TCayg!ni!7yv@1gr#&PgQ)nO-D5Ba^&B
-Y)~3>mj!*ddMFko7Q9*bD@Xy5_-s&gdS4#4`rLdIL7gETYv^K#fB`^qBZ8KXu@-+3+<yQLZN*GCuf#9
-LHj5=TBp6DQxj-kbygTix3?7OH?wh(q;*`1#jI~E(KVLj+Nv)cFzKV-W1=Zl;!3eb^PqNLkxJ?qEc<3
-(6MDm-@{N+l@bqFVjUnk#Wu@z`D;mSPa<|k#V~EH?W9TGn40lnAi{TwzTUPp1U8VEQXh}k2c-h7t<a%
-BNL5x&;jo}KA0*&E!ipEfMgHQ;H<WlW5hMDGVKoly&llCF(RECj4Whlyr$QvZJ*VL-^H$l#2(Pv=%bV
-a#%3AN#4wSvXxE?3ls2gULsLP-ikQM*#<OA5o8SSQttBu+hm0uVvX6+`L$;B|2oJGeC!8pBehKXos~d
-tKW$c9JYQseGV4j27C%=-Q>#?PNbHT1A5>LdnjJY7rHR<t*!I5k-kYi)iDB4rb9MD_TUjLyIUlMAjmL
-i1N+Xg^o@PH|5e0RHsNpfk=u(mn%dY6p0J3*Ha{-U?fFiDH0O8M5S>^eQ25JxQq`AUE-dSV2v@Ei}q^
-~94Pfudzhv=Omuu1wni)Y*ER6!rVj~?V-u&!QjViR;eDh=%Ei154T>sZo!AZv6xQjC-meNJqVwdw)h*
-XKkm+6BWSyh2&1Chc%(C(WBKcEt@|JBFsJ%sp>Ag+J8G;qpxtYAG?~?|l$!cj-ddRv!D6U}Vql6CZ8@
-?HFEZZQ5Syp^5+QI>;Cqyvo<G(A_3(aAF$?9zCX%V?pcbKe^(zfh+$l9l2>SxW{M8{^DVp$;urjteK7
-Qy)SI%1^<UL)GzgVv9KlaxB83q{2idGXC_M9B*DM0VDS%bYuHLx54GCyO^!_cND^jH`P{En1?8i&|9Z
-5)rq^T0^|BnSL@s#s_4AZYi?V%MFXnybZmPP#eNx{Vp5Bop2jv5n`rAv<i|&{H~OhO0wu4Vxz-VQ-6m
-H3V8u~Lzu4ar4GM0D(*_1u5F4rV2Z3a9I!^m2E3$WMuI~G9armEFM=F`j5V^}5Z8;PmR3w3C25-qhDx
-UdTogADN$NKD${(7T!&-7vfP6zPR>MvAnXSy|fgMSv*2$AESF4gI|6c8sJoyT5>v@C{cP;DG#IIsZ^}
-W_5#WwZT(qd&(tnCg_OQK2~#-{yb<```YfkU#T68gqp8{C2<sr3TQVH$4KD3|qi_Ws1^5oc7z-3AM@T
-N9dTR=2e_ufw8su{i3*{^BcH4d-dSS|n*8PZim1SFNXy>tH=9hk4f)#yW<q)nD9t!ormp72*7;#aSg*
-eI{Ym=PL?pnWYjJ*@`P|>u$4^KN$5p8S=2o6fn7&b>Sk6YU670-u{-0WKB+G<IeGcDrLb(!*J!(Ib&y
-$w)BaMthOzW2}ZmmaTw7#>#`!8NN|$SpiG98+h6V2=s^sKE8k)1IcYwqXpKThJSV=uJvF(xRb4J$0V#
-Hh;<J$E)`R8JDQCEfoa@}nwdlP3w;@@4%z@)X%1oy%&cek-e9L*!-TVy3tbxuBrZMIsnzRNJhNVcz?_
-@NUgmCM4Yf-qAjXPECgo}RlwanTZ6*ub?Gqo#!*ezM28)+IlCQF2v_vot4mRZLwrqh&u!a|gQi15Q63
-Pw|DZwb%Jn@y-NPrEo>EHj-m<C4i4gR1)Aun^pk{Mvlm3coSE+)czNbC7RKwzQhPQ_!@tpxqvwGc&9B
-9-T`woP}ww&{3r7uPc9aDVudp;)FxyGhHgrDD|}mjFW2JcS9;wXZ!8R%J-sQ%*0|~bL%1tu$R^^uu6&
-bBTJ$Oc&yTL#A%QAW}!-3<34946i?S6r5HLXH><QxO)>xIZvMetd-LHmlS@^LHZ%h76`zN;sjPA|pLH
-@{QyK2Rw3d54?eR7-&))apX|8fMxS3BoIqjoat=C2!O>WE8<h_{8HT1gJpMD-8m`l+8$bu&GT^9^=m_
-Nv2!9Yh!cK#qo^ByPjUXl0#TjJDd*}{rY4(2^LE&`!mwuM?Og)#3z7+mZ^zVq$Va3$k1<$Ips9Kk7q&
-j}6?>?W|pEIL;f^Tatatz=rsJWu9%GB1*Ok<80vUM91K%o;Ll$*e7R#zCjd>7rAOQW_jY_a^Ws7z~$K
-)x&A~cP$2n_I8PS*@bYdS0Yp#O4xFvPi^_kkXpG8yz1(p#f?jAYboFL?;zi+Ur|YqeMiu%)X6oePP|b
-k8{QUmg20O_$bOE%jb0WEbn1R&{vapwFQW7=h|+u8E@|K<hpDTpUnr!gh52?N7u$uSKy`KYi<9{RP<E
-e#b2;m${RkP82=WQ06O<6lM`8r4-w}1wiORYYnVw{NlG%pLHe`B`=|QF&nQmmN$W)Q(Or~@Fx{=E0L;
-BrK@Hv6?9lN?2=tNlC)rEMkUk~<f_3AFu{X)giWLyR6PVKVTveSIFxYFus43a;f&U7z!Ac*q7j~YK3{
-OItLgr7(7lV4tjb~xB{xb!n)kY#73)!FD??L^2RetDe7VAB=zS$AV6%TB+Ol|MNeRb}nV<DBD7HB`aI
-CiB}z4L1ETX5=o*@vA4zyF9#)`c(|G93@U6KZmGz(;t=9h(jqkKWM5MT{QwdRx{qV6Ag;1(ef27THSh
-cs%4gk_L8ZU_IhCpX(idQ%#()B$D|i0>b}JNoW+H$t=p$5-@1;UCcfQG;U-Tk!p2#Y<!JX(98H{QiEZ
-;9E;P;5Ru%?oFB#n_`R1v~DORUv#1;)}!8B!&*g6Sm$!o>(`7c=MrdU0-*QcqigOO`D<a)l4bA&6E*O
-aU9aqs*l@&dSY1e#cr4&&0Xst6;r$cb)4lT%YBJCrB38Jb)+&P}X1zbj58GPVgB=jL82KK@NqX+JS;D
-|4uRPudP;u6fkG6z7*{FS*YxfO*}0-V~e;MWh5jEl8;vqkJ~p;L_YD#fo(sMbsDpiOcRo=&6NDVYV$4
-h3O}KHtam#vHGm#H}8uJRP)`M=;n$KhA&Z+R(l+oRa;p1x$qw8)7!cQaTV%fTbWo8r=j5Tf)Q=z4tMB
-GLL08;x~JX}dG}Zk`Sf-tzY1NWYvs;jwR|$OF5~sr-aV63a4D=qGW6YL;=(p-&R0;ETg7o*Wh2f*S27
-A0<Dw*neuW8q_m6Q9&^2z1!az04!~0^#KiubIt3t7g%2%i=#YI}llU2N}*AaZv-!?()P^-ly*49Xq?T
-Sf%6L?1O$t0{NAeXidP;ivR)|B#@&5E71mkiF9UDb}3JvawKTvoqJR2WbTT#DSMHz__^dc}0eV!FspH
-3)J<C`l+h&ZL!57>rXLPl~Gxt%r=bX4S>i-1@drIh@XXke8V*S8vl^FP=J+vMrdBT*m|{$2nJS1$Lhs
-gO)_D#U#?>dnGmHARY5CcxhSe#qK-HMqGx*{C;b)EqUu0W8D|jWladz?xxG;o0J+(u1^+6_F0i=^_TW
-peI>5KtAZivgXO&}VpCsv8%e%yCX1m57eskER;0Rbnc?idy+YaqeWYggb#do>5}D*+96%<{o9hYFks0
-rU>C8;wC2`IrmS*J%K3)r2m7JYj^0CAGR@J@gyUr>3*s<DLlI~nw-J;H?q-#kj#Br0WIG}ReE)+%&R>
-4Rt)G@mwM8th|kp(stz*z$t&qxZ;Vr)kezEtA)B=JQ#6eH&IZ8Ae*Rnqm+$tglrbl$pp9!{k_ZyD0Y@
-1*t<Q(H>6eDID;^R@QVoHM19psF8y7rn@22ShKp55?-6DP%Dy_C^`|SQbHT?Y_m?p;}!&qIMW{DI-+F
-l7?CjHWz2~NCAz`^jjM|t_E%DGTIb4)!OGhu}Y<ye6O`1Sw~%Q@oyQ$9F46eJ4|ZJm~OI@by2?HQL=f
->P>vLr^v?H~t*Y6<Uw@4y*d*(shsC%3bzl6qwW<xa;@LG-J`tea*ZsYZ2ua@2dSkjx@*ipr-#|FrG`U
-!xqL#G^FW^8)Ke~SxE=H}zC)$asp~SF##NH(1S?E9a+v(4SmgBIGeZ<L!yYI8??!hinU%AiF%u+e(DG
-Mue_S)4KExVLeSKX?Nwv6zU=7L9yy3oL3`8Y1v)2Px>6<sm!=a!w`m4mfAXE~7U>{&LhCS;tKsku1YA
-J<jKdRYSch-0Zk#`Q*T<LUl%1(c-DA4zBMn7sHg?CrUzy)I4;7)H)T(UVX6eKzvyRdbD_A*ehiQWcJ~
-MW?m4W>76!cGIBHX)il)09!eetSiP*X^~UYy$q#qu27Z5UdGv^mqW%~Hm*+<CuZWDHXPaJC7p|V8nSw
-ThDs|rSqdOJgk#ujyGuGpR~%<rn&@G?-x8~aBNjPAVr$%=SS=ym$v&dE*V8hqMti+zfF1IIKweup?Oy
-9^&B(u2d)+u`uPZP&?^RWINV1+D+You_DhUc0Nqrt=anUXp97&R#95POAa!yXJZo*A!ab<N)YBDGj11
-3?BYSrHmhjm`Ij=doU+EL~Db2w=$vDWWX>${_EN0HQxO1;eJ`FfYfUPMZAx^;)!C0V~0A7FSjHV_RRY
-Nu!fqX;hOWX}bi>bO7+E@&gTz@v@}I)Mv_1@OUcaZ%W8ei64P``g$3q^7sl{i-py6yNdElg9VUog<Sb
-vt+A(xoEB^A5a1g=p>4<6;YRzEDk;#DV18X(A-Leb>3E3mQjrq)*q0#OkSd}8WdBt5Gpz~R!k}KiQ5x
-!E<mBPbqcicg(~X=VY*qz2-CxwEX+362ZiZrjfNR$4HK_wtG_V4tbK&p+v+9EKGsgc)L7dH)8FbQ%uZ
-HkVFp`ku@R*(%zAkgFx2rvowZ6h#aPb>bFlR*VJ29Q2s6pLUzo$KmBJipeNUKUts8~;i1k%rW>{AVbC
-PwbFte>ogqd$G6Q<ERTbR?WGlV(QI#ott3&t_)1h{U&<rmhG!iqh6)<j{&QCijk!V0<78YHav<l5RtS
-f7KntFSJI^<H6J32Sp<T>~o<R-Bq({e7fuAJk7HZM&Gh6;^D)uzoJA5W}qdg%tyeb^AyeWo&`6ZV(>t
-iv3T*ibG7T%Y^k5tWO9ldKv3nVZ|LH))~Tz9XQrpVLdPC7gn)HYNW7U6!Z)0WkJ8N)(HBAwN}tCtQZZ
-gU4<1lC0OqjR&4OJHdj!_eW=zOI7)R3PHD3KCai5>{ZUvwVLc_R&}LeX2&)>_J;Le*>j%Qx8`cfN+6U
-IP!m5FFnXvl9`h>6s!#Y=3!(g2utU6e8g*67&3Bo!U){&_)$_aRj7amElMhYuVhqL+%>quDd7uK<`-Y
-2Y&z}i|Q;`#76`(|exWoe>y5j*T?biSA(&ZKwNx+KUh-$*VhtxJ;ZazJv?XkDhuF7FGMLVs<*%$Cvyv
-UPB&pOO1q><zUHbkn*Fm*dTmQu5HcjFesSC6_i@m$9<T!;*`q*5wh|B|&oOq;<)VT|y-nwbo^l?9y9u
-@zT0v%P#jyF2P!t64}LBatYJA%#~e!8zG(DuXUL(yPTF>Vze#`WtW4J%V4d`V%g<G;Zm5O4R}hX{<RT
-y)DOjUHO1QTaZEGZi2hOQ=9t=By|Zi!wnN<1LTIT9cMykgx3IPpp535jIkV2e*v_2k%+`6h&&8U7Wr)
-gr`es?nvVlkpKH>!U$&TjJ7sfQ-Mb58^dw%;^eNyCGfsJm~9x2L=z%6jXlIEbaPDjX|`jo6!2fCqYq)
-Piisk$u@<%1o|T3Uv9de?Y=QZ~f7loxeQ#euliYun@#7iz1AnD?nE!>VvG2X(_7siXNCKCQ1bpYCEgQ
-u&AU(Y!diy4vMk?9#iUb5<MMCgbp-p;ps@I?><Q7x|7;WtMqXcgBG}waCtLT{w-awa&KX8#1fb*xXiZ
-)vlIZ;#6aCeRis4k67w(FNLgPIbuFjT=|o$QD5Dp{CR1;Bd-a;5D)rEQPa=ESnqHpcnC`%saOI@Bd5G
-f9sT4c(NEzc^iz~i9uu)Fl80rHX;>C1&My}|b-CCL8gE)%y5AT_RR4tQq1)N#SL|9|=uuwm5pTL+KI3
-lmvQ*-_=N6WG%i5I}I+qta$C)nSI07eQQ>?TN9294|I`ZMPal77!0@VAk_s2smJCy+U&Tl6IR9fpLG1
-zozR8@0jPEYb^X+=@<B;1Vls)IB+#E_h1o8s}d8X;HLJAV(&RlXaD9?J+ftT#C}t1vb-?{si~-Px=9S
-8B~9-IBYx(qTap;kC!XeYLY!!7o(pyVVcd%h#6SUe1;TFV)qZVtp{o;uz{+>PL}!hNe51dNey{>|AN}
-2#s<ywI|0`q3KR04|Aond8c!;bEeNMG!xvlxMRhU)8-0?T~~KPCNg?1a3owPnI8!OigfDgPV5{tuF16
-E&|301NUnR3{zsJlHglz8_58m^pM?v;+!VroEg#4w$}nG0c~eEWJ5_ev-@I~E)%%xl;Ee3*s<^JXgjs
-A-(qt$4pG4^CCVBjXg8^}x^lD62b}3U9%BJQfbtKYB)KaH`Q-j?K@3ADRGR+~(*i=VEXk*<Bzc#2YY5
-hFelIYQVzcCS*&vM%u_0H%mYS7iQ*|`O-#$H58ccR3+*CF&rLzB?&ra3zP5W1IayU4aD^t7ot?j%3rw
-?Fi>u_?9~a)aa5uPl{guzuL^d`28Co8aZqd>>9{H8sW6<X6w^^kB(X&&b;jGrZb3NwzaiN5_yC?@>a8
-{rCA#Jbg$|3MEJ&$RwCfu#n&-g6#w+2rd#d`JJ(D1i=Ie1Y-%Z3FZ<!L+~-dF@m!Me-PYrg)uLJK!OB
-<M+jyTEF*Z6;26OV1Xl<guQKLA(2XFFU;x2zg7E}Kf`tT65v(M5n_wToS%MmZdq}#wkDw1hC_xOtSb}
-VVIRwiHHWBP5I6-ik!0{TzBTy4)2nG<O5R50tCYVmJfM6NH7J@wl#|h36T)rli+uOh2T9!c_bnFk4j!
-j&uV;^kNv0umNY<|!0)iG-a-K~-6ne^i@T+o9(80=w!!M_lYG<=cT|6unhHi7;M$bAGG&IYo+EZENO!
-va|XixugNU_)3Oi)Ih87~v9~XNaAiWlS>UP0$xm0y&h*1eV7POizFPSO&|cKSu8+mdlJRi$ds`n!rGR
-2&We5wqVVKIh=BOh$YjXeHh6%nQ|V&1~uYCbwaTcS(FITm_MFjM2Cj?(H~s<QaBQo=ub~L<&&u<$fI8
-q(EuD1MUDw%14S9aEmNeMBf?H1Y6{4fPQL{rmGMOD406e!Gz{dM%O=uWE`<Q)g(8KzwBVm5e9|di7JF
-0<mq+f+s3es15iWy%CkTJNoTr*{Gl}%!ucmzSM6U45r@w4l3@OEa<P#^Tlv2$h*8=g5kW(mK33t#1><
-l6&6S*Qx9#O6q>1B)X5@qQkXQiC_3ffSXSrkT3IICH2)}LInDYg4W>46I-*l@Bh&-6x1Dp%kL?wKHJ#
-~^Sq)QcG-a7v`OS%OZb&XxN1wbgen#V`u~$Q7kEk!V#@4*3*!f?U5+>e*yU)G9S4`Q+G@Xv2Jb{)De?
-t#7?uc}G(^!{vH0*nFfC&J(4E_Vho&7Y*sq*yvDjQp&9{3NjkR_oco=iEk1$I$kctJCy>;0QlY7UVT~
-6->koBg2Fquv&QlZ{2Td!OEdmvegU@p@<mM{-9id)pjal6Mq@2UX^V9!D(U(E4gAwYs(LnEVBTNmDCr
-F~r_|!D`1`PsJJxp|<))W0mfCZk?2lfsP;g`8>DK2XV1tw<2+T6<c;?Riy^kILG@ee5+{<N&7H1HtX4
-v|GDSw*&-{F_~Ic13QPM1?x(yeQUDAPQ_54}Y{I!TN<Xz6-e*-G4SYkSn#)z97IhY%7EqRw)}yRjaA8
-oT<r`*hRkcOr#QQY^TIe>Hafb*88Tsr5)BPCmV7iI{3JI^_!&gLqf4km6+2D+@*T>3u?n{YC8XS30rq
-F`Z0=(2$8~?(yR~)(Y-q-UD|sTf_ZJow!775}EDE^dz$bnd^?}SVuC0$rNW;exYNy#Bd#%UC2EBxlTw
-p)5+{g=KRle#D9!skU0Z#7@3cf*@sN59D0!n-M=%LiK1;7#5j%d7qq2_zF+ATqM0}Ssj1}ZOIHbG8&5
-G&+A{?0&E#_EC;k`<qjE#a6Gf;TdF+*9BdsZ-G^f#Tgj_fEbBMLIh^`{-q<X1^3YvRU43pr>`$ZbPb4
-}UVWNm_f2a?B`Qxn$2(Ze}5Hr54CfQHgRKy`4^NLLjL(r8kXTuF#lqso}-kx7rxLxq_?ogNj1V6IH1B
-11)gt}6E52ao!ezuvaLTm5eR8%#BGr@y(4{M8RJ+wRZdF8}P~&$0V+yvsi&uKGV+{Qn0$x7O*T|7{L%
-sQbIyryd75)crZ$<zF2K{JVdDMnC@A(4YOAz29AvEYn^8{ch>4qr0JtxHp}Z%${SOTRQLY`DF_%3(FT
-hv3SY9o_y-*XP$j->9XgSuXy3bm8)J_y=LvpudI9Zwb$3b@#b3_HopDNrp;TnzWd($AAGoN`;Lmrox6
-5_v}f<W{U3jF;M0SL4j=jK=;vP?`||i#Cr+OF`kQZ0pE>*8x$l4Y(OUIW_4%KFxp48<-!5JL{mRvvYk
-yp?y>XK>2S+DomnN>Nrp=nWwP@+?(dwSoZQ9=3&a-`oj-5K+*G1j6TX(M>J$v=O{{inlef#y-`1tzy2
-LuKMhlFaw!XqMe>EkD4=rboy%9=bSJ0~|Uf2yItXeyjGea53>#*TY9?UCF2KQ?n#QSpD8{{M9T|91ID
-4Tz439XM!kT>OIxi9;Sr8aga__=uF$k)uXS<$rts|0BvDcc3+wd&JIUcb4tX*xAd;uE-6G?Cek2*%#Z
-{m)P0=WoLiV&c4a9&c4~s4(&rzDLt_f??IBHhOr^^n;=#x`mq?YC5W&CvkL|q^m>@ddSgm@wn^9r+1a
-DAv-2h(EIG>SZ>d?i8F|x^jp@d$yj-}CD9{@o8b4V-!5EjDnP<om9;s5Cg!BSq)C6Nzp*|@u-;^)hq<
-1M9mPje4Pt*^{o1V%>uw;R4Lp<>`DJhv(GP{HXI;VLh^X8Paad9DuuC%n2DnO$tNh+C7(pm3b!AYqlB
-(ITBmz0EE1nS-;^GhfeBe8DMq)953>-7BmY5Do}<hjB07fKQ(WXb}uLP@f-{MUzJ?MeDm+gxVIe@wXd
-7w-LK7e?}BqA;UmGe*n=rL{ZE^6(5HNw%<o+e7mDlj4$0X1=_}qqs$hnU6`V1>lJn((eqL9dl19?|iX
-3m@ROGj6MPP0J4GPKVGbL)yeJgVg;zqMZ#CXQNc^WN5MhKTgg|-XNE0rC0`{^B_E`dE>;~3VooaIFi>
-Dy_l^}Pgeb6cOBJ)NT(JtJxDKaK_V0;eE?E~RS>R^>o-SyS@>B9r(pJ(_(oy2$eB{uaoX`Tn92xZVQ7
-6))hGhmlEHSZvMn?Y`B9kPl_9%iF{RDl^c)h6HA$f&1`$H3qd9Wty^NosQlxd==zzF4Pwn!u1lq)JSD
-&LSL>M-3fLDZjqyup-ikiw+r3M=J<^pP&oL|RA(X;8cwNCWW^7jal}y3u6FNEc}gG-L_e@JS{^f$Wy5
-&&buwFT+ieEio@wI3$~7Gu?=|h==e9hcNIL<@`TAEd0r^EVKth2%ulU{{MmL#`J8p-eAZxsIzj_+3BX
--36u1OP<4+2F=;gj4n?@EY<-5>n5WLm*XOGB)AbWf#`N*osEiT0u)r^qIxls4t~x!R0%cHm)DCrO{p`
-XR^ywMuOhaA{g%;6S_pVZ37N0ksaIkfi>ZvBZVMbQ&M0KXf{1*QLz0qjr%?gYeL_&rsKRauJ6hiS4et
-9Ni<DTS41<<%(9o`cNaid<HFZK3nQvtH>)uW)7UD-_38>wirjOqz_8G3bIrV<)+f2@5;eNgQ5d>Ry_7
-*dH*_?(<{vQeoaSt6rXKPuy1uoX<wk54DZ?5tdUKc(NVOG9tS$;wR^1wkYdvVEtT@(58XC%bC8T|&d{
-qD%3nWf>=-s0xhf20Q1wNUp9N1XZ$sBlIdbOFU<vPQ9=hdQpt_{&KO87(TFX@U7|g>fTG8E@O_;ua|N
-oc=YPpi|C@Ee441s?za?oBXMqD294CKVWKHVpKB~o_tqCutI5h#>vQsrGw#20KI8Rjh3V2EXMpV#1`&
-mjqtD5s{;eD9K|Opo8h3k$70LSV(leO-{RewjH~gX#veU5SnB<SPu+P41aw_p(@jrBUv+&)Qv8ERtIu
->$H!Ppe4&>3S%7J|T2Ft#8oCqG-Crt~Lchv~ER=>__+(Ft+M!Ye`c>6f1|-Y(CQzKpHxPXgW4#&N<2g
-)l#tP38S{Pu(5;Z{Bxj|6b}l`<uGm+5fTbclICSRp0-Bo&VcCbZk$L`u>L-#6SH&egBFE{`r1)j$ajW
-`}|=RXmz$SjwJi-=(rMg=X_Sg-`T(Q=sWutjH&N`yn+AB@pZUa?CcH0MP$_Z#oO5%(jA(6`~0R%)v=<
-fxA(tl(6Q@=JJ-uOV}1XI<(Xc1=kjQ8zO(;t4g4F@SF_~K`Hy}2&hh&#y>tAxm*3g{z?=2`_cicevO)
-64^XXeUcK$cpD_es-7>612x?JbB9eY%cutuN%?sfV1_PVrpu-{JdxC6~eqorXdfkvHFHr1J?!*+97lE
-<X^EnCN;g><A$g{d8g*d~L4hCe06YtE_ZS;m2RhGZIUv-NV^i4-zdZ=l%GdAS97+4^XsAv>0aOOpEUW
-l;qMSrc>R6o%*3Wy!up4nR1Xgaq3jm^O~&nwXbi%GM7gX=F%x4k6CgIt_&^*(mN4of1vi#;gG|jQZhu
-saYBN=t(pucv_~&7A}hBH%L3#m@$}21d^+xqdb$3h4{=^UzCp>5mGn<v$7ajwA9N{hq37FyaMIz!PsF
-#ViWv)`(<R)lqS|8*=V5uIKn%5a6)QSQk?KO<TzNLo-Y<A*eAj+EkgXlVslBLiZ)~!DU0l6!W9b;EW{
-~6pI)fH#XU=+!a#K}d`3P>XI_Jvj$%he`t@rY3pa|iSXbUhok!$O5@ck=PM<&%HwsAwZ^YznEz0Be-c
-E4^G5YbQi4*mPB!j*H75<%LTrQ!To}Kk*L&T$UGm`VOa-;K16z(UY8M0wgUKVI)A7id(_wMOD%$PkQm
-&CdZ_Nkyns!b|gM|s62DkH-nDDbS~7^yy}M0&WSQtpC-SRSa5e5B0TC6pKZP=0KJRGuVqn(|Rxsq6@0
-ldU)2QuJ>-Cui$v9$MivjOIWhah8eHVO3CPt#9RE;=ObS)O>7iVU{5;7c!+(gVfYoxhPCKJkQ3-?1X3
-?jRa>OIS;q3U+sn6wyw1gZ?+Y$J$MuBc7bYzP@@=A^ciuvG!e=Xt+N2Q+wuQLc5Qz6B+T>TXbM$rADg
-O4iT#SyCX@6A!D6`+q~fI_coHQrJZr)fxx6cH?Mo=(8KT^06d3h6!?UQ23Pg>NjXfc^T{xt&NT-Cnbm
-HsrhIGRWqW?3&55x3Q5iFB<Uuv^SjIFnOr%Iq2N_7~RZ7P_A#0Ho$GfCE^S+NL}gz9FKV2?uFAYk-RY
-$EK<h`XsAvob{Qls-|<9!F`}^&ZX?LZ&9qFi?-R2ffk`k`XpGH{+p9iA&-g>(&{8J&m(c3#E2KW0S<K
-GS;cAuTw&FB6*4`Pi=gx{O|Ms##4b~$z@a0Ov#VOtzj{rbGX&Hp1<Qih}(ak|NlSWry)P+KG@iPM~w2
-0FTE9Ba*|Exgs{g4H*4VV037ZKeGQHcguX^4n@wf2ne5lx&hK71E=+ehT@Tp}`-<+70q$L8_W=1lN`8
--)-;?Ax!({hl*-VwwA0_9VExYG1CU!qS4}iT$1{v2Ta`+M%=h?D3NA@?%{&VGYa0>@^?7SequafauBj
-@*u?7mgT@1X4erR?wNDwTy&X84+;q;4D5-+CMxn19v%cK&}g{O$bz`~3aq&-O<+Hh7%mM~SaGrDHWGb
-u9mD9W#8Z6a2>Ixji1W%aiTx^ZVp|-Ce=|&f{_0N5=lP&;JsF|HIGiwMCNu?X^w+S-k(r=l^vcke~m{
-SpoO-I5;}1aGTsCb7stuRf_E8ZzXfpTFIRK;%RL4WxApgVXmX_m8(yzR^KMw**7IqC!3q^GJKS5ZlUm
-pUOM+u2lo9-)|bZIKK-Iq!ZwryprI!oKA~o5Cnlfpy*2#N<KLXV#+Xl$6cg*HkXhze>DXL?5`vio(+P
-|O`2>>)9w8V>kU*d#2qx%5(3`-EKuyqzz>}a2fd_#bfr`MHfDzPMb?h>MmEbhNajO*mFq!)ZDhM_atS
-4AW@D#yff`tSn1la_S5HxkJ8^cG^dlJE50v$mxfrg+r(k4(5)cmMp=LilHR1mBuSVOR!;3<NI1ak>y5
-*P`x2{H)A5)3CuAP6JqP0)$JLk{muQ1b)PL-0AlZh{R2%L$$$SV%CPAc-K10MGxF?13A9{>gU-b}Ozp
-<Ux5bUe}x<`o1IjDK2jQ!DFN`+<uPNPX-;u9p3TJp;&%mDE!Edw+G<jAg67Q=S@4=K|Bw-G`Y33{`>s
-ZN7{4eB<5SaX*$x9iMdJ%=3Mio>4{x9S5YS`$sN4#E}4jTm`wOv$;3R30+pb0JjujdOykfn9S5=FVQ?
-evNdJ*W-0@7eV+ecq`L}U@?l$i0ZsY#$ZQS?W#{Kwh+^vncqi?Grca^UL!-ZDo<jsy3{T&!ih*91>10
-C2pRo#0<gae!8Qup3FhWvZfy&uk^caOUF>5o!)=eqaPMGj&goAN%m*ny3<%MS+(s|j=hOJxUU<4?bS{
-n(&EgIH>6D$B~sVkVPGs;H6@`Y&P6J@*`Y<&{_1d+)u+Dk>`2mtTI#Zr;4f<fdC90@DkQ>!FG069-D%
-nET#o(+-K(L;ON*iCgWoX)|Xczy*Gw_7FdCmAv=TyNX^eK({)L9=ux*9XN16yo+gtiheHe+Dzd;ZRSP
-Qd5X;U$nVn*scH~EGqYBDFGlzShcYt{?UmnaCI4)4uf;p1UrYXYC`_@GzVx1bRfIoq;Lsk);i^dgTjV
-djQ~sP=4nb)OH{e%$=-RjRb_M<d|2ee_4%8mFf;8}cbJ*B83Q(I(>C?N*hx^;yzx==<A|VsyqdNY^?A
-8~gITQ{yQr#%^ZIy7~5QSKX;!@SVy38k73LxHVK0UOi+xi0{EP&k4M}_ekiZ0dw2>*kthaae^JycR5!
-XM)N#)us?wZa?WseG%J*Kpx2${$HsC2xcm=RO>lyhZu~H_4l+=F5-d&1$<;6rXk~i6j>2Vh2tH4kb+L
-Xl?@zaya{Vk+*?j0$#!#2%HF93ET;~aPYZ@%<F%~=l=fwEHN>WB_}7dM<0E(9*-|xyqLZA+G}jnrcHv
-!j~zS4zW@Gv8=vQ6xn%?Op&Pckq9z{8e~fR*+`)=>T-cF0C65(T6=m+=ym&`-8gasu;$MDG+d`J&7rr
-0E`Sr|M`@bJCV#JQj1pn8`Oq&uv^&!qTr}3h)UOUE&NMpr(^^VOWkluTXkbW`eKVQANfe9{tjIp9FUA
-Tv97tWkyV0Qo|jH?XpQaPcFbfTQ@{Pk9k9zB@1w>Q&hG%P$koJB=NvADQ6QFcRz4rM7RDQwiJQEc3}a
-jYm~Ae%UGBAYyUGRw)yVFrUi^dGZk&0?!ek?i$H!`VAUT4tUY%N9<FW>4isvF8ms_QC8>_C`q@TQ++<
-+xlES+w;VO?C|O-toL@#`t0P)XAftQyEzN^n6t2hoQ?gIv*^z`d+-EjL%-#$fMCQ~&c^)6*@V-ajX%%
-X?AfzfSy>rdvSbN+_St9I(xpq;^5x6f%9ShG+O=y%{chN>fo<NrS@dNee)u6fx@!ZQ^DAeYFLL(LM<2
-2M`}ea?KmC*)IdX)3{`u$Z#EBE^>#x6N7rsBvj{e5knKNeuUsP39vC9{JV&7fk?Bd0X?CRC4f>-c3_N
-Vb7iLoZcG^)jnH6y-hPK~`KHDEQrhlO(=Hii#nGx${Y9ACmV^Ns9tenja{SsRMqjpA!4emKQXp!lOG{
-zQsDows5ODE@Ma|0cz+p!lCr{Bw5kds2KI#UD-ajTC<o#ebFJ@1*!gDE@JZ{|&|ej^bBQ{0kKSie3Ev
-JsC?P@i3pJFN=+gZCFHenpbH|+eMA=vsR2B_hJ0&p^TrK%J@%97{9oY@hf)m+fe*&6kkK}BPf0%#iz6
-`W>NeZ6n_E5UqSKTqWF~*|1*mJy<L0~K9Z;@=aaC3`@l9dqxfz(KZD|{?_oTG;*X{Hk5c?+DgG9U|G8
-a!){-T$cGPCOvc=4snr$FEM4W$-#WCJ$G~+(`j1Qg1_|)Z$FL|5sjr$ls@~vHbHN_94_z4t$JjI_*@f
-T72H5C6Hioc!W@1^*Z=aN$t|9gsm(H6fCrSKr7kVPpxPAROV6n0YzXDEe>tvLJ5hqKE=IlD5Iv#U!uy
-S9<D>qodPen*Pmm*PiK{9zP-0>v++`12|LQi}gF#ot8ncT)UA6#o>(ueOV?l1rd1#qUV*yHfm~6u%F}
-kD&M?DgIQ7zmVd;O!0S6{1bNZ>pyAIWA79lJs@g8lvv+q2@mw{;nl5M&p|fdr~&bDaWOIR(UFl+F=>5
-!_v+QdYtW$XN(wP?<W2u^WQmDM^S&Pe1`Sfn{_%;?vGI|Vd~9@7<bbHOJ_yjGN4KuBe_Wz2Dn2SYCYs
-^{uYP^Jy(7}<kc>}^SDt|#J=>-A>nEk))vc?#`yj-p^yA~>BIDCKw{GuA{uH3M9H3_!#gB|a<mmXcj;
-&j_m;42eUftA$WSlMiw6<+pw|+2O1n?FCx~dUBItIQ`@Nd()^Mf*K2@fC#ik}u4l{h3mJ~lqB0}^QO*
-{<EaZf<U!5|9J@6U9U6cc>R24aETe=-9-#`1r)w#4hy$kbkcSMEU~~W8z~IV-g46*P*Q(0RH#)?wi1*
-^rJ-<N~xuVA%I+dB7GliA{B9BY<!|1Lgb*7KjEJi<D&x#@svh~fdgB&ZcPDf{%L_t(scb}DT5*8f8W4
-?0)<XC|7dp?_u!VA*!Y-4D&>J)1QDGF%Ipyt8WrX1<nE%0OiN5ljEj}AOjNilF4})Ubbn`uW<z8TlvP
-}eZKfNS7Si9NX%h#BR)YycpqLmRNsLtI9~Bg!@oVa&x+ji2qX!T#`};>n*ZHTV4TyS3+tSq~kgU;ZNI
-fp5F8{P>1bIl?!qHU+|L90!*LYUvkMbb~(=~6^@}aco#7Hgi8e{h9OV41BRw0Q|RE}|W-bg=2c$0gOU
-$i!^zPH3blzt2`Vq9!MXajG%^r>j#qCy*Zv-tW?Vgql^D~fB}OCnE`AW`wp$aBSwK%=r;35#qX&)r#0
-QRKN{!-ffYq)0!=CVRXxJ%Y{8ie=9kqS>Z7v24S#A{MldWD4r%27k#}%2`Qfm`>(1&pgAPfBt#4V#Nx
-!YSk*XX3ZKQE4=g0J3=0O|NZxctnfv}E9`laH#U&0uzUAzcJSaqAsd`K`z<?r_AEPh?i{PGu4d=YpJ%
-`QdO^qrzyJO_yK&<NTXL1Njr4xxx?Mlpzbg%NK{U`&yIeeh2D%wE&^<u|-OH>M-^6_Qb~cpnV^jH2wu
-GNz8~OJ%eqXeUPXl5S&FJ%KuwC4T;s;WE9mS8Q_+u#kREqyN#a}`3-=_HcDSq8J_g^{XzjDg|t#V2Sx
-ew^jp@UfZZ!fft9XxyV@82Jnb#zd7=-}C*>jPapTDH88_^f@m-aUHs>e0WIhx`34=)FVN?!9_Z*j650
-`g`~HW}Uh{(7S)<X8l`HfR-&<+}EjVkKX;8H|u?$?4VZnexScf<<^_x+<#BY79Bj>J<z|oO4Y2Xi;LU
-+?(Q9&n{;@fb8}TQIP~}E($>|%wOfBYotwHK{d+wfThm+f?#-Gu^``dKwMR#%PUK5bI@3Gl@7<|QukP
-Oc`+MV3M9TjGZ*MPe@2=j0zE1Q&2i3K!r0FPjXDkeha85GZZlT)2E)2qBqeK^JeF)caJtBgr@7T}Y#i
-MNLXkrI0a<2ay&)-?52fo-s(Y8yME+|w0K9TF$v}sf7S;TR?R8r!|8R{v-HVmc2|Eb4GPS@=&!=qd=J
-c9kzFTVI<DvdiIT)1%IhhKjA<wqKO&i?%K&)<{z?d8jtFVMX7+^JKiHtyZK*W%#d;2jng)?cQ{Q%(n4
-Qcw<mrTkFW7?|(r*|TSNGEr77?=r6Em@#7_1L+}q$1lJ9@(G$p^Bp^O@E?Etk<)m}j~zRP1uFjSx8HJ
-_e{=W~4V=c=udP;V714U;v(G+zp|Y~Fc))-GeoU$-Y{6;Aq%AVQ1@+oY2H2G?LD+iJ8DVpBa{Ov)YW`
-s82JasK_Eg@7s15ofji8{Qp1_ar68L}o@yGnV_uk`#AAk4VcLm<xfB!xI;fEji;lqddkt0V$IK&|t0q
-*B0&Wjs2Zk)As>(*H$vc;Os=7;k0^J5k*T9ia`HE_fBAn$hV+WD20m5uiG^+nlv#>B+*M!J6$|4WxHa
-gt@0bno6hfXZ;uPe1*{D=I2%<$UPSA^z1@UkN;^egy8YpFVw>pFDX|yn`kMNahhH@!aKKfBm(F`0hHT
-Y5n7mKlpFI{dVb#FTQy1yYIgHmh!rWa75>m)ZPLJhee3{SMeu#3VGQ8_$vS!6hNIQ0Q?m?6uSZqX;FZ
-1wgJ_-4eZ?ke+U0vyLK(4dhA9#F&8xK+__WW5B@lD;)JM!GiT0-ci@ONL2X!=M~@yAfVP49fQfoT+d-
-U9KKVr8k2<9G&ruIIZ{Fng54~R}_geT<8}|Jx_+Pnlh0`!3_&+!}xF`4+0Q^7w^i%%92On^%b51g|Xu
-~Lf)W`n)`vm~^ef#!_wsQRVabX7y=mWrSXeX#6;I`!#&h;lak37h^|9;N<e}sF4Iqz4&`LK^Uf9-qDf
-4_3&D7BSNe+B>T+qW<A^70BG8GaG<m#7ax1Mo$eqg+7`>H@gKj=KNmn{NcbjxtAi17Gj~XaU|Rf7J0y
-=Q)o##<}h@&b5a)4?4iP-#(&YH|Gx!4L!GU-tB$P7oFm~wzhWpU%{XHdK&<L1(do_;P12(v;*)<>NlJ
-ZI?j3Y7gYYBf$AXe6V82!hTJbXzf#M2<`K>{+ij|eyTbqK)vMs;g?@g1-G~?Ff(ELGTWA3;;3MGJ7#%
-2glsW1Md;|VRze{sAfzU&Q|AQwb8U}pMc?97aN;Cuz-{c>c@XtERxz~sF_pkjK{xoKArT+*2(|E)I4e
-LbVbCfIU0(=GDQ0PD#2cLoO(JmAd?E+8o8P10g4e`YP1HY7L2tUku$fptw8fpuDc5>c($6v>v`r;)$d
-h`gOdRT;ZhQ6gSI>76<<1dsy{4p*d9{L&kC*>TqQPA);=W#?sEYYyxXMQ)&uLR3(hyS%}*Eo$c^#C*|
-pwQ7+ois+r_3PL9k@r^cwKL=SvZ;~$nLM39V)PH3kNA%Bp{F@d1Px!w?U{HcOli;irS^<Ispod7J@@@
-kYSYx?9=IL;RL=|j{r$U9e?AxZgHIaL0lo)cH>5+M1-uSE`u4yk{>rp4zS<PdUnqzWG~gLm#rY_ihNN
-#fPavEIe`VL6L4(|$`=L*wKD7t+NnMGCF7HZxD?PIt!@pa%ZZ`g>F&^XmE%kx+i}66I3$zEkD>MLq>i
-2lXvl;yL8Dae8Y2o}OqG1KmfG3^$&#^?qNWx?IS&0UvJ%a|NJ)=+Z*-PcVi}U+I1C_t}J!=2^L^1~(!
-=L(l!T;3O7C|0Dn^WjeXaNlv4{pa>z#skO=GjsF&BwI-HKJiH(Xh%W;a_lp^GB+Q1}o>O-%IToeNz0%
-y7mkjl=ci7l=h51srLsWnX3))M?1s#LUNW3K!XAe>1eEtD74_&S{%aPo*ByDd{oO{olZ0qhV$Pq{=~o
-hL!u##Xc+S&(O}n}<K^}obyVt;f<KkUXQfZ-MKpB(pwWIw;7{`X!hnE)ZX~131^(z4VS;Bs17seB7Pw
-)oRpc`GVZ4RRfam>^5Wb}-gl{Ao-XI#*5e*+M&EuCZRNYl)Q$=*<P@M!T?OB#FdTnnUfAkj$|A&T#_C
-#GMfc6T!fg5mFXhGkP{vPuh^qUx~Ft*{@J|~#JM>K3M3gsJSYWaGip<#P|n);+AIZ=G!lmUExRx~$Hj
-ON7|G2CJr&A<8bu%N+S#^@)@7`MZp`g_6ugwG=24ZL6iC*Y0t0KAntK_71~A7lIljo|-X^CS2+qTyYl
-Vbd(4f!YGvGiZ28reUc}!(z}dc>sTW648(u!;3Ov1r2!6CxzO{7y%zO&j08$For>n0IXZLj=%o;>l|{
-C0`_%sr*?AV#tnY>g>+tN4&ooqCK{+MyhAj+CAVkvNvli|e1#!`KbIfLpUTzoC$gisg=m;ZG|V9yW)T
-f|8p;?CA8ow<0sh1bg8zxH=Yp1b^XBpO>(>i<?uHJ97R0q4d57<u8^kM!h7X7a(VmG0^hrv4UP*n@az
-iA4Hebh|BpMbG4GV~dQsSf8dU4gK=#!%CWQ=#J8}I*tzrz1ot+pp{0Dkl5&$rRgkd8aia^prVKU2Akf
-3z@~?=T1R59Idzwq1K(Bh&D_OvAs3j}}dd;$>M94S0l%LF01*!HOTn`1=XF^=Xefr}1~m(4j-)b8~Y)
-2Cit2Xahw>MS=!<{`#{zfr&QNaE{g3^X2Y0Z88ShbGh7}8$5TEe}F&ge(>PIs0aS)tFH>#3$jdESs5=
-ZEVR*ZCpzv_CwR~&Z7RBp_DnQ1($C!PX^(PRym)aX^_{#|uU<SYEsd{TyOv{IE+{DAMx&80T)0rQ>#x
-85TJ$@Rg&Ly;cw=lpUj<nR@+js5c+j2?y=>yOf6#nmb)l_2D>BAXxjiqYw(w{8fB4~t?j-9BSMcxKw{
-Ku(W@c_iMn*ODqoN*Odg&$p&_fUL<m6;tUS7_hdFC1Z)KgChd@#QUzMuhP0mcc14$NUd1Nu|&A;v=Fv
-D*^EKYIoEU*R9GDXfz*3MCl>?HPU2vgwIH|4-*%VPRoqiHV7`!9T?7OK9F7uzB<5_0)zr`SIz~r*mo(
-9PbZ4_@IyxKKke*!4JS4xT1~}zEbJ~^nv#<&w*Trx<GqCn-=Yv>cPG}zuKTZAK3aL<iO|ehIv9lLY`W
->bg5VeLEds(<|QR1JS8QCckkYv-+%x8oMdZ(3-CbOum{kfKtoyp;3*|-^sS$+7|%Z})zSDY$ru=)U!N
-7tw>~+MpZsJCzw-O<N2$K=di~+K=bqzp=gz&fWXTdfXU?48M~@!Ov$L~BxzoH-@DgZ1y8xZQ4Rkc51#
-1u(hr#z4qtRBd9)Woz+#n;N?m$Z;50QWE8<f#sUH?I3YP&1*^Yg!b?6Jpg0?*XcQ~_wy3JniD@Bp7SZ
-JMYDj2X(>jzS0U1^&vKFXjd?(H_u7&>kALcZ}Kga}Ug)*<W0LL)!xX6ECfrJ$v@&Xs7Y<@qFgYnW7#*
-1MnX(U;rOEa-?ua9e@S}K!Y;x#as;XHTWKQ!UPY2HhbQJOoi~&m;B4i%PVlxrcF;^4)J&J2X6wvOIUA
-)8}P!Kv&m!<?Ke6)n(K5r-mhOjQ4jD(oQ8BX##>6;P)zU<`UCJ4`eW3cvc5q$LEUz@`U`<S(Y-J*Ft8
-hy;as%mZQHg98c;r1H>CC<Xh=^_=Lrc3g16SJStIaAS)<Hh2i|B0=zri2*%bT(SsU#DZ2)Zo>7oxN+;
-37kb3HvhbyV*!?cTi`SCB&I<9fIFBVT*@M=4hT=8M3G>XwsifnCL-Jy3mf;y1wq7^6_eN*rZ95&bC26
-#f6(Z@<moeDh5)2EO&yTOuCHn###aecL!1BWDusJIM{#hC}ahxB43)zd`;%|4;345#G_>U;-D^H`*-m
-sgNada&ko9N^M<?Z|G~l-wGe19iUyJPQWLq1N6!E@(}Du7j=aCz<5sd;tMVGn=W^WyA6MPUbW|8d)@|
-apbI>Nw($7lk8|p?#5isL05=5?2mK8CB0S(9%!vTN9dy0;;)_^gT<PfO_*Zea;jhU5RNiwzgVHZHMhD
-6peGrY^Vx9n=!dTnLn!dmvb)(1-(CdKj!AmG}w4vv)ng6esdp-Q^`5%2m!!foYEikdhK6dO_{_L~Q3j
-Ve)cLfj*yaZmyJH`OuuINWdu3hnO;4bjDpa0U>vj}{NF$i=h>;33I(AQx+vZn)OyJgE3zHHet!Ouz?2
-7qp5Z60zH-oZ19{($<-SDc)j{vF(H_}h<*_A-pUY;&hN0jylPQp5*c2oKtTFL(=mCumV{C;9Z{zsc{n
-;167=eF^@j@q4Z^|GE<`%9^L5zeC-?4fUYt<WOhmi=az@4hpmYcgo}M^fPzF-+ui^nM>WNP9Wby{=qx
-+ascoa%sqSdh<+Dkfc6T02mWXW#E)zKLEHuY_UoV2PuSLfKm*23$S>&szy}zQFm|GhG3P|tqaKv?UDN
-~K(dVPDML$M!3Zd5^n*V9s1^(dOJMsDL_}#uQg1@qEfpP|o;C14on<OJxsje`tcKC;J$AjZY?)@JI<b
-iz;|H#ojyo3gq9n+@OGFN^xa@w@hj746QOtSsMrju+s$R_)TOos;P+vQs#n-%{A{>8G%CDTDRon+HhH
-r-{ji)=>9X0dE?$#j5O|GOPE`x_7T_qfX7!tNj|V!e-GKf#p-^F_Qvqtb9a@OBUK@+8?;Lt}otUaucY
-@_r2U`PhbyZD)|V+cG;oMcQB2a9((p^TEd?9UInyp;PeP#rfESoFDs5;BqG%Kx-!#7ndNK+fAi5U4#C
-NWX|8IzpbKv={)sICrCbjiDcW!Bm?6c1|NcMByU`pcuvxjVJ#GTKCQf#`}rl#5B<t{<ZhAwFL%hlGxg
-!CDbE^veY&#OL|H$VW&WE4m#EJ@O8w^hNEkX(=o_Kuf_?>S;#iCQ;xgxlf4eJPZx{5_bLPxRf9k2HQh
-)<wC(Iu(KB8a8ScJYBvMl5j_`!~6jI~Z*2ptdfomkU`eg|vv(6Rkl{+I*M95k2a3zL=kJ?6Q{7jiVpM
-49tIZnA%%FB|=%r0;{SY}3WYmM-c&7aH(`$lreNL&H4}C=-ldKYxFMzhX`i>zIq=HNf#dbDs8-q&H1I
-E9rfe{R8&=2>lTBjA3McQJ*KfU`(O;YdXofDfas?Q2&sDfeXf;50>VLH889PV@+PkAMo%`lHL>gHo=d
-_C0!eIJm5#@sG#eFo^aGBBI-URe~jZa-_M;jYu03YeYYad!h~%7W>K_QOT>CE))DRVhwc^n<J1QHsFQ
-Ux(Dgyb1b+11CiM?W{*Zs{b)^mU@4yAm23bF`x=>n=y?o&(KKs}DIDj8h8t`MJtTXkK`LThXPUKJXr1
-Ygrm!{a`fxN-zF!4a&hBZ~_7qBM0<=Ol{)fxWu2j>RDCH#n_YeSoWzSBN`$Q3hY%*ZV+E}m?!dj$?yH
-$hq8!TLIMO>fBhKIoaS9twVhjtROAv#ej5IYEMF=41&R1V0|G(|tG0zo9O;p$-`JU-@{X(04&sgf&g9
-jVt_!b#drdpqmgnE;;{M83RRLgY5V*{6PKshfG#hR+hee`SKLBMa=ghpM!4Tf-->l+3GBzH-x?l>#DE
-IYuhi%`USKJ=trO{EYZi<$^egj9}V5DJ^!O^J^JXQxzztpR`dgy7hrCOGC|*ivbb#hihulMlF$=ieR_
-kuzP`q;O+e3Nk@aN7G7fkIKT^J92~J(D-~N^P8QLLaetSKOz3vX>^k+JwqdVUcIu_{a<`ND?vaZqYxu
-yR@{uYZR{e>4^NP%t$@;LBN=GDr+LEwS1Kz{^3Jka01`Dk66XpA52c&*X?A2RmLnKN@AfBf+rl*1EGJ
-R$l$^t%}Q(Eo!MP#)k#<ZZ8W`sM8B{O7aBs7*BB$LuJZuIx_vV@$z12i9~^#+YAGTePjEH`IkGb%VP2
-Xh{;kc<yt4;k#pX{AjG>$LEViA^S$he@fp`$v-6}<xFH`q*!-_ZaOO~i!WHPK+NxelhPL`eI@D#Wpl}
-Tf*)Kpg}-Nx5_<s@etc=hK>qgA`MmnvDb8;r|3pMY_~~@I8K9%6s3>pz`0;x+8V#Q^Wr|n_UbJYDSi4
-Z>J}7gTD1T*dBg&)Un2ZN$Qn=5Ex9%wa_3hht1hsoH55!mxy$p0qBxmt4W5x)&Z@1Rmux^xbT-jSm$z
-$L1oj>rW@<-kzfBXbpBG!%L;^M^mD{z=Pb*d<L^aqNLMBxEt4O!s_8YgPAv$H1>FBg!Egb%wh=l`=gR
-Tq>MmHpyLlP2wfjt6V>BSwtis0--VXk51G3sCL~A1Zr96qClPKd3w(qqJV6`T5UG`eftJo-WE7Khl6~
-hw{c+E_e`Y>CkJSec0;}PzUH25D&PZEYNSG&jg-3cI<e9-JOm?wEu+*7pAXTwJJrKbEBSt!^DXbxwp4
-BA2MW!z)e~AQ}ja!2fk7I3+zjL`|Y=JBxc*Y$Xn!(JkkG{&F0BS4{P!m^U>!(w=izpIH6-kyFgexC<A
-4U7xFT6Dv;ZWhUI@DZ(IHi*Rbr@BrqNs3<l9RV6UpOu88_VS%Yr$$w!YKefcluE%HY`)YpjqzcD-%8F
-=HyjeNz56=JOzeIwSK6rJMV%v<D-e3bDQyaaj`860g-(Mtjc@ECL)Sby5Ob*r*Z@bBhrqyKK!K+(^j?
-?XLr*suZo_cN768I#se{_cZsO+5Z4pnd&W|90D_wo6ImX@`2>-U9yYn_c^FcWv>Q1P#w$`3v9es&9)Y
-jfY)s=STb){o;!+ZhGmZm#$DB^~>6|Yyb7~%P-gKch;|8e}U4-d+oK?ggb?CUcGvC+{%?Jx4-em8=^j
-yF%0!gZTgsfeCX3ED=V?idY#fZP5gHm?GSTg@avm22T49D?SqOW`TF^@BB`xPe1rv0Lxxl28Kq63FH5
-VE=1h=JKO?cme{Vhcm|+Y?UTAB|oXB1lO#fM$18@E9mSOmJf-UHq(2jts@_onQ57+P|d6H~6L7qEd{)
-qW2<_egrXlSmql<<PC6?1an4*o~JuNK7#8Rrts!JfY?rGdFP=3bclVcv&%XE4n>A;UnX0^aDi@L&!Dd
-GVd6r;0S}pX%$<nhw?xFlR&gp`I`XDSJ>qm=`PLEy#P2^&o3P*2R2d{qi!A2Id@t2@llYs8OSYo*R7_
-%Hj0xReVcHxR_5uc8A=Kc?0H7v-E>R9?9QwzK+V}`RAV(@*wtzK(B_n1iv(t#Sd3*5OV*l2{xG<#BN6
-U(YPS`E$HO1e?S>a@oX%L;6I%{D#{acsM0KvzwJgF@E-bl@G0tY*sx)uOwmuHF2C9N5`TNnAhG{*#q<
-aH$M3&__?wmZ+qZ8QvYN6V2mLl=F4PD5Q+r%s$5?L9{|K+tzp^I@X<?j1{uqxiPe9t}muc)TwvUf~8h
-9felm&D}pb29(){_ty^K6XWyLa!d7Z*>F>-s1U0_G$Gy8|d;TxD>Fy90A&YPE+r?FlEYIp9QB@rLu(9
-2w4O#mNCUZOw_{R9C#=tTkt*(MY`$PFi!3L#o9&Yfa>kYH`Y%D+^06DA4DO&z_;4o|Bzh5Z=vX$PF!+
-FiD@2UeGruYl0!KATQI{cS2rHXnH|Tze1mG>YVi4tW14@F-31E$jZwN@8;7_(=DP!GqpO*XfPFsyH)N
-oH9sjH#VpWIFd4FpGvs%2G3ck7C>MQ3k|C=wD_cKNUtsgJ_l^}8*AXHK`a*rSIvc;?-O>x<atrgO=nd
-V}rmUz5xL_i@TV{H8fxcTrSpVBZuFJgt?Q;+7Uk}%?{x+iNJ*>Y{o)Jk=Nl`H|aYF`;94TA=`~J_pV-
-UuNC(Sfbn$em^HRYO3n(dlnn%8`q`F8hB^d0Y;>-)IxQ@*eH?)Ck~_jg}Uzs`P<e#8By`YrNX;rF`VU
-cbYBKluIZch%3y{~rH#{`dO_`G@&G=D))KL;rgNyaFB!m>EzSurOd%z_x&+0nGyY1x5s#1GfY^1hor#
-E$GvrpMw4fnid=oq76w5c`M|bkaHoILVQDmLx+W?hvtSp8oD5KN$ASZ^`Y;DejR!t^hW4C+D_U5T9bC
-Jwp_bWds;gyqIcx-$kmY_MIMNR7=eYIR85|ysn0B*&c1Gbzx(C*|I7bH|MmXw`tSDt*#DIOIsXg(fdS
-fp*nr}IxdE1dB>_zW-2(3k^bEW&&@0e8&^It7P!~8Ta7f^Yz;S{4z?{GtfpY>M4=fLSHgIL&>w#MXKM
-Xt&cqH)4z^?-@1^yA(G-yw7O>n!Az>uXO9})#sAzecIhmH!J96BwuD0C5Fzc%#uP*?4b+F!LdwP9h=V
-M$>rVNZs=74})!_hDVbBf|d`o*iL~SQzn2#Lb8vkv@^ocwmEOm?lRvL$gEkk>-#_<<ruqozHzfI-kux
-+k6iDob);E^P5ktkArV#-(J4qzJsZza(qp`rM?#5<-T9|e(USv=jPYbudm-ozd!t1_;>No^e^(C@4wp
-rb^ne2JNz&Cvw*e%0|O=mycO_ufOBB0z;=OAffI?^X9G_Keiv917#S27WDHtJwRAA(W{^j4L~wfW#NZ
-{t%Yt7H{yO-F;NOD1L;OQ@A)`Vb4Katj7P6J7|2SlA=)TaSp;tm<wF|XRYFB9A((ciIu05f>p>+=H9O
-e@i6s8MH4x1LXHLQ8KH_`oc1QW_C+^68CX{~ui^Md9b;=ob9b9@*1t@YFTXZ!ye@JisuKs{ko9aIzaY
-4Df9(?T|f{21aMny+mV<{9=?*v#-{;T7TPi2f1rNH2+rJBibLM)+3w_3<C+Kf`}q;O5}>g0}@%27eU1
-Klsz&Bf(8VT8H=%*A<7n5)u$<2%Q=FROmM1v3A<uv^ClX!$(uSED!%W+#3E{xKl*Sh=Y;eM*bN2bL4N
-4HIYmlgn&UhLo-=3PxGec4^0!Fwmuzvv{XasK9hWmK9Bm$^I7Qgw9oTCYkW5NZ1LIdvzzMen9p}UKl@
-zrx#82r*WY)v?=s(&z90J@_C4l%-q+dh0lziWqK^1A^>5`r+W!&%LTX87|1$r@{?Aa0LfyUXzm;llpa
-19nU-^GSylnOVh3fK}|4siE0o?=c5AX>H42TGbrgoPUkQ$H~FePAWz@q`n0#*jR8*n1v2DQL@iO+iym
-yZdY5SSb28T?$ZQ^>s`0U?7zMu%jFtPeR5vMOv>SZ!GM@aXWw@Qm=X@b%%NB4&W*e8wusuxftRa7||)
-AD<wf^**hL1E2PN%lBR16TYqd+WB=ND*F5R`-S+$`AzpL@|)-Pso!UQZbXr%e`kL$(L+4vzsmm=|Ney
-Okbn^Z;{rYn_$=ULz)t}!s2#SWK4M<r!oYt8#sp0aG6YQznjcgi^g__fLF<FI1brB^C+I-Xv7m3M=eR
-)J;27K@cyRFe;F-Zip{1dg&@-VwhF%JNfcl6D+MQZ`SZSCk{DttV;d<a-BI!jVHSSbPDL&6qtt3;6dB
-eAt-%#q&Uh&)LH^skYK%anN0b2qN23!ts3vmj4O8ceODa<R(H3FBzuc!D0nrWKHG{qXT=5dWh^MvM0%
-{k2tO-G+ppJJb;)Cw2-I{E4RQvLS&ANRi}pbOPXP=GEVKA<R|Ea1t2^_2GhfS&`r0!IaAQ(L<hI3Q?a
-(BYui;Gw}8!G+YqmIkj1ewR4(=in>BwZSeS%|hB!JIkVWwkYI8$o-*HLq7_guic{U7dAL-RM@}5_J&!
-*nuRA5w+@UL8u5F?1kk!tI;*3dkE3q~-w5A90hYi$K}~}Lf>VQap|4Z#^A5Ga55jg(UGEJ$8TLyU5Az
-C73pa!>2!Ad7MtF~ih=|b<k4J2Z*b(t_#Pta0$e75K$bUs{jocl19_eooS+M&wJvAAck2STLHa;DFy8
-HC@>EomE8AT<rg7|(N@y7<AO+N4XeCSg_BZ`M_8(&Y~PSm#lzxK|UwW%l!!zl#KkfC6P4iz#~%+TT7b
-JBa$bKmc~89D^akRf2e2pKYDh*-p-LWc}R3#}5NNWlyRgJy`3Awz{iJ9G%xp-6=e6*_c?5U^l{4juf`
-PWl_}`vcB7-22?;<#6EK*SaIj^o5!o{X^dtTC!%r<V@Zaq+Lp;Y(AQ<>6yOSHoIc(?{mNBo_R04Ki-x
-1Ftd{RmU%y4vb*vmPV7$`^NZpd7q_TE9|&Uy?A^TU`+8nK(2w;~Vf2&!qQA;)zx0H;W9}JG2z_Lpm{;
-jH>AUWl_ttyowY<;X%S`0@GUM^Taq~{WDLN&mEZ=n9X*pZYx_F{x+tNvWyJPq5fjyEnoY|4Ruva$f$N
-hwK)Qmstr+pdV^k$C>&hn6BK`O`vwO}=92c2LL41=-g$Lox#luE0DT2xKdQ-|tAU8<;)bReXbor=?tn
-fJu`5uMaoUC|BkM)&&q_lZbid_u2cs^V7NnlROLH{4CPC2iGqJ8swQxqWwNhyKVv_b<e4SAGOh#1O|M
-65`KkB!%x3W}%Qq1`tOt2wQn+sv=4#qk<}GsACb&v4mwbu!2>rqlqoF(LonI^s$W{>|q}R9N-W~IK~N
-1aVB(*aE=RHid7;Mr5MF&k`gpU)0CtcO3^GSN>heFSz4eRb!eLgbS&<T^At~Wl4m%@igTRj0vEZ&Wv+
-0QYh33gUgid`@TxRulQ(#i|KCG|2@@tvm@r}f&0kPU0|XQR000O8Q5kVep5nz>TetuK0Db`g8vp<RaA
-|NaUv_0~WN&gWWNCABY-wUIbT%|DWq4)ey$N^}RTeN>olYm6jp_(Z0*FLt6pcu<bxdrcUC=Gn(yeg>j
-S7keBMK^$Q~@eTLZxTYT-(7>XVaN+8+Ba9T|!VvCy<3T;1)n7C`&a38eEbNOX@%8-s(=+X6AeEd++<+
-_xMOv-TmHk&pr2?bI-XQxOD|*<~S}H{&bz=>Nxh#&HeX(G58xas(ujne%hvU>rDPl=T4h*Z)M*6iU;q
-hxbyzJvO6Dm;6W+xuDkOp<OlNZeIU<s{f&9|KREmDi?g!Q9Y!7J{{6KV@7C9L#s9kBnb9>H-jCk(VAm
-t`{XmzMzHjZC2k&{mySZx?&AYCvn8x2{<iFi`-$LKNzPD@+)_119mv}jD_HR?TqW!<VIUd)=jpj0v(m
-8H31m0kArQ_gXV<0hc#&;6OS@6O2zqw8m1>#HlO#n}Kb-Ymgb!zy8Pi|tSiJOQY^G)1KCGehQ;;iWdG
-PIkx+1P>aIPUEKIx_?Qb#h#7(wUPlmhN68!F$?9qeD3M<P-DcL2oXun0=>oC&ztr8LN}~75r^GF`pa$
-U(B*`HHBCZIy?m4R@2G(8ZMsCGSV@^Sh-AipM6R`_r(>J6=m>EVFIw>ehu$&r^|QuyayrUMTpGpY%aK
-mPsumw%#is1=f7Z^e7~Q3<qO?t3xp=;20~Nw#Oi}0Ku;u=R|cCn(YaO()i??u#!uGQBV2vq$+@2JBwY
-;q9R*^@<H%F(fDUR^2IL8QATBJ<62tbl4?^S`K&n+Z54wHD7LME4v~i;tn&GgDA<1F8SyT?@5zB-z&<
-;5wlEcoOe$wU-Pddhb((WT|s*r`vwu-?9X(X|v(tMi*m&wO_w)^ymFCQ{{ijHaRB9R=0B54xI3}|0jn
-|DVOZO4Y~<cguij=br@G-0}MlW?<04nn(bKZ*LomVD?W^mWgrP<1#^;C1fthwd&=lhZg(ARB`XkY<A{
-{8JINy-(Lg0(oGJNzQGmdk8`)P@v`yW*`2tE+PEMF~}Cw1ztSnbvBSM)nP+$3|MTj!z7R|g}P*bhmUM
-h6`sCD(ypqs?hYL2DCkEgwlM?~o_Q1MF4KMa$3^qe=rRE0YFMbrWP^H38fz7r1ln~p2<5x_TYYgbYt=
-)VeB?`jnri1U|7NW8VQ39T2V<M2K_rZlbns6{)bEc&FQ9did@9u8%2m&1&11RzKInmZhn3^<mvmvn`A
-ZH~|A1rZZ*{!UYJ7}e;xL~bL}3Z74LYH<DroJx@Qi#t;QG2^IKR@80m<b;ky%O)<nMyW${#gzfP6<`y
-a8(t&v3YXWUY_fR_G&@@cD@7Bi{*k2)7F}g&8wX!7aB)c8H``w_m;q8dk<|Er6X!4L?DQ^b_bwtDkHT
-$(K-KoHE;y2WWaP<Ru-!202r=2jE+YrSP6_5Wz|rew6@zxe>pVgX3WRoJF$!4cHTGldR5dx_t*w(mJd
-ja*b;;aB#6Bce)s!=ct0kRb`@!>sp(!xV-bBi_UG%Hr>8?BM#ErDXdz76#zZ}8kE$h(ZB|})O7n_AQP
-ZTcJ*RM31*X1>H5-=oNWN&Popqv=N;4a>OdD)FtECKHM%`#BgOev$Vyt(-lMwi+=h#JKCJ3F>M9`dtG
-abv2Vl*gLs#xqw7_%(m-<)4)Uf?^R`??*yy_RotlNjNOs$wnW|>}Qnf`>Cex{jz-as?8W2O?8>3No^;
-wXl)UV+GZ98Zh)4bFs(Z{5IVzSIw}6cHlxy)aY&hFgRwE9CH5z`<i22UrM`>1>0p=P{z=qz&3<L~*`b
-pq+GR#{;uCM<ml6r2r34Xyo?=CdfJtvl72!mTte__$*b{L#OriMo0`#bCl@zR90sJ>-ef8x(<mD{}$x
-i2slV!R!ad3=fKR*2ja6RkC7gj{P|`&`GG+R$~w!8-CPVs*Nlc9mlqXEmhkm`S}MPCi>Ndt^DDO^uv&
-odI=emLaw{w#In5s)zk5GS`WSzBPLeiQAfNFoTh(Qm6g39<lyyl0ztYQ<L*DQF;ma)-o4Aj0Njlqn<O
->g3r`xYxkBt>;<4qiCmop&Kx9}+{2a?3_V~&y}T#BK~Zfdry7-`~4)VFYyn_<+qMhC9pk9u*|lw^w2e
-Tby4j>?>>qAZE8DoU5qMLi<AS}VTS%z)%jK8Q0u0jj{lOQEp4_6nR*cm7d7X@X&_iXP`U57`o$=NM-o
-{M&5+=gpK9kHyBzVpw<*6fO@*i`}@c+~q}*!z}?32>_}2OnoSW0wP@mK$I8BoV>4GS;CE>1IUgta&Ce
-OG~R%m$O>d(fjHpyV3~7inJlBsrr3ZoLrzx)GQ0O9FgC$D13Xzhno^ohr0kcL7tOay7nK*4TBY;&m7=
-xYiZpg(I@Ti(fuffExV`!vR-hv=KUy={90+2a$M!Lh`Jn?oWv#WmXeK9*0b+T!gLcrdpLOseNXL0|K&
-B)*`b3r+_OmL|XqKYO9MS~9kxU2c#1z^I>1<k9%chYy$O-9jlv;}@mF&P#?#7us1a*#AS)CvBAa<~>`
-i!{eA<o(0Q`&Uc$$jKlxFo6k$G1dsT<qEE4+|IzVIK{PdYj)IiO2Mv6aztDc!o6<&`TYaMAx1}HLx(|
-=AQ;AsZMCk4@gt!2U1?(4`*GeBHV#se=3qK{?Kehr+L7tq+4)ywy1XjLT{urT%CFhKL`9PFXu<qQ2t1
-CWj&v6;^b^G60w!{M08zF`l(5bwArHLVLu(fW892u9I6A32=);#%sAy}yv{=cStkbD_@^5HayjabT%c
-{-P=xtC@ab%bg0R5RJlkj<=_?47dx|b(q0MU75VjY<YAC_QpQZkh){%=;e+}fkSRSn^iE05lnH(cnd1
-~e`j$5(9*`SRAHp&ZxiSYs-XJdvK0<?lsq!!%RN^z5$1^ZS3Zl|!rZQSU-5m_`JX#nO=B->#evR%!Aw
-pL?Pp<MOF99W!9nnS3oqK#6vZ68whkQs448QM-&_hK&G5%X?q+Nh<KyBeizQHj8^F(E$v01<MsNFq(n
-2H00&E4_lY>n9PBWW9ZkiNl?>a~)kLIqIKsC_r@kzt>R;d^LojHCB7P&#)i3DLd*`n{pWdq40<zh>+~
-+v>b{*QigghcFpf_hpfmx#_KqVN5!Ely`2jeuc148uubH>z0fr~bPZvWr%o9KyXHAKt6zhBwo1pZF~h
-LktS%s+u=n5)#;(JdF6_xgMV1F0CQcfJlQ4Z0BPH7FYW+~0NSs0St;DBDnzggk36M+uYa$Z&I^=dK>&
-sYPV6rS105NW2Fd&v^Cz`m`$jL#AsdXr<Y8F=$?{5;zTIm`OSssEc>I@)LV#pG>2*=YPJHjOZjt!xaG
-cfULmRMjUrq&Hd%v(VDjn!s|3=J`fN+a;y5v!<gkkVj>Gec%=AMVFt`+Jbb8y3wz;I_i{e_db#&agp@
-#4O70Q9hE~D9&vw^^+kcpK?T(GT_-KSpvara!N}QAd>FW8?bht-X?zx_0cJ!>vr&1j;ku}M6pq_sQ(;
-Ip}jocL|L!s2f$t$xPa3a&az=wUE3?J0w6t=g5MnrFGc!L_xfw}--TlSR<Y-R7&!vF)p{`!y*ljAwyA
-5+1A<mRH<ve>4o{^L#%-cLc4iaMfOs1_l-?mr1}hPp`iGNCT$?D7-^6%?u)R77yRg3Ea_EkQcBggW1$
-_N)pj7_)0e$L;p46eJb1ZU~kpif0Pa`m>&}<f8Uy;j0+tHzzhz;svTN-Iw0l=)x!fXlVCgRgu<)3{$9
-pZ=vaZIFXBglSK=2H$9f><}s7n<DVQ_56MU40SdU<(bNI&b<-Hz(vLx-z4Fa##%ck&jv*AiV)3ct47v
-X^#2W-tYh{VtXLiEuXKdgA)`_9vny8MF@~M=YGfSGl5Wl<e(%Zs7r%@A5~g)U(e5eSL=ccM5RxcY<|-
-0+=lW*?uAT{fs8K>$QWDrv=1a%{;gd-Q*tvYL!wD39&)`yOA%I~a>E1Noh1f$@-?N9Y~&K^0mYU|xBJ
-T$TD`$;sf4dZ*3sws-osD&#Y;B(U2XjD4$xg3cA%|DSLdj&g23y!V4+nY&3;&abHsdAG^JwNd=Ijaes
-h<Y-x__M7K3yziTGS<#T+kyB@c$-I<O!^AdOz~qtJ6$g9WqBLw@n~bb0cB)Y9?Ob->F{`4OrYU6F+k;
-)az4O?r*yfQbXTx9c)o*L)3bRZ2{k=EADVSECDblqI*Q;zcaFly(cL>iI$~1&F9`^6Aa6#ZrjijyVUX
-67n31?n2s)0MAMQ{FQMqb)(P1SwwCodO2iKuFuUA^S=i8gMiudb95YwvuOu>q$N5WLj8R3eApou<@!U
-j^4JdPBZmV-h5gY_b|bRPLS(rOu>xmD9xWmrNcWRQ5VG^J?U%C?803UcZ35EFb79wBL2=U$tOx9$C~a
-<3uR|G@ZEb%#hMz4U8BvsTBc&8Y0&<g|%!b{LZgf<R1Fivf%K%D)jUw>;svBX*(4UQ?1jZm*{UJAuL(
-IDoR|C=@6y3U^`uP5ys~)i>`uaQg1ni9NV#GSJzx%_p9kbLsK@eHdJtf!82Y<^kp5(&I*o<AM#QLPMV
-p%&~^}QB<*is35h4SqvaqhNKpLs|tkh3R%oN3wcQHykq08eGP4l;F5DqJd$#af1AEp{OEu(2A{7AdXI
-oY~MV6jn)t)$98Ex)Zn=WwQ<o_CoAQ$z>=62gpV$QBgr@i|Pangw2b539vO^4vYmxUJAniECq^->lio
-Ba)70k(!@GcDf26Ll)GAGWCXl*DAGZw(gs^ZEf76^Wg9S+qIMpYVg11Rx>3j~@Q{dZ=RZM#1t4bOS3&
-~6GQzLiFeVb;q|Yp886+Pz=3MnYJ~76gL2N#5g|^gBE``7&R?c76xg=RBvjU4Dkc}V#o7CUCah$=1Mc
-c@Yxjl`jzLeARE3KqCItspt3qbwdXpozJ$e(NLZZu010r7m$o5YsZfPn7ySglns0c5gGORp+Smy`5$B
-J5=@bH!nR^9Zso+78{S*|zAgx^_^!m(g1R^|~8Pe9c=N>!F<LJQRHa0{M^F0_0$T{A_;2>WlPQ1ZD52
-sU*28F!xZY(Cx86Ym4KfNK)Ib<~UcgJO<k*TSRkfyb~?76OoF;J(F`$xvNb^<;@pRPJQ}nN>OURfb~n
-c1)!?g-IH^zQU+!Q8I;5%GkL@Td)DrAP29E6I&C>wf_n3N!k)`HW2w!<r6vK#3hS+u5_?MOjs3)i^u`
-+Jtp+S0ySgeXF=5wa(FxOrtCz)au>;<vLeJRhUIkH%Z#B3dgJ+u;XUHiBB;*Pt1{)LE{;DF|)ESA&vE
-KWX&L5nILXby^ndCI}HJ}~jIFN3rK4}EXp||CFYj!@AE-2p}^Mr28)rJe*O(tmwJgw3ofv^8Ay&|<`v
-I9Ydh3+lDLM@a!`>vvk8RV07VXtnmYV%M_DWT@V;MWG|DB}PTNC$Sf_XMcCn3;e|K_=_{_~1?{T{&u!
-EXvU&`D@h%BG3vCX(C_Xy8Ipi)q!6tP&jL1fI7Kt)}pdSH`dD#^~(N+T0p?fXwk0e7IGEoO0|o!vl~c
-E-F!70?!yx(|9$i-#F~dJP>nWNBvZ%XUX!j~_A}DZvT>YJmdml3DmZD}18@Ke4;b(e_1%m_Kdy#PAmi
-sjKipD^a%V25b*ZDf4UD*4k7L9u5T$)F03(ccu!(}Yz^$n8u%vI-b&yJSYK3B%rD!`<I(2uz%N(gL#A
-6}(yHy#e{U{Q1<qqdgr4F~(K?~A~{)`7+{L@WPrCZIRsup>)QoI7Vh$P@Yy};Y7I-Al`TU-J-7tl=|=
-Zj~(+sHZ`v*Kxs`gS5~H&m#ugZ5Xbj|`^pOkXtu6N+r8Aj()pdGMEjH&I{r&~Gc$roJ-S$V;X8EXb=q
-<u;;F;in$q4F$ZqD2oaisW4-EdE`qh3$j5n30W3q;|5|cg%`=X4xZ}XE`%wnUtmAR0*j%5`g?e2IV7e
-m2GL5kLiBG?23CIu&lPNfMch;k-KhGW$h4r*1$|W3#_1NT57ts4HOrKVO1HUnR3UaS6U7LRqm)Vv(|{
-2`eVeMi&2dcbg*Hn#Nf28+jzTJ!gJdUSQUO&T;nz4IN^fMadVnYJ<2LWXoeQdSwyA%Cy0p<Esd3N_ge
-;4&&9D(v8h~_IEEq*Bx6|HOwxnaI#<7CsZ-=^DEH6W3S~AzrVtEd}s5nS0OOCL90yAuR$oQVG+ZU`v0
-m}yE*bLkx;)bT%Z(2zq@Q+nEvjPN^;sfb)mtpxX7BQjfLsZ&AQzB{A?Pp<`>b2Nez-xMDbDPx{nw#qj
-Rp#OO%|QO#9Uu=`1LP7SB>Tuig@OE@0NL#)2SgHmwVV$gf=Ya4zY%?*sjY#~WMDIzU03i*H8Ra+fd7n
-^Ofos<cXjd0UWKe=@-h5Yo~0X7GRN2a0l!=(X&5onQy?Gt+-Gjl+i~v*LE58I^%AbE^8QYFoTwD<8;K
-IyIWXd{;Y;n9!c<E240xM#dox6nsmTJ>o71|ssLQPQ2~$gMO!k)rC`iX)#5kY%OFvnM2PaHFSO9QR70
-3=Ot<q$}k*vgxv`9w<R1~J23lJgCdC2QL6v%IRHBWLmw-x0q0Kw~eD-mF94Hc=x1g`~|I<S8cn=7X>S
-KAA$pt*tgTWmlVQ^>rQOwH^eQG}aFzHwbqIbGD7#K?EaqInmY3<5}3MG=Eq<t5(WA<5!#<x7{~himRJ
-X`JHX<Y9=5i^A8K-Z2T#chLio4VYU5y*=LbiVx}-BScR+ZUey1g?Ht^V~#rp=qKjkz9BjC2F`r}x%`0
-~5V)P)J`(kYA7#3z9U!rRFykd(c*!^Ao}w$|bZ9XNzFbl_ztYTLuf*<@3Y1udG)9RnlycPZDG4H6Z=u
-Sn$v_&{n9Q)0vINp6WOQlPHEAZ~9h0y=fwV(q<tUXjK`gMmH9s>=qSAZg(ubt`g#0ah%~otGnjuZm+o
-Y?MXs&d=5>1zeDZR<^V_ql|e1$_<r(M}%i~bXf*Z+_jMeK8Tw*b407^ZA-N0-xF9ok}uPLdZW`}>rA$
-CNEeeEs*S+I*-;z6&Z5GIXs>iB6NQSE7TYiO}SQ*mjQ6o5BZ&1CI2xa1F5beg&-z(uzPrlk>f#m9Os}
-q~&91Bn^E(NE>P7%!Hi0#`E?2Gb=3u`9e#Eh)f*5G4^0GRO>}S^ApsRB=<ua*1)O{K<KP9Q{4Yleein
-9aRr~CVpmhjz|7@}tC$ZiWGRUX>{YY^3p>qG|9BnUU2rzjp&Msu*Fl#1X%?%IrLsSZ4YFiw`H<x<nkC
-i9QgR*ZMmlS35M;BR&=pUSlMf!G=YxI}XEy?y11l8|TJS(iZSu1UwnG-(a<>H*G?2rPoE!3<?Fq>sIm
-yt_I(XUOZyXc$fE}8TEXg7&ik$|(4gFhzb7y#}Np;y_pK<DVnCmKTya1$!@ImZ<Sr3riKMX^?&%`cHD
-i?t(?RMuX^7I~eE>{IJ<_}LfuEcB$ZQ<)}YUU6oHor~BZodT!k|95$Ec3mt`^m^D!%#z&{1et8Ws0O7
-lKuoqnngrx(_5ks!5~+a;<9*g5LVJk&qytUu&PjI4EdkwsG+HUjz>!V$9L!ioFkGfEf-tM>{W+qw5^>
-G_9>2|oaTTEHnG$gmeuY0+qg@Qtivqi?4!s=fqX2DtS+OYLZJotD;qu8WQ^9-vvszE*yxdT(*Uv8*q1
-|Dx4?33>gPMBqa+)C!(qeox9WpkR6TBa<0p<CPz5`aQ9BJRG_YvBIxsI!2pk@^&F2skB#<}ip28NF<u
-bB0UkrO~VmM%9$91@Q>-HcW$v;t&!rdK68VZ(b=D(O0_6p-552&LXYn_FxLIHl2;^{vG#$k;C6!<_+h
-s}H=>`U6&A_-ctzo8(jIUahI&MXbV5a$EJNMguarQ7$ug&Q!5>Gn_G;^+WG-QMsPogG_Hmot^4Ixt8Z
-)HmE%Ll_4yIyb7n?1#w;KkGo~09l58sImY_@{Bu}{$Ly<pY=JgTMJ>)q&|y^OZzAPHsTONfDsb)u~Xk
--`oB|U6_5_1fFSj$CV=;LAF{MR0)O-tN)#LX$X)?!y9vQ{t{+(%e`p%)e(fiVTXdd9SbVdXX~ylkan4
-aF(gSX<vkgFx=gsQEekF%LoVE2Z5_lik>Iu88u5>A1Z}6GhmDu=-AH%{SC6>J~r7jD(kLrjA3f55}su
-zTyYZ{uwKMTYYNjCVt+a}U!mD7MB`|d|Z02^%VJRH+q1JYaK=|gC`p|{?y<_yU5Vj@o{SM75lp4rKd4
-0V$I;Sw86m<zfjgpv{p{4<^BR3GesISn`)0(gcD0P!PVq1L`kxhqUFN<$IKW+TrEkk0i$KAW#4l4p5x
-m}WKdtmx0o>Zh~|#t0y;N0lQzil!z9y1njA%0}+CP&K-Afo}gh#7s=791hdI0b;4~jIat#m+-J)(VGJ
-;2?ok*J{0VZAe9-3C-;*&#h$~WtEG}x7X#kKPY1M_BL7w|t0Ab1yeEd*bG>t6F0^+Wv==V10$%C%-@n
-0NJzgo^nSrd@FccdjDRfzEK$7!riy7<GUc*2N3!EU&#pez7w+r6F!R};rLRDdV>RXgX!g??wlgS1^+!
-N1hV9r;fB)37g-}5?MBUGe`UV|cr@qOhW{AT&pv?4}%NryTph3#VJAPqygbSewqXT1AFW<Y^0Mz@N1Z
-s%HGIldpD^sH{XNa&GO685dhD!O)696H&ah-F8e7%c#`<N%C7=*_^{NYb~)OGZxs&w#SP4>zBMTBPk#
-E<kHFe5=h9DMxI@!M}zP7x?Kp-Z^hlIpGHYoBAjK2b#JS!e3qi;qP&5;gL-U(s1!wcxi)9Hvpyh4r~t
-1in4CPx^H2P@kj;Qgm6icZodlR<EKdj#!B~J#QWS6WDDRY$qo<cWg_RxKoeFd#dn!O7~*S8&{T`%Ix~
-}uJhfvd!zVC8!OtkhWPOy4Lf;=>W5-}re8a8yMV9(Un!4yUb~wqzxNhvlI6qM_3^eQqE4AhlU40evRS
-Q5uEJ~G=w0#(Hhe&wcUP#M#sOqn9y`}1(Ld_mp^EoU9!WYr-APD<iKgkxqOO-zIlb>+dz?;x_L848gF
-WO(x?&WnlC6B>NT}jy?`>QPKFBtU_M6K`!_eea0PHhITsKGt*c`cUWBnA|g@L&dRt6S8jV`z%CMYmVH
-ifBn@^m9b+0UQw}+0k+;N5eNvn<-k_hlV@OHq=>0r_!X2RHlL`(iko3OPqhf+Ij_O5Ud0@vdqo~s&c?
-e)WNKrKWw?-eMbM=f%XrgM{YJHHniff6UjSBLLhrJSmU^CJ4yBcx>`bYV3rDvi<`E%vCUrfIh4b?*#R
-tH^F8!1e4SYxeI1G$fHJZXk<GZ&ET#B7r~(pZKti>C4Eg_>I=a7)&jS1sJ{n@iEx@wk11dhEy~n))rY
-YuwLrj=9ekf+7Mrh@s%d^eMKz$B!_bWK+#g6^Z&V^9JIZy+$Q5zSai^AT&JJPYKc`*PFX3%g&B2;1%7
-fiv39e&!0PXTJeD$31={oap667l7)6Sv01eAvIgRQF6heZ8$cP%jj(eIFT$&tMqpB{Zun_|amI#*AVy
-!vV*JU^8{LJY)|yQF=xNqm!%s4OV+{<cxulEXs#bhDp|)FSF$a-2|RBrc2k8FX*}X@(iKYT3+Oovh_x
-K2HTWWedK2VX~kaToZRl(_Z`k8)Duo&s`~=U+o8DyX`t=s_OEE=k5N=WM(T}k7$b$q!WgN!z(`dVA~T
-iX{bB#45LNr8QXG+TSnvl1kC94oauhH`9<mCNL!Ad}j_J_uI!+myag@(Zvn0;JDQ(Y+CF7bO{xaKxY-
-kGCj{2}V!+g#-T0Vg{TkOb9*lw+0lZ?X}36<0%{~x}u73Sj{GfoAdcsp*RRy<>vn?yJJk5GkV;ZT9OD
-U|g%hFtBHURYddqH=AIUfwcE=h8i)3Nw67;L@8XU4o%0p4y7Zs8_-QN@J-QzP5)|gVt2*fSy4D$Yhe^
-F23e6de(``CtP3W;Q}bjTg_Q<QsyKF%zKM+d4H~J10Vh!9YOH~C`@~gxO7(%gU1|V{~-+(VzsoHP^$U
-!ko{|naYZTxF<inrTy@uksuMb0kUpTpsi$_fjoAN$wJ0rC*QbkXwG=Y)cWKDt_62u7y4a^obm-C?eDz
-6p3f*4LB;ATHt31d@G99oVzC>4$S1kJhi0nKlN`)$rC6&FS@We%&d#F@2Ulaj}%>i6KCoK1(DX*>8Yt
-`*%zr<v{dyyaaX6h|IeI43QxsEQb@sfQ$@{LG}b7=o2x^y&3nds`1(yRO~YgIHziKNG&H+x*x>Yk1|w
-2B<jrbK=LlFoa8p&9!k_C%%2CV)^BDWB8*BJHz_{}9%}MJ^?lB&TAPZY^DjnPm%pTLG0^HbX#^Uu4~E
-MCsY%%G9!GcCjVd)km51rcyy)D^?#xIfs8tL`EsgZAE-u_9BvPTvIEk^6WO?4(GzUdV~rni8Gheot4q
-8q4*GxN+&QnhXrLL8v3f-*Ku29d0bGJ9H^n22(6IfM#$<3|4jvS_qcWmL=*Ta2L;zbxplzF23d@vNWU
-fae{SEYquBt7V&n9z5rrHz`<Fx)E-bQ4g=QCw#!d2r7og?vKUfDwI+4heqtJ<Cg6o*v@LxJ{=00>&b}
-q^Q@FjL&?UaPc&;&FzfL^TQXfHPF_6f8Xe>ZyZCWpQF33~Cf;QCqq<iCO96y1g%zTTwX0bKuz@EvA6&
-vuR63nKrLyT!7ffCj9x#uXbSBFXHchcPyF^*&uktV_{bfJix%qeB*70+}DPQUyX6Qy@J0JY}mEvdF{g
-3p=RJ;T|j1IsC-wP1^67zMvDg>XuW~1*h2R3%Lla?GE$AB>CzdAs6vc`V}e4e+b0qN5`vk?AYRsHV?J
-6eHXTLSBuP($+<NR5AjOp@zCU4EmfJCo2P6BP*1g?4udo^6Q)qci9B;Z?GCn~@(P)EbU#t=p{%fE!9%
-b-JeLHn2G3bHsL>(xKx+8)9M{t^qM@It_m88Wrc>y9NYvR4Q*fP0{VEC7OFIQ+i_T`@jvQ1mp;3yz>^
-lJN1Q5-yRVH?F(wu9_kk0N&FcY^!t4DXzqbLiH=_Iq0PLWekj+^AO)L)@s>S~e3=*`f)LmS}@9+HPbm
-L!<PVJuPLJ*d?J&eOgj1?w2{EmZ6H3R0V*^HJACC&`88Do`u$>0@(MLaovf&1M-IG+ga8b2OdF{U?u`
-8t;V1zW*JX6FYbM$T4N9)g+%MmNhe4)GUTGt3c@f_BiepnXO_7SnALJP6^t1ItcJBHsz>eaT}8>`wh^
-b6K(^?#j+;k7Zt}^ltOo&?p$__gKkA5FM@uM9+BjW!9&sr<q@k1ClUxw)8E<l^uw1({!qWwWE1tx@@G
-&;{}$7xQZ-wK;xfr8y8TJaPxEY%zdQY5t60_s<EqEP<~CRlt)f2mrN7}`cOs0YQ?x7F{t1)4izjr$Th
-38u1Je|~Zlrqb=QzJH=`fP1qoNsjn(=o+#Xe;*fDPo^X6>O>=sKn<M-r5bSHJmwfOKBE3Vol{a*i5OY
-+yy@@y3o&_BUqih*+(Cq3h}k{bjqgEMI8GaZXE7+rOZwmsRsE7W(2@U}TijP0Gv@^an6FU<2OXjgZ(0
-v}G43XRE*TQ32B$7PHlLKVh#kcl9qwfYtnGPk|NnsbT&!CC;4z(&<MX){n6Lc6h>*$D#R9uNa!yuFg)
-TN(kAm?l^?wVD_)@iEDU400btB80?mI`$<6b6R&#}8fE!iy9H{p%1?<vmF+EFbrL;_lRM$BJ>=~W^v{
-uV?UtOuhDGP<fsRF1k$Br{b2S@!893Y2XH3kbCYiKogNkN$Osbu6p3eWRDLlCkwUs4o!>mkfm~lUnGw
-c<RC+b5R81yR%1l#x;)IbODh#slbFf{TBZl@C*-AffOkfn`&Y~yPhaEEraF9@ig9Yj9(8WXTIVc=>>E
-@j~S>`ZGMQ{TZ(L^XJ|Xj&EPljo^_hf+%6Xg-LHoVo%+p<L}z^>+v9DYj=SDp@yqNS;wy(`hP0exlhk
-O6Rb~;b`b3=c?DRdS$0N5xzX3Jne#D!$aemQ)#Y|>Ujro&d~Nt%TR|MOibX*8lAv1SbP*9DL}nrTp2l
-zX&}{q^d<C;49)=KIRNANc_A^bk68~OR)@n<AX9V2vaasPGFX9s*RW|k)}~tsu-VA_c1PS&mby$!^zm
-D#-W@SX!$OZ(yCXKfCPXRKWSg?PPYjtuQ*&WIf;6S`2c<O$cBFry9iTixUGo|CtD!)2bx4EMcUWi^gy
-alhi-I@N6^VAS>R9-OjfZk$HDNp=&Bt9Ye=eZiBoj13COh=j&}3`y(4)gVWE~WLc?ufOXg4cudC-IC)
-qvn=Wj99Y>yyr*epx_y?T_`r*mfIyZ5!~lnT=X1%<W5G!#D+No|NO<MmAIXo{y&?b&BbH%@5RhY^rU!
-$5Bvg(uRIa2^X4CK~}O(&8JPfj`P8FkdyxqwJyvWWM2Pvf6|`YEZ||oHhHO<eLgO^$sjMSXrQZaut;j
-_=+{)M=(2|n0L2?hs#+l`XqmbXKxtKz@5FR7Y>HRzMHS6tt2BZdBGuAtSq{vWre>AWx~-VhO>0P!hbS
-~pQuE|ola|Wcl78Zsng-ftpZafrei!6#C1$O-k^gX;Z<WdT=i}en3eoP0bHtwQ%I;Jt#h)J$LpIUe8X
-&DcrSocEB$^@@u|O&W%u;rFdHISJVhHWjt!R7vGny)<*Jc}5wB1eoC^v_h;J>fB7u|9z3ow7^2A~@^*
-r1#n-W~AQ3FYCX!e1Bs#pDj{DMP=^H)X>glz;~-0v{dtpoQSA;-d>6F}b~~D$~J5r=4zZ|DS1b2ck<5
-*Zp;BVkz(3PnUA^6-v$wa{SFn6xUaM3|hW=L0XHq0|~U2Iys!|06H8e+eoE>)FjCA3?R!sB+G*tS;i-
-7Q9|B!ZHPgk(f<r7^tqUbd6Nf_@2`wRB;P!c@A65Z8RdQd1N}aU=ZHIJc%6q%q2Py4rQqK%3Vt9?!8g
-Y#_&S4vm#Am$Pf+k(WpN6=XdnfjpCG!wHYoUf^{agb1%C{IzIh)~@F;SaYU4gi#Gfo1NW>QnB;x(`p;
->&nCp7PlzJXM{iq$P&rY_jWsQ86I#V>%26Brr4W8VNW{_A~-x!<)nLB>mvCY;6(<P?91Ugipt*<Z_Fp
-qA)h)NBj6uPS^E6318Fd=QnMuO<Pb)|wX*a-#@srPTzVjO?bW9VO7ARFMcUS0+4p7?Xx)UQ-+*x!DHX
-d@PmYLQ|}9JuxMDe}#|kDY?t!JFviyR<_Ac#K2w}=#wU3pu>tZVT%~P{L)@LDee#>M=ffj6&vUfl<!6
-b=I$)@o6r76OZA6GUey5%_VUSA$FhmbWD8&aU~X3RQfk~MkAT*!k{x>0Gld#LQj2ol6A58IdHs4T|Dg
-%J-9o%J1Z5AU)21}o(x&7p_gFatx+nQ+gr+%cc)m3K#sS9lbOD!&Wf6gNw0JvF{146CgA+JR{bY}>JM
-~bZ`t+XoMi^a}0;sA3lGeTiUoOjqG3b`^XL=&i<tH(JI4kE}UH3(Fi?VOjRPtDF-ZdZ&&h0K;?zzPJs
-)?_e2YIWH;(A_?quvHJLj#xXiO*~FjuZseezaz|Dg~#K5B@5JE(d9=XZgHK3WYj6vGOJz655Xo{3n|{
-wfE1`+oT~tGc!n2Py4GT=~d;sK0o<Un`MOmyj2ri9Rfe812)rHKcG}fonl6)tG|o0xoSK8qz6Bp7C@_
-j=-fu_bMphJ+RAdjgXKD=k{UWBe`rR5J09?nFN8Yeue&`3KwE2`fzRdsf;8dER=(zO+=5^@Xm%~s4vL
-o%l=Zq`-r)=1Wb%e*^>}JM1!>-zL(*OG3{XK4R3P0D+$jZW(-Y;)J4C$^io~!;kx&J4-^ByUT#02yLY
-ZOxWmth;D2ipSj8BU{9QewE3WLl`=qZP8-|z&}4Amk7T{itIAVRf^(GIssbhY!p`%N;{LSOziEO_&`P
-<srk!9iE?HJ9Vjebw<KzUHwcw8fFKgsQ93Q598SP1Y<`vkR<8ePwHX<eLEb-e+zGvaC`=uMsF{euRg;
-s7#wUoUcJjC|tQ#%BnSsdXrCI7u`sATdykWt$vqUnd1w4O=w@7g3hPfqkf`Bakaw8V)2myO)tfv8FpU
-!I%ACcS1|h&-Tw9O=~sEtlCPvYVO%rc()EFZ5~bl)OG?wFQJ&f{@tT)=OKUxsq-idn>l--(lVwY@IbF
-*Kgb|GM)AhRAeJ#gfBGj4+wMsm$c+0VW1K?`Mz?l55`&E8fCM*MO)W9a)3|>iE8p47O-$TCh=I^UoGR
-wpVw<gg89=@g(^{D!WZgUl|h#<DVgZ2Pav&<_;l9%Q{?<&rM40<E~p?Ol_M_kwWCQjPJf0!|e|D?u*A
-v{S`>pKzaFGNDOL66E%tKQ&hggVO_MRSKX^F(mCps8BGYvoAN;_T(-I7~3sb4ihM#4Mi@dnMMC-=Pf#
-`1I^BAXK(Z{oDsw<=x{a_m>Fy-)vPqWJ7>7<L2YsM!j;;y%J{Y+{cj~bmE4o+b?>YDqOtKY3%NLsLa(
-wW_E(0{rsD{ey!12H~(~t*SsgRxIm1)OzpzzadApn<wDWW|A>&YC_>)dkC4>UR*3;lUW}(Zf@`g0D@X
-6YrX<9?DD(XB!uHkBhln{G5HqQ~$R?*ja&q)d)aC$getjx#b}-z;!+NaAK+bC)rzkl{x4Xm4#OaTa0T
-7fi{(wVuZ=8&zE;_pMqUjxy8@Asu%e@`(wh&d9d$$h=7RAffPAj-l^CK4966Iw}d1$b91x%IL(ujKj5
-J0nfp$NE@&RV|`TBj`y)iUF8=e<GsgE0sc!0TE3GGzR<(Wk}hOa@X0LWbHffrthH*DsRQ2eQk3%`m-3
-`vl(e6=~9L(e0N%hI_09=yk?7@tsJ`qn~J(78Q;o!*jo!Om=A>0Dg>xr07M*(H>J9uJ(LQ_n7vt6Gdl
-!%{UNcZE3$x*ljZh-r+%Q#Rs~e3Anu-5X*WM9rwl;pbF>CP_Ft=qS`20-#K^U-uO58aup9cjC<n~6b1
-JCNe?<v_`}6Hhf%M#2Y7)!rBg|A4=hN3o>kdxlI|r<LUjzcM*fe?EZv2D&sB$f9p4|dn}N+pyNBae(4
-yU*JgZ5{_K;>D`5aPm&`Y61v#Z~Jl^AW$S6BzE7f4@t5A~lNPSc^{)&1GTuM%uof+Ncta3)Osk0=-R+
-piK_*kD#jGZW$Lfp#PPyqgb=i-7+<0?aS<%DIVEB0$NwSMR2s=rW*9M3Lt#(e-IX7ImfmLe0DvM!bQ!
-X07-U<%n)+o#;ARnW>tvJY_CFp|(M%Fg!*-7CUTA4GB`FT8JkZt?C6+*e>@c975r`gcwfyH&{JyUB4*
-4kP<B2lJqqd!6^?}<`0j(3(uX)Vm@W!F;32>+?kpJJi0HGd<<EOTroU3kIJzjGhO4M$qtY_wP8Mzc??
-}R&=+d56<;9OLavPJskuqnh6zsGhpYgV8-@M4{9v1ODHWM}CgswiWQTONNY<-OAX-(I<?7$Vbd)*bCV
-IBG4|H(bqyE$BML|Y`$ss%3%cIQX%e{P)zCk^=2-e%xAO;0@F5Q0ySCTWyJb6O5JJ(GOE}?c08RH`=`
-4NOeDbuGcvT?FSFlB33K?k8zmkG-Q9Buh?eY5&nA>F2-W%(?{b)lTiQr@{*T>&Y<?xkDNs@aT`<`gTm
-yc1-H+=2e1;Wr!webm~po!JarwIOb8*lJ=9qT882B5=raK&Gtnk@f&N413XR4^h!gfI26jX$qQe&49m
-YssL=Hx_G;;d-0Up`y9FwUZl?5o>&^O4outWDV+IdDFe2M70Pp{XgH2yZ+$9~fGv9W<XktfmU~~;bw2
-n{j+qZVd5qe5<N?crn*4DnU5xRUH9*FXAfu183QFfFbkqyXZ72<xYub>=YUsfTS^ff9U<wMC$`@eibF
-lO<>f6_d4t-S9gHC-<MJQ>WR9Gclq`u#g=(cc%ZVRL(YEH$2=WXccFbCIai+4HD#UDKYH#a^+fo$`Kr
-oZj20S={!$^<j(gw-g~`1A&Z-JD=IU;D2VcF@^5v2@{CKK_%nKmi}KR(+4UC|)xQWIgf>s6HRk3Q13;
-KL<&XBgxRhEV3Tu;v1kNIta=STiJWG@!oC3Z#3S^jklCS-@!51GBl{fX7j(Vr0TQ>l5lSk_?kkhx}D6
-|d`_i4FFV^-VpI5<k@Vw6Nm62^e9ad$bgPu3#O~y4vS_G`ufZ$aqWO4X6#=HS881#jp|I47Mr`NtYoO
-u!y&08f{iOxa2N!vM<JMTT8&CCMVAG-p>CFfu+cq&Q*nJ*U_c_D~J?jc!c(88x`a>B$a*p8ANek6jgF
-J{WK@OW0$AXse&|16!k@t*T#;S{c%bikFe@W?lFTe7-7`<}`jZ_1qNe#`RbB#82P~Qy3S_;dri9txjP
-^}j-&uoYmLLVV+5ylBsun?6^ZcGr!PeGjzos&e9Jt+vD85G!e^N*R$_;Jsp+mzV7jNMma4=@{PCH5er
-%t~y&RHno#`I=PJUdCjm4^d)^_+S%MRChl1sYGur_Y|SKxe`eN!rLY0ZxFZkYIy(%1i(WZDFC!|z135
-gEv16c47q;H-vBFKj6Q<?1vbj))gR)ieL60Cfx1h9H1^Pp<Qtkjj*<c)e8Z2m9>)#Z^#Zl1!Zf!xLjy
-U0T!o-iW7in~15`jOtL}Aq60lQOXi1?f;t-7Dg**r#fu6>YX%2rK+E#mls+@}Wky)7*VCbV=OeY9y83
-IqYlp5gITocoBV5;C{qj4#LGWbsRl51i#oCT}$A*-*a1BYY9TGMH*6=pAK2<i`|(hDWD3_;o3Be;$V{
-PjnHe$K}G5yF4NG_j{+MBAA402@EqqHhVdEw$i6ABF0?1|KZRp2L395S~<^#EKqGGB=}uvO)WdZVcfd
-)&Lu>C%*}JfAl!<1~tAW$3#!_(yCkqd=2^?p;!Wm&E|sWQ9SFi3024LktZXT(C!r(UBjxXbrkC!J+Hc
-DCYCJQqCU3^Z~O4Rjq58_Bpswjvtm)q2TM;RS^L%_OAWx|KRG6rbwlPl-TuTfR8j}3JY)+s_a=T+cQv
-E2H+*_T@+sPSLykJVT_DG+_oJFjI>*^i1a-?pq1sp0<Dr+2)-%0|+Vjwk4-e`zeJM@9U|@QcYrJfwbA
-iq~u&Oi0z^ntX08yw%PSG^S3_ge+!gT&F!P&A_rXtFXhiU3wXOe6f$fpwr0P$<t5St{?EP0v={DI#?-
-OHic`JVjQP-*^t$dW0aMg5y$i~{-Wojf(xgKB&4bB5P5^;c_-tN13wD8^c)TzDp*ShPU>7+pFSJ46bM
-Y0^DG{n0X!{N&+R4idvpH&A1_z^g(Xu5o>fs5B?3*UmOpgFJyue>J#G8b{kky`s^9FfB)0f2W6TqX5S
-@v~dFI@xVac=saiimUYy)l1x=tZUkend(pYrVQEBv&1|&k*kuN2sD>g7j~81Fs;7l<mx2*_=vId2?QE
-BV{qvT8K!)XcxP=9$^nwIbIGt{UffdU0bR$IjfiN--Xka$A4uSftBhO3?x{<*cc*_LfhfgYm=N#z*c+
-NwW$gzd;KPUm#{w!1#&Xdz&Ys7G-RtuEDrY(bK9(DN;mNT+6@mI24s9I#YOdjM@8j@&Sv=lN-bh3m?6
-A8cY^r&azY`*3Sd;@WvfNvnF=i?h_=qP+If@O(s*v@zq^KffLtQGhVH`47$jZDR(UjSP^`bo^ECVIm1
-jjCk=M?ELzc$SYA^+w7w(fvNh#1i_m?zlLC?9nIj4#28o7s|jeP<n}r8~2A5^m0HQr`!`&AP~-6gIjc
-XvDi-I9;6wLV6QyUyW-W15Ez+6?hHt7$cG8arsSRujYl`kaAp;)#RIiKFnR$im?sJF90Loj>R7%s8lK
-~&!SF2LgQ=_rYqak;t19{n`!Ge(5ecE58vT|<B}LKk2)nchA2aY#iVwe+9EgvGZR>ACMs?bj1b?-Av#
-z@f<v&ON-i>tZL_K%ecINxCL4CKB9k<CgHD^oW7!o9{UjqT74)oOYYs{l~)`t14x_!_RCOIIn1ymme<
-+P2sY(SU_+n+;A1mj)?;})E%*;ecExU2Muy5bp3R~%=f4GGvozBMG^T=h8^h?2*ti#8_&;NPRBvu#nO
-t9URpRykKByZqz_U*tH5y_e@fl=9suaqdo(dcOyuH<t>%UJy$QOPN6XeYYpqkY`~TL&8q#R;~?I&q}n
-Sp3fR)0`1GCRG=N9W*gm!Zc1cauxWrqo469-j@z3~uubTNT0A#1XiK+%c(8Cc$E`w<P0>wqn!BbBPao
-xUSFb#>+da!9<*4?X4JT)``?g|PSCe!O)N|}6!}Z{qN8&ohhaSPJEnr%9LVCeXs0-MIM+CsW<ADJBE1
-+Qn$y|?T1CyFP!>k-IjG2G~x3m8D3xkP!2Xf<cV_=PP6lY}6CI*6i8xu29&1U3o*U0Kln30)iK0<yHs
-Ul+R;}E6nhZ)gJeI)s3n2|y{BUeD%FGEjPU~IRi5N0F;qFU%(2-+a^w~6{egn@+7H&ciC5o&lN>%iTK
-4C;>?1|0TKITqp1&VA8v31ly6G<;Z5j`i8p2i~WGY!BWN*?>p7AVTAbtzj!m??5qC7gA^6d}UE?vOJc
-!^NP_;MzR;5i?2b&qw$qm%(?$!l2g?D9FE&aEwjeO?R~{?);rW1+4V3L0ONOOo-7}WuoipOBUJ2Zi<^
-``MhV@D=ji;eFDjC3Vt5%nt5za5v_U->54&0`lOf&gBW?6t@7HK7O9X2GtMTHsKd9Bp@`rp@A?!Xz%?
-o^ZHw3lmJ&(5YI`u9Ky@xO5p=2u`MEjun0@}JlJE1h%{2_l*OsqbF%`V<wUGzA|HIUWFPRo3YLfLB0F
-ygK*S^<giXhe|c<23pSjLu}yc)YDWTwV0!fH<^I)yk`j!UN*)hFI;_)kVJ_5Qpa++Evv>e;5#lzO&ke
-)kPm9^~a$;QyW@c^ghIqmU`?2?`aItH1Z@qDW@&y?IAi6kZ=J|#Fq>)Vu->e`dJ^vlhdgvPUrKc6u*P
-F<H#2E<zgyr;eDM>9cA|s2=ezKabhuEE`rS3?RW!4c!t@u++5Qj?+;Hg(L2n<vR3t(&)Ky<A<Oga%%B
--MF>)_(fK@JPIk`d28-{`6@O+bWu~_zf-2Gggg+)WDSf-Myxjsj}<l@^X!I+AM%VJrxXzqZD<dsnAiu
-Ft&oc0cCrN&mRr&E4D*J4@!4M$x(688<A<dt`_172eby(TH^`z^3AEv&lTTM&#Ky~F80+;8KDx@QH*V
-IPSJ%H4>?-@?ijT1?E{Ynznn4<(_cv-41uYqXpVo6sTmhokwY8i4U7DzNmrm)^CNy4+j~GFS`$p%YU!
-t9CkY*o05Y0IBYpZfQjDko=~*sxMDUfoGchJmyJjo}zOaiXP5x025#H9fz<6d8^8mCR?DWc9_P)>{9a
-rt1mPW@2Ip2dWzw*qG2{YQstT<bz_%*RkL0m8SIvTqn&K3DjY3S@7oLnU9cO*LAtg^wQRi&+fQjuodI
-3ME(hCW4beloKG-c=C+100CZ<V~0U%fKpR}rlw^BPa7)66LXgMC{(6M1bW0+b76=U=!jH58no1(Yq)M
-NtN;f(CjArMC`C47p*0Xb9t+r>9@pI|OC4D~<!ilP4NS5mY5x4+;FpA{r+Up8A__!8N7dxuO{#=pKov
-Qzx+CaO|E$a1n7HgtLu24%FFgGZbz{}`Pi%5e3eY6Aa_5?zNYXNYBfH2CS&D{m0PLk^3stra3_EVplE
-D+q>P=np4%_17y7;Pvl0&aTgOLs!n<gv4Njv%wP@nFHUNx!;OFVkTgB{0Cb)w{Ew~NXYlFX8D?bu^qh
-JQv@=$;e0+u?oNCi#Ctpo#rzI@7l>Prg6NB9!c$GoHV<C$iSc>5{X+?ff(j$K0T;O5jw8bZW=Wtm(Bf
-E(Ud!lg8*tg|BNAQq8E6P!`6ep&eiqU4{5GtTG;0|&6p-SJe4xPuO!yq?w>6__06!BRdG%9tehZ&Ela
-JnsyhNg04l8H-AIbs7=wq*_WWL3)pOUOgSEGBbE@kQV7Km4}@*skG$3*9TMt#0caeoY3j@KfNRpTb6+
--c)l1bQWZOEt<__|;r3!E17Jbq~Ivz(uQR0c6PV-X>1{)92J6Rl%4p-H2QU4X&bR`ip3CXf@r9LA-=v
-S;VziheD$W!Iv7j0+=0E;u<u=JA*H!Zhzx9ur*~}Q;$ryZr@yyu-X^HqNyIwWYy{|iL2F}Bx^)HW@*>
-$uhG04Aa<y8o7zSFwf~KA%2cZ!GHa=-^g5m>;dDPv^A5aR-ta;Fjh?XXwT4BT8g9j~VX8(sj0;T6Xtw
-_zQQ|8^!)1#)<aKJcC$dlq3zf1^>@^yi!$JpGXg&*l#X^f%Xfq9wDhg1H_?SgdMkH*>{~cv}@P15)Ux
-U*DZ13Su=`0au#)qC;Q1t9BJx$JmGB@L0Lj+@?V2U~q3a)@cA8m`z;=8PPd=^n6-J<>l-7Q_k4>xk0G
-#qNlj$k+@4N|V=<TT7NqJLKBZ)2Xiw%6F~#swV%uEW-XjON}-&HQH}Z%C&n=Qntr&MkG!*hi$(%Piyn
-wka{kmyoP0>Wn#Vo=>;3b0}3*Gts%mzJ7jUj@ijhs=DDA<yi*a{Tk;sEib;y85fL;Yc73Z*Z9BW<EUD
-sOtA-e9?N6z;!UXZ4jkS7r}@UImu|0_Pc4jm&Yilwbins)%mTR!;}KKm<K7Jb@H=;kb&O6!%$N?b&S^
-B~ckS}?9-w(6heB(<o=@Rx$h)km`00-_c07960*Xdfv5T&(k{LZW%fyMIxz*WFT}1D;%B*L1TiuWgJL
-peM8~tU%L|{n#WSid{5%`tvAzprEY09->KbPx;UFIBeL#E%gts)(mWOJk6)n361dIb3DabDMkif^$65
-*c8WiL}R0BK~mJ3t=RlZR&l@Sz~k{KjLGz1J}~cv_ayD+YwPm^|ULUCc{%>T*AK;&nDQNXwy$Lj;cP0
-sP5E-52^%mSR^}Iyei&=><Qmv3N7hy*Dfg)Lrc26HJc=BXh}?1Y12|Yp}S+A<@nPE9qPN&*eU)6srYL
-*P*<=^w)He~?o`-{i@Y6@*_(cxY-T>4xIP+$F>L~VR7tn#ZIS?gh3aK%@CaMU(AD%c{l}(%{Dj@K_N)
-U5rdYieyE;()<RM+!Fn4#eRkA{p95i`Iz(Z=cX7-XU5}4%)$qmBCRMw5!r1AI|gO6eO;FVstT;p|hku
-UkD8ntYJY}GOa^0}4@vbmN-z9h}7I5d`<zIIGRpm!}w*9fi#si+urY0`zo_**~HImKwdCS6pFXZ6y!V
-lD+<gIp15WYmFPa%8VISop}o^wJ-pZ5Q@#_bMDrD6mloc1c5*TSl+rxbF7R-Z`&Ug@tO~(+Wv2GPg98
-ua6EF`1<c{%KBvJ3dG~6`1*aBl_^4okq_8M$Tvbuhi{vd3g2f#g1SP)tDI4Na<1C`aU8}ke~jWQ&a(O
-pd=f7DXKM27b$f_+tw;hTEp&S#-i>&^T!2O^{%}AQ$QK^Q5hUM_gwESZ4W@$xw<|ieq<Kul6_F=XQsA
-!Xl8T^?c%?9i?op?$5C^2&-<sE7seGkahL`AXXs1TV18lfKW^YElPM>b?yN_DS<iHrzZ6Cov3Zu^?8w
-!fXxrV$!tEu@<)vTn|kPdb8NAwp-I(7R;_n}Ff{4e#9j}TNy=Cx-9*E%^xsM_Mz($MWN89uEdnchh<)
-LOJXrY#Lmv}Bk9L3`fx7&eE^dTJM2LH@}&ZD$Irgyk&`vDVwp2T`2$*64ibpQv)J`9+dRhL@~E)2mm|
-QNi1aP#UHlS*`2Ug_v6kKu65q>v|Lo*hz*Mp8gr@LwRV)XX@8qP=A!1a%IV9!)2RTHoX<{lj|7uUkkM
-(yQ^M%kXZ=7$BNP}jD{}M<BDE|u3^C+<t*au7}F>xXB^g&GP+>W8v)%X7b8<6T~Lfa?IevZ#vgXV<=}
-?bxyASsLR4ju%*i7?wcb)KXBFOiWnfIYr}q9*Eg8uTTgiOQ8}!hi1#ognLug4WAN&VKkQRz*V<N?fVe
-ELam{ODZt_UA|#AMiyRp5tf?*f~k97|p>9-bCHh(|2^CxKEA*^j5Db`v`_y#{Yt@V4rGASn()i(7;=z
-~U?i6MZ+vfn##SeFUC}gSeI5J*7VSIfWZvgZE1Trbr_YNA9d%()z>dHJqH~3A_7n*!1>Vex<jyxDPfa
-c{t3$^#F49toj7qBS)j3;i#}b@+jIiP$l*414aw>J~Xnszm%#q;$8a#OVx_;wuD76a{jkxp^6<w&;PE
-E_LdE*cnlpBU-J`-q@~A=F|@H)Me!B}00#D2_}ENa@RhBFvSN6erPZ6iR?Q!3SPegh!i%}n>pHk}hn9
-@<6gPj%@GQT()K~^pdzPMp=N>CO#j?RC9om!3W&#<q3ztSzTSI56)stQ5E?m+s=TRa*{PYXQZ?)zb<f
-jFZi4Q)F`$SC_^pG;axS|h~Q+gJsMF}zlM5$*K(jvTi3x_L^FLk?PjscI$b^D*oDV2E#xCwvR2p?&pY
-E9?>>NBweld5LtTKixkFBJfR=nt>p$kx-5^~OiGSqvqola}cCUOb@bzfxc^NP%f9QE?IH!`+lWLV0L0
--XX2WuR{J|W&hUr$V%KAsX|)e2i){2ZC4gM7ID&Gp(nDG-a3ou_7tY9!P}|Fp^-<PhpeZ+1@I;1wA3A
-Vmec_WmqFnI*vjxyB(aP)E;<&&cFzXpM}s~zB)O3iPQt5clbGdi1)g8?dh|YBPiR8jR900E778Rn@9_
-4Lc0aHe0CSVUCPP19&bIl0nbc4AVLFX`3zDsm-gAx4)nqMIGOlNQx;$Ln`eEV-;&%8%-fwC2bwhizn_
-e{FBU{z`HlmgD3`d@~sBDOQwV2<-uRQyza^<K{kq*yW7bcf0O?mvv)N&<8qhd6wAx~6Vl0<!z<Sqw3&
-Q<Q}keap2=mFt0n8BS>aaHp)z_093H{f+LN^?@YR63TjV5yD#%2s}5Q+~u#2%<CIhXzw%9KHPq37GMM
-&IV*H$@U^kMGFvzg?M)TurdA*`p5r)F@C1^#qs;|cTDD2W)3b_dg-Wo>8K)kz@wg3t{kCpM`&DQo=<5
-^^69PE=Qix~dTA}cvXNiemfuPuv`WBVb$Xw1IRyH8<O1i)etbeYtK5|&XQ8oz$m)^zK?=VzJwFncN4)
-6WvBOW=U?s(bZZ6qRwgScyw>3~!lHAkbH*XcoTK!|T`pTNFB|~h~(@C_7=Bd_h!OTmU{D*>B>Fg5!>^
-Haio$FEkOx>CP_6)8gfKz}7g|Gr~!b5nu)_`lD*qvI0x|-Iu8)9CvzE$JY@2`#LGIZ!$sSbTY8KSFY{
-<;BmgtG3%U?}T8_L|FH^VS)6R*|e*Fh(DH<StYqob<aUiK`{I)9d$UIlIYL<v@~Q|8XEmx(goxe3U8&
-%+ig@fn@1o<v@xwR9`P$uI_y=G1nFFsk!~(vAa?1Cs{k-6-BZKQQxqrFX5#vhHx_rufgy<HMuLU#$oF
-CiWAiS{xVC(LmXFhOR_W=_5SoHCOVTvb0eMrs3!y~Eto9{<eu=I)&RN4p`lN-$XXND;tiJ^J=~uKbof
-qcFziEb?o?+(^cdA(9+K0AaKNn22ejP?60j8z>{$?6S13oVQnqq5L&{W+CQGS)SP|p2i~Qsh)Q<b9le
-h9Reshph9_%3>q9(oNxA;UTXciByBup$KS>qQ0Dc_2ehginKx4G4|b;*Td*?Q{1{98J7Wp=BT(;M+NI
-Ffa2Ayo0Hdgu@}d~~4t7J8P{1foA`%3ZsF75XF9=Wh}8&ov9#058`r5YnN`Y0zapn5*M2>CpbVcJaY9
-dKyi889m;|$mJYr+i>!wjet($n@|Qd-fZnq4So39T($ROEZj<exFtM`V(7nH=<6RXRHZ3f!jp5g6f~7
-Q`7Rde#JgCi{`;`H^F8MLd`}C#M|T$cp(T=aJq=$niz<VBuC@HKXDE)ueEG-x;RmfSmsWlm`q1JJ21M
-yq4_!Xjy2|PF&Nk82DDsoqMRU6d@@_WfiF}NzAjG`kcyK6&Z^{#0UsU)o?Vleradx5@(amD`>=<R|U%
-!J6ZDTVwvRSu3L&K0h)vDVcXNj-S#BZ=hb;Ns2b9CbG6r6Z(I?@3RrvUwndOGyh_+2*xbcR!30qjku!
-_Cm`V~ti(W2kSDwG$O-r}v)}d$x=JLc1%8FJH0TCh83}+oU^QO_hK0)#-io-=n_O9P_NK7Ktr@mm4-%
-{pR&z&o-ZPt8dJw66|^<F(`LKO}8{fj2y7RcM*I~Fuu=)?;Q4-UehhF62l&o-h|IS`aDjb$LRAYeIB9
-DUiypyZcQI>5)NCC<;Zg!vmy1M)uZaCCa&t919akwM!wiUF@O(#PW570H_C`3zuZpep0bxuQmYyJg|Z
-=#W#4Y_oe!Igm@jA295Jd22KLBuT?1C4&NR|jvh;>T`mbnuYdrl=EWIj`ehy84HJ-k3CSq_0B-k4mBR
-?9l7qRTRy(*sX`k54c)HSfy@rM+4tzimc%NJ|tg`r=rVLGb2{IIfT(jpF8HtXXxbiBHK$V}r`$+`h=@
-di%)3w&Kj`743y=+J7Uka9gj_=aDg7D4|Ek4CyZ4!21L>HUyh160krfws0qx=go!GJ`X&Hf&G)m?g<7
-G%^g<?SC^eSgA1<yNWGs4FW+iQfwZwDL{?qX%=?Wjt3Ubjp~C>(H*=bp-;KZpfS`07Eg4gLC8F$;SN8
-t+!M-H=e^m_g2vvU+8Ih%sD)x0-SqYK@?rFJPAT_>vb9aV{8r#GxbjJ%WE0x(Ad6tZOi|2a!%XVXH{+
-)6uR0sFHxqu-=yuzVX7z(a_Sh!pL52y~vmET%S(s=k4-L~)?Bm(+rMA7%-^J+zx(Hm8pEUZEUR^#rki
-P>ul~g`Clsp)@9qiNuWL2WtIDh_D;FOYwmkS}Y4^K+aO&QrC3wkZ@p;rEoHUint-~;%3N?2t^d1%HBe
-L~n>qOHJQOn$={QdHLIp=5+#X%p%Ax5+<?`4PO+OmFS?5kE7`W3TrQsOI(l0sSwK{pj^LWE%l+Eyizb
-F3MASlOD}ddd>1sV##|GlFucUTzH4F&ce`ORe3$ZVc1@eJClrSI>m2whvB-Kjz?ZY0im?}u=P~+w@<?
-N3{g4Kxo|RIrR&}J<(t%MwS%4%`SF6rwp-&gLw>Nx@;V4C?0ET!_o$*XUsR5EF8CN@mO>2G-Jj|Ay3|
-cn{S6!9o>D5a$q){iwa?Y};|UvB!VH>#2T-d|{XM4e8;<t9z%&+&fYI*&nNG}yZP21VV^G9k-f+~Ida
-1+Axr-ehv242+f5;0jsbH?0@+kFAXyV*L^~%>0fNc2}^9jeBK>g&XpL{2VEeAe^O)GNDA}ISu;bk{?m
-R1s&tCtGPCB6_joLTOqZg+d1yQ(jVo)MemG=Vfzzt6u4-5%bWCuKRekqz_~gF6P(dkM$cnFGjr`tyF4
-AT)9<N$!N~sp!f09v<Y>?xVCEB$gS#2{*9wjoUs(o^J^D1Y}m8f2v8hUvUeoYzcZj?v&EpHQjv8eDtK
-V4}m0r0LZsrqvL=#2q}RiRQ+}H!5WzF<r&U~s@`;vK+(AX8aVP1c4bJXpe)WQ;iNoaxhKb8>v!DAJjH
-4~j#+{-8<ObH7HB^HlQ#8s2R(PV%txBV{3f4yorpIbKK`bODgWK9C|>`)XN;kmc$b>tHfd)Y8VT|#&8
-arUGdy8p2NCh#I|ZUR1CMBDG3!2h4&vN~(ki_fTyHWCG+(>faM$B&t~0T7of2k<0D~L(5yoV;;xRA%b
-<<f0L@!yZ+tG#y3ynto(orG*xEU?zie@`X`Nu41V!zno=kRxwN|+RosIzS~$2CL0vM6?(P%#^uZg0Mc
-)!od|dP+?^o}+NO$Klaiw1*LADCQ)|=kP1dAVz~!n_iB;_$u&Et)+fyfOUT4mEkoY`<3*Eg4Elu!e1G
-J?D9Pz&Z2_pT*G^iY%Is3Zq=2@0!?DWbSR`r$X_S8nk&zX9yqS+%Yk3B_trztT3|5W3bh{I4`}(V(Be
-rgp$g|24u7<lV%F&CXjT?Im}JCi43k&abM#Iqiui!ZeM#t&79e{m#-TX`#lewgV3Kdl@}LQ<82%s+ox
-0luvexL%`NHyKhfiNSF<s869V(zPMl(8_>yg?N{H*TPVI5U$7SEl5Cey(@>a*SK$#1}m14@A3anf_o%
-m_7vM5%;M2u_bEhM&g#AU95D(}D)7X1uzLRV3zjiDmd}8?I*lu}swNlC|{|nzVELvTGoJ^e2D^&H*3n
-h!09cH7sU4)37e3zbJ}7Es7H?^W~wT0_q>A9wI{j%0nqMSl!!)BWybJ2ya;R-$xi=hd(uezB7;TLer@
-u#M`B#*(PIL_&f9hy$hTEYBK)hQhY=cP8?AtV4EqfTEM?@BUpXpRcN=OdEknsKW&`fitBkkuH)&@0*O
-%9+rQ*DI=5|&d4SV4ddwF0rW+9oF&q+#ICwXkC$YTCHjCk>vM{%ov;cq#>KK6NeLM^<B-852Z`SRX-$
-)5oh8YA8kE?HKod!}$$*&QkF=!XaF*abJ1A?oMUuH%j5n&wE`5-n8basYv)FMw+dtXf08V-7i-fvOYi
-&_a2txjvhSrLH-=g}^BDX*v7-}^P2nfHzvmhC&WmtbEw2$e+_;g1X(vpg4n28AR?=+5AlGK8un+;G0;
-Qpln%r7hE+;CbprYWNr}hWLEI2ehdT<2HzV<oU~)jd<+{dPs-c<_W(<cm`Wr{{UOt%UJzt=8LDXwSDE
-oQ*3SD|M1MVwi_=x#n#qGZEXj~3|rfmUr2y-^$P=RZLb_}*xLS+#i~pCGp4`rpKNVUvR9>}vZ+@kibw
-xON5j{mjiIaf^ABJ|OVHSe^cc3P-+qu7kzuRKMuhILNAeT4syL#2h^ovtgqIg?h#TT|T^~2Z1>~`-yP
-u~Hu=UR;Y+30TZ@P$%aj^P)B0;_Q`Tt<UIw{xfBOOwvs60%a8+A?_t6ytflqHg+S`dSi_zxqR6}Rc7A
-J8KRIXTU&CFzMDkp1ueijV(+`yc!jd;hb);u9YN%5Hq_B!9)#&n4I|@wqemEAFKJiksv9ikCky&|mSp
-ChD&^|4H;$Y(BwXG4p}{>aQ5Re}KPY^Z)3tnB3p(C;o9Jf5qmggZV2`cLkIhT0F}~pWv_Pg)YSX75AL
-ruNZf2K!3&6r}`^?_?WdMHqc)&B8D>?d}R%yx%C?U!<w}DkSavfWSj)x*kV?`2KOz2w0e>5lo^hRj~R
-}Oml^M$jQDSi_p`>k#&BSC{J-PCnCe3_)c<P^jMk?aTIAtT>**XAM*&G6=)l<W9~~GYPjP2-U~D<Tf$
-{ni9T;0DoYsMH%Kz6K80((o{-1VWyc$8NUNJP`!1&DnJqO1B!`_#`MO|%=-(itqa|Q(kmmC!o!vz5oM
-U#<1XK+Z|tt>zpgk+h98O3q|fdWSid%d2OmF;`a%3V|3H&k3oODjsNFJVa=qN(?P&b{|L3<zrP_ug;$
-{QC}<bMAi5UC-TF@xcR(`&u4g9Lo<dj&(Y~IF=n?9Q*&z0miRhzu5ssF!2p}63+qbYkq*S+Cct`2N=I
-wfkJ613#YXMjN6!fhO_+*2N)B6aGb0A?>@jdbo)&XFy?H(*#X9@+y3+c#<H+Kae%RYTeAa<4Z1SxO%5
->b+;$rW7!BK6Kfst+*z5o!KZ=JUw&MijKhi0Mj*gvR9D=LqI70_rkO#Cnjkh|`_{id0A7~uO4m1vQI?
-!0b4>Xn)49~LpLf6U8GuF;y8!Qg1YjZfFsWkzz)I~nj=wI*%o@vB^3P000hM#Ff^9YCe@2c8?;z(m3a
-isAMaip=6IMUc&9BFJPjx^$aj#iE|{?wuMBaIPw67TkoG<q~Ra;3J==}04MLFFTji`j|A>sSbMwU$<n
-G(PBjq;Z1Nkw(^V%10WbZ*inC@Rmm!8?K2XjX%mq8qdo|8qYY6G#-<WH15CIkw(r9@91B|BaMYmJ4CS
-dPm3dsk2W~((-6lQF*&25<*4Z)_Kf&R@lVULH9n_aHw}_F8k2Ygwrwc28{=6w7LCq3!gx`~8(=8@3E;
-Kvfa6f(A$-!Sl|zj<ev7_wANQ@sSyg}M1DjX>?iiUo$;Vl9V@8gGxbkwEjkAnzwLZ?m?Z;_7nvJtMIL
-29L*s|v7y3W!_M>Ntz9<!d0LaH&XU>MR(8ZId6(B$+*wl2}?Sc{KIsQcun(f?=sTAJL|*x$sdu?g`l8
-W*S(*U!{-1dSWsQv(KUhLBym8pm!)XUlkwGj~OouiJd3<xj~p)QyHD85rZ+|4m4eKJ2QFfY>)li#>#x
-BdTpWrLw3dwyuLT-r-$3`!}%#I&{|!_sH;-#e2Ky?X}w!tO6d=;nVQa6K^v~UthjZtt}tdPOI9mOIP-
-QkFo3lxAb4%(U*^GZ^yZnYfIgFuzS<+{_bC)nMUDvGj7;i>Nc#DU7AP_f<>!m#^n2f`M#Pd`tmpP`9p
-OD{GmG65_u?QW;-c=wj11VzA=dg#KsY_g(&#E!U#T4!}*$01+9cgV|H17U#bh93f-O=_*)P>wXUCP{W
-OJ6wZ2jpvvXc2Z5VXhl?mlWH#1&4_@PF6;VsPQeJ)EqiYsj=>|=b`><yc+!KaMuW88H1L;NM$5}a=qC
-!2UDGi4BaH!qfeGy7B@_OeiUycu5_()0bLK%36KEAjx&?@I#*wBo!3r=FVo(6V>Bg{RB?nWzBGBXg+_
-`_x$eyqV2J-qYO}wpZKWssORcQ@vE@b*`>GXkD!80#BUOR-P*@#Kfxe*jvb-wWT|7ISE87+y1&y_|Di
-p-60)b)RxC;iW-CFDIu8h(V99RE$Z4sDCMJTT7&^@Hzf243(mfn#anuB<?|<C3iw-kfd+e?#$bOm)L=
-g+=3ZEdlb$)k&Lhb;2LDnH!c#|m(MFv3Cst3reI@P{tIOg?OnSV+_5!@fPc&c(#dP1k3>=Qe!BW?H>J
-1WAx%+}r(sZ=JU0N|8<8Xg^8G3r0`L(;3F5^-}cs=FY`FRW<zeL%&L}mFnjr8i%j^%pC8EsbAWAPjfz
-EOBwS_5KbQOE>*xgC!KhwO77{W3pBLj%^v5>l`L3XgS?^M0zj_@Y0q**ffV4|KR(0xs)L7X5M6=8tWt
-W}o}jm$;oh)~#*}55xzp!o@(Ft+&PUHxJ}_45SQL`=rpZNDj5^7s)``5tl}McL`5CDPWjU+lfgn16J5
-^WkzqWGuZcNw_=3DqWK6`>sn=Sy?|GA6<v0>)D}|d8jclR75H9LEyFJn++KE+2Atq8$`^mfW=nC83K+
-gF4B5It`90n65lL)Wq>+$hWsBU(9`wPL294@5wjUDeSD)w^!F{X)qNgjYp{n)Ks`YwB%;k9jVMig%q1
-}O?0xvg%>q$dcmF;(2wTuq5ozRz$xnt9H2%tczG`Q|&cJ_PR3Tt1*UGRO2YC*^=s`a(1=mD!6-oduf%
-?%sjjU5p9Y;;rNcASlVpeq~Wqbo~S*148FsMMD)QbS9(2}M(A=Ggw&VcqAf28K&EUgs-jpR{Bw?KLd)
-ld~aVyN55u6|`^MKE|!}<I8n-s&PgpI?y^e`d)>#ziPdoYQ0twQ#~&TDtJV9?NV2*>q)Irfu@PBRWa3
-bFW|^DI>>g^P*kZ*bUkYbyI|V_=~j60RW|rfS6X`)U39Z{F1qMz^`=K{UAA!6ws6+AaMrdUYsRooA-R
-EA^|<l{cmB4y9m_d4m6)kEgq?%|Fcb~T6@IYS2qgz<@i{9OOADCHusc?kN2{FnLz<!8&JQ$}rD*u&%l
-6A4)=;VPAlt_!sqtDZ`wLj>poiUd6%Q8H#KgJrC&4ypaLrHm4C|WlL@<<>nXLDDn%C3)+KtS~{4S6`F
-)-TF+N&fbJDw=9r)-(y<r~>nhLECSJdfsS^Akpfm@2IQHtdOC;D^;*8y;g9kE=?q0BCSuT!zn(vB$Ev
-v2#;Lq)jj2QK&e#GWRE5z<05gW$sHE;#1~cg2*Xjx%-><K_P~cUUbEMVSs+tLDdG`ICZ+VtXN+er+_B
-0?i>3lv@g7ZMPp${aI#bv)NOQWv7#c3Irthk*%nf)<qJE(2z6<35cZkqVs(FTv9In+sLVBwBh^Y|$@k
->rGE3VqW6HYkVwSEzv-|TPpoO8})(6tz(IRwsmhHfho&>j&VVUD9L-$BXyo*}<o)+7XjBGf_?t>Qlkc
-viLehCNK{+sYnmE?)fPP(6a$#MJ{1&Mm9(Ax{u3cj(!m9?gYn&#TT=Gt&)ZMk+j9{}Q>8$8A~EU6yHN
-ot%q1Q#y)qWnhI_9ZEsj4Cy_F9Hf-;dBKiK|zWF_oU%jJe&g379F7VI)$ebWp1EXI*}&p16%0Bo9UgY
-yHBRhM^J}Oyf}HjGI_#`(|1s&Pp2qNVFh)^je8XeLz&HI80ma{x$k%sr($+kv-S2OnfTPAXkwe8x7#`
-O2dtfnhT&@-8!YS;Aci1qU~}*Gz~(Og?&P8$cY%RQ3!Tg#W_Xdz`B;o>G+5%yroONi8&@fjyT=*4?W{
-EjJ1Pz1W=RUJy_0J(80ij<PiI4X_x_I&c0935(I!j=r0cytj23ht{roV_WIsB68&7EWpHbQyHn!f{L2
-p+fFJ8!tyL15E6)kQ=3Bf*I>16XyX0uO&vgbB7N@=zQqxOl1*;!cm-Gk3Dr?lvQgwgJ2j5%%{gjf384
-@v{C;c@Td)*c4XyvK%U!+~5NDzp^O=v71A8_ot2yPV#V6XzKZ?_tfDEX(u(HmrdTS*E@89<yJG+PW})
-Lh_zxQJ^Vj=VA5sfZos;NmKc8Q|@5EGfwh||8l2;r}7y_l;JgEkq3MKQ}Z3Ye>g6a=<Qcj8-7-ml(1r
-UP<jWCpq3Aaew4MCidFoi%@7<rRlLJ)u*W%<qinAY-k2h8Q^#|%PPeHix^_ET=W4Wnp<Nmm9lUsi3!l
-+Oj|uPavpOuuk<LMeHxIJs&4W~^iZ>G;<fXTHkb_b4!`nQ_VAOo^cC#SyoUC2KH{<5~INjjd|7=4%uE
-&=Nxg?lLZ93J4Bm8M~sY?*MJGRp5wGmHb)}q5<AY(7OTVI|P98AY6^E*Ky#5<v(ne$MsSF(o<JnGu3w
-j~mL`%&{8-ffC!us_DJ&z>0Yy<nee!``}B{jBjgyL`QDyb{K3eIT6lvcYxGS&UWUy~XUd`+OAyn_dRv
-We*qh<c$yEY&atQ9x98l&<)SX<~wrDIB?>RhVnH&yKn70-Vz^B=!f}U_y;>xv8$E7S$;EuomQw9N5P?
->cf@Jh_PXd^wh*@CJY84TlW$>4!TOWIPJ3X_fYBy_=w6;!gZtMvJ%>xf57e;p3ccBb!K(GZh^sEz)W}
-wZ>V=@n&)>eMTCajJON~@Rnl6FGGcY=P8Q$)yExN2&6t0c=c|jOnH3AHjoKgL~(rDke*^^JMhq4_}G~
-n?_?h&Nf4*FSz>?Y`#dP^T&^lXJyV`m0PgsS*1R*@3xh1gw-^H@@BiG1_+4V0ox=fYNtcJrM!oCa<A1
-bji6KhO|g!^p7f-DtqI2!6;EH&55SUWISA9;hvV)}h%LL0bMSU)Y9nxBiUYUK)#?JP2R+hTs&wL$r4~
-Z@~onsvE}|x_>dGw%1HMNgMybcdjVzli6W&FY=~Ni=?-@zgD$D++VBOfcMw_9hY1FqxaXw@%w9sX;mA
-XF0k#+wma@|!5eG?@CIA|O`}jAWcKU~Pf5e#s@u54wzV~3%~duL!QP0syFX%;CnBm{oz{f&^<`5EplV
-d`D{PHmlmz7k2KqIQbz!|&7tX>pVrl+LD2r>C$m_xz`MU5cOB}O%;Y;KN);C!pUF}pzXLuoZ@da3S55
-=oCglg@_<Ly`C?FVsw8kbqq<4b;275DUFYpaz-M`-yy_v*?Y?1?)vjb-r#_`pD;C%b5UPr5d27i9jt0
-1!S#>$#a~y-`_n!!qj*z3YD5PX>;l1o|knJ8IqV_*MqgUZtw|A_izb5RXz=f>>Ei^yIKn=wB1CLcn+d
-`|=gnk|aUYrZiwSW{2vD4lX#-9O5cgTdU;N)(Hx++PYa@ZT*0+wyKJEu+_fls^Ujo_=@Xzw&J=<UU9|
-EZaOFcy6pq785lM>I7?OX050)1?2c6x4{~SAdgqm@q6RlSrn(?_hGQ9}Ho)C+)vU1$%MawiFnPH)oP~
-&<z4JP$wi8`>?#X9#P}p_2Xsfd~)~(Q~wnxX?e_)f)_=;Qi@$>k??d)p4!eDQ#O~yv((r&is>KgBTZW
-#1+2KyZw`PyxxBkuU(bE@J=eDN0YAD1l^EHqp}U5?KV>Y_WTiq#a~gK7`WZ-tcl2VXJ)>03|t@;zp{7
-`ouo+8?erj}&r&aj9hwP2s-06vl}hvo)$z7o3Jm|GLu2!6xIZ0&IDWPzkW7O~Xfmq`b=_w)x)ZH>=Jq
-y)3?3U;aRKy!~43LL5)Tm$KmFUF$Z@CU_Pfmp+QBa4ERjUXSzoxcIBxj<O+c`qI}vFE0k;Og-}yvt!Y
-|O_{vFu$4l#D7+gCHsuOaHb2v721yzhhTlP-HerR21Z>LZnv&lk@N(@x>-3PMoO4Xok8Buu7Owm3s`H
-^o({;ntxN=<SQbKX%c$c2#ZtXiDG0Mxr7x=O;UlPW~U>mX)U!IAVT+UyRUQ{^&U-t=~flI`gybspRk=
-KaN&!50t>%70KGm4vTS-MM}jUq)=#RZTg&>6(Wm*1zs{BTbPxx}T+V;{6JY|*&Fl_w=%G-d&6KgJu(o
-Ys$Ptd5&+hhe$(vDBjm!wX_DVx5pL!R^K`!3|($PM6>|Idon~zMzEQ*+TO9mJ7+A+M@H9Vy>&kU&nJ$
-X1<PmwC#0dO{?q3u3C8^`Gk=*<>e(u`AV{$tt3N^=t{nW@_&`>+4j^$hpCEPu|21UpycaH!)kwr>R|I
-r*TvM@Mrj#swf}%TjA_(v$8}-V_(lv(8$%cMZCXkGd#Ph3Syh~IjSKykaQmaa&Q)ip{5srIdHgzDo;a
-#)*Z7ihB@I{@#uh#+_<C|;sm^{Bmy^K=<ej~G`w1O;l%iT|zbclKyT*&P;%D=4wr~UsU`hpBD`qu-aU
-d@!XER5gogJ}uDK<KWttwxTSCxM|#0nF(OYXca#8$EPhby?KyIWyZZ447te@5*UZs=m|xKSe;mgj%Xm
-X<wnHJKUf_*13U;QaWoOS-U2;6q+ew(n=_!k<d7^BZwDIu?{?I4vlDafwBvw04F6ZngmCXj3@r&YABF
-yoR>qM;r8TbWy6_{)ZM{7LBjq4UaK6MKnYpM}uha%Wu3<#cQG#h2WxMK5ic7+o`4V4IntUUc>s-uy`{
-gyKVpjMF(+mC$_G)gHRTI(_-=vaT_i;Dmk8?jKo^+<-}^5h~3hFQZlxek;k=LG`#A?iiKrpy4gmv{Zj
-o*zD_O{n4!ByXWT>W5S*yRFu1-BFL2pY)M&6K6*Xp9<2GfnmdhHrX*z4-=BY~jTzCWIUF(6@z-WglnV
-sXd+6z9lKQWQJN?rRcZg=%QS9@9^8m)9~QS@E5P5|;<_|3O&%)EBJ0>dhbjue&=4$I$Ewa<X%M(na7H
-t4RGqBhf^#p@3?<~p?4I&H+(w_JaYn<Oi+)zxs#L<J{WRgAL@I=0&mGmftYgQzKQ_>h8sXPHoY1Yb(i
-7G1m37Amf}Wel^LhxHeG5j@dpzYZpP_Ba_^8{V)-tPSgHaXYhE8`jqzVx(et{l$H^PT`4V;&<6JQ<dA
-L(`;23cTzf5iy>TjwYY$Ac}5$v%X)WFV{dE3rZApiy*CZuh(9adF*|rBO@ly{brUe?x-sxyQ5TEp?*Y
-woQI$(wq^@jADN>o`yi)uP=Zp&#YAi}nhVXcM28xL+U=$OXR9Mo8sRm=cb|AHR*hcE2r!WaKakacLVW
--|+j^Zs2J->dC&j5$JvyBNT20L#|kba)$kXRSZYh7Zs@2z|PM!8?i#K6FKc8u@+c0%%!^|LPP%LnA*{
-FnU_-jKTEx;x&I3PYaX@o{VqYKtiv`BMfV3R?(HanS=-Z+gHMwCOh-f%$Cu9fA9%26jGrEWT*Te3o_d
-h^&O6PW(K_O6Yy__y$|Yi)}X<r!Z21&WB@sKUxZOX0nHM2kcvl;s3#IU7+r`77ejoBYfF89>@)(kmDm
-qF>?Dlk=wNuawCt^fT!7%7zCj&@^Ph%;=j#xQ2gfHRw$P54Hj#~0n!rgO1jVCu`Urv9~|S`SO%o`)6Y
-5vQoau(-Fc%YZnkdFsey9ny4=)t-K1y{lDdh6=WSvIoSnI9W&VGv*nVKNpTomL#_}OAmpQG}M}5b7*r
-ElIKExJPKHgIr|2Q6|X8JDBct@(myU62$+0)*~dtaftNFV-$a_`5W7pGR$IJ?hx;5JB219tb8-!pf52
-^l9V^n87u<s;*`OId3iLojN!o`w|nCO5nfE$>x`<yGms_{bm2AH?f{KPq82)_B<WvL+Es%7C(pND3pP
-k4l;N5nM!LRpoXRhi6?%uy?D+i3IinC0n#iu)Edk-HA6&T%1-F;lsfVaY}`%1n-3?dK4041ZO!M17-$
-2_2uK_#2MI|UtXvy&rqNM8CvH`<3u7|FXp{t8oH+euk_+U!<e7xp94LJw!jfO8nqX!^ktF8a`!8b6EZ
-Fg2;KOKec)#4W&1$=r8=Yi8^}gC1LX7$X_V2m#=dVyjl0gZhTV=-hj%wl$FT6dZSY@<SDfo&zEhRp+e
->s`EuLcDjBQVO!hWd+cR1mkB)frCKMU7Tig7)o%&oe}{a(N{2D?wSzHkRmm>qdt_Qv9di159!o?b;MK
-2R+xr?U|1KHc%XJBmmkjET!Y#4R8OyIbX6ol>c=AC>OEhWVt@fr$A%I^N`s3G_t~o8M_M!NsQ3<P+F8
-o|iVlC_n6&YRL-<c2Tg>lG?Dt!+IA!KkU8K4Ub{64Gs-ET&${eI~Wv6@)?kZ9d1@%Zsf*H-0=C?9kuS
-Z2^?{?`a@Cl(lbl;1Z_ROPKyUEl?MAR_Wmry!6Lvlg<sJyoqsZYPVdu#h>$lL12ozvd*SS(Mqj3_G2*
-kdcAZx}nl`d`YPI!7e53XxMAoAgZ#Z-guR>pV1^230)-kD073k)r3e<VULhfLP24q~&7uKSSjj=3!e0
-Y3D)h<sXK6Goe8@<$M6bM>_8qEUHOoL{j_yR7P*PywC=A1CPA5H6x>=oR%4TTcMU?^;4k8l<tk^E)cP
-1hN@E%*mjVQ}5wGK2K=fSgAxgY-qUE>4-mG6>Av9GN6%P*PI{71b&+O<BSznli|PXAp6U;x_X~=hcWD
-*F(sdLC}0oP@^d%oIj673j+r~+b1l0@@NZwS^m^hI*;cM<VAsVHu3z~;gml{5g(>+Bc^XXnn`GenP8C
-6tOm_aqggf3#c~L<Z-N@l8D%_!Fq{2umOq=Xi#ztyadrq#vGUpH6ob7HA1h{4&o(~wjI+)zJ^dmpYnK
-wfa^+g&Ne%oxwz&aPMQ+nM<8Ha^!Ll^HeF{E8Tq8x6@L6bW(WCxERf5M0RU6`?H&MdoGv_AY(f1B`d8
-IEq+KWrv+rf`CJXf9tmIeV@u&|NX36p~A9hcrXmc3Khc_9cX94|BNCtb^-v^=>N5M<B6EqDtXRmG+jb
-InsgU)qk%i|@lN69l7B6$db9jv41#cbqacg@Wig&P`t)AIkS^u!Ca8^7v@^z$d#=1n(540hQhP#mz+v
-LxJN+cFW=!>q}*>b<fj)qHZ_@ctlmwmGW2HTJXLLx(Dg*9C7*@7&w^CnO7CRdc8SiPqB-1E<}sh+y}@
-vA&E6K$R}T1KTxt0?z&Qi^nG?yM&)HYpKw2r7`9)#l*E;~DGao-Seys{5z9dPQa|baZ22_!9uRsC-tZ
-1_EFR}R#^%7a_RCs(y)>eT&x42JJh--afopeL4`4Qc&5b+Hi}&6u9%gW7s}QZtkUL*wjF&^%k7+ltmu
-@2~BM;PC_#519+|ezB*dHP(-cLMMVgFgOeTpSgVy_w`ftd@w<Sr$Dim3-iBlY$#^kJt_9$1dklr&&XH
-=NzV8dN?F8kzm^_I)(q9G+o=P#|pwOUttykL4C+;k}4$UO}DAda%tnvjdTS$;RU~I{Pj|%vXB*C-JJp
-ePH~`4!)M=qhHA>S=6=ejAY2dXQkb3-cpY&`EEgd(NT);K^&3(#z=MVhE2&HAQHvZp+IBZl=%<D<1F|
-m;OLQ0IFqVke7PJ9Ouw_cU_egmisGEUE7f26N{<`8DYb=2>*vT3Nr&c$gYY|p@McJKz_%Ae;06|WcSq
-ot*xmEBm*h6ah_ln(hb<-~kso<7h$Bx4cArC|m+BPJV^r&BD3mUh+QM^Kqjjon)!JiMpaq4t(K;O<m|
-C$##ft(%5xNko2B90V=|>kB70LpT*$#~^NF&jOpeNCay6_g}OPIM!T_ETb%EfhR+1>~3710IpC1-3NY
-}Tz#rM>id*UAu5Nr*cVff=e4ay(vJ&{=x+A;++)FQDwH#X2v$`yC4)eH6}nIMwOw`c$#Jw~?>p>{k`P
-P1qz;jif5Tw0)okn@C$<)rKkR^3mJVaW@~kRtsx?vxZN#VP~CLwINZ>HgBfK9Lx)0I~*mi`<UR{4q8}
-s-AHtyw-@0MUA5j#S=Zk_&L3JZ4R5m8rEbuIsrhWl24A*P1|F?$@c+h0`F%rdg;Bl>Yy3KX<Br!RmJC
-UtZEz2I2r|d&&ySdI4j?2}TdsGJI?kq)UF9n6$q{#Lv1i_;iJ49BpJzCYUf4Zzz9Y=oxS|0J0tN-Kd$
-rjUB(-m2FjXvRStDro&3Fha1Pro#q;)FHGT*7(ghH-js@H|^rc#_m#t9s85dMom)?|OC+Mr_t%;;v<^
-0an8PtgUnvCKc%h~+ym@{AEe3p9pRC#puDFd6OLLU2ksG3G>Gr*v)MH>5tX{5g~cw0m9A)CPS!_{A~>
-k*RUd;uNRry^?TcJ62!z04SSYU$zkM)p_||9PaPYm&GgX52QrWMElS2_QtX)1e%9Cb@mem`wlHV7#oc
-@!_mrkXu0e0A#FTKzmx8d*;PJWvB1TCT4y)q+b_kJoVR)C?FyYe#qHAbtje)hhPxiu+N-cDEBZ#s-`(
-9w12zWWC`l3*RWzW4y|JF(kgO`HT=XDrNgZ8dxb!>JeizI5aplGVYCQ;2&_>U@Q(vxC!BAnIE6yMn)z
-nM)dM@6JQ4Rw^?E2o_=TTL~t`1QrIWE5U+DE?l0#kXP8r_s~>R2HM0(JbJc=jxCS8-v5k*yfnNKY$R!
-9VDTj>Ov!L%+)IWpwL|6T|iLMGD%DNL_qMqjjh~(TuBMI3XGHv+4;qHZd8WfwjZoUyHW{v4h@QJK-zn
-1mj#Zn=`Jz)W8^@4*lO<YD3Kac|&BTz4VTRV!ZFYCV0o*0SBD;gz-LCng8*Q%d^|d{O?k;d#*r!$Z@8
-o%<5Qdzq1qWI>vji?D1w?sbrU0AHfGSaPk_5p=|0J#k@LSu|%H1*ny;^0UaO#?e#GDtS=mfaoXG^*L!
-gP$@nINUlO6W*b9w;QXhF(G8<WQ1^pWoPCFFNa+6w~aeCl}cW%unO)}Xa$zaE050d6l2(37HBP(^Qf-
-6}w2-Z6A7mLyrSmJR(HWUS%-Pp!wbwfeBn)%yj|CF^`yRL$Gv>-S`2n{KswK75yn+^8+)dqWBpuv7Fx
-n&)T#X1(=qK@4?Rjy;iZp*-%T51#VZKo?G4YqbrUF>GJOAnYK`Jsk%J<duXR1~ZuPj$dLQX}dJUM{(4
-wj=Ww8)ItbO^13B?5G!m+bSZj{NX4f;h60oIEu&5Mn~~bITa7~^aMC8O|<W3_p2wmR!R#W!TX~R%XP+
-nguTijN{r;k8oK}^-g6DL5_fDKr2+jq;N|_z3c{6fkW>30-wEb>e!`#0_Y_CI$7=DV<3=fTK5iyj#qt
-yKaiz%jSj_iuUNDP;D|lOE#0=&=Q~Y(7!_!3$Cpq;;X0{T*<bRAG>+yN$V<t6S@voHb8pm$wS4#sp5-
-0_8L?d<ONT}3-BjJ)KL%bygH;9!Q6ZqQz(nXFWN#Ai~y7UD{Qlyg{$&e0lBwE_Z5wo<3Bl*&r1jp+D(
-yJUVMSLa4k!xug$1z=`f&|Co0g{#Dm~2u8$FX`yGdRAH^}QU&x+Lj1j;SO?a~!X$l=^cV=g}n%$FU`o
-{5dWmuH<+<;#Um}Z$!MF<0x-P=Q*xK{4~eehQ%t5<Mu|WlH<4;Qd(<h+Q|5(p=k%=DvskGMyZ11I4qE
-g4UUbBQog~lfl<ohI3B2wQaFxBlcmWVFF;(+aa^&MMsU0W@o<i>L_C<|8HfjR{7uAtIKBpP!f_N2q~G
-*BZ4s9^j)wxJvmCERyqe>y5#P;mT(6Nfa=ZrdcR4O0zMA9ph(E>gM#M`wjtjxk0*)&YH*;K#cpAq85u
-eU+wgKD7@leELIUbI96vv|x59N3);@voox5G$kjwd1R#_{QhH;!d^3gQ<yo`HA`$MHyubduxwi0|ik0
-peRZUW)h{j#nW5D#uqMzLMjs5nsmfHxV!3_!`8m9LKwwq>Qm_kjw9ffDvwbQ(gDe$M~*GhH-+sG@AJs
-rv#ICxJfuSQG>}#+~f{!G964#aT6bIk^&}&xyh9=a%`+^!P4*4wgiI18QkHqF}z6ulZo79J2wdh6FoP
-1kDG*p$=%%KIc^dSCQ;m^jGM%Q$(`I}9yig0iH4h)xJd?>4CE%0xQQ7|g1L#7o8*H@7j80WjH3YpLtk
-##WsIXG0z<+L-N!hZBryE-L1tJV@09NHx=WyZaf#0UwcdVEZ~t7XhoOvpQXq(04Lg^BbZ>pYaf`^fKn
->r)i50$KXROs%n#ye1#6nFZZP=->29-UkY}lz*6|<=(JaYHVb$yv@*`z>wTp-vL)m$vv?@|^Q_!fI`e
-vtGxmPPE5dTV>BgzMM?_1-Why>~ww5V1}6m-kV6DJ~G3Eq=eZJxp((qz;>-1}V-3BC*E>7fBGdvgF4_
-K|1>$@IQYOd)aSV(LoK6P&)$Wg053*@1pD1t#{zvksuY72PB*MCD-!lK3AWebsqY1-+AMKQLR#A?Tk|
-l?3%TTz49RW0-Mc=Q>W|7G<DtBQxiBOfj}W@b~%<_y0Q_YkGZBQ*@jzxR2z0XCKjCTTWQ|!h8t$>FxX
-GqufX`A<iH{r!c`;pcr624Zp4M!6p#*eTq?wqK&N!}{dlqESKfp;oj4HBMzucv2|H%AAH*r#u1gi8m-
->4S-)Wnwr#p%(t<&_EcHp)e+jkXB*OMlc`+KGrenVC1g;yF?^A3S9m0<UWD!bFR-LP4{&eZ4%L%n*+r
-r9HR8cKFq_tmNNU18vGn(m6M#7WzV;^Wr7#SPZp;sVpIc!8<FRe*bQ)UCL|X2(}igy&Z1XS2|~kOlwr
-ilvI-ZeF(jd<GxPY(I&qWm^xN166T*A2GxKvmS!(T8RNyfFl>{P~b-&11|2@+qKZ_=)9CRBcN(T)wYp
-<1|k}08;BGBxQ1{T=Z)q0>*r+uUF9W)pKu1dt_ZabW%u#ZtM=<v2S9M-v9~!sMWSsylbSLCdF{co3mA
-bMn}*j@-UE4-Am`cFEi&quQ%3D!v=vFprVN|whxrBBCbDZsosZrr)o(wqO3@piSJ3mxRrnW5_!|jOmC
-p8NFHPcZ^H?1pis42qeVM!EJ~jiam*2qjO}&o~`f(TS<?GgVGyr!liVL{elL(dU3ea@jFa;Ycvx~rDc
-3OV=bypP)nTXpQLngET4|=c(2i)g7MNA~(8vxSYI6M;o6%fQ;W)seBQlxi<O}K0${DezSw)Deo6d)wq
-mD0*(t=RH6l@4dLVpa4pw&cX>&9<XSZ?)z|KPyp#i*NRT>-g%5-T$C;uM-jS*CM(HTMf$Y`}R1TD7or
-R$PKobBtySxjR7`w=#$YR(k6R0WqM)uO^AXNiabyl4bfJrp4wsG!7h?-mhMFh!-+LgZ=Yf=S{Oy}{Q)
-nr<Y+8+-~Eu|{Q+Eg<nIr7No8NRl1)VmQwY02{QlXk@FFShZN=1{7%PqVx=q&oS__GD-H_gz6<Z=c)3
-#M*dYfs<7Ef0@*^|G%|2v;b!9aTfH3AM7&?sPvfO7?WQo#2G+%4ee0yYTfqZZ)`7%pI}fYSwhNWd2ad
-|SZv0v-|YI{_O7^z!5I4grS?I9<Rj0Sg3tR>1cK+$!LC0e=(FtpkT$1Pm4ME&=rd&JZv|z()iu74TUB
-KNN7YfO`czE#OZADmw~(1dJANjDV8`d{Dp~0gDB!5b$jQHw#!T;12>e3aIqwu#<p&1dJBYDByGfX9}1
-jV1a-Y0<ISDLjku5ctk+?draM2-`01!D?ZKy>0H2J)ax7;r*qiy(|yLxH+E~?zO`@I_Y<cfL{WGqsAz
-?PME}a|Y9bXZoPsD0XTdKI;1n{Mj3EO^v<O4i4<>gJBZ+r}J%!vu3?z<>Cpu;tmurd7&$K34a%Y+HAf
-RjrZ5GKT7Gi?mK$1qX2yWZ75F5!MR+0%WOhg090zY)8Vd44`F9s(=Y~#r!_&K|gZDH65vEM_+wqXnD1
--=uBmbq%p%|zfQoJ7J8O$LA)El_0zm)XP&Py;F#{@Z{Lq%)DlXao$oN@Hf}EX-`?HUl`y11uH(=dn;`
-0>AUYBn`r_fNc($4Z0j~f!xn!AvA@B_L<Bk75rtAM})gvF!zGgki$oJY4Cp*vp0!2H4vMPg^%_ch&Pw
-TigsrBWjTEC5C?*dfpN)0%?8svrbm}^AY4v6@`cn{SWGrBMK`&?xrT+8#oTkwQd!J$It^gFVOnN_8xz
-p1A)#atm}Ws}{aET@NtorJ$vHh!TTQ7PMkAJ>SuA%fj225XpE^cUBKXZ@e74N*2uFVBfDbDx8#yesW&
-^Jph`|hgXNmmfp=SZ)+{!t{ZL*zG)Vb_A$2a&E<?F_LH#wzy9E3Aj<d4N+!&5q!r5@I;|3vv{nQq|@K
-4hBY^lOcSv^LTs0@@Wh92?8wnIcthmKvBANT+j{a(F}k#r&MdIK6qjYc0OJ{)PCk)TaH5@eOgrXJ$Eu
-;m!s37Vu?bVYF70<ht1uq8wh-zd(O73)MvO8RdgS$>KW9IXM?^q<=6OcGLXMh1g7jVqU*<g*~>4b6Kf
-0-B6aC!*5=mkSYvu7NaoDsqD1XPqYkg=q<v_7Oh|=tBDpCdYYq+nA2uFa`^vB`Dq?g8cYAw7F@{TH`P
-;2>s(e&LRov8!TKg_2~3VO=cT0W`Wo((f45IBy5MCL^E8|3t*z1<?v#JGAATzQpA9bLkn>u}Q91mk_C
-B5E5wC5$$1;OHlZBvRy_=btSeRa>hWkmoA&p#Q<N}w+ltR0@j_W;zK33>upY=a*y;|rigx*i+!-c+s(
-AU&*eMg}$5c)u&R||cR&{s-a-$m$?gubgB-uGPJO^#pa?+|*u(D#tz`;O~1a(qJHQ|LA4xjtV`522qg
-$9InFACc)3`l~{}QRu1AuN3-3R`)GTE<t$%^I|IN<K$K^j)cKa13BGXqBH_F6MSMR;Z%4z<=a5^BV+{
-RHHJQ$xy%;w1`h$lo5M=LJotY%^Vc$#ct<Vo$-+-+7TRz}dWC{78>?mgxIV|0l?7-!{8L~#aBWB0xv1
-UZ<Kx}&8xjs-p+ik{(sU0c85$lwEy)8CTEmK%G9@DgK1gtLK72}WK|F|3sl+0vBpyog*N30xhF_@Tcc
-a~nKRx8k&3?tL{F=Kcbowc7^XKe;iPO*JHh;2T&Hr@r|1bD%%+rkj?h>GA`rYo=tOO{UelEB9YbpW%)
-!(i7$Dcp^oORB2x6QKPySe^$`EBC6r3v0a*7Ow=E-5N5dF=7hvZeNA<;$O_Sn=fFp8EUK|5*9Vv(K%1
-{)HD;zx47eufF#B8*je#_B-#s_x?ZEeDL8%YuBycuyNDoEn7d{w!L!4&Rx6r?A^Ejz`;XRhmRbsK6d=
-X$xl8#b^5c<&z$|@%dcv_{^s2IZ@>Fqs{Ntv!jC^)tpE9!Uw`|(;Zoz}D}P+QcAXN1i>sS^I}fF&m$#
-2^dzIR+Lr4FBPMrgTx^(T<{f-`*p1pbphxF+i+V9S={sRUM3LhL188zgtq0z&J$BY<x_o&#^nX}SN>9
-aF3ADWYuos(;R*pg?p&7GG&|B?G=Jn&$0O5662E?Br|@&7dc|I_jRm(yQ6I!+fqW~|<jFwU5G&-kPX6
-DLicGIiSYd++1v-?sh#iuA|z9&e}m&>i${PWq=?=*vOxEK4kJp?{)<zM_SGMGO6tE%bkDp<nCLT)(b`
-9+xdqrmh5q%ROUF@?7Jz%$&5`d6TTE*38@-G@p`ZvW%bkkZG3HkdvNk$z~SQL^xn?OwF@uXIV4nnv!z
-OHnYQ=oAKaCB7~ee+cY{ipZlCbCV|X1k<B0tBs!2Xjl}tDS5WX+L16(1bgqvTJhr63-`yP~x{{I-Nci
-yZf~0~{kj_H;Mkh@x0C^3Bx}+rBC87x}C@lbA1jM?Gj0~mHBj0SEXExs;&*|Ye93)GWE%Vq+E&tNQuR
-p=LH~!N&Oy-LpVdjIF`5<8eV*@b5Pb(mPIyTzn^Orc1mA`vHx}DpK`FJrGC!0<JXcqHa&MviVL}z1jA
-^0UQsd&C4oCGo6CJy&zHfx$C^odNKp9Ot5|HgpZnQShwNzUitq%w(HHs$=t^vm?hbjoze^vHDZ_~tw4
-kmHx*mE*y1QrS$5g^kOb=orJOZ!*IfI&_uS!re4Bvdm#Kb<Q@E!L_qlA{$FLxtPT0bk?UbzIeQHd~*1
-5cyc(he<)Y_;n~^4^Be^#4Zi-GMEEp_%!iMsf8wCDv_V{x1jR)wij2-Q%alFS<R}pL<j!rTA3w{Qi`q
-#hvsJdx+GgAGfY=0E77H)Imcue$Yqn%!9weq(W;ycNG}B^BwKx(iAvK3-Azq9N!^f~OObidh0{`<dED
-Q(zqaQLU)oQb(rLu6wSTY3$>5^fy<T-SZUZ%7hlas+@8`mY~<}kxaHUU$u7!LYJKj;qKpgr^VpYCpM(
-cQC^nR`It`b{wMoN7(Y(wHokT#F_%N0XIm%bAs7vJBUR<gvlAg_UY_mziZs(^zvgxn@(2#*}ZGWwWNv
-%#v&7lpNHceL6Ihn$#Rksu>)nfgj8@Xg~+HaAz^4rfJeGx!K@@2h&@gJiz?SoeA_fnrY3$Hj`z3X3lI
-)IwRx;`#h7?>SRswtZBebn$4V*Ig7iHZTJWFxi)Lt4!|A~rEU8rK4t+UR+GledmW7}56S2olGnFIy3I
-COA=xsmnpwGNCQWX-?1P6lkj*JJwR7?LX6UH6PoARSFFQLGFi2I50@&+25b~ifVtE;+nW<oym6;<F`i
-5{!mh8-&RF+7<IuJkLVOuT`4r%C=oi_~(%e_-D-2c2xYX&A|o;B6tWPF>!Hl+{aQn+b_f0=$>PMyQLA
--&Q}EQy`nh-{fMdCY+5*3-9d@4lK;!3E|{ix_Tn-?K09n3a_~kL7po8?vE|d~7>S+Q@gyY+JS|$C{@J
-HO+;Zmzl0HWt*+@``tRenI?@~NK=8(Sy)WvLc|g!+mxLvn$TV(1bUTTARC0R+2H1SLMBeqO*;D$?U$S
-6H+EB{{f&E!C4F(OGj8|{l&kV)OohyuKLcbh6tMDU<Yi`?vrNfydom;cuBaIkO<AVYJkyLgqhS)WHVW
-H;=CqmQ_C6fEDcZS^b`dT~ejSyhW10`?80AemPE=L<R(hK^_TzJ~czW_%P^&-V{(b=bx|3dn5w7r75O
-0WF;qOKKqg2E{LS5g!#;4k=Qfc-`X_v&@O@z3DyhzY)ZxUn$nC3}>qLd_PVn8*<hcs1c2>A@uW)Z$$H
-+Rx)bYNvCb3lrJI3cpT0%+sz?&U;BcOTN->P@<*d6DjuJxO;6w|hiTP3P)>N<WnwQAK$WRRre?{l5o|
-_6ATVW&i$4;-3a;vIo%L4(T`h`M2X{;1~6>-(w+!)PywoZ7uxmeF!<wr^$_{mmBel@+4jp+d14k1x;I
-IC?P+6#-YN;h4?7^h(hB-G--ZBGg(bEQSFJw(yhKrO<;AWN`JGWn-A%hrXt-Yw<q1A0G}9G->JsGx<e
-(<t7=D7kfti&T{W?ZmJgwoI6esE`p-EnK?5Ou(sn}{?IPV3+erILAG3E7A;k-UFLyaDARi$e{UI#>iE
-6XLO+nl+e?44?hvGS2eq_b?Z^!ue>*mGj1G>9enrM@08G9GB`9lfmE7LN-n{-W^K)Oy&B3+}#ldg&c!
-hLXhaO1zCn>XoZ4FsM$L%5wtH$?{$P}8y6uM+IAJXxU}K|TdR-UR_2K@phet*6EEQBba9o6>@nN2?F`
-hcX%Eg=MiGLzc^bf)@OM8YjC4{0&f#3cVsgNdl~((mY52#2pafSLt`7nWKC^9!JO?P*2PLS^N+;q<7F
-{M}4SNbXJniK!4}S0HJJkj_7E1)Z4CJq^ng8>864-Yfrj9$x<vy5$Ht%p&kcL_9lVAOW;JFl8SDgq}$
-8DSB+n_s?yi&lj0rj1^MlV;eh+DQ181&bgt)Vs&b^2aS9=eK&_Q&RktH*s|Qg7PwEJtN`<Ej@r-Z}R|
-F~{UQm$!fnXOH;csSX0O11fHM~XfN|D3u4xRt_w5D+V{Mr#epw};=xx0TtTYLi4KhKExS)O`Bo_eu7R
-j@kMj(A11Gy6H=a^6h^Q85M7VG$3Cj;lcZD978;4ca^p(lJ8i@N+enkbdSSKQVw?%uRlHoJtmtC)SD4
-O>NRN5Wbg!QlH^a5$r{Rqk>5AFJ0;bYdTf?S9UP_rKpoQtzN{-($p3_{|K~wpdw^mS-J3qasg#?vM8I
-DfXbF}Zh|`U@j{Lx^y};e<)%H98DG+QV#j(p^=0=H78CLns7KE@mw%_WID(e~+5OG}LP`q>c}AuS>+B
-s+r=Ik#@vQc!bT_-DxF)%TV_nsw-Cf=!B<f+;5JkFc^B#cLXH8d#^Co4Z><L1)JaOx?aeoCNFIF^_ji
-7LE(jzL3^ibSKT8nqT%gy8cc@-fc&o{*zG{}?OVO>Y=NLx$pi28`!p;$xIA}lkskvtDQ9OVteII<eTc
-nRW?(+c}Mi%WP=4<*zYHBnodsKRif<@CQve;D-|w8^hEh3O~yTiO1_w+LAW>YSVoJ(Z-xWEJTE?Lr3&
-YuQsUu5h{C*bQxl721q6U#Ry!*mj6^0~EABfe=5`U)FB$G<_Y?bXBWqTJ0w4B-DFH`_K3RKA`;zN^`W
-wH8Q;~Y=yoN)b(cNuRXYhvJUh>8Lx3}e?R`1kn^B|&T{u@fV*!eWZ2oJ@~8-aHWt!1;KTN2-xQyuX6=
-Lp+KJX>gL;$=6z(p>JxW0o9o!(zd`X8Vy^|E43gRgQDc0|Gz<$a%zK68~q?;eqEj8&F*ZxVbdSy+!YP
-U)kksf+S8|4RatBLBkw;B8m=^@(c&X6Y^BimbA`U`jXQ-QzsMD-!i+}?$>kMIgtc)4I13s-c&eDwkv0
-Y>nARkY~i<n(9>84pY3IGXY*sJ{#8qA24uKwbugKtE%R0y-l}XGJ)XWdc0FsOaHCdRYBPk2E!u2^Hzl
-)VC)EMfehp)dn()6=W8WdZR2vqsSp#`r=`vxC%O;?aKFQS~|$b{hT#~)VFUkdlJm@zag!Ef9*SF@UMN
-x9R5%3JMN)y-i}+Y7;Cb|@gboRMugMIBDYB<=lSu3+?jmNoV-cm*i45!y$)&1eA_G*7@o=@D&420W?I
-MOS|-7;ILjpbW`oNdlLdUo<>ut&W|`uwmaKRf&RQWwh&C@Tb9RmhVRCL$l;k^%0SS(S0li}naTgabP0
-UTRWtqlgW|{6u%?85B8?F;@j;K}IGhGvHS=P+a^R1@IxzjS!OmP{h7V>w&k;5Ix$8#|3N!BzyqzKMRD
-P6?MKs-*7fn0^@<HQ7aXCW7ePD~Y<gx85AE-N=r){Tpwcu%}BGGbs_Ru+uX6_czM_%lqygRaJD+9U(B
-IOU=@rJBcBOejGzT#EyD@(YR2v6?J#mP{)|ku?cu#YGJg<7zae&Nba&ZsuHAAP*+bH)HB7Ymw7ha>Px
-Z%V|p4Z``KjWH5r$;`3*j%orLZu@$FhKSIviw03bd<mpT^ZL?>aEJ+qq9%gMHw~5xQshJk5Ej4RO&b-
-VVkez#=nK3taj?Fv<2LBiWu!fTmfoKz#YPQ-eSW2v>d@Bh-GwwA$pVYY+a)8m)tjtGRvaHQXn`F++iO
-aP?ygxx|;S5kxZYHK0IfS#qPWm$}Wt*3CsL7aSQ%#mUru&4s;pGErr;Auu(x#<ZSW4Z|R0eqtLmEf9P
-Xnr0nIsD^wYUu@id?}QKs(G4@(|CVR7e~%k}-`O2P(5n)*CXj(rr?f$z&$GTql}R(^%ldilHMavqXY!
-tP@b0XDhHQ#ple;wB+XCED|phP<b`(ay6Ko>!=&#YgXS{aZc`2jLFKw1WL`anaKU9n<VS*MI9@&1xS}
-uZ8_xBLQKxU8D9gGf$8X;7i{ttueC`g3(Ja}Sv<LbrDu_&$(gg}i1gccV`~F}6|i)ipJz2?PtF9M^H>
-T4MxGG08x5urt*bFN6-xe0OR8l)@bfv#--#wp#%f+Wc&!HM;X@}qBr2r%13<GaF9QP`ZA(vwVgfP%bC
-rbIM{*F?qTjobqVe&Gi2FdTfHcZXW9?V!Y!i73Q^=`(Nkx5pPTKf%p0g8NnpQB8LPE~+(h6mskVsy_1
-ZC66AXj5tB3QC)nnwQmZuu4H`MH*s`ewUA)Z~^Q%J_;~x@zv;<(97g`u_U<`fm2gbuQxNuLe95M#$j@
-G{@6VQtE7vcihSK%~e3$!-9LG@u@RBF^q4h;Jy(&jF0<9lmdDR=q2pDo$NXZzX(+#T(vO6ecBy_Li3)
-&e2CC%g+5N`lZ2m%!hDi|(?t09inz0cc{ahFi-he>z&+X)L2EnVzCh4iDBu!dUnJ~{ML2jLHSRcmLFi
-u+^t>wKdqbFS5cC}p_NRn>pa)M2InAi}3T`|)@o)WFwzaovd;i_;|E&N2bohVP|6kw#&F@zGV_jN&uH
-uvZul$Lhn<y2K)N|<ai#T6Fo7ztN`XAut|1S8S{nTxK++Ne>_a7(izvXLtw-2{(d$-X4EZzUk@BjBQ(
-Bk_)UL?%@#CXibjcswo_uW&L%wN(|*uVZ2hcCUxVd0B4?8sQ`q5=lr1ot~$`TP}48{rpT=P*{lb+_qW
-E8u!?fAr<^FLxo|zAU|bf7{_NdWm5ZK;WG4`GcQpNb=_oeI9Y6`xB?Xthr3c;6>c$b!d;{ob2<j@^;i
-Jpjp5y0W$<l6EH=<=>jGRs24C=z)%6Z38)s(M?j^3ZUPbkul~Vdqkz8&STEoO0VM&?3s@uIX#w{OxK+
-Tle>4yOT>)PeaFu`+0+tGxFJOj%DFV(AFiF5@0Ye4!bZag%X@q&8fNBAi0uq_;D}rAEYXqzouu{M`1*
-{OTK)?(EQv{qYV3L4(0b>P>7BF1EPysap1`4PaP$^*JWkH{S)dE&tZXW&`p<gXvg@E}2W(b%hV6=e!1
-q>EYEuhpW;uG+{OD=tNVDovM|84fSOpC}i{0n)l;y01b4I<w}eCEN;{kaLbPM&KTD3lz2eFTT+<NiHx
-vG{%y;YxA;8dL~6Tc*KvF}@_@+}qtO`EL8er+h%|_Er!pz%!uM0)7_Y5g5GJ16~a<rX#dDUJ5b-U<#-
-x9|eOG0|+?@ZYBeyfzV#!ns5+|xr4YH4Zu;LDisP63$S|^LaG4Q0L<%x>q!do6u@JkG9a9j00X*m^FV
-+{x^j9>cV&0_Fmr@ob>rdJ0F3L-&2<260>^{ey+Ek}4+eO@2HFO|X8?4C&NCWtH-J4s)w_ZlfD?NG4P
-ZVQ;O1VOo~-~a!BF17+zPM?)VqKqToeNJ8t?*uS3sQy{3^h?eF!OTry%(NzwCpv-ase7X`#?=0X`kzL
-!q4hEP(6#5i%Lfaj(R>Fleh02l#g=0QrEg1bA@}Ax{C`2rzCi^b>&V0NMugaPk3u59%zKO90zNaK4fN
-nj^RygcSlu_-O=Bt9pR`k<dnhdkw(oNUS)JUjVhB+yGAkI02Lr@W}w*j^yFI3vf&n=T{G~Fp7s+4DeZ
-juLXEX;Ee#ohCrG?IQ;>dhH$?b06X8s@j!rY48;{NNH>7(qPgEFfGdVWp8)1h0X#KalmUPpW4IfCfZv
-S-c>vr<0MqY=z7g;YfOP`D0Px{a9Jd0zBNp0wz%>A$iRI;ORV-d+%)>-@QVV@F(gQGUG?=?97_1x3%Y
-YjQDL;Vf2Idz4hU+*l2s_0SvH;8j0j7)r`T<9{XbjJz0)W1Humf{7zz_61-fDoG4NwNad@I0D6L>hM0
-frc%JOCaF@R3AL^8$b`PKNRc=Boj2nF941{Q~@E3Qw!^0Ow5Q?y~@noCY!rxQPWg50o30TYv{Z`2b!8
-Fm*bVdr#mOpn4XRA*F)B*Jtr?-URq~8uY>7zBCQbx^UhRdZZI#1Y8MlR66G?7GPmIr>7X;DuE-+%HZj
-Va8)KR&j{zt;dL+z;LI$L{~*jXfYY-f-8>WwR%G*d5$+fGNr0ELdH7cWevkw1z<e#h=v?jw;f!2P8^R
-~dkZu?bK);7YxdONkR3n%tS)d$(a)WrE0yqMO62X8YZ2u_e0apVY{V3009l-k*a5`rI{B40~8y6B%v{
-2L+fG;iN=C1<W2Pz-j?+5s;Fb`ZrNJ0T2D={2^FBWjWs{y`U2t0%Ny8w3;a`(FdUMb`}s+U0f391p?A
-gn9~*%EMs@g+PQJ;2V7iMj^xMS-sdSo4^uYXCoboag&mfc{TFJ%#ds@K;bH0RIi(p$cd}0j~nsVTDLT
-fajj$<>x%W`Kvf>3jikLo;@&60r=7LqTK-4@dX~QKfu*5@UnrhVl~hN?hz)u1nm`+Pb0vypn?HMIN?>
-0%K)DYFyeKncYsF$obfsjbJ-h&xWC1DQ36bUi^rP+@Dot^;QlngQ|~~U16~i%^d7he+zfEtdpxd<0I9
-&q`-BXApNA6-u<U(akCp-K^G{xnLIEz>4E+V*#Q+Cy;e15_{1TKB`q>(Qlecm@5ncur2<E{b15ew57r
-<iyT6aP_1~|g#-GnRy9HDVHFM9~z+s)}&12Ak4@5f^Sp56;>1>gu@-v{Lf@HYXT+Q;KP4e-7FKpU8^0
-a(AEn<MOZfaB2sSAaT;ZUA0CfX@LzIvj+*D)0k1z9TX7FwhU_oCa{`5s=#f-wkl|QIMqp*8z+;0d)lM
-D1fU^@ctL!+b6mCy8vT8h5iii5dfb7RSftVfGMXSj{r9V9C{l31D*uX{WBPQVEzJ(1NAP(1u*?HPCuS
-Iz%vTFK_)?n`~1Tptq}es%n{-~bHow$6*$6i0!Nr9aNJY=w7?Or6*$7f0!Jtb9QPzE&u|>~97hNoA@1
-)*dJsM%%n|-m;0X5%9N{^EBfKtfgt+e#afDF<$Gw-61^(Cf|M$nww7atPK@dp`+7q_6R)A}SrF=Qf$(
-;uqm#hYJ99L}wi2kYpqP+wV*A>B00S;0E0pi+WxT0k^3U<Oz--<b#6KKU8zkH|S>TF)xhWW}i%-?Lod
-}ABt``a)--G;f;iaE}+;DZ}V3&@p_c<04s0`*qt7ZgqUz`4*CE1UF{i$I2TZ_<YrgMCPozWOcDtDE%s
-o58(XlfGt~f}IJM_4@4!a-UOtkmp1LDwa{{e8a(w-@t(b$=I=D$+T(HNM>dxvDs`qqY4V(uYjyvxstr
-`#v5eQrcI=>vXY!Sb&6cSew~P=l>+7%Uj#*+4|$@hz=x>z&6{_WX^+y2R||Zu&YQPj0Xn!ytF9iURhP
-heUp>ylfj#&I{k(aomyT9dRWUsq7AxW3MS3-z+0R>0ue<=B>0Y6qcU0Mk{?pU1a{Xd-Uv)G+{pdcSzs
-l{i!2BxeA^fXH`J1iaW-$++>$5H~_f=I#_i}?vEc~x9ey)f3DYYN1Lejtt>AQOL@>ig1Kzm02lB-Lru
-2wZ*7^uHKafSgLT+M>;LGQlxfPcSLRY!q^bW9)R>GujdUgUEC_&|>GT1kYTvFa$eScb`^y!zI&gQK|v
-rf)oa^wnPPRx!7z!2E)C1Z@QGY|R?zKk~}ts>Z8F3o4oWqm*8ovc2&tvqtxjzO}0wDYItjk3mS>8r`$
-&z)y2)7CxhmTN7oe__#H>+M{xDjcdUuC;~m4lq)Dj0pSfz8%iPEIr|&chFT1Y77zs}S5O|HRG@lLEaz
-%b)^AnLqoSfnVqzkhG-(of<dH|3mGO#-3i9^bZ<Doa*RnGH>8GEPZ@>N4QO?b{Jzx#Ap=&mHU`{-0ew
-40H-%b{9zqmbpPA*vtS(Lt=(#6~BlA$EbS^U%Q$?E}G{KB{QQ~F2x!UNw<nKEU2x-se<fXQ<b9v)BWx
-@5Yjtnc>wrzDfb^p)-FreJuRmSgyfDgE)%r8R_=Vi<2M>d}L$J$g{$DipbilHGU+rQ+#?X%x%S>E^ek
-g@lBVu&^)^9v)6cjvPs}S}idc3@q&?Oqf8XPMu2bz4u=7zylAEMQLNm?Af!)Lk~Sfva_>^#bROY$HIj
-R$xF6T<ef)Gl8+X}kfPb~WZ9fJ@>H&tJZFg|TMCDh_X-T;*}|D*!%8#R`@}d>{mL8?x{Z?lJ1H5wmy%
-JtDH(E*k`YHJnQ@qsxRVs*GD;?VMM)m0Dc?|X|M!&4s-a}&1xgAF3rSg78CkJn1^LH6{z0C3<{7eT)h
-e=j^=k6kYp=2VU9)BlS+{N-Ys<E7-AYdET0@rnOv$=>O7`s8Lk=7`Kn@>1OpYBpMoykQNk0GlbMnO(U
-yzI6o+c-Lq2%kYzh>p4wzii1cJT*t?lL9y_4VY^rAw@=;O8<3`iCS!+CiaF!g$FG%8fTv_V!SLHM9d6
-Ne7er=>#&LK1^296=WU#fSjbq<o1;Kga2OOKOFpz1ph|xe=qo-4gT|~A6W|iSAqZc!G9(AKMwxSJNfS
-e{$s)aec;~;{+EOQx4{2S@P7>ap9cS5g8y^izZU#o1pf_A{s;8|8D0xz{eBpiSqWLQoRFh1ZmQn}mGH
-P9p{EBE`o#o7&p%A)4=V_*|A5d2C;$H7zZduq2mg12|3vT)Vb#O9pUwyWOTqv1;QycCe+T$K4*tJ&@(
-;pC5>#a~2pbii;NJ`U``}p=@UQ7W=-uFd2Kavj{Qm>|uLu7po&1ybB#Cr}I@^;}kT9sWcaft|^6QC#P
-`~>K9c(6a!efL!yo%5j9}@b(enO9Z<>X%j{_g_+M({rq{O5!J<>3ES@c$9`-v<8ofq#f|#aZzGE%>i@
-`0o!PjDrv|A%w>vgx4U1-4Mdp5JJ5lCBF=&<hKcwG(1enr4^K1{(zD{j!}pIuHb(F_#XxSCxZW3;D0X
-oF9rY4fdALQ|61_B6Z{_q|7XE}os)m1NPz(G-xd7#1pj@&e}C|QH~60p{vQVa%fSEZ;D0;#|J=!c^Dm
-iy&PH)@qqU>8I))qX3=IkH)vM1~hpl#Wg2ABECB%&yrPU=52<_W9BzWxD-f{>!16aeK0T7)oIjkQ#7&
-}%Y>=P2>;uA(e@bPilQKPlV{n0^4NUxs4-jEopP0+^a;=n)BHL!nJ*xkuZL?$FA$lsW*ft`~F4&)&O_
-v)$XJr?~#_z4MyQ3=W2I|c=UJvayz4*Dd6|4~}>9G8&XwPVL1ZqH~8?xg`D4UX`W1N=L795<3V2xAU<
-YS4e24sEq)@87ZeI6<26PK*KkCy&x5-jk3JpOD-I0|*N2+_{sFk54xv#(?&T?1S*TG;@%Q$$<88@rj0
-ngv9v79?cwpecwA-_@fhb3Gs=##4&et2@np@zF+77BjMr4u_)wJOCEs^MEbGt2gf8r5+}wdBr+yg408
-Gd{mHt)u}DG!gwbWpn2sGgf&+(r@?GtcV+X}U1owdb9b?8Y61q9;<5cdd==S093A#i`<uN@N6Wzy%;x
-THtRvY1}at|MsoS2+wh!<2kZfY{bMU9Rd<fibtM_6E58FX5Qee$qDYR`5Gg`XZML=qDdMnOSpveynB5
-+3R4s_b9@%ec`{mZPHL;+pJ}lSgaE$F%owzYEZ~WDMP)Yl=TP4xNmT@pbWtMf<o>P+Sv8lRc&n6tGxt
-zxLyk;}S>3Kv^TiIeh-<)qcYgwUCYmCu<B}$E?A8Xk=WBp}93LKM=kS3Zfx?$nX}{PT@n+7_`G%Sd)b
-2Ut$YuN-GyPstQKcfFM!%?~&&gx1w5=<qF8C7V_N9<rG<-n>cYIlSdYr#yVt=H}dZ$rJ3<$r6rE6T@p
-{$JiCYt-48Mav~&7XluZ4G%MAGdpMLsj^4xRJk>{U(p1kzZOXSs8UuCkwM<0E}<iX9GH#1q`lgc;9b0
-BZ50a;=9?%m|bkt0ktIRDL8<eP84A?MGZCv|mo<idpu<d>f>GTGqw-+w39u3aN5E>ZFU=#Ty3)Xom-2
-_4-~=;)wcR?LEqZa#E$Pe4caI`N}x$zZyTOrZP8!}J7MLC=y8=(o^+*E{)#4lxNv^k(R6EBb@~yTE@e
-_)h@;_k;h3!T;mn|9SBLA^1N4{+s%_zvPs^<dpxba*BM<cb6_*dLj&B7lC&P3>h?N(4B~Bx^xNb((}$
-9>h|sLfN~bpD>NjeZ^$4&wW^;l=)3gn-M25e^;7p46gDV~bnA6z=%DUigZ#ijdtcu>y7deR9pvp5dWS
-I3XhQECq*VHZf}egJ+WU41?0n}SZ>7@9)7{;tpGwumtzDNpyL&6W&|r|dM}UXIqt_t(x_i1~_?-e>I)
-cu-x0k197}T$xAzfX&fh~CH4tj_`tebz|-eH3Vh2hOw5dWQFVZmWxJ;NA(-QdGLeLZ_JEm^F>bt%FR0
-JxI2H(w~6+@O2h*x!TC58?Ut6y`*8({}bYKKTejJ16BXV*T&<{*?)Dq!+jR2lVLC0}~Y$UK!WN)6)}L
-7WSMdUI&j?$U{rPjt$5u{_px+MYuk<=^oP+yGJbknipSuaT@eHTP|L__}x!G{q#NbJ>UHJ<B#70{OY&
-ge!B?c((`A}p8a6ozI}FuLJ>A%#E3zHr$7-79-+W=_%rE;d5s-&hdzD!^ahA&)&4g92Ht=F{iE)J5Ad
-$1PMvxJ#?f^9_U-ih@4u(epVCi1{S+st=vQBTMPd9+(H?l9(9eD$Nm4EF`t|YS$6wg7W5?prqetV;2F
-xcsGSZpwBOOQ!=Bt-bh|5P<@Tf?4beo->9og8}c!gjyc>DARL3$sBIv9mv3>`YO57Gy8G5QZ4JV-Zf+
-C+gqx^d%1M)$YheoMdm?mJptT}_W2JI36hACM8y{5<%1@q-UOSh!)shJ_%q#TOM7jW?Uky5-B4CxKjz
-wBd1<u+E)3N0yb9-4_uNfoT`0)9FGn+&@eIufP6EL6%w3yLay)kcP{D_~8dySy|~w=c7lD($7BojL`}
-C!)Qmmrly9TIdg{TktbP!%)=m*x!->N`R7I`cYi>b(v>S$=r6zg^6Mv`e6s1>xpQAZT$j-u@cB2WZ$p
-5F<>>d%(hu?!#^q2*zpRi4Sz(^Y3h9^mka1bH<V99MvqM3iJCw6Is(*$4UAuNIgM91-Wuh2)*tv5jqa
-Vx1=bwMh^5E;Qzh-)*5$gohVFpi}IKdRw4a^UOm~U8j(9fYmhZy~shfx11=EL>t@-8#}f&LFLzl!!yh
-a>(B{S6Hb6uKc+{-dL#`(Qanh4ddje3)+8vV}sPQ;?Zi9me#>{5Wvn08>c&{{8z|T{(UFG{cbxYy+^o
-VLib-LfY2<M5*a>N=F@`H0l7QgZ5Awwu91vm6T3ANa@?(Qu=#C!wIM>-EK*_6aCw^ZCeo>96SVM_~p=
-EVtz0lkX}r4OjqOw^8#r{9P|FmFTZ38aZGbeZ=@H?0rG-$WBOwrzkGpG-KUhs9;Y<sD5XQID2?0?JnW
-|QPT-->$CUQkOzHBolwQ4hb=9AtAKH3{Li%MT=Y_2Pm3o5p0L#m?FDV^+n$oyWApMaC$b-8MQ5pd}<e
-Z|k;VPx+$0!Zo=2)7zE&4BAx`btUS!85nFDMJe$OGiV4ZI*NSdNg!*7(45$27-0!g7P<AKP6RvoV6k1
-O4O9a2`gVr1Wl}bvW=a1j>#1G^aoF1f{`S#s16Nq#ybWD!2bw{-Hmjs9NTUT+T6FF)y%OVcC%Rz&eiQ
-49h*%3mIa)z;Dvml->h8BtZEebBgmYvYOIihdB@7P#5~|q%?H<pQj(%;uRqwAwwV^mSa7`wxu;bu&lR
-LzA*jK9{UCKhwY5>H}yQ!QRLwZN)5n6Jn*pQM|wNo&!C=di~h@(FH`7enknQ#Rx%&0<w<LN{PD*h^w_
-57>1zuT=(7)xqEF|>G9vE#j?yXTD4kG4X(ICQnW)cDW=6>M`2era*e3Pa#_RKdt-MY{i`&|}xr~0u=V
-eh*QN5r&FGl*YoV4Tv%RQFsmVC&(U|Gj<^i|bb`o_Ew^cCAk`a<5_j0gN4sHOB?!9&tllp291{bx?~8
-F>)(c_6k)(58k!o759{=&_Nvt?(7LMt`qfy&UBq`grW;Z^#d<zt|thd4cr-^)e4gKeT(a@*ipRo%ti^
->+?p^mw|`pfd~9jq5YfzJWK~VCV#_ukn1z@AlGMXlLqgDbl*j3KjZ<@U$Y77|9%$Ck=E#k_MVl0sB6n
-n9>O{&^C9zsJYav&R@p-Ov7KC3sHN{e8bjX(9$o_;Ub1rf^Da`FQU^RplurAW*Jo^#63#T$XXHVy&&Y
-#ZpRr8}-NJ&o)RKOzXV|}hoaIo+gRENe(OMmmdBJbP;$if|1;gq4kHpZo@_~oBBkAw;KhRTGI1kCd!~
-Nd_4^H(tLDXmM3En0}ALjkD+$Qw}9(r$SwOwNLgM7bi$dDnuKt?G>`mtR^h-C(OK$%D81<kOpmE|(D!
-~Pa!2K+V`45RB84Wl0b5AOjFZvqcnpUI`aU97#W#-<kd%!WLPmg}>SG5T(6oqlXD<nlj!`0zfM7qY_o
-igY7wNW07nw*A=N<G2RfP3)_%Z^Lifl4!aKcv!b+I9;<KhQ13tw5-p6hc;<Nww5lNGn$rW#?hkLaddH
--j@oVa(JxO`Gaj5}jDbSNXp4Sm?^*c=dX^*INEbq+3F*fAfON}wf^EFBe2o1s@`&YsSLxmKW8h&U@UV
-6v@BnoI>ofB3vf$wv!9xY|@X%=bcn0v0uA__6;u#P4VVgAENyZqmr}grWZ3gyXC`X`r^UXKuJMX+hQ7
-)2|bDrF+o?N?jjaI*qN_P|urCSSu2dE1l0T2Ha^%>iwmuz>_=Ph^BmF7|Oshn8)M3$D?frrO{hb6$nL
-f`?vmNLeJCt7cRkbWo&to%c{E=FD+d+ag#?z`_Yer|^knHTgc9s7vxEFMZLfrl-?1FO%#1GY(WeO?W1
-(kja+`VVs~{TuMG9C%m?Jd{8=Dm3XBq1YyAon(xU>RNCAk$$=S$Hc_+K^l<0($Z1~4=wq)886qaU8P^
-|c$V&27Du-iMbj;!K7Z&`pI;R`JSTW~63Wr?Ia*ql$$7w!$r#W-8$mt)J?noDksH4t%yZ~}S4@~NAt5
-Ix=OEIG^%3j9qD6}s56<Q5R(XOD>r~4zR%_p>-S0bO46M)PqCU6yZYuvE{h0T9y&m&{zV+5yO!h)qrm
-U=t&Ye5g!Nbk?xLKayhi%f@MYmC(frnPwnYO+lOs9&9iXG5)(!PEB(&Xf1`r2!+QS6uV^75$FYNgATE
-o1fii!Z)l?GDO9t?`0%W8Z*n70N;=kK%X$KdjG3U$@b#S75yH%3Mc%mSv1*M18J+x^OG{w{G340$FFW
-O#grZ1MW&sPtQq9ORIx+l;y+AFTYI3j~`DbO`1f@%ggE0Pd`ncdg>`g503AVUgQD$0_-PbK5z_!JYai
-@<q-QqjAOT5M~}aO^f%Chug-0fG3Ig^1M4%kNzdjdBKfx*e~lP1qAW2nu@K7-l=T%b?jN#l-MV+74pX
-qB`T6-2>I6moxN+l{jId|V9#$TZcBB>aNG?}$ejtBX_HdkoavkOc)(5Q9tUg0NIM?U5TGZ#N4KJb`_}
-uLjo?*j=J@w2p&#-wAj9b)YT2N3xr%s(pd-v{5`}ONbLAGYJARSmYoE7pQtCqZ=!ZIa?jcx1U=V#KbC
-9%*ya~T8s=XVyy(G7o_P0t)!PaA&!{RHIqZO=cfT)C1K7Z?A!V#Nx&WXY1>@4N3lnw6Es(jCT?tSli9
-STB%Iqz(CK$qUXwU_XrI9{XslD>xs4<480^842?ad1>VX_Ah^lY4m63f6z13-PQlEy>kzas=DL&LZo3
-j(~*DdWIFAzlkpEm28i0B85>9tlt39K)ggoel_jnukQWJo1VR!XZ9o`6s|5ti-Ce}Q?(PjK0@d=eDN@
-_9sUSnGttqwBh(%D)X4K*I_c?pda<k?|OsD^NW)6pa+<SiKcYg2h*_*PmvUk?3S#twA=gyt0J34LFaM
-xXTsa301>3zUwnA(n62lPU}srix{Frp9W2>Oty@AzzY?m_<SxyAY$x`q6UECtrBTXzmUojG%+s;Q~b`
-@kBY|Ni^$S9y7P`hE6*HJHvCOx{Z_MtqIjLnk9L#M<1lMNGx_#g;sI=bd*>Jap*Lc5;Zp(2s1=ktOQQ
-ya!#>oGU9Uwf;_>I#p$5WvTJw$LoFIbFN8TM^Cb4bi<6u5%vJN!XC4CroJIG0k;hlztHr{y0=c8I5Aa
-txDkCmcI=p51N@<GDEgt-;Pd&^tXZ?PZ0+B_U(*k-;W__@Zu9{A!~4Xh$PckLdVmg~6WkXYEVSQ{`)o
-`}Ny(CZ54N?nb$Vi$Px3(NXI^*wWB5uZUxXgnTP3jtr;4>c$bKu4H!TDBD0pnHG4(|3C_Kgfx3;#bXf
-&#Qpl#dwI(RL7>J;0yP<&*K(Ef_N*Wiia9s|X1bo@sAgZ&qM+{SD4jS*VdZ**4VRL2s<#l_mTimq$_h
-OI%qjU1u}=p}oCoUjMjWOqEo|G6)F#D3t<WxYJ%0=qe4fV9Wycgw0<hTXCaZLA9!LKhku8kE>9?Wf%h
-+Dzvf><qSuhWwBd(V?AnH8wU<W3+}3AAYN}$LTlmzwmn_YcO`Pr**(@Y>@bFohKku_}U(7`kH?B#>5c
-dI><e;1kcf-T^#1Wb-s6_-!1>xh(sToxE4lg><bnwP&;?-)bj1-yXkxnSwhx%jSql!gO5mDyYEZTuIY
-E@zv6qgA(!|d)?w=X*bi(S{>Z%!czgKpVfD;2&uDozI!tHXrZ!L9#A{^6;0IzepHE6k`ZBb~>391@cM
-Ri>ZTi|1x@B4Vde+7FSsU~sTi8z4VrZB6^uQqH{R{L%i|Ch@fAQZNP5#x_T1?H;;CJi|@39XClVi`YM
-PLbFP^<;oWsbqvnLg=v*MCed)z_X7-xL4v8eEQ!Y%!ibeOlXHc!0hl@6eAPh&=8eLfSR`?)s<LiFo~o
-HQ+mmU$B430saWz36IG+;XV6c>bvX%ud(^qTI`tQ6dKo%H4ioInto)rFFEf`-rcr{&rRI|KC?z-UF7J
-7#0Z_TSNPR$4KeLB9-sNm|8Zvy&OHpt<9JoQIF}QvR(<YCRyQ(Nt?KZ2GOxx)`QH$aNzORT89hTZ4ok
-SdYu<WiJUJBf*Eyq#jl-NV$r+QK@pfk%?TneuSm%r?HV$L#{<|HoXAq6^J;_cV;prn*q~0g}chWye$Q
-OAHqLNq-?5#0Zip0KY;`3+v{r(?HygyBBKF6>*c1Fy7hsPzS-21OxO0B%8RQCB8#zrj|OyQp2D7D~qr
-Otn(Y3Yjw*81%cBSw5ra=YcC(_Ppzi8((Od;6Z)rGJZEdQ0N-pv1OIB?jg<40lUUm3ZUIl6PY`8MRPw
-zVAD=+;i8I`s0U6Wwz=0Kj>rr?}!Z#$(&toJl&i%G4*pN=D#8Rn%La4VmDvn#$cx4jo@71E7ZiP#lCr
-6srHWsg!PWbPOo3T-uKi~Pvt@bu@m_N{t>&5FTz$6%Mz#X8ULrv@4Sf@g7JWNQqu<Cp(YQ;*5CZ(0Fr
-~2NWQSt<oD#c%u5^%PfX53+~jWHWk32?4DSOgJ9M?D(nYs+B|#qa{O+?4iDw?*3I6NyKi^W%Z^+ek%x
-z8$aPeiO9=R05O&`7(!+p*90k=GY4}mjg$oOV=nH-Hzk^I#sac-{r90vPO3=A#!pO<$R>lzsKU~2Mae
-)^9u#c)sXHZ6}AVptm(5Ap~`1=a~pIPdrR(lcg${J7-%C2QBNUFycWO+3p;Y#ptgs%weVbEzY`=LdTQ
-Kc1T)k68{z1J(z|gglNt7PAj#e&QcDR+@;vLkq3N!6!m1WA)hUS1ze_A9kk!dCX0a$4mz^z1NY)1e{L
-KFL{!0_wL=fZaSD7IcKDSw^36CU!W#@cxPF^nBk>Ql`0onCjBXfwV@N>o$mRGE2^ujOX}+Cmb$T5XrO
-KaFKE=)!I~lt-UrS^JrsEaV*=aQ;NVL&`LX`<^@W-SEsyOtvG2tB6S3e#44C~t)sU(2F0dkMn$*UPJW
->}2UjduY7?(5u+D9MMb4_>2<D@@y-+yAV&6_v-_U_%Ai!PGy6Q8qgXn_ZeZ-fdpZU|mQUG*1EZM)II7
-tjgt5wOB~|Fk#{Xl@$~cI%dZbZhnM)g@y8ml}M4ynx&eo?v_6#r4iVtJi*(qj3W2(=ASYeZNa5z?rr<
-I9Z)T15L}L%)3DP+yCjV|0X{}4~hBRIEx#*gHQcoMrU8KHO2x~w^3-Qb+ATP`-1&r{w-U!_?~_C*<7$
-8;&JFOd9^t=2p#YOd&Fln@Z0F>n>x{xJi279NBd8VT~kw2($LUQ3?H^{->&T*b{F4={YMty2eQcAZp`
-U}i|5qki|0ir66CRHN*pWeYkqtRbq;E}@R<BcbTM8_PsGB^-mn+HeIiF)efONY@{jX3<#EMLdE8SwkL
-i2#|8oD~X8zpV+`ngLX6m{t*mPlGp?duB$8~-OO~w`&Tgm>wn`@nKsn-L`)UP&7(PsgSJO-;DRIN{!s
-rTP~Td7{+pUIOa-<y?{Rn0nTYimmvFJAm=T3VV~wrrWM18>{5P1i0=?gP&m;lDZC2tN{iGL3u6_udfM
->NEZuH*VY<(R-Z-;_Ja>z?LM=QuF7}*X!=B)||LE#*dq`m2!K|J@@?sf8jrKOZ;&OERnkLj2Sa@{S_L
-PFJG?tjy*6KiID+QLpJgte&X|@qM{`t%M}tM@xyL%{{C{R(eO%mzoVd_;4~NyHTpSo<|y_8d`<jv94~
-<HMh?vx5i^Rf`c(M2M())p`T1o}>?a%jwb7==&pn9k;5W5gWRO}qxCZ*+#u3;9>;l(83%tN?V>6-i#E
-BEzJp;oiwEl11y44p51aeKz%|1iJk|j&j*s){P?Afz5ZKm#L@FBj3+!%Yoxy07iR-OiS#{lNm^D`&*X
-TydKOSvC4d3-)L2W(;C!i5@RMlbj-4IY>pFYz*%3URxvVec)>9iKn3hUKnF;E&47%e8Ibtg5LivS09;
-bz_syo;`cu7U$OUGmqFBZU1|s!^FS`4<1ze_U+TPVr(NdCxa;ta&A38^BDh&EU{h_gQI%}mxKmn42*;
-N(~%=b%sIiq&K+O>Kx&}a8EhZ>+|ts5{9P7aZ1%+JCxdPL)@0NmJNnh1ee1P-KDs`$V_3J}-qQQ~&93
-{myYcHhv7Y$+m0S4TuD4e@#UGCD?K6?bsf~?|hl0W2Ct{;Mc<#C9o;+~iKsUP+4u`MEJxX7A;RXG^eC
-M`MC^W;etmBbLMDM5ZVeGT$^m+I7;Ay8$oubbAncSm8<nKCqNN$Y0MkNP%_%E?@P?-{6@42XNb;MlHc
-adpgI1|qpox+wq@?I=wB0haX!kX{C+ATiz;Deb9T{Ah6I~Md^j^)5dKKg<i{#g29Y!i9}t>*U~?Z4iy
-o+ypQhWSqJME*$rO0Gbzk|w#*ZlMdTm7E;fk$>iGuAQM{oNJPU?YSPi2e~-87r7sKA9-iG<ekJY#8l9
-Y-J+4h5HJ4n>E-$!?)Ls?v6>Eb1ada`$3EeM%o)^|fBJxqw}|(M^@ufzb;&ovdpGNQkaJ`U9qiw{dGj
->RjSYhj9c=-1xPFq(CyCvO+sPZqo!0uN>p32NN2w;^%bq=ZbUerz5pXs35_w6C#oJG{=(vAvemv%8u`
-j|u@eA5+fyr@x!1z+y!P?2{QpZ`%PjaZA6zch}oBc=ju=U6(d->2q4{4rar`gNDy%JQd>!<7UpZltQp
-k90Fd9HuaTz~xdaUH9f^ElXTVlMUrd+Mfz|KrQu^3V6p{+lyN+zUU+{P-jC1n!Mp7T;gzz8*Ub-P{LW
-fEBSOd^YtYt|iaLcek~*b-R{Un;f1pO1dY>>7G8i`A)LaZ|D7Co@9^LJ4!$8i6^cN<1b|BS3GZRxO^6
-SasW?TOY-nnGI+(a)^78prNyihPg)z{eABC+v-UOTn_m5twPa6*ucE?Vytt^^TUA_CQZXsDvb^NJiu?
-k9v9DrWabbRWX+`N{E5_xQ7T@QqC?3D^?o@BFucYuXe}(xQo0C%S9-o#v`5RyNdNWp(S61l1#yP;d-5
-a}3uB`CqSC$v9sCHh<JLUf6l`@O}(VX(am4!wACH{)|hwhIbsFF+h3!Ah2EB!^@BL1C}>Z_Phva)oUz
-dY4jSvV!1Kf^dF^)X*jg+Fz2#)MujzB&1X-e=F4(2drN3GqeC>x>D8pObT@<V=}1ZN}{Bd3nx%zIr`$
-ulbwZ6t%5jQ?Mm?G}s=z5cGz|gbKn{;Z5OP;imA>@R{(1aA&wHJTj6J852p5WJmHM1(B-ArpT^HQ{-s
-G<8>a?XpOS2Hgz?5nnyN!o5wV#HK#XcHD@>HH0L!hYA$HDA}!IQ(UZ|L(e~(tXh*a&dNtY=_1GirQFe
-;$wa3_LcDkKqXWKb;p1sH}u*>W!yWZYp@342-mfd8x*hlS?_8Gg~zF>FQo%U6`%l7C8OImvV6w7OkvC
-^z`E6d8Za;!XSkyT)oSyfiOwaMCH?Gm@&WVKjFt&`RntKGU_by%I&RjbSL1V#o%1yTauz?eW<AU%*3$
-PVNL@&bzj1%V5Ju0TpKJ(w5VrFnERct-ft5$p<jLL)<?LMb6QmKI76Wreasd7(w2f>2qgDpViZ6xtE$
-EqeK?ebxT|?Y~e<0|XQR000O8Q5kVeH`oCsw>kg-|IPpa8vp<RaA|NaUv_0~WN&gWWNCABY-wUIb#!T
-LE^v9xeSLr1Hj?oF{uFF{IZ}>HJLz`sIbW4*>be_W6WeDy-My2&DlJkLYl>7!$}fG{&wld)fOw<qw7b
-81^lKf71O|h_U@#cW3^q45gZ*mxQ0Le4Hi-5I!K>YuueRaOAA|FG7Mwh^^QsKas#$xN)LHONwJOu3&8
-sqonrB%Syg%GOI66Cs+xs?1$~4$NJ~}@={OaTR@#z^pgmN4CVp-K~Fs;&T+HB0~Y60JiBAX(hCJ?XF?
-8jBsl`Y%szAf@A^`yDws@FwzCF|t$BWZ%BO(*n27SAjB?T4l+<@chxzRt^Q`Lk-|x8=iRS}m4&p)jb`
-w`RU-^FsZqrZ-u;(bf-p8v%Ue<EGfi?x)$Z4G!taL0wn%UJz^s%R0GUBzr+wLAP$RnyNwhU=$oxW!KE
-=YFSs)tWiic59({1)H4maHd`#s-}miZoh&yTyxMu4B`Nm#Q?QdmvRW)2CJF=+x`QVh$QRiLk4!A<eVs
-QrbO+QTjInr)6i!-MC~Ddo;7r<wW!4O-3-o;`2tEwz<ZhCe%T+rJ&Zz9+@sQASKGS46&nDQ)q^VZ*6o
-9PiqFQDpefgov;mf>jmw?qUxL*|Ya*AL5&>AS#GAi%R&rjX~Ul&<D48BU5Y`-dJ`Sq$!+6tcBCPfa6m
-u6+#0}INxNnT?0DOFu2b%Vb?p1!9+7zY27FTa7Y90s!nCJ0QD9#E_D$5qv4gN+Sj<E#e$5&RrqXYG4>
-7ELB)vdAVAD76Vw^b{slUS|tHFu;~^6tRh5R@DKP3|<5kjZsn{f-ok4ZQJONVPNW{A#hoI9S7m8s)E;
-};AQ-37<?JLig$zYRRSHkN`ATwsT|6VI=jy9VPwjn$+AU|1Xp<*%#*x+fDx{OyDYd`<wY96)73JlRxl
-lBL9<9eFx0^^&tN71q`P@Ood+m;7D<_0XUSEOp-kD>KmPFHEs&rNFPg0({2%h8$>{+;&0;a1BYFztIQ
-;tH=$tA<7k9sm<L%4Ai*V!Muji+4C;GdsU-t0N#odd+-Y+2#f?vJ}!a=z4-NEVE$-zDpl~1AltvBJu#
-_7TP;}duuM&mDEk3ReR<!JB=d;@|gip=u5LBRry8RShz;O!uv1<6%|Tol~pMG;(OFyn8s5@%fa_Yo5H
-tGA~I6OgWFfbZea`5817g%RS%Eh8p_H$Vq^Ch<h9=>d}qe&R1Le`#QRPzGBe5b^87(}VqUpz$}<Rh)4
-b&5P*G$(Jdx+3a<^H5iB<ALQ*EMiTx2W5D?7+*S2F&r9S|pu;?CaQHW@4g;|xL=M`UzI=@+I%EM{Y1A
-}Ko&ItcF9yF5pjW+spwIw&%}nzC@C<oG=NLgxMP2J1(2VPzF{6$J?%6#xsex6acL5A@dhlN#0s9ZklQ
-7Ci-V&;4%&3i$XyFA<g~1!7kY|vsz75{|3v^9u%9%LYJ0VRzHdz|9RnXw9hLxaNUC(JCwK0T(#7SyS5
-&G5gwZ*D}6u0GTo6|xafCnq}4zNnI8OgP5Qg@OrY6g27)O~ynvT@Sk7cB;RiZUsHUc}eXk7b%q+i0NP
-)LFZ#%OD+x)iS&s;+NYpykw|#)~t$FF5mcM0Y6Mq#*3t#&H)o%PiMj6Db12Z9${-Kwk97V`uuqMGQ7m
-ugI`~1C7^+_YN;a5!|-y?7=Bm-b#(EQ6-{Oq+6=Jn6eZLwgGo5ejMoAQ14swEYdOYseW`Uy;D+`0o&=
-Fc3t1;Lp4W|sHf}$lJ%ljcy`*+Qri5R<{%jQPIbu&BfD#rs4}Y0}+KkqD8eE+t<5^y&_%^~i17D}c4%
-^X^yFhd#+)KB2;qxYlo;QOqcpgN^4Z|RW|6<f&qA|XG-rzfcOz`kufQSuU4jhsLt+IQY7kD{;oE=m-x
-va*d7exZ7K3BwaP`VCbK4SDW(J;dALjici|MciO60(}pqq;%00d>1kLrUEU{vU|>NRyTE*kGZ6<c9}T
-p_!yv(>77}yRIr&YU@>zH9{Obd-m)b7}Nku=4HY=6Qr=J6rjT0Ksi&iz;ZqTt#%$=fp$0y@T(?aHeno
-U&}s6Y008cf7+3fn6f{qkS-QQm-DDudk`|;Z)>pL=B+wQAiR)}xB-1Rani$K(Pz4xcC+x-nA46$+`*`
-W30X4Mc(hY1c+U717y>P@J78(~>$#3^AW5zuqfRY><-A2LBztU4AAk(E;&1U)ikjf#)674%WEkShT_f
-SzHObl-in28($2d!yBRKjV6`@e`G4NP9fVzgDX8j#f`e&$q`4G>{f0}|H2l_wJ439<^bW$=gH83}pdf
-PvY|WNK)R(l!ld0qo9bv4z=CKVTuyobO<Uf|iweXOTW8@v>S*27W^V?zZkqg06eq6}x9075n=n>r=-@
-gjzq7#<j*@kM(S9^y-qd1<}q6gof&dz*LtOItU>%@^W&UmA8=?S)lMdX_B_BBiM-pX0Y=GIK*F}F~@K
-7x?LqOL2d&C(72-Uyk7Abnbh43P7Y3jKkR<dR}UJF#oYLesIH-dB$wz6wUX<FVs@WRS1oR%u%Em!nM_
-Xp`@4gq?<VixemvTLcW^qH1Ze^a0J31RWR<*lKpR0(mALgRvn<V07;xO9P3H+bY)~^q{%qRSRZt|Wa*
-F!@A|qWfA#+CDwH_qJUGmTb%Zjx|qc*H+i)4Cy29J3lsCPxu!juGE3)aarsqgYKB$*n8o(_au_t6i`Y
-v4bieqL84QN$ht?fux>(j`~op>^w<{pJGZ=orQ2Y`}$M3PT*3^_4<Nx(#gTL3qPRMO<IAqi7teU`q>w
-DBaH~WQodBkfxw^qp&K9>MlzsFx0pZXK1;Y@XHa35ftpR1nSc-(ex5mBPv5bVJi>Ajx(Xd4A%-}=82Z
-tVrJIW`poO7XwDQ=q#yDNy_T(Z;+TMT7-N^}$doXsJR(mR9d^ax707}cyP{4Nx5|>#yXhWia2F+Oana
-Ny<xq6l7?-IS64IBZ?d0lVa+5toF!|u0rju0~FW?K12%3FOV+MQ)sNg?BqZ^nEsIA>l2#JAZ_jHPi=c
-(CChA@Vgm!zoU7axaVZ_tVevIs4K4O#-TWYKj6IsP`Q8<5Sw8M6vi`PZZ1b3?BJ_9T&W1)_wwK435%Z
-_!V{gbmMVB*Ru=$ir1T+x~yyKsLO=AkSf0ZBfJ}DH>k>^X&L&7|ehZ&}w#-Om9#w71?z%eL(8K4v$rz
-q)m{e2v&?u2#P8Mr1dhwqWn(TY4P)e0D-3J7@Ic`GX{r>q6Xe(CDNw}FUR4M%=ED!Cq7YM4Q+|GoI_F
-|@{Fu43^#@y$)brYjfNOt7~EnxQN>@7`YJXrBe6k=u%<`3Al+poRwBf4LXV=xEh{usq3$#^`JKI@1Pa
-KFZ;<V%xUIlya#onZm2G;@;up|DvYTjk80-!@MW48p-$&EsFfbTaFs;-T@O?-XP#*~`T1}U+dgqL?t9
-pszv!yD#!H<cpJ9~1>cIgxP5qVgwrw2Mo40s>%293pMd`R<-<_#Yj*z}qf6)aL+Cj>9cBZ(OF1hmO?t
-l!o3PmOixJ|?MvUX3_cikt;dN+!ww3V;N{JJ#EzSY-kj^E=cVxGRmp?pjrolb_1*PvZ7XdL5@ZDbY<<
-%$&AxA|Nv6T=1>&cQy1*$zbuX#oPZ(VNC7!2;(O)xFMhzeOEw%SU>*y7<AMO<TsVZYIJbJ!_{fsFy2W
-DY{v`~-I!ZVF*0Rv8*@Ed459`=!^3+?wSDu-N-oI?yE%s5?U&%UJ;7~y?V-`Cqs{QkS&>|O)ELRe<LA
-vK0d91AlU8+L!lh}}qKxM<%>9iVyO@Ty6ImO7>dtdx@s*ErYT`sZ&P?-K60}W8e((`zytqm6yHBV+<X
-MqIapnft%@u|AmX8tRdI4x;QJW4P#bY{0EK-5S^e$y}9C#JJ`w)PavW|(AA0t&9z&(L1eAGO_6V?i}W
-8llGOq<cmFC>C6;YOkqA}Lf~S>A)MDBCz?1?(sFq8A9@gT0y-Aj|kjHbupD33BZrs;+*3c_lE%-c3N7
-<n3e<p%?=_3-*iJgu;h0KEquL{L{^6vdX|hi&GJIeth1ETsxU8s&rMTUuiXkuZAoj$YK*s&EnUg+E`;
-t@)>PpG#y|vK@l#|h3*W4Y0>EW9WmqJm4EIFA#8|kUTj8Pf00n#Ffi5P$wXic?NiIDcq|FvEIyl15Z>
-Ym!(=jcE8qh0Nb3S&D#dFCa0#phE!%zY55nq9sHa>Zly5@RqZ2;XAR7RkZr)WjsnWRJM+?kt#<tam1}
-1vU6i2fJ+ua&IkH-pV&B4td>=jubZz~uRv@#^u39!S8&bR46YE`4nf(MUIH7XF^!pvILaS$Al1p^kWX
-|ie<0YsCuVzNU(SC&CDt#eR~5@BHzHj8Gp1eBmQl>JzOsBhW_G^inN^90Rwv=Rzp@tGOIEUIZz@YKau
-B`z~i5I8!+^Kd*>gB{)qr(1wXL7j!fN25>>oF;iA7OwAba7Z&l3YAs4jTmj`%{<`Z4f3QmA{n2{vduT
-B*x@6C$seEr7)Gms`8$v0kV-WGWEYT+Y%e?Ep3Nc>yl$M3&mJu-f1_sMz{j3yos6ClSA@6_0==*u)H$
-x2s#vwzGg!kES32OgU;ZZeKpQ3vR5Tl4D+l~+gxwt<i%qq%U9#B&MgOV>R^&5osG=Fa@n_5y-bfW3*t
-BdMLaMSG=EKgwy+su}sf>;$$4fqbdQ>E*^~0oIm7{NxqRDL8EMDS9pTC)}VRyQ!vy^0ue!@vFxfz(1R
-gKGP*S`K7OWKX{D*#F;S&IcukO^uYur>C#3zTXmQ&37;4Kr<%hrlO^0wTy@9qFJ-+~Hzv3mimHqm0-j
-t{N&cv^z0y>8=E`5k#5R3{1WA41^^#htr?m)5ZX6qcjzAiU0_yiJwz(!qnEdi-D=nC1B#;!?uB~X8>k
-_LI?W5mR(pl^BGDsgsVV>+$yZ5AYFPu$udD&Wlb5j9!zF9SXlq6f>}g$&8m6BUBP7nv>$Bkp<1D#S;3
-<I%JyRxfWZl@0SP)lAzQNy)Uia2X!cN(8e&IPE7qfSj%|y>7Ay(^`vHXT6g|AMJ(jwGWEr_MNZG|hj+
-zrMY%Kd_Po6<np2hlr>O6#v$*IcZj2LfgSHS|x_Na@V(GgSlytcau63S8YJs;ULNKRVIMcd91vW23<r
-i3C39y;Ujh$vWTS_vP1Octmw2CvmC0aLx|Cd#y0J_t(*O%~XG(!mudoBV}#bt7!poH^*z3M(1W2==^7
-+|hw%0Fr7OWfn3YEV@%zRdI9UA0thSO;Bf-lz{Ij<|BcGMlyEGi*b`2g@^*S`JDE}u$(yPJG9p2s!8E
-RbM14KKw~vhz}?vKf=&45O_7&33SIxv9yfqnK|JvR&0&F+a7!raIkmDvYeR5{Y=a1_b5GvTD1H(SsLI
-sY^{Pl}8pu9m(6^?!_8i9AD?7q}5ro2}@UB`FsQv}$^eTk4b=oL4kjRCEe((5c>w&&}sB$Jl3$vDFY5
-u7(byiL*^su$J7Q#Yg(v>*Vi_h<8U175^IM~AW6L^?x5!|zW(+Gf7mLhcDjTBYFyDMvW{FV|Og0MB&f
-I^MN@{0-D*fjUB187f?K@Z!Siyvq6?4aq`PoK<8Y`?pL7HUIE;!qFC3~Q@TYgmF*lusB<QizGL+#C%L
-?)GMGUuVJ|WSM~d{j_u??j#**db`*S<^PABjS06bQYe0E??FRFn}+Q6RgMPQMbg|1Su?Q=4^7Mtgdjz
-iRg>R`s7Xco;~$dSg!j<!bYhjZ<T3_$wCr)xo!TP`0P>DJ+QoSif`dJMkq%%BYJmXm@3yZ2uEeBg#^x
-*mG|~NnOL<qb{=tzSU4%U&mjskFNIi5cf8IO;nth753)LJE`AAKfv4(<Ae<3mqf`6s4_)XZ5NUad3Aw
-Bi`xsbsSUPr1F6>AJXj)}muNETNqtla=}FTmZp;GNy-i!Z(y2D{b2!H0;T_)D83-o1|S_OX>k)5S+@v
-8A)6vHi0Z0ih^Z&2XQ(YTBkrFOmZC8aBMoc8l4wKQ&*QOC4(VtfqxxYwuXl*UJVmOp6<A%3Hs8x2TZS
-_ocoK<JAMmK<NOjOF#@ESmZxtyhR_fQY(M(@qn#Gq+(2+kQpJ{XtV^_9{u1eKxdoLu{2yEmmU6iR5M_
-09K-;X;tjG6%qtVfFhZU5&)_squ0?PC=f=HrzsEUJ_pe&hm~xktzKEuyZx?H(oZ7Xn4i%&!?WhJ+XH%
-%N<Sp{pB4W{BI=qnwoIUl~>Xi1HIv$_6##Td30?!tJwjn*EDflbRu2$Dkc#25ThE17n@eC(`4ZC79ui
-NC~Q<cbO91QgWTRU$>8R;78Ok;lyHE70+7nVO45kG^vd%GT@Qfs)SqP^TFus>CzJ=aqQiXGF3xcL0e!
-Ks>ldI&(DJTQhu?var(t#<}0YVPD*fSf436GwR{n087w1tT4}K<`BApKS(oD4t9)VpIqa`2Cm3@wYC~
-Tz570>C{$JLpQeZlBHR;J;fbPi9&S@!<ZXx2$G&41{Zm2TYPn6%s!P6CR)%dgv;qLU?bB^T5o|DhoTi
-#SCsWzd4#0bSjrtlmoJ9yEH;I*W#N9L|8-Rqc%Efb;L%B=6z2l?C35lfubUQ^&3Z&fHxn(rnF57CnV*
-vhCE<9*Y_V+7L-=ke{fU-YJx`VtMPXH+OqLI<e@rm!8KGGv>I_{@(7G*rhq)9wBWFo1&&*(Bk=KI9Ob
-ApM&&KiiEpi5HC>vngp+i$L^<o9j{;pu>8=ww;^C*~t%2aTzdLclK0(2`@6bUcAb(+);UO;siA&hq~d
-v_1@f^>TihU#T1H4HJHvm`H=^U7@+)U})~oH?7S06r1N@9YhdR=|PjM3Z4?sq0FRbbbKMnI37Bh6loH
-TD%%-wU{{O(!~`f6Amn&OmsZdDVm0kYkpEw9cp?SSkh7HNQWU$`QmWkLXqwS0By*XDg0tr+y5h%Ek(R
-*Yq6OFNBVXz{SMoFw0A%rPzU5&_SnfDkC5~qlCe4L>0_BuL`Y(3o_W9v6|!SFG0{um0yPq_&6m^;`gP
-#HECv5$xr->o$@jpPiyZ-o?KE_Tdh>?!Mx8Bd(f>hz;sXtO_@zeCK=}IYk)rdOeWfIMhB`sk2DEuU8p
-cD7KnC{NkDccU9^bo*gy#NDC5AdfI0rUf^~6;ORl!K(g%P8`zd+6J>9D~hvX1!uNG-`dvX=P$NG-uuv
-XUTT*A-{!olNFQGlw;3)cM))6PQ#7N9U*i?L;5fVMy`J*!S0zM_@aCaXEP57r;Sq(QJ)mz&b3Hs4-%-
-7lUZLcM)IWx2-jGBNZ}Ey?G7gqY+km6Jg4O?k7N@;PJtm9$<hsE_(5I2d7^hpB)VJfFRu|l?`-Lii;9
-lgO+qjjktm37vq|Za#F@3A1*vn)!2RG3GFx}>8}I9&3}05K7ZP2=wZnoohHa<PnnC)(ANX~Iy`+cXT(
-$Dw#mn)Tfv1IjN#g1_>Hjcf}<sAL77&o5*C!b(6F4yGNWMEq=YHF1(4xmLA@Qs&ql$^zC*KrD19HJ@!
-Af_Wmcz(Tt0xP^wkW5=eOPirr*VR|HsskogS}?d{>2LG6-KYt<y=jAm=a~T)NX#*C5tu2wo*brCJ~@_
-KE`6sFrSklshlsCx{0F!iSV&ozX##Xh%vo)0r)mO&lDuCroD(LdORJr<@;#7!#W-hm9CBR<J_`GZm;8
-w>j<~XDS0pqe0}gTMI8k!)6!@L_!gBo1>eH0wvr^j?3ULd6`ysuqTCL?~nK2zJGgi^7Y&Ew}=qH%gfG
-#M1&JADB}w}C>bs{-!!WQ`wWsdeTN+%w8;E0<RD4g@{S@ElSoAMNW@N#&kp~}wJU|D4@=4!z?c$R=!9
-5@O)#&7^4GPrEu1YeHu8Q6ps{Ea{yiMPt4DAoP&%IU;9NaGRDM`Btu@^GK$L#iNh5ToHmesz@Z<_~JM
-v$mLp*jl1!1jDqWJmu-!q4N|Gne**yqi!<Wz^3tfHT|l`WsQg*vfAGwjr}WOjRWB<^ieH&OU6<Ua~qU
-_4t4eJj*v@RqnIpaVVXb_H8HG31Z6qK0sTVcih}1R<GqLpuD=k`$RNWYYnt6w-ed%HAa<P8d;HZX;0_
-%fd!_<A_m!ExqmmY8sG5aBA1BRYPZwy1`3si5!!cP(!$iDISIG@-C@MVBIMETJeqWXS-S{KQL+E+he<
-?9xrQ>+;J7a!=U6QL+gPNX6tlD#e@@3wwZuxW(HaL@cvj51P~A`=X4aw`a*F!9@B<uy3_l6$fY=>Ck(
-?&P9Zau5MPxHb|_?pLrI^<s_cf^!igL|?R?T!Vs%lc4Cbn`&;Hf{x={;<U{=6@QkooP0e~yOiW5g9yu
-@g7C@HQhV1W4oi=ext$S1TJ8-hM5A3$<|a`OH6QY57{y0ZfliR1=KzJ%M`+o2RM0Ou{#t)}d!KBYt9@
-4sgsYXs)4uUCf$F<~8YaWssTsXSPh6hZTYePT)&M&2Xc&RAk9y{Sso0DT<>)D<pEVcL2k2hQQ3-pjM6
--~|+Y5lEb6NHd>7k;8eUg))=TGe)0uI(9=>YG?D`aCQg1m1aXv2nBNk0}pdx^{C8R;7S1m#hg&sm$2C
-0u}85|oKZ{s6A5UprI~?*HpI`-C_-PPQuQYw%}YZN0k!0*xbK`&N5r(DxT>8jJJfOJTAhxp+7|?ID@o
-)vg-s-#oUG87L55)ID+IsTtzNxi;OfzuBm&};M1-I>nA#I96Y#}uKuN(|9|WA8IS2ucJ%$wx-Ep<*8l
-z~2kN%){qe;{1fuHXDLYQWACj`^#;K}Lne`0>QqqiRpCU1|vo?r&E!{Z~<To6X%Wc#Px?SG$KzKAg8A
-pV?Os)t*!Z{Kzg+5DdlSo~u9^2LBR^oN6ulm9+{cYNf>pboc}579+>5x==e-%vI?jx9r;naHS@NPeLV
-1ZWB&<Ec+|Kj1V3GFFxYL!laHiWR>DO8A+msG1-ut3bu93(J<+1UP`;D=IFE^0H;uoWNyuwvp|PWVTG
-zvq2}rD8x}pD70>v1e7)oRa1%u&9os~7UqCRoA(+H^6PkS!EOYR*mmVJgU+NNqQih{GI$-Z13_1400K
-|ju`hU>In5k=$(m`h%$yo^cySdD1G6t~fACXMe?aP5DKWb2A*ws&We0Lx5@MHP=w$yoRo+yaiQYYvNA
-%_?$aWTcH3CER{qup2j5TvXN5<S9Fawe)hkMZwNJSPFVv*t@C7rOyZ?fRo`5pX##dyD}vu7KGx4_wBB
-2)&#@x@&b<5Z>eq-!U)me~^Uem(x%MKi#P1I*H>t!fmz2kbHt6DC?(^Yd+h&JB6{5G*p7k|}F2paEg{
-h+;Ntp0d;w3eY$Bj556@!3pnjn{70DurXeg+QU$~MX=n17FEQ2LU}PbLu~Xi-W_nS_jm~QNVjrupb)`
-!wZz1(dQXs3EJ_OoS@v2S{RW!wuqd_>GoS=EzayLGe(wbr;q&GqBo8nK?KkyxSs~fXC#@_plMLsHge~
-)>ZeGPScM+zt%Nja*Om1OoM5%nNrLc=wQl-Vy?l%a=u{iEia73Z*w^j(XkgbqYeFzx3DkUDtgWhn<J<
-j@N)U~A6=DG(WPJG(-Zil}4O3rPyp6~)I=q^?$mo3ew#Em79q8`7re5s(idM`9Bg>0{vk=n7WKx3X32
-|6m$FzpF9Knc?EgHUa$)G2-58IqzdD6dhr{s&@T`^2|Sc~c-#u3lW4(JlruBcTKy7!1tmi9wWLzGXUx
-5)6%6Wii2W5hh`@*jOahFgC`UG9P!apj7kHI)FYME6f33f`qCw-lJjmj-ggn6U`zaecm)6a5i6l{>Oj
-+V;p>w-}8{r&a={-2{y&f6Lxs3rUkJkn+WEd)H~L>9XB%q%}6De#Lt}4pHQwUD8*io-P<X4S`@)Bd<>
-v~AurqQbI?Lfb3P?PZ4HJ`FqW8i%sZF>$mW03<LYCX-D5aYmJ%*NDc;IrvLZPlh0S8xu46h*g%qsIj)
-V<Zo*yE)3zrnRj$)BhOx81NbeW4}a-+ry1TdJVOM%2~7#V7mM8`El>yIE&)(QM?fWNwBPqHlMra^K&Z
-v>HGoQFZ?-NTriPA2UMC%X+Xm3*_evvYTM2SiA>Q<&<g0PHLumidm*!5Y||>boq`%V^SQLGuFO^JWMB
-6NO@81DRC@GnK7icTej}rxtNVk=#D&!Ik<qFsEnFB<|bA5%LsgnRUo3ecjs&F1`J{d88v9l;7ARLbk6
-z(l25kEe@tfM5ilpk$eHl2O8srtiT#p@>e!lX3SFs*?79Rd=Y8Stcr?LGbgbON=Thh-Yn33@K}Oc!<?
-Pubj#Y8)<#9SJe9o5*>P?vBh^TgyL#aBZQ)9T$@s8EMCERtWrcX&sZy-ZxIQ49%T>)G-6`%6%H<&W8&
-uQ+xxLl`Xod2JAXuq0&ruK)cFz*D6s|>A;)F+!|Ipk0T_$G+@N}~?eyku@Ha|0A*1Cw`N4N8uiD?0<i
-W;FeDsbdqDGFnNhp)R{DetjOvu-Nw5z9Ki1p<b4GF<Y25cz^_+n%0Lk{(c1&A){0NN8WxB0=mtx~4lO
-Sz3|2l6_?gU!Sd2Och~e^#Rl}Ls({B;c~BVoffb=U+XH01s-b;NGV<4%|lf>FD=FKjCAl*#I-Zzm9|f
-wDhc~z>jc*uQ|S6~Lp3_KF(YSZK37isXil0|d-ySebeX$*A(>wBHnje<c^;C+Y>hU6h!NIGb)IXO3gt
-t75A^F1(-f88keCjZt1B3n`A)OC!t5+pQu<n!Z(HEmer*#~zZRL`R6SIcc@ku|bVAz|9STFcC+1vzf1
-9SbrB-z~k95hvTp>!2wXHG8x~{NQwgbu)v_`~naf(`egxhO$IKkrsJY9y_u+IEIjiH1Qw1w@8(=_*cF
-Zj!xGw$F#r$@-GFiYuc>)@1>eGQX5r!eEL0y)IWvw4dIMr=M*k&fB=K<XlxJ0*kCpo|r722aLRhLV+{
-<{XVXP?zg;=jKQ9Y*Ya3-JGD6)AQy>IWxM3o)Yn)>J{0nHR>v!6+)ngZF@NNl#`18Uooqc7XPdvb}|5
-jN0o*JZUJi4P6^DwXju%bl&xNpqu!}O(`nyJZ<2vYcLjuEc3m2oL(o40+<n?O^ZAzvW9>>ysTUpM()L
-wwPc$%81eOdYgKZ`CH7KB4TQ_(3t*6%~Tou@i5$>)*z*`V-##h46w-L`-&CNBRejUekOsPmB@O8x);K
-@bNMM7M_1P@oJ{*wxhM`bc$7l8{KXF|F-S<Ns(xS^ZufzIoGTPr>7m_sVIc9tHaO*k0|W%I1ft@!aOD
-k@W)svPw&!6&K>?%uuI<)<q&&x%2%5oJ4x=T-oTpA+aQ&0j2ctsHr#ZAI`583(W{<ncWeV<~<pTBG&A
-KVpI|Oct(ex;-#j=Ai^$r^xz^I4s30_BMrrbSBPEA4}Qg=s2)0r&gX@Ip?QS?~4+)DUGy6({sGS1fS6
-s3U)#SbB6#JDic+e@dX&GZX-ir$PQU{q3qq-W!DEOlU`?ylYNZ#Y-y%gn&Ena$wh-ggqKE;JuV&y-3_
-N&GGGx+#S|p5$T*=??1|!*v4W!e4&=s!OceYi$Xw2vVViOl$5@>_Yn*0fhTJYhOms@5%I%M>zU>LC&I
-+Bq#y6KwX_LGA``aWq*rrEaM|@E2nd+HDWh^%uWIh|wTi-0v@|i|hX2?@u!14ICZo$_(q}39wceMzS9
-u@7AQFWxUoZI?PU=4FL<V4qrhh;T4ViwWgW)F{C3MxOYTJ@ZdFA{1kYZ~0YqGI^a&OwZ!ip8W@-xoE3
-YWw7cNv(7-9n?P!dsYnvD-cR%05EJhmokSRe03d^B7EFQDIP8q1IA+>A1gwV`fL;<QD*C&P(o^*lxL_
-Xa#SK~m+@2MV|i0nccs*gxzbuyqpi})e9~l|42)Pz83s(K92boREHREW7;#MwptE;c9hH26-J7%-<3e
-b4O$t0zc%ahm;=M^$Sv-=GdKum=(^PcN5_&X?;8Xa&$TN4uHhHftB1_5Fnpt5G#Bof{r8p)+<M&i2st
-~qAzG@c}=1RjUCPU}LEIXc-E2FQMt3pZ=eKum~e(7o+SrR+1D<}7`PPv}lYbMfQ`T;)%6h9tWM=K}OD
-jK*oh-b*-h^4nL5{$=5xv^1!KRFSIO<PyxHQwb{%9{l&U27AMgZ6fIpqqF3O}@<1Jc+CNdIx{)oG0}U
-N%{QMzmYo}fGQp&FuY%;S}Z|jg<Zi!Ih}U1xJ<MA2?YkxQQde~n`12|KsKgbQQe^l(bDS(i1|pL#p>a
-8oh;|(O3}US2q939EESLFfHPhMbu20U0=CTjPUh=0Q@1?PJ-@K^Lmy!}yoI9X<i;mstb_I$gAzI!^nO
-3BwEZ%8F$!K<Vh2bo8B)_#yMFEi7vy++s+J6M>iP4>sj?W_i_~U>KXJokfEl~GSGS6hQA8H@YFu4eVM
-LLn^vem@qo@k=gbyShGR(jXa_=^W{dDG!&@@>`wd$8L&TuaBGBO_y)lUV>69Z4yZ<8E2vVDDHGmI+TW
-df&}M!CJoRa>5BXeq{BU~;MlYN`inst3{8{{C<8JI@Tg;}&-w&Vui;C_9D+c-^4bQNbc=b?G`Q$+s2_
-PJorYzS{VV^m*wL(j(U_DI-6=%fR$cHxMH+A5j7D6V20VXJ=i@Y6gEm=dfFQo@^%EO4lRuR*O9Cy3HU
-fRJF`YuU$l>f6O&dgJ#%s<hGY&hvPy-Zy%k;9wF}J?A2qW-Ssf7oJ=j<dJ?8NuOojBehzJG)O2d8!@p
-%iGvniiR5;b!KwN5u0S51HzlOj6K`Onr^%{8T+iO<v049*;e%~tfYv`yR;YAth(Ju0O?GpWtb4sXW_+
-JrrKjlkG6Api_e}X?(@aJw`pl{aO)BSgc-yKX2{(63Jgszf&JA4eK<LjU3LKpmc_0uc)o&E)geKssCC
-2L;sztEO+MO_I*vq=0q>HNp>UQIl?9f~W`#Pxtire?)U^t8K7Vy$yO$2a?~HzeliQm^&;Bk7?q_SraR
-R8hG5GlVX6$1Pcyj%$}=5D4WZ>e(Cw^Vl|v@WmvsphoC-k;;A7Qf>CQ6%XnP0V;^?Lm~7UH(!V$vO-*
-Va9sCn+%Q>V+6Cf7f@dT*xEIDD%ux_xscws2JO)(fQ~0+ZF1|HhiPV>2y{Er<T8nBrT&->Ls<%l5@YF
-VW*7dgnFa53PEi~D0v2TbSy=;x#--yR-Y?)sS-L>PCkr-C92OV?$Prk$~{2qw_eQ@^eJ!#AN29}WoOH
-s6BLv+_wd0(4!;O|jcH3?&e6u5iUt}iee6!S=)pl*lUe63IK5$sy&(LbR_-B^7l#)>pN-~DZ0>esj72
-Xp;qrg!bje|!1G=Uvo2Zq`U>P5GAh25-JWIXkof3F687N-4@9$%_W<A)<j-@jY8+7TE$%r#OAA?wG}(
-R8yFX>h0P7;UOk-L#TMfxs8UIB1`z@IXqNdpeJqKT2L^1Dk%UfMp)d-LjeG6QDM*kgjWtXIWhDJNk<O
-a-9R$--s>>k<x7AN34{8UG5OI;GefGMy~~@#Ob{M6*xE`!rJQW!oyhV|1(lnemwjL<PN*xryE;D|cxA
-YKQMyiY>P`Yo7uy^jiyS*nG*@25qJ)?eskV}-mgo%~K}kU)1BIX6J)>OQKWWLh$#;`(Sx5Igkt|y{b=
-@V!jnf6aqMU<0$*5<mqOje*xGi%!%1@nPaV#;$p6$8m-Nc>fRv2{A2k<AEVjMAHh0E)`tDPx=5`PVko
-8T&`QDOXeba>7>BCden;-3%r=g;9VJcs{J!p?v8MAS9U9#>*f0ZH@m=-Z>?zZ`|Vo~E#ey-kYIE~YNO
-$8RrpcimGDekU~&RI0?2*CPR;vwfk04$tIf0k+~nPoV@&Uku26Lz-M>ME<IGS&=Lodbex7ND(s`K&ra
-C!h{U+U<YuyHO%aKhDpTv%aJJKFOl5qB;b-*N4_-?;+|XZU|>*Y<RB~XPh>0+M(4e0axC%yv^9&SMK5
-f6+kl`Qnv~O;ysXvL7t`9M6F$Wuw<xdCm^%G}t81z9DZbKo3a(d$0dRI>_(F$MEj@WS^}&&G!5&H&Z6
-#W&Xq|n!i*nrEHB`zMt3^-7J8nZvJqs&h862RFReIWhUwG|Pa_uD6Q;GIHcNYqA9m3=do?CjajYnVI;
-LRJeuFX!jPzoA|cZ02<8|-a0dj`Qyps1@q?`iP)=V|c#IV!ui>#Q6|71o_5Dc<~qekjbO@~26pNIu4y
-xy#9}ebcv_qa%fCA8p>e*`xnD@@x`qyQcK;-%Ydf_VynAw~n@5P7jm}O<T`MI)u;P?LGgn_xubN0D5y
-xw=k(L4m>9(>+C}Z=Wn0RRw{{P_%*yUw?HcOt`IM#TF1#ggJpX4ANYr^J3zfh7k4fVy7mCgz-;ePK9)
-#ro5uy+3{Y|qn1Zg}@QuGm<7<tT#*g`vJFNqq6;;wcK3}-_j<%Y1CB1N?7D~Jvz$En!kTi3NC@W!f)A
-CzdQ>`8JpS~@#%()BDNADh92T}5rDbXiuyxpVJF=bAcR??*0a88E%CCaj0cN|><v#78`(oe@(krL!s^
-VJR$Q>wm*gs>g{xu~w(pv}|6{dbc;zd!!U4pG1OIU4`%*UPQJ1)3)(`|l3+znz>O?0-BxLqnpk%J^?P
-7Z<~yFE6$(wtm4s{NUHi4#0=Qvk!02p~<s@bG!QA#((?ya_i#PUoL*8mj6YiqR6iScQWry@LRX3P*JJ
-)_)52m%B0Xsy7W8P+9C=3bG2+=4&l!${PX#*v6jWl+eMk_!EPHrd>a`+$VGBLd>=fo_n=$ACk<K(=+U
-#St!Kdk)0N2(t)u|aVK`{|t|H^xMz~oEOP!9t4aY^^P^dil*Jr3)*Eg`y4u7UAfx=(IPe)IN+u6e<M$
-vgLqJs13e4-u#wu&XS`&;OpN?wD<PO$egYhp%>myWXND+j{h^P$zQs@I93R?9TmQ<##_w0s3`gEwBQ<
-cS`)L2=)JAVVnZ`%3O19F^3{=l{lcnbRE|_|ueC6ve;QB@>dUx_Bsj+q7py+(vU5yXZEo)2vR?e3}%(
-%1$69NdPw^_mRN4%l;dNZsXlr96JlKYRg}>LnX8lYxFFf7%V8n1>Hir2BP>D7o6Nd-Q)YT(iaz2amgH
-Hittz>oH#p0p2WC&Nd@ouuf^!%*2J(I)&xdC;OgT({4g`j%8d<NUmM{oL@}x)$MLv;^^fS?`T5D&I}V
-{o+sju;lj+ZJrw`I+GOrpkcdki_y$|!4bDpyBL3x4;8iCtaPB-G##@npMtc^`D?W#39)EGQWs|A`1ap
-gnMY`?GoMd++k<X5rvTqDXfnM^az_)dzv^lQnL$G*%eM}7cQluVvcyv(!<0NGN@NQrG9z^Y2V-8&_#v
-203DH>D~0C5#?lUrN@~6QLfxr88?)PTb7S&K0JrgrBA&Pa*sVq!{N6)clzuR(^1-WF~VM<bn8(dx2`z
-I&)j*rsr)^IB8b^ub>eJSztSDD^$ob(Bb1RAb>@dXM-@R&Xa~)ZVG7l?Cd?ITexp+vCI_w1}4U<_}+O
-Vbx1h^J;rvt?7q%^q;u(}i1!ap&q0a!uaAeP2VXli`ft?n!Z|uVI#^F3D0x>W%Lxx%g#U<Pxyks>NAZ
-*3)9?P7whpb4`u1r607IFHXoT3FoF1Pa?;pRPz_8rD`ur2I5koOD2FBxJ_~;=RL1V5EWbD`^^5E&pQ&
-Bsv$P25%EI3&2_yk6cEA?}f9E%=S5Rfs+1@&+;ohLGMxEn`vm|X-_REp-;=U}p)w*?|3Qy=6lf{$~#(
-+L4U=KXA<X@WSf8%7ONB}iyGzk7Q&IXgOBBSK69j6+Za0RgqtgqPB6fKS#=FWCuqiur??Y_fJ{A6?RW
-w)Z}7K>V1CWTbGz!zI}F*4RoU1u+)ua~jj5nBG-QE7!?XWI0&_KsX%Q%kb0Ym_gAPBgoV0u8hP=bN22
-du+i6lIrXF6RkW|b)jza3an^I8XGFH*p<i_99z@828yZWq9m|a$8*XgIS((eL!4o6Zil>mN5a>TmS6f
-=0CzxJBF0lQfmiW<kbNHcbBbac6W5Byi!Aa1q`(0uWP&;aL$bASNs#Rzj+9*)bsK&#9r=`^dPsoRyH@
-T&J?3fxonYJr}Mjdqg)f0xm3CStXH>WhBX2dNCaqzYQzQ%Mc4eIV!**t*_H<d<5egh!j2HN)u&+~-8J
-Qg03&aV=W9Dhq^*?=bcealP1<ONd(JgB#Y8~QEPdB*oH3yVTgvJ5_!O)|@DMU@Jh@JMwf+(D6SOuZ23
-NRm#ul@fI+3p<6U4xMXHrt_-8^d|%r^;0dJR18VHmOGTy%T|rohH^f>s0hb5Z7LWQddr)$!kH-+?v4o
->KR9V9DHC;H%$eFq7mFXSB-YPX1pP$JS~m+Bn5l`d;QV;{o&=_ql1igmsO?o)Fh7t-M3(ZM6R`GWm`b
-au`ciYSfyNfmdLnQEme)dka}+!^yDWV|&W%M`<gy?8R*YUPSCiG7{5LqKfKiV7zQ)a28!Rx>$2Bn@3`
-jBqMEPW&*fEH*`vecI8_X>EAt|>H%kA@dwk-gD$kUWhwC^8;`vyTmH=(Q~FB96M{^1XwQ~rBOV1#i93
-n&0XiMuZ%QzHPrJOA)rdYW+lClStZ|L{|QUbGz61A?OyCNlpQ6d4Q!91xu#z9{K3Cx)sp%_u??x#pA@
-p^1yalH<-O8>vo>*r4Dc1_9MK4TZ#)a~NpKnnC+=tR=VM+bGMfR(X*U3uh<`Ng8815&=tMg2PNL<}Go
-$)}Xe?9s{l9LTm2swRWu)7b&xT4l*;#X=7xxBa}oEyMXrmiB9zd25!2lAK~e+TdMXtUKVEZzkYbXeR{
-Gl@<H*|mh1(n#FBedFmgSn_Fi3*QA8^=3ZhrT;E$qj9nlQ)!g_54XV(ZFFpyt`n{3bej<z&pYC7nkk=
-zXySpw{i+(xf<`RZo<N)>$Wnw1ES8z(Qqen1v3HR;E6oKXKFwh$ly4N<h$2o#mg$l@c@<YIO0_YvkFO
-q_KD`n^PAf}GcY7`~0}7e&3CB3ab4{tNpAtKv-xl!h<E2P55!MmN@oGhX<nUVB=Ltu}Pfnqvj7f4a4(
-8zZgt`7p@f|NAd?|6MNO7@~@$Xu?G1QnGF?$&aC>L~})hk>4!kO{=P6V6_h5qJY>?gthf<yz2>S;X>q
-9H|a8gX08p{X=xNNH|YGYTOxbB796Zz>X$Vc`j0;AM6L)>NqtOaJYO%E9%r^EFr3MBM(a;tyia02jRB
-Qa<WUyXI7B3Cd9sN`S{_7~JBx#l22WviWAuf{B*w91-xE$c{!vV?M))a=-xYp@`3*a~=-wxp2zx(%8s
-X<j(~1lFu2nrFmHGtLO?@_XPy2=Ts?NO&mw)EKH!ew$Zi=~>N?o@$`GOj}){19**6@+Sv|0$4+hvhFu
-z$79keg@}P*-2+;#eZl@7@MmGW1-=+cN3Y551Qo=%Pt+eJ*!BqO8dJE9jOdn4g-UGe1(WJqLg7v_Kv-
-#K{w8g{bDQqNcNaOB0$#2C7AVX=utUgHSZO5*9-7EW#T9IMUGI8dh8P&%QIAJ7Q(xQCHfjEZO8=&-b@
-Yn_H0&7Pls0yCJs#(s@4)-c@&K5Fu-c%x{}!Nx>?zC`Q+?V4B&}gZ<;vulW=+R%yYZ8P@q{B}Yd%Y>%
-V+SR4WwpkKh?i;L9Ep_HRkW*FMYX5P@a{-+OvE)($CcWBphk|?1*NMc?!7N%K|FEB@1xJMgwJoF#(JD
-z~>unCe{Cgtr?(h?0Zmg}}tA49r|1Va}jxMvzTc%Y0wFkWv@4q=gq@5S~F_pBWt>^k3VhuPyKw2Lwv1
-e<cOm>qxB-LW%_b$63Qc^zP(^u5N8Tk<|JTYxo~FMOee2q+?-avpI(?tb~`5shdrVZdY?@vY4KTFI8N
-EbnAt^fBD)ksbNMV}PU9s4Exg+=#)tN}g=KKW{o0@kj+#*Mi;SR;`M66HN9Q51_+KE4GR%b$Q*JTk#{
-(pdr=S(k1xbxMn(kI-8Vqlx7zcORaht>sj2_jEfVHBrbrG?kwFMP|oFm8e}WvhJ9`x3$<Z@<D3#lU>@
-1N_!{pG(%4hFK^nhkbKoyEWmtT44xqg1QxQDlkHy0~d(0^uM2<QCc<PvQ>FQ3JYpOfT&+;jQRr@nh$i
-V}k-r@S>p(21{l(Mq_(gDIr24G`pYokT+5w(wov7!f3f)`&(cRkCmS0ZDl?PMv&Tq{GzQu+fK^GxXnC
-mes)vN}!I%h=^(yWqfEeH`ZHlvhIdB46|e;!LRtP93h_?L|abVP<|E2|hL)bovQb_vaj^e>iV7NW|$~
-8fi>66;J_px`x9*$J&dEPDGV!0@JU!9|loD7yeQz2A@k)=kAV*YBh+)5_HbjBIo3Wb!qRaoQ80O{PHG
-@27Ht2I?1ArG;AVNpJZCMZdb8Clyz?nE**^V%_X0GGnwJ%Q}&fkU&J7-+d;|4Q*IA>&s&>l;JFk<9Q;
-L7i_}xuCMKFMZn1!RkKW>q1w8ibnD*s4WWa8+Ib941TOciMkJ#$#pvIS>nOus(C2f5~ROFN(<Bl@ao(
-LJeZZslO4n&lg(alhe1GkHVG3dsUA7ZnF_k{3{ZnV3*m5GAH2toEFYn%3;?D0)>OHU%qQsi)?*D`UV&
-pO8L8`3Ae?D}-OK6Hcy6i5q%tz^_q_TbYfv?(-(BF2^P+H{pz(46Iam&F|QUDsp-C7<=RbM}!muCiO2
-G#1_B#Is%V&z?P#_vI>iu987R^}U@Pq<mXVt0LA9aGfhFlB*`Nq2otp#O=GEz)FQn+dZMvlBz-PNy8i
-lwAkk5^++zac-lF$lmPb%pII-Va9yR0{~W5jDoc?GUff2Sv2)EdS+*;gJSVR)Va9URc8l(rs^Gakz_S
-1Xov&cK!Z~G!DlFDn3z15qEObbGGheHa+K~dIr}|WS_b`x3m~c1h%?+O5g)t@cTwcnjIv0wL%gqOpCd
-(-ezdZO)IxHkaDN=(dpLIqbN>@T!P8Su7iXBGeP-I0#I$zU52YOP7Yh5=;p$c@Q(<#}pT2Jn$M(vDf+
-knJ~yarp3t=0{xVaX;s*k{$!yMx!q$}xJviYOD-a_4$1s2wFaWE+;JPg(Vy`i;FiaiM8-X2q(RYb3O{
-?D&k>byZ>tt3^`EOuExW>fM)M3Z0HG;}en;R2Z71!x`=6;mN@x)?LQaspMIw+LyS-&XF(hrpj~rhDjA
-*{TOLGP0qVLiZE4AN@lx|zv!fDU&`xPyGO5n1AM@p;lmdL{woLmGQLZ4qrsOfk&Rl`6X|mEI3F9uq7V
-ZuQ4tE!e@5fDE>zLWwl2F8po`Mo1usR|Pf4C*`A>W^seZE=NQ@)-62%jz{t%agiCaK}A_-0oPJ%CXKb
-Hb#Gte(r<64wVGtF*ymf5nwKij)dV`oz}o^DgZ6x|wFXECr9C~@19`0@qc_$x9h$m=>c{ufY70|XQR0
-00O8Q5kVep#23_uNeRUpIiU{9smFUaA|NaUv_0~WN&gWWNCABY-wUIc4cyNX>V>WaCzN4Yj@kWlHc_!
-5IZ>}V~UYvr)jjY)84Gxn?0@T6Q|v~D=E4Z1<7nAk|inGZr%L$of!Zmz=v%2aeL3YjZG53U@#cW3j^%
-4?$a&{;&~V?hisECx}W2h&VFZ~y@`{XG+bWh%zoprL9ajP!mrQR`%BKwZ}Q7HVi)luzw%SgzKS=|+|R
-=}@}T7f=j@xeZ%)rHPQCm(XMQwiZ@xQw|L*PIzJLGSy9@jX^*Vcdd!4uIWX0D!%BeMr7tCji6~7K=E6
-%n&&EP8_$FkrOs<9-Ex8a;VY?35SbGC?6c7A%^Jv!>Sos8$3B#+}&)(zry0x%H__Mh>!ALU`7!So1$P
-PisGt9ZGDkLoq$oz5bS*US@unEamQDb$+gHwn)=o$1tHt)^3U%tqE(oUZ*<_%omXAiA(zrhWX@&tV9u
-<#t&4V|~MyesH5T5FeT=U&t|N)zzow2H!`LN(D}*X&R^4aLMzjps6+Kba3!Ig<(i4cu@QeeY2<2$Y1m
-6)ai6O!OG7v)&kZ3!C!4SJvu`|1IYXSGRzqK??-G?HdB+};RImK1mG6%B~Uw_{m6q{!kY61n@+<h%%@
-X3<Ew?sGFgN__{E!w$$?>H_|L=F#C9r`5<ktcT>Yi5@RD&mE9(Lx9Hu+W!YIrADBw2LcNs9)ir4C`cq
-A$~?1c3?1<Dd`4d2ucGtSQ9yx@O67gV(1-G{PJ6|gXZHIZ#*L><d1flp!nf{)XZ(`83-4y>Sc7A_d_E
-0sFz(Xn`|)+*6@55*Fhz>lIhXVe9(^Cu}SrYEVzo-m^~9jz(<shFf{FJcaAh>L0^d0-u<kvU<<0+xK&
-yNh^hcM=eeK>!oD$?h~5tNf2g`Bf{%%l6(hjBSZB;U?-akaqQfm?OE98utZjV0>Sw%lknUTH-R#li{;
-x^Ek-7gmj7*r^{z4U+|Q}qI(8P#b3vBzS<Yk06<;(+2wSqp(Z{E?yg~lg|;>+#-LK3q^&LYo@BQ51Qy
-($;&tep*5GvNDXHihlE(lJpITw-jYOL-K(i$vNp1=VVKz-tAOnem8k~0dao!+5l=R@4XO)6nDh*T6O3
-^Gv3gYoBj<_6FnB_n+_?B|giXp6mbnk;bz8a0Q@s;IuCr=%FY}?*bXY4qy_r&VJs`Yl(2m96W?aA@&t
-J{;?N5{9vzYN^NUvEDhJFmytQ+xDboVk+&=dmS#M4NRJjPd-y9((ZHdHUEYSZj-#2-OY`k>x;q2B4>X
-v;}}A;S<Bz6UN4x1KZ81;S^`U&*K!w{Yyb>>y<TRD}Ozk`)up7z-7shZDDl>rM9(B8ta@GbzU7eRszW
-uAYL_)cU3o`AGcRGYTc*WKAYVj6Z)G~?lR4kIzC}1$6g8U)5CCl)Li{h(fP0X3ToB%pwMUqnY;?~jm+
-Al(Mr>#SRYx!gK%*J93Y`ErC(Lkd)X9gWkJZ*;jM8|>6Qc_i^6<;7hbTKk#WQMQ0i9=#xjjJ2_mre#G
-`Fh5had3mNiGcNwf9yk>4nUv4OXWuRs7eV$RW&4uCdYuz7ftg?YH;QuT*f9AyQlU<HFkqj#c@Qg%I<m
-?I6KWe&rQ$l4kO3Ng_gN~fZsmnEw(w=LIlCI*b6ss_yL#h42zapYVCPOWD1oV3r)+lXcc?H@ownm++D
-WgT{XuIhE-M4u{LDY%kq)v~fyf6_FF%;V8Ky8<a^Ti#R4X&w($gbs1QfV_=@!lk9yQoWf3W9VRP5fqT
-6z&3N5l{(U`KNe6=n?IysoYZN9Kj?jKR&zE3=Zy^Y&|ekn)aKsO6P*um(Cq3m3@%&XT!EjI3o{&S^>V
-et+{Nr8=LrjQQ6RN(6PPVj2VJ}fuaUz>!|q_>viIqRw~@QBH-*}gjJS<<P<)^L*9I0<9y78uK}&(txs
-Awq5^_PI-U^~F6S2!$b-v1YGag`+T@u|}=ye6+06e)M<$jKCbqf&XGSM8Nwk>7IJ;+-hMCQ2cD<80~w
-I)I2`AGuHz_#PW)nGYojvsk&HZ|1@HYvAB*U0X**;0-w{=A|2L8t0c1tdzBR>0wz9CyL(UZ-e31VsF`
-YA~dLifRqhPXL&|^pT7J1|4Wg&{FXZ(S<8PTnHrv<Q@{qhX0gK^gkQg>SGBPx{F)RwHD>5@T|hLai$d
-EiWbNL%BpfTdK42L8ZMLB)k1Yr8fF-nu+^K%+U8IeI|rel12jL+Q#tL68bDmfiv~rLp+R7yKqIMI+Ti
-W-&_Yr?A*pAV6lrlQ8q`X=#ShptBVNvDo$w6=k-mw!(&R@Hb}fzyzxIQCD*LKCJQ>)K%8$@6#E6ORm!
-Zwrm!Z1iD=0_QkDA&-`?VUhP+e3SYAREXLe%_Y11N=)O9t2@6{Wzp2gX)15nIXrg|QVf2NlZrQlbB!7
-j^m9`~NUJhaLRRfWVXV&kqN5&QH&ej(XD{PTyU;{qAh~?zHCiZeQEr^FDIuk8*$=+xBl~x4~^1IQShr
-@H?%u)PmM_5`!v~P4Iorw-17FV2}Ln&tG=`cRZgUI@+7_8i0^%-XS_9JelI)U^Z+emFu1rTJkk2n66d
-bgcl2}Ejms9RmGAT%GD-8wps3A#Fcgf$WVJLoR_WUyz~p_#j~XJ2D21AW|VUX00YB9zTw-b+n?a#>Xq
-orUZ`{k#T|W^g|AT7=Sd890)U_|rctNL5ZR)sz$!^KH}PornGll50p;fx!<Q4ux?9Z!=?(h>@qHBsV3
-3z3hZBV?fd}1);@%~pud%!6TT<1;SQNo;K-49?@wq=KCR<?G3R&Ra3|f@opAtB}XwYe(ZNLQ;8exkf_
-+3E8XAQ8RR4p{22-u9UG*mVB8rcm$Bgau&joVB$vyV0;c<&n^DESb;P&^F-rDrlU>rWVNu?6um^%HQO
-T;^}%a9)8Ut#+_0L2j?vJWN3VuWnp6+vLzg0Ad*y6s-#3g2`^P8k`hcf&&45T*bo*X^SNH!fYNcVLT0
-H2@M-4)t55|uNCvC*`ZPGdM-VhO^C$GaWIS3)QIISb%ewfmm=_G+1b7dG0r$l5xN7sD?_#}S_X?S0$}
-nBt$u%z^RyZqA{NC`;GXJq)*+iC5o^lw!8+>postKT+^VtPD@8+%SPH_=mg|(=DhPxxy8Jo@nbhG?d<
-FE1KQccjhX;)BoZ_nbfINeGP*7jC)>QPpZ(t2$(wiEzk!#W-0z+eIRU|3$hy}J(_oOhTTuq=$){%;r<
-fKb7mkeW<Fme&PD;NRv)-)<Mai=1FrfabxnqJ%gwSO?&NN~Hp1RaIj++{FBx`kiI@w^;c-y3N2&wtv4
-ptUfP4|B2yg<fw@uj}>nH@|O`9r^?FeO4(CD(~J=@&5k1|NL$UEDUo`ZfLxbw)5Y79b1i+_Srg&!u4j
-&@~arhI)h;v*p)TaqFC`QU$Hd?KQ8?(iWF6nf!u-_Fws}EEKIA`Emq|gROU~Q&F)tVVbU{n-ochwq2&
-9Sr!hwdoY=d%{`N6uyuqaoj%Og`t(CEebBqX7<nTYd|3MW4f4pAtpv~Pr`+Ix^v;eOVOdkg9rF>+vdk
-`B049Mg|(g)yop)06I?d?zCM0rQvbFb$Vk%)P?AafdIH{zt#fm&r)V7JXx%rDMUwh012rD(b<<SA@hN
-x7+@*KaVU#EjOwxbt_X?@qs&zW?&;3vvK+dqk4Zn&Gbif2H&rR<t#7e%oG~=+=*J>|A=IG$_4qigZ<i
-8RRw=hA$CvDrVHacG->Wfnr{HYF~?S-pJRRLg!o~v)t6sDZ-CZI$nbTjlEJZ_@<72>DFWH2CdQ?Llj<
-*BC<$<<P9QCZ57JDt$T$P5%?!<$kDEoB}rO(x|Y7zrqx*GR%NG7l`M^tS2|b|+=*VaG>VS(BL0(A+iX
-*1emV<5u%tIubw^Cqh!kLb8_b{o2y1Ri+Q^Jg-VxUk);N4K)jj!HQ)T5?2bS6yD1njYRvJnMRJvL?rE
-WujnF8K@3kU{gXQg(HQ;Ilc=2fb`UFcxvD2@?fsVl@dkO#oN1~OC{7Xr8pu_A=X0)h!%^mY(OglAOW8
-YS)`5N^$skSg>Cz(rHx^DAk00FtWjfQ&I3?2Nc(HSyTM92z&N74aZWYN%C&+YI*H1x_c98q&$JR<jz_
-Ym7!#)QCPiW?^Y#E>OgRSo402!^j??bPa{h36bs1W|JB{kqJ!cU5pYyJ2l!a|4nH7>i;2aiwNysL0fZ
-une?r5!M_ovCp$6aKmE1*Dt+pjo+|8jyAXi-I7%3GZB&~6&AinFrEQC#qPrhND;3^_RiSpqa1i*eqfq
-TE`YU<oK{N8`!85XB#Xo#jY8y9yvB*8XQ{);+1G=!jpRC?*nWg=^y811`U2f8ur4+`lVpxG~eh|TIRr
-&X7jGfv79M<!1zI=1~?djQj^apKfZEJfc*2p{PP99qhxP<tt=?6m->lm!dA_|afq9D&|z*6hO$eY;Xx
-r3lmtLKgTRiOLKJHuF15B~Ugd;o04I#vLuJK2d;i51Xiz8fi(f%#aV)r6FUg#qCRtY8(<s{q>CQfg63
-CT<8xhyw|+hE&m_30!LPZ7Zk;f`f^i{4#KVC8BxFRKsY+Di1L}oo=EG-AnXt>zIvaw!d2Vw|;WzJL4I
-_^jGjwz{S8;mL+_J*-uc=3<M*jRD26h^dO*hs+d_&?wLI_V2=*b+)wABT$Gjm>>1B}Im;G4-)ow2nOu
-DT)mLx-agWvVVKn^YO<~0x>|oCOa;7zMpYA#KXgt})>IJk-bmdb@MR4h-P0&6K52j2mn-&frXvxYCI1
-5)RzC>5C1==6UPTp<-L*aELTMz`!$=Ubcp1yngW_tea6y~P7<7@2mmb<ChX1U~`uGHzKG7F;&I@90xD
-aHO|eav=K=b=FIu1WlsiLm%q=F}CPXpzz)Wfrr=Fu@Kmg&9j2MxQWJmS55VD;<S0O+#(<s_auL7CT&^
-Uva`v6Bz8-5Y~mtUbdOpSl^YOjg1=dsi7qZYWUAm!KpK~iGe7n-7=wIT$vDo8CyBWRKa+YGdve2+lr`
-gmW!e8%R^$xeD)vs%gcB^g_#bxwy#~8X&GT{z+c<iF0$hk>Z%~yEJT5{knme=V^!2BW3!YUT*O!FHAf
-hh)s?a+DV2D+vn`DwuwM>qn@UiicG!A`xuiD)ld00OGNjQOb6jm_xGVfrv}rdiM2Dlp;bekoAg#a+O2
-|gT!%4$b+|iY0yA<e&2P4%1Lq+se+f=-ZjRfzl{VemBBDf_17p3*p)FAU)XlO1h@!2u55vmB6Ym!FZz
-=g1ckYrs8K~OMW97~}tu_^{4+u*@;VfzDFU&kcOQ1*d1QVVET=2^v=Fhyuxy6Hmnq7a;AJ?-E?3<Ci1
-iZihcx4d+{WqeOi@9l!!#2Xd4G^>a`q7WmK<tCvWdfaP>sv|HN#$>DTBMK%5JC6wdnhxz^>NLjJ0j(v
-+aIC(OXk$J-VlB4-D!Y;-;l!Tb0(E)0QAy`HDF*Ay?LAb38D&5gq#<aTNf0qgm(9Sq7r}iz?K{hOx-C
-xr%HA^;Y*M*j1x$iI1(cuPoWJ$h*96RG^UXSeCIl$IMDiEm-3^iR{N@e340^qnE;|~0{sQ4+8iSb8E*
-l*72h4tc=)F9ABDcyKg3_qYP~wBp5G|EwL^=*f=5O*CT7tHaOr++f%MOoT95MUzzSlb{z+d46Z89<0K
-*q9>+Vh~sUx@VJjQs*M`;~neu`sPokm4(9Aox0C_3h<?>@eRVwIy7XN_)<8p02|P>B~)Jou}H4(~b>P
-72zO(<gdW$o!=B#2sv;a@FZ_b%hHoxGMQeOihM9-97s(|=^QkPKsp)%amL#J$U!v9!zq+*oQBI%?%B2
-_Omf@=Bnufnkg-ggg!FEd*KBq9V_TJ0VqY<kAY~o`8GY>_x**V0s~xqZ6D+~O7q9lE3(f&;dEL<?ZYc
-<ZmXa)rXQlzaAMRQ$UCQEQrI{zqY`dg>F>|QlV&rh-d_1orRuE=zpq9d{iz`@6^Es^RUdaJq|B@EkgB
-p+b046^4@ImsQSqs34TJWH1l?XrwBz8+gNN(=Ux`RE$V$b*BL1wW4j#6Am07aNV3Te#xp8@%A81jTGT
-tb)eJdh1m9P<EF7y&@e{p=F^na6np?)J!^1ryBM9F4nU3Mm{oVl?CacwmkOWJ(vt*i8>#^f9sk?;gCv
-o2=0D`l7;%mm>1e$MP318#<QVVZNt$e4W15I``_mzX3jshHL<x`re^S53{}ty}a~#pJXygr4#Sd<h2;
-0GxlD~VKsu?_7LW_FViAm;?hjt*S5A+o%crl;lzMbIHFb$W&xz2Ohl1Jx=3r;L}2B@OoJZJ!a48q#R8
-MmaF+3Wk<0c#c^rDZ=U(sSo`jA%h;p2=A$#$H*`Ed=+<^sDMwdD6@vL`1#I#>O8qb~faWntf>{%dIMH
-CmCgX|Q~Iqd;4{5_mVdg|?Y?4r2k0wml*W!UUfvWnM$>fq=(vtM}6Kih>ZVk+iHGT!o4|D>{zkdrN9t
-+TT;i{<`O98bcf3@=SI@Lt>0;1+(5y%ZThXE6L);jn;6f?ai$%7i(hvq+e!Hs`Bw9X5}lD-xico$JSE
-LhFH+L|Gx0{~VK$_ULpI7*0an&oSRHW`v~7xT>xmZ``HTb4%^DLG|wF^I;tU1Bt$zLdxCI2?=X4G@&S
-pE`?B<H}yh|Zbf|>%bwW*9#pbYi+o~Yg)Z?xhWq;>l}}}E;aAy+foM4L`(E1b$z=<yEWcr!eow3T(mO
-ot_FoJJgR&xi6E*RBwQ{Ozw^pt*WP01Z?bcWkTQy2M8Z)LRfK;KN54kTJ^u2}^bPk%(f$Apeu#WND;7
-}uol;ZGFujVboyr{RM+U)1_u4<qLeC*bf6$OIu&8(=)4fd)3ya!V5Xs47DEBqEPy#+MxvA`u!J+y_Gt
-@%^rbqE^?d>7zS#~^#qK=c7ZDKZenm<B;#uh9+448?i{pcFvZhWtv<MN%(lrpTv3pV>X{v)ytZC;%{T
-CEVMtA&>$Ptb>!v!U|T;-hV_vm$AL%dQTmk3{!Jit^M?)689Awsm95MqS<NAD|_m`mU@~sIn`ji@6$e
-%xWTCKK)_TAct&22jc4T3aJI?0c0H2=?K(xu;rW;E-q(Vkc%Ec(a0^4c1vv;}&_WZ_d+T(xR7Hww6nS
-D8VaLp>KxR}~ayE=_U3?>{*Hxdus@H4aQiu01)H}S8A0^(r;`LV*PFT_CjpHr&9j{xWG$Fe&MYWpgPZ
-1lPBr;xCctw>wc?_;pNkK;?6PHzvSYuXLJy{;3GCd1(8j{hlKfwp<rPX{&7&}Y6pD{1k{`?`wizx*3)
-M5uLsg(;-6dCzWr@6p-D%_BrJH%D879?$+1*C{!WY!MSV-5C-sm|-869G}#FRDiwUX-VNWW#O?LFEvW
-IH_C}a2ME~{AqyO2(yvMl7J#1SB0Tf2B>jAStX%;ck;E^tu>azZ_K`xlWArv;hgS1Jq(j(YX^d_D+hv
-!p4ZiR$FDV7UTbsTcy3l=*mxtrEam>kHf}Yje7_u9V@3o;jWpSL7~~3sc5vFM)Er?F?F1KOJ&jgCl{+
-D|TX(Dvwaq9sk-sl3<KgKL>SJ;7M~SmaTsKo~?z)vl+=J&``6*ryXj^Z}Bf6lp^owvrNRJZNCC*Q>-I
-rkqyID&)d6HR;q;Z-CZ19$uYOm*uhO{S1>!O}@nt5rl?Nd!O-JM>6YgcIZi~2o^q`xmtzXko%bXJutl
-d-4&X{Qq?`z~txUiW2jk`$i16J)g=hf(PiYJ0=Sg~1@ybh&Mygq9kAF^=-IsoE$|d#qL6jv>gY5TBU~
-hHJ*7++^#vyNQZ?D$&T@l|fZpSBT+`rtLfY*=PSvS9DnAv2wb1hjuYZ`eh=PPS<xH(xo1Y&3uVF2o*r
-H8;U1%QO(oY6S*-;sr(r>%)<3%MHhio&KTA%`X~k}s5C0A2cdk6(|=+sC@D2Ijk=x%q-%Rz{Q7*V$kB
-sN2j6i5c<uj)w>5xsjeina`wjb~^7zW|a57QBjLVqzhR|ES6%qg~pe&a6yQm!xI`$?HO0I-vq`>HG6R
-zfnPswAllf#LNARV`%>^YV_wG91kH;ln?wO$HsRJmsKH)#FJQu#fnZuC1H`g9q@qhlO*4cq%^&&t@Uc
-aC1rji`6tJPN~d<?$-K!$a)j@btKHZdki<3l9n!pJi*BT6!{z3z)QNET20%<>(;0aqEUT7lzAM?Y8|8
-fw5c-rE_2R(16f*nMgI8vlxxU?xCakx52;E;ZwX_s9_xX-8<iB@(wM{MaKOJ+zs^c;tRG2`D&guHrAI
-%jegdAvtHlOofOP|k~#8@g92g6Q9EwdEBSA?<}z+|*^%~Z0&UnqR5YDly!rd-x2G4SBVR@<z}q(0X(f
-{3)(@<;?q?N0I}!loZkQ#Un0oJ}bK{yOysPdwlms3EjU_B48tc$>q3Kq|+Fj#l%>;8OHle6GvgD<XWc
-rt1H5yN(y;EKgZ6hB^9znf|TqTc;DF{_Ht6v<qi9Sa0Ritk4ri*dp6?z2NG`}Q9STgDSA5cpJ1QY-O0
-0;n48F5V5eE^ACrT_o{P5}TL0001RX>c!Jc4cm4Z*nhWX>)XJX<{#TGcqn^cxCLpZFp4GwE%qPD>+Ff
-IRhjZz9R$+1~odw5{KXbnGluWK*$U!hS)2{=}21)=K!_@5>JNaWHV}8?5+3Kd*vd%dbKUL%7;~PhS*H
-vXF#i1P@|^0$3rzrOa=%!?^^qunFOl$-sgFLynkLE=A5(lUi*8kwbxpE?VYOcJ;+%&j<do~(>U%hr~h
-+v|NB1*znmF=%Hf{Lc<u7Trsc0)zB=%OO$8epe|%Tt_kUP$$M=8qqaTX}|8!?Tqx7SKAN;7G{MPD%AO
-3j#omXdPXBHY|9Ln18`!hlFh2-z{!hgB&6};)t6Bqu@-oLpp%-)Y*_zk?zjsN+DK?ZBN@Lw$cDFgo3#
-{1vdd({u_2w-{1wt77rx7=joKKyi*KN;7{nN3-yOpbdB0{^DRZMp&;4){fkQNV9A$Jsa&OHaPJ2Tg3y
-Hhp4(WOoY#MA+0j^<w{?`iSEe;zxmrd(8U{gV}829_69fD926xAI5yn`<KiOw6oIm?eJHNcWxEoeZ!M
-RgRrmGi(v{l?)Ix2*MDF9KF3{grP23!@Y{be9MtQ+S_k9$u7*dyQRb<CfQww+xT*0D_-1{DK69(!efk
-^9YrJ#Aj{z_(hht;F%3EZ*6mH44_wfJ!_y6W!4LR)#6#v!DX?f)lH%I#Sh}ny|P(+#(8WgV&EQA!Fmg
-k0~y?TN;IdC|O<APkk0i+P{VpfR{a$1j?0g!fpbVk<IbwI%_r>%f#d#wEs^=HL1EI09-G(YTdcs0o$4
-h^5zw15W8Cx8g)rI%mFaeAzm-l=Jt{8E0<q~&qgtg2z>YqTYu<GQh6QpNk7TDW4^D;%-)jJP@PO1jt1
-aq>%cXyBA*F^Xikc*#r>;Yt(n@I}#ZdGWCN28q?Prpc%0`2zuHd)PDV)B=I5#hh1Z8djS6DTP{`-L9C
-hI~v#s5G(1m(3qgvuSvtSYCNz>c>Bh2+{228+J;B4p@mA#X~mOp#hNTiQ=-}jun7d4u7f{k1%$4K&PY
-6+C}0#%`l*xkvA`7*r;+}ktv1~B)|q{zi7$#-Jc)-%Ka?2<zQP>=qOkhtEEsjgGeDqHpuF?7qxB_g+d
-q!g=EI5x=<jkcGyoO73~eO+&WLMBcqkIs1$|Pa(_Z>LjP{%^@(cuRP-86sKdiR_tEQ#E7@;-tOY@4Pz
-9Ol&=*+!l=U@=f0jl!oRY9Npv>Ym8#dl7L44nw<hw{Dj!UZ-i;qpb=y0vOf193e2DkL<x#);{buGpr}
-Rg2>3$D%%lqKK!zww_I`kMwJKxiIDO6<p99G(mlUExcFDTh7okG$`4%yoCsmNRvzzq*KQ=hFjzJY}9c
-yBgjFHsSFq0dU{`?<uvjs9UWg%S_@BbSTPT?<<$IsrMz&emNy?OIT0=|ba;as;kDHp%&6A#=0P+RYnQ
-hbIyOo+C{#5&BZ0SASI0wFTXq$;AvqOuTx~7ODe5_S$Qc-5aGwnW8kMi}LE?PBm;S<q2%D>jg>y*B0s
-spRYHxcXaXlS?nTc5ob5CNnry(1Z`L&)Hpzr93#Vqkxdg6edxPksjPh8Ft@6{7cfj^ITbFuQm+i>mD@
-+zS&0M5r8^Spk)A12YSiO?u5&jD%hnHvbO621#15P$;0g4q1MIK0rQ0v!s*%Zu&S^zVGVT%c|iEX1Dg
-V#V~I$A&<(Lnr4~VM12IxRWw>)XhD&AAqW1lGWMa3Lf}`aENPw(VihEW{Q)8yq9WOIIO^w>;N{by~EJ
-pO=l!DhzR{Wt78|`0q9y=D|hk@@{Kct=C#rcXQV-1G&8`Ra&yA&h?m|4K+Z^QgOX-BQ)@YIBv)ecLy%
-kv$-<$u+FGoBHr5<6Y8Ed8SS3x(!N`rt$V|%_00&@+5|3Re2JW(MZMV+)3N2$<AF_lzD|Ed<UNBR%1`
-AYMaHbrw)~@u@BbH?EVxe9b@E*VxwJ^NVtd7Il%*ooa<W93u-KWX{gw*-U5#(Mz;J|rvSOsMmo+<Lm0
-SYi`b}WSNAVkX4Odi63v%5jDFA0bG;oIA(vrziCb1;Gl7*!1h1CVI<DU6*Dv9;l!VNK4#TJnY~u_>>8
-T=ThX(cXM6Q%qm%>T3K#HIpxs)A1C`cHt~ed3886Z~?1G<BEoS{vaQSUqBQrX0+^#I8VCHV4f2!Pxo1
-zod%^<!c4Wb;RE<?D18K9;w0!hj>lIS#(3~B9u1|_rBB&3&I(xHGiJGk)g3g~>(dp@NKMxej-RVTqAb
-hhf%(ZSD_9mC{^#ES9}b<yq4Ft@;F~Ul1}ULF9LY%OBlr#k-ZPNMa#oK;z`*Wg?B5eGxGV=OYvD>WFh
-onN!S$vzSQI^$ApL|@@DB+}=oFG5o56p~)kPS>guRfE4+)`@kZ|-^!qR04V?KXayq5RTCt!I^O>Cg&J
-sj&gXphE_NMmTC9XQRNtS{F0Vb%Bf>97r1RI#5v2T1TLEredb>dHo>mds~5;$^`2gZ4l_KvU~wfFGLD
-)aQ(lI^OjG)Z~gux%4*^IWES*gQGXX(-~2J3J{W=twpf(y$>@{x=8;%PU|P&8plJ<Z2C_uXFlXqyJ2Z
-=D0N8%v?^6xa3t*M_Xe;rbW1*4`_(<LR5*OqwBCVXhvMmrd2oT&Xa?i;ee^#dYX>gF$6y(*?I0RkawH
-!3$pqS;2gOcYrxerO@I^Y+!ay^J>zo7R6*`_R*LEchFvAM{NT(5m;$Zz@#lTY1Kx*tN-{5*#94|+JR{
-4fdx76QI>JVYIFu(%OM^V^Xt*<C~fu|to)g>$l+n{Y)j{%D9?1EZrF;ZuoL7w_1W6R+~oTPWbM<-9i7
-1&2lg680(RTJ<TVc$=(=cAMHsZ7RE$zM0xYv_dl+{8h0LfxWSJ0^EpU6Q@=bh1lw*{SJ^IZm7uz&E{p
-7F39I!P<jSwe;bcAio8m4*@Sc=pJk?^0L)Ff8fwUh{*$h!<CSBWH~%)Ny62+Ng(M^j9KfEV^-Hl<Ck(
--FV<7PPMi|JFFH6=ugM-nApnL8V{r(B1p&tgQ0hauFjYLg8HYf=a~PNTQkz2qVr#`^eXkup+dYo|;Nd
-Md**PKfD9&WbTTl)uS%d4>+vJ2&*AqG^2DFkMh=z!S()5;6cS>nGA%9_oZ`b+8Tj&c@IIc8Z{5u2|Y2
-U?c^uHiVN!Q-g%fqN-5v6sfBwMNHgqVZn)b%Ky6RcEH*P}ie^Ym?iF=%P(+X}Bu;{YKEXAFd=&#HbB^
-Ym_G0KLryK<_9(F9Xogxd1vNH#s<IZjALB^(7dNe*z*zWT7vh^abf653$QJwuAmBpoKoIFsLYk(mycS
-)n1p1WdiEM$ygM=f*e)!Fa{xl{=^8fJoNopOq!+N!3hg!NalZl2EMAJ56EQVRl0Ui!ezqv<lV;5T*~)
-Rc|78*F3NeS6GF90S`zVA;+*<GHb+eX%YSVaLZf^?DCL)WhQ$eV31mTJq@`F=)v&^YEZD8*uLd3@pYP
-rBW1n9x!<soMpI!%L1gFz&mjlMKmi{x7j{pO#q(ij;3VBBxdONOAiI65;5wx!>wOJuj%&w+wlNe%3PX
-PHxL2w0L@hA4erC-ghrgtF#{p~npQ=pLmVy><0cy;t2NK^J|X!a_yx{!CCY`?A0K6DffFyh4aO!=tkx
->v+TnVQ7w^jPULnOYmi`^ov}$GqhOd^s#1s8i}eb`W!tIoyy#`f6<l!v2k9I$wEF8yVSdIV*puIp2_v
-T3bHkOr{pGm)txI(6g>n#Yxe)13vBWX;!=H!%MWa9pNP-_4vHNp2P5DV;T13<G4t<Iv>Q@*!msDNs?U
-Rv;!0}7;-yEbWIMWDxuU3hct1r+?30SxxfN1qYpV!%fJE$jtUc$h?Eanrd{sRoX3ZTN<F!oFPG12qP;
-o@T32JSuFwsN(NTac2ZTQ~<qlQY?SS&2t&tBzo>b(6UZkeSJOgMwfK{&buTYTzB$ks3D-3v<(DoHB0_
-R;P8bK{|H4O_tdk!M}+Vv<?N(uV2YdCK1cB^TTsVPzP0jwW$n}$hKe>?<GuDXH7+vKJJPMq;9;P(#aa
-o4+>Ge~p@6s)M4PCD?Tqv)ubbr_RfC$^YLhs!g(Wi4QE!bfdTcCDB4S0|O!pUMeMTyOFuicZY+46B7c
-I^jFW%OG}@+%(LIGf7oK^Ca3#(7jtUKyS}L=%f(3LPMo3H~u`5VG~H@I43$eFTREqPUi|Z)<BS4`~ie
-oVJ{%Dq7E2A$q{eWV;t&fKt@=+i;<fy6HvHQq`p$gAzo7|<%(C9O8L@NtO5Zl@L~BM>W!z}IjOnakb`
-qcmkVrF&8Iw%WQ@a^e-XmG#k9fPF$=OyUyxOnt(;FS#;I(eRY1n?u|+pG$rcWyiL#;8!%MINcXu2{#)
-rX84&ji8C)uk9VFfs3U93(+-Vro~J-iof2<vsWW4Roa3;b2tXGOb{=xeVAyai%(orkul*{R;$51)W~@
-jIawkcJjtg**tlmnf~bg5q6o4VtQbbVSEf5b|9e!mjh!FF(*U51AysXqh!W8@@<7xs@j;ir!V~1_qB>
-#D(PT=s6q7edtlpsN_#(L_bLzEWgg$EKVfHTs@l{q`&!wOv$u#iR<mguOSbjgfxY8#Bp_NJ-+n|x-`|
-!_|M=mxXf-6TAyLHTSLbs{_>iE_&yBQC5V(Lidv3F&)cA;@YF}JPLQ&Qh1FUNwcg8CS)hSy_09n1N(E
-#Y4|HwmQZt$tWJ(sz!@FJ4#xq09>}WAm-I#+B&hRw`R^Mxb;ZheIMuREL$`%K?)jk;IMSduXCLYm3mg
-TdGu~w^yMS|1>_)k0o7SHgydf*9wlU~Hhr|pPZPzuO~Fm-u!l|3~vUuUt2QRg6v?6w&)00yoE<f{D!x
-$nR1hTQkA?IO94RM;PvB?l`}FC5FgOYZ#wmQRyXVV81z^e=$DCXZdd)4|pH=tt07$X44LxtEuFhXF>N
-__#?N|2Qw^Jb~Sm(qk3*I0QN(`zT+;i2pBFqhSdK3W!{IC>ma@!Ey)P-H6?NDeIE%-jQk%O*6WCBas}
-y4m0HulW3Di%+g<3|E)&<eFm}3Fa*_q9EHcSj8S;gdeJEO<u^1~Saa#;nW;*D4xd>uwS2I`E{h9%RE5
-_2NP@n7Ey|K5SE9u(?OG;hvx$F0Q^%8vsi>!d_BRAgXqXD^YOr&-G_sC9h#fr%<;qok8fpPN(->KI#n
-GBC%hbD@4OP3vY*qv`{!@tV@X>viWOwO8?c&Kso}#`5#ro)1mQ)AjvZ*K`Nj7@z6kS;P$)uzN@X!EC0
-MNKKf&JLHMNmiB^J|dDH=^xmu(YHL#5yU<=L?#ATHXeTJY4lX<T*ApON%z(nd<d>7Q%PSVT{3T2I;eB
-vlw4$%ZC{0lzdo(ch2TFo!zDTDTfMSRH^EtCnuu-1Jcn{T8%xS%X5tg2VKG<`e8hPo6-;GV#2+Aa0(3
-#qCSupK!fZ{C@SwM0dY4MdPq;rH=uZ0k5IJcIwK;3uE2<(iO$9jyE?^mFLg1P<1mGTo|jBw8ZgB!)e_
-9CUFr1&urD<0E6{R1y`@s0lm=?_*D%Bs9_rP^bDHoZL#aCDT}dmL&8vglNr~qafXhvN9K!!6!pGoYOb
--aNbQWM@2Ms}!<0w|L`Dr;l2PSLp91fULb|F6V3h+5?Dn3i{@mZD&&xT!jZuZKa&tB6U>}9jF*KD4>u
-Cl`GHxJkrz>9dez4O@Hy0;kKuo~=Lh+(ER$81}f<ZR;hVB+3+5Q^Cf;F)3NA~9Q`Ay+dajuJWnS@!Vk
-6IE+1uNkLcBLKm$u7DoZqMou1jb3jt4R0&jD9aE4)&YRI5@7;Zwr=1ABopBUtC#~y?bs8Uj#ix9b$|i
-sjDxCauFj@((zzE?f>tjr!4hisK9<7_^wWb@pHhNpbm~P3w&3J7>tMNm7Ryy_doWtDo8@Q$ih^e!{L0
-O3`z$!J4j>8u!cUGy6E<QE;j%!^$)C=Mews$C=_rcufGQw7NoM6*$iAfIY%^ro_IkZDvaW;PF^}V#%T
-U7tLZH``pnipQQSA(1)+l#j{d4s<&TJXk2z76nOkOYQik`K}QO8Q!1}v#%g`ERMyH?GVI}3o!T47kmX
-w`Bew`rmrad_$4EaYSMmP#ESK!7Vp3cPxj(HyMjuvX0|V-@DN+-}!)Xj)MeI?4({+csp^^R|u2Tg79M
-XLFk-7<pJDGrt8KB;P%`S)iF7uZE7I2%yvqC^ZSCreC$7bxK}TAfgRPPJCZ1mJ^NQEIF}7yo~O&rMTT
-(8#4a*_hG`HGXWu}+0K)4)v!s;crL?)ta8|_+x?u~i~S9*qeAQ35FNgE$DeRtEYvNuPKB^=C?Y4Sg$I
-6#n#2y776`3_xR}u_aaE<bRHpgjRWi*KF9#Jt2<<W9`kW9#uL4ZWlRz|=Uvb1c;GOkB{CSioI^06&cP
-!o=f0BXqBUt=lmS`4253)sNSpIkfRzdj{b5;!cA8%%wX@Zl)RJjG}k7T-9{GLp6L{BA*12ig6rfEWG5
-&#T!;C7?r$@;6h3<Ye-)pF;s_9C*40nD#n%VK9|)C?zMW*B+KwY-9OpbCeX+<!u}I=fYK)`^szR0y47
-Vsbwxw4(kWEU4G#rF4;)2wHrBQ)si;zt9k0gb>>B<<7KGAeg~2NlIn01^OU|kAC1XvPfBSXC^cQ)_rw
-xkPq~;<jB}$2PT_2b!IR<U_FY-ds4|$<jx#SHgRL{#i?Os<LUP;DI~EXVoVL-{wN3)VGr8Dc`vQLfo&
-le2B`wj3p87~c`?(5EA6Dpu57g`3zV(AvURFb>0mln&=KgtrLG!^be?1;J77*GCb-uPqZZKXVq8TCzl
-_`uDLQQ3Uz#tjB^+_1xK#NB4!g8CTya58IJS%rR{%*}NMo9@(7HRBOPjyn$952EYgw3B_Yb;3n6P_&^
-nMmyq5d4LBYo-}!3A_Yt|KIyaVzV8yE?=bfky?SD9EZ4-!3M|vp8u2R6u|E1r(&SxT*WqDJei?2zu6q
-`=JJ<-tIatPHef0aSjmOm3m&8q0~>6Z*?RWD4K;B9i!XLXeeRBGA=D8MgUvcTM1)pkiNcZjWO_(IuN5
-kc}=gTZdCT<eYnVQ!R29Q^$mi!^yuZd!HLoOauN;|U(iK0wxlSbUNkF*PvP^S6Zm`t6({9D4?bUb6^-
-G$9!juR_%wSx(#2k(m)L7xguQ<EJiLDMK&bx$uDaH6l~oC&2|dQ@!xc{nQB1pOSPA#x2VhDV+eNAz5X
-0JXI<?3JIg-#<wlHh9S6|!Ea2NuS)9CaqSL5_m4c9wgTT9=GYZ|IoAT}Mj3|2f}&`kfV8;*Pzt$v0vQ
-Y*os)$-QpR!~cw)_bW6$;?X5h!_9Sn64J4X2#j=vc853n>b;yeD<owFT<68m(Pydk`v5c0~2O_ZTDBm
-v~A_MlbciP>Y5Un6_q1=T?fs}U_w{g;lvqOg(0qknv+q(dX!=80?{AEm@0my!qfXuKqLM1d3Y<u>ryt
-J!2WC8+<L79Hv>s|p+nhF=m^8FsJGhZXXtXRXW02?uW}~^)d~2gfqaT55%%=2-;4P=NLBxOB^y6$>w#
-#=-|AK-%Qx1Yd}eMTn|No5m961vogR%d7-aaT4mmL*W|I|G%NtJn0$NF--7D;*g4e?fFzn$6-PQ)33B
-$aHYp7B^OxD6GMwP15^7#?5K7139{#vqpXKuKBr$h1d6VMwIp>8pkyhE`nsMHjSY<2HgMmz~}0&10BZ
-*I~!v5=%)+=M@WsyD&Mns5U>fML&o-n$Mo-7rHxjBZQm9h-jGE6tV59?e1Hb3p*#^kcTakCq&P)POv-
-O3TA|`6W<N?GQtEo0xD=y2dV!59ovPCh4NT(xXXL0$JiEt-9utR?T3o>L-;vbnr^ZiTkNqX|-Kwy;Z}
-F5mxLgbTK5wCm}}SF6Qb&2TXM?Szef5v&y@2WuWKU6b>Y}o68IN^~!7mD~ib)9-!wrCy|YId1OR%K^g
-Pqb0ebF_0{I9!}B+XZ+qH7vY^HCPpzEvYQTiOSjy8?-{rVxagH&t9s=tA^$(!lgZ4NW%nm5lI<(jde2
-Y7baH13H<Do;&F1q*=4X`JWuWhtz8y(ulT)IeC73&xbbVD&8Myq2-4HUzZx!OHbwR`fld*;wQ1MsMot
-MU1($!EBC=REElbZXkMwW!~b&&Zb~3Ow@<*P}oKsojvSX`i4u*5?m$s{)&^LvM;BZD{FVi@Wk03i(wl
-al4rwFpSPec@DUS-#PfA7Z`%P@N4S;>Tc7*)~`AEQWmf^K`WMH`N_pVv{%R@h1=eAM%?x5I^;qIh#O5
-`60Mp{`!xXhj$oXhEDCAj1bMsFBxd`yH~rKHY)Za@!!6^Mk%F&5v^~Wj>j`f1WFVwu@oI05rhl?-ZHn
-n=^Z$&%Nr@15!f;_dhkMN0GTaI~Svn1^$x=Q&XlJ%(E-R^dPWc2EK#-2Z^I3ySr;An+Q-2uDrx|lOwo
-h_i5@;P1mNX=*-e4wO!|4lk>2#@xjfFos4$@_Q8ltGv%}Hfa>iX0yWs#chr$J1*)FALnfb4)$=V~d59
-XjR<>phbf!6NIWvoMkArQ>KCmZDvslF>orar8o`ZBP(hiu;W2tuS;GnLVaQO@~QA%`jQ-0Z>utbgVRR
-<9r;t2T_T7)UucxU1T4F(B8-K@f1GxTNaOz>`C^(TQHxcUMsMHFYg|-TO=MBw5zl6^xfTdOBKJ)72Ra
-RWVYj`m0%hAx`KO0#n{%`b2vdL6f~V+`vh4#ZV~fHN6=hb6cuN}kB1+8OH1jH8MjUW5LUWev<0pPqB?
-?2+=CCbM%!{5d6U-R5QR7LBu!mOI%Fz{*MWd5US0`e+`pW~*<fN^8GNeG9>F&4!G}8W2zGQ2KGe)3*w
-sDwh<W;ucD;JTL8o>`<fdK|i2fW3?!8ia&_b6129<jHP?cYbRxf7+U98UYVkY!Rw8`hK(iC#*?Ml^K%
-Cg%bURp$MU9VL2#Fnk!h5Q0y=8<d)!wGsk$vzDq78We6I@L6ZRGoqWCH~u#@^QT8Ii<cw(YUCjC8sja
-C}W1UWqq|)(_5=fg25zBCs6+v`5;H%LK&}vrCr>tam15sQyTH~D9hG6Bb0}+8AXD_7tQ+K=PwRMMuS>
-O#4<*55ZL}HZXMc~=MUR6H1MngRt$In3j-FTl@xxB2>4jit7wW=(v>QS^rrwG$6)8Wjy*{Ks1r~0Y9&
-1>NUcZC#uRN&p^=^g)AkhV{@JX6_+~(NAQLa5-upwah~yqkZU6)M$0}}H17j{X@EkIY?YYYKjh#EYU~
-rdq?z{!CU}>x(;5Z9XST?;42b59P=75&B9|}lL#v)X1?9_z-O4Bepqf~4_lHJ2YR`}L7Z=hcR@zsu<K
-Dry4(*e~&JD~VN^wI$~MyH(DxdHmD;P#wWf;}V&`VwaCVZ*f|kPD;%?EcY0W)-gu4T?ATbV#k_)iL7(
-bCDkettT<UoPhEU<JhdQYD$`#;iGSUjHo*ZH9ZqS#@o4$?P%{nNek;iW7y9T22)@dx8gAV^B|-$>tSm
-GIax&^R04FclL1!D(?eVJ(0n}<)I$sP&~19it%p|Vp>jRs)<czg=sG=gTNzFhMqG{&FkG*nGiHNq58!
-SWbm4iO5eqFE&X@>Xci^KjT-UG9(nII;IJS&$-vD`M`DvdMCdXBV(<SD%XvGP5+vOWM2@3iC*om9Yq5
-btYST23*YfVFRX47})SvG6%ZKt*Rx8@&<Y`B}5LFZpU_muh$A1OhfgMb$R{My@ra(wT72`BFDzycQN(
-gVdTz^3$VxeOsVQi5c$7s&v4eHj9BVzylND*Hf-QQ;n>ELOxGq=uLcGoHR4u#sWMUY&%HAom)SBeX`@
-9zEvqYHy=1i4Mqg@(0lG63k9Y9%MWBI*id+9ovk?>ZEBjmeoO@0wjm2yn~b>J_dfb01=dBeMjrro22U
-UBtG|Cp2Fwii}Cp#hRahBm*)*%ip%H{m`>ke{$=axjqR#xpYChmPdW<dZUX3dFs!{z`dw#)`_RLaj1-
-*@FSE)CYok<6?{abIgSgCE>pHQi@-PRgIeeH&ho!^S(I|M)X>#-BhR@i<@KOiFE@H8_8?oXwQO)cP&p
-&J|u&i>4CuMB--ci!zPODFQXD@4vheuyVeLofyHfykezFL6gAQK$T&wzm-ZNdCCAZA^GUcM;vJc<OFb
-_Ou>_V+-VGWKDHzhxh0CIEKO8{bRvdW1a$07ECxceJ(=xw`Lg@B41<2tNGZ=q^&vc*J3fQ1pL+@`DI^
-XwKJ3Sws05eglN8&1w9keqGA!XPEU(Xi0%aEM91dwk%-Q{4box4SRlNzOef!IePJaeo`>0TxjVM4lT~
-D_6djXNpl|ehs$}~-JU|4?4;7}I@_25QorS0*ZIcGC30kr>+MF$hW(=A^zwoufd~w%u1oGg>E0`!=0_
-FC1SpUxZBb$36@KYf`zx8Kj*8N1XxCM2S3*zmvJ@UtZXoW$D4j9XBlnt;=J_!?r>>MSE5Gx23+{D9Sk
-K3Za?Z#%WWcs#0`Ic_x%Xw@V3}??F|qM;Hl)@+_r2^MHJ>2+8|xp5+fY7=o9iUuJXx!}V1;U2=Y`e{0
-0`pF%?sJ~I0!-MdPM0$-4z4a4hO|R!spPImJu8Zq4jzI3QT<!1~C^jnio$10sHA*SIW|d=Uf8l)OaM*
-x|s7-H|!msw%Bl?eD1uN831MkPQT*js(tkCWIoZJv_KSmp}{isT}W_4s}^p)(nqg^K-lWpjf|?R==Gr
-G*x5iI6j1bTH7qJgQ=Rle;1on2!DjjV^y$*1EpVT90J{uv|DKBbdB9O%;sOss20xv;K=*Q6SB?MT_o6
-LhK+9Xe<Q3N$5!4_}T<nar+n2TNvhgG6IyrTj$h*r>Rd1x#;Sg5f4Tmtz+g5j;F8VI+Od1hD?GfGAzJ
-47VamJrOBMyx88#m}fFXlnu=neX?&oG8vni#+lr?W@Uo1dvRY@r9SD}ZKMl)hfV&9rV9_J^W-Q6VDH6
-y1fofur_1kFOc}(&e#l66oEZk7_)19l{@~>^|}(@EubH2*D%0TPFB|{8%R)Xv%eR8T#jN;#42~^lM#N
-IZiwdn6I>y@{~=g98g(W%!Cms54Y0=)qdy6ASf!eVbBQbde1yrT9*qN+sA)TiS0Y#6J>v9@osXUso!;
-8oa8zq<<aLy!RmD|^={?@0?f~q*kS=SLzAY4J!sF0c~0Xw7SJRViFy^OSF7Qfn_@1^UWuz?+f1#hZ)-
-a7^tR=z;~<Z>n$9yJE5;SdMm)Ky;Ea^k^|jr$NE053$kfcX%nfI&Tn^eZZ?rvcoM!E*>!>Dm4n|+0le
-mE_IZ7qFG~OAB{}+G(i%JI;1+syIesMaPnfVmZ4<HP!*G+M*^P8_E3zk;<0<ZiOn8^!FW6wvE&oX)tt
-6DHqs-;iCm$E?hl6=1bxLXJ8EMKH?2t7$|a%j?J^gbicY`PWm<f~Idk$b0frZFG~y@R!7CfonkJHmLS
-v1;UB;*oS#uO#Uwf>Y$953&;zcHFFg{647B!HUGC2z_F3Mz4X<ecUZ()34QJZR*F>&XbRu#EHr}>*Ef
-g6$gT>;N{*CB}b{i!q7RO%M9ND0SoyP=w&3$qa}UNgh+v_U$oP??Az_?m$K1ybjAvuX3~B1l`8lgs<5
-Mbh+k-JX5uSP7KJNKN)B0(UzE5>Sz&dZ-#*QczHc<PJn3DcR>@rjP%EO?y`;)6pVh=E^4Sq_B8keqGs
-v;%Ia{<h&0=LfC93W4nn5===(ZM!xj}Pv^-B6sImgX93J8bTG#hGduj1Qybs{JLesq+<>ei&HD{UGUG
-mLRk(M@AE5_kRDq>CNe3CNe76?UY+JLs|jm_z7D<p$_RWdQm>a$MO=oE=ZH7mNU*R&JEi=~YFjM3M@t
-%eLSGBu>QMr_y=)1T0ueg%x54-5brIb60LOLnS6PlkiZo+lq;u>*|;m_dgQw%+FGk@aMQrz|UVqz*B*
-M^Xd6`3hdtuu-$CCi_t0&D$r>Qkb!pN<_yrwk+jvcu=Pfu?-XGJDtgD#vJYr^3DR;Vqh-z0n<VEt=Gc
-xC@C~%?P9-v0cQ9ISP|CNDd<(JPINJ7)=>JCSzrTdo&8f_Bf+c)KzmeFBeg!oA^HE~IiFQ++aO>!clo
-9)CM(hkQFoK5*0JK3_zI|jYx&PA0^&P5EM()#r+^69|gdCmV8)=H*^XMf6Z@6gZ(JGqiasQ{97C*=6$
-Nso1w0^-MEeoMf@og5fbZTJ^Q*sx&^5}#LI_I*RakJS5IHsg&oAb5JypOI=XFfW2rRn&OE`vfVjtf&v
-?!!&b3j2N1N*}!;-SE>Z_R*{L?-8*OWS7e!5KY*8;e~7~osNSr5N0hBWqNJBL6PllYvFwh?~~GT*Bj*
-QmhH?}NXo-*T<k&wt0&3PR#=6Dro~E*nu|iR-0P4djtpP}4OaA$8C}Sxk{UMg!I3qJ=d@DO2i#{0vvA
-7=9L@bS#rpumn?R(i#={recvnd?G`4XDwS9`yLe)=_fb{-Pbb44}LvMKKnjihg^xl#5=qG9I%ZsgpQI
-nKQyFOu=f1k>%23pP`t!!DL)D5`a6k5}ukin=~2wi~wmDbtClJ@fALUW`i(dHQujzlVh)>?5=rIbUC4
-)q}al|LF$Y8<4_uGICbKha~QNpziFQ~4(;MELY?nx<Y)jvk{*mBSTnv?v}2B6xHH>QS|j9Y|q19sfyE
-u%MIKCvObKkF2QpC7q%_TLifTr95X2lJn}Ec|@?hKDgLgNjk)zwBKZFKAR~vGT-VAT9u=@X@qObB0_k
-n$=H19EYGoJie4hLFVC5cz#ayCV;fHdx1Iw*%{u7pOldX)y#hfeGtk^5D1cdXuq!fyT)2v^gl>6Bx;8
-&e%j;sYkI=f+g4;JV)Gf6A5I$X14&i6(F)rOyH4rXOvkr32LMz%6p=PttifS&%L7C02Ov%>FTUASQ!F
-f{Gk1lu}N*!>p0oMsZKE|<Kp?1^4$wKQNAh0l7w6|H7E`~9V|D0)a1C_3>P5I%)CUg(XlA~rw>a=945
-{$q4L(SuWHhU=Z!qhHqwUntFmf#CUhr;NP^g(E9rI_2?q-BcFc3QGYdV7`Dwmi+I&UV%HOKB|OQJ5!9
-_Y7T9#(d9Mv=!i&LW4>@4&lBEKsz;$r0acmV<*k3t=$BTCmlteew+a4q!8*sh6p2w#<pA9vs$~irY()
-{WYVHrIM}TUppWmE0F^i9+#(#zayLKg1>KPoY5N4>;LE}h1%sh(DVrYp81V^DPOCpz?CO%NmJ_O*2!r
-L<LYHPQZCib<O-`7%WwcKqLfh(`*-PbwMM{RQSXy*K9Y1v9;h<?19(AMv=8xb2b-Adn{}{z}xmuI@L7
-pBxJcZuC5ovzXeV&=K<f_xSc?DuLnyG%$gLW&=Y2Z#mh_Fqtfw-){$z{%NR|iPrmIxH2ET34cb^=ahH
-OT)nQm|bp7~?~{d=}8+T_m8h+2XhcB}?uw%MmloeEa~zoB=sH;)-sXj)#`y(oE3OB34KZX2$QwWfhR9
-6?1zWW&=yiVNc>)v1Bd7lA0uz%xRFD5}D#3gV}2u6boWX0x<<Y&cerRlHOUKc15OoC1Osx4jf{rGlB!
-0&eS=F9-pBX0_{&C&}2lQNkG$Lj&(2%5h%y3W;75^2ZKogmKOg7YQe01LEAc4C#-P){b7o8KKmi=3de
-)EY$kpvgz%`XeCKH{e%lDMzM&KqbOd_QcJea7vTcYFVAstb>g@W?5680WgNUgoxALxOj8{*lwFcOt(J
-DXeg;pOY9l)lOEc%S@SWMD|Bjv?bQ1!)5-8<dmm=bZrYC7I1W~evGOw~ixw7kafu*Bgmwwgpk&aS4vI
-Ggk=RWGAQdsB74+{?;Ax6Y)&$8H#WuKf^AJ#~CF-BmNzmx4Kc?nu>3XZ9NM3voL}7yVpV^wG8D`|Nn{
-1iAvC^b=ZNeE_4@sa7(MIT2)>#&JH@Ox`%>WLIM;&-m}K{ZTuEeGXtZ<xne@G_zLW$(QOMgA>;zcks#
-TLObrEhK`Fr09CrYkZ+Ah6I;%qpx&4xmu<~PMbj4F?gROqoR!a68?PODSN_l<+KZ00rOPps95+dWq$}
-FXTcY@K!0ToCBTF=H7Sql=2?b~BaGxO@R8ZdmPit}+U+xQgo-rIygYIC#Iv*{|Mja4HHY)Lm4g#?7@P
-oL1?PadqYz226-E_SivB{O^wT75m<1&>>3w+GrGCSRuL%`Wqc?~IH?&cA9*n7UElNlD@ZhWoU-%wihi
-O`zEsGGW?LaPNo^BKtwTRM&)Bpx?^f18=SU&@fM>FyUFgBP}tK4Le_jw@vwrWJ(SSdMgH0M{CAl5e+g
-&9~2JmTz}*di&s6kO_^u29{fBlI3-1l<QdIaXDtytJwA*Y8qi*PAznDdn39SFk9_yC~^5o)o^<TNFQR
-=V3e1#V90v(J)kl&1c*;!KnZ~Tmiam{U}jJ}Jj3l=TZNTvorWvyDVHLl6_o?6f|orB>oUzV>^i^ge&<
-PY28&?BhQ0$Dh?P)xTJs8PvwBZwg|!7l3tMn-jhY!=%8ZzD<ZG{ClS#;$CN2qS;v#>lZBC{|DT`n^kg
-ycDnt^M96+ZcYXp=Y(+M{M7SS$^xYN>qQBJ2vFHp1py%X<|qD>^?xJ#8>0E&FKhN?lF`N$9fo#&8q0$
-`5f!7+BL=$(G`gKICR-3`Rqjm!`jmiwb0z!h}D=LsaJ}VLUcaaKUixb_BQ&fs=9Xjp1YmPwBknUr&wY
-WV<irWDgi%VhW62cIyAa$*SpZyx+#B21my5smY@y&ph?5d`dZ$<Wqg#6rZX#jtG#h<_|5-lg($%lKTn
-N+{IE*9{glcQ6i*mpXc}b^vyFb%`el>PsAhv^0h|p73AIvctjwbsnV}#^^g%ocO`8d>9|C_0o4S3Mrz
-e-d~}<>=`OMp6*GoF%|_89*T;_HdTIA6G$Wj-of5(M!a2wd6yO|eJDJ+tJ{2_4xxM<1;6;9YGB?JrZ-
-KauaLg~y2i<6U3sq3(@g+*laMJURRN4olvUp8t4KI!J(wnhmND9+67~e^yO}vx~g1sns=`}`@WXbTHf
-?6qx*cEE4QzKIEs88U}StT9GDHxBq(Zriz8bk~6oT3;0ie3pO`pfs(hNOv|Xc&83!AHNl!cfAzdl*uV
-n52xsW)vw*Ac~HdrKyANa!?|IW@=x7;yp=F3+AbH#n4PRgk~78et*HJq(KrenwpPRR~ZV=ML1vE30TG
-fJ=^_Meb=B3wspctpc04w!n<Qg;OTdD-2U~uV@aU(QWDr@fZdY<qq*<?-$>x$s!K=!kpC~n){8388KV
-_{1IqvE-6YC?S@n;HV#Mj7jZOyLm=<?xT1$g{NWVKlNmD>?uCR`A&?a2V0_L-IrM%T)kqU`Bx2(YS%S
-mEh+2#1kDVvF}^fJ!<FrLGRy@w^C2`8}7=Qh0Nosp!Mo&2G`_baqshs)54+ei&hqW)5c2tuSi{4APbU
-9rY5TB7VLy2+{^u*Usb;^jlfrF3T`{x$acoK3RJxAQ2`$NN}>Nk1S=s_fNd-R;VX+exKWKFbRsl(B+^
-wPgEk^7>MqlcV;QvsnJNzY~sZUtb1dYedS3RjfzqQMZ>pm<;0vp8BJ*pC`jOzv{ZOUnawNd{A9c7EXr
-ImY^;wdmtG`jYGY<>=(&!JBFv19WWc=Fotu=p22WBgi(IhHm?uz+VNUt`+DFk(7}}$Sa<tcW;LlZHoi
-*BPT=Vk8y%XCTedG58+b<&Z@Iblw1ov*K(-OD281qLI8(}Sc84@!ca)qJ4o19m_pSN~Y*R&r`X+#;SG
-1>rB=j}gp_f^~Sn?y&@l;R=o<D&K@o+ApIO>NB%S6*MA3X&CwP7*M#Ik=Dv@Y}0AF}%hYHO9Uezf~(;
-wyRy)vD7+pM(s}i^^)lYfR$IpsAYPh-Z~*72Mpr(O2!I<8Mvwjw}OF!E&Z~5hrzNtN<G708*NbpPc+1
-E@pcbnrUJhUG3WXbsbs>R!Hj^6n?VxurIl%v-~f~lgleX^{sYBd`dd`iqzO+sQBQCHZcQ<+rwLx2_P9
-YFPbT#k<K&x^h{xQqymk!3$=8R@c8z$HZ$;0d;4_ZV28JYdUOl0I6+It<LF{0AYgl%=CQY#Dxd<WuJx
-pN9XsXsMDzIq(bjxEL;80p$=bO@<B-Ckn?h?Gnt?MXS{G(WX%*_373#+<p-1PT95m3QH_)M(oF|u}Lw
-v>J=0&%OXR)<cptWWOJ6~!KSAgO^Q?inNH5>i)pc~K$=)<u%=z`;KVwIb3TLK;GmcGQkzzm8ttc^T0;
-g*FN;<C_5u}nA;@dEHHdV7`L$?Wzt=$_s=Eq%17YBnu1KrD~|Nj3J0xDR*|WKZujb2ws{!4c142Zs1{
-YY`Thqh=a&TGM&b=P#XR;P#ZM$&EZd6F2hOrrEPlGCF|{;E3`{2?zM#>JZbRZwvAziy{q^nqgEotE<C
-J12mJ}gOmWADnm2xrkhcFJ*#b6LK4wW&0(wHiZ)*FrHv-$7~nc1&NZ@IM*Kc3p!-6yfXcmnBk18kN06
-bZ7Tt(Brs+N{uMZcR6V5@``%Jaj(opIY9iTfmlom?~<K6EkWxeRQ=<^kI_>Lvq-fEu@lyL1G6vI2k1z
-!3wN(y-Bv{Ss&2dYoPt4RX@rM-hU$)GpD)(9>H(r~qwcM9tS?94E}Q~UkKAr{<+mG4Y2M633{xZ)G{b
-I;*@fUsC*hdRWJp`N{X^hv$bhyB*_2AK2Guv1ECdHq;kzwQfx@6+s!mvd-&l+`=n^z=LXT|-j(kz1i;
-)e$-)*-2;ixMds%`cYQD!kn0g-d0Mm7G~y_XKzDI%UBcq&Oy}U3L>~WTpQA)@08jcFwL81z<?&uGkqs
-T<Ch+Z!%q594tZG@P*a64sTWIX`WQ<>Hu8TitK*WgjFLXOS!ZTY(7aNQUHm_m7EOuH0hAm5d<>SvlS&
-;PI*{JRd8-=^TI!XiURN0kZB47m5EGzEr|uU$$&(Zya_#Fhq%jLfW3raJZO+99CVrhf2Z4tr8jg%PEU
-`@8bE$Vm>oHyMn*5iPyd|HW5A-(ZaWwl#zfyOqt!_lAOT;{{>h7gIVun)pR;NdEsF^X(TgWEc>a?)ul
-$U<GTt5&JdOr=Xl>`Mk<Z(#jhdd6>ozCGc8K*>RbCuRiJPx_nQq=J*WRCm^9?jy?N^wr5SU~UTL1V9+
-qtVqpNzFg;25SEC_n8@KK%D|@1HO#Ka!~AP-Id&}T9ldr;>is<(5dsg@VgRz)8OZjsax7tS~I}7-D!1
-t%ySyetZE*7pjlS6!v{NPWKrrszH$5s3g%`VeHJbA{ugmUaYc7H#W}!J3V}i{D?<amxVj84(v+@>c_=
-GoHGJSji|Q@#!75l%#@PUHei;WN0$GoWbLj(bBzxHSMzV(!Sq~Y7#yt9|)^zw_{$d_S%+rs?h)_(NNV
-0o@(F`4%Rh8e`y*1r9qV>329N$ufcQaaBss`|Ikz94!`UGw#h?b0|{>KZ%3_YD!vmSSd>3YCH$Ccx8E
-lo*tbx4=fuU}_ksWP3Ocpb$^yorat2A_nB->$P~QZ~%ahiFoNjIFbpM8lp}ffJnuW`qO+{Hhm9+XyTb
-JuV`%x?EjS5lop$oZWKg09vD1cE|;J|1slt$@Sl+e2yfIpY^Y!FPxLL4A^5Fv@0mGH>q<=<^O9Lcz4d
-E*V#ooy@pOODE*H1zJ~oq7Z>$WU16`%QVM&O#v}CgbRUQjB#rdQy)#CS^y8*aZ95=$x2bKp+4>LZkQ^
->I7d96(w^dzezVkw5Ta_m57>qUxt&f}WM6SauZVZ~Mq5Qf12CH(NmnPAAXj97qltD!=B+{=mEv_-^;t
-38d?I$qyv%fL@7y3TAL2f!RS(-p%53j<M4=Z&2v_m|~HaxDUFMq*cA!h%eM}zw3K>aTwi9U-eXQ;^ms
-;uYKte9lWsB);F**O3SXT@AmvAhhCOPmXGJ-lX?;W0NBGV38L$7FshCr$74jF{AXSlJKb8ApZ%nGk1I
-t?=Xw;uTt-!du2PXonj#SRwR?ZmwpGVOF#Z>00**EMr{a9#>Qd-D_B_V#3ZJ;d#k~d2^1Oux>7r6E-2
-V7SBc=@r*dNN}+W+1S*BlG81m^_Gu#^@SEe~(VNKZ_rp+pQONAVSx3cJ{Vd}BLSx6=)giRr52GBkggt
-#Yj%|I$s0po`nUU8l1_3XG5MHm^($x3Gb1!nz8tipkzh;m%@HMudXcl(<06no1R^exU{c1_9?4D%pLM
-y7+dJAsTBWE3jnnEb~$J3d#(l;A#!YCVohcp@Bdi#+Eu6e~^A&QiU*F(q3u#?ghf6$CDe^0gfC`c@9_
-!qHSI`tIwUtn0U<w46@(oq!ihRe%XZ<ox|?WedE`ZLICNw_}P@gA@Wz-v6oOYC7rS%Be)*QUaD{<^A>
-<_~ui^WO%6drOXJ+!6UOz4@aZnJ+gtUEtby>2k)+r(iCGO=Z+`S)2KSi#W-4#!0rO$TrDKf)->YfI73
-0!>~()@{m;lM@j9O%z0VUzO^3U4A;};fM&JvJ$SL;_2l(2y<i+fvF3o#7q2;|Y0M#uW_N@75X=p<;et
-NUZP;P(o`Zbjwlir0-PN7s^2OcEf?W%|A9RQ&-nb8~v}vjc1eZH|$B6D0=@wsBnuf=EyC4pdPI_CyxK
-yQgtW!4uz8M3V8CH}7-ORlk>Mw2T6X%pR_39&wXRp~r82uUTF)d3O0@!6xV-Mlc%eApSHXt@SBh`M~F
-=@qP#Gn|3PD+#MlU*sB{tEbH8xHIMG4neRKLAlRH(b?E5532ZTFF~;Icagx2f`t%OHM3q%$5`1+roqF
-A{^>h&7@yAl#bC^7@fwVBXZ2FRXN1+hR~pRV}q+->`)h=xG5a6c<H~D<6-E2J)G{P_m?vQ!tE)R4f2b
-bnA3(iyM#mVzq2UX3|h@P5mb+a{QZp=M*S?xmV?;F`J{VM&4ZpYZ(U}ryNpI-sh+Nn89i0+0Cfk{r;m
-!hgdXKw(xV>eQIBxQ^bb9XvK~RZj$^xe#17W3qeW45LXaEva*~-{(~;Wq#~Z+Oe^pc=c`PFjipSe4vm
-0DyiHCyaqh|FJh!hTG7Dd@rsMS7y4Kn`#A7FR)(s|V!SC{nRy!8Cob?j(c<*>7hn)b8vV-Dh-vx;~NS
-J7OyufqSs@i9CUS6=9-@dif%j=-g7;qcy3tM0oBP;>As9G-&H#2e&oh4VBq%_SDj+k91c{$^r-T3KFb
-$768Yo`z-QGW{G}`O`eTi8DUx*{&5f+wev;4#GJj>j?|D+-t=)NDi{nPFC4VSMrjLb*-a%<#Ue?f>x7
-dd=RYb7G7CuRqnRetn{v_t*c#o)XHf+9rTZ{FfVdGIFUXBpS6QF5WzXKI4)=k0NJ^N7TVXrxF~!*^+(
-_Y`ac+NKl&R1zavdNiIQWMPS?n0-jxvUdlXvHa+d8ZO-=4BP4N5VPX+lC!8Nk3Ub4l1w1ne^V(cog+-
-Te^e`Jx*@{M!P?9&P#>Ip)dV}HU#Ic{yVgA{G)(h5U;KY)2H4EI9vgYaID?*WJ_fRA$c%{tbe)|TF0V
-QO1uYOgRuv2DxDa;HU(vBF<X6&}866qZ4m<W8g`g!*j?>Ombw?nD^e*n-ryv1P>I^$h%;g5P8C`wjed
-!*3V-TCor1_xCB~5A?yC!kfbTG`vs4yC2^D@E(Bo0K60MPQZH@-os%l+Qv9bza^0z4GlX@;Wq$3{%+J
-h`E~W(9S>p)$A0U*H)5cT7mWxEM-nzHUOOD#Ryu6VLE-2eWM4S5Zy4&`umS5GdKX4|>IT-|<eZ$<=cE
-YdWaHgzP7wIPX83*#ey_r>y}~l<Slcp-{5c!FFWBh)aZJ(JHUnmKu097yHVbWIARin92SB59_PIs=0-
-G${hqjiB%PxS|9QYN(Zvp(=@T-KM7k+naU~@AS#(FBe^WmKj?_7B2!rK9F2fXd@w!@o;HxF+sysa0{j
-Xp-(;Moel-SB&S!<f0Lut2NF%moWyJP%{zE}Fa14P|k>O!<}t@4biqQ(k)SAAn5jQX4rXcwP$c`SNRT
-lb@jwiKZnl1`dx6JTo>B84ZN%y)h4ue6i)Hi3rfXm_aN?n*7sYH0dq1Cc_;Lt%{eRfVTkNhDAc`s5=`
-r1Fxw=F&>-tJUb)u|53Am@8hNDV>Y~Y;#R2hq#tyGAD68G4O0w|o!B&pSXY`aeUI!stcNax&;&2d`90
-v(LCi%@EMZ4Sc0O|vz~6tD0$9NSw1ezu&tFF4U;Z6C5W6#?XDo+|ZnE<w2wgRT4W&;20NIJ6#*4@@K|
-H0uVo^OtsErkd`DxSd*g{EmVn@rma9F04{u<katy#SY6vTs=L|3y~!`oAXxI-VraU>lYkp+zaOu7bvO
-6!Nk@no5GG&&!n<ro{&n2%;)@S-_JdB>%r=6oM1b`6Ph{K^6vL^n@78RDa#<NXhdxLQeQ8DU4h(tUIj
-?%$BuI<~dMjuk(S0_ENpLBRX43%5r0Fn8ICjp9ss`vy*&N?*q4jT_i;xdQr6PqE{2^x%tV&9T$jFC~u
-+mY_eb+_}L=YuP=mV-Dyrlf@B$p5B4ErM`}<9s?!@RZy#VnM|`qd!=Y`Mmi4To&Ft%$FrxE$LBaJGt|
-MN-_I6kyqbTi-%IzukNZ3z%8;nC-KuQomF@QEhmNdhc)R1tC!c&456QuT3BX0Kzla&zb4_gy_pQ=Uc;
-_^<=yEKMhqx8eQ1Y-&%jv1Mi;j-?!y$^BqS|Jwmd8ci95d12mi{m^{kOHUTl(FuSmQu@=yL$=3}Hk;Y
-eXy#Kk@}c2nV}_gBDlUmWf4Cw>P{y8`FaYtLWd~V{3Z*QWHp!tr6*M5XUy--!4Gs#?4kQ)QzBCb~Wnf
-OOb4<As%93X8oyTKV+(=dzPSdQf>eYj|B*@`{EF28v`oDaogp=YS6_Yr+InWG)Ma`8y2gM!|m2Qj4Hq
-=D5z~$8V;D6-u4^zfqi{ZU8N6WEYt_Z{5u}n>7L8J$wT-Ix8`87r6>Ho0{Q%;Et$>BbEY}MD+|<Y`P`
-%}b_^DTSN67n*5Ao-i(PLtb|x?Q7~IFshS&pLh@0sz00wzF(N3Y`=CY0AG<gT$=4E6{z(C7ap3u>9#t
-Vp++4TNs^8DnMfFkv|N|-<R^*|VtePfPNj_5}zee?;;zXySoWdXvVA)D{wgRsn4c0ZsmRIoZS#)|2vh
-M7UV<Hlo}rcBGn+t5cwr0Fpmelput9uK&)pl(?77;1pJP#(D;jUNkQ1rYV5JTfee$9p2&*3m@uCCr<S
-8v(a(yg)if?dt^>T@zzxTiA5He$r`BY2sZYQV!{$e`42($MJF|=oly*hus(OLSx)bL*s6wxD4%dji0t
-?^a7r75>bBC;_N%XE`f@9wLE)N_h<3pHBlZ4xW|YBqrQuWqL9$SOQ-t0)PcSN$Csd|#80itCVOcO6?P
-)cG&g+?MZO7NVd;zZoYrok6%c?E4psoAbjP3IE-I$`uXuW_4~n_FyI7HW!~gBo=SD4pl^Td_u5fUXa4
-@36koC4VFN8$C+%*kKGc9u^Hh+eHWTMlI+ju=Nahj)B?&RgBUMrN)7$-4kTWl#hU2yaVc$7L#S!xe2b
-%d32DCm0)<k|+M81<Zp`DW=$a)zD3j6Va|(7fC-&FXeVHxFX*+ci!I6~my1mrj2cSCnR+ci$wPh2@cs
-gDg<0Qq8LtWfO1kES**T6j_z}pQR-@&q8SR2=h}*9g_O{e=tJG4NxS6k!K;bs#l{6I&gNCrc)Ge%pvs
-wm~(m$UgP88T}!P(s~@MLz>LnwpCVnH2%QvKD<JY&yn_lzf}B6IPoBm8E&_e#g3hgb(VRZaRM1oG47f
-oh<48rIOs5ksZTT&3AFK;hld}EnxaVNSMzaw546+T{kUC952t*`2P@Z)pNrFqQd*?v^$WngqJodKlEy
-jz@BCtfr30sq+fh=F@Xi)5)sSxc}DN89sBxuTRU!Fg;t*!VxNRMh<Pe6)j0)~~39Hy;p!7!$MqA{vXH
-G2Z1=2XMG_F==PVO+KL&P5ATF*G*xJd(3I8+T6%TF&das_8E<7cDuQ@?f;eclM$cgdT*r)K>NQ;05Z#
-l{IENk=hhas?j_irugbmN}Ye`kl~DY(cRUKD7)svOifs&acYz4%TacLb78wljv~IV&?BTT*u^a2#|p>
-1i0M!4Zss1jUvnOnqt++b)y$ME9)_IPwf2dHKwcUsf=FeWXjWefFV?V@qG(5W@kr|HLh5VS_%gUn;V8
-Gkzit9pLp*k$A7+JqbwqbVmCNR%SwrzqsVT7k1Ww6s*sdfZp#xRyGIlonu@h`6kae(w7VP*nh>U^Vn6
-MWM(cZyuGYc<Bh1aw2!en@Fc^3P#ERMi(y+n+2L);#GkSeMllXgYLWu@5&E8ghE!_xRk5_rElNK*4cC
-&f9~7;#d#>eR}h9k}_*pvkMfiRb(VJqeSP(Ng8WKWC*n_h4IG9xBddC&|T`T94v6jd}MhG*SdTg~vSy
-Ow>wPe=yF$OfG$BR>VY<#8L!5{BQczR!Lu^(IYi^^bZG;#=YtT`W6ldgLv!^JyP(`hrCDLZjf)_#5DP
-+`BrHFdi811F|^ny)=c1GXt=T5Dt(TBszEvm8ED;sQ8(59(p8-rylOkwr=RaRE;&kT*!dnNdE!30-k1
-q=W~wor&oE2ldys>*!>sm<X_Z-hiyW2DYf?V>3awVym>i=q-+{)cGs%}lUkQioX$=aG`_p)e@>bDui=
-?9SBc9+vWhQhlI~9xtIY^Z~=xtESZys3_$8`=Wp}%}4)suKoGw%Lme>1@-RQkHe!yijj)_u$1u6icfp
-TVb7gNuheB^wUy2juOd9{iIFc-5ue%G6N4g+n=hv;pe#qsLFTPM6P`x7+2j7AbcR-V|Hc!Cp$X9-x1H
-I>i^7o;LWx;9|QQCh=Y#s9w9tx;2Z8Ycp#mT;%M+k;qCf6=TL(F3FOS)}f^t2NMUE+TA|VPtX@Z%$9!
-&oChQZyD3dwB!7qfrGo9nFevSuR%Iuz(B0_j>EY!?nv^5oc%>weSN7jXw`=U~Z*Iq5@PY^%@eC{J$zy
-pfr<=`}+)HQI|I`C0BxuPEho2gAr(7TVLne>2XFq#(u_tBESK0G1_QV_Js2LOu+Wkii{|3S!*%i@0{V
-_E@b@18z!eK~3y)%T%7Ro~C67>Bnc7n<+t@F_Yh+wsU!oyIwaXke+YA2E|`NJ8cKRRNIewb#lA7Ez~&
-E)05#f3Yhe?_=S2$!3**Rzw3VFT*upu4bH2;GAiIOuv`XuS)*+9xOn*j0K5*j0K5o@dWT;o0`k7w~L7
-F0}qJljD{ukKna=r3_furQj97OL`Zs*&+x>jtU2x3*Lox_6m#%gt3sjBN@WMR^AQqK|V^Y>y!{iyE=u
-|FHmhruXRO*pA|qkT4CsepP{#f9L52KQQI|UM7zd}aer!z<DX{Wmeo<27KoKHwTSbJI>o}uN--A#LZ}
-;3GY%kl{0Mx?Vf?hl|CstV#eWOmE$kch<oG|QlFV@e-_7T)l;+7Xt3LT;$FTAOwggC6*)Uq-5W870{y
-m5xtfhBHGKC{Ahs*gMz2)&65qKZ=i;Fvra<90!Txyh?%gSX#5a(Hm^pX-W9RE9yrQ9UeG@lEI<;~|di
-22Ruwg{oW@W~FLTY0<_!CV`piA#-0;Q9I-#-HSq9dN||J@s7>|0R64TNYj~O>h3GX}**X%AAq6IhFUv
-0JG4^Ag<FP_8|mb0&752A;fy2)r0RJ2(4xK{;|+nf^SJ^y$au3h1S{lUL&+l!xrpA+<+I(Ef)?U@p*-
-VN4@l_Jmw$K9ztZS6=#w#l4O{nA^lg7NZTz2YPQ1q`w)teV<GNEG55K29aj?Tg$E9y2GCk##x2Hb;Q@
-4{5SPnzvFHHgK?LF}D}~VGAd@s7Er>BpWbPV_7~<8CZ-}8`F|=9;;h)1CGv*I)W0R%K(Imp=RX(dpHu
-jeh00VSD2Oa?!#Ra_EQfNJI#Xry>W$l@dep2khOTwNphWzY?*={RdTnpnj6{IL=_l}~d(E2p)-9r1(r
-Gl_hzo8<rSU9w7SXZWvzdRKVA@zIdrzOT!<>HJOqd%syO=w>>+!oUB#ynv}>KXO6#qY)H(o<Ls*%y*Z
-E37Rgdfhkz!i$^|MrbkjVf^b$W4baQyP{8hd=CCC#Nt%9^$WFY<7hmQ6B~sGt~cZS&1Ca;r?3nEFru8
-eOSu1OwrTtWajTs8k$9z?_^}ZB7}5q={muGV=sZr`U`z{?q24ZsFvUvPi)<XGo5$%^k(<$|z;YLe_68
-C{bix&s*FTlC(E*AtvZaQb746o?DHEkZ7BLh>5)xY9LrcO4S(YIF;dqAml3X%l1zec@B`<clwekqN>@
-@UicsAK%i~*nlP7O-qn$O)O-JwUZS@M^%@9k+ipJ-u);r`L~GID^$bk>>hR-`xH1*&2AT&sj0)#uA$T
-&sEjYa%DqOub;tPSSO`Q;zXUs2P)&4J)Bmq%oaNwF5{cKwuiHM#lk&{WSx@9MxW}#Qin9lc<NhfPIx;
-n%eRyGG1|-(Q7H!D6U#7S#H4A);7O@?Yv9M$D8Fw0V+oUTvtisj0rWdWeWRI9e;`ShP5Y*3%7cuOg9O
-wA}|Obkk+-RpyEn##FU(b7+c`+5R`#5`Xu6CS_S3>@a+u1y0SBb_stf!h5o{F;nIZaSA5(En`j3zhRa
-46=?z8;#C&}~2BRPg2`?@iR;@^W533Vk95K@JFf5wKM}ek<j_<f^n>7^KG;ZjGe4HEl>uC23a(WQje2
-$!u%udZ1y(DrlOqeV)o;;-gg^7!>f^=lXq_oRfqr=h}eTmT+a|%Uvq+zmn6=5BJc$L>*P0jd6!lK2>B
-RXP`bMo2J?P(S^rfoSZ)EB~@Gew;hM#B(gL%JZrNc|4xZT@<5X|cFQW7JRBv(r@UR^2x>$O}L_1vwPt
-+OLWj1|CbOa~SI@zJ&Fu={Ge4w9U<AU>#doRq_i+hcM>2U8$2B4r2*S1)f34(5LGvbuyX=jZl$lN9*7
-?Jyf7iBJ&($t9B79xX6$?e$7g>OS4Hroi=uL*<Wxg&Hox(fFVt^hO`|YXa_JCc>yIq@(2TFl>m=rE7I
-hzlYE7*trf4<Kdn&s3s{djNiP~C*y3C1a|0I_{;~W5<C6LWiBc%C{T^~aABqPru)oTvh4I51ObdGkpv
-pE3$em`IU2Jf6>H1O@D_*S~XuGtfEDvkuCRR0;#nskIzg1_+?8aqHovdd7`tD_YW6&P<7b5hga@(#mI
-wj6EI`t2u_R*P3MooSJ84>978k0TgM<CP7`&e8pVat2FrH#n|t$4L9BNpdidry2l8-FG}fTqAc(uGiX
-;2TA3opq;_RR4phq=s+e?%Ltz);GDiU%~Gy_$}J*=5B`HgYY}L!>!+;v2rC^2tY|tJPFXK{65ed=wI*
-@<r`Y9D<+MjZ~r!Vkc7m@JL=8Mhhump^Ezfn$k-pFl_n$)?1~v)+J$x~^^I>oI|h~2Kzo_>jQ_~Z(Fo
-)~|3m!CX}#>?{}E{_{o!x*<1wp7+t5MYjPGH4U|V^Y%{WHmG2pID!O_?D!4w^14lm(_Oj#iP#xWWY?w
-4O{l|M9zonE?X@+HS;re1Wp%saZ<h2lA-)by&8n4!w3p=Y1&B*~h5@d2Atq^6f%2aREWapnHWDbJe2e
-eg{?t{SVR857`l0>01x8!j~q*s~a(rA-cYqUHB#c<x1-LD%lXYd7fPeJRDO?=k(R29lOMxHM87o~j=l
-vgm)&p?&#+LUVV|S>=&JD6=hmBRreWnnhdlS(Ee~Qso#rhKB>D(F>31<M`2Isp3QM8J`Aa50)>m7Kj4
-=wII9(?+9D(96q`z-MIYyVO;qwgXQVgW}$T#nm4chJ>aE#gR{G|5|+6Fs8!e<^%9FVKb?H3<>g25YA8
-H&dOJY7z7*{XSkr`7FYbus<w81ngbfMH?2IU(c{nH@hp=;&4Y{)WZ@7YCCJ>ZEcj2B<7CBJJfSb=|qM
-L7M>fg}W%Mz2f0;kPu_s(yt8EC8eTE2Y&hbPYmyy`8&k*JsUWa#G;ZXjW-v*;B|mBSfvySjv(`<SC(I
-8^>OT=wbej8UJsUw{m^RAUWMrvy#aI*^wZkAcBkCh(w1&=#&5SQ#{h!w9nyxD9s8$gSn|M)dngLA$_f
-DL@*<-g<r5MiRnK5e|k<zp4vIJQF2UmYIYRTP#r}gt$|B05b}^22qZD0s9Y&Jvtz!%0ze3(Ly^t1KAf
-9{NF4iLYjnK`yrr(uzZb`9>=Zgg(lIu&@5dp9CA9l<q;U^DEe8k#+a1@*gqwVH5-7dG!{p<UI~NT;9`
-R$gl@umSfOU4o#NbJ_8PCk(&;T10Z(P^SistWtpRpb%IXvDJ9`1OOT76ar+tDB)3#cePjZxUVL|*0Gy
-d@<M9l?=ntLGF`~u<($nJX4k0aGGOe?Jd+`536{EBn1h#^8aR0&U4m1ENt?Gu(RRvy7gYd)7LW$Eqc<
-g(orZ4P%u%ZN6C;~M`$`t>YD{W#up^f_cP-#m>=u{s84Voi5-3cFkw*HOe6f(vgZ*nkT3>{QduLg@c#
-?@IuptiHZ4o8pq7S)o~uic8@#tTW6EFbJrSD2jsSf+&NcY{HCUsbD~gqo)5hElo=;TmEH>TB!+Y?xm)
-cskx;&h$ST{C3(N|yU+6s1A<xq-uM09@9Tjx_da($=iGDGbDw)ZtBdpi%pTT)AB4MvIYbuOjs@}&9-H
-oVIpy-XgnuF7-`;5h@Sl9wsMHcKt8jMN<+K4wNWZBio-VuQY=!kEDEsiwQkLd)D`m+}^(gBP${rCRrM
-lizA;}`fK6sT0b0F(inJm5aSt0D3+BgZRcljKowUUTxl$>?cpyibMUrR`sH2f}__bsffpbEKgA(Hhe6
-H~c3Ygt@^eC&p(na8lY^t@b)1noq|uDFFofr#7?1I#U5HXxw>RQ~=7`RZ~>w8>?(RS@bU6RlO)(E{U<
-Fv0~faq0`-fDk-DYfttbiKm5YBZUx)xOLMn6nzM@q!(@#Va&ZIyNwMNRnXGb=Cab>iM3dX(<&;$<m&0
-M5*@d%LJJymBaKW1js@EG;;SWZ+m4qIzXRg$e@XhRdJiFB6^QtVN-;{(7LT><nJbiJo|Af@oB!q|hi_
-z`dP)BN`=#4{CO%0H7Hbb?t6Xts-^g0pH1?TzX0^j-;#XJLQ@*jH(a*%kzodLKyR}X2orU7k6>-|3Z6
-G!WT4UWy!m;h+uEOY+?z_XqQBD=D>BV(ncw6!!CrqrY;qHaWuB^n#@v@_v77tsh9U1KIbQtEeu{~0Y=
-a0*Y1E+4?!A#UU5%tC~bwBX3AGFyL3$ckF#X(}yJQ;em&B|(Q?*!Y(E#i}+o9505wpg+|o@o_A@3m)I
-RXAIB%r|;_=Np_oifjz2b=V?*k3<Q1Iwa&;FQKZ<4JYK}QM6JdbYydFLc2HDCbW5T-Gtt}C829Z*8=k
-xu}`{cvKtOcjkDRhD9b-h#T}9rWBh4cRXJPD2f608vC`-$q-vhKwUvC-Rx4s*NL50d?ceVxN3!kdub)
-*p^H3_z%T*QjbG?~&m$eo27bQ-GO`I$4!UdER;XZG%|4A8$e_jO1m%gvt<3xiXw*gQiKT~EctKFG^BE
-ex?=6iz2c$z)64`OqHyMBjRQm*)y;!7ZT+jPNtv28kdL|e;)QlKUt8(UE*$IS;gjCjA;0==<GoDF-Z#
-PJ-nuw`K$zECLq)oFHDYF=lm{J#hu<L>e7_MybDAqkV4@oZP=grVY63Jq0`r(Q(KQEA6IneVq2;Ds{t
-C`uKl#)_R1<+!KQw*Cd>7$iqzP@nZeHzaZ@#TiGG^kk>Hxp@@p(CB?E-$h(I`u<WHeb)*zxq}na-od_
-|D0gdYrL_cSIN{>Yu2_x2W^Vgl?!7zgDY}c}WpUqM?RmQi*xuZt)Y8K`P~76t(*KL=KUt4qM>Cm~)*a
-VV$bFA>7fhGK75&LRnp|*9423yde)z=UONWoO*lVe}e$`q@q1sZ2NN>;U-@6>nX{D!d)7^7C^b~elvq
-3)OasM#yw*Du`=1#Vj*N<O6R(PCQ_gRlvzd=4@w|h#nvTH`6W6E=9=Jw)Ts6OJ*>5s$}sQNOCTVX3`s
-GE%WL)B7*qFM?hiSgJ3-4b<Mw&$QmigI@@4CNy&9#AiNP7WjY+2Rxj=$8&Pq+iN&t*2jVE9;k__?y*o
-;ldBFn_|OJ{H{2U-{QB#Z?*V6CVs2L?@95yUi==y4HB>Xn|{)k3jNXzS-<q?Qu{pQ_vbPBExjR6ez)A
-H)i3?f99P)tZ<-H!Y`U*xgH7OYS^Vx4zw7Y(>>2t^)qmwtw5B;m^CMk;E!n#221d(>;jti3(*C3tRzv
-@@slNV4q$TNp)Q<WeI79z4SbW#h)MM^llJ;l+%aZm7<YK+Wf!<>d9H_Q)p!^K9Kbz`le|*Yh?axM`{X
-y{ZO+u#vt84k2cDqygN}>IMU1)z6BZhb_FD7eh;cpLHd}vO%!&NC9AVSrzB(*ld>nq?`K1`@;j@^({H
-JfBrjqnN<${&!$%6lp4cCC|cm7H!Xk*?rCxwA;Is$PnCFTdz65ndf_9#U96$!sjFPB(iMR!{dRKH#p9
-By<s5-H~5dx}~+tud*|BujQ}0EBJeszhJkk$`^@*n-*3FS=yx*<~s*i+7#|~l_L_5$}<qS+F$bZlYH0
-07pkA~!NNDiqo|*-$Z8)f!xsezi^ZeJM_BSaiaHC+2#=z6LiGc&AbL?1hAtEmwp*04*vxbvs&jc|Q<>
-}(kEeWv24I__!NI+LxXUlx>`4OfsB|xhNAX#j^cF&cvs6w=l4`49u|%|S;ntcP%0m0rN>LoB3&ndqN)
-|a|M<BvtxxM_9(EA{gr1#m&YB{%+Ir>?e%I?;!A}1O}x@{90pB=8(L@1S1^wv=|B`c7rN71iP_nfe=d
-BU-9?PbB04R|T$9*bJL;Y<VQxSG0Q6prS@V<U9vEq)XCvx`G0xF8^SD}HAlDnF^{h)xs!&<{NeylqWA
-imGm6^zKpou`3u0f%L!DPr+})A%|9J%?+H-G_QEi4b1P5Esft{>?+<16#4qMggOZRaSMyV(KuUwF=oV
--w;m-MP?IZ~rj`glDTG9%)bx}GVQyYqC&apf&>s0qY_)5T5XanxrX02MQT`L=#cL0VDt6Jut~;s}XcV
-7-@EmfHbw?M3?(Z`vS$Fh_qC2{X1)AzKb0&00-a>cuiqIX2_Mv101jjsHt_#o_CD@UrQnW>is}nqm@`
-T1nuuy1>AjzpEF3=c>hSp`bXw(GS*Ig9>GVU%$`pxZ9Bx#D4K~r?f8c}VHuPOf$N3yn|)?=b2QIblr&
-i{yh&un+8VX*F*^Q+MHXcoRJX?e=GVFxRc9$8Yn?uMe}spY%18d@Gi7Fr$`S<AD7Qd|u0h?<h(XKD+b
-Z$M2FTAnJqc#!L55d<+39ko0wKnk=x-zi!i(F{U~Ba%yW)bgYjZUv%H^PF%D;h^RT6KWp8A0n^6R9_R
-z+uZ~?Rie#6|Jf9L@fNC{$7_U$7cEy*J)etRz6d2Lc|_?-+?SL*GqEp0J%S|l02m;G7M2d7_s?&LD+e
-L1iO}*CEA6RAG2UzIwz-33F-rV_#wS8(d?IR=Roo~05o;B#j|e3@H>mkhD3-IVqxlgWh33aD5$y{_ld
-Ncd;111?kPun(10oh~xFPf^qPtlrbwRbtA238x{<vMk)voH26$@_EQT~82lJch*2?_m=QaPkHv_v#q=
-CMNmv#UU>Hpg>Of2~3SrFLo;Q&$*7!xvz$w32^q1+Qo}SZIlwxRe!h%T*uYeYjf6rEn`M6cxfcu_gi(
-))~z{uM5SG>*QV)t=2h_=~K~UowK>^WYx&jl7$CE@+alwty|Gi`-le9XR8=z2vJ<u(&An5pwuZ%R!P0
-mVB375Y=E7Q6ncwOd;{WGw_+S-U2#;@g#%Jch+ww4zbM5EZBHM`>T2m`6}eQjpRAVBw(b~g>sdebbA?
-+)!)BRcT_HNA6SI@8Lh$P}#7YaiM%2MaZ2Nwe7UGK+h=QH%%{QzOoE7Ma>};h~oV#pAfRV)~^4C}NE?
-g)wuIMV&Xo(^&N>QOpMBFHAdho(#`pX2FAC?Kag=L9V^;uT96|Ip_^}u4g{usJD;WpALhM87TD`+(0f
-32ig8jJ2CF*;N}^%smmF<yYK2WC@`Vy9mk9PUbuu6>F*Wtyz(8NbZP#y@Xl&k$T8&@VNz{sapNik8W`
-9vs`ASX`PnQd&^R9U^_6T`5j>mQ*AjW#2a`G_>NDK>3OX>>;x}SZHHrPwXPG+#Nr;s=_^f@-G!G@sqF
-ddpcl^zG+E^CjO<PD(<ztzQDdh@$Ld;WypSXiZ#|<9N?qhKXa7+E`dY56&EvGf2w!7w6t0iRA^9hvs$
-@r;sKxiX3uD|dvqgM6t-+aGtG*7Y+Y)x@L3?v*l;{hTwZDMvUx}t+N!J$>rZu-T-w_ztWuam_As_wvQ
-~U~>!<D4BHan+&#bQQ;>(=@Snn#Qu=w^92U3coDQi!qlrMVoKM_3E-4ZytxoyT`>FgK0x4Y#)NQ+C!n
-De}!yRs^!W;jawy!io<wsLcKvGh&1wxxUxF4nEyu;Nqj6NCn3qJPTqw!a3yfNyEP=z6l(q)DKn3z!gl
-UVPMka&imXT~Eok0*c*z(2caPZGK8RZLnn4u|jV2Sg1$i6|fb_LZg9m97-%_tggbvO`Jbk=~4I``mBD
-gPL@%HvuV<*B@A<rkpGDY;)HO!|5jGGm5e!A;erD@O*PEc0|hthB(vPNaBRzXiEgB6zCT_fq;Qw9qR=
-|)nALKI(hpt)4u}Zf@1kHdmG+VFEW6o+n0dy{rLx3wz7Usp%;;a<6Q?xbq|^5|**D^wlNYuWF-n}|Q%
-|j}=WG`=ZO^@Lm(i6Ky7OH|x8^vWt+3Qckt)6|yXaOj>%1fh2Mf=3EIX@|*DeT7q76EFaMjgu@liRR=
-Ryg-oM~Zud?Bz;^|(?xBp!D^cu<6V>-NHP`DM1IW{telJk=xLi6Gn)KPvpF@nghK9Dc^(CwpNDhA{&y
-hl;;2YpmO8K5O=<aG~Y|@fSvW4zOG+Jm+EVVBPM2qU@5h*}bIQ!f4kROLgHH7ju(&?ZO9Gej7DnhxOR
-?6NNiGeUA8-4z(UBJO@9g@EFT)Wfh1+DY-skseZJ4I9S=7-=m`1x*DH6`<G&2c(Ks`&a*EJ-));P&v8
-Nc<+=;PZETTtZ`;MWR2Ppox)9t%EChcZZ%bFM&y$Xkb~5|M+peIWAffUWU&vTm$m{1(=kXcAc_!{MY-
-hVPSA5}8;%@tF?(I%g1X9xK@X8v;Z;!AR8Cz-Fxm>JRwY0`o%^%*jXqeLj)T-i4;x={Gu)0Kf%7?JJ_
-?H?RT+DJ6%UP3|?FH_*IA$G=#@%5L_=9tmJ=5Et6nnt^r5)3*^PDTrS%3DaobNubWfNnO*eiXNqO{)S
-%xtzNYj;ZTlFqlR{ZOI>j)HjJEWWM9!e#L_+;QS=Yi<^IP*%hyR;a~wJqdL_p6F2~-#|Au*bSHUn2iZ
-G{UYg%(+3J~o|(2k!RCW^+vF!}F91T;wvj-+QaQGx*^_8vnpB*#h1YTasaUvMcUSDQ-;tbvn?ao7@eN
-IhIJMi>@-#ldv57-nN`_y?!tO}ijsglQPhqyvWgm`<_?4T(@zwq;PoK*BfAg4!&!6($^;bQ_x3QZsK#
-rg6&hJr|iL0!~38AUMC9JkLitYCdtSp8CMI7Wb36me>a*vZZ&M=C2F|&ETtNv<^t93_(vvn74a6^D&r
--fDms0A%U?s-k}j}S)>S}m2_QjH*o#fmP4$K^^g3ZrrC+6i%fy-in)yEfb`Eo=`ID@Pa=e$GoQRTW$H
-H}a>>q-=Ai#MiE|{_-v7%GEF)MYts!u3uD3m7^!+AYITlU|C62WtZ(G!>h2f{UO^YMN0CvT}8E}LB(L
-H>|&`Zyh*9yFy44^u#*jm&aaczH{v|>av0JF$nth|v58?}Td6iTm;21m=ZAYcmnM2_oZ;&6NvX8U?r`
-;-8#t%P97iTOnER56Q;E94bY|uUVY)I)NI|q~fwlR<fxh1JTNj+0Q?SozUh9hPbzPq**ymhfD@b<Due
-ht$r=U|oF~$y-rs5d0F+0GFuB?<%A7*3@7n6!Z&EF`ruUEzvqWa+m^1H^hpq|2AoYf)rfM6B3@N(PK;
-3#+Lj-mJjv95jD_R>;ZZh6@{sIC7A{eH_ml<vX-+foaEZ8zODRXQ)E;*k$A5t!_R=(!JqttZW*E<p=1
-(%jR!2;WJ2Y;<+1P%Ru@Gjy`k!r|^i<A&HSi(9n4q=06cy+ze%$5f+zsY3e#Nlmow5?zW%aT%Jm!-Z$
-_%PuuFn<|<td{OFGvYHSKqJAYSf%=uKvFKNt5)4LHlZdV+iJY=hsjJD#q^>4w8g(^Uv$M%#BD$X}bU)
-M4{p4pa+=x<KC_d?qv8*oMYmT-aF1v*D*Y9)8FTd%+X`T!7J!33a3eS3&y=ll;?rgrxdT+^n3#Yj*%y
-*5pT*Ws8F6L%9%AsHXXv_5xW0S`0_!u)_pF=+ThFG^N0q&i5p9oN9tCPe4%hi$PP`x_b$2Vl*KyP;+i
-s#`{cK_ZMWh2X*H)qW5+Ej6^!pdgtS<W6s6R=ZZnyc;SOnfQqZo4GRmbP=k^t2rpW?S1A!t}E3gBfJo
-AzoFs&BFAyy)Vojwl{^@)3#ceYTJv#46r>d%nmlIFtxTqVH#|YXQCA`@@Ym}ws4BHO%mn++c;qkw2cs
-EoGnh6!)ybDIl^WX=4hK%nB#0}VW!x62y>E6CCqf2moT$!p29TS+=ZEEW5S$itIm*65G8E8l!34FaX7
-B+w6NkkN83?h#eKxKy~2tkcWs{tE0n;t_l0#Stm}kzIjk#$brr1t64o`a&J|Yd<FL)lupcZiHN$=^K&
-r4pA7&dRtmtxWal(oUV~bKy#+d>(jqt!x2ezKVile-2orLuytoI7*8KFZLR-7?xW5Nn`sO=Z**w}bk&
-@Zgw(1Fv!S}Euk)+#~2uvQEDg;iXu_r9>Aw%gVTD~>v~tq@jx6l?oex{NYzH?kE84}8LBn<1=iVa*g)
-FIXoCE0&gRBZO52Ypk$(!`fF^d%&s@R@^{m>nW^iSUU-80Ic^4s}|N4!fJq(39Av-U#7qs3F{?c9RTa
-;DKg3f@pf2v#KF2tSaHR+ZL_eBfOWmFj)rxuu#SWE1(Ar?*g8k3n@3uk=-tGT6;0!8)2E25dtLQzqh%
-M9<U&)sak5Li<f7KQ&68cih0C-6ec*zd(wFCb;8Hguk0N|eYwg!k@0KFRYbK@Ssdt+syIh|vT-xg0(q
-)$ml8cw#En9XuBDr+XyP0K|GRZ}ycgvGq-jQ6q^=>m|mlcwWR`0f0cCkt>2EE%evdav~#i(~%D!WXST
-q5;u%Vn40lFI<S+bY>5LbyyDs1IBtQ|~+3f%-ao39Q4tq^bOo*&VG>ZLRyFwO(d-BXwHW3iopBcAv5V
-`t7rvXzJrtGNw9sjJKtQI4vBvxJ7we1J&Xr+TbxgF#huLc(xQeZr4vSBc{QSH~$J>P*>`2h~1Av$$55
-!bXDZ_!fNLn&BDkq_Yj=PIsI-MPGPg|)bB8N*v$?cz-Eg$+s|o)I5{=j&2T16VX1pbR29zjtO_1eWqv
-DBoHU8^&2ZG2w{+n!>asO3fCfDA@lpUWMEVN*TX#qo6pLd(i(@^_4_TvBaKsu_a8$L&Q>!J!J2*xZ*W
-FlWRqJoe?(2Yj5RliGO~2Rn;;)2xjsAvt((b0fyl}UBMf*5g;4R2YhtpHQFd79?7L^XU;0xFI_~0=ri
-)(y*MH6mOiJRQ26XQXd*t$d%B-##sC=R)-vf&~aYgF~fg{Jd3_$#)?|1(?X6#JL0wR0BF#TX0rSQu4_
-l;m`44}~L<7JERw8=9sJ8RDQPhM)*3=-?;?9craO1u1ANq`<RQ3OYavNCdFyD1WwL4zI+eVgZh2KeGD
-PvcER*7WN%0K4JcNp=(&&WEO9`=LIpy27f>aB%p&}V{4)=E?yiMm?Cj4-nML$!mP`7X8kh00cL%-2+Z
-;p%&Nzx3bBi!Lqlw;-2#$G^9}t~OKbg&X?IDRJDf|ri15dy7neeJF0LZXpLVw`VumucyO<}Yb~JwU0u
-o~vDLX_wiqV^<Qq}wjw~nOh%cceCubMq5`4)-s2{zAVf(f?jJZ0a8?FXbKZ{Lv5!o!%5Vs+Esn69#Ym
-WQb!a-B*xge#V}d5HUH=QWY{q)5lXiftkWE}f2zFyj1$*p@@$6BB4i8rybAe94%WViU+2aXO>9ZSa_u
-9>wDO;8=J4e)HB6r;3lHNkw7xV;;r0!kA`ZMY&vD4*Vqg1CSE6RFG0Wipvv;diR4qE!f{y*(*^PQcA7
-cO^chYCp2q#!GuQI8?<)^E?cX?9^F{?A-K&&EDo5@Veil0I=3}T<3m@UJv2Ew)Mbx#XIDn@so#^++*&
-sB87nJs_1@77lf`0IQSNv(=`YV=9;#eT+RkQ~?szq+K%+dwNxqzP#B}@Rq-WPTneW5>A-I|pCv4Tbni
-Q7;;tcP}&V^^LjB2sNe(hmT+p}4<_mh@n)w!QE{~Kx5iCTLfSZnVmEoAolNuA~UNqzR0400{z$_1s}j
->((oYAOcFS1yK#;`<X9l-?7M{p3SzR}a?C4b8of?-=*g60eE}ut&QF*;#K0r!h6Qx4%~M#Z9Fx>};!O
-YTY3YM|Hfav~6+e>=tpj3Ma=&nmVI;#@XeA-xDAXcM#|GCCK*y&|@9m66cXQH!n3eE8Onn@usVH#ZNQ
-<pze*_3(K75HxXXDoIF;$dguN~gzi+0b(9h7FmG2YO%|?i7e_)Etj;<oOK*zQO_%Is>Dv6f`GGQ<r!L
-&t(vBQk>ylk8o`q$uh1*@5pSOHrrOEM*#rKyUK2uogwB!1AaU!GFd}qRilDS9-P^6RBw_`J*c}=Pnr#
-+I#=j6Hz>3>S;Z!Iiyu9&Cbb7%Bfxge~iLfB6W`*Ddfv4!1*{wGnE#!0H<I6MMJtFA^R+M!e>idub>#
-uL)9tjf*c!BH)zwV{fgS{TgC&5VSYKB{HTPmcSs#CeJF)>zLLd(E-HWLC>f;qO1XQ3X7^H9tSUsku90
-)`c)D-0h^hnA1e}-E?Q??{&M$wu5ZDbZ0Cra0l06|Gm01=4ROP#dDmme`75hh4bR-R^J2S=*ofKo-Ov
-^^hZlGT*Y<$>~>EUfBmey4J^gGt&3zk>vCiidGW5#5K;ecJZhS<gc8INOeV-9m{0H$!3P9~2rd&iUtr
-9OAb=o-U@So<!EA!X1gi)>B-lrAlc3G_jCCgHO`szfNHCVbOz<SZ3j`YpjuO}i*hNa8z(^2BFq*(jP(
--kp;3a~$2sRRYPH>8#il8OUv%Cnp5%>{A5)36sA$W}78G<(mb`qQ-_>sW1oUsQ9x)B5r7ztts5(p*{m
-<e#z#&ZO(5^N{<ir_p!6+sgk``>#>;@|fdZslo7cO$#YU}R^e(FpogBb%LIwEGSI*vND}jJHN|c+OrN
-ng|oMdMrWqDT2=#i^$4}%1blH<z!7T<>oS$!E)IImc??IiT--C6qZhZjH$Sh<q=GvKMKZ%vtg_s>&3J
-Vc3&362C^uT-*7gFMY9Mtm_-VgN9cDbxkXV3f96LiN0M!z2-`0`w_lFQ1T)@bPDoC-2z!4Adw6<!)&z
-vjVHTFj%q)#CH8B-I4*daNl}PI@)?ApwDDA;4p8g!eNWSre*&x=x0Us)BiWSSkMTmy{@eCz8)kKBAaP
-39m!U-cYh0b8vWU2_V=+{D=0*<jF$AM%6XH$e*sz^6Ogq=jx<dQ9!ese`C<B8`p$R&l+$RXcMHj&;kD
-Fi5=CQ_(P3;t=sCz;}<vB%_aS>)cFIH9DEa4GaVLHL{GJXMsNMWhdZ73G^Ha)n<u{iWMuNGbLvpJ+j)
-lxhaK=8AWOoI>eJxPvZWmm_krkSoGu5#=h8Ub+Y`QI;%nR`}FQ&<0+nQ5X~9tYSS_A978n)E*MtgA`1
-#<K)QC<OVsFDR6}JOc14$BXG&76Ejla6iac_1f5EmE9LEHFYio>VHWa{DY!L}XjM@T*%WtzT)tB3>10
-aODkUZPWH@lNem=f`AXm4Rx5<Iu5tPm_xm<GWJ`#ts1lLfn|10F8J{@X19STkg-x{JIrCxkLYFm`}7E
-z+(WiH;13*Z6pyS2XhG0k5rzv+U)+t;&(@(cP4`9Vrk{$hTC_WZI%Ng>^76h4PySwtEQ)f}ZR)~2YW7
-w{MGPZFt`Sf0SVk1SEr8%j<o#ar?BWx=;C?<~sABx5Yq=PcPDt>82vjSZ(;SB`)UQkozzOL35y+qd_=
-4)W7*IvH{+mnLdljz~4d-Udwh!}R}(ywuGpMesXWPF+d2wjP3~SwbFqh<0?6=yOohO?KW&(r{~iR6CT
-<o#TfPk_@8EGQ_*N4t{Ef^11VLlj(ONg-}w=y+wZ24()ZSC<CeXNIgzAy{CzoD$zS-3zr=6u3#a>NvX
-pNWeioY&nPZ???EP}*oXESMTmK1LOY};vo+lJ7#S|3oJZ!}a3>SD-jwb(vUV7Uk=Y)Jl6gNFi+35t2X
-IC*AA~!Z9m&vsY7`@!LpzPE6PahW(|C-`Eo9Cha}}A7ky%707WrqAi3OU`WX6iRkt6zP^uM4jLA3o!s
-}R9_=ubtQt2??HNVf456WpF5Xm2j_p||*B%s_lY$`eJX47u->Vk507f}7LnH&ia0x;aGIYeXlJc3hp*
-bb{vp-yhX2e?9DfxBA`sH-IGac7H_;{M8LH$KlWE4*wkEKjHA_e20HZT-E<H`~NR^ZY|SE|J@ScRQq?
-QPaO$xs{M1m!@pVy_)q`-h<^OFr9a0vN54BJS*E-0`<>ETOLu)2aaSlSnDazoQSp;==atO2E?Btesl`
-kF_4G5(KKK06WiPzAe8o#ESH1ko>NRU$eQn+AZ@l@|zu$gm{k!kI|G|chn?C&L<IP*PezL8!Z2OL#pY
-GbdXYaoK2R{4!;Gx4`969>sS6?6d=J<(|-<~>s=Ipue&R_WcqOJT=#pNG<yi)no&sVE{xpuw!*WYf`{
-C<-&CubK|w<b;9n>BCI@~&1Mo~_&5-S(b)@AGQc{{9XRJlIjysdE?auHCx#c<5oDp1peaQTzJ&2LuLb
-w81*PAtW@+m^^+$iYayCq_oLX(lau%vZv<cnl00&=goL*)aWr|lg2gf|M<*Vv-AI_>HnY3|3Bt`c;AS
-~sDAwiM8`ZbFm}-3xFJL1hYe3i95M1yiT{oJ|6jp>HySpzkXytD$nGlJpL4L|N@RE0zR1D;l!JY-gME
-pE{a+6DrycCLCRwp>aIj<by_uAr*qeuE0R8D`<bttFu2?B!G<uZ&dNQnWNPjB3%MAIC3HLt2y^rj|Xg
-m}v%y8L^6f+KKjR>;|JcDS&G_9W7V0oQGafv50TV6|0+``2O+al(icw)r-Wrp33IgXTfwpfKq7dT=pI
-DuiQz90FI7i%iD<HH!S(opLn;j7@N;HBWB;GpEK<SXSf!=AU2uac*d57J2%v)ddo_mObuC$O!3$4Uo6
-<T|(|icx*0SnW_;hfyfU_gFD!sf`maaC3Z57PLtDDfuXAE9oieDDiRTq%I>vmn(!Lg`S?OSb9{j%%F$
-G#`Z}`=`%xQ5=X@zP7rCDV9FS85`{Y`Ynt6Yc!D_#)_7C4S#b=vOtj>hvG*-qq!DAu6a^Wcos%ZYFga
-&}C_mHq97}SJ6ec-SSScT*k93hH(n2~&gW}CV8i<d$h{NKO&6b>$WRXU{oHSt@Hp!BcE4w9{QZh~Q%P
-@;%i_OXu4)GS*Og1Af;vqc3Aq@Okf0ME{otT!Hk~KZvoNP|Z67IuuO*w<dPc}_3M`xyH<zxsCEOL|Iz
-~o$W_ylv>G*etwwk2D*N$*lJES6GCo@nZum6yndQ^{a;y8gO!4<X5z4L>BkXIj$J$=U?})FXQ`mnN)<
-v!`oRRFoT@KsD7@1XO9`Ml^M28nrqxt|<-QRHDgnA2(?nJ&fgL=h5R%Ay`x9?oNg~{WVqEl_muRPZrE
-6pbT7|EO_#Xg0^mMltXcGF*Sf{bwOOgJPO^TyEZPdfZ|goadFuArs`2JuYh7P%4X7}N$&1V^Rlz2XJ_
-A%{(p5h@(10x&<YG9fZhO~6<DYs{r!5Uq?2&gmdmiT3{#fH98PkTY)(#BMdjpV<*3p!RRfbPnG+_NFm
-D_$)%WDIbW@7ToTbXjHf5?zd8P>#bMp9f2>tL(Sm2jR1+PlZR3&FqpcD#^T0jEP+aXMjDLF-znv<15p
-+$7orIW<7n5^-Xw_VIsQ!S>P8EKglRjDHLTl{lPX0wAg%QdGE>M54&^t1_52*pSE5upuxlAkFjr(wTZ
-yeAOiW|JygswpZ<F0$_4HMhG1Zzh_|#F{j-YC=|uNtKnVgvMMRYgtlTAC;F)6-tUBag4%eWF(V~xQ1k
-jjPAXO$K7Geon#uHOpfVknWo;dcsZnD%E?H}OcsnF5((K}Q!QD9DDlamm>NrHm_u|a-t;u{B(N&ioSf
-s}d<V(Z@<C7~`!_(Zg0m!Rj_K41n_?1dbo7_mK73feUfNsJ?cSxkDp|%H+^>^z19)`r)Sc)`PtTez%C
-gHX>~0`V<2-1fTyrK`GEAA~TvZR#G^#aesVY-Owt2=wx6fz1Nu>x~GIVkfJ4HYQ6EaL0S=5hoW?iW#?
-M&mFu409;?z{91V1NC=Ca^=NjA9HnG(Ix^wO*TIj8Vr2J{_?7vHRAZJ%=^A2;FG(5xJuis6c0orhWvS
-MegX_w2bU@Q&PIzj*K2^N;f6vnnw2@9vv^dloqCUb_!aU^?evS<V(%*q=s?9_c}0-%BJ#O<z=knUs})
-q`2EJ)#-F3Qz5nITxA*_K%kBNY@UH7W&%r;in~_C#tLuNLUVN`!w@=?CpsxQh2md7Un^4ccK7R%VH69
-<Pv({+0w|21C54SV8*6)ymy*|EXL*x0~A8KU1LvPOy)1ce?-xXii|3E$eWy2(Yk=8I{qv^1O+vn3}?C
-tY8Yr1{8waUJ||Cc$pPye-PxA#vexjp^?OKzY4<<)il_tf)$cWo^ne^}EvABVnXWVUnmpzIj-U6j)B?
-R>4<&*Ww-V+}t4>~r~h_PMlka@>M4*NMjJ5mJ{jkb0CvHq|xW<T%Esv6eLMXXBl)ab#fH_#Dh#*0BgN
-4pJrzRG1<yOHK}TbV~Zax+W&4nfqns#8bzbZjw`)NFg&#ITSl0D>FAM-4tQYNspqAk>*kNvhdv8w27H
-=3d6E$5n!j01JIA4;edS?O<QMjjm=82q?`KDxMNUq29d$mx(vanu|Y~Ey2M)2&1rpSm`%g764O#l5tC
-?^^{h;hJsgdOQ;>GNIb{Ix2V+!cXL-IO2FTP~JIiyX@RXDsfsMgsU{-R9%q2>p7x?Kwrj$|+v$05dm}
-!y|AIc)qvvQTUN1}!fiW;bl)T5l@%{lZRO_aqC7?>Cy7cD%zYH63^k^er-E5V?wv`iXcv4hS7Ov%||(
-+}G(?9v9GG>NtxDw$z3vJvyideRWij)?GeC4#XDQcN0LS+e1g$Vy$6@ndbd9C00<IY}Uu5|uZBrpy$V
-3J55%wctwQ-Y(I(k*4vMi4#pZal}>##*Zut)I{W@nTcuX@l-wnmtdEHrsQd+Tim~Mj?N^f<n*-1>U)M
-~ro?BbWkzIKDBVkxt|Pa+T!)&|hiB42Fohi^PNtj8w<I3sSjNP+PhE%EcTMev-M*V@58mwitajl|6vP
-$6j&h?IQ%ot*nKY%y5YnFuzBtI&rw(;$*d)xDqG>Wx;TW3=TZ!G(Es-!4wSavlN=}k!s+%rDDX#EfS;
-#|@7KsJyDsq7*<bb8ZA8!gv*xk3*Fp}(K(H=x)PD{(l$^-(EEKyU?+D)lc!?Nr(jU5-Yw}Ig7HL0$~n
-R0}XWloR~qpY7s&co6sOp!4yyS0rWhRhK1I3w3=%D_Z6JXg>{Huj!te7eb$&7P9$Harqpjz}dAqRS@1
-9v%_Lm<Fi~j*5l7IY}UuSz3x{X=skjj!HFwq>1_jsh&u6nnJ(j@J?)^5Ocvphjzo2(v$Jc%IRmqI*v(
-^>_n%2>6Y9{K&`JOHI>HDG+Gq74K+zZ6_3=SGE)YpN+lTMT)R?(aMa4U42*~+^aM+Zqu!Dv$T%f7+@=
-2W{6Fwu?ltIp<K}nUZHvTvX{&Iin35(-emonF>vXGg9e?M)3(<d`|1TcM6TY2SWXDA|p)<l>99*f1^9
-FEuA@n&o77h9wciC(vo6Tjv77l**%5h<O$mx2@ZrK0RMh3WdlHCL4_i*_=LVk~v;|!JE<7G2ZPJg7Fc
-e?DJ!I;<`0X+)#4CTnUHj%>@$T-iD%_n64LfOAaP6w9(V}<)A`Tb=XpEYuRugUJ4Wc)st{lAv|y_!nA
-P<W>B+|guz(!DYNKO4R=|NqH{%a8ALBfAs$-~Rm3ehKG#kBj^$@#8)-vY`i!f^P-QZ<o`ZJu0`S+d01
-1?@uCRbHFhpizF}-7znfk0R(D-9t0`^FM^f?jG+2!BfCssBREfRhTtT@F@mE6hX@W3>>=1mP)e|c-~)
-nn1gi*^%HbCi%p)iuFcYK`j3XFE5JxbOz(~-OKt<5ZwN}Qx=-rdRoq!Qke`REq1U7<W1bYZRBv?bRn4
-o|logjr^G{G=}fdr8R27&;Bo&??m9SGVIv?QqclF}qNNpR>(Df~_{KO|U3@C-o_K{ml?f?)&$3A6;B1
-T{yEl6?H<McUv~dd>K^zB{p7amBd+$^$t)cG$>993dW4Ty?dP{ntO9jXsjUs?q1a0lEK%r*Ung<lnfq
-@_!cZzw`P3T?XXmf4L~&`gtd3SNAp4^No9A#uKvYnZ0^iGGAURnR8a2!4_|3oLwNybrimA_3_oJM$(;
-gQ!<URx#14Ohs)+h3V-mG^RKjL7hbWwGOF?PXTL0LLuf!f<oMX*DwcG7@^Qag!yh?z>ddc<`OcPN9;3
-c<&#~Hd`eD@9J3hT-h@-YPu0{ACLcaVAqwvG%y)jVQZYMc?rERzCS(N7yw<e9S>YwK}kF+PxMa;K)&~
-&5~6LXaU%(>=C(-VhqO$Gl~kvqm?ACif9hscD#jZDnbC{O_k!;4JJ#nevq({U0z83r`qj`YVh;EpHHp
-<{P+pVx@{(nj3ZHRAqZBkp?|aX;3GyR89tjQy&~-MzCDvk~*o%bOu9y`2~iT~gk?x;e3R?zQiwy`9)3
-x7zm}0p#Dc_WjUEdiSh-&znr)U2EUZWIBm`fXe%TEGPD;Lw-0wRYhPFSSmX-8-9BC?#=r5@6Qqw6Ioh
-X8naj|Qb83I(0>72x^yXf?X}m~M<0E}N=r-G*I$3lZr;4f<f>XA0@Djlz@mxhQwIuKGLPNUrymrr2l<
-tnf|fPYr_Y>;09W{dnuGknb@JX#@9y++h2qlt^yzrF9XxR0fOyB0gSpes6<(7n{HM>XbiYiI`7Zf=`a
-$<<#7|AFk>2wW{=mW1)PuX__ZrC`XIRzXozkx%e>@Z>UrJwkProk0A2@Jum*j9=q<<RuOYf9F=hlNzs
-=^KU)g1iwG`(Gezrg>An)wH64qQVTc)vMxbTkF1NvHJb-EGU>wht{oaF9qy1%KR+{d>;cSEM;9&I)t?
-z1Xkyzyk*<!~(F(z2@~7e6>;l@m~Ge!8M)VIv~OV$o+D-fmc&>u?9f+f4+Lyf$Exr1*IbVLC$|4zOA}
-Ocq2UVw|sdu7v6&ZNWvz0BfL0A;h5wt(igbNn{3_Z$&cjCYC4wYpK&P&BN6E604@Yh1x#va8UZIcoMX
-JOMj)Sn7ceIR7lNh)9t0gZ<lIx1^*@sHfPerN8ym~w<Kx+5k3CjL#uqPM%-(q84feqY9|#%$>Z`BVg$
-oz#a-NOlmi5$zuHV!YCGmLn<9uW4HkQBb%C^)gSuCH5D0Lg>`P(XzND`*x|M*MNMzZ9;bYT?dH&SQqy
-)b<E@NKCB1KuPvX-dr0!JKbM;<HP-ZyPl{iRJUv+cpeGdLJ!9`uUvyaQ*svCZzar#%6cy$UU2O<jh3|
-b{kN_G?l?a;uCme6nt`ToJsU_?b?<3`1mljTFpX2LRffsIE#*s7Q7oWWC%-0NMIvJj$~uTjA64=`mu=
-<C$h<tC$o%<43?9VBifHyvu3fEEn)1<$3ocqv-PZSVia32C4xPZ70zDFF|y5bbnM>+(d>me<JqRA*=*
-NSkFZ0lr?4KMaMp7>XTG~Q3){(A;6Ba_pK~_)GtMH8a`wn^&W4=kESF&TInG91<ZQwj&c<KnY|flHtf
-ZubEm^XJJ^%dkY}vA9Z29u#Y}Kk&Z0*{$qI}n{U(Ysd*dW@nEnBv*BRkf!Cw}5=LnUXQe)=ifyLT`9?
-6c3<;lqd7(W6J%@#DwYx8Hutu3R|Aj{MBo*|TSbT$GoWv#KkX*mu8jR#{oeu3x_{WCf3NAL<|C7;8d8
-<Gz@&<|H>QsIs@B3asL7SP1uJqxcXugHL5k`4YB)zsrvD!%BO~+EV<^6kkp8Ln!`0ia(O#Po(&HyfvF
-o@t0Hlw<&%p#s7lhpLdAgjp7?A{-YG%Oz{^{{MRY|c8Y(P;vb{<rzrk+6u+F}U!nNd9OC!sM&rG3l64
-wxE;ci^ei4m9U#C882UWr^S~Gskm+^0hFn)e2<Cm5&UimKL*Bs)vrTCpGzMA5PQv6toPia-AQT!Pce?
-G-uLGj<A_+=FT3yOciAwCU0;;1TT(_jPl9j$Lp@u~f(q(KZ<wP8Gz;*X~Ik5T;RDgH)^f7Bs9YsKQ&e
-N<;VvBk`Xs%;QENRnU4q8V@fDC54_j1PH|@u|xhU-BN~@9tsz@M(wmDvBRO@dr};@f1Ig;xD53YbgHv
-6#o;7znkJyo=Z+r{0kJn(jLDjrSJ%)kVYxYr4-gu3Ogx<vy?(*YtDZ5<*aH5XV<23c6|wFzrM@ajl<j
-?|9*<!i{gh-{Gk+o0>z(3@#j(eWfcEaivIz{-%jxlQv8z?zrrEDyUc-mDE|EvzZ1ppM)7-6{7{NNg5p
-o5_zNihs}z45#Xs&4zwVPHJ&sNh5q-n^h70`?8~AXKuHKzHck6HW4euKh9UU1N6A=~`9+}juNB8bsz5
-Dm?qNETRP2Th$O_s>WB%g;6pnrdr>>m>w5fu|g$wx(mhxH9l>WKhdyLRp*`$xwb!(+lDA|oh1@ao;u$
-0szY7Ri{{80G1Azt??9y?aY3cz5ok>e3(aDgBt3=&+ci2kvg?MgA0^ha8|=62%V-N92f@r2Fr_yPf1O
-aP;o1A|#{j=_lRO_U^kM2@wH&M1W2z#E*!CZ#ewh-u=KMGHL@KMh+A|DJ(p8P)tlzOj3I!(9Y|=`|fS
-ovSo*X$N~Pb;-U20*9njWHo!k3DmFSMCN?UzW1Rrx-~C~ce&5*0n5fvu*nSVTzef%L|A%_?8px#dBSa
-Po*OCkfAoEY8@2ig`7RN@##0nxr4hsJX|D;G?BT$H;G}`y;clX_QQvkbvQc#m5W1lF>U=aB~*sq^Jp@
-ZE&!o$r&+e#f36B$cf?$=Qe@jyRWJi>J0;eIY2ZtAe4*reF#C>hIGMY^IR0{TYuadm1wNcI4)q9eoY{
-z<`oJexIfa%w$*Fa(ORF<~S~wf^CnK(&7}7xy;N<QdVIWH}%pBBItmDXDMxV128mZb4*?NJ8q-k+u0J
-MIgvv{awyYjqr~MBXNykwf^7_37D}(>sEu4B4WezBx{U0rY}7MJX;6Hh7%v79lVi#r0^zpjemqbx~{h
-*Ka_qX31W0qpst>`L;A#;=x|*<Zx&PciLK|&d1-#NM?u&b8c3A>J>$9j2B5*QTmcKKH=euwI7J!H4IM
-gEj7Mgh`rF4IujPfZd1+B>X-)+D;E5=<{)O30vxmkM)Xoj~nzMv+(wHHS%;%naj=lKei)_V;73}4gUu
-J98tPx{{_uqeCj0Zpd_+v3v__Fjh_9Bfp*3(#F=gyt%^UpsQV}tYOPP238&aw07&$Eh(3U>MOW%lz=S
-H#%hmtTHizyJO_TXLPVcj^7`4TpBNPbcc=G}O^iy<9wjI=UIu(LF^S-K(rM|A6`OPuLK?hfU>2*b;t{
-y~{69|6S=2pE|@in$c%dXS=v3#SfzRMv5Op@kdeosT6-M#a}`3-=p|@DSmA~_s=-xpK;3n)^SRExeaL
-FzP(tgZ6~yf?Y+A8>C*=%pSD-EZ|~K<)59G-TeW(S<g8ui9$mY3@7kxer^iEg(R=$&UAlLtu&q5i_VM
-ZC!#Z?+xJRD{n)hi<0b1R4*Ml88b?wooMe`mH$_^@3kB9rXySMB?aUN>Z>aO-)_dVRFg}Zz6W^QgRAM
-)^M@7kpO!w<A@Zw`k(o*nOL>eRGzA3P5<b3^*~dO6=sZ!NksZ`RC*>Q|?(_q%i;UyAYoy;J@^9oly9;
-?t*(4=#P9{2%u5@%HiQ<Rj?oKo4{VojOS?)A=5Z8L$ZFB12<}JST@R2#<{t9i{alTsJgM1X10#oxOuc
-+0xO(0o>$V|2v+)qQ(Ti*g|nn$BrGrQ~*AS>(;DUGiq7H0j<O-aWo9I6k;2O!tuZBagoz)`9}fe2Yf~
-M2=P~~T)8rl`kl>Ju3Y*4#~**ZNPW+_AAb1Z0-2|)s;aKgy!8CZlPBNZy?eLS$;rvbU@-KNY4VcO!Il
-*8;m`07WsQ!xO}B2{x{wK8wYtN&UZX~h3Jao#?Dv2D_190)JeqIYwvAuBc#%_o%D?*RD=bj))2B~!nt
-yZn6AhgD*>7z&TRG8s_KPpRc&V(cEWdBxzWz)qCv3sFk4al(fD6jCxeTx?TY|9l<^hDw$jI=ouCD%#p
-&7h${M!+~4^kZrKpGm2rW^1hyafLH_U+>zee@A0{P>3-ekkz1aNz>~{`>Fwp+krG;lqbTIK-hb0^HA2
-oR#ms`|hkwn>Nj&AzM^oVd3EH?Ci)zix$PvxEi=&dyvn4_uc1TQd07$pPwIi=M@<l*#qhRS^TeFy~=4
-Uv!qLxE`h|uMVBsJ;-#gfc0M0Gc#wbd%{Ky1Dj$J6>}SrL;U`X<5bvN#0UGlNlVq;yr=NbRCb_#oY1)
-4K?Kl4O&p%)N^2;wj`tG~$PE%gLA{^2AG}X62!eJ5O{#pEKJcYdM0Q?mI4GN%46afAT9g1Cn`m`uOIN
-O2B+zyWJfWLzOjvYG|P&sxcnJ5Ac+qZ8Q_(ML9A3rY2;OyD6;vG1mPEZ{d=8+>u1fXu9JYb^SP<Ie#|
-Ni{~f0QBBe~xmvdGjWBeCYiKx!1s->agFR!T;K|Yn-|vA^%#fwj1Oa0Q^7u>@&W3^JY$E&S}gn>M;0^
-^4Pm~uK?h_XU`r{SB@P!ChVXAZ2;sA^#o-E+&2Emx#>9PVV`pzu$S{bpW>cW&U=?~K6D@FZ(QK~muuI
-KP+jTpXYl{zlTVg-dwU1c7=978mnaWG1MmgU!B^0OvH<R|qwG(eIwb&h@ErUGzK{dZ0=&V0l<_N<Igk
-8`bK@7B>ko3SIl#I99-?6<=MNJN-L`Vx`D4x(o#ecxre^t{!JpcCI{<$Ll(JCZuhbLN1ISC_DbD*J<2
->R^;y-AhG6>qwxgXJx`8DU)YB*0l%(?m#yK3T&@V|cjI%Ii)zrTNHl7%ABK;>`?Ex-kG1RNWp1AGV1Q
-AUs($UoX$nzIRn1{3~|oRDbfdzAA~!c|8!1d`ljACvG;JHom57O76$DgM-FaHai+{8N9#0rks7k#q1B
-WdXT@Y$$Y~jzi8M_ox?&iF$!2{w(K%h=v%F|9)RfG=v=DJoqz-1~t`%p4&O^vF*>}Pi^s%u3ftZQaLO
-_Jww~l5FL>9#^ek9hd=rS#6vsd_#~XCItm)T<vf~bh$0%+|G@9$`HA3##_<33*IzmHGj#woD4@{MP?<
-DD$Bi2|_~DOM@U=5z_zP3R_;XoCfyATVb3Xh#&WD`gJQg&3BiCn=8G}-v_e%8{ZBn;Sr25=zi&Uqn#X
-Zm%{#4Ej0s;a$Q+r+n{2?dx>44lruItmG&;nV99GyP!0e@|}fv>iN@RxE!1r2z{lyg2(rXlV$=K~3+0
-pB>(XV4(m=iX?Os7>ukZBi$qq2q^A+e*)zhVbv)xwBpVsgFlLe@l6w{-Qrn$^!KP?+OjTpV~cM`g{t1
-bB2MxIz5EHLNu%(8t^1j`#G9u7(sXpJ15bg)MwD3)MvCwzPpL<J2-y`G!Xw)A5s0^Ba->NA^fSm7xGV
-aZ4t&psB;P(3N4@k{Xt{01^m%YZkQ9!-+o-r-yj;+5)Ch#CH!-*a6YbrXs~gfctNVqXp>@2)YfOvpww
-s3pwwryNj)};WUkl8AN36V3yrhv02&miPe(&_M4<)Gru<<3-b@{T`!PL#J&$OZ7Q%n2yu`o$O`;)*Xc
-%>oXmF^{F>-wlKO(hB+Rvo^S!t8H6AfK9H`p!-{Aql@ATThnGmTM-fIr$rn2;IJfH99k3*6AxD&sQvp
-})nL0nf(;!F=QFVE!)A@Nc4F9nr95Sr)IlQhrB`O*zq-L1m&<>a#q?=>AE=_@lj0<X@-LbwgPwfcgr&
-fg5mFXhGYL_8#*Zw43Ow(6{0F<OwbRh-la_TgTVW)bqE9hWhpSS!$D(WQ6ktQ~L6GX%W0|Vg%1miR4z
-xqx{s@hXf6dV~pPN7^5-#sl6BSPxveX-oOhca01?_55QX~6SVP;<74!{pb_%FV_qoVN;G^(G<-0NXrQ
-`)`V1Ogk!e^a)36vcOzz9)P9hpoBl+x<C_w`rv`IRLF-G904a+~;4D?|bM*!BXTgTsg^G%L%kphloa=
-Uu+`|rQ=LoX%svO*2tGKXlOy6`^H@Qz%c(I&lY3FRwtLiy6{F#b%Ykw29l&aFhllSIQ4M8hni0Z;ug#
-@Hhbw?Dw2WI@P3$#oHEdGg68`CD(jCFr>mIuu$E*LL`QzP(7pONoZfM1!c$L<8C+r9Q8sHfecI7=J$7
-$e$(}77-2eiH2g5qd6vVJE&-r!X3sK?^iV3{sVtS{`Go&H{byL=FOXDr=dO_x1;6v-)s2UvKRQL3nKW
-oLM`7c*XQ>f>hl_zh8JZT{zY=MXi7LQNt0;6BgPoiKMy2WaZ&WY``N8eJCr%~ze|P;84{D3nYj<RqCT
-Py%$_}4(BLRve^e$gQK#z9u^M{5-ubqDjDh;RP_EDQp4*OpfIrH9z<>cL2mbo&uZyu4#xf-(C4AbnX?
-7ZJN5}2T1P|Jz4`$y%eI^<jXlELG+JR4t7cVZOwv%`7-km2UCGoXu*K+jBxw*OAY&P=+3l@la{q48ki
-gpKMp@wJy-sl_9R$(lJ@hIj4cu=1YzG~q$ztMbS^)!2ZR>m01<odjr>cSu4zh%o74;t$XQ}FNAt5;BJ
-YHDUmN=gN_qoN#MdF2&8c<^8zA0N*bE?mf;d+s^@%rnmjd@#QUzMuhp0s0Ar4$NUd1KLx_A^Jk(vC|s
-KzjzJ!U*r4MOsgGZOq0eKsLyDVUdW3D`hPh8G8hacv9YmpAU`DQOK9F7xM9PFx2O(t^5c1Vd7SD5$NM
-9XJR-&jpMLtOkO$xnTv0}fTq)%N`XGCl=U`livOs-6ofh?(%E7Tdzh19CAK0`K<G>g1M0kROgP&QpY?
-)XGLEds*<^=@>JRu>0cj?lFKlIQ;oW|Ay7vO=q;Rv8Xf%>!nAX7@(Xj?y9F`jQJHd6mAjWN(azd0*{Z
-+dznKe2x!zxK;7N2t8-c>Q7N(xtqpsOajFB}@1dPdxF<qmMqy)6>%h-)UYcWC=8&UVu*E20H4~f;9;A
-!;pLQ(Wom}kH9<<ZWtq>>_AHc50U@tDe&meuKyr1)!kLu+1aNbfBf;Az%wy1Q2^?+Lc_xkKg_33pDxM
-)eTK5OqtF3-fxoimi@5<z)CbfN)Q9@@9euXr+ynDx_9xfhP`4oeBug*PnKS1o>S;_&44*l3rYHx{0Q~
-#*?aN1u7$MwI2B1L!(4fqFF&D%58gdUjVM2yLo1<)DOoi~&mi)`x+dJrk4?cJbbBMo!KV%aCS;BfV+<
-+I>oGliMsJ{^r5!`4r^4`6Bi*kTJ;?$?3A=y&uhGIgF&>ldp&>o}gl=Th53F@{x)n5qwiS7kKK|!5~h
-efE*Teof%G=M)?H>CO@Xh=>@<^u-~6tcBu%^HC}cnzMz4!lth(Eh+3V^hcv#@eU{r~{}INEdA|;eM0S
-Df062GE%v}vU4X+*AY6Orgw@z@^u{lD0~HAz6gA%Y&nfBu&Y?q2P$t)@+M>eeH3`C#8K80(T;+rX#d}
-P?>+wZ+i#0L@SS(w5%Iul;**WqwlUO4&LrHolN)Xthu-5(^*3VthVc*Df2xm*@Q(Th6S$zfQD;d`#aJ
-REBSW;URM$oShPDRst;iwj0qP~n1ag8hK%4A19)ca|qKr@;=+B8>d{KjT)9ns%x8v_9tBx}4DBHjdbU
-}tt7v|2L%c;#0{j}o)+!R0@v@>Xn@IZbrCjtO>(6w^qN~|%ia&~t9v$)&wSH}Ou?;_Bkw2KYV0e+(mq
-P|<q6ChLQYa3Y87x<%WlraSKI*@zF5_pa}v=p29|2*I8;O{8^Xd~+PvGr+zi8c1oqet`SpMPG+w<F&b
-Ksd+}WF7D51Ax1tAE9yWivIw2fxqMYm-?PXkW2JIphH>jNBe=c4*iiM9pLT8jT`w3FT5b+S*gPS(5<Y
-^W88#y$c&;tpf>Y07Z;cR1a~|Bj{TzJ7{+mIbGtGDtXj27#0Omn588k)WD9L4Xi;#d@#(97QQmLCAGl
-Ec67o;|cabvxx*aXbnx~?_L)pL$<)G-~P-bY0pi6)b3bX)s%HyxJGq=Uxas5Y`OWm$aFuuq52k+3!0U
-%p2ckS9G+FkGf^%e3C{80}`9@qShxC{Ip*FUM9u&@7s2K1d6zo7kt9H2i!-w7UL&I#V59F+B4lmp(;=
-A*4eJ4SN~q1Paq|8Cp`{*c|<$$4Y)?${Q=Us<;RpFtyJo#f~yjS*~AR_IsT|IN7L!Eq$_{ucxCz`lpS
-<)|KBK%L9B>C<aiQ+_jS`t&o5g;h!>+5TqJMK+yell@JmQ@!*Z@-2|f(!T@$eA(oZ=_H#jve{HNJ!G?
-^Y=+5ZzHD;Ibb?v;yB!t#3lH}9G?l@P-Da$a^*(~V1lQ`#7x4~_O8xb~#vbJ5MPpwz_4zR-lW7Qz_am
-vz$2M$iJHwd!9_ApYNc-Dr&ZnK@e85+djty(U&?)%s;C%GwoPYJRz~y#0fYuIfZf+Wy+fAi9U5)mP#+
-<)Uds|NJ(q(Fwj??)36&l-4rZF(SVelpBOyi9!6VFR}GOUF{&!?Bya*tl+{NPWVhwT*k|9G4HAD}jTH
-RW0Ds83h+nkeh%@|gc7!BuK=k5Ie$F%pK(6#7Q!xu9RcnmE>CzpUc?(9d_I>+Ohk`iUo=NPgy-XA*z|
-#!i?&pnpWWj=l(OHO8_Sr@#+(Jfm#2`a<Y<pzp+*HuO7KlZTG&kMhSHfaai?G+&sk%<nPJMZOqEgD1+
-I2jeEk2l}!{FG~78=*m8*Y-s7C&U2-nJc#@q_de9$^8lWp|N7y=asFCif>_5~B(DLE|AF(QOOoC+{+y
-)uRrU`!$|Lkc&@&py{Iaf0c0`{-^Veh==O#Gr!$A3C3=CY*|7>2CA=bdK9*i}4C4a!!OOoCb`Zght$0
-S`FbUctp=%}FUgr0EZei3z#l0W)!n(t@Mnl)>(qrO`i&%(sm`t8{fVl5HtxmZVZ%pbZ}=#LZY$)i!$(
-LmP+9TViyXRFjcDEVXj<ESgGuYU(Fc-G7MiPh7j_1LN_m-w8Y>f!)-OsFT1VY1HDUzW#udODFm&6ARs
-EnAl0hzIh9oWsNeeH+$Pp<lq7@W$t}|4?Um={L@E2$zt<lCBMP0{TwJ{4uVWF=Iw%et!OBN8KxMz`6-
-|fd}jB&^7&A*7rfrg!NF!BXmsAZ4}D-rI`~Xc<zZbfrF68L$$i^`uW$_1=rUBqx{R}h6#NabVXRx#M-
-zbk60Ineg(P-q2rSCpOw;2<kjCn9zzb)Eq{#3N=izSmoHzQfVznJKE~&u8@PZ6Fuz!xCiI5TS7BZCO?
-hp5rL12-oq&D>y21ieq@4$N9NTE<ZXM+xb?dRm9?PWmf3l(<z`Ou+JMaW;4|q{!`-bm(I!@>bus*$BU
-SD71P$!^gvdVh0d>IEkLLMpK(F7;2*RB7`{0#LFV}3_Hi=*xieEK7u(UI-%2ptP_bwz~3Y+2Xn@Z8e=
-A%CmYn*7pBFC{=Xgz-4=Q0CRjzCqvtUZ6dKA0Fs$-+rvNPBbKs4zku@`;Rg9%$YMY=gys*0X{tS)Kj9
-}L%WN<5A8o>0sMe0B5y~X(~swl@*mE9MRlT{Jf?@+b!E59AAJheIk2V+9%Ft*b<w_-USAiclnu(_(<O
-1d^88VL<-4zH<<VR#k1x(1iR>Hf|0#WECI5tkgtK8`VPf4Cy6LpEG(La+d@;WRPD)##w3R3y@aC%RIR
-E_RDg2|taIqIak;hkN^yBY6o6RfEpX9ue@lR-IsK3!@oB=v!&z_w%e*E~|YPFhAnKDJJ120;%NUU8bb
-06>=Cit)HZ3I8+_sMvWCWZTgWb3x$zh1q14X1i9=7H$zp_hSfiN;xc)TmK{?#9-d>z9qvk1KmCDS7OB
-zWoRO#DC;X<Bv<wC1Tw;IyzdczXFG;Q>O~Pqdib`B#I0uYsiW`P(M+Vo}NCDWI30{NcgZDbN)Y?Q*{K
-di1&*pO`5a|Iv%Xi4<A09qb#6bqkh@0F96>aIaKzDC?@q)zY#wlr?ghm{QL(deX{XKPe)~qA8BB02Yz
-EM7cz*obm%ouKOFT4C<C+$hzDH23$)v4GlA!}ZQGt=cc!Bd^?$*F1<5bJ{BnXa=SDdLhlvv>avvWbK4
-{P&ft#}Kr|5?e4sxTk7uc8h-h1!iNX&cgAa9XB@<jVnSXek2>0wPCeLmV8=oZF|86$Mes22!}2Ru;Lc
-rjjvP6gw3qG9=;$lIQO{WUDdH3{@bIXO9^ZNOetWnB^F1zv-0w8=+~9C`Im<}LC^KGfET_P-%KlriwT
-@4m}dtXLt|iqSS=%}LQI{>8jS{>Vq^e<4etR~dt&?kRdn-~btejsxpYn>KAy_6h#gyzTVg$r>oy8MJ*
-U=k@E?L;ijsUX(Ct{p7Dc_}0YpF9Pb<AGL3dJ~bT+!p=C=`Sup@N8ju^e!FXr$0VqK{>q>DZdcVPp41
-<9Y|M}3F=FM)l^?wF$}88Xjrwuz+O_|B_0?DFv^#IT_0|<iBkPSf-Vp8-#&z}T)zPa~t@`BO|NgfqPo
-)n-Ia8hf$}v9lX=P<)SZBRKX`CVXt3o}*+!*ruHqAlePe}Wq!f1T`;yIDjCM7<?LZ&f>Q^qq&okCldR
-4&b#Fh2c)hBX1Z>x_>X`e5XRx~9yD9LIvmKS*=nO+Vk#4gW&05p5Id5pY$$?>Mw&4PTNajSVNrb0^Fn
-F@MEe0do~K&6SoBUeL8-P7d55|H$|C+0kN*bCu>`FIGuuU@nfi7v_GL_hH_trFkdDFc?z-Z?s!@Fo(f
--@%?9~iZmRbiW}0J4%QJcX9NFGPUwS_J*b<Xj1uE5jQ23s!&nnzUCcM$T3#a3z?@?M;eqlSIdY`XbE6
-FdAI|K2nQtrz5%Wom-7#**ya98kS*HFXkNDG^uOq&^_~MIVJcvCa(5s;=AusjE;)lxCi*f&~3HC8Jh}
-{7GQNJMCE$HO1e?aL=@w_`blwUe?MDP=HsNyt{f0a`HkUg~ZkW-Z9(4j*GPti`JEKhBJg}?Vif3g2_M
-cyNP-^Z^Z{stxfC!c&G#%jub9JJdQbD=!Yo;u<JJNj}*`A2xA{FOaPNDKWW@<)G!c>>Z#yG(t5zGHl}
-)4&_)fEUmefhP3XSWiM+%(KyV@7%ewPFy^*o4yt9Nx)oWV7CD!Oj8*=;O@klGL_0xoc4qh*PL(yr+CA
-8Yt9VkYU1PooVMn|a0(~haMqeDQ>&%c2`8<&$stwZoV6x$NR>Ecttm4k=jNI+#;4Cv<z=L2=7w~(<Ye
-k{CrmPBB<J?ZNSlz8m7A4n?lmDRLzkSJ(R-S2XH`aWW?HH#*PLL=$xX}34C(CKTirSIuI4J0!JK2s6?
-dlGVQT(TJc^lXnqbLEGtZFU$tA}$)k3+LQsQ#brlqBuCYo~Xo{rv8;zBw?WT0u9DP5J0-;mD9xzU-^v
-Zk1FI;$*c;S+FWL`dh<<n&xq=TJkRMk3c{-ly^04Snk1YUpDpn%)h46n=)rg~x?QMn(_nKVpPz`RD!b
-dq*dHhU%G{x`n!px}&<A+DC0v$Ehc%Ur}#Yf2pofH}QSY_h;XsepCFO^?So_qu)WllYT$@dH8qp5Ah%
-8Z}Ok(zuf;L|F8Tn_+Rz+2=EH%9S|507Vt>GqX9_)Qv>n?iUM{7TnKOt92=M(_;ldTz|R7Y29^i91>G
-MsG-z7TlR^7~ZU#kbk~BYS?$P>dBebR3oZ!6RIl=RS-w5ug>#o!3qI5C3(YjRK6y03i65VUM_jCtzU+
-YfmuIPTzHPMIZqxD((Y5K+b=k?q5X@)Gr9K&~pHX&Xi-9wldV2CTi)Ss)rR~PtJ`99-U=${^NKA>5kS
-D-4eS72~pRNy0lV**Wq*@2q^w*>AAyf3IE=&7J*gI)}JIq0>Zw}UnWZ3)^Dv@hsz(6OL1LAIdEpqd~z
-O>>Q>roE<%rng3?3DXSL4AVTS8K;@1nWZVx%-5{Zyss(M9MGK9d`Fbs)U?p{(S~aWYg4qD+Gn)8wO?s
-ZYh8l<g2RJv>eTwd`b_;{eU<)RLnlL`VWMG);T6L>hK+_@hGT|r4ZT9bLOO;%6dDw24t+dyUg)CG{h=
-2_n}<CRHY6-FY<n0qB%`S<TdrQC-lG0m-P?D#Z?bQ?-!i{dRAO8Fj`*GRyXe>4zqS9v{-OSn{;^bUMg
-BYey#llWeFJ8QGWu7*^8w2PUJiIS;7q{x0Y3%=2I>OMfinUN0*eC|1TG0&8OVZ~1$hKLAM`5mV|&n^p
-o>922K^SqG%Yo4H1}&dX&%-DX$+c3O^hZ%Gg_0T$<@rz6l&ILKGvMksI=X*aoPm!Xl;&mzIMI#;o#Wd
-#NelbpASA0{C#juu#>Kt&O>*vu7j?N?jfD8POA%{QXiyyRF|Yn(M{H6>dd+sx_n)c?rGiYx_5M&bX#;
-gb$fM(bzkYe)m_&8q`R(TdX>JLK2)EqpQO*$pV42?|ET|6uQGHsJZuOzJZpHtu-Q;*xL~L-{A5@fvLf
-W2kk3NShFlC88JZqCJM`1gZ;7YQVa>xl!yXJ98kQ7h4qFS}8W|fw;?qiPP@B|K)tl5?)w|UJeq;QO`k
-(M08;~0Cc)*hZoq}S55;Pea7j1y{qu?yUwU^$Ye_vm!f7Y<l5Ee3va{D?&9kwiNTiB;zSHhUMK;i>30
-@Qk{ZO^M;Rv%EGS3CQ5^G)!b<olfON50#9ncrQ0z5M$7&G38KZ@>SK{=fQn2$&MEJ%E$!b_$FMoEf+#
-Fh8g`=#-{HQ>D>p`)Oxu=V|w9k7`e8uV{bMeyrQCJEHqWcS?6&7pG6q=jdP1f3N>p-^B2cA;{3z5Mvl
->7;Bhoc#3%Qv0;bdprJ{KN67sl!$QV{q=h^YvO46gkRu^yLN0_{4cP{q$4NMcsox+joK*j)cJjU3H{L
-hbcR;}8fYkx}0xktq1+)lM2gZ}Ms5CX2WNn7_f|hIDgLT34gSP}94L%Y4U9c_qa&TpEJ6)J=43+LAUA
-iut$~R9pQ&*tdr#qxOsyn7Tsq3qcrIO6joAr76nfev_-TGhk%;0KpH?%Z(8rmAX3>^%qhIB)=!EDGgT
-rvcO6jO<I3Oyg%CTxD#ny?LFKLY1$#@3NBQ~i<pklN@s#Lw!t)bAC)^?o1u?eM$q=j`9ozpH;A|GxgI
-{ww^ypjK>nKu*BsfQJL413wAe7x-=9mB8jfZGzed`BE9D24w|Vf@TL52K_7Oqo8v^SA)80d^ATj*EP;
-scdeK90c~$>kk&vYF;GZ*sy0jem^PnE<zLzr+GE<EwJn2N>F?3sum4*Am|>~m6GP_^UC21JQw7qUB6;
-d8U*;d-pXI;UKR56+wH_C#bgyWxQXV%n5mbxPv~#sPv=!Rf!QTcK=vL_#>p#-BF%*P68v1b9sIaMF?}
-Z%(-HRDBkddigrQW0N=lh25XTBGG-TfZ+%cT|})qkr0JpqLQnxM|qdX3dg)V-<y-tbV!@Q~>t<HB&TZ
-yv?n?|abqi0{|FCwx!)en+uy__p%v=ojgi@AofiSN8cm;2-5b*8eg8*ZhzApZ32i;Qj#bfRun~0q+HT
-P3>#Tz|g>cfklCNL9>G92E9wIXH!jU&3Nr3ty%jfQ4ki~FL-<K-e7Ot5Zy}MBt2!gUaD(Hsim$~H}~z
-}+t+uPZ>n#e?|k3ozHj@M`hMYi-uD_&(caJBZ>HZpR9Z;^PXyc_IFDMTYHE|cH5TnmlD06>XT<4}bwN
-nCRJy-*nC}SR(Z1t+Q+%_1&Avx{kNKXbwxdc{qjS}_)VI}l(0l89>I10eM(PLZhv`S_Q}pR1e>3$(`U
-ObmkThRS37r(`9@ZmlK-i?Pd133qc82W<vw`PlB)z-4+FRX2JwQE4ZB{Q<FIRu4KB_)O6nXh-eIqIV0
-^e0c%NeTQDnFy&IKKkF1%B(WtGbf0wz#WY?WOJ!*puo}K%h3z5NHgH3>*+RFfcA?7`3|xf(`{8rJm>{
-^+o5YH@ZyyQ58{NLv69E#+}+@Pfc5mm!^Y8Mf~WY>8Vj`0yJ7`n~l^u56}$M#8F>0g4*bDniS0>O}Zv
-qQ$T&zJk0{lV$Cy}rJCiMRn&j2)4ZiwulYdpp=Jy9WIHu`s5d)AvVM&Ev@@FX8k^>_rjpv7YO3c<>q_
-$9QtPR0OSPbbR;BgU_8_TWs$Hl3P`gKaSzE2G(XwFIVE15ch&nVN)EGJ<bad#rQ1CK6G@E+1ywI7{w=
-D==9QsV?($M9ht3ua=t_!U{ANc3_=lSRP=lSRP=lSRP&!7JTP)h>@6aWAK2mnzTaZFy!OYaS}0001R0
-RS5S003}la4%nWWo~3|axY|Qb98KJVlQ_#G%jU$W#qkkd{agC0DjXXZTjK{ArKyw2m#Tm)QykUP|c+Y
-+(@b@qE$iBYL{J6+4e?IL0fO54P$oMhpxM;`%rfmU#sq}w18mKLLWR!MJeJ!eKO&K6wp2>^#0D7Nz#J
-2`~Cg?{qdo>cV^DK&YU@O&Y3fFi|<$^7zIHv!Jn=RLY=_>d4&J{uNVG?O;|Tf_;>pD3+fDk?HAm#=qD
-A9CFKwQxcr_69i{g?^w7hK<KFun<-vy>KY7UEy>YJN!H4g=|FZ1t3}?KI^DlqNcE_9(GZTNU=RYv>PI
-yY&OJ;i6^Y)onvFC#`=fZRD)P*zeX0XR+8d>~;IQ&oI&xhFa=AV=<!t#Eo?Q?vBaNpCZ!q$T~-<F8$5
-+(|nDH(#$0D;$eT**c7W929@2=Vt6K``TwF!&TY4Gf9XMx;QDrz(*t@%VoDj8{R<G6>W0Wr;y}bq+ii
-8iX&?hXAx0g!`Zh>lcDB{(le6;J;2mcp>G7lP^>5U#7tG?)rFxu<xcbVI0t!%gXP&N4W>;zLJ+ITm^q
-kXTo{l|79FZsL98S(BP5qJoP=e`pcGZK-Nd-tB`^98@^v&c}00Cyfd5tZiJiRIrdy|_b+}J053seZsT
-JiEdCzcj336t|3CkQTE!3!d4PQC56`t0hl}jR;n|M4x5-t9Wx%0K%%6z{L3VAD!`03_6GCoThuHN;it
-KVE;LP(zX6P<m4tt#r8oU~^M6y3V4BW&vwGH!kKoNht5{d}b2QQIB`;_bDh;8#>Oxmj3PVI!3usIY5$
-YhaELZmh+5HYVou*faWJZY^}FbJ;JX0LN<U8W$Eg_k=WdfQqYVBK~#z;A2ZCWq%cEpk|KT5prp!wzEJ
-GZ9K9CuMTXwJ$(g1Cbf0#Eor!(n`M@h8<~vDwP~!ew)GVklY5p=-unrqyAg~_7<Gd+GL_Q^JUT~lljg
-(S>5Ego7ZE-dh9YbW1e)2G*7x!x=kjBp<Yjb#GvUTSkrAU{s@YW6zBO|Uk1YW=g};ncZqBZ)k9jZCJ5
-qhqIB7SuFC{qB3@^TtDSBdiO4C=qi>JkFM-l7DYEetfQ58Plu!9w^<)oyX(aXmvn_WTB(g`UGXXmMWI
-MfjID5*ZjZ#*22X=G<w4)R27>NlgOcuFR_vfCLjs3Bw0FUco0-DHHdO<d?6{-ZD*dK!YU4yk=7_Ze!8
-vSGsV2!p~5q<|2`WVy(y@S3@hrU6jP__76ls<nNS^>4o<U^?rIRZ8D>M>vL0JMN!m?a3gE4r}a+!cqb
-j$&U1YkhYFuQk!fJ=o1TR)$Nct^3f>+NMHnH$>*=>c#H=l#dl_%_ktaOe!!c8O6B=AhP1PW-KOOFdW~
-A{fW$Xdi-RQpWK=6Cl&Dexa=oiNOwzjNeiU;3mUhbMOz-3d?J%R-S*Wss92pO0A1!Gm)&S!a|v3~5+G
-Y;vIlZZRqt~;fJ!ggE(oLph&)TTorZjBZ>s3sj|5i2>1z(qmj~%fJv=qk8a$6=mjU&JS`~|{UAL`-EO
-l5sKuv9o)8KNaeV!ay?5u?8T4`X@^+#Fp>FQeoO?0)pT6NnK+pv?qPHF8bfzL@GgE{NcSzs%hy1LB|K
-tLwLtCl<GAXqSsO)o9Q)e0zHAA?cb(XZ=O#a%+)(Bcxs=(Z2GGMaw}KuHVz3jn*?kwq*47O{v%Vd+@g
-t?N1<Ysn%ualc_1<{`T1?~zg?wqNti_d({h-vO|0Yvn*K2o&T%Kj%Q#A<(xB=v5BXhCp*TP?!Ua?Z;5
-|-yw1x_NUqRCa@By{Fht#$d?2Fmoj2xi4VF8$neN8WcdRA<_YjKRRAi4!DRf$!FkRXTUcMcF&yt^sOO
-(2b=?c2xJV|qI7<K@-f+&}@(cjlfuJPdT&UYF-O67})Gg5Hx8n&V$m8bdwpw1Moj3d*C=e1M{x*o;1~
-f=uR7-#g7s1Fc0p_#J!C4Os{t_b_{3|n(yn3M#o9TqCA54T6mlfnI=E#i$TAEn9Q&#IuV(l(O)=psMu
-5NFn%!2$kJrKFH^&scIi&C@^64@=*w$RjUMjFHX>gE(ltn~?H0Q*HCa^;3g4Z;STlCD-i`PfS~>$a1v
-SXtpKkV4vmnE>>Ac$L*dDRSgl=bRLris376Z8GQQ7=$_WZS3U^==F@)&^dfxAC8)8Vl+K~MC$IS7+qP
-At%#Kc8A^t%M`d?Q`8S#oh#c~VaKuML5t#Wx$n2@P8i&-A+aDl}(2cdR(}Lh7JHv~eQ{x1`5L!xhFjk
-z6m6!Hn=0m-@UKUoCdvIQP$_f;xM*${M46J51J)OxAks$*j$_j!)@ar;lg)oVAppSBP{u&gZiE+$r;~
-BCsLjrMMVx9|Fp6}v$f<yDXaIQQ6JoO+VW4mtK34^+RBI7ij$k~5XR<OjPTvAq0Vo|1uwX$WM1$pcoR
-!(pvWIggVF4zI5MYsJ5GHXp_M{x+t{PJs#vTu8I-LG!4loc!xf|Gz*j(4&KW*y`W+zshCZcYG7VZBd+
-6ddG5yvsleu5c>TfJU;Myb)V7SZBtw%-V1kiJkmcMuMa^AxW8>*vrpwB#%IuHp<If(1X;$n|gUX&JS^
-}dcWGL!%FTary_Gw%8tJ+lhbm~u0TY>SP1)BSk_wu#%LmD;H(%3`Xlo#X+U1|pqb6REE=c6UXS=3V2S
-Pnjuil+$qxW4&kIDdCsM>aFzgRyvNI6A56NjUh&~%raddXldx4<0F&<85pTgI3{3|OHCsZ@}OLk{hr5
-c3ba5);ami0t+J(zN$QI57+W7|cT^@Fm;Z8+DV*gP5PbogN8nPlU09g)ap8RWR<>H&kJ>CeXjj}t~A?
-#IEat3C$Gh`?al8I1BN1j@Vx7xT~#`s!%DCcvzigG?ZsUeC&~BlrIRATJ9}q*o`4MJx%NaXIMw5WQ-Z
-t6rM`;*<{<6qgBp#zdH2MC?f>#5CgqSAvV(LRi1@a9M?wZre7`Tol#(q#nddne2sr1Z{NdSfFpLDr~2
->!8>WxoKjsStCWdvUn7SP8<F-+P<I;r9YW#C=(w|So0eYYZcv8HY80lA0qN=}L<CJTi8i|G8{>6CWs&
-T{7G#ot+RO%B83SD#*MhaQ=(c;~ksuQ3ZSj(~CG*l+SaopCTfd3%=Cw%IvGa2<z~9dskMA6w7CKm|fM
-wb}fvuMG>CybTKOWu@f8LwJ7iFw5b|n@lySG$a$^;N5*RpZnD-+iJ6l`0gMRp%3KXSH=%E58vVi};6(
-SVB)GRXuqL(W}^oUx%fw++cFtA#gD2Nq2BDj@4;&w_V)$7D8fE!g?1Fe2n+H1Sju6aDAHgFXSsfvWC+
-@H9xJpG?BEoC_I9;Z%5N!_L(KwNP_IbttN4e-3Z-h?7+&!usoKm0+gpwk;5keLAbJOg8fZ3G<1<<Z%$
-xV4jdqyrhqf34H>oRV^Gf+8`LjY6Dc&Y)-)dBzkKm_lyE@Yo8d}%_uEfcH`>3vJnGaI6Ly7!D96*Jar
-;VUEIhC9aoe9>Bd$}4G@aqd|5qeVH$$$9w=Wz3(g17g0x_Y_BBS_EfZ0<UBdEr(D9fUPSb&@WVc;|C7
-;(A*PgQLSU3g30r!cZIpC(s`vGzSyFFFr&%9)v@wRBchanL+vmxmM5~a0F1h-}JsM8qrDnzaFg}zioj
--7>L1ObA<Db40%HjWgYFl!7lke#&g6pHsdbz4&u$r6TO3C`$cD7PkrWf%_}toB&h05U&#hha0sN(N9E
-bhUycXo$^bN!yq>22rFTR)8_dxz!9L1~XwHPz~f?t0Vt{Lg)yd52^QR1{)wzz|X2lKoKAz(<oc-MpH7
-1p-#6wA7zr13&OxH&YZ&_*Lgtx0}+9qn9NZPna34Cgkq!eC_ei$>9z0%tj-g*pc<Gc<1Aeh=a<^oxpe
-slOhON}%A&6in)V%PmcY{-^aN1y+Vc^cVOY6YpXl2tn!<Pk5Xg|&g-fHH*ict4Fn<6E$}nUKt>d^zpu
-Iu=VM9iY9GJe6e3eO)b{>5Npy<z&k%?KtRM`0BE{0OF@`o!H5TN{eOYmENPlr6NUY-<f+!i38qV5m<$
-p__rsy|%R<yT9oK*dX#){!6AgB<g29XiJxsPK|wayWpp@0McHSB#6(aXEa8a|zZrwipJ?RvhXMUP!w}
-CRe8wBNI(T0&*k?=&l8@xW4aX>^`I`!$5~nTXcWVw*hy{BNxf)fUZ~rq{-EeI^g1qxbg{ruM7d~UHY7
-#eCik9KF~AEp2dVnO-c2V8=YFJv=$9rUTE$@8D@KR2_(m%q;<f!o>cA%lrFXSLfy(7u?EF`zxx}nIO9
-7X*%5HJiq9Nkk{3t~yKoI$L{EWY<GpC9MIucB!1W?Im&%4TOk3hbu|Ht!l5<;Pe_`1m-AAH+H!WY}1G
-G4x8}37oWJ;vLM~+K9$Fy{rZ1$4x{5@UX+~ZmXzPb<j#97Coc-b9Y`Y;L^_du1tcy%CnBaL5y6e3omS
-fTdn$^)Q;=F-?BI+EB<`eH7RE@92W8FZmk!w@3t+x>bIh(!z|DCI1|p#+#Cu>-iyBEqwi2=BiThVJ4K
-IEpBN#;ybq^+vlx&ixPIpELscV^evYRXgM-&9SjKYm>Um5|Cz=*#qH)4ld33$+2SKUF2kde1^ob5Q*h
-ZqzW9J;6zzHsVf-)(%@>RPh#EwI4?;-Zg|zE;ruua(&Q>en*k6PLDoSF!8UpWGCeMaRAe$S1hiR3avq
-!&vP?kN4UqdlGGRgq)4f5`1IeZsHTVV@^fc;09CGsCRt9Mn#y{%NTrSprQs!<6q7dS%Lyifd3M(jLFP
-aUI*b0KJtW9BhbO6L}4>M+YNmRGZ-hjLhI&2neAwjH-inUuOMH39>hjqO;w*jVNr!Nmr;$j-S0`<r4f
-V$`m7X%)+2!Ybh6(+UR0_;&D+mQFtqN{<Ob%pAewUfE_o(2nm2QzXjETkzm0ato=AYx7fzC(`YK49%`
-Fe=jlk$z}RwAZYDHo;F!_3{I)CEZ?&rBboUq{ymeROV*{Q}oTUUN5_i<;P&6k0YC7ZP2Xh_GQQDDQlv
-Yu{!{j-3_qzzAf+;2Gd+eVlP7=_i<}6Ib2M>H9l_fM+eN3`qhNl#MD*%z>yNE+iQl}mM40VLRVZR2=1
-ofB&?t8l#MNkMl`cVM9Yu$6xq>mtrejG>0`)8{a3LWQu8s;V;!39flCbUF0xycOaul!nDi<}^0-run9
-Ua$gzKSpR<j9&l;+%?i1$h%PCAQ`bQF-5fqqID^J1(k&L6Efe-g6VUZA&xaBic=#N>cIA+iC}#!`<3i
-5F-z4O+&jbu&b9nK{n6<Lk}hgfhTZO35yfUSPCj?`kz@rN2oQj^+MT?L6u_5(XHx*APsnuftp*r-2ng
-@#kNKy6~NLU-iC6GbHtkQ{M2Mc5STG-Dpro!mmXcCW-65$S6;1E^;EOFw>Dd%+$=d&FL!`I{_VObHt~
-|mzl*Vekf=?;cLxMJ81$T66wGO_nm>2eZ!JiSu~8d{?gDsB}45uC}y=kCHNmYJ`Hf>C5_}`<YwO>qB<
-B~OGEX5BkJtBd5!8$Jw9JX((=KI^lU-MY}RIWOLkSchGt#KI!SuzjC|hRfoV*3c=&3hnn%r0j0U3f?5
-W5*Gw8A&<O!uy1+~;3AE~^v`aOgOAoGw8kEDmPlkHfVjU%m1fp&P5RP`Rapmov9QsWeHrJkUOe?gS?@
-eqoL*Mo-oKQpZ?;LOu)rnRt&tuMZV3EC4nKqL1S<cx+VC`$XZ%jHt@ObE!v=Bj+$0t+5mn~4^g0@)rs
-;M%9w;qo!;k@SKWaC1+5t}*<g^BrvFvhhr|ny3~Y%LLIdXr>b(W-V?-(Yi4SfoA`4U8iG4B|w|vpgka
-$ti{bG8cBlw3qd~t9cUHxPGcy}SUV0Ay3y)qyP}Tm3%oTAlz^H-_WlznjaE;O!!p5i3&7H!6~v>^4oP
-bvit$@|<q1?mlr$K`ml19|3~aa8x!54qf?y)8#T_TF=-Uz?^|*5Fq;eM`8>MGhcrcp_v(1DbZ7k_k-)
-EQ*f)+@b43XQY8-7>e;J@g^eN(w=6OIJep-}&CEacYO*v(9EWh4Q^Rl|lW`=(43>q#v$+)YQTEmU2Cm
-PS}47Baga?SDlOxL&TpN+l?g+zdiKGaP{ADs!a-WmtTh3XJPi1}_KJ!2m98UR1iFI9Dru4a(9c%B0%K
-8W1+OWa8dLJgC+Kdoj<$C}RExKEmb+SQx;s;_wcLZ8mqO8-#R|P~U9sO6N)fWZ3W>Zzl+V=C$$nB_My
-V0m0k65Q^bLQdWqIo^E?&4a2~mI@G@Jfq+_gO$J+uINY^`m{9W`8keCerjP$<4Z|=t77)z#tM0V;!w=
-Z~;R*-tU7ex#6_ZCT#pH4#nf&C@{Nmi6V)9vl9Fj?Fb(t7C0)_ZXe<u6Gvs;S8MQtEHyRR12Dijorfd
-Bc;S)`~p;O-KiS`DD2=oG%IFS13;B#70&!Z)`;83RfzPCP&P$Zu@c+i-meL)sHc)e51s;=#_~R8VU7U
-xG^Q`OxE!;Emcxansj2j=b%<Z6idJ*(QnE_gPsx>8~>I6^53~H3dqG8A_*O#8kg=Pk?O34IXaCoCA2G
-zXos+<J3kg_M{dU+X5X8Wih1MVj?+QM|`d$#ktL^9g5r4UNHKRE9J<I79v64>dVuJ0UnQJ=^*k%t?tn
-kcI_(=e~k4c&};?XnMxKnXK6++i6P!(vfq7m#XMPWl%rpmWa9x+1VVRLc>%{-#pS-x5yk9v=PH-ui~E
-67%2d@Y1jisPE{n`Gylar4?XnjzTWoBW^tMFP%ipWx!V=q&xf2lk06Z&(ZpZNX6*1p)0w^J_Gn$oLgR
-mZVmVoo5vDIBOyBozoqg>j;Y>r{`O#ng{yBR4@9>@0^osl`9)@=>vT!D!<@<dBKF|BSaTEHG*`yVHcW
-7<fAtTq6nkAnWRRRK}myl<>Q(7tA~)}{fBFCrWLAUj5EQM&;KuzpZ*YCyp$Kt>w;DAQ)b?|@=14z&kU
-n^S;6=zb7gpme|98r%ToF-ef|kx8)fRu-0|A{CkGdv0cbxOc39GnXS>N!?jyMlBhe>fT#^Eg)$dPDXd
-f(jTF{vhI!7*}seB++A|dAvt=|2nw4Vja?TB47bvSKtkfW2kc_J>d0)iq}?g&lfU~XDEx^!K2iHdt{4
-GiLN7Zz$Mwk^jsN6(77^RpW7vc(<v?!cLe`v?r5B0oeg?U6w+v}hPwcD)#dcbdF-7yBxaCkBR+}xZE4
-PbKckG{-h!yIS?~d1%kdf>tbU23cgFJHO&qo>rpR3zXV!p@|+<y8AXs)2t`N+pUvL6=8Yl0a-g(>jnR
-=UMnBcG3I?>$PM+FPznQhS#wqv@ro$;Eq}nHgA%fZRSX7=c!@B{Cpoc4?LmfHw;2jub3UB5hDu8ER*Z
-5F2V2tH0$|aJ6sllaDGtm2!8A)w{5&Sf(;dZ&j{UV|L|2HI|`_QTt56XMK<-^mhSuzBYBIHTGA`zV2v
-R3^|ggyV)a#kn5;BJ+YMxszX~2(J8@4)Pn=+*QeB-DdM_s(zGQ|Q1D(TM9S2)QZ;sqa-$j>rc8$_FUG
-n@t9_|rXe`iTPqR=D{P-%UWtdg~nrblDM_R;n-NUq84CS!UH^a1?IAj(;ikc{{JD62rmdMAN2_mwv`|
--YqOi-*374D5Vt4xEK29o^`jG$C!Wc=_$dZ36&>Y-mU^|LW`C~%qTE)+vcc}lVX+pDYqGvA4%sjL7tn
-i<fH^RycP<d+P@5(oKWMiRsdAj7p>0C}2$q{Tt%XYgiZ@XCe(nDvaNcne%&=rA*^1yHTu2I4VrZ`>rr
-%~<M^cmaC>L^od!x)!kSMd6@5>>KY52Q7hc5GvXX4=eml<w`Gz(MhXX-kCh_44YG)YhPrxfxdyFqDx0
-Jqr32-DWG*m4rBXEdw@AzI|_Nk^e#aulR=y5_Sn_nydIBTsDu#<L}r~<d#y{YksGaaxtW^}-eG;WnK2
-_7c^sso)Kj`1AUP*&$jwYAunZ+jCT)=P03>N<8L3Tgjy(#UTw8+E;+ZSCwHx>M&FgF^OJwz;+&m9w^S
-VEaxVr!IA8Y{52Uhl51R+^{bmC!F*E3j`>g*RZClv4~PwmCLy6u5~pcN(OKGvM^{V0B;Q%O!$DeDy~y
-C9ca*{(bn&}Wa23xt)-pQUk#`VSap_T%iAfVVad>MQercgT@9omMo^RUPg!Ga;t~T{>`cHPmTBgD9w8
-Almooz>_1W58dZn!o+X|^whfFV2wLQ@uh5u9PwG@NU@b~HKRbM+kW{L_T;aqfuqC+%N$xuspa?F@_2Q
-86B<@b50<(R#m78+D?!f{2u#Hii_uUJa5_N1Yxy0_tMM`kS+Kp~5HC3qTFpk5g`kT|fM66k?5osm$KF
-JtjP&ZZ18;IYLe_2D-ejX=4e7xwwO<D*dMjP+!V)6bdD*p%N?*ZXMP76wc3`On*`y*5m+AR;b34jZ&O
-X<T1_@4z$Oif%E^@Yiz7dZ@3W4<t`1fsZp2@!lbzIOYV?ZDSCIjGmuOC&R<GQWq4b()p22k_{m1sMn>
-w*A^xq<L4=ofUhn$E^qhRL^(yD8nJ$M@*+W#*jWbG0&~H6U^6ps^<q$=>h{GI&4P<&AhO?hGYYulF0<
-)ZR<Wk4K~<YVYu+sdd>Xkyb^$kg<*_-+iDw&#Z5hUyz75YT~${7pAdc4W`2?xbrAyfb~}H%Yo@>L(>1
-1NFT}4lXmehQU_svk%S4`>6TQaGuzUm@hz)BWR4XE%nePF!YN6k^||&Rs}6U-cow_ri_!N1kP$#Rlh*
-u}N!yqf&k0$)NJyx|0G92z*JAZIM;+#0kI^h~m{o(oy!<oy7IRpEsf9-4$mBLeZntZnpPW*kv>1X@<k
-BY29Gc`vRwZ<Dm=QIUETDE#w^hB)#O5g=bgIo(wcokCmHWdC8o9}GZUK<ygWT5$(kpP0O)!AkzH`}6K
-5#NUDo2KP5MY<NG6<{V)W<CbG;D!bKH+sHpHp%WX#)94qgB>-1b0KGao=FtY{u3yK@|w5>b9e=32~U6
-!7t8j6p>3om^6QU1Qm@|;A$;E{(r`7XW?ib6SYeBZsZ<6g>NwRXf%B@OAsPA<WO%$LXrOI7ii<`myIw
-PFI@oz`_<*AK~OZ2ChgI+QxT+RT5^9wqz}Pjl-M88N|+W*%LHz3;8}y0##yxZ8sAXC#qgQ0K^OkfVBT
-&m+aI2PTF_GIVn~AA*?&HQnc9KTXzIBJWx*MC8R(oGDcpuU)wmB9sRKfAIQ?#bZ5&!6@^E_OE9_X-fk
-E2};A-(|L<h{5I~g;tY2({1ib>z43G~+KT;b+(4&;hm%sJ@B)l9DMN-@M!u^rhl42H80@rTAAhvC7}N
-%mfh(I>C`J2I!U_TiIa<zBY*E_8L1UFx9}v3fHyfI}(Dz4%j%KPBoRqcT@LWKu3u52Y%j^exJjG}e!Z
-WHRI<@Tz%WI^2Wxk?cF*5qp;DK$Gv{QMbWETMprwJbWF77t`G-$;~1QntsdKKF2C%4I*0trRG0u5QKu
-;P09$=>6j|g3CdanI?m8Df)!>2OL4UZBKLsWe2G)T`PpJ%wMF5<wzaUMy6v&Q;j%^j>S;qT4TN8G?kx
-@-31&!<Vk6D^5;$u}S1iCvtuUCY)P9RHT<y<PU>PwfX#t>ysoEt0vJuy#02B!d^55`X0Lb77FIj^kNb
-}S9i&)UiUUVA3!~&AN;eD8@yKucD=J(*;*y7%`;$pdU3!6<(v#zW6wO9nb0apT&{VV`!AJPq|SBFhbX
-jvMx>=6)LK0ry(eIS@kp2xb#PD%erGn1|Ga34^HVUyFL$zsT^qX!6Uuls-)N{65~%vu>c&Acm_&lfDI
-XA5jVPHzcJt~m2KsH>6e7X>r|P5CQl+*Wj>YeS<|UEK99t_E%c=B!VC=C6F61llIq?HVpMx{|Hiehcw
-xc0EMsOd}Ng`9A5{E&~zshIKd-st`}=JyxMv8qZwfs#@R|-<qlvcoa2N_22_CEI-CFpm}R;HrsPK#U{
-IoF<p8*atb=)u`S8*EIGWsp3O@=I1J>bsjLi@MG=AzS^yJu70+?#q^|#v|AB7X{R#|C_Sc8dIIr9O_-
-c}o$skdzYk?U+f0vtxR9qx`{UPQh0(8n?w?gbFS3B)uvd0q`r_Q$MVWXBt|NWV+yY}IJ_Fb<gCBt|#;
-(i-H(-ZEq$djz}_RlaJ-v&m5ZuLb5&b$Zrfr&pKIg**)!hmPXJT#MsN_Z%rhZgbB#XPixhsN{JG9DVn
-LZmXz=*;wVCyU@lU$a)nG-`<d3gSP=W~5A?JIO|gFta3+8zJlXE<GKXdBps8loJTXLdI13W+$34chZG
-@iBY_jXHSfxl8ffi;b?bo7v2Gxm9bFDF<ivly)ad-6F?*Zh+n&tqdF4(_h8wW)5%9SVYH6p^{Y=|HTk
-lK8E6**pMIAO&%u|`PJ@1QxK$~$;pL+Hdlx0g_;QlHhsMYF`InhUa6Z~^x6&+BvuwYAIXT9B5~b0tr_
-c~~*8V@U3PrBB)7vi+;=Vb$ZSu=(rMO`XvwvQPkI=rLIZ|ZTQc(g(mhwHBCb2gcAjjy@eSASo8-tVE{
-}=A4N3xIFF<kH$))&8fllash*qrF~=bj2g9<~5awTMqW!)$=t=w2^l?|%2@ih1jB%UX6f$l{DP+1Mt#
-+scO{%mvVP*FGfAvA`_$$&p(fvisw5Kc<;4;!I__9Mz3-WPC3(qZa*z^>8sWPVLZbE*6G#z?f|cPn^X
-P_hX54+CEP4XYQGvx#xxJv4*U$r(;}wPlw(TUxNqvPbBB@DBF@yqCe#OGdTCo$Tyeg3;e&$*Z8#{e2~
-G=o2lE1|IB-dxj;D6&SW@4{>db|7I#m|3M`7z1wwqOJY6=nxazA4*nUaYI=)|WlU@8x{fWkHfl_HYXb
-%C>9xz5FvDP!vC)SpvULOevb|2`a=aZYV0`B(m3?f;K4FMQ8QPQKZ9#8eTx0Zj7HIV3#HXtqoBnqm>y
-&H9OWu!l4zEsM@;@qg8d%x8nQ$nvO;&Ddlgq}9F(-2=Om~0b>n4f!{>n&}dvkYTqMXTC7s{9z%_X5hr
-#9MDk@LKCxHZ#x(<}lI1{Pll?ggdbZVn`qTGuo89`BW6EzcHXRYNVrP;gmIq)xmg#c@~o#v(>`iLlKZ
-L9}=o`loiD4I;NLi`feX6(eIBmqNHQq{RR`Y(Z_bdOujQNhDI7N?b3A!$Q=L6!dJf6&n)D+?N=|MSI~
-0jL8#|qDB)fxfu9Q)Ka+6<+n`p*`bHNWgJlr`4!}s_KC#+6{gGK1vBSq2F&c`H)-o$pB;b1=M#i7JS>
-Dwv=fd3CLp!|ZF4v0XLiTO1W7Bq{#xR+I2BiR=l3+0-cnmO3TgmI#AFIQ_l#AmM2oh+}JG<DmXxBYE^
-3|b{JnEMi6?cPw=|#p*kUBtv0491P`Iz}Qt<02aEM)~QWw_qJ?97cRRVTj%l$L*m8o$R=^KYjMSJU+#
-?y8W-Y!c|=3W6fmqub`ZgoQuLNC6E1o{zWz0EvYg03OKmlZt#a0wir#K+g=L^thMNh%%Z7zu@@DQ45#
-t0}2U_T#Lj(7XuIHdd<D3nIayS<)Ocf2Qn9YcGN<*b-c*9)h|zTK6jCB+Xyk!Q!B;-uYLTqz`VQiq_u
-by44tc9cyZ_nilK6bA2*Xv;u@KQCl+RO%00(qcXNeEJzYbzr3JG1b{{Vxq|2hW7w4SbxzrBzWkP+CIh
-Fuv)@?uj1J~0pRSWyESIQV%9nIZLx7mv3s(&^cu}tlC45aeF_x6y7tS{`05kFrv$F;ARbOz8aa$JrSc
-X%U3Q_(f2PYy3=qw`H%?y}LRk0w=&5%7we>W>tMzEsR|s9X6gK#Ju6@p;yw!&AWhnZ#Uo#aU4(vaQ)i
-XE4Db*a?4aVP6Lb#Yk1%iYrvV>;k>GW0^%JzP1{>X2nw%AX5Lqz*lV(Y1W1nEa;d~Gk=OMzSI~g8bAx
-!93T)ta|IB|<9TrcS@1)CF5E9D<_Fz|owF%MLF+KnGwOpj+{zz=&di~`Y*=DnanVSuZe=g+Vl~Pwes|
-j=#kBGpq|uoMkTJe00tR76E6}0<-#eSiO+sW3w+hvu+fwg9a523ea;f<f#SpH=bUK8>cI^r3`i31Pd9
-er=^zB~ah!@s)j>6nfSd({xE?|jc(TOT(r^k=5a)T~PkDwOe&@KwqKRUH3jX~wm_9HlE=vSp>(#=Pb1
-9<ZhHh@3ieUgXf4zy(@3|v#WRg3;<AZg3ucm^CV0vs=Kgyn={umw;|&jWRz%(ly=UER^Af}`p6tZLj(
-S7+NDs9RnE!`mJ8DB1L~!8U&G(z~MuWlZ>SOLx>NR)-lC7g^QM24Jxb&$g2yJEW<dN7a^;aFP8r^sx(
-0qt|_j?WzayvqKq1FXy3!5DI3J9W>`Q#u;#5j&8VB5PFL2Xvq|-BPiQ~C_2}g`v8#L3<Fd`ikx~&xX2
-PZ^28V~*$mlVpNG1FcAMJjfEL8A0|G}6wn^&1fO0-Nr`7~K*a_2B{cHkm&f%_{Y|LuV(qL>4AAo*J7K
-bw0)lPOWUn5&Fa*SSGtUk)rz1h~4z*cGu+NceT6`)HOfRfF08mroUS`2LlNO28r&U4R{#e)`S#}L1FP
-#2mcG+?&}pQPav=+s^WI^ZfMcZWyFq=pOdvq9Feef9-#l2N1*b+wRrQVd-Y=(m@1!G@SqP$(`avMA%2
-Q&bHD%RU9M!E_qE0>O$bnAFWmNC}Qq8B9u3k=>xBiPn@8;**A<KCb7q7s8sT_FBs4ifh{aYYp*#e(~*
-H5bY^HU+&qfewL=B26Cfv*b0(UF=_Fuo!9xJvD9Dz52QiBs0=SFD_aGsBKqlDaL@BwbpOk!86Njc?QR
-q&cmxE3|Ng2zJoa3Xhw$N>fM48Xg?t`(cEDdJ<c9}^zb^Re4R&b1iQ6m1#^LY>IpBw9ftL>aVVU4b@u
-v%adV_6Um03<9b_=%;|9|Ac9Y`i2obM@zl2iB>F*b!`e`jng&W87&#cBOjpsDEBJ(Aw+>p;e=r4>a?P
-T;=@c8%N_SWJ=~&j)twM|M1dvt#^4$tLV;(?-TQv*8r7HC?#?6A{)lgl&J>&l8bti@>(aW`yUL4g4SY
-_F4AS#Nia5>&W*w_p$GD?){u|A4+iU9SP38InKG~&?cJX-0MpcoO{_&&b=hbY;TTp?j>{;jdO0a9nq&
-Ka_(3qv$IjgydN$Z%Dk5iW!{73;dXqPH@x`nfuY>{3SM^b3VJc+-1}nS-WLJjG|s+9&>`$Ql_tmj*9V
-jAdk*q~bDV?uo<DgXKMGTSFj-15yv9bLkEUc_t%}vi6jyu15E^b)rzn|fiz6)AV~B0F#Q?9I-KNoHH=
-!0R6A8x3fRf0hblg9g<&?>7R?<Ry(?IQ>Wl5ZEV65)<@X|fY{#5X8%y8Vo7x(EH_=*JvlxY~~z+HH<Q
-;uBO-h;c29dfkaOdBj%L5HM%F`@W@eI)_o`2AX1Ad>U*PeAfrS!8iOHT|ieSzPz9J-g~j=3p2c2enxg
-8?>rt7IVgAUfQBJ8pd{t`i&NGjR8;ng+*;7>X~Y%Rjs$C&$6pOwg_?Tp6Tn3+Z0yZub4M?h{HOYz$J2
-NR3aVCzD_hegcp2?12~43e+}A=9?qx!uM-PkY;!7*st!b2^D4Z#&0lvzv(y*ZX|JvT=>=7-_8m~wqPk
-iAdcth-Y@cH$NcInOm#p+&Zdnbw&tibB>c{!~$Y?4;$xs3PDlx9HyHgQa2XSZo+Eg4$F?1E%=xJAWc~
->sJJRfu)R1Z>)NNuMjapQJx&4UZ|R%Imc%uLeQ)3(~6tX97m2$192!g%<FU7F<Xki;1su!#1KMv`ZC;
-&JrhuMz?+t!A(6uu`WP$f{U&wKE@K!qlPc&bM(lwqrJ_W?c$|=jVA60YCXzszdd<+nWcxwHgf>D+77y
-(lsq&_0MtXf$lsFPpM{DB9EkQ(Iw+2{>ZHcUu0pAx5k^7?yEkc+?xP^0t%o2<t7k{i)%8H`HY{)dIMz
-X#ViF<<!M9kvLSh{!8|#TXUt$8o}mx2VxDUf!xD%Tf9geRM%Lx*WR7n8!z#Y<U4w#i>AX*Y3Dqn&F{e
-^@oA}JnOiVNU=pQiQjh{p5y;ux(x>BsZ61RaXPp630&!(VXhmtK-UYik2s|@5>Oq#j!zC266zjTwI>@
-OzY_>E1#mML>28;55N-bY)Vw9+R`A1hWPCzP()q-56^Wxdg_Z;owatF4d9dP~4fD@OYxJ_GtVr{W=8?
-TG-PF`TW?v))9{fTx#W*W!L;`sR2aYk$Fg9dujh=j^SlV8y4(J<zYyZ|VBbPRYvH$`vIU$^>uCq(sRp
-eI+&C%hNTt-@QMWiOE58lQBcf1%i>{`qUPk-U?DNCPJxyhf)<0XT14Ec!jc{PXYIXRD3E6rhztLXq6t
-0uM{mEalyLpC13b*zph-d&>)6(rLaRuVl^5AWqoV6u@Xc>y)pJKRLnf+G*LZidU7<huKYXz&>O@x#u@
-qV3tbl)1m#O{P38=7W3>T8c>0Y#^f^-f#mMNk>aie{s@J<4pv=+++1Q~iI1?RisHz6&T0NPveE3RZ0w
-);jy}Up@X$*cZ_8KfHw?i8N`04p1j-k?adL^v%#P?-@JUB<n-M@=^$<|`hgo}@>ot;j`W2P`#t<NGq=
-)?t6x9xtGc_H_G1}g|OcMBBeZX^pj<%n5&Q`fJLH`XIQ*X%QX8D5?z$Nt8AjMm}gRI<yYf>HmKAQv)%
-ynm1&*@<Jd7ijV_w75v_O^UUQna)y>@?!injSrTu`T-=&u|Sw9Wd+t?IwYH7ZwYLBDE6Q4(`E;!O;p~
-oq&RVojWCiNrrRjt?lR8<01zk__<@E>-Z+~`-K=+I1@k%-4=lfvR{A;;bs?#)^z9uIEJ)<7xh3x!Er3
-*PP38}p%fchHt6`|*<_25~fB_omN)OOh2Cw~-*FhG*nnr0^iMXcMnS3w_kpgtRP<#pner@78={k#}l%
-tT7HVhz=L9zQg#o`B@<>FQt-u?ke^nOYjwcB;ue^%leYX*M(!GXj|M0c}S^l^$wr%~W}FlZtNwD*8M_
-CiwZlGAAB*2dB|4zM+*dNAwo16%@8H<b*Yv$}J^(7Q~SzxvQ)T@o&Dhvd>eRmZjQ)&sa(61LMzlf}l+
-lgqUa*T$FN&0V<VD6WmaWF&AfKzi^XM<7yI3(=DLCCCC_mdqxm9+;2;heiF&p!|e1N>#nMG>Xr2*Z8C
-RQDmbn`xEP<b{onZcM8HPmbKgKuo#r#Uee?zA3@6KUOWn*+3558lf8X|l>zew(&x@+=ZD9#bSU`YL9k
-Q*Ns47jiOex%1CQ+?Gb!wvWNT<M&!icNG=8WZX;60aqoWGQzb8TXWhaAf<%N6)ITNRvtKc14H62x+^J
-Mpj<=N~=`N#Bd4)k~{Kkl^ZIO-AI%4XT!Uy()M!~9IR+{pY)z9;YumB|P9B&rUt;s#BeY+uy?VWW>$<
-fkoUJH5+_X2))sv?Vu@A4p+FH50lwn1xJ0-u7_zakkadR^gM?hICoIzDF->o}mjF-f+1Q-lho|O*1aX
-&@69Fc@Ze1n=ymhP$EaJ@8QMZrt@Z!y&4kAyakH$Ua|TL#!1j=92ejzXzVR@tVe+)5Lsj@HhxuL7Xx<
-pRx$Dn>p|htBk|Uw-SlOVoBb9M+gz+IQp2hVrx`yA+a%WDXoVz4=I{nr-aD=Gj7H~W3~6xM_Z!<vZ2j
-n*pf+3FA1<%aQb~?>7~Q@GLi?Ur?pLQfb!8Dg29$fGZl7RK?!bp7ILuG7oVxAi8fGo_$)!g@?f5rjWn
-L9B*{psQw>umuk&Tx`{lw%1M$AM3^ysSbS#;ZPp5bE2Pmm}1vh-$H&GCK)cmMKgANd+MxJ(M~X6>8q*
-730WboYRgQ5kSsDq|t!;}Ne@Z}Pe=RXrVbc<aizRyFz^uB6@;-4=WrTSA$MxEQf0v(2GDvRW0lxCT_n
-OWbO23NkUb#iM1Yy~dy!-z`8&Zfo2_<jB*!nGLx0=5=Rj*$iB6Hlh6sy(UW}eUn_(&n!64%6Ob5`&Hb
-iwq5)Ts(@%eUd1-NP|bWGsb&s6Pc>98D&5Qd?zYmqZsTT|pq2jNlcc!{X6DUavXdS9VqN<1X|%~89AN
-e75Z_dXKBfcLd<F7p+wibGOumTCigy-qZ*4j5tzCJa#d11vyyr~aVm{X`5}HMvV|vNwagJ%HPAFb=0H
-4{LWSGA|$+&e{g}d-iAn{c^Ad>?Da?~F^4Q%qtRS*RllMEUYu)1%6N!l5c^Z^_D@>b3Ozv=ec<NQw|y
-CGp8I|`+ZqR;Og<bQiv#hd}+{dT}=#?j|^EPZeg@MOmj4w&51yZf&1-=!tlkxlG%8mFfOuj`SRMNYYj
-6y!c?4e3u@O54~j{#>h<-Gws+L>+f?P$Wh6>iS1Twexhi$gZU^W8w~GLPI}I(!^03&OCEFZqPph_+|#
-b2;mBB?vMFam>EaefoJw$nMPNwt@I|mMW%&556l5|!$HT1bM4bI&mAv`xw>6?<OTy>gxj^QeUiFU#}l
-OPoD2JbSR-gP2$X&S+^h!%=6ZE{r=Tplo{a45o?%y&yP#IBjqUTA_h357>SSlhToQW5oJX%h=R0?^GD
-&ZO>Yds+U+7416o8~CRyu|!!h)|e7Z_suH7jG}=TPiO^jd0+EzuJvnVMn5uvF1Iz-e&~yEO{!zYF6|C
-pcRea4cicb`_s8eLw|yxA57b+z#!%kb-)RVwkEMg6W>>I<ztdGu(Z_oNmuTgEE>LZi(-_<J|<`&P9&c
-sGJYw(76J?9;5WBgidk!Q+TfxZWcrO__?_DA3&2pw9kwN0GL>{?BbfNEocjv(c~Rt0qs!9f}T#?!xz(
-(GcI(%w%ZePD?aN%I)WM1{xK)v*FR3qs470A?sw-DLoF2x&=roHkeT2y`C5ol55kPnOMuIM3o|O8&8V
-xP?q5MmS7B_oHy>tHCPX!}^OxE%dVR8dpb1DAb_+YCH;&#EZ@@)K0J`R*A;ul%dx-Og(=ZYQ(6KTRUM
-$LZnfR^r+7EQSs?^@o&wLU<DhwA{(J~wND?pip7^?Ew;h|i0ncWneOgxT4bhA`!g%{vsSm8u`q!kLD-
-x-3bRD)@}ZE*iL?)&yG+Y!vH5`=itxqKjH;H7<Z<)^U7xLOn2y3d~BNLEmwSmnr5%qFcyt++NGPK4bp
-6(&eG`bjIZ<K2vlIFT&HSd0&k&Z88Y9SHj^Qp9tLZ6o;cJSvklrm%Y6V4lh0f8j%Y)MODu-Kg5-vD#J
-E2(`f)2nSMn<*Jid?ec?F1)#{*llAC@6%?CQe5yixBekjkR+RcgG!jVc=Pde{7@ftV(VVS4R#oupA#u
-2FYGqXgks)z-GoE&HRlzTY#Gze7ySA#}S3~0P+=X^=Rl$2HgK?<8XrrnM{ta=Yc^x)F^frW98u>N;vS
-W;r-WFy((J~NG#BYKaIn3}9+daVO<Xq0AL+*Id3kqKbtOd>V@rj7G9HpCi2fg$h3Q7B9(c4k!b}UV=b
-PI|rq$?Lyx+ezHVIkDT-_(;{P?G6CZeeRb>fi8RYnu+>@UqfaT^~Gg)(wc~_SIGkb8zIK5#1NCM%3;?
-(;0fujKksnHzZCk#KY9cvTw$QM&=t0tcHV;SqA2jBbT<&W;5T#4x6vs#f3aTK+aF#9os(#bB~;efx^f
-VgL0W%`c2{}9etKLyQg8E3MNv2gqNIsJ(n@7*(l7(rA?scLqWk>D0Jj5<|Rf~uSaQRvS}A1w+n@4^Ht
-w*m$>A80cUxWpY1rFv5Q@Eko{B}FooNBaY1xXjS0+&?7y7n4?x)qi^(xR>6O&`aRz-3TtjL$@U7-{B`
-pw6LFvzR1jlVSjN1{<nu#!UFhGQA1(NP#ep+cOjWubq-Yl+hVag7=_hvSzBhChZR8MucG7grcw>*^t4
-kZ<S(}RCOnDnMux}X6aY;|=5n#Afa1jMyNF;}|NgJvX-V=R8Fz_&6i{_u3X7tA8*sqs5qGz8P5mG1dU
-H#YgI>Mg+>P-TY6ks?E7{=^_VHIj*_3w0w2cI}F3!}V6IKeZ`sJ~R=V4C}v!<e}Uc>JD0_JCs?|)0HA
-X$kpP;7JBL??wvLc4^ys0!exEKjPY)2ndnOi2^hz40PE`Q%zcK{BgDaDBO#9M%J@~M6ChLn*Fk@_Msb
-%JPWls1aMJHTpQ$P%|C8`pLAJW5$()K?9=a{CoXw1n*lEJTM|QC3iI^3FMi2(ssa|$d1b6U=U(QH3pf
-f}%&V1ak$A1%K_pyrka%liJ75nsxo8-vIW3qc!IW%|+HK!!~K=K0-Q`ca*?1HX%sXso=uPpRHQ`T=sM
-zqyc?+xd?0q>e|aK}R7+st?Wm;HK=ZVNw-%H)^4TCw^yE<J#<=TJt*4^2%9b|>Es<K1cba&8Ac^W<Iq
->>Rc?GTY#4_2RW^7!NAz#g8LXpwN?>aDwNuH3N;=io{A_*)bctLdVrQ<buDWkFjZ=i8qop*P=Vsw=%k
-W?tBc(XwouSDEe4pk`LXSfdOB{?lqdv<&pSmY5oxXE!oA8@&`Y9`M{;j`xL~yEV&1Gw)y=!JTV$SjQ`
-um;##_HtA32_i1=OmbX)JEgYWk}#&z@jM8xdJaQ@GSe!2F^b$qNLW>SY-=ZaSsa32T&Ll1;=W<qWLo)
-6*8TPMUXr{Ek~om_wf*Z4!@<sgNR?t^|Gk;ySh-G&#j(y6scXV<APKb&|3;!|iVDZBwdy^)uw5gzUX6
-44}a)?vwgIM^~|O#+O`L)Qtezx`1CurA<55HYNr-L8oTdFW3*O*Y};0`s0v1mTg1I7agjWsyJe2IPEz
-+eoAz8gWW;p9<Fhk4F4(8@icebc`cl4>rJYL&DKCI1QNuwBjb-iXA{V%di!HjJKkIwc-S{;#<l6ZE)l
-NLdEya@9B{n4OH6!Iz;4dBiB6M`bH2|+%K2Hf@`kYFT@Y;0bOQwG3CNa|FnT`*rw{upgB0z{*lWs2jE
--wGZDLsACfCuDzI|`Jn|Ub@^5yoZrXm7zMLlnVBx>us>R~%Ao4bU??@ciZ}BJ)zq@1JnHy+Thfz6l>C
-$_Z5;-Q5PnvxcZwvHBeryP@=<w96D3QY}x_s5!6-#(UuT*Q*(!AmOd%Y|18sHAveIvK@UX+G6&O=$Du
-AsH2N${ir3oY<<C`Mn#X|jX+;-PX<FHLHd@TF3@Q*Tuy_{*o8wxF3)&D81dw+x!rrffme8s5o(-VJiq
-CT!}^%cZ=eOB>_qZn7vAs8WC`k4R|9^k_yO=_17oz2RWJw1MeIF{^SZ{!GH3G58~@eV$;o&)r4#h`(v
-jhD&6ZmL-vov^3DiwG^_4G_4hILv`M!Nl}U238c)F-1SO9A?|Z37Z>7v`^x!+xW}nnQi%3kWon_23Xf
-s#sFD+NqQ!@NrHzo@M_aF!DZP*Tf7rUu)?#PE#oMG%mojRld7xPky4xoD7Ok#~NL8Y@1(Kj=9%YocE;
-d#Y*L`DEx0s+Q5RbhQ*L|H;kt$`z;b7SZxN%wryjzttcpnc5RGx*`rJ>2>0=lp@f#a)MQRTr=rn&G+g
-xCwr9mePJ65l476whg9@)GfFLsdHuH#P#1Vk(i3y_}Q35X42#*U6k|LIlNMHngN^Qq&y{7O|ZYPj#14
-0A(Z!g-&!&IA?*_A>CFqq|o3saw%RoJ8Lg<R2kym1A1N)+HwYT+fx;6N9FG=x=!zfACe#YgDI}m{!xj
-`iL4mmzZK(V#ejBvR|~tnyHmH#slaW|;A=Fq1yO~&DcXyYdvh>Vs@&<(($R!wf>(=7=5>-x>M6pN4Qq
-P7BT-X)y9ny@W%OcoSgp5axdr6b%yTv-zfxM+?38PKZDI&jAYZjEhW`qrCRKl@1WBfkY{u=me;tN_^t
-B+C#?Y0`po8Wkv{DQW*?CmgW9ZyOGUdp;-MkHD;T5~-+D_)PIJ!(-v3qRLDwob{L3lrR2iOFqqnJW(J
-<OTXzj#*Ggo)6EbvUEfqM0UiJeW;<9g`Y@rp#knN@f=fdIOMqQ6Wm%%0-3vc?D%+A%0u|r-KI`7Zl<(
-{!Gm^3Beq1jju!-y%x{e$0;VmTk~LvW<qwuXR=uRCT?VPHv>(ss1L7b5kr5%2-3_bZBn!lDNL-+hR8z
-3O_sQ$V(4*0e2)=NQ2E?nJz|yAQ>I5Qg<rE6T7ag@jm0Hia!>~q*9Jj&hGrV@F6kD103`fj=#_z(23*
-`Qg{v&v638i>lJFn<Wdg-5{H!~@;{d~(SdHh|fl`!lNF(=Dt!O#A{sSSH?TvT_u-mZ%s5;jAS_%h17z
-mDqF&Os^(C^EelYEc#$97|{usy*EtZv{+^!-Ee8f*i&5&K{XQ-u>v`y)@)3h@@mWzci+>GRMs1-%!a8
-DOpDoqBXK>y%i1f=9C4_f3vlV6Tng?UH~DY_+t($ZGJHZi2jW<Q8*_FLx6iaar86<XIFtjh#OC;U_=Q
-OgK)7Ez(Ty%KJ;=)1dOpC%;GMUJLxnr6Xk0pne{o2JMiX)kFYbc>a@7YOU`~vv`N+d-7Mb1s#mZk3IL
-q30N$SIQwZvViH5o;W|;>1ubNfE6(UA9%lS3!Hbe?2$)jO1ms0{)E~Pmkv+PtZb=*;SL(L$4>K+!ZGw
-fjbex|wGE*2d0BvB{fEktd*)0PwkcX}V0xHLY=Ge0>tY>|Rp6!ssrVP>?yR?rPXp*kr%RzeoT>~nd2^
-)Zi$)qSqEyuh2bbi&8oj%z(xHM)q;?l^B(5g7(Mk-~my4<-;05!2E`Xsv@4aw~{nDPPM3OE(d`Z~O13
-%hS~50h@`CwMh;2P9kpne$*N!$a6|sR+1ch>qCmKjc1^=wC@p4UBOTkw!h-JER;vGetf2Q(aG5&pdbY
-^CbBaiL$#BeWWb_;sxNG(FmUW^AZ@dc0VZX`q}=i=g><)Bk{BQ1yRr?o0ws03sb9GgJbDE4atqYZ=%p
-~+=-065!bpuW1D7vvWwpEG0IOMq4^3*M+UExb9=<v@z<8A{Ze@b{NAzDRHimM#M-nnwU<TpvZ#88tTv
-~}`gX-r23nrG%-x|hX;+A~!_aBeK_|?@SuL`FSldCxSx7)lDT!Pen9Gd0wu!YZVr^q?)SC|~58l53L!
-kZzC7jd$MRVb{Kvz8;Pa%5?%=>o&b6AR-j*rFrA06y}eZ2qNR*3x%<bF~l)@F?;Q~Ox2`dF``4oR#%u
-S`A3;!d)-28Um5Nb&0}*ydJj^A=^3Slb}hw&u2wC@T`^m(ClAJN2VKpxss9$S-JC&MR}L1hetRW|@~0
-{2Efk+Kk+2!j|eo55P|Xq!ngTuhcD=0%R9ZEb&;1OXrw+Is(RBa%oFo(k_2#<Mm{um3hI+7TGx4(k&T
-9B}-f*8P(1%`GtV7CE(hECQG)p@aU^Jj{r}_L<0GJ3l4Y~5AzQ>D!|V;9c<(WZ!*?0j8O=7n}`1!)+}
-XY{IUZZtS?eTPN8puoX$@=^sWBhE#QOxv@k4k?k@4EKXSvUrTm`mXqs{rx>aYcG-UuLYS8PgJDQ@1Wd
-tHrno<@vAf~#bCMBCknOKYo-D{&UbMPkqVg$V#(q)#&Tx`40`xa4e0glA{YoQKS0iyf_Mwan^iS`Zgz
-jX*g#SAPkKyJyfK#>kPEOiFZ?Ur~mx-hnv`Qb`k0rbJ$4V6uZ;R(v2<*kydPNHXD`FnK^<T7?shG_R@
-c;u=m%C^u9P%mN#QRiX!$>Q||#K!ahI`RfcAj67Lb_n{d7-z>g2gXfB4_}P$#CVGFykU9^#&!jmm+$N
-TDvCAut9qG}p^A;<p1*4cSaZ+nKm4uo8(YpEAX#rsj1e0kS&gL(86-A95NApbQeuGS3=WVQvmj0x;tY
-cWl*R{07*fUmaeTZPz1U;W1Y<Zr_5iv{Lo6U}B(FxY1j56EAF<)7(9h~G8=o#+U&_Y^#-eiQF!Aw;4j
-G?7ygtNlFXFcg<0!`AAowZ9bz)ox#<fAa*a+e9-DJgh)-paoILyQU+xV=5@#)eHGO5CkMd4&LcImKMS
-2@lM+RqH;4Gl)55~(f~I~TFde+Rwh=XAkf5-T!2fB+t}tXDuLJI68@Rqwz#0t-zQUKre^SK?Qz_!;2e
-q6DC}>Rnz#`jD2HAZ!`Zv_#l`RygmB@X*$6d^_H{ta$4XB!f3EJJGy&9B<#2MEksknuW|%7H#~VZ*kR
-Bma-QseN>KQ_pmd>QRP9IsENkkqvi|2`7$BA^{vV%wE%Buc=A<t`WQ=~{dkU!5c`=B3x+^E$RV&$>Kh
-VYz~0qF&u3v}K)WR0z({TY`KFD-%MkSe(x9BXlNxy390Ly?e}x6H82UATFJXrZ&A<5v+nrLzs%sGq*s
-fz9))oYyYY{l|c*#bNX!AS-FPPP(oF@~J-SCNhG1Ffnocbi78)UN^Ekjb4vXo{A-UqUgxe%P;A`rXn6
-~^_Gcc$S;Ntl0nfD8|~+m&f}l!0uamz_q_bGtIZ4}rH%qx5|Zeh(sIUiA*z`q~sTy@qMpjYIAOh@YdL
-7iIRc#A%OVwV=`2Wwovz=dv=4Udhs5z@V1PPi8;%K5kk^*g1Te*vPwh-kTqD=KyT)0`yo*WVVAYdU?o
-!_jB+2IONFf<7E=tXkb*e)r(g}(+{_!#JW$8tguRv*{L8hG<w4evI5}+rm_=n$dST{@8TGqUTK<8!}p
-wa1W(A3NR9#3M)+B2Dqt&<tZ%{nr*rLpCC)T)d2gN^S-p&3*i^|cY`PF{&tw-iEnyn|G2%DHKeaRRe*
-EB-fqSpuCl2rezkqW|jX|%6O5Kg+->vjIZ*B5Amq7oPJ8#u464%^j@QQ2dz3zskqomw6iPT>o37GKXM
-uvYn=;zxQL8PoqtF8}zNM>fS>znWh;u5^2lgtENXDh#@GqfZn?z_srH{_sIGP^&@BLEn=HH+QkAMq{0
-oBd^O_h6TaH@aHUPDt;Vc@FRpeje}491^<;F`jAiOeFPrO9C8H&iyzLc?nx0M{dXo<Tgp&MuU=GnQmR
-_&G<qa2Ei1?TAA*UR(dU8)Knp|w6vxwe&r`f3~D0?sau0B+I4tl@`fD1!=I#x$D#I)S!#h|A~PIXmV}
-{UP)cM*=UHXw4T$Iu%bR5qSrWff>d5c;k<v<jr<C1KDnI~#e5#*(v7mAAngzOGBfHo;LHDCT2E$uU;&
-cy8_yyEqw8i{-if7g`KaD@}!&HbNcg~0Z1i%@%`7*9c&kT;j`G!m&aV>(GKKCcA!~FU`G1D_FFEPK!L
-NK0eU4f!_4U_AJ%$Y0xlsqz@^cQ0D)q{6%;9Xtq^b~r0PCng;s#yO(aB{Qxn?}ChsM~7p6@<#=Ks?Ia
-p>n?FQ~OT`&ucbsN<!WWklJpw|5R`!I?_3s&8y>S#ADLd^Fp#PDNp?~D}+sD5BH0)$E~{jgJ$NwKgDM
-Y`;5eK>et!z7`=Fo8@C7W98qjk3Okbh*LU#?4KmUEWV7@>R#=eFUHBy9Hox&Op6*lo%;m8vou0<Cdq#
-HtJI3C7m@#9gZu|Q^eExmSm@wYg0+El!BR8|i8^+^hYRFk=6`CTSFoo~R@)q0&3e(d}Plx$6C4atiig
-Iawi9wkvuE`hI$Od=cQd{m$DD&zZXi#N_$#2~4&)pXM4jPt{Zx4PbM`oVC7MGbyi^Xr;#L~zOrmEPhX
-q~+fgf?ZI8p~Ehy;U)x|7e{FNK_k9cOE{n>P!~Anx<|zgu*kkyx}s7W(?m2tM?OD;B;$oSphc3>^22C
-qZ^>Zp}GNn0_>x+JGQz7iT;)c0kJt=;Q9XO=cWy4^1U(Qz1Zp}EmFQ+xjg@NgK~+uW;m!Z26x-iF)+b
-@lq0P)O2*xi#elKJ#%=DlM-HQIkUu84)34TBijAN8a}NjC1Kz5RV%M;x$|UuuNg1sk%~mq?ox!o|dDq
-tSuC3=?TaR4}<bDk3hQ?ZFN0wjw?YdMpawajZf%tQG2fL6o%1?49g#b_v%;F1wixU85F;}2G3CsJ?Z<
-w9^9RSiNsoQm0y$-W>QR^vu{t;&#*-1B^!i~yKcae!-F|gKwN7Wtdf~XGkFaUbFm#sd}^Lg4L)iIElj
-swlO@w0<u8?~_QPRg!yWWYa1;6P;ZZ(m1&E*%zK9_4p$!}<RQJdgQDe$kDw`)PJqQVgAhN4NQvxA9s7
-c9HN#cIV0tdck{mjY^RzY<Ab<oxzr{`6~936*gavFM9$J^RvsLK|ty1N%IPuT)IW9_0G1IN#Sa_rpN#
-+QTv?i!St$=NE$0f0LV)3nDH}estxti7{F&}{HfA$maiBkm+o9yJqFiIglNOh%{6QLVKRUF7Pi`gUCO
-3!CA!q`d+buq9+qf?Hb3|;UDtBaW;F%y@Qc?F@Kc2yy?q{Fsq}8r4cqJj<Q>KDNd1@3Conx(Ewtembb
-=$-qE{$Q2fA-I>mMfFDH3<yvEzVr|2s(&!~^f(657Ho1pM1B|HjWGw8!rWd~yN*))H>b#CH5{P^~`We
-5%~DSAGre@C1!{)k>?Z*H^bIcdt$Z{i#kLVE>-*!`jdORe@k#j298sTLQ){a!<S8waY*0Lj`o&IlYkY
-rs{5GmK;4~h4%t@pB8_=0NzLQ*Np1!;9B5A1`uN4cYyt#X1}M{Z$JAz$$tCTZ*QY#?z|zMqjO-y9{YW
-g{mK#n{poms#HeWvGGVzO=fnoKqc4Uy`^eUUxB!IiOzeh>)xTzvudN{%-^}>S9dVoOV}^LltUDRRDh9
-Db4x9hD0Sj4nM?C#Po?ennf10J2B+}D(x;>fx5KGTbq#wKk6~YckxPJo|>?Z>FE`@>XHfsXz1AGaa^8
-rZ1k7Z2Tz%O?(PuajO_q=ce-&4Og;69)%U|CEoZ+14rLYHp)_V)PK@4A)g?6yq(V|-l9Y?BfbWKs0WX
-BI;#a?^Ln6ZGBa4$|#)dJMr-aorJ{26UYLm-n%@oyrxu?T@z$@v9`-k{?Ya*)?&15xQ+f9KgaZ>f)bg
-y8V4bLTNn3>LuHY+2I5R!d)BDNdx$z_$y}pnv>j%yfc2!l+V>3U><bJFw_&$(E^ZD<_!<0^=}QDZv$_
-!olPc+mw5|@gPel~Gmwvu;R*88GGBPOw%woG0>ZXXHY02@z!H#x<~1_{#SqAfK=h|?C5{rTcGYWdCG`
-|M*4&227KX|Er#<KZfN9vW(b%%{FwtBV9-~og<9K+ZIYXNG+M9z-43ND6(%@J7^x*j7+)toUDP=`r(+
-IQ_Vxy*^z8ce}26A^5!J;x2xS$b*N=!qGhhj#P)tBrP1*DBb({1P>yeAur%q$Dfzi9yE%{kgCY{hTij
-CUy()R`kzRIIhitpDx7Z{^%5-s7UT4Eh)UFwO&S4tA*HjlmB6UodM;G(&3u#5Kpi<+{wF_N6?Lt@as%
-qloz(SZ=fnh<P<U!`UxmXawE!Mv@KQ_eSEdPU7y*?iqHEpLBpIr#@x{?NibPZL)s7Wf=%&DK!>ZPZ8H
-dHH)~hm5$iRwseA~bfcD{CqH@>YJVbdF5S&f`uwDeeBxOd<JYNrR&Lj~(h%C_uhSJ%Xy20uf8g^TKXe
-A%A$5D~9(I{Al<p;y{Dd-QreyimWvuyz;o7z8Bmo+Ag|xC*U^RcF@1VojE$Ew}=HPj%`{Lkmp7QQ>^j
-o|bvir$hc#FIdPhNe`C(m)lS!(-GkA=va&b$Gp7`E|yjfOp!Pz+nR>IZ^3`{ofWy^G{Xait%o0qFx)d
->;r5_*n+_T?pI;L7#~E@OKL>08CTI>!{|o%VFQ2QU1S#imxZf@x|Ae3hd2a@B*5be5>LzI0}LL($HkI
-L+>uKdjgT{prY$y=&x)6+e+1~>|1RM@rEOJlQI=gTTcp<)&pQbK{uurN$q6YM8yx(mlPYTTk+7DhF?h
-nkc$8Wh9LjR;6<4Ge9S#YE^Rw&+syczC_Ab)BfnC)gqFOPZ1z{H&)sZ^G{u~0=;PInml7|+S<~!YIZ-
-0Vy?{3l{>VOPLU`UgzUnW<>Mz+D=>>JtdiDt!(Dx9%p>DBeeJVeo(mB0k>3M!}<E9znnrAJJQ@CFwYD
-S4{kxQd;B&*(ES}z-0W{PX7(>;(XMX3n~VIioM7O{FJ?p2Z&A1-pGX>41z`dJHqUJ-wuh{x}bKVOVLt
-5f+lt`nOAEl_*!6Ms>`?iqO~1-B|Cu{xjKX;UOt<C?4X`nZOp_RbQkbJ)vVMNxZ8#OjY(=njynd+*`9
-%W7|_Sp6olqg?z}I!W`R>nU<QnSl5UYUdR31E_f2SD6*({jM4435BEFhF!g}ZYHMR;=Cnxn0?eYXX;-
-$SvYz?0s9Ezq@K-r7W6iR{6{kVWP;=#AkFM5AJH4dngGIT!M>z33){X#1+wVP`HWwT82eoKUP*&Fl?#
-1h?Tx+c<IH#?bTMh9j%(Q9<A*Y#y!rg>t+aAhFNDxaC)D@=ctL$EAKD0U%P>x=gqf*s_h5oVPK0zZe0
-~Z`_M$cso6nGazxb@th%Y~WqFwF%2|o|5_CCZfBv*SM=0;YvcZpJ}_Ew11X~>{@gYgSjdzXo!MkuK6L
-Tu9<y@f50xJQu!T)j)q-74?u(;VCrI;Z0mh5#)?Z}H|2NB__$KpoHB3M@d5J&u?8<Hu?cB_g{F9{GU8
-K49akKJw^%(@jlY=bSu{DvsB9oi}MWO3aNL(>%URO>_Inb%;v(uk+#v6RZD#pHA%F>`-9wyjn{MU!A~
-U48Por2;v{4fr%Ah9#P&94W=P|WL2aWbMnzHV*`YxjD%m0l2$B!FsoM^4MPPFD~n4lE`@iKkId?2;cQ
-sf9<}&;I<PwyEH#6bT5j}_`jGx;8oSz6%aqiwdL(zhB;ME$4D~*|9yan4rs1W2t&_F@ZUUg5?+mp*X~
-qr233%TL%+FT2=U9N$M`q-yy#-IC7@N?Vw^iHCR*FanO8|w%n~P56DBAi$npi!W8QzriN_U=E&2%w+s
-}6}x#=KZRst#7E^3;!mMMx#Ac?I#NVNq2&o_l{{N>wv@W`G7nNAE$k#`liQynRUr>Cr5h72*8&p}y>|
-p2zJqK%Thqlw8^kz;(Lqof}b{Ew1#Eo$QWG5Yv_gNE2>&!>bpxMid?aqE2s<$myzssLv|ryXp&|?BFO
-U_HWOl=(mWKGp~{fe5~PPLpn=;f~Ctt(<|MV1}$tX(C7)X`uY<fVJPVE+s;0TQgDm&|6%V-;G(S7|Ie
-_<2<YHK;y&&qE~scInvBfYfRMPQl?KQn6avAFV!5C|7aTDyE8DHCY`I-4b1ARlzU1EKwT((^h!)xq*Y
-khA=bU#K5X|~@f6M28-{Ivs`+1({Jm;L}Eblqf4aK*KeJoUdgHT%fJRgW$e=4S$Jvv(eEFs#Nys=fS$
-koFpf*7luG$@NTi$NI<r8S47P@*B<P!NB6Yq145R(w15y3zT~S+Rj@jk=mnTo|-hI|HRlt&mu~Er|Ym
-)sGtLd=;zz^LttaGbY<+74wD3R>v=9v9|qCxfqJXt&<BG{3sT+onH)9wZT5nF=ZWf9>F4S9K50sC=>B
-S?rYA9ewFz6YE`hwQDY_zBNDe4DQqR8+D7JF85(RXuF3BPgl!$`QkK-7t8p=!k`cmUz{df9cZkU7wum
-CL=-bRVN=x=z)T4fs$vJg&=+ugbVkZVPRO*6!sMR4ZnZu`uo-%HQnyJHwZDr6bp!9dRPfmtlpNMtwZf
-GFxyAerVqHUw-f4Xe|{m;Z15*O#%SBM6=s<dE4ro9Dqov`{>&J~+;4hK|bNrSO6l?+QgL{l|#n7wVmJ
--RT`+eyO~PL=2(M-CD0gI(^w87c?BJ%#!+Kx%Hg08%4+9U!%;P{c;&8;Y6%QU`~<K<JYaA;%`e#zUfm
-a^7jcN#Mkd5O6I=oHS@!dPv-vCHc6tyVmaum7tv%in<5w_?xR#Di>oHRKdl*cB4tQps4QXF|aAc<hTq
-WFjwZ1rObajI_<Lg)?)}$d4~va9$1+xCuqrZG|7e&3LG`UrQw$a*SyZ2tTNzctTO)sk&2m8A!}ujjA*
-o(=zkBYdIc9lY~AU9e_I>+A8IJB5$iLD^_AaCgIDEgY0y=E3<ELUr}DUT@~GT@NpdY8|EA;LH2jOTIK
-I`WksbZh6wvv>(=HWkCK)5c?W-&At#RMuqdtEHJHx5vnBGb4H)`d4^l9yTG|Zn=O(hnGgT*7!wqg8yX
-q@QA!Vw(f*cjOWllVVHQL7HPK7#dI&l>#*7L&-~SAGN3*f+4TZr{KfpOzoY)js9=Vh?v`(U53P#Hh#r
-!B}2ay>DQb{iE@3U~$$^MaO#Iz_u1=0BGO9;(L;I&XulgoG&~ja<<B^U}M26$F8bQ&gIhGnN}C{mnYS
-{Q{&&k8XJryj-BCrb13fGy%|?uhg8srVrz*uqA+&A&S;A`JfR!fljMI{u%M5F3gxjr_O8z6lzF#s=a)
-~qiah&CIXk=qS2;K?#5%sRmU%CH4YR=)y-kJRbj1gz_|_pl?k+yfwA5w@$LZ;bksdXX$1X<}T=o#(@a
-XK#NlzDN06k`^F&p$oTMKF!-xVj>y@@Lz-*s;Fku&TE#oCW|``7U0saFLB_ra+)Z(`!~;#x89R7P@Zb
-(ECLRni~-j`QT(0+VQmzrnC-7Z1D;EfZUS6L3DZHIFQ+F%)4{i3gq}FXF(oXve1*G+9XVFN*WP7T+2}
-aS@jI{DzblobxrTD#yTzGFbk1@eyo=sc?R~cxJ=WQ@hxb*q%x9)Q}RP`KOSVxFWAA8Ux+|enOPPqN&v
-l*%j@%$BL6^m;YUKL1_F%R9q{x!B=fTd_!m)Bn)cjq2oOfQrw{?H)<k)ynaP&t0Q$_I#wDIWwRx=&JQ
-_(U1{RRA-+p}aI(;<j&3m&-K>*~N%8VSF(U4D+^*vA-;XY7njip7v^aM2z?z#R6T4#{=>=2BB~KC@ta
-3~<Ec3=_g1U5uiPm_vE~2G5gVLmKKe2_7j(Q18+IZk&D($^Yq%%!tSoQ`yNQdG3s_ucz2+8rVcQI`8v
-<x|&R#@wsRth=|t9FYsOGxTsaSlHLx8Nhh#kI~Z190mt1-H*C+~<Lfq}|j>GLA!Oh#Kj<&|eEeSt4UW
-ier~4WDku{^Lkf)OM<!7lUkp$R|vCxM9i0_60;$e#PUniKC@4}Skju_Gq&=akgRPMd~#g*oriL*l9D|
-B75N>u5PXv4%UJyUIL>iKNE|*_6EfJDdg8K4EzF{~FMG>~1HKNJ9J>`deN0QedPeizBYo|DCD)novD{
-v<4!xtK8H|h1@ivU*9<g?t4(+hmD9-QNYYr(#8yRmcYq3w<8{)sijJ^ps9*6=#@mNVYLU<nNIaU_SK<
-Z&V@wtdh$Qn{@O~%cR5qk~G{Gls2cE2sSDUdTPL62Vf3-JSGU?@JR5oN`aG6FV5)?kxilNUbI^FRUH4
-QZv<nXu1L>^IyY-n7zY!n*j}Wl*@QX$sH0^!pTcvq%c#E;mhKU)_}y;?|nVRysu&ma0wSjvcW+k1K#R
-iU!uF$e*N5r)?p`t5&J3i_fp4d~^4@*J#w{oRIxuc^>t63a(+@A&y~sG-T(H6US@Kj{O?OvT{FT1{Z3
-@Xb$ziMlwTI#pEN_vQ;e*+Tz$p4BEX;GDw`sD*58@*PBE3^1$Zu7->IG8!6@ymltiW((}OYa5&USSOZ
-Oti;`e!2WVh#SmKEbD8OS<g^H0iwX@R;FL>L>IiGo??mP5H#94=%&xv!OMRHXKP%2hxgN*_Oi<p<@fq
-#?ts};R@Q7Q2sSFNRfVHKrNnJ*6Rm!-^K1QA|4M9&au^D`AJU>yuagDHqu<J-r?{jVb*5j|?<C~^-Wd
-BB`q8M;BJza8(D>TgL$q5h)VtasD<HRuqZJS=<c4G%YRj>gm%uQ*4;`eM`PXgty8igPri4$-DoouhHH
-D;H<-!*1tj__kH&Xv8UWdesGd<DsU`(U9}E+&c`bJC1*eLk*p?_N$X#Neo&PjtkP`mgN9U1CzzeS{7v
-_2hnSZ<6xu2X&K`9de<2Nh378YTR5M6NJF7&46$QCL<{Q+#E#zLmZ8AN7g&SuSD?`uwwd+%!ivbM*3M
-*CbZ7M{bwxt3>)Y1Mo<?;519k^|yvVgY6^iL-tK+<3(@%!tV$shXbROM^Im`a9mWUPAJ<rQ8M213d+p
-tlb&WZ8fQRj;r#f9|RNs+5JVola{Qe>QGr%$RpV;!HGmPUp5Tr|={&ZZ$^)<*e_iAXZZJ;}-SleAntN
-u8nSZ6=fKsFEB6OG}kxPgr#Ill=KD5)LQM?YZmwY0;kjKB=*we<@Y_7J7<Z9W?emBCjBH*7O$VV$mp3
-+!9}jfWxURU3jClEVE}%K3<=Hoz-E$d3QRi!^f~uFAi<>scLE17RPYbeC!K2&;<9p{1bbl_C!$Z`TGo
-;_Etq&lgDFb>vHLMJ(YQHN++#!P*tEc`6fNiWD_TO=F`a5C#{rpbsrBz^26cYn~pdS_tv(!P}MA$D>v
-TfU>-eRZW$LkucO8H3*<`e0iAVti#5-PuK{*7vUabXhbwm3SF3AgXlUOCQ$#Jz;oa@M#O+MfG<TEV*d
-}6DB3*o?04)I7##1v;7FU6N*JoZpQ#YeR?6dD74o5d^BtksR;i<J^Ho98PM$5ZB{%+W4pdo36vx3Pc?
-GaJ5aTR7qDGsVL6`s>A3^hgkG(QB#Di8t19~&Mjk9F*OySbd$3l<ta51cegMkH0ewKaLMIOQ&)I=8nu
-e3s5;bO;9^VJI3VHp|6TtHFLH#?a272eeZKufP;qy@!~o-YqppiG!&Odztsi!)GlO0u6`Niw7PUDL;<
-HMMG6D&^XI7<UnNsb)xn55INs|UN+PucN;$@9X%480H{N}wHKxjU0Z+Lz7r4|e-2%_7b)jYrquM>)OF
-6yxDg1lpBAyh?p^4|-4>&MZ!OBONv%a0HeoI5p?~{YRFqtc8czCz+hSB_vDCQ71FKPiSdD7CWi*zRg}
-?arq_}3$p=(%>YHU5qcu}lJiMtdX-V5*1Mvuol-PWV>t)){6sA{Yb%TYhYl2be`)}|qbYfZ|k)}%7AK
-IMG=Ig-U?_iJlXo8_9+z4yC@nfm*+#hrCRNY}Ut>2zOEXDLA4eb-{x6l`*wusF_J90xHsh9#afOY!%H
-qHexoU8lV82rs+&R&&`M-LM)OTWTr5;i<LF#UYY=(o7+{sPN|ok|Ocp6zOKz7^|<iVu@#m)pI|_M^kV
-g`$m7AX-B0OK08XM+N(Dd{fGn|2Q1iW9ivut;+jiXtL)D!xI#gTf_>y_PjS3LYD)?c8?nQ1e`^n{jtu
-owD?Nv_m7WPYwbJvpw$k&uT<I|s?GP&s(+oxTddStD@nW^-32n6pgEun?fO&g=Gy}sY_sldD&%p9h&F
-)B2^u5KB!fCysu*M6YSI+M_-8F?<87MY9Hj6IYtB);({7@MT*OrPxMT&^*mv^0EJ2RJMzyGM2gx!n<B
-hpE$R+<gl!!3?)#RM2`-|PI#Qn_eU^@*I_bktTRpb<K|TP*l^TKv8mPJLapqswNwZdB{a+fwwEp=gp^
-IHK~$lF9QTHLTt&$I(^h@aqgk0UT%Cx1{EGg)`}boURq;$Ly73CUXRz|6%2~m+NOrr68y@iNo_T&P)`
-PXgS-$Xq2CVWk++#<esUq$pvV6W2q9Lr%k~D=+3-zDz|xlh?`mEl~!swW-Xg>%;LCIxd8i(EF~g&i)Y
-oASq$HhV<=U42+L5%9Mzap#KMzlJLab`h_O~asVzidmQX~B*s*ZmmJBH{VwFNHNbM$vE!oQTS+yvYBo
-?J!K}@^y!U3pT@};HtH%h$B^p7elu~bqHu1+mQ=9!pt-c{w#kEWT22Vm8z+@qLd)oPbjly2oKG(6Upq
-`s3&QgS&8jlnjMW+}@sT8d83o1a!#J^?3}_neO9DX{mBs=KuHsnhc&h|p%gud8CC9XGm4+}XTVanw*$
-KrF$v^OmyPj3^K9G}22vN_}XQlqnXhR(MKQ$^|Qtpy{8X_1CT{Y|Z1OG*=CW-1_HM!-DkMiyToW#QN3
-P+Nw^})({93Zq4G7$BOl<v9)yp-50UG(^K+d5$klrMXctg!qaDI#5Ddg?hMS4Ygk8{Uc)jrx`yRx(iX
-Aaixo|IS@BW1ie(k6SX3hB;;%{mFN)LXnw!Hz3`L%3&-uF~`R0<4%HOCu*juHUBP#8qO#-*dN2m-VYE
-9d*CS@33i_}aJd|{uuRjdhHU8`7zqV!90WB*wU=dD$qW(TL{fi$y@^Rbep%FSfhc1bR0mGi(a!o;G>3
-b~dQS7LS?RhI;lzO&crc+V^j+&xC)OSP2M(W2I=KD!qK_BA4bDJ#S}m8b!N0&OwtbrI-Z_duduiVTks
-D_Y-aD_Z#{g)pIA@|JBOTE$9S^hc$svl%vrsH#7`^1O8Pu(c7N8wtm<{4d0^R&%Um31_oB?#|XT-x6}
-x9CDUoXp32n{bEh(L+1-}F>AAHF>AWpV%Dc;MK*d{NBZw&4-|p6go^H5#7@TwQt|h8>f!jpB&*|s2{*
-!8R>+1Ymd5b1AtF7RRD+*?m5nNnrCHbu3mW;D43pD?&eJudICx${eX3dXwm`e8zW{{?vH3Hys)q|vk$
-v4l)=;&OMS+S><R<`G+pQ8=V;!>Z)Idu{dpYEU=^dl2dXZ{Ti<)k+$z{Lu{Tw;GSBqQJT_c!`P&pJ!T
-S!CNt8jVQp2FH_TYO<{x-Du;rf9irLE=X5!rHlp;#MBA0rIQ#!4+tx;d<d`Z;9R?9{!a-2$lO#K;;=s
--}rr1c~Ykutu#|%_%Qo*1oAz?L=-RKUb#_+v<kzAD9^zz&tDCdkCNwRblH>}b=ON_&2U-q+5YBimldt
-kX0*O#)~}>Xf)1^&QCcSIB+`Z=>{T#}ojxcyIi*XgrncDZ?D?B0gvulM7SL39sjr<hA<<Y0f<?_k{Y5
-W=>zy2z$;B!zUJ&b2oA#)6DQo3PF%K%%rL2|j3RIC^Ka*@6-O^J_RM;{?9P~PSQmjbfSY_8r6{V}KR2
-49(&zK^1*={VX?O_|dB}5ijk1hSBp{)?_h#j(!rc$E%stHKCYApTNRYijTKGZxH9`dLfVlJIh0xUD#S
-E;^~lu4x`0HQ=PgwL|mp(cuip(YBgu(%dnqp@By(%O9Nqs-w`goYWnMq3o!X?2uAy~WVeJ44P2g?fuw
-A#tC&+pLiDK#@yhy``vejn%QY>a`}mM{=B^f$^+}77-6ImX}~nK4&fKKLlI89A|MF<c`bUI1!SDJip<
-99UpFwC>-^37H%Qyh0oad0h=E`U~ez(RIBpe@*9BnmKt%MVjEnzBVv|z@)=T2L!Hh=u3419MRLN(bsN
-Q1#wh|-!t?Hk77wl>JTt_F$o(Cwkp2a6S^)RP92VtviOK0I3!xjtsl-P`33U6oq1&+$baCt1%us>wB_
-h?|lM9URDs*97P}m5@+8MWMo+;3In+)X~?21?wN2m{qXmRpELj8Jc@^RAgk3EQ-+&7tF^03AnK$uh4<
-rPrX$r+$haxQV9U|-_4>$|b<18z}EpRtawuoxCwHZ<))w;8^$uSE}AIDd#gvxk+9Z|;1g7#9x<dk1Q~
-hiIo2j~*b7hdt5bJU0*VmselkMMYN3ZH93U|F0=*`v4xOAAr+78{A-x$qK8S+Y{v|DE{n$#wey_0s^e
-O*Z%(OihI4aInGE~mA<wN`M&H99EEzJP@J^l<Jc>jL~=P^gkxzrjg00#Ak>eZg*?(w=72h!d^X0>sTv
-ar;&vVJQB#b=t6Dq0`lO){m!Z`}>2-!;oM%vYFEL}JBsm`m3x{sjvT+)7y7!ldrJ2jpbx<IKt2}v>V$
-#?`**m5nJP-V)pG=y@{KEb@*-5n}iV$e@Uh=Y*4v8)E-nNplaUq20=I0y(-gZ9g7+^hH73=ttiqR{YN
-_vNLbgXBEW8aPnZ?k8GIMt^LXT?oJT3G+2_?2D7(b8WVigB(y-&cv7M&%jiG5eiQya}ZV7j5ChM{6>^
-v9PWbmpvaV^u~#w#%PECF?_Nt7_%d<!`?_triSi~Z0=i_=ug$6e40q1>cbu1ctb@ZWlSAnp-!)ec6gQ
-VHS6^{$5H3)mrzayGpU&0An+DHFsRoOF~8Gbf=f)P$pZr$In!3mZU;C&TjZM6ep1Y88%l5vX~d`nE2w
-HMz@dPoipcY9vsSp|UY%zvXSQ)f{!ZMyEYGt=QxQT=5#l47{X8(OpLSSpQD5z_UK&>hIu|bzhvMJn!a
->e;cex~vr*GplxjdXl7B+UyZT)YHBXQ}|aWSuCa-1_cs-0~glyghLm|HRx&G+nV?^;}gLz_w6ai44Iu
-~!|;?JZ{Z8k==;Ka3Cug*cAOyB%>V%7MyUaqhAD-j>?M7MO?Bi(TsG5}kAI!n#e}o(tV~sUL_7*>76P
-qDs7U(Y(A!?dkp=3-v8aS~+iAsO{+9LyhOb#_no5rLJr8#YFg*v#9yK6R~}q6JefiEj(W_H;OdqZ<cB
-oP|71&#fgQnq(}!I?yG&rVb31!y^q4lV@{8YR>2lxExb@M=bv!dPA<-u7u4NK+3;*~XW0TVbl`!jgT)
-y%L&;w1S@nU_rg<!q9-V{-4nlmV@$*yES=mJ4w?jD2X1qz~_{ll@Q)r*^?D%+c^T17c&Z(cG6(^@rR>
-!B-kdtVemSf6<2Vz>(v>gi^WmEMej~3jK85InQouGJ-^VEFTr9?;P<7}}ekKdFhUB8V{CT04W7#mcW9
-lN3<sG59WF~sd7=bJv0^ZNeQ)e@719jiWeJ~SWKcX`|WoOjLF&gZfg9_2Vk{fP5Hf$Eg&p%w2TB++#~
-(uYcY%Dfrke8La#o!cjpNJ9~Bh{O4+wW@}-y&heQwIjEl{oINTZ!`ex<@9i6<ZL%zG2f#PPFF(!xy{O
-gdwP+0peymS;>_Pl03mC!m?`Ug_cF%f<ks(Kwe>s3;s5TKrDk3DSi{EYI=x4^Y4KN34b6sa$4tl1FFr
-3$NS{WKTx~en0f%h`19~u<5zvd-tz!yeb@~G8Ki(Zvkix<jlbwa@szMvMFA?q@RY7Fa=@(T6X#W22*M
-%2Yia)mdh#7z?gX!$4j^({rIb+^H0tKp9It8jqJLlK;xKzA6GKwoLs(c;Zx0Moqbna_W0cqk0LbcSeS
-<Wi&Hx#|h#DKTL`H$t`?Tm`Td)qR5AH$|80cB&hr{T+EaWqZAf?6h2QEkfJuxV#ij$u<=fcVfnE#hEa
-FYz_DvrD?@gqs;QSpup?A%xXYh~a`^qnEy_pJQBGYnjC;XYs|sNU>#>06B8=G>BPyifHqq|5s)T4y4P
-~jzbL}x9`^qzYB;hZQC;z<sLWW<JhvvJ%eIHj>Q?qyq6m5=+q0-K5-H6<<V$q@t3SRuIzD~)?wP~30H
-e{tb^i$*OXHL_>Ec9)1-B~&eV5A>z!}Ulowe#Uzdg;=Q?RHI-iz?VCTcq5b7)w20v%9bcl4$mj<gdPa
-5K#cS^%FXOc7|I;TlPx^uiVggeJdLymKlG~_$OX1Z>+cLqyy3Cx|O8P`HM1EhI1%w98H7vDQ;lY|*ZW
-IMl;X6zJqR!B2G+H}4z&E+ufmu8fNbE`DtY-Z<rX~sCsxmKDhU|ucFPMDWTbG6WyrMVVnn>0g)oaxex
-YZ08&rCA($5iiX+BExBxW*n&D3{R>%45MFC-6<AEX~vfa&bHEwF4Cz_avg@@yqM@Z1jAV^&DbU3JT1-
-GcJDkX%>^(Yl4i_^I?JVb1<V_ydA0ZkS(?*fenOhp!MsA6*TY;S&FI0L`O=IHyUt8$#)emCqBI|ad9p
-OGf!Qj}m=AD{l;#SUL#5dXb5CimhB-)@Yhm`6W=u3XnKbKR{xw1J8D^(62f_S_G>Z>_k4bYd%)6x-w?
-{iSOLI8PuSzqnwRWzNX6&YMu99Y4Z|y9R=4mj`m*zy6bEG*P<`ikh<~QdwY0if^R+<Z7j+EvSn8T!b1
-<b+Hyc*_C(!2)d0BK$avzIilhq?9+Sr#yVcZc|_P<-bF%_ps{t~a+vv}m74ZNIm3uZV%0WLp@d%LeHZ
-KrY_W<yq-6ja(w6%L?g|NG^k<%R*OfqHTfnyR|Jr6tFy31e_wH8p&m&bcvEK!Q}F)bQvUFLdoS>>C#o
-Ygp<o^>C!^FM3T#L>2hI)Y=Fq6NV-%?mvnM@K)QS+U2@2!M7r#eF8SoLP`bQ1!_@$h<K5EnsTr=8h#X
-U-W9bZ6lSGbFrK4>|9p59TxLutUk5&FiYv~Mn?N)2)0({^5*d3Vq*kdiV=p8c>hwwPZPZmdQ=@drlNn
-f+$y=cb{6F(Rkj?>+ExrOw{YFwCzU2;45{)k;=({%Ga94F0=)O^QTOYv#DkJX_wI}*LlJ}J6<ahqJn6
-DG$Y+$d7`rC#2zwvz|ucfp9!sWze3P=Q5nu9hcD8;Z*p-XX6%k3RbwX&)ZB<Hwc7_7AWwK8FKp=k~Rh
-nG7^+n(K+#^umg2=WW;^6jFghQ6h0d@~iuN4jmGoFgmA$N#f9P-+k=UPtlw03qY6>iJj<V2|=?wqg!1
-6_Hk#qa33pH&+M$5jlAd|4IqwK9EV9o7H2E&?utqBYHgFGX*0016xZ5raKz<64ly|!@sr_xFEL4LNk{
-MOif_W#%3>4O{I0m|6637$g|oD~-fINm(`ei>EFd~!|J<P((Y{s}qXg}D)GFGconr8ftLpZ7YV_YOR6
-Nk%Qlo!Y0LEHa#LIHWrqt%zc<^l(?9-z-BOR6;tlEmhz>kQFX=(6-A-R~w$G0d|E!1{_bU_ZWk_Y-yd
->T2FjjLWf9C_Nkogd#uh?I@5b2vy2SOSRCTZbHWmP`@q66x0@oDLGsveW==_RZ~XUp2nT!7<%pOcx*R
-!1i-zWHF^y)N`|tx+i*;Gr2b}-c0c#vB{h~(HV<jIhogqnQJk_9Zc3WBHlj7heB`KMPpPN?4_&0UZT>
-LaQARdwBz=GXh&X9wBxIUhIK3wbu6?&9UFGLR>zpbo{nAEm2tR}>3ngGy%|*(M~>Io89Bs$sv#Xu2nn
-Q$f;uv}BkD+nsv|fca^Wmj;V+7fsF*vA>P1giy%^M#h(y%5L?jf&{<=#%4&3Sz4}+U{h-3dLU`d=~w>
-a@X&a>S45GFmvhvcHpIF5)D@s-4^>mW7|2FBv7YO0ku-Qp+@Jl6p?UDXqW6Vv4B-f;}&zGBiJDfdKIx
-ks9Cqg|~NV-^%R%9F}*wJP^WlzXTY%p!4_7uEJy6tL8cEtf?JPg5lv@1_suh*c44Lld=q68bdg)!1<_
-)%`@uSR53OZAEsutq6UbN4Hi~PD{mD`hd-|usM&G_Xy4jbS}%P8|nvTiJ6QPt7A%}7%LPmkvoh`7%Ui
-yu@#!s_3$m6iM=XwVsNBDYcyId#PA%)oA_YNJuFMx;o}S;BlLSmLk-_`<Vm8~+ej&e;v(?to#$qAUY5
-|E5c=C}eA=;~)=-q%U>_0HN?y`T?0MSfDds>Z3qw($2<F;NROyZFFsZ@Rj*j!9(MYg7uSaZZrO`;Zwm
-Dr~D~0<hc%ZYryac3hK`>D~L|lLIvF({s&#EVRU|tZGckVG1cNFed(C$b4a*mj-=0J#my_u4DL($sH^
-)Xu|4)^>nTyBYV_Sa5l6~i~-;b<}PF7W5vWxK!gQL*=>MPKQ{Y2=8JT~#j`UF{{tf|c6Hen67(FT*CY
-m{1R|H=iD)O{|$6UsxRnt&UU9ku)rHObViIqh{w4dwZuX(>2RAF32c%=0VY}*%@hT;k+f&b$NHi5MHx
-WXKP=2ufAqyfT2i;8Ma}5dD&X(Svo1m5fwy!g%v**?)NB-QWtFxbk0f!#pR^UoV2xc-YRXRI-Rup5hp
-DliovBgT;<FMoS%&nx2VbUh8-ceJuT#}0P2xEC=*9i&q61qtuOw5VSBS<55+(JzPO!gYT-d6p-?#za&
-Vd3dK6y1Z0myaIH-j$3mi9J9=faT`1JJOS><CbYtbfw2sP=Awsx4V5ubyMJfuxHd?!jWDj*G)ns*XM-
--Gp(C}k}+@mrk}MfMSw48_~9rNgjkw`-E7$@#$0=;R&Ij+2h_r0WzPSm=j~CUI^r_8?#x2@7zE)YF+|
-4~G+=J~BJ@<FJtT+A((JwFFm=mqU)nIu7DU&W=lUW0tmUK4Pc+7AxOTRBoGUJ-Y*2CG20Xs5|Z@rmSu
-Aw8dX?L)zl=wT8LxQl}8(XiIAHPW$%gx3%M8Vm(h-3#+*}Hg(9(=;B?reN_f)M^b=J@?As9aR}#%q7$
-}0MK!h_>Oh!|I1ome4P^F{Mz5k8yMtnAksHBZoGRKKB(zOiu~aw0%h%pdp2$jW_8-(yq4ut5`wY_GU!
-B<cla-S0SdN5OP#_Q64MdMMf<oMGb(l!iH~Z@CvEt@;G6vX3kueCyAo~Cu;EDq_4&xk9?L5-QwfG&iB
-V&KSiKJD9u)1D{e=DnDztwPnIzX9wlk*us+Aa&Jt`I<LS6N&{2$k4W9QScEm065dW?wWYsN-%0wMXDq
-=+xI0*ql}<FDf=wTsx}#t!`Yu_OdELG<n{yRW_>hj~ZKXUOQEz?*?MN`2cnhN1CNdxuY!>V7zChiI(5
-0-Qm_^LYi#Yuru=9Wm_{IIIs=V4ipy0vzLn_RnpAEbwcMCA1g%c%>Ch)U59wDnG~4!N)i9F+K7XXuy=
-EcnvlhL<j$uOaj+d#KI*<*K8628Cq!M7*!AOFn$aLksEnN`#_I41b&pLxq0X_5r3=w;9CzrQ8&)>z+h
-WaBG}9+qGj=6T3lf=4KjeV(VtONS<r#WkxOvs5Rh~<^qp_&Y`(x|Ha>sVafyLq8jFlT!?QrZ6hfvpx3
-I+~6-54p!aYifvIRY=|qY-L*(78CF0dDos6LW{%8$-_#7wJ6yRbwQJI6us4q-+WogfiO@Qdn{d7lbjK
-sqU+mqhiavGv~O@RL826JX77*Is2<dic+#|X~R6~IG)|8mss(e+_cy5SxuIcSPN_K=Fk4~{O^8@2AzN
-d6pU2xHU-layhp+13a(YKT)|Hi{8>SLfP_629HHRN3f`e$mVyNeu268Df^RGMgMuEdBy6o<7X|w&I8w
-oz6--pnrr-(%UsG_Wf*&eat)N$Hm5+jb6&$1BoeJKg-~$RitKfPCw<)+^!IKL9px}80o3)X!lY)H}3|
-G*s;4KQKC^$#KWeUEa;8q1cRIpk>)>gvn6bw}`T*0vlPE>HZg6Rt0qu_lCKCIw61ve{rNWoJIeyiX`1
-^ojRKI-`}puWASr@S97iec>68zqb{lJNZm2^&6>4@>to{Tugh?0NSa+?k9eGR9`oo3GQc{BNXRRCcZ<
-Kf@NEo1L7Rm&e#_mdBD=Hp^wH^c%oZSSG{PxzI43$nThf$@HV(Yzmvq#<Kn_T;-+N2eDx+mRVdlOkp>
-(XcooBGqZ5bWp<XuY%GIvOl3xTbLoeCjUs#t<}2x?RK~MO^m7lR`7&~krj&1L!k6TXV#hI)2-R4aiG*
-h;8$v(0^rtW;!pcS=XR{oFMtZa9zn!QBo^c|_STcc2DZ(vHq&ZuJO(%--$dp9?^F%5$iGTCRC56(+CE
-qMIi)>jG0@TkDDb%F}{|w=iMDa4%Jt|x_x%(0~wDb`!h5jcC|5TNyk#e((^x<!$e6vNa@XMiJrYnX_a
-RB*53o2!*v&l72*b(wBN>}0zx`17-$jMHw2$M~e8%27VBD|z5N#v~YslT8Nyv(35sf4qU1+#(Vnn|f$
-FSrLuNOs}m&d;PqIh7@Fgajpv(#aLL<kpL67C6OG+zdfy!}1>ND(@_cVH2{ECAc+<Xf;v}ITSZpm9I=
-alc1zlD=FzS+l`~{vge-Ppx=?NE6Y9Ajqg#E&SX_Sxh@~c>1@G0)YX57d^F@+sEZB_CyjrNQIOIEKL%
-5Kp`~LNB|KAc^=jMzFMy|enp%1{{K@j1D=58sy=yGLVSge&NNviW%x|bGzZ_9wNOul}&!t#)kw#-RNv
-oT6DQfA3{R#XNM5?JQUtm5^NtU#s<g`+}68}ML_*Kh0n{rE47|Z&dt^Cm{&Jj|XdW9^xr(a*5fE7|q7
-8s_u$xc)KM8ouM_?`4-t5z^W)WlqodWx%!xU0#0wDkXs{M64WMeskV0To*Mb@ddy&K7bKEZW<2(Kn$b
-NOkdCN=ei8HPo&At{q>5kTQxgoh|IPM)3`GE5B<`KZ*X&q7Yijd5x5)mVRA(pC-yk);8H=<&Zr?q+k@
-iTaIwa6?P3987Jim9(gDj@SW7h^vb@zO4^$%d%Uu{Vk&!pvab17+FL1mq_VeG_UcM$Z=>uhls!n<jmq
-9$*^fD;y@RqRDtkvQy>Fzwla{}-cTx6f%HCDW?`vr{YWXR9H)Rh!E$#UlKa_o*mfu&>evgKqvR_p8{m
-RajeVww$iMpRF^b+VBD2rP}AE&i?Q7nXhMk?w08f7e*W>QQ@iNwO!t=tBPAC0f5tdaUG5puTDH)IM(?
-=B$$bLsz$B3{E>EUsGKO{5=RFSQXae*Nc>kMW9Mu<LiF-<3Zr)tIaOiW>RV53$(or@O|Vd;BGCKaXqt
-X>pDJ)9n9W@LXA@>HpmlpsV{`>r+nxbag+EYy8zoz<>4kd-UVimVWLwcfV^US<zkJey#M@(cRDm_dwJ
-=1&fyy78T$3x02GOj%8)b?_aU<fd^MT^zb9AAARicC!T!j={3(h``p^+UwCodOE16j>fc}c$NJabcyq
-&B8#is<^7cDh|G8~@`Hr2tcJJA{Z~uXV?;bjQ<mj>EC*FJigAYGC`L9zSfAZ;PpI3bG<yWWAeEp5H^4
-qHKzW?FJ>Ysl8<=5Y8&eongf8pY#%be*vJiWY|`RJSb`uVqLX$WZ5x=q`_>)Hji@6fSR=Pq51-MaVa*
-{gS-;OqN_^y@!hVCbO1L&Am*yCHn|h=`G+ZX6w%G&4CRHEmXU#+`R%&d$otxjQ${W}h=Rf8IT}PoHr|
-LSobY_s(CiaMAxX{r}VX|Cjl18WUx<jJ?Sk9WyRA?&k6F6DCfYJmr?D({8;@^1o^S{}ueldXAr4edtV
-fFE{(c4eVuP*Sp!5H?ZH|z`mk^ePsjt0}bpCHn4B-sBeF(fgQ_;&~eM@^>=f((r*N5K+u8m#7v=lQq-
->>!yJ+P8C@>()Q<`Gfx>;Dav>d>-0+wb#A6ntGC9wN5tsJdOj_8SM%>4%IU~(=62TlbALAa<Bt{-~F=
-odTBgT94T<OH9aUpYs&k?hGnaUm~^v-1J+vGEr!p;<PR(1NQOb4?#b*_>g4Sx+^4Nna(4Id2;ncqAY9
-$NldzFIy=CrQj0<cjfQ9Ufx^_H}NUNkXW+2H~cP5m1(xQF8a0OrhP~;>4J*F2p2(r@K8#&?WQL^3&4S
-($mt>;*(riN6el*BF`mIDfIL+#?fPhVIDn_|8WCTQU*#(Jc)}*iHtclId%5TRF^>9oIR(WeSESl8`ep
-wIX2D1WS?cvBV=RjnIgRydzL78Q%-IM${;Q&H`!IrsWWr!Nx3eD#Uy13E9Hy4kUr8znn(|6QT%yG3+W
-&};;>0cHhXSLl1OK4ZiX@uU()Tlc`h6AD>Wr6)y-kDUE1QZvxMU$yMjqJq=Wc~gK!7~e-ZDdRBa7lYD
-QK{_S{LfBwGggllzps)ZFni?@Ud$MQ5dD=gt-$Q&oQCADfhCGbP(H=A_1F=h$;x?$S*r$KojEq*<wBv
-h!ukDO92s8cks)b^u9zEdB5Vi`szMi0h?2%buBey-WO9GyLf=ZuV@(nt23xSu7TBJVQgNeLw_bc>FXU
-J-Z<^bZWd0shdX8T<H_j6X~G=YEC{qdJ4gOm|m~PkX_Gwv^K3-LBV|miwh_N&-)7QTT;;0+naJIE-t2
-qIyAH(zMzCc2lok&pISiiDU<kk?5s8h7nBrGEJoR+r>E=nKKVI0b8~X8NdMp6-TjWbAy!~+rWflpJqa
-H>74DG115z?o!&O&KlQU+gX4`EhCD%!|q)ekFH#a-in2}|SO|oYtr>A1<J5%{*WTvJVZP~``oYX91YJ
-O_6-Ig>nQ)?loWWfUeG!h77QkF3(hXSTh9Mm2XlmQLG<)$X37}IjIXHyKBOb>0c0re_-CgI@{N8{c0)
-ZBR)S+k630+B2H^HOa#H*c0_OCd5+>^Yek$uflIBOmf7;+qaY{;9dSP5al;kxYcxQjIyXb{Xw?K%-Bu
-ygm*1HY?ReY|F42le1G&joE2h44K{lF$Y=K-&pc<s6xt^lA{!F_Ut4w5m%7~k=JJcl|vtx^3qdhCXr)
-iMwVjq73rkr&d$h65=<h}3Hkna+p`IA;-On{UNtd#Cc7mg<Il~orGu4uwxnD)=W9&1jz5A*6{ZpTHT<
-P~x~Fvozfw{Ki`~PhVwo~|Z2$1a`P-*QA7hfD0;SU+hbzN(>q9hVW@gV7<=x|oVrZfqo90Oq<(@msK0
-7tbmS+r3okKM*Bh8pPJI6Nf`rprQW~xyW(j-DO8DgplkzmT~)Y;jpE9=gBQSaWJbhKV#_PD;Cv5Aw+l
-U{!0z}MN^HjRB?R$*1v#BMz>HySl!I{J^i>9<hf%$rVq3_6m$>3JEmb23vCGF3Y=J%3o(^ogmNsY!XM
-({Gv*JxO?Lt;~R&l$q?>9x;d7M$g)$__H=)eyq(z!?70SemR@_%DLL^9f$|?u0O2W5i;N5X4e_Km?5k
-gGYt02Y1PS>bxJX?PGK!sr`(|G>nhqFYh4~7(n3DJbRyV=v4dJ%Uk~OxxLK&qPsjWSVO?8a);7$*+71
-q=Zdu`f%(q;h<CEAdUf0ZnHJj)W->SVYYror%wYL#WY0lb*=~?@UfycD;4|Qkk481?7^jitsd<1S<n9
-^RPv(u|TqQbOo#@eRnDPJGt>k9Yx-i&SST^CO0>&1MDPQo{*v2-7&=IQx9b>W-0@MbN-+OZb8wyYWT@
-mjdTVCr(If9`%nLY=<{^VhXvI-@@`rnF+l$pOqr{4?fus_sw`bnLqFwmG^^{*tegiLYT~o><4*RtDld
-@xnm7Fifn&XYU}!z8=h2_ECvX`vJ{a=ak*7bJ#A{S+|X~EcegxBLzTDN@RsMcuzb?A^uNpPP`!V!~mh
-0=zKhwkM41irt1yVvp^fYDLyQacoI0cRe7r`-CX73M@>XDy^$JkymZWKOdU@Skl*2OX$EZ7&X=`IY02
-7!wP5WgwyADaQ74lKlQe>{AL+eAD?_)k(d2g6NXn1i`6|p5nCX2&i_^x7<lTq08EkOH`D7H~c4J+fj%
-1#Aqgx!vpS$c04y<T%tW~*&*KMOov591CQxkMPLb}00dXF8Euzi0&)-h!Q>o_@{bqpKNI_hGWELB-9_
-#jay@+6t3vS~lrCG+Jvq>Vb$PEWjQ&e}~TNc6ND+$Kk>*Se0rtfMV}@-R^PEm_A0MC$RnAYT?l^*v~^
-9}5a2^F*1eu2XZ?>Dj>QHWjUo8OmGa_$T^>`jU*aLOK+_Bef452e+%1R2y97@#-y%eMaxkT3zYn$2!@
-9NM75Kyk5sT=~^=xhth(aP&y<Zs#JXwU3Knu#y-E@EgjVR!K&Wd{D}v|2f~-=uh#gEavL*)vHR%tQ?l
-Ni%umxBq3o?%HDj$PUaP_N^W%4rj+DUIEh?O@vp?%hyzWfA?o7PyOuX(qxP3*tW5jP!&-|#K`HFfb+X
-KCjIax+jHq?%^pX@_8HiK-GH&r+9qXFFcjJmq1>*>pShP7usf9_BnRB_$0w&ksJS|tX=OS$%CzPZg@a
-l6p~%S`W5Ew0GB1?5frnXLGeOZZCOg^KoFnYA>|-pg2v`Ha1%wG9KCvo5x`SeKLytV`INtcz|v3s7xC
-j<;67d|dSlX?(ko#&e6Pt<}=#s%HUV0W2W5uH8obaIM~4rQMD%Wb9&LU0Ry_w(mlGd%&-v`7xhz?;Nj
-0&v=heq-lkJke+0iUgCEU@jGa6+nn~HeynR)3hS!7jn(f#BrW?rt}cJCKTQ3{!*%l4ewZKY6?V60FI}
-2vW9b<?UOm0vo?@)e({AZ?)3er-4XicQ#n!o^1x`ddp;}$tP4(19^)#gg)ir<ASK0UFQaOq`OE1Y~5b
-=-b6?In9`~uPZM58nx^U~UOdWlzUiC5_7ggleo)pv_BqOzejynTvGhAT8$PQAg{1$vtwb8ib<Qdp8b!
-j)vM!o5zOdz1LHfw7({{2H>G-Xhu6;x|zzk5ZU68{O)ps6%ylHc>~bMIH6_VBTRmrfcm*JZ`~SKj0TH
-+R4_GPD>Bga<Fe``~EE~U2Uz2$E~Qn3}9`dT0Y=gt*>Zy%&Xi(@yzPVw-x0Zzziq+awy)=uBt6<N9EU
-MNXy)Y@j_kk3>2>=GrU3g22x*0X#~E}GN(nNf4r`_jx|TS-5RpsOL!6-EM-C0puN!QK|?5LTB7Bp+N4
-~<aj+LN>PlJroFGw8LaFTA_o6<*7DhM^VeNFGOzZP;V1TZxKkI61#k!^hkPI1E*E*dozWv}9%xJTdPG
-TdSgf!T&TuM8O$<|P&k?5&#p+2s}ziydgKlXA~Fcx5_bNiCqO1@-GKL6Q=Ea89lAxrqbWgl`^o%?p*G
-Tlw7wkSE|i=`3YRJPD-QmXqrUrhE)IrqoXbz^f=Q)4q`=3+i`9g7n48rq~GY3L#?du}cbMz!?y-cyq@
-Y-6)?C($4{GgYNDn?h!#=2Gma?5w=(%+x4bZl;9>uQuWzGv(!F%*s+JOwO)DfPIY|fPNGW-(5SFJ9v<
-5Ty}~*Gj(i6X6nsJvxyA$qUQw62sKJchG(2T)0Q!2o-K89_SB4&)Ts2NT=tNn$Q6z>+PjeUBwLD=_=7
-npy@#6b6cb^L#d@fDQ&UPxuE6F-&)Dpw6vZV<Ap-n#BU7f7%f4e~HFcD#5}(MTGPCnE+c?X_n=P^0%$
-!9x$(Boh(Nl3aMeI~le6;ZBQb)UtNB-|(t{Du<&d9P+P9J$#Q<HK~cBCN*vk8NJmLqA)rIMLEF9$J~H
-IN1qyHkcq%C*^Zz{;uYh?h3QQ&$3CdQHhn7uly+@{?0@z-=lDWX|3M{Y`p%ct+=$Q)k*|%}ULUCk8?U
-dV5W@W!{oOSteyp$(oyyl|oVrx7h6LyX-k*?ODl4!IEXe)I<<`qLOlK_FPDlEj8c9dcjRbwdAv(nFV}
-^%FVD5yE7-His)1_p0TM(b5gHxukwh_BB!LxjC&e-nzB+R<z!?<W!nkQA1GaSKA#}IXQtY&NYLai5ya
-)&bYnB~h^@CIW!h8O?XXSKY`4NDimCv7bCa}p-D=n5bj*!L6JMqwyev)@<~@~i7IlDqEXuilO=j$6l;
-$m|xp~6&fe0gIp0Qn?6Dds*naxMuQl2EK>^yRZCnSa0;18QdI%|Jr9VFSGC0Yzi)|`yo>@3VtNok|T!
-sxA4yUE$Ey2!o|^}CVa>?K*7<5P15Ia$dPG0OTe<UBbe`7VX&zAIZHVpM^U<9T_u)Y+KUHsuLg$i&LM
-CS|6k=CJ!!?T5!ymM>C?2lrSO%%&*PGj2pG<1KM8`;+8SnPsGiwkT;<D*Ht8oTP@dLs^q#t*6j$xY>z
-K6k-*4=+?5#ppvxbr6c<>_OvuABx>VDiW5_10Vg4bB`alonk=OW9(8Lr2*=n!&)BFqLP4;NxHd#egvx
-g+`~Tt5_G1oy_VfOahA?(`hVew&`&`>r$Re%s`;~_Fdb?5r*zZ2bNB6s->WBCE-BAB|{`36jx!Qv|ho
-exm`sAq~_Q+r_G_I?{x4^gu1N&0&@jdpX=oM_Pps(`tbMw1S#RW8|bOV$d_GPzLFWkE+_o2#eQuZiik
-5_RfD)&hWPF3mOs`AcM?z0(oMl!L-1ADS_6|T)x_yUFVVg;8d|3c+oq|(8e!dNbUO4*-L_^eg=y{Ozb
-Dg2Ho|BsY^kdNer#xr-mH!O#%J%4rhKN|nvo&Fz<|NrZQgQVQ;8`Sr$e--?{{`}tlTaN~hr+T#bYkrh
-`c=jjt{e*f7uKcv=zw~IjOH>2*&<ir(ehLOF*i%8Hf}Io$QZPV4y@E`^>hls-DEPjD`xV@+V7Y=@72K
-@g1_jqE_^N{I6kMy|8U>$FaJ7Of6f98CreJ1+^ivd^uHa+^tqMje7^<LA!5{_ODyUbm`kbO$!RB7|+m
-w^a{g{IL6)ab9vx4gtT&Lh_1xpmnS1?gQtAgPQ8WjvuFhD`Qf=t2MT7|cQP6aCzJgML@1@|jhuHbqFS
-1VYeV18}=^wSlbrl3{9Pz8+&>NR}MN_bkqPZZp*;2H%>6#VaMLlUpAKkoS7=Ks6A7}9urt^Eo8Rh8>+
-66UD<Li=4k-@o<=X!4Q%#wMTtHWdG@Pt&{qq<_=92mfdB{wtsV-({e|^M70<*7R5NGag=III@;BpTs5
-emUL78FMKZHGtW!7_~{DqNonN50s+@i_#Mxkdd}EH`in117^&b}*BIWU;6@66^x4zTc3@|obv}E0)9E
-jKMwlkh0CmEtJ5Cu{!l^q?4Zbq`dnZ359e@p5C}SQ|dQrK8mz6%fR_S{K)T_16)q^E`KkBc6i`4V0O7
-~>cpMx5%4f}%2N?&E;yqh(_@;~-aEq|BZLw-7Th~N+!<gW46u`q(Y+c0*K+=B@|NbgoMuOhga-bjC)f
-G-D<4nyv*5}ewe^dNGdMsQ|(8K!{X)A-2RL&w$-T+o3rFESSpe2?CfK05X*!Tuek8TZ4FRpvy3&nfd-
-f**Cno+uqViG3F|=nwYPv9<(vDf4cElW^8Gg;_@MjV?0o27*7)JD=QtB{;OJbPp%^Lsv<!zmfP&ZxMw
-FB{-`)W6Q{#PSDVU^kOmx5bRIyW^W2Z@ZlaZ&D8{N?!}ltr5R6f9lf8BJK$}-Nw;dQW77$KNG~HiPZF
-HiN8&u0;M??uk$EdYTtG67%+m<odA;Nz_VaJ-OFA~WW1qxZ{YW1pb9p~;u92Vxa9@8J9`{a#43O^q2+
-mOELj+$Mgf@Z7i=gKaswZUjCpa~XbW-F?ury4jvy9*cdi7p9c9CF*p_29#f<;4R7{Im44EXI(nHL*IV
-;Xvm6gQNhmEK@7#}k}DZ$C085=<I~eF~H&K_|UoWCqN>LGrDHU{*NAC-)qJ8^R^u06(JFM(!sG{uVBA
-2p&#6kHC6?j@byl7@=f<;J+edm`@0<97$s%3bTq}&?uQE;K)%jJYe>Xq*o(ff<N7;WR>6zqm}#+91}^
-j5KqhmZ;zDePbau4Ql<%bNSOgWOwzo9;Bk7VQ(QKN%E(NzMCL?-&zTiJ37%Kxiv%CG$hfNsE*wiTM&S
-zx?!SrTfXskj-z3Y(Nzfim<xA##g6(5e{UX?59GS_z6TxAzGM#XO#c_=NO6C%Rr*4+@;uC^=3dwde!t
-)l!I!>i>C37c&W2Q>n%veR8D#ITl_!M=8lPSy^f;f>I?%@R6O(#8<+=B?NoG#s05v-UlaRWRwgXD?Ao
-FusF4#h))QxixY$bA~Y`x9jN6$FnbNF3fL_?<EXZcUQ%12}Z1OedURda{&fz#CF!oed{AAdSL+KLmTu
-BEFFs@FRM|fg8a)(it<OT_X6EGM^@xks-~Q1h2c3%9PAO1k3NHdO~JE+)D5SnO70qn=8v`Kf%xPWL^~
-n^KGi!3HsP2jo4??%dTXbV7f9F5ZsVYyaNvNNPg~>{7fXc>0TLkGr|7zi4UNQ;MVzyCj?(zNbRs*Ct%
-tlqM6L;1Z(MCLty}CFQIxz?l}Z+E}}6!nd1rO7fBodUsvX1a4)9uDTM(n_#4qnW<c)}MGL`?l=)YJ38
-ku?C%C3mrUUr3a(5COjw`b$osk5O)4Psvd!OKQ50R{p`&xp-AC~1il3>?Is81(%Bf)~F80$pg0TZ64^
-vRq^@Xe=Hn?SJ58kuiff^D8<ER(|YBlyg7)W(weRf0b~CwcNK!HBieJd$AETA7ZG;GVS-&;0~vJ}>c1
-A-HWll`omg3C@09@;`@Qhc}4VWbQ<8#Tya_z@cxFe4-o)roTn9M`pm$8;QSUjwJZbM%fo1BRFW2#378
-J&t@qDdcZ9-wj?uP*4xA@GUpI{`fbH$g7$YvZz1;;1V5v<g3J{Jk8G#5n9Rorjx3jb9N^d;(%nk1^={
-%bncEV4ncg7i00e#aQdyAMpWsq@<H@`Xa6jpxWCl#xulf;!|D-pE+{+1$KS(qp48gzCyA19GbKWI-$X
-r11rbEPAGA9xYJWMo_If&pSdN+`HGQl~AC5`w-0pA)tLG1?M56TRPefn#OE<o(XhdW@TG6UYB%z*Qi8
-SoKh#=h`P$_#i|nX$k7XJrP&zGRpIhbS}lCf}mWfZ56nxKx<|u}2qp0{)=f0kIDgX271x3^-buvClF=
-nXl!M-%NXo^`T&@IxU%4TPeUAQHfkmaSP`o^irxaxYLGhhH65PvMYeUlOWcWC=f0aXF&w9b`+{>n2t_
--p=E8vUCg;P;*KZZjU;#Xk|x|&H{rgn3HQxSxbJVm{bUpF&PLoZPl-#7^tsf&5%W%~kJYPf)V}NL>_K
-x#f7I96%NJ5R;9X}AE|U7CW<T~4*#qkA`EOHruR43hHl6skTC-cX>)35>`B9lOBfXIVOZPA6uY3j!7{
-G42=_WRH>Qw6cGML?NmjzW&Kz{{n_3G8^#TQ>>TefUr<>lq<qmMpfmoHytYA9A90+R(7YB7Iy|DghZX
-4p4(?onYq%746A;D2%M-1+kn;75Mw;!%F+EP3xEyPhmRQe3jnoeR73=%GW0gk21a^z`pXelbn>&z)bb
-|BfQ_y~;lKsJ<5Q)6y<V`yzxtbTlpP=ssn?DE%|Z{UYp?{zdY~Ltz%l^rb!XtO$ST(9ylp;jBpibL21
-Wlt1T=qlbVRxdFe6N6&puwi@^g{Fhu@dg$Vz8l(aH<%!dyDZs@{N}ufBTMx9o{)t0JiG(!pM}P9~i`)
-Dt$AGwmOn<3(aI4ruM=8WIuuFgOrN;(^%K*Y&d-&+u?ynvaVeyjtccziNmZFO_OTz!ibCVC%UOZY*F2
-Wz>{L+-|wHJjq!V`ZhpQz=+Tks!AIHfnji!-24N^g<Az)c-)pf6F6^kx^kmM^OCEEr89(ADkrq*qtKW
-JA-$t5f0J<Be|OT|_T0U^;p|>Gh%4KyOzLIS){>{(EvB78b_h;^Nq(Nt4(;_uNxY##gLZ!Crp(Wwv3%
-1|j1ge)u6fbLNao&U3IlOnrXN`b|D4iF<SI<r~wsvqjr~+@5w<Hd{nRl(wDoMcb<qND}T^^uuon8_BT
-fsWZ28ej#nafiqL4Oxd0m8}<spgu7zy9?$t(34CE`pY69#NnnfkbKBpVg7mg5NBWC6|NiXR^-M@H>3s
-{kcI5#+T{-hqFT2XCh4E3ZLGlSaiWGd(H_aq^diCnXLPA1VXlN)KHEI+ynM^D?I$H2<!h{LzmRoLNx8
-8ayn=xYsTbMGI&6+if-FfGoZ1(KgEH^h-v>yu=EMU*rN3&P%8O7dQ7{Ll>S=h3>qS&fz6MH;2lD)Hd1
-p9kIG<$6EOtxut4%>VGICkv0yIAlx&id`-Y|viLM(^fq=t0g#9^q{IVa}r7=WN_5&L(`$SsuMpzU1uo
-Z#YY?;B4l1oGo6wn3a~6vXv`WvPT|yggyG`qwI+%o?vU%tYObT|GX&Q_3PKOx88b7v}IejZe{Q7TF;j
-J#MxWbobB1OhaEU@fE_-3m>oZUoW1}4`|Q-IQ|!}EKV?6jImzDpnX@mx_(I4<Wo0G%^~Z17SLZmZuC8
-Wh&z=>sg2!VZ^$+n(d?%=1K|0iWsWY^s3T))9*(g4U-OeYldHim+ny+MU@z>e={J7ShvbGezJH-#B_@
-gL(EXBW-;?JV^`MecdO7Wkd_^(m?a*BU~;-7Yl-<#q`QvBN}zK!B9r}!^X{GAm4IK@9n@js*ZUs3!@i
-vJ_UuW^e%us7*<G?vYwG2RLqyR2W%*wL4$PuoS6@I))dPYz=I(+P~9zMJuHS2AAxI^#8N@!L}T?i4?i
-;?wwgJ&iw)Qd-qCp5pT;{!)tnB*p&+#os~kPf+|bZt+R^i1)(SlHxaq-b?YR{i!A;h8tTmej~-7PVw)
-d_>WNhjTHZVxA?3ji)Zbq&URxfSO`_yVeBYLel?3`ywz=t56WSD!hMY2{RHDH-(dXp{fr;~+%3M5;t!
-+vu@rwM#m}es%PIa^ivK3X-$wEGQGCjC<tG&X48^Z@#qUQcjH47XD22aK3eQstyD5b)D23`)oc%nAvt
-K80R&zIJXIFA|?sd*C9Oth19Vvc)ia(m-Po((C6n_rIFQNF4Qv4Sv{sxM_lj0wx_@7YxD!2H0#eqPI-
-;v^Xqxiikem{zTBgLOa@$aVi%P9T}6n{I#Kjjv`{*xddcc-YRF{UvlvoOc@4er&md-vWqxqMAyVxptX
-=9s9_qfO?7{=t3v^y+!jO+B;}%+cgcf6-(xn-fB=M}V7dGAjR=xF}1^XiDA^Wg0!kl+X_WdiCnwP5DR
-1MVewvQRXO$54;BS3kkU~p$^HIxESpj+cBtJ!hiuXg`VBJ8GGD>_>_K3O!VlOgwAc+2a!Jo2vz}lCs6
-#+CPa>kN$A+7O?&AtaO~OLNJvJz(oYC%+osL9Q6fNy2++-l_)%u~n&98IP3Lh6wb;JMf#N5OHpSf>6J
-v=<=zs*;2eoT=oxi_-r&#0w|2Xkb`W@;8NB|q)A7zP)j){r0#C5F~fc*RP73q(OGsjrs%yDD8bO=-d;
-D3E^|5zr|j}lpETuT^<0E&Mi{Xr3N#Ns$hOq?J><e>4N@J}!giUbNVltzcKW81W8Ljhd=3B#HtL=Lo2
-1~-#`m$7373Y}d3Q3h{Ac*{^rj5&_DJhrPKqVrfK9-~K?OoKfQ-l3xt;u7MbEecE5iAT{<VPm2Odg**
-`RvzG0wAtkHPZ&Nhpm{T$u9cNA1d4Gnqe+nJ{7p9u4IR?lQ{Ot8Jfp^tEQf_fMb-HyB#beQk7()RJ&c
-S|2}nKKT$g`B6oQP8XyM@#3IC|kB(5>6&L8|C0gLo&)pC47RNUwYk~PNM)0dAmpw;j=6Y(+H%^T^Pg*
-Un1FeEA>y1uuRA4=a$f*5TXI--HMTl&PBXw!%W-Ylm66W73-^YTTthJw)*q)3$iHTvA5M&3qsxdJx2f
-j)P2Jw?;!CQh6v^pS<BH@S3=7xQmqB^egBIyZ`KSYl!8A6v+7*iSkIwR6^wIJ@ObsWapgeE8vq+2fBt
-&YpboN%qV$&#<*?*9u+X%{Si^`rzAdzb$ly56WL;kCVQ!o^*xXyLYoAM~(>H;PjWDvoF8=lAS(%npIU
-*vG2b7j{W@8k3u*2?YH09rAwFC%CnrkPWIy$+}hcJ-Ke9xfjT;>mn)K~qnk$^-Tl<jy}(-W4QvqK#wP
-In>~8)ZTgg9Ruk$n1e^<N3rw%cmM)Wz<*{<kE@rP0TNQxgr@o%U2cT@boQT!(<{u>nk0L8EC=l-Lo{6
-|muzpAHb=Q?-j&_OJPw-*OLcL?e=aNt1P>Da;8p+iuIZhgB3v~1ah<g9)7;9kA@^cvVIz;JyFvUlj#q
-fZ|S+bW>zz>t9<tW)>C!2>({4s1mMTDEA>rBk<F!2|t#gS#jPqcOPeK)v2SnBrXDx@C(FLGAhu^waBo
-n|pivUvDsU@M_kfZ)ZQfFB}F2bPe>;`E(zMr*m^}q<>wIM;o&F_3&-pJcR03w_Y7RJCQF%=}dOYKcrL
-JK0QJP4h+G`NR)rykdU4sA>Bd*eVypR9*u6@<jVgd17jmG3FoQarltjTZeb7}8@s#8`5}DYoG5}AuiD
-OD!=r6MZ|3%Tt6cv(o<Fn23ix8ncVO49UBOhmI1;RP^XAR5vWu%Dar`%q45yYtY#Y}&{#QMoDqa8I3#
-cCO72PAm-}v;?Pfw+O=baya{PF7_e)!=V>U+NY{`>FG5d8etUw{3P#-*n}`Q($=_wC!~(CKs`BS(%Ls
-AvjO>0k>z`0z*ghq6Y;+`4z~-aQC{S1qqGZqV(w-#&U6J!J0q(MKQMPvdC5efxI)%{Sk0>QDKHAAX1l
-D*pNBpK}_2bNCYtoch^Mola*Z(fY-S6DOY9v17-gF=NIIVX~a?$v`_MxAX%Sl&i0LVb(rjz^4M85q9?
-M*+Xh;YtJ(@gV&CKd*b&|s)J!j<Axh<=neb`FM<ETg9rJREn7I@$2V`@Ebu;a<_!P(>#zB-W5@XM<Ht
-of#33C4?x!iv)33k&`hrcHHZ35P%~DucI6fyQ$Gm*`@_5p#fg3(&2x-@@-H_7K(%S|P9t_?Ena$>4r2
-9wl|K*ooIO#Ggd-Uirlz6!O+i$<+<>lorJ|8`Ll>h5r{}Omo`3T%$uBfQsAAkI@u!AP;C7nk=lDS`h`
-st@ylDi9(rt|#y^Ze(ZfBxlz4?fuP)mLAAPI;X}IHL1Gs&7LHhvkU-NAV|p3VFF+;IF-)L3>dq+6(+O
-IyAHPHl#&+31`<!W$t?2-SPez{CDlzwT#NKJIO>5XxO=Pr@$Zbaq845Q3hXp@rAGhN7M<b!vend-h1L
-j-9UK&qTEn-5a-=@-xc_y45|Kel*8rA+Abscko^L=UxYu^;lY0d|C*W_PTi1@|M2ke-jHLw!2j^!!~C
-6h-r-c{oOEVUhrxf8$AJR}#0%W_@82)#%E^-_g&8!U4S>9%o}i3?+r}R_Pd&x?=p&qm9pHT69?nB{a6
-X`%^N9yJfB6jOztz;dM|Gvs?_%zT|F&)0R`%@Kb13QX%c;FYc?cSSFL(~Vf*zCwaEBRX|Ji4si5F(@9
-Q+2pkOR;Hyup8z@w4A?ZvK$-$P=7L9Oe9mL!1xUPc-c2yf4wv`=6Y5f1C5=pKyNh;>9Qa2>#U8yI$b0
-y;@ml@1LnBs0Wajsh@Fv(@D;wJ|O;s1}cML?{YqvXvq4A^O}pCryb`!ben5w;+pV3d-g13dD)O5L%Ne
-J6oCdRhbw3SE|4SO*cct)J9v&Vg4{s<(eBciO&~O$@E`ZFq+!haoZm>ejvyL_lHBB+l=x@7$9d1KYX9
-9e;!k}B*V=!`KlMi(Z^JUt<Q#lOSwOBJ8yX#`<B&7RJ?e!9Q7`aJ`hxSDiG~=G|FIuQ8b%%CeE4BWLn
-zgSemgl2-u}n&r?z-yuU@@|QaLO~Jww~l7#)!HrsNC!hd=rS#6vsd{@ik!>L_UVl=En!!9p~w|DIpV^
-Ao*~HHH7VbLTkqGxc83puHL$jg?7bbX>S_fgj)UB!7N>41etI(fr};NP)y{Uvoa?E6yiWa2^L5{-x?O
-$;?QtJ|B?v8EsPUZL&W1-zw`gwYZI4mMZY4a$Xh|7S^5G^CI96IcZ1-<Q{U}kPeL&$U5Zc^Ftf>i*rZ
-v=j@~SQ+YQE8t}}h<os4eL;UBQ#}ZD~f4S9X(4gw`0JKTeruL#XsT<MIb+c?+=~>(u{@uHGcga8X@#y
-ETC=b+M^aom5pgzE^(E$9Z-Q(qtr0`efjpQ%P9mSs|8lEH?@FY?DIh|;jMtDsAQqrK+XV9S4XS7L!_7
-UHAaeh5$ApRS-Q2pO8k~z{C{?y(J`KP+J9QqLIoJNO63ur)p(3ETef3%ZtEjIDj?v3Ct6AjN34bRvl{
-&_!go>)aRI60qsM%HJvNiiSS)o0M4)o0M4)n~Lx!S9G<&Njp!^$h(B=~=E9G-z)_IvT4Z8ZCG>EgH_>
-m_LHQc25L<DW7PVGm8IK{Vo6Kyrdz4Xt@0wqQR{`$Ef;jdQY}V;fH1athGsfh=v~TG}<l+{7JuGHgxF
-F?xdp>0e`fMfRGu`0G&sp1#akTHN6ae=x?Dj;CZ`XIN!K%IDegJ_&d?Cj%e8WXg2@#$I5GJY$}P)*;F
-RsT76bJMxSks<B#@2lm8JTM)XEmXfNt3@CI(cU84nUKiYeYYtU|@uR`C3XWNo+zJ+LbYvBmKetrahm1
-t;KpC6(&Y2|DaUv}3RUXl^T3ui^~MJZ<Pu;0c%`{<aU!Cl7~pmdC;@Tc}($Uot;9C!mSK;Q(tQ6GS}R
-wiiU-SuPizn~HFzpLa%{!gM|GtsbN0ntEp0reR)JgaDURMD^kG~79c|1F(pNHg<=DHcHk9<)g#+;ohg
-dm5L2v>E8bphw_cw{9JO<&{@B^djwbFO#d)lS`K_@ncUV@g0RX@U4r92C55h5)J=Q^%-r_Gxi(#lest
-Y)j6a2s;o$Uf2N5$h=%)!h9yM90-^y=LmlIe_Zn}1fIrECkbjcvBG7W*efRNKUwu{3b1igev>>kY_?v
-uZ(G9$uXn2Qc5cQd8K%1o1=QY$OJ&`+_Kavy4A0!%<6Aep=hGLSV#i?e2DB2{Gn~w2jRpaeH@Ym!&A|
-j$UZ~%TKB_%Ez8q#q!S}t9>$iLX}7~iujif=Cr=kKWc{Dxb7UaM$$T+#3V$<gw=OuRHh(tt<k7}P(<(
-);8$qW^uDUHP;}nN$C}a>9fOF<Dtz2Z1Z<BkI7yg$o4@?(+3}Wdevg)o_f}*z?iu*IYUV>T{W@&kdfd
->Oa6AWpA}wQ4aj2mtGRO7j&7@(o#NW&KwsFSEJ)<Wr7E7(uRfCP@jp0M%tOCp7!9=iWMt%P}|A-^y$M
-B5)%0H&p*%6FX!duahuJ?mn~Z+>h-6eek$4>=t7Or0=&^Tpsj)~1br0a0X(SBM_;h>i|1*)@!T9&eb#
-i0M^$}ZL3QEx@ZY+1tATW#$r}Fs`}ZG~mX?;4l9EzI?Wib+XP<qRj~_ptPntA|mz9<AhaY~JuUfTA;D
-hl!@C6O%3(!w!bYKhv8ql6X4$&7PkKGP4Kk*{)ui*#R&Z*Ne=13g_^%-r_WBGAF|98h<BS(%bjf;z04
-EZ5hUrFQsp>MtQ)~i&9Ir;JY{CrMzg2O&;+&G~l?AfzN$OCW(t|%i-uC($1eULqjbD-CuEKna%r$v3H
-a&WKDFEyyohc-P8J@D~s5uV}0hp&3{(MQER2=Z2SnHLlk@LO)Vh4<*ugI|CB^_+BTfeY|J-Ee<FgZ4J
-01utYuOB-$L;U{PEt;LblKT910{qrjeqWGo<XYr5U-N<Wx`|Uj{?`xiaSiO2RFDfefW#!71e94j}zuk
-7*Z9FqGQ}CU}l|q(41L_6n1a6?CAuX7LKtBw*M<0#4g82xHBjE-e31tUb8hMEPbDx1ne{}u_k*V&k$;
-rw2{N8)-y$n33PMs=V)M<@|zJ2@hxpU`=azLM<&FyG(0AJv*&G}+%0Eqg4I)eJpu)d?ub{~6S{LKE~{
-2S^P<ey~enZ=72zmIwv6BEPd&z~>K0W<*rF=NK?Y15_&ca#BW&|c7>je9W`gMJOU2cCeCA<*V7ThOTx
-p4yTJdiLx&Y{P~P_hSt4XYhw?;)N_>z8P-73v<qPyIs`ZsHi9&85zk33>YBF0se^7kdDS=ORF0igdCw
-gfLx(HM%iie8-x><+pcx}Lf}tyFB>*&Sa;%K5$f|l|M^cr1Neh^L#iKwhNPq<9vd4gWNYo(wE}<e8a#
-&?c%vSm{ee4lQ^*f=ZPWwQ0n`bki#C{Wzf9>A1qB5~Qn^37d-rZ9lWRUc*NQ*#b=QA1zT(Ar5%^Hqa?
-&lZt60<rDsN8mCS(A86nLz~(dHA;j)JFX|KE7y4gT6|uZceJAOHA=hzDL1pPbaT&7eMVKH<KT-2TSoy
-2rJy-w6E;`VZQFs*lTIM|}eXE+}u*S&~zsOU#}<TePiI*G2z^wg&R8$sy_i>Ltnqa)L5Io9wO+!HjfK
-Mko*T=R_~QSVp_)eT}%g@OPJ0cNun<ZQusFAVa7NfBW0tIJH@#pLTzMoAx3O+8MM(cpyI*6X6B!pzG<
-UpT->H8V?VTKZ?5xe@*`<eiwlTtzB%44)7ao5cS<+oB)|ZU)#u>zQ7-4qv;S>*MZzamcVn=q1D*T|Ht
-`W4}W+0M;p<wk8MZ`Am-SoPoK^odE^lx-|l?ZUW9`zLDpeM9{}97^%2r*pZqW2F7S6B|5D$x9CC?12y
-|%k{b)bX)}cRgrvtp*xN#$Y?6Jp$JZp6rFX-0h=Ak#i4w=!`52($2(bLoOzk<69fA@aTU59bkZLU@(c
--O31BjSTDga>WF7qW%66SQc!lYaWbpOp72@CPnbzl8i#|6Qbwzph4$Hs`6W-=S>ahH}u><WOd4i?Eh}
-H7L*m+$oPg)6QHKfA{$xZ7g-QGJ$>%{Reie%i)D=0q)(qSG2p}0qQH{9r&XjkUXya3vn0tyU%}8JK>u
-D0S)Lop}(O0gB+kgLf;7<W6TNOqa3vPU6cdtX!Ft5q8+0#g;>`hn*VCt1^$rTtI2s&^6uUi!C#xV0G~
-l4WS!*bGU*6TDl7D>9sXk6@!<Hx>;BCz^1!}_zvQ@8UO=78_PKK}G9P|<^xU}>jE%0AkW7Cu^i)u%Ap
-47;u0i^4`4%Wx{#W3?NI@>4PC-uveH1h(*j2&N3NBKROQ-{^|J{y}{fP(rdwkUE&90&=V!n^w1N7E37
-%#$(6_tkbflWQgD~NR8Q0ntzQd3hW{J-|jH8zUtisM5P3aV7qUn==SDzE$r2@#f3sVMbRA;DHFWPxx^
-2@Q+0*lYY=uxyHri`!xz0;eS{$UN+wz<OtPsi6rtkMc-qW2IH<VuD<nwl1Zr<J91Q(^^T?+xxpS*B);
-$22`nExYBrcy)*ZmIrrT2`ro-L<Nc-5=Ccf&WoN|PUot#;O5cAP7ozT(5P4S|jE!0_n8H_nDa5ny2yx
-|>;^l5UaIcTgo;~|(GPkRdb9x+mCS%Tzq`iG#+NFO=yL45?=Mfp(mdO~HXBZaABVEQDH%qQNI2pB2aK
-5j*wcN|Mh4|fvLS$c5^l#jS{+Fc<Hzmz+FP^T~n&|qu8}t819=D~<?U#1*H97_}1#blB0$-sfPA&G`F
-(LYH-4oWEhMnHNeS2X4{{4mUK<q^RfPciU<BPD>#InRGe8+p*nxRR&5R3=BlbSa84mEi&wwdUY1IQe-
-QsxU~I=?5+g)VV4GSN8?ag(=!mwo#m4&Db=_VVbRN*7bw%_MzL^u22zlGi*S6a3f6->-^jOQEV`?saQ
-`>qmrmZrH(1S6*{)U%h_7tB>GA;EWma_1&pDnTAi1`D;MNxrN?!7>qwLFudS@UO!l&YGBlZsmW{l9N!
-ssa8K|yrH=y+)&|CdK7vt!b%GPF{*Ah{SJTIj%Y47Gv9Ynti+AgImRDly6HQO4S|asa>WE(YV6WiE-%
-8TQ92cVj>jPs#ALswVu@9O)@sAfPO~&8hh1Tuj6K0)Lj~%-?EWY>QR36aB!X$mnb}`e%u0AH=bc(*rl
-L7}19xU|o0d4f0R~mR5HC6BhYQm>~T0J9XIQ+2?wUU?2-#b_va{|26OP{!+p`oF2+qP|GUhEYfsGA@Q
-8ufLsri6?4fiqDLMIXVKz&2W3d}(X3bNpm`Nb#Wbv2POlPNtuX1t(*`jQ@ol*$VFhE25@JZCvXkb#d?
-&unC26x%3;Ke@4+-=F!K@-%cHWVzQk(cLoj}I#kG9B;O}K=f2?u8Sr|^3@O|Yyo$Q2?bf!By7&Tf0(=
-ClusOJNLIyOijRw2*>OXU9%a$#b(*Boee1N=w+zy#wdyvK0&>zIxKQ2%>0rlx_x4!<8XHI}K?RIgpZ7
-vTqrH_*Cv+{WF-&5zm&d->K#Qa{I#f#k`r<pLL{x^T7Fcz@7?@Jz<T&&U4K4br&zkB!Yz>y<I3c-em$
-KgZg)q33^d>{+#5#Q0kZ%=HQoD+A_M~|-E(f$)-Z{51Ja>tGx706-VzJ1E>VR!L;*ne~Zd7z8X_F_&q
-u3Z)**RIGpk))61xf58~-RR>}sB=)$MaJY;axPBP(vz_;JvNNRuU;q+qt`Esn}549sgIi`^|8HaHRSK
-;|7HJ=X!?bPg@4V?&Q^6-u<1}JBzEoErSdy?(zZa`O2!A-+#b3r-s#*ZUTw)$YXP)AMjD<Gr(UcUA6$
-P=h-u=VtgNiXIXO8E+(%PWQ`P$Q>)-PG{bJ+Bjj9g3ckf<RyU@80GUpZf>$Q!@BiSd@=u@6|N$S>J<G
-%$97Oax<Ugd%KdT<%AB^hUlHEY(W`<|}WoIEz#kL$IShT4H_h6ntm{Gl!5k72Mx>c;u``Kta34>dJ4O
-77SLjge>_&^2VO57JM3T3%jWB6T?|V<aBzCg-0ir%FRsQub}7rKP_H<Do{sYSk*iSb(odzdV5#Aa|{Y
-dX0#FmA>j@DbMf9zK+WLe8g}b*_f%N=^8(M5ZfVdYPskjwRCU|=7$$YU<|MeTn8`60=tdPgwJ#5&h0b
-q4Wm%=f6tyhfzHm(LY;Fn&hSuDQX=NhpD&g#U#@u5bw7;{aUOc3?FH)+Pn|l|X*jvUy)<S2us<y=EoJ
-maO&*_*%>i3jyLPR@n3)%xOG5^_#!I{mrb65<@8QsW(4L^5T*LC#B=ASIwYADNuvS&q6&WvN&3$8&`}
-_Nk-zRNFA3D<3DEogWK6DIx^5jWz`0!y>E5<fbbJCdN1JYLXp`-mTy2SnJ7@WDMaY=YU$G|wKKb<*qM
-z0fmP}&pse=jvq><qS#aqjN!M*l{nEOr`B{p3L#&zht>;KBTw$-Yh7K22-R9-KAh*;|g8p4s(2yE}26
-;T*~PuiVFTyS{1pl>RVny6>buK6Uiy(U&8U$iJkGx^e8-u^$~jete4EiO1tNWgk_RWvTzma~?BIGryy
-w<7^_4P~)k67~?GG^cC;*;As~wT%gYSiR@!g>fadiklYx3Jt1?Dm49^BL1oMMy8W8!>WsdgbJ1yHI33
-UEIfX5I?tLd`B0jw&!<w(YH6=ba@WIexuIZe}8w&<ToE-Sft<SjOkK}P0+r&JASN(iP-y1K97pk1tu-
-MI=$REjH$rZ>|{4!TMDER_wB`1e>^dGvhrhFCS+?F|5`<T-Qxj4BOxgU8SdFK+DcM`)8Q^7ZOi$)GZy
-!i7MYg8ZJ_Q5AkO@}%HIUDk0obW+<4eIMZd|Jg@#Cybg#G1sq<QwrrJ5?X#9C?xt#&7lN)e7gvh9QT+
-i=E<hbEe8CiQS3Y$s5R>8iUIejg@~9qD#u9y}ez<gRBt&S7R*Em*iNy??ShV`x}cVVs38s733%Vg0fp
-+a;zWFzLa*dDN76w_A7akL;WD6=#S~~NB6Mx=qY2lV#Nw2Q|vTj`R6wy;?(wKYW?To`frH0UyE}6EBg
-AgXV0owO|QqnZWD7c9@tYaFTBT>d-b35_4w;GN%V!Egg*X=Jb}Kk%hLC6^IngghHv^o7GOo(6F!@I64
-#Pv<GU|jyg21rTGO0(Zi+mNN8Q7?%c0Mi;~rn+|FeuahR>Ixc6(ySwOQ<Vu0FBf+9L-0n6q;LyRAKHu
-<JRW*lX=E!|!*j6FaTVcF**webzqbp6OG&tj#ep0^xA5VtsjoufC$ZGMt&dxwi7jaB*p{A`o6s5h|{&
-3Ri8|w4k`E;>kd`;)%LN>As3UWoSb%tbbuJGkwt${`9ObeBS5F*i^eYtbU8|9(!BtTqmy#2a7k?hBh_
-0pXGmQgEgBamEiLQwV}FDd9WlHp7_%H_0#q8QhxaGo58wZxv!kRndyOWeq~+N#$au_Z*wTOm><u}Oy3
-YF4+qn;G8RsA@g(tu(^Jn_IEB}Yg%dX|KW8k|^2{p8Ey!KEG=KTBq9XUr!_WV_&-_j^MeXiLPvm^0H!
->I*iWHga%=&n1{6M@b-V^VQ55$M!<MFwP)Wp2Rl0;sjC{dcIPqZcuB)SqkiQa_ao5h}whOfil(Gl&6c
-1L@n=cB#RzUV-7Fgg?+?Hcc@j@8GSW392a*nwC_tSi<X>xrF@^~U;Q1F^x_P;4|d9y6@DR*IEs`K)=C
--&$hjSb0`~Rb;KRO08<E-fFg5tv2g`)nRp6-Byov-Wsq5ts!gF8n+C4uAO41+CF=p?YEcMId-01U>Di
-z>{7ehuD6@*R=dqUV0YMEcDLPQpSOGMK6}6(w1@0bd)zkSbK@!T)VMD`Pu_Qryyx+Fs=U)`d8f_tUfU
-9e+Q5?Ev+wKdiwsCPjYkY~u9;${nm%)$={J{{IcA=T^h(WYv)*hrTg^6ey6EL$d)WT}?Y~e<0|XQR00
-0O8Q5kVeU(}$f4J7~o%a{NF8~^|SaA|NaUv_0~WN&gWWNCABY-wUIcW7m0Y%Xwl?LGZ>+cuKF>#tzz%
-_9{{%tv#*eSYiiIf>KyHnII|r`=u0Whe=<8A~J|Nm)^L_kX|n06>5QCE0EF_TDXD8%q>07z}{Hd||NT
-4IdA^aW+ZP>pgE#O^3h7H@%(Sj`u3dS4DDtQ+dIwzW4m;vu}p*&$r%>NgA)b^Y~MehfwToG8SnmCSH|
-!)s65@SJh3Hdgs}+TE>O&-eik(5?2YlgAbzcVrVa|ie$8?GWd2~2r(CFg|N<r@ZKK1Iy^o<46DzT7pD
-{N)yeV2+0o1Q7bj=u_!7$XrbRaQqG-CP7KMl+FPZ0AQ33n}x+0=kQi&p-mA#()VHB6*+ZXB^mKm4o8{
-j6YWG?jgq^uTIGAl#;mzxsvIGL$d=Ata)YZ2iu(KMOqnm2KIGfPJ5EBsL(Kb2XkKF_l2YoNCJnrTGxt
-V}-Vado3!6dH1QL%67KD_y4&^V~$?OTu3n?NFf{MR%eoVF;pV;Jt<p0-A@P$0EmJk!8o(92)oPHei&d
-$@RedYm&bKm;-NG0^NXi18DYh6;-PoUnVmkwuAw+jFHv~%28TY@oXk0*d~p5-QHYOF_u?l-^uR-@7>|
-W!Rv#IgXqoC+r#67cZaeD(m<6C5T%nGh8ZT&0B02Ru!@j;1Mk)Ok7pu=xkev<DsVc$$9Q}r20gF+jPa
-LAlouHQtX2c>T2v9ejIcKY7>RfiiO<+_IUu4>lA<rslB89b9cRTno+V$z<VXHt;Jr`FMUFq}cZWrh6}
-=wL1y~XLYEp#I@LPHpL{S>gVQ%+(J;DSE9cQUPba%WlAOyg?<&8+aREUX~z+9i=42-L)2w?OEo}aJsl
-^*ycoo0T2kGg;K?ld|*JA8BWXMpPGx!)5rs13Ekd=^(z=s^er2c2Ce)lJ}kitl1~-A^k=U2h+L8P5{m
-RU@I+O5yr#48Qe$JUole-@oBkdK!i_B=j-5i;KWFx|U{>tn&LvfHbST8o(YAD=*^fdAtX|!8Cz7)Uef
-x|EPRa`raezg-Ni>z2{fG)4xDrBGk(Fc8!`nz@C3Hx?vUQ9h|-T0e-i63iU-1E9i%XfG=Ya_(LB?E%J
->wp?m|7ULLKb$N34AU?N~q<ec!=8pd%>ta+%0l0jlA-JUKopwZ|XLp2doFM>6d+=(b2C4mHjPmXN>s7
-tIfFbHs^i|`cb!2NU;y*_;T{(Ikmso{oko{Mx6_!B^9D{wy@UHlN8{^i}l+qWmL*2A1{3lmU$e|+@n<
-n>{6e)QKvzmJpr#X8Un19Tx^qe?yB4?kr|8c@N$F$NZ0CADYf+g?xc!szS}DinhFHSoZo@O{4*{PFY;
->HNFPpNChw{oWA2-lgAtnC#-4$NgSFuSUkJ{vWwmzWVONau;3)A42}ne=H%468uSii3|L~g|NhjaCtN
-PT@M;Z_81<0e|&Ow`0C*N(EB@nhdJ=_<opmOE+GwH&yP-ye?8>4Y5Dwz!<Prg-?tha75<0v@y=J5KYu
-7bq*sq&pj6S<u=O0hb=CMepgO_Vmp^}fwfptoKb-IO`ya~PAbi~aodMzWFBd<Y97FYyzw;HZCcp9HPu
-8zXpICQRhNZ}fbv}`dv&tfp32=Xi=c7sNWqV#`EJ=3(y_y;1009CudgEDKmfkxM$6z}Qve73ouKLE>2
-9B3hQ52M7HZ>Lvehp!7LrDwv8)zMx``bV4-$9;`uQj}QG9gd{4>x7p%myBa4InE5cP-a8aH(os0nEBi
-yUB2oqxcpWaBBn#F$Z?vz`<y@u7r%Wg+!QVd7!K5TEMft+ktoIC8+_yW&|*txA?opbFU?J;QH1-U*2B
-TXit-L63w&8Vy1APE@m^PAEL95Vt~;NXiODY(`F&c#jKJYtx2G#QmY)c(&S(KV~y%8i#t$VgCA_MT%{
-Aky2Pcbd9?;*vjN=y*Au>o6Od1jNLC{$3^;Wfk7fe(7o>eXsx;Ot80dbvQHF^V5-}z#D3y$ZddTWQ)_
-rjS38M%Bhyt{k#vtLNc31@?EXo|T92O9s^_%pV3AM?1-+9j*L{M$!@%R>X8Elj)Tt2<(8ujQV%Wk2Z;
-vh9o`3V<{%~8Jo`fK|8iV6T}M~h@OA+aQ3rNATUnW~}^AxbYeJv{YZJpa#rs6o&NT8~QF0|bI+y3eR`
-MYlL=z&FdA`1yZ)>(}$sVritR2qYe@AQ+kCI^BN*Y9f3F;K_8w-;BAddV$XofJ#8HhuIUS+=+B7yhRC
-eJLt5*9sD-w>qbH+5Sk6xFb*>OY5Z`LEoPI5k%1EY!7f8|yd$LnwodD(e8ulCNn*XSe*__dB(xOz?l*
-rc#y9k1oUWR`fuchzYae$gkc!63NnpuLs>5DV64S6}8^MqO{K;ZIU-|9d>!J0ZhR+-YBHf7O)av^hwl
-GH~X3HMoJg&w!fvVhEHuLsMK`j6P&BN;=gUu!x!<zH^tzu?3NpbMgxj{+w?09E_W=<u@Rx-=R@yt`*h
-s`=Bebx=WrV_Vsm-<(=<Q}2OKI}rxm^EB^lseGclGbi|<0B_az0`Qx;I<Vq!*bIe9~>`3$Xz>DG%~F1
-ImQehX7f!`N8lf&v`#%j4%oZztljbW3Y$IeQ9;|nI_xAd-1xQE77-~PmH0Q1zjTbIIYiFUAq;-incF!
-7fAM@%T#L(rj(rvCy{!XX=4BFavP}hMa9krU>>5<%zm)OEki(d;O?lX4=P&i9Cilv?p82%B;UWk9G07
-IChsp%-#}sr#Cot4MP1@NL$K?A%v_n{B*YH92hM}kq6kwgS9*dfWOlP|YyfX?gT^l9fWnE;)lPt;`dT
-565A}=n1PMcU?J=e^s*S3|kbnHjv5Y0J5^&je~xK;x_(+3LpKoiGl7IZ&EqXE)p;Bi+wCXo0H+^1|#A
-6(wXg0IP@d8fs6Tm4fNlM;)Ng3^gW6<@d7N12ufU&+bz&7Lz@2nSykfzNF=Mul(!=u+^-&Fxl+fOXQO
-oJ6}}ebv}21F?&O4Ys*G70IY7r#?-O=F~7}n<3`_=ZF9{R}0aeHzbQH)K(yM;bnm~AS}zC1{9kLvPXl
-ifi4zf*3y!Y7WSZ4l>Nf*<2v~=wF%0iur{5`#ev2u`<LL$)MkatJ1A_Ix%5f+9!it6$rM{U1rpMbz^g
-?L=w2pi6(oI{2sBrgcULW$%BuMXDZ4u+6G?x{@^A0TZdrqBv|R;ek*Zj=>#6RWo2YiZ@Jv#p4RTD{-c
-e}CzDz@yu4&MMM#DCmy4S&Sile~OBN$EFu<_AarSgc75Cq!Q{<2X+kX+;aNvued?NWAsjAsiWbzLR@&
-{P2aC&uvtiaaV&eBVMC^5;p38V^Z7X^T5GEd-94$-3AVb4C9%7UjK$-T&!_!^5}DWqQ9cr?Kv20IkuN
-UPYAHn*PPW9Ct}*lILW}{su;h{rXjz=slU1WqaDhtU4wVbZQK}jmjG_iqmU3i?FuQDO4e9qp#E;sEjF
-OH8ci6#)El?MtgfmWLw-!6i+KrsP@sPgDi9pYF%-GOZd2F%eXt<DfB}WcW5$L!Jc=$Ku<S_KM0G2!vs
-w!IdodsS|8v!@|A&@c35sWoMlV2y|mZ5ED&)egA&r{yah|$0HUQ{x2)!p<Py#{`Zds`By+fjGObir%A
-kKae0H@3#=5%i8abSDc9(XkhE-N=q_WDcW3<;u*W*G?g%E9r!N~tmG?b9pv{@qcTa*DXfAF57LJFV0g
-F5Z50zPx<D%9VCGN^#!tQ;460CLxReucgT#1HDbcc;3AqS;1wJB^CIi?$8l$Szl4O1BsrzO(iZwDB41
-eNY?y9H#KvAm}tlnf5~BM*4*=))E@92<=UP40+dOoQHu(J)Uw)KBzd{K{z(%F4Ke&B|wn9cy^r?z-s5
-p+~8<W^H#=^xg9X@Yf)B#qZmiRgo|QU##0fEzI`E5+@u07(GLp@)W~6)?)w0T;ynUCF2_mI*0nS~gBH
-JDV$elYK>b3wf%r?QKFC-NM93IISqME^K%hW=?E@>F$G3uFhw>FkoFz~yG1g{|a;bEP1!_+##Ek4I?I
-!!pCY9qhK#v(Jm%gJ6HX1ZGLLFjawn7^r5y7Ea71<J5x&+!@Q(Q0PKiM*X|NCyzmXfx(#SegFBNAUwx
-kAS=B2qeuds#DA6q~rZAy45)U7~vd*h|QElEpyB9J^^@(~yynek4;N(Tfqw4-V!h8Obz6F{-gm^JHfs
-a9_r8C_#gGhb;l%Qzl<b$p=c}n;>s`X6%W9J>td&1feenMa@1-kgCb*pB=tBIeTp^A41PsA$o1(Y7`A
-4i*sf-C05mlZJg0`w>pvcjp;-tkmw7n`KGtFYZ`Tle@j?3G5{_7>(MEQ1#jLSTpYf33WeKF5qvmI3b@
-f|aUJ+S6<I|ZOO=t{lCm=66Y=7_tyF!H#17=|cGrz=V{BJ^T}uCu<#uXrH4ZBvS75szJG4-2%f&dECc
-x5V186K<lq?X|KVq{reKD$Qf+FEONzuE6f+8ENr}UW`>NFxEEcfn5ztmoOB5g9d6)VMVIhZdnf(ft>6
-7#@E?>JOI=7`}-__5#bn=V82JxYlCb)km8wu}%EF4!sh+ZrN+n8vV^MB16fK~`7JLei;q@bakRcj?%|
-Fs!vM<Qk=_SZu<m;a+nf)bz5saFWh8n<=O^aHNneVVoPh0g78#G*}6@TGxT^Mh(kiYnsE23h=_LQJXd
-89N}GoCc-5Tuz~pl)pwG!4fP$qIyLvL)O<JB<DE|bw&T4?3gX_?VhS7SO@h|TQb!E{j~Ggic)c1a-~%
-Q!6bO7m5~lwRY4at1EXN=(Rb?~I3}Zl`mIU3w*f0<}Nf);BMp}rO*hJ|D+}Z>TRACFS+d5lhS%q6xQ4
-VU31htp(?6#|(syjs=H`j6(B2;ltmQlg>&csbm)4torg->DbnMzR0nG<){TC*Ff2{k~<gP57GX?*?W*
-i}moD)Kfp?8MM<lykHo$Vkgjd=||K(R{X+eVWfYS*W8d^OlAQr7ae%M{&75ifY5<CXDrWoGn|cuetID
-URK?Zc_dD8yECdQp^8D&JD^-L%&1zDZ8MtbAxi^B9;@Kc<F9QJ?10Wkn{$=r-b~zqB#@;un1*G1Cu&r
-%ZP*n>+sD5{GpW2yKq9KBT$(MN%Q^wXX?2QpF~<maf&SvMW4=vNbCFIQ25s5DNovmEn$516#|DKRtG}
-x)stNQ#q%V`UTUb3KnBcc<lTTR+c}zpf*EOyPQjDvtSb-uA!WF2}16rI@JcQ!+EMObC+zz^I(O~Cgi^
-@yI=gKP=Nkx%jGl9bj`}J5)AD0P6(;YZrO<f=_RK(2#{sMtJDD2!F@M$R<n%lOD7HidF#ckX5-2AaHl
-?NsftY|$Jp?6T0FeT|M&`5YwnCYNah9X3CQNqM+9G1LDv&HpIy?&X5`$j3PKiNuU=XfElQ?=U$N*e+S
-A03}x9K3ydc!poje>gZhq}S5G-zI$bmR8R==eD+$n&z&#Sy98M<@>v|Alcr$J@3&Zd^90R%#NQ!(+TO
-H=G(sQ0QbKaDIcxbqrnBnDgz<SlSFovGnj+JqjGr4O2VG3AVurC@Rc>7O`ouKCZlk=&iAR~>@VVLY-?
-Cco-Gf3P4abWy3^-V?|#nBPi=H)lx2W6mi_yx@e+x9Y4P~Ttu?M-cR>l47eHwIeo6u{kQeq=P(SH^0?
-m@9H^kL*gX$*gM`Ug*VJOnl2xV*;F3KQi+mHHPmZ&DSD8Q`h;85H>zrglKC)o6e{Srr29V0^qjxN(i)
-2^w?)s_MovufK4kVMeO$B%E9=vC;98|83UWgn2oBpZf-&^rRz65)6sKf)haejh)=;;Fl$$`4RH;7C#A
-v9UJ>=or8}kRsJGf!5%cF`c~QX<RL9a~?VGaVAWXaa<|;0wbrH1R5HEQJ3lzC(0(em<FYfzLB6t12-T
-O1kJGo<9uLxj0=&+>3F4z$y!Dj)CIOR261nM0kyn;B(RmRnFPrJXp+H)jpz7QD9gD4$Dkq1zz78}qM~
-;JTK#|oGQvO_GM-2Sh1`FjpN7&YPc9C0*QL$}lZ{1xc1O_9wE&{ovk45hC0sR?NW-4dX`v?E9eU`QUV
-9W$z4y_1bn>GScbo#s_4N4oF_Xk_b)0NuI5)<4IJ0sz{P81-$R9u2R;5~$E>=;oKuMA&eJH=zypm=t{
-LD*%tqT0o;HV0<MmhBw_GJ#h?)^He|6j^3p@RlC#U8XmT8tgZ+FLe4YVBy!Ke4f%Hdxm!ZxPb8(LUT2
-(`3e0IJ(Hu6-$TOX@}D^qhpxr+eK9nw7a_4KPNUSu&REw?-I<2zwk<O5P;qX?P>!HtA4N9vhHR>YV*l
-U%tla$9o{wsYJ2cDp88f@X&b(>ajRWa#t}2>syR!HiQE})rF?UI5<DnzzRveYQ>wsox7+%qJ#^j0@Ij
-FdikcSi<|8|FnO|{PySp^W^XcdIa;%M6&8Tf!sLndZ5^mJtEo);-%BaNvEC|{Gn~G(<3xSTHO*PUt3!
-($<5q>#n06>o@2$l;v{*Y9yMU){q&2#;M+-COW-}bu8@{kD(HF2xshRO^ZLV2RdX0uT|zNOOw@|?U0V
->E_}xIN>cvkB<i5lgqDRYe*g!+V`A@PJq<u0dY96CkX;&F;i(^_2}Q15PLv*~=@ch*OD~DeeF0u5QqT
-JlRBbq8^lZq9ReGz0UM;<Fm|)TV6>j`9nCro#5w&EfDA+DzAclR-n1WWp~;^I!UWP9@va#@gg0=h?1-
-&&ql$pnN~QiC$oIKmE{eAl;k&@Ah33<N-Q~)*`gQ=xo^t8IEpdavY2JP!^aueiKP5OLKv)E;1u|gyjm
-UR70?0XPDr)f=UmhS^Cv0Qv=3xeBN4_LBiSOVTaurgWxL~RI-uzAjAl@=`RtIKiD%7XOqN2c2I!vp6%
-H0qisz?00G@4<Fh{%z)fg{|LZlT)aQuCep(xH;Bk|kDsy3*n@i&Z&Po$RmY1wk0m`|r23?Jmw`<lz@R
-@@Akthmd|=T~fNt%{%?`iNZmxC?WUZhX1|cqpo1o|F^>N7M0Mr;G6MSxD90=rq<Mj?dQM$Wb{g-tWuO
-N`~2Q%P{6+?X(Jyby3agk!GpUM$bevsDn1zp&A3v4kmH*Ue<=Oq8_eCt82I<kY6@n_{c%iL)JBBTK%C
-I0KFcJ6di%u+Xq@Q=rRuDW5-1(@O$J$$Z<_R!mWJ6WWs0d3QNjJ?oj();6%HYF4p^#=u!SM7eipbSvL
-ipt!qkk6Dp!;jsi3Jpp0RF;T7=&$n?A$ce$}Ql~9&s3GkJjf+*<pJ+5c+AY_R+W$%yW6ARa^hI(s2+q
-Xl58km~j2Djwesj!9^%Hn5{p`Lo3jEqe7YKC>A_F$$Yr9>32BGv(d(R84Cv2o0`$#r7|Ehd6I1Og`-S
-tN&1Q9En_vdx<v6jAmTI$F4a)obz)Z6uzCOL-H8@Y$Mms|QvTC<4ELi<=$RfWF$7G~0|ZKHGBk2XS@v
-_#ozzQt<E%LWAOsV&hc8;Quj=y)0_7$b7XavcM@FHy`v|?yJ>->Q1DR-E2fpJ<TNoAlFxt!O?o8He-p
-43I)w;^iwQyq72|VWL!C`;51HV<>mvNJKktP+4s<Xj<f|O^Cr$qGNRA|1<j@HmTx|C&y_amz<=pNM@;
-;CoG9f7h(kHY_EC?0$mT%@;uKHD7-u@YZ1Lmu+!!C!$Xo_jsj0c0%)0Wg%%l}E9RdM96Et<19p@c=;~
-aKqnUl5$-^33QDYXF{{|(mBLUsvM@CbyO@uET(4JOMGI;TOo#qLANXeMTrRvkmKbW^!YOk^Jb%8968c
-j%93)^@4j_;k<59Z!0Yh4PlThY+;Wf;@m|qsUj-Scu6o4HHf&MD0>Cy(%^wbO~X&2CVFo0do7~SR-E+
-@d+;w;dQ9aJ$Ar?4LkN`;yNC$*yfHN%?z`=$YoEgWMXnAw}7S*>L4IK4f8Q4qM}3v4HI;i1Z4x*_xxw
-!(~c89+`ad(Y0BPNasJH*(~+$)F^Uv6nka|2Rf&mNJ0=i58+Rm&bBMg#<ln|oiY{h~PPZ?>e2jr<*qN
-J;75)j#w9IA#?W5O=WYa#3&n<h0A{{RH2%&8w6;TE;?%sCNkm}Q=k1mnuk!lPL&y&p^H9LG)w|#kg6_
-S!&cG=NfPs!chlRme*FfYV30k!rnEEiMww1uK5A0WkDIGwe^K{lhX3pmIq6bWH#0F%qRP$i)2u5~|or
-YSkR*J;Oa?y40jRqgxbrJ3v8xxhDpX`%|D7~nlY>2T%;NFeuH=36@XS}-;`{hE)l*l};6Ol|1>WAAgF
-#BU7)Qx6{1l+f<CD9LlmA5~mG8qh=aa!uR6>MZ;3^OIxGnlAU79?i+Me!6T$F3D6Ci)>MfxLM74|Mrh
-=QUOz54+gpRdJu%NjSw(I1MqtCOH-KP>g3jK&)PZ&(gI)y`PX2#V8ZRJ4?j}Q2gzC}SQ?vnfG+FnFr*
-E=aLCtnA2x5eGQnnJBtp=_=UeSV+F%Kr5d15*Aq2a5jduw9405~bn+5+(Q()@}hmQ>X!9AYjl0Ei?Zr
-<-rS{p5HPiK6739Si<b@U#n&TS9tfy8fxhANAu4r^SeA34Ldg1n=x9gj{7dmNAKMn|4sqC_7YrYNgQS
-KLjUUSsTL$^KR<=*CdY)(3333hL;LPTVei886a2c43wDIQh8@8ZB=?fty5_`-=uOkdc&5|Gs))HRRnh
-v1NqXKyr3Db`GUPREPgjs8Ffw3FSZ&h~!!S>fUCa&aUdjE~Pz;t?j=vr@i?|F+kKtQQ0NaNaf0xr=lu
-k;Do~zOxsJ(u9E^}hwR7qR)od8DuhrrB;x>XM7zTZO%jy6rkSPYdX|mi8Q;&KU*Zl;HzGLCxUzbiQlJ
-KUcqzU$^WwWKnQ%-gZ0M=?Jp8;zrUe<uu=D)svlmZoEuL<&XfOr)W{99aATP2{eHhXYet+|vFzy++-2
-0{x7^bd!p!+HUN>-qMmy?7EVw16!WB<=3OsgXsx~&a|f4(?8#yqa)W{CbhGOg(p7)I`cdqyfc^_zPeJ
--12%W+f-Lv=+CaNzNHg587N+?mEoEkak!|YUoi#1a~ApZ#5UW)(6AlTT>X~TF;*?<<?-=h#pV{<pVrC
-W>#?9*6<Xabb!){Cp&BVW;tiV?yYtg<;5_z)0f*=e}2^LwagHSjcky$0OukeS2D`2TUA`Eo)bmTScum
-haj!5HF}DvNqdDD!v~6{DaZ;#1U~DaZ0I2gk&}BF1JA8id3;7QzRhgpWdQ$?qxw}va9#dQoe%%6vnz{
-zm@9NI38&6qxJ=LLevYhJNz}qx;@sWAj)u|tz$~0W}OazExVsjH|rtC?|i0^<(Mzgh9Z(qyQ6l9lI$6
-69jaLcvjp%Xl3ut>>Z4m%#KHFwSmiI1aw3%NPwosS=g8=o2lNf{Wk2IP%aUIGffK2x?1JyNN5)WKYDS
-ReJ6zz1|KT)cc;BTS9R^Flm+t?crSeOcvy-g=+5GTTugEBOyBQZ{(Yyu`$4>|MYFDp;#MbU-r}jY8bA
-^@%8JcDmi~0KXHfdJH!p1<lXn;+6-D@_ehBzZf4)c6l2``#iVpFavDj86Q=XnH+rMJ`r8fc`*f#yhAW
-vsR5T-i*vi}$kM0kf<zB<I(X{BhN`zNIB5!strH1dH=4+w`3eY?E(7oB5Ey&qJP@x?)kRca2}qmg(d!
-Uzjj07O=e;hAv|d}k<!aIZjs9*iSB#7wTh0?bpz_8V_h>d|E|bf;v8Fu+Txb(m#CR)kdImgX^d%N@^z
-~@+9T)!!D$Bpmef|5~*FWLh*N%5_^7=#{ou&Dous!Vm^--w%9N*ab=*9z&ZESO7qg&T{$WaYI)DJ_-^
-sB48p?3v6CNi@(g=HX|`#JV#0jfl!M#y*z$b%1*{2GTz9)6IdGp>2-10=uv@W^j;aAfnLkqrk%9(Y*f
-LE(N|MH)Z+fXICghy11oL!5^~NPOih3t2OqXA|_M7Od6dHY}4*Zb&Neo`8^sjT4)aif4wxi>EQkN1u$
-nWxNV$&8o)aVLc7Z$|4~X1#tQ#PT(*`vcyH5z<iIi=3B9{b0)~78bjtl(zQc3zCme@A>zCvqcWQ<DrO
-yQ7~s;Tz*97O$6tVBlzEm;=*~5nz66^~gw7v9sh+6AwG5^@j!}SxplAr`KWkD@rLibI3T&fP6azdOSx
-c8<shi}Re^9PfukcC*m@lFZt_(T51&B5`*@TjF)T)5AJ7J?xKPlR{=$s)j9rw%%90%n;8_=j}aFsE}I
-&DQt*+wbp1-l9Ziha(?614r5oQ=j}GKL#k<-m77^vhXCF`V+_M>ShH$%K)cgi@7?r8$ypfKjI(IF55T
-<Rov)1g)r8DJzm|bR*R@(68mrn$eiZmW2j){7QAJCgFgy+K>sRk#|In3<KebR^sN({Lmz-D$|uDLnbV
-jq8*9A(Hv9tXcw~0jB4RgCa`M-iE?gM;3ZF_7PFPUfKNOBB%;!0hII?4fBJrSbo}OovNp+PTp-tilO0
-h7+W9N(e(Nhvu);oBeU)O?kcBy2iOOz(C2hj<h-=zgB^zW{lVjV1#dlP)ajSdK(jPUMynTfzr~G$b%Z
-Kw6bN+XTkQzl8ncZg;!ss9iKHYMtzLpzxl9F{2$^fNYkBPVIJ=-%cL+kSQ<ISMMXIB_f`D_b>RoJI;a
-VGcilh?P2frw?QQhcMS)ADWP&X?oUVF<U)HLp0Djgg17lF~_zS%PQq@HW!nix*G(oA!QRP3K3Lr`I_x
-5;Z>^roj2cy$&1&jSKiBxOV?Iij<QYu#-ti$r~7kY(i$rR%i?)#C`tLu3{5Z5?@aTN{0QYpj6!kbvDc
-fy(#^#+Jo-p!oIhOMO9>TJ8bRf0OeZ)I84G}EZN?+qG*OZ*d6-)?`#Pjh#OV+&0&3DeuC{4dwhNy<sP
-3-1>aTJ@K=7}+<rQC$5mWz`tAc`_c{=)<%U`hm(oNtamtyPi}^_2qNKK4tBjH;>zqh<%k>5Ut<lOGQU
-xR}1gI6SFqNMv6WVRcw{)YFEMT;vmAdBUpsKlY(4J=~prXRVD$4{jH42$yRo*;Mi{~u>(#jH90?|F`A
-hB$KA`K&GzJx{7Bz(te-|-G66AZ4F+pm2iDD)0(On4DC_q*c^d_(SYcDLP|9q%=$EE8d9nwo~*b>?ae
-EelfXaYvr1XF8#?(UQ(alAe;1^ziwYeV^_ny?6K^J{(uG&ntS!1Q<RH6dD}XE^S!T<5^aUVCpcqbn{?
-mc#k6A8t&i4|BeAzTxWMyY)nIR0;~tYPWdV;b;=9sX<j8j+oM`5Dt4${tt%<E=7?(+8CPqkRBe@XWMZ
-`#b!UoG3qYM3Rnlr>wXIiy4E@9-z2tS#4Yb{mQn^!1u-8L<u8v5E=o(u&X_OJ{jO(;>{i^h)>mnK~NG
-cmCDoQ^do<-;H-@G~cGb=*#_)~`RU;SSBH&A?<Cuv64=oZMI0wbuC4su_DzBKfn4dg%Ot*1Hzs!C!kH
-J(dqkYh>-djCpgLxCO|7dMeAM~q~E#?lC}Nai`&N%_5fUJvh<rq^cT6dx}RY1+%N9fg*vQoF#O_n}vP
-jgWaC7Bq42@(9hYeEUfamP*#a3Q)>`peT^mN07}(O)dxn%W2i>i(Ifr=r^Cm6%b=i2VW;~u}sX{?dD|
-Jm$wr7!H4B;KMFofjDO+H@1S1@*K+<ht}0~tRgMmg%s^d!UEf(~O9C`G@FuNF4yFAwqQredIITNAR4!
-}~{l5AAw{+u9K6d#wBp^-4Y1}-B+X)T+eE$8n(YG(Qg!|1pzyJ^c-4`Sl+>Gq@Akkzyy9Y@4#8qmNa7
-VUiYmp|nj^k!~%Nz8F@%VqY@3Qa^^B~s(;3UCza8Y@DSp7$ut7|e6lun(d#AS(de9t34oD63oTWsfE%
-&SiG0*AGLx;R9W5dF5}z01l<S%b&G_p(Ky0_?RwhD-t_N4f!AQA1ufjvS#Tgn7X@BV!Y(5gn<RXmIrI
-G&(&y1a7Sj4khsIe&5asFL7oGFwF?DC*0sfAV`spR|7igUqdv0(#R(RGZA)uDTiv?x`A(Nlo4I#itrc
-jin61V66APKA50KQk7fgsCO{3d4pK&q#c$JpKVSL3Mb9m`9ew8dBu<o~QWs(Ndc9XC?@kXcj$Xb!j4l
-qoKj#yrworny%B=ai#}bSkgekoc`hGb{6rBM}TT5g?ibF9k-6PdxpWkz#J`Yw*cW!t|<)gdKvdie5l>
-8p5LH7l5@^ZLFr}ZGWuW7JvXh<lOOW(#PZ!)8W&TE@r;}^C1jkoa4HK49|_xe^CJC6B(08mQ<1QY-O0
-0;n48F5S_?`QnO0000I0RR9g0001RX>c!Jc4cm4Z*nhWX>)XJX<{#5Vqs%zaBp&SFJE72ZfSI1UoLQY
-C6B>Q12GIl@A-;R&JYB>@drI1@dqfIc)NzIQ^gL|{yi?e&5S&w=NRKhud|V&^ea=vI{J>!!?rFsK`l$
-oqoVOL@?g>@tbKsRXh?3DO6by#6vA05|8kw4mX=k0)5}<=6yq-L26=gU#)A5mzLs2mu6<bASxW-WzAB
-Y!n3^vHR#-=Fw|ppgzhA;OmW#p*>f%9rO0N%LTQ=<f|Gc}QuuN|D%<`gE{R8ynn~EuJ+!_|T(>u)iph
-_Xe82$iIO9KQH0000808trnOs|SBWzGQr0Luda03`qb0B~t=FJE?LZe(wAFJx(RbZlv2FJEF|V{344a
-&#|kX>(&PaCv=G!EW0y487|shy;b5Eity9h5|XPK?VdE(xFLD!yw2qooG`eL!!6%?<d(&>!#Rr5l!+v
-JwC}(SiD<+w3RZ4J7}q1e2N)1Wm8z$rgQ3WB*<4Yxc%_)7WPMkZyg=2ft{`Ck8lWIY-=h(%9<j8c8Kt
-Gvs!O=>w?Y%!c?$&*zO-U_fPwW$6ZW@J~o+5?uGo-SVtae>p+=G{Z>^gG)OJHN8e-X*2u{1i-2HEogx
-CPPm%9DW1I`EIfo^D&!mt?<h8RW?rrNNW^)KhtwpK(xb|qmz?l7DjFIc^7=#r85IEt&`-X<$Sz<%5>F
-aCftQ(LO)^EG>rsK8JI1lBrJuErzcg|-6C@u{4EQfkOY9=!XMr1a7ZgEJhGjJh;_YpHzo#qNWDNH)I;
-)ElW{e04Djf0(O&Q*eqW*IWMEq{*GUZg0mj3;4aU!OnYXRpk>SR7<oU!<?3>@$&5WlMNvV(QD|tR~1G
-ov!Nf$*ExuWk={oeIuo*>BVpTFBVVk{~X0dS$J*50V$?KNO<b=;or$;v(Y&ouh@k02>Y%XM$RXAZo)k
-b>f@aU0dp{x;Konj<`wpOQDAv-sNg*A;a#!6P)h>@6aWAK2mnzTaZKW3J<vxS001v!001Wd003}la4%
-nWWo~3|axY|Qb98KJVlQ7}VPk7>Z*p`mb7*yRX>2ZVdDT2?ZyU*x-}Ngx6bueG^u*R37I$9g4vyDGj3
-jHrkL+Fqff|xcYNFu`GY`x3-v0NiXFq0!lGX`uh(6dPr@OkUy53zqr{?iDkIkxD=jHa9>DtZX|G-~PP
-EStFi)w$U^X+wOk{2^`_T=fA`EYH`+e3R@mF9i5X>YUInpag<uCq3;$`mHOx7PgW^^2E3ynmUtpIeia
-YxCmG4<FvW{{6=fZ{EGfA7R|dWHR~K=0)Bf%%&?>IK45Oss>#42SA1<X7%bi|AgN*d0`v+ZJpP4)mHV
-vw6(QOdUEp9Pd^c29?rD|yw+7YZ3&!d;c0D~s;gHP7r8O8PzAr%W@p<Bu+I#T^yh2^-~h9elYF<Y>ef
-_^ergW>W1F=no4VS;<8+_3*G3*>%Lc#dxJ|js+Limds*1ugg8GxK>#|}{sRC)U8i_qQY3swY69a$pVE
-N^YzAk?M*R#d@k8j_;dH3Pv_vYMus5^UNKd<b*HLq#x%et=WXXB$^WknN0r`7kjYh7k*+x=~s?T$j!0
-RZcVsvLmY*82d|w!Q}x4RD|qi>xRX3;2F9!JR`+RLj3j=Ei;1&%0{vKI4w)XZ`<dGN(1<kA6dm!RNc`
-6a8QB^cO-3KfK@DRh|{EU?ur2g7WgSUAeKl?8YuwMhOUzqhA*wWw85AZ+dOFdDGguHw-6t<<W-`2wbE
-q_u1;kuMq%_9`&XMOZ0}}Gx{N*Cf}A-Z5JTXFrjQFmnSEyB5N8$^d~RNPkCLHJ6rOO&Uj1rFhU3Rd3k
-IOXxzIjZ|vIKUfUA%nhZc&feM?<+~lD3)y7nNTa%eFiA}eu8j2ZA%2%L+4Z$iaP|$9Vf(GzlaAq1tgK
-UV*%?wB#Jm2SgJ0pb`(sX+th-wB{>~?6DR#jK5Y4xQw7Ql3{egOHM&DOsPaw*o&npIW`+!}yHFmX5Qg
-TN&v1O6OCwU*%lCvS7GUT7VirKPDz5DNrugv`sq0B^FqXb1zZ^*_S?RJRQwp_={!a5vENaER0OwcVIN
-$CFJ{ujXd6ZrZsiY`JZ(&!2w#&C@4m|LzGQYfk2xYz<C*T;w;_006M924SG!3?Bek#2ev&ynrA)edcs
-y*=+zToSPzt6JCAhp646h*lzPI)F-oq(KqfFTq3=#^VTLXa>fKM8sG$ClMr<<M2I;>Z<Cj8)m+cb$1?
-w%p2$+ySpzCpC*oY@W~wlzGrzuLzy8&>?dnopQaW7Mjg~!n^FG+29u#pBjOg>C5NEkBvKCE7^USQS?d
-pacHm+oFO;jnSLZB!KDHxL7Dr>C!K|CcQH=CLB^9YA~XCXDSSu8<){=#Ozh=oN&BM^lAj{PArP<_PQO
-|Bj_SELyH0Rjxv8zP?El6ho2j2ZI|*|RB4UYZMiba}@XHZ6!D5R2|C*_034u~UQg)$A&mjS^n~%@wFB
-O04}1iW`k4^X$OFCij71F!keghQUnLwX*M_1#SKt=&V*ZwrzkQ`zc>R5SFI12o7)-iAdisUcZ0!`qi5
-RRHJDZ=(A_>ik{B{Z^10jo5)%tpOH1J$!Na7nw8A?X}z4zOxBPp`(^wnvMtkF9R*)wWX8==AZbXzF-g
-N`W|_Cm9pdJ78}L|N!<0~`qy0zKa8C&Kx#Q`d-+ccvWT_hmlL;zQ%Fi6~3U&;62)hV6$m*stiKAt1z)
-|chz~cWlMYe5b$0!^p;33HOdDG!?A#VUG{l=8Ze8EkC;g{JsxB;uj7&ShTC`N$+)z?QPMzEwjyF;aE9
-U8_fF{;ePBkGN!d3)W119&B<(TV|O4uHhVH*bG<^8w>~KoR_JU$p>GN@LA$&N<yk{gh*>=tbsEtBM@)
-LZ3`ldlCthhgr%BifP%}Hf>&Vys^s;7{_Eji<5zYj;OWI8yJ+t7J01_MkD@K<)YL2%M#oL+6s0oC!tR
-F9N|!#J=JITlHF4mB>nNf8uhU`VCs7@fAWof@{D*TSvI&opdVsWB&owN6XaHttYjvjz~R(@5x@{q-wH
-ss>y7<;XG=)RA->-h)$(!E9tw&kXb{byb<p3^B4BVpU5akaZnsg^QLxoVpW`QFNfWS<N39q1JEoeKK8
-6GJliBFC6;MwX!}+QG+}d)TNV1;-QZOZ<XLAKG^SUmfQDfUAf-?&Pr#>NGG>N&oX<$wcyCN@dnsW-+=
-7QQe2H0~NztEz{ISKYWR(M%vot0Yvvt7jCf;<A!nYw{o1cD0+!Lwc&=7_-iLAwrQ7Y$feV2FL-(1fGK
-*Bh~bFeL%!QmtUMIc7j?4?$9DNo3HIXAtH9FpwC4)Kq07ivt*p$SQ&Z!HN<?J_~`gb!UlX%c{s%h9Bl
-A$d<hq*N2cEtQK_zs`vQ#h)SIB9q2BraEnWAcsp?9swzQ1z(7`vA6K&Wpu8=M^YY-<APBq;3Ouknx9e
-0Xqx@ATF1e~DL{i9CPC3>i))N05TY+<6vC#Ic*DzU#P(E5@vtx2zN)9OO_dq}oahm0PoQVTr*w+=rfV
-vI;Q*~q&K*HnwI3{eoKfnmwA2fl7s^jP`D_i`%0lLvfwAa8{hfNA;WSi5^gcm#m=Lj-p>}G>0U&VB|o
-P`H+RZuDf6ss^Afduz3hOO9kn60zPT7m7)mW8El*@8}#pmxl7c#cn1P?7p8(A6t%1m~_;!BV99LDQEO
-v+YlLlgkEsYdYu5gDk~W3_~`NAn<A`adWiDY*82<P>Z9{v4CznQ=k;FU14iv9{*Qt=Xm)095*7g@{Z)
-%+XxYS0jsiiqH9rIh6}OAW<W_`OK^+w#!G%H1OVqnIap-bcGng*7fU24J&xNwaLqNAW?XS->GW!3$0L
-(@WaAmCDik^;c2gB=15t#kO4#eLzFdf{q3SVit=gc_uJFUgq0yw~_Xl)z8JMQIL@Kleh{W71J1n=eEN
-vn$E#ltzl(m7)&497iBvdA$U=LF9z@PVG6ZMvX5V;6H*T?~pK_;UEI__}!dnj&fx1w~kKM6giq<w$_m
-R<n`imGKc8!_k3QMzz08asj!fZn(#(JK99u!ODXtWVGC6;11fV2%v$<N>L%k>s-Dk%NRG3IWkDC9>>D
-u#S&G>}VDAs?qSlXw1pQ<PJdzTV+7PkmpLs5ZJJEpns<-3To(`kIKc3i8~hiJc1@lkTQXsStAH>7Iw^
-$jN^lUgRP7arXt5J)*uRTTBOMohcsMhK4VShN(FjWs&<aA6_^m+jU$}2#USE8zT08=7s2#lpay`w*ss
-6n*w&qz9|Hmh#TZhjuJo043P#$)-ZrC%K7<3OU~M2|CWgx*SXSV}I&mhBYOt7Mc&Q*B0+G#?Iu8}BD9
-GyP*Dkw;&5IepwnIaC_?CjrZ7!Z%4s!H<@qRQ}7jW5rkKo4k3o>|^HIuv`G6Ey1S+M@G8Ue^rRAdkAF
-zZZ{mjD&qE-pNe2KQu*4}SH~)nqFS?hF=J8p>et3;+*S1jMf?FUEWh^O%?+xyGd9wOD>8DJ!4hNvbEN
-fd^<(1U$g+logHVG;0frZ;xd)uQxGVWG;B4xw;$-)y0o|=WWTHOnK=Ih0fv(K>`9W-`B7|1y_@4uw*&
-v^i6`Q#EBad38JvTx&xkk;XyY(Cxhxd^PD{b9&^s=s2jfR;P>ww6pbETh|`LCZF=cFCEYna$Bq9ErAY
-;nu;AdR?e>L@g3acD8_i>qSvq8+GKF#_5>nw7{>T|@l)|_)a9A{n;0E;)>vkad1~s}T=}ubN4#%rM91
-PdY28ulN<oJ1@Y%UGLQmTj_9<`xVfze&&kg-9E(SQkDc3X4$^xJR$bGW=3hGg=BPYY4LL^tFVG|XcsV
-@4&YjtaFg{&SJPcxPjK&Mg;WkS!!fffktSs=Cp5zE=>5LQIL^B5sa^pTy3P4tQpd65>?jI1zV*jGL|~
-#zHz@VY(xxlL9y*!ACm+Y^F8vzLyyi5`cLUN|-xk`Tq60WaM~7tfQ{jvyjd<27Yc}v<Ku6W7WQRVq!~
-w7a_f!QA6dC9NU}-4K--LQU++wF$s_ZTUSI4wDr_HH}3bD`IOZ;)+RU)-#{9IO+j_OXPerBMsna=WO%
-v@+qADO%$9oBDde18gMmy|+-8Rc+h91A&l=R8-5yXbTdlE((MMfE0S#<Kbl5s50@Jse@N$aW*u5T{(&
-i28+@V{<Az(Qu3<y>}psC7Aj<kwu#l2rZRNiP8Mw9RIBC9no$MbD7*?pR5yF^^F3zJ^*CVnLhbzB00%
-lc>YAdyyIf*4~3tI5|kuCSzo;v~7jeqGWR(2k=Rl`tDhyCvL;umh*b1%J+2KS5Yf=Pg7&01N{|l#r@q
-O%lOsEHJ0dSIwRL!AV_hV4rFf6N+^qWVActNNF56sSL1~yzzkvo>RCYi|$cGAy*_26mgUxJcrE&nkuS
-HVz<kZn(QpK+ofsBBf!LCz259Tr7Ntx+~S7fM5$5XT6xoSw&9{(zJtgCLl9niTU1R0&yZg|M-N;t7JL
-S>mSgRE4ovPl;Ad_8(V88#IWEOjV$%T%kp(%T@>0O!-rT*dvA8Hn3wemFJb+fG(Lle+!*&d>!@eXJkU
-Fd&EJn_Gdd!flS;342EZW!beP1P}kD6&u#_`bI!5X*50d?`nV==~9=G(&)w~xgVo*mo20YMS~iShELg
-y_PK8_>+g7908@?e}ejVB-T9B`Y{}!OqLxM(%XNT`n~^WQ>^=aI`D6oTIHoM_GaTd~U*?8m=Xh{De(2
-sx#CiSFcjALJejck$(vK5diLQy#&I;5CFD2-2(tI7y%$2YfXpYS=};-fKu#n+~(^fsDzMfl1i|FXLGK
--<CnVX_7sApK}z6SOC_8)F1G83_ks;Ir42+|&VkMyyu`;kBH4emhn{G=Ne*VdaVJV+1yVtQhg_Upp7i
-nZZ0U}(r8Hg07cl+x7+bh`_n*fWg7^Q)7HY!<Ia)%>lb~%}a1==&Dd5AH3ZOLSlkJy$KbaeFF3YO1=T
-AV5>cgV$O87W1E1-wB5Io9pD#@9AE~@R;_A3f6K$oeCknF*S<x4s&<%R8fhK=1EN>P;y(=&e@*p+L`R
-f4HvJr(aaRTxtaR=`Oy6((V~O~(PVxtT2C*Ru&F{D_#&CmN>Y)2BqkG&;4%v=ba8)rpv1?r;#j!jMxB
-C$u3|PigqTYT4yQOQ&JDgZsMr1i{x@&VVFF@o)($K?_e%!n2sJ-FL0$mJZ_<u&LYMsrfB%J%w>VvSaw
-Z=(KA92-*WSdx+Ir>vjU&9MzxbQ!+`nUzlZ+bou4XwQi_VwH_nH#<w`CPQm(%5cawGd5YUJeFohAGM%
-$Xo9Xly8m>bZfI~DE@PHwz6>-;o&|eg<b}^+rpI!ne_;@yT1H*NqQ7H|RJcRm?<kp2J0hqR}Gl(YXD9
-dtmhS>-mzPXcRe?F#IE096;(LKOlA-N8*>zDZck`<jc04}pNBwO&EaP*o$8y2F>ee48&GNQ)vH}U1`X
-XfW8zf4k|mnbOh+tdbp$@rbjfyhl!;!yTN8d5NW4#*rfdlrEKZ4LrC_(ri(xX8@y{K(ly049!Y*$R!@
-PW<ENDJ8g*6<R0M*GG6^AcPr$B*)GcanQ)-&fKEOB1#TCWx#BVPac40h~xBy0|MGFt4w7H@NK|E=L5;
-2FzQ?X1cL^$Ffxf-uz3nS1i(}}jrfQFjxteZq`V6JJN{He#hW*Q-8}?0)7Bk<-D%+oN$xvG85GISU;~
-kz=X$d!rB>Kb`miVVe=$0KG%zsw`SOnP7R*Vr^*ZtXmYbl?L(cp8;A=oOMqsQU^|N}$E98Y}io3_kCM
-ul;H7XWh*@A`P+d}QM_wsTMpq@T#ZsLY#EUp6YZmsJ%xv_T7<!4@p>#3ONDx(FsCj-{zJ_0OLP9E26h
-~nVCKj!Z|h$4bDD0|oDg%q$Fy+!rC{_ZZPjLm@{|F+aA^ko>e(a*`ngkvC&OP_Db&r8oU`9F&AhKTv4
-n6H@JfK%oU3_=!^yUUwva3Jlig)ntOl?1FBgIKJC>5lPJbdXv%nvgp|0_Zftt|vavmL$;K;F*BlP`gI
-O#>pC*hA{<Ze$RTIVj?$qY)*A8y^ROf3^AbV7g&MqV0ww+LOdC<$4XTT_+<t9JzT8g8;+A1XjaJLFmM
-&%<ALjFoO)06>8LywXAWb`AntOr?~1!7DT+{P%ttKM2*)%^oCrk|y(ubOOF(I|Pq1saE7+_|c)bSW_1
-D*LY1Tv;MsRRE9a_>s8SeWAZ<?A)JMbv*1>Hp(L8S{hWzsEdtE$j~q+58-auQtiO5<pcjIESjJx^HW(
-0WGEU%08gK!JJmfH=TS`qvKvfcdidy6IXN_3XzBXk>`^l5bDZHJZ>e@xX?OUdl3|IU3w9l?@_v^wOD7
-s6P*~-e2!soMw(TF@5d+a1jn|%6jd-Q|W3lmZv&mN38hl<UxCjihr(*N&lMfvG*g1K~8S(Sl#~x0mQi
-j`1<YQ`<Ji&^c?b;03-a9Qw=`n5UptDF5jY_TadilthjNTF;WB!Pw(8^@tz>6b9zn0i)K_Ki)*cl66x
-l!1xgs|i<o4_N6vVAT$Ve64BMYy9RYuz`1JoGaSDWIGPV|CGZuBlzH0IO-HSiG{>#h7t2gid{QSdv%v
--s%u>FF`&@+=nHJG`%NWxr=bKKeGoC_CIEIMTMWAYKRxl}zK28k0{0>vN4U@;_f4=nPYmvr;lS7}_?!
-2#p++yN7D24FZ99alIS68Iy@d!L6FLNVs#52g8D%^TwhhZ-X{)045ns<zh#eO^48w9CJafiDQV?-EA5
-?9~hSP()fn+*OaDUnG&fDBG;+eD7P;)V=EB=fD#ls&|+#&Ms$8<NeRtydM1ZIiG^^?ST5raD}u1YLn;
-=hCGobqw%Zxf|T~mU~5iWXAA5RkwRfW+WB-EvYY`n;YDu-D$LZXY(FNELB3H(#*DTnbLK2%K8b>5wT4
-P|zFg-~A6(7ha7?@&mSbkTe@)y9jqNmi4ahey$>E}FnwPBHF-1#}iU*e?@$u3I<Z}PJE~GL=z~mytsD
-wKv#Zeo!mqpaZW;J-`dQrr425oeH(}Nd#q%VZf!7btshrLv_rWkEMYV>BhSa#(QCgE}4=5T3`;M^p%6
-LZqs*<Gs!RF&4QX=~^*nr`&eH^Hb5=Vic*xPQ8b5l`r&gF!xc5q&%}zd1h}JBl1fQ)Y216u1WXaS;lk
-R)z+)6$g=F9aGGnxgqsF`tFVJsAX-7BTGp`MesI|Fq=~euB)oW&_yhRMl$l%XL>_3AEbU?bs!N~7=8u
-DHl=V6Q?RVol6RQmjoF<%%%$gMmzNz{uY(Zym@bKL<PwuBv43Z#{M-SJt=%(2r%)RsRf!1~^e5yVSzR
-&PrbuI=m?|r${dSSa9+CU0Fy8g;B%A(W#&;&SDOP^k!#-b8xngyVi5i_02P-Y@hB_aDI%fzc4UcXH_j
-{yM6PBR^&+x@Ykfd{4CgKr*2&uqyhzj#|lYd4cFspa3L}KX-S_kENSAdx(gN}jxD$5EYVM(Pq*{Y(0o
-1lN@XqFrb*BysW?g}Tpj>PdX3yZzc4HtD@&0R-Hv1M;EP~Fw-nuB}r3Gg{_W>mRw<d({VbG5Zyc3Vi+
-uCsEBB(SJ(kgaR@K-(7ue8!=N@<Hz3Gp@(-ZxYVLucEZ+mJZ#SdqT?t8{sogySWu7_w!VigHTsKLEy>
-M!cY7`PN$-5oOPJ{fX|24ksn`%S^CJa@Zi{|D{o5J=ANZs4x@XdulkA&Y<@lu5xIEcF8~33<Si&C42C
-=nUc<p$xPX7qXTV^`Q(5;n=aL5Wr-+na4r=rIoF)I#oePXG&=-%8lJP3wH{UQoanSwx`Mr|;K<U0i!k
-5{K+V4cjRm}!XD=eM<aTHLygwmxX@q4VkA|r7xDf-F`B#dmG%j$;+g42<VL_|(L{9BZkaDV(TCHeTn+
-vhL-_zz_y3wi;Ma!?BSNl3$3@Ds!aI2|vMWb~f4#-%tC!I#2Y5C*0FR9amz(1HD^u@ElzZFDR(>3cxj
-JV3X01uroLd=jwm=%Nw&#i?z?y<_Z(tPrk1_xX4?de=^d>s`P{)Jqn~0EjdO<UyA}9QpRf3?TP<wwo=
-Ux<BHiN}B3=9GX08CevsZo5c9_UI^)t@jLvGLfl={^T*3sTy_4ZB{(6CnyG64ioZ)c)wb*L7t@Vs=J8
-znE`B^H4d<ofES#=fU)`05UwQ20Wkv2<y?a2QRuu#=&A#H!Ux~Bg#gw?KhbQ%dv`^|k46a^71ZUBW>K
-H%Gy?-HZr+7G|=Vfvw$tMof&Fs=fy(H+~X%{$nO12fOuP$8q-MadhtuOT5)jzMi@Rin_=f>vIWxw~$j
-=bC;4<71as5RJJ+sN$%r!wL7O}1RAe>+Ptj;A;?K(wnV+Tm;?ETaRAm-JZQ^gu6_iINl4wkw=+r47rv
-E}tfhoVxj9c<;PT`p9`${KhDM>0F))_QESY$@S+Y#OzfY99ZCMZ&_n80l(6rS16ZP!SJg{qW+N+F!d$
-+`pM~+B45U@$(-veCdHVL%hrr+8aoI*&&itsy#trv7o9wEO=13knqqmK%ZrR3Lis@hW}yGnH~~*H@H5
-)qq<01*Qb7GQJ`fE@oXV>~WD~G&x+=Ps@82|Zi?Rfnr^}gXDmnJ9A7fL4V9?Y&{T;oR%S_XBs@KZKu6
-E1)^ympd!J9$7D*%CzKxV+}?Tfsnr3P=|Lyj|?hpsx*MV>zjnwED>;E2K4&2lHF;UB$Ai}spdx*2WF@
-JI~b&`FI;jE%g;Z!m21vKq~oV>euO1o~J{lAo$)WMfa!v?0*(+$=g_3yp;|V?EGV!06v$i`4cD{kQyb
-_I0)cCRfY9^?Si$u8T3z5g)Sp9*YvOCDQcZV2zTsv4ghA2pmB;73#3TJ7m*1&t;Bdd(ZKV9A92gS7%E
-7y6_SHhkUNLQ*z{Y^aRtLIx?{15FU8m2w?DY0Or`)BTc;H=&|Q_!;{Ag?gu`C>%AGq@dL*NHbnJ;h@P
-ML`b5v?U!&<BR&KOc+u0^JZS49G=hx&Dg75x{LHu&;ah;VyJk#1M#ETaDc-jU0PKQS_jNaH#!^eh;y9
-jO|a?v>e#g4qubbWnK*Zyr)(+i+|oaJs53i?Fs)vv1T2i1J@rgkqZ;yOZ{8B=~Wz%bqn4%z`JSCDrlH
-7_X`+)IyVP}nfH*+{h_)0e2pWX)zuz7|*_QTWyZ>_vmLAt+piZzzzBkMe<4J6@m-AI5d-ULkU{ayRgJ
-y_#%K`@@nfFMgyfONuZk&3=^9Y?LdT>CaDonYwOzsm}&oJ|jiir<c*wah<}_=Q>|0NS=9iIU8%WI>pl
-!Oi|Gt>NV6hu0-h0H$geEm!*3SBJ=LDVqsCpZ_u!;I*5fo9w~3fOw?tDY&^21Axm9lpSX8y!dcMOefK
-74{rUd@P)h>@6aWAK2mnzTaZGO(0Il``0021(001ih003}la4%nWWo~3|axY|Qb98KJVlQ7}VPk7>Z*
-p`mb9r-PZ*FF3XD(xAXYEzXj+;Obyw6vRlxt$7+;hq)QVx+eIawAOpn=xnX*4}-j4bEd(>&H79&6ZRl
-#Au*?&_K<7x-8b<0UK|q<A^05Be+F6tl`1k7RX%4q{IZfe%_g(HS(Q+ULNa<L1QP8O(C8sq%eGmc;!M
->BkOBFW8?s)Y?cTC8zOR7H|gZ(Pj-qlYBV+VjP;N0RE^gdF@G7MW8E&q`yf~Yqa|4fT?mZgayUzMfr4
-44XI4&FFF7ptHgNIA1ihN=R&Ruj7Bv%DfY%gUlV>|{KayWSBAR-wQ9Hu8T%6)+ONSiL6MJ9)!g7<%^7
-Y=_9e1b#;%cJxHTL>S^J#qwXDMza4f?i=j8lNm4)#GpgC;;iLaX}0!9y?N)tbu47erS#WumCjf*OQfx
-9oP;;$ycv@jWWVn_Iaf5(pIN4=9Pb?nlcOA=3SI6v`u-d=Zf?AWaLz>TTm#hLB_;h`U)oyoL*F7La9c
-S%=Up9+%VdJ@(~W>^2#6_$0qHfMsKy24Bp@#lY2)hv(l0&~0H23tXcDccb1j=c*%a%{jqdZNd64ybYR
-@6|T_VRKw|^v8_CQbKRIxei!za&3BxiyN_v4z6Ms0y&_jp&Yx|y(-s@{2$GCM3eXurcVC(f0KLOWbOt
-l9~rmLrX8m2(f$`uO9KQH0000808trnOg0Zv*61Dp0842A04e|g0B~t=FJE?LZe(wAFJx(RbZlv2FJE
-F|V{344a&#|qd2?fLZf0p`E^v9>J^gpvHj=;lufR&lBb7*W;<&z?Ter`#oz~YR_OskHd$w1hD9B<=ky
-?WE$M$-E`^^jh5+Fg_*>>-T)q8Cu5*Q4C`JMsXXQO8$7G<+Iz1(JHF(19gCu{w+KHJMycX@odD44%DU
->h%9Zm`n@XUBKNB1_pgn-@1>&e_|nOlM&cXK4VP#+<WvhkFMf#s@)hTd**lvAv@YrzeMRemOll8RJ7}
-x7O?RcB6<3!HP_Q^aLQ1&g086CvYrI=UKj#prQTRTD)9kd4cHiNa$Z#^)2W6o46Be^E_L^%U~523#Oj
-0!h9CzLueT$_<XI%@3z+%d@9h005lUkU*oqCUlr_-ULE9lmRoK2sO>SeWudV9uB}ZbVUkQHY=@muFYl
-5U6WM06n9SpZr{R)&!`92|Fn2!{=Hq2}#Sw@T63(spdxDKb^QrwH2@70u>ly9M<eKLK_Q8B3q6J@a8!
-XMfnk78FfR&i>Ih%-Z&L?`^ef-}*u4c6b_{n)u<|(t=(Ob0{M`L3nj2^U`Kp}J7`+(o_s4T*1!eztB@
-yXGD9qgS>-t3MKU`G^L1V9XkzTd#k1~C|{@kA&{{RVs%g(;hI#+R$&j=}I@etCWN;({%JBBq?DELw!=
-C7%%|DBg*Mf>ovj16Tm2k;nWRz5|OPB5ajsmwC8kh@f*44WwaCuq)Bc%m;*VA>aY_Wji~pmli!jptp*
-qWt_}<z+5)Kv(fAAiy+Bvc<v9}tJWTn7V%3Kr@qy8s2B|p>9ga#^^fEK2wrxgbbh{y&d;x1D7}2~r{m
-PbZTJ2D*5<vq(Sn_yhs)X4rW47{e<hNVePW>*k+9JN0kg6>3QFep#=r<GplDI_hD`lRvM5Y?gPL39JZ
-bb;pyaq0ncn+sRwi5kz<D|_z!;2onwOG1)$g|<@Cr!3<G-H%bo62J=9j~F`>+J92|$x*eu;}RgV(ATN
-eZ5dGUwG>J=e=5n*v)@&)3v^(yXW-)+mzr4}zSFtjs~tXsJDq(;3KT-E100SNI%+VRRK<a@;KvX_HBi
-i&YXAz882y_HqDBUG<tsD9~7b@ta@<byGkM7a9S}#sU80dmu-ooD86aS9b^n=#Qf6H)M885QMPB!mHZ
-f#Gv1F>mU>pQNT(p{Q>GEVei>wy!X?=`-5?SYc*f_Vqj8+wP$umBs3}SiP*eVCgR)4DhCyG3#+4kFEU
-U=4KlHY6}<2z80ZtHQBux0cK=P}5s>@u>xb&u;E^y;W0`P3Xnx^QF%1R(eLVm$);?%zBbo&QR3PDrsk
-?)d@W#~bK&z9FyC;*AgX4G5H0ME-Emz1pxp)4XfA+WEE}s1`IR70-lLUOb0^u={1S@<ATZ@Jkb!$3ST
-fD#>geics^*sf`TvPR^!a0Zwz7$4NsVysoW%mK00C=lqQNtLp^b>^@?Yew~+pgbQ;zYj(v033@Qvkq*
-JyKFagUwdhYsjv{q$HYBeeJIHvdBKZ8gZy#IOwf4qIxK&STrFhEaaS3vz#xpYwp;IHKn@K?1ssW2Gg0
-5pan2_j0#;apo2ICr4JKBg^qlS>?!-Y*0!|)^{i^BJ8Tw5g>P-V>M<}#oro~!z#9=zFBs6#BAb3`tdr
-DrOur2-^Q>I?F9*%_r*?o~g++V0mE^BloME4fHAj=iXfF(;okZcBX^Xl#x3yy1K$KIzS`xkAFnYhqtX
-d`@W_|Yd@YDMPHUqmCy^G|I!DgZTr>tSN;5kU4xDZTwDxl`TZa`I&fP6{|>Br1?5ylC^%jRrP+JHk=3
-U0!hptr-2DB#(G->S!`NGBf;PR55vA7HzT4uRB8q?e3FlkrbSC#QDPv+Y-oHj@uWll>!XYP>?z^||$6
-1G}Caz)~27a|+X~Ol7GCKuR8bI@o)lEn3c#ssnh2Zx4UOZ9*aZAxrt%<d^Zmi8h?*iFP2$sVK+|BClX
-5d5#_^k^mp^Q1Tn7K;+8L*zhyDd$jRjXJ3K%Wl4O+*>3`rRZuLT-S1L|LPsS5a<Cd!ndEFqi)2k8<Yl
-;GpX-r72a<vh=lB-9VIY7sbAbSSd8q7r!UK$d<r)MU`?W`L?}MCcaBYpL(|D_2H+YsO1`yato?gd!mO
-6pduNy!*ncjHW$)eKpt2AoCfk{dF72sik_le(u({a`5yY?pK+be!Y>aK1Z;3Gq?!B0cb)Nqurv2A8(O
-rpF7{(y=z20nx47k~?mwPu?LM9tcmF(^4FVgK9j+BU#fNLt7bmSQlPS&M|PhO7}j@U@a?&%d&+l&B??
-T7H8j2xb4F#g!IKgHOV&*<VhzL_^9@vuc)laayv%WOv0sv_2N`006b1Qv6P+rPY4>&*!O5ZgTL^A7TN
-uT#96fp7=a06CHZdL~1*)YHw-``y_KzS8c^32~a~ME7O{9qHde|Cf;gH13%nkG`%%qAQmS0TW+ut5*V
-fMd(zcFS&yO~984r_MV<%_-BF^MXTV9q*r|H(CUse!tn5}<Yc~r}&fzpG3+82FgD;7A^B5c};jtea%Z
-M?6den|t>>eNQ@1E}V2B^4u|JyUkMNi&ID*B}%a64L73xUnSC70$yPt8olyL8}=5TAwlO`ICY&vTg5O
-_pE53~Z60_u=iy?)!sZk4}E>SrlJ&Y+2>*$=x?W_at2tg>{5^zKf@MnBQUOL1O_=pU#4(vmSfe0@D06
-EvvKbjf;BC+UUE`w$XK?sY5K93uFLP2WNd9oR!jOhlso~R>-|%A$zY{k3?~oaB>usS+Pq7Kg<DEf|N`
-cr)W_i$aN`bS79u5gTxQ439?4QlmJLe7+ezr4l+Cj8OS>cg*2ErK%ZgovP8QTZCV|rEM-ekpzjO@Y{*
-i6W5Bbmmp(h;mtf?98N~SvdXk`li6Yv1qRhwOnuwQi5~9Hi^MW2j1%S-6ESah0phy-iiWtbTCfd`O<h
-Qm%-t*7G(LZ)a|9zqUeKGpa$;I=*xp=k%|M|hQfueAV#Q>a_Ef{(4{K>iRpFwYcaiRVtK+gu}&HfwC{
-=ao}|J~r*$LMtMJb3*p&5HT~Jt4bQrbB{k#Z!accq+3xJ04|qK-_T*oQs{FDB;UxSa2?)aK(ERD4N$O
-B;dIs4s(hU(J$XH9Pj~|miWT55b#ML!1O5uBIbL2j|8K7p2sVHKpN_y0KpP{5@VAC(w{!UvE<XT;nD(
-^p%T~Hd&o9ycNX7XYfP*+efIgu6OY_CK)2vIu*_$CfV%t2mSV+nB>^c-?R(G_w22vQQV8~*P{0^_wB?
-@K&a;%P!$$~8D^t>(SDb>?*AAPhw8=-56^+b^J%8YE3_BW=cQ!OIZqEOSBWmZKNCS{o(zC3JA>ed)zR
-D8mL8EI$jm%g`5{trDi>R#oO5cC1+7XL{%ma_sW73MzQ5h|z1I%lJBu0q^zL^3s#RfBw&)49*6HW*UE
-r<e*2?eTH0IgjvSRJEP-N!2)#juc3sJucc4vUP*2%v;g&6n&LiYcI`1KXWn^HhO~$+<L|fJl~Nn~W8W
-R;X|al#zxnXA^V9d~fgVyWJnhxLfb`tFL><$MU;czMBQgXb>cR)p@|aXD<wk0=Qb6!!o2;w{&|06|uK
-MLrWbQSJF5TJj{XHrS*&Q!<4o5+a|v)rT<+tgsT3ergUf%>l`!LIy~Hbi4FixcjkmlEx>icxJ!}yinv
-|;py8+m>0(E)(@+P)W`_)2A^!Ig^fJp4MQ0a{yv(F@kK5(U*Fysv#)Z_v$RXQo9wrGTN+k7CXS5RTTL
-m*HaItm|J}o-!Sll`Dv7x13kf#TjsOvNbvCG-3?F;8fj>vIi7FcxPdQIp{k@EZz+le20e>$Lc2}=W|i
-oB}fF9xpleOT_^Ge@-j5nnfma9&XEi+J#C2^)<`x(jDp&Hu9P_EPSjKfov>A@E#+>)LdsL8(pm+E~)1
-inX{}-oM738n!td(zb08WR3JV&8t6c{GEo%<LBZA+S$C~3YGdGZgWtU{``{+iJym<^1;riPZW%M+v=b
-VYJ_`5xA}3b*&}Q-uotq+Qq&3^R52JWX#~y=4=w}NlgfGL$vXIC>nr8Of9nABr4$95<=G0wF!)UX;)d
-!>Jb28*q}AmSyL{j7_9<MxVq#V1aRze`E3oQB9VtY!S}mV5IvNXf4?{rIzaAp6hF~T9t}ZO&TaO%8B`
-=~(3ZYFimF%y*Ol|#%pj^$scOe;Qh0*Y(^1_|<QGV@spU56K5LJg|(!kR0X`r3i?woid3gs@IP~du1i
-gyu;umJfD#v+(q;WVBn;iZ+`RiT+#oKF;?d-Bofsdy?p_LTXpJkF4U9U7V||Jw<*8PBUHqwB+bPZZz-
-PQAgf2?nO1r|4Djk2sB?BZdt9W@aWXz#fkOA@_Spl_ltThN~6OI*?}}qmsu*<HJulC8V^Vjw>WtIHRs
-aY)Jyfv>sj#qIX<Hxf}#Q%`6$;jMwNdDtau}Qk4N7krYRijip_ROVpup3VavW1zr+Ga$dHLDlhcW*;C
-PjebghFjHKxU<9t}ff#dZW%p?cI|37Cv=06n!ghtAO+Seo+#^BQ^tbOP(=w8UxoldjM!E^zi9WY$nyO
-iW;Q4m5mZw40dV;2be^MCz9>#_d-7y2k=yN92KDl>?F;0@Trmn3tj?iDv7iPI~N#Wf%oYx(!yq>ertj
-qs`9sw;xZInMf;YdC5_WVO?fO~E0&S@5*pWCe<%eQGdrO~JTIDg6b~Hs?{1>5yKx^rJ)vc#z|tc25rW
-J*jr^(VP02B@ogq{bNGm!)YxD1h_`iP{fg*TZMS6w3fo}@Xh|g_>|CVi!-C)o5K(8wis4-v_Jf?_wJY
-dgX6z8n#Wf0l59IZqDEe@x|?~%^Mg+Z>IJ{$<_jg->19{S-o}0Z@WeB7Xpb#wr6TWDIZa?CcaIMR{FZ
-yx<k8i=(Q7R^{vD#%j}6OGbx%9`+?OvHMSrc(@ACn};PZK^i~;bi_`D5Z{p{HV>(fg&5O}|SUS)q|pa
-#PgcJvm5x2r08>)Tn(te`fwu$w~Tt6J7#rIDWFpA~#{`c@s0%SZT5NCb^Y6J}rSSZdo=$EoSXch1Z`y
-J~<se1s#txW@o>D9!r}&{_pQ!u-51RY~vD2+cG@C^#+D<2@ta*Iug{iq+9!VAd^d;b}`mmz}A4Vku{}
-0F^b_JY~>c!BB=DP3a;P9Ci{UX=)o%jV}Y1BFhUt^Nq4nU3oV!hp$ggJbG}cqwS&l?DqB+<P^uP18?p
-oOfg_9utF@NNVbV#g_IP4qET<##8202>^N%#4B<Ug6^lD4G91%cg4)Gd7!wLB3qmcblI@>A%b%Y=qp&
-orNnKz-u>q9jC~!cTU&k{(BguRdCyBKm?&<`pn=JDj!=5_7ZA<I!T3R{Hmb=zncH^LF)rZPy+~qONee
-k7M^e1fw2?o26OqqKB#70=_re@Y8ABmerYoJ2)ErCXhXI5nZ*k951PqRt`i=iGQG<7%XUqH+{<)v*Im
-81Z(mR}=tbdvz}0NeVPG`>aS8m7JEVJa|X0)tc$7^4QaI$+lJ9lzD!evQ*vb|dKA$NMm1M`IvX4-<mR
-GFmXP#C}+_TPPH0(ykdJJL6o*#1S&lBjX#gjxfoxE8Na<CCM&~YB*KJuyqoyo>Pb6q7O$H1(lTwF^eo
-)hE1acQyDl?WPQM*Dm2b#OqEgy(o{0@h3jNgbCNT$fQNTTri<{Je`|n(S<OQ%*pqHdm~&O92_3@RfKT
-??G844nbZjH73Ns}rJmFFnaUwR9zYsVlbLJ^&DGg~VO6_Q9%tE#{>R7vA-&H5#8ix9V9VTJ{s>f~LKi
-oOZW?8GVvuM{13X5AFu_VZCb<;<zM}6)>LvI)i_-UDdHjpYHcA?6b^@G|*k#^xO`0g=yxGvkUZ}kL~c
-1Id$TFV2>seu&I0!0LmMalE(NN}?tGA%HZnu(2OIb_oTHsKFk;9MnqHK6-|;OX0<K*{3iN<1oQprVl}
-PqG^+T5$GKl~^1Ks(D_f@<ak9`bgrGRJqeUp9;;5zEbPN#Yp!L%!!!=^WVedHiE6@)T}kHa3?~t$_lO
-Z_vE1=PlxwSDEGlv-MY!NZ3%Y+uzhTII|FSzRh?dAp@n>j&QFF$RyY+|0u(LPJ_gkb41#d<J5!Dar7M
-{);Yi_}+(}=z6%L|Pc1A>pv7fRVRFFe9E3r7<+&(UlYKEk9`E7`&7lvr1F6s0)uufj4(i()dPDf_k5c
-R47iu4=m{5fSmie^knZJm8O5H*SE&Jc|^JQ`Ji>E1B>INi(WW+r_geKOYNWwwqK+r8-wg87&-Us+)sq
-=e1u+InX)j3)D!9UQ=sgYH+fVQed|(T!A`irh(m;*wQM?0}>KBz4>;V7o$qrC~h6aTGkF8V8ta2*LwH
-*BVDnw?V6yYS3^&Wff}|pEO}~@?HCE3B9ugM6)v1la;Xz;d90FlqXujO4z0J*FlZq?0=>f+D2ji>tHi
-@Wh1)`zht=q17jLC;GjB8iYIp3rD8UO@7QY>VH{yOS_GEql*6Prd-)>R95S%pqbr0l!qOPpqEQT!&$F
-yuqtVw<Us(!-^);##h&syjAQHn;)g9eohxYdN*(qAyb!8Jpn~8u>QqW-pWip~o44A%BNgW3$sboS{rZ
-KJnSh7-nQCtK?OnZEFhCymyqnHT=gRXLFbut!#rR8!8_B;$R<2ejFGm@lsK^Uy|J&;xyM1pqZ3c2luC
-rKMw{W0pVz*wt))N%8UniOfw?AQ!}XD9A$4f}>i3Ou5VbMgHA=J~n6@fiHi$QC}>UsDr1`x`qiE}lIC
-MhjC6N?OJoe!7zByNR||Q2A3v2M8mNXVP!L`G6}P6<A0ou_Y36QG05ZELD5#BIplCrw7}TtYu+ch=Q@
-m!OMtXgQs_FceSG0M9>+ZkfgtHiuXQp1vxU%MWE6R6P0tJv!Y>oS%#N*N;DSAkeyNb%mIm<M__pLi$Q
-d@(MCgP_hj!UNlTBZ@FF2$RcILiItc3Dmf1Rce;vn}J^op)GhxVopJN}akODxRUAh^~K~9Glee{57GJ
-}S(L_5TiE>r+D&tW=Em&4jnRK9}Fx>kZ-3-OeV_kWgjtBNtfwHB^&!9HSP#&|%tEvUMjx=z8Fk-U#U@
-VKmm?dB5lS>|EvAc($Gd2y+75paa|m<%{cm4*u-Dy<}=M?sdm<jXXcX(?qB=ge5zt!=dq)l010b>c5|
-d5QCr$y@4(E2$Q-Ho8HmsIZ~~5^3SPtgNDdpYV9VW7b6312)CeF(-qO93|dMMe?#Px7HOv`TqI%`2f1
-f{_U<0SM1_P%&zXQ+f|@Un_OO!;X~JZiah_2RFkXtr-?QN?rY>5e*Tz@qeb{?IcN52SqLca#<20?f1V
-5;Df962fDn`SDjB80*YY}xvl>gYB;9VS+Xv`Rr!&7r-&6}{9!pi}yhL=T1*}M`D@HD%x-xz;^G&&E6f
-g;|!@E-AP(q}Rn(Nd!Fg`(R-U{XqJQa~X_<I=xbQGmPZLMbYWV_M<UCoU=hw`Uf*)VnLUW&XKU=hz_b
-x@%riho+mTXZYqG@<A*+C>1VjK!krF%o#7Vjf40&_+yZNE%`8wnc4cp+6G9uy?CClED+1pp;00nN?l3
-g{n|HV_Gd*R;Q1*>y%&*#!@7EwcF?oq}T`(JeYC0P%d~F73P(8dTf{qN4gYR8y=0nW&AQAiatD1A=lR
-UvA}xJRhSoXR3>4Llc5`qFnQu*KY#}h^HREC;~x(R&?3xdcyHf8su>*QU7VJ;G{Tkb>9)s^+^EOVWG6
-#LlpLstRVF_wzDaP5QT)y8E&EBBtQH~jf2i0`WH3-HMjOG_NR;Vjsb9o-d^`FkcxC?H+8k{K8#)~$^E
-a4YtWwP>GFpWMIR7KM#*6t|n^UkdbRU>2-2(=@dKI$U*ISb<@T(8gf+zUp;QiL->5%av8knHs&<W`fm
-L@KjX46+202$DtIxE3OOcN*);m{6L7{xFuO7Ir1MxhEVjK0bG$SQh0)Vu|IO_js4v!H9EDyUwo&czHj
-r-gM~T%_^b4%;G?nABG*C6)ZyVLgV+;2TGv8`qW4tylWykE+oe+wHK?OXuNda|+e_FD}5nL2t<78ZhS
-A8keBN&+$l;!eIMLb!VH2jO+$WLS*7Ok@6}s@|;~`x&QZcM#8E4y5`#4rN2~RQMA_4($OW18I}^0;4x
-zdefH_oC-c;MQ-1uwKAa+{5sf3vU1Y?e0YK+K1$)2s`U;yIAMX(p1P`MQ26o;O<*4Scz8n<$bynsiFE
-EKqJu)G)=Zj1fL+$PkwI~`^zJVE^(_`tFx*^1IY}((5z^Jg6x9;J6j5&y6fUA1@7=e$#r&(rLS<c>!_
-t%fcARkHY=V2<)J5p8g%tv169V2L5B8=aQg({<wb08Ec>#hi_J}9|v*wFQa)VI1B8cp8h;dTUW<P8jR
-p>q-2-&{~2okVQUq>9}Fub~liu#Ck1IuQVXQNTT2MX<^<%sRkiM<WA3{Oa{qg9uu*CP|5nk9SWb!Tiu
-97}k3#MzTED*Bh@8(4`pd*?>04gfW|VuE_-RpWj1^Z+hDX$MxB`Oo1G}!QNx3R@jEcl+}jyl-lVvc$U
-E9d%So+;)|i(dfWjB^H&wUo^5PjnE5z5Ij4_^0-06$ZaMHsbsOnDhMkqZa$Oo>t;D8W2~>U7RGIY3OR
-$TkT)yAh?ER&=?2c7e7&un_l^iRyQZW{wpaHAm)o!3$5@>XHX<t!MZ-jbfjF?Pv-Z*0Kot@8ui|2+nD
-!ou_s;c@d92B`Mn<80nuXZlGF>YO|(Koi46m*%hRhfg3<^q#v9_)N5Q!Qi=Q@V!Y-<5fV$ua{<RoLLM
-6|`7kLE1HCXNb4n@9rIqKTY-zj^7>q_5Hzz)5+=X$&Uvl#RV@6Kt&cv%Ni3k%KpwUO%hMzBrfiN3@Md
-E8heR(1QAk(I0`Y!V&{dcn2cbTnJPk3`#=H`>(|j&l_|>`eNbC=?!vhi9?|?#)z-HBk9u#z=$Z~3s>U
-)X(FNPHlR$QLtVC-!xe4zCCc@FIE%XT_Ne${SkWP83`41Z)>f_uq4!UGXOEgypwUmo8hh3xa5c()mZ3
-nh94!{i}q-i$B`H{OwCtxQ$lqF%f&nv1pqRR_rSwwY2eAWO2GgeNaixhn<O(efl^_MQnJZs{EZGPk!S
-^|m;)9{k#k0|q<qfW%5A>R6!23}X!yR7d4`Hgvg9fPt_?>?$I(yTmZ%2pk=aAgjD)#1$$ZDc&QMx4v0
-+3nCi$!ydey5f3#5nhA2lD7jet<vMKysp8HnC0GgSN!h#V@fj=zX+axj72<6xLSwr*75bZc;>#4!Tta
-+>4ksq2hV;Oe7CNCVH75iHIj~V??9vAhje6~f+)!ZcN{}~T=dQ&aWC*>8n}+;nR!vVqo)a=FPFD-@9L
-eh_#Uy69JSqKIVntP#H@a<KKJryt-9c4CT@GJ)UNLvi|`y5VL*j281W4}X9`Is4=A1Ej>}jvS$(R~Sx
-kVD?q*(<eB`!}k|6<#qoxi>>P()Qd~UaLVW3<Aj=l%m9HA&`U?i|I5Xg)Q2er%{6?dz4#I%p@j_T~0M
->{;2iWjt_owWf?En4p*9n8Fcr5$IXagS6K6rE5Y&^qg*W8YCn^i%h>s?qTlQ+hENIEF(f6J)4tfL6)N
-PL@*>rl#h_)%rswjzR(N1wpf(?r~m4T`A~?maz+@jHWySDqi`LJRUBh`ZeGI=~oX!2dDt;E8&{n{3Fr
-+`f+NacZ}6_5r90KSf8WuyL3ozpDww*!fTE7pz7*V75fo8PjfQ&>Bq21pfukKUEEHba7Pgf=Evj>JhD
-A9x*6wYr3~eRMI%i$(<ZGUz1kR|2}|K~Jobfm=G3?4RP{}bxTymWcG%i9fw`Cu!yL=-R^V|(kl!26p1
-s<5aNE@W-m_SgexiWF@g5~|@av?CEx1Ud&yHhIgrPLtX{~g<{PFQ#N2spujDMs>?hlKacl7;{xk{q`3
-i7o3sztJV%npCm2p1T+3F}Xl=nREU*tBY`^^JXCAQkFr*|@;U$5~i}#vfR~OZ&lg^y?c_2e@ZE1w%Q<
-s|b|v#%}t41XC5GXM`Y-D_+>^Kx6yfQ?bqHY(F7jSZM0~dGS<G5JL2*nSn`l@E)@#Mp9-!2D=LMEE-K
-_(xJMiO5RGH)<=}oSjQ@kw_Ocqr+o%iV|nOUt$3qLV>hghdnzAfp5ImnR%$5D6Er3mbrqkngWj?Hn>N
-PbmWO&&SA}`*3v=;rgXljAL4s{UYdx7L;igu8?f(E!O9KQH0000808trnOhiH-Lt<F~0Muy#04M+e0B
-~t=FJE?LZe(wAFJx(RbZlv2FJEF|V{344a&#|rVRB|^Y-KKRdELEzd)qd$IQqXo1y?>fmJ(TOIWJ9p>
-)zuePU@$QoyT@I>880VCDAfBGO0sSaopYg?swh*;*FG?wCCRQ({5vl1O@|OFqjz(W;VCK{j;$dRdI2d
-&Xd97c4PC8f%rUM+!pEVs*1YLd(rOB&Te!Z7iIKnSypi}PUg`MbNKyVGxd8gO@4%W2lIJE^~$J7%B1+
-5Oa~jA@ZwEUT&HE3=2;Y_WfWZ{MKZpPW<{J;$+RCumqn69QGOXsuHs^rz>_MEqBy&a7D-X&8NkTLRh(
-vNHjCmYngE7aJgTk$UYTE3H*t|*jcF8@Wj;w`031#8$?`hMs<=uC296Un->t5oZ0B66b$ZfXG)>|;V3
-;9XC~>agMmK47l`kuR0X?gVbb=83SavdBP7y0rB$}t!DYqzKWJs`uWtsE=2BP1OuJdVniGLI7@?trjr
-{z^Ynx@#ocv->25+6>I4C-O${+bt2nat-5BgM|}C>YrGc^I&{1&(_a$sm^8%bTnG8fyTIx`Q|?m&+mp
-1Yq2#+!X#RbASdo{3DrE{FIuy%;)p`26|0+WYZLTTkg?ZUqFF)oPSQJmrO=cmRHaV#tUbRF=L95cjZ+
-K<P(h%FCJAu1f~L?N?)<_%Q4VgR;4gei@czAaR?AC)f=X{i=Pgo^V63X?+(rmqoeca&DrVSj$RzTh&l
-)75j^PhqjyIaKb^k4h@i;X!O6uh(do<R;N+Jm`uXVO1<upq`!{EY=jYMsS#<RJ&GFIUi+*%;^8EPii=
-&fQQS=Pzo}6Ap$49S^E&%eyX++HmyraW&fB`V0*N11%e}X3m&yJ3dE`EVAeR*_of{@`G0FMr$=*_{|#
-nJP(#|Q8;dh_<|&FT3eyf}FQFiuWSj!s^lL8FJS4^J)zfd5GZPowDYZ}2-h|LNfPnA?sH-a@C&05ZUR
-e){H@v!ho(T>y-qPLE$4;`3*RfbhYy<3nznI{f_j;OKQfdU5dj;MF15Jq2ih3KnIg0mi$Z4*4lGe*hR
-9Jij<PJ)tf>KRvlPgWr7^g|mwq!n>pML+J0p+0i+m4=`SyokB}E>`)B{_5|ym95N`J5_{^P2>yP1j$d
-&+34<4h2gd;K9IKnfaqce*An?)Xa#<~lWHgG>YowHDQKVS~PcvG(8ylTY=PZe*5fw+uyeZNuK_Ul^3M
-5`!$5j*;ldJS|QVy{A#>Qy$8I}@M2eA85=ReMp&nf==4|peUBK*L+ox%5moetE9m%tYasDMv3AN_T?v
-y(hRUfT6|X%DMSfrDWss`ei*;MX3o;^A<6XLoz|aWwpH@6qnw&M<ng0}MLqzAVyy1kYb4V=C5*{sW;*
-K9}i~z#x>P>7KD&L{FbSe)_}$`j~<KJ-UXDZ^NL#YMLk4<7F`uctrxMz2xrGe(*VuPSWH$xlM{bew#b
-}>qloPa`kC+k>3Cx%ccVutW9&jIid+F&4)5)<!!0H=K32nTB+|zQDnLLQKi>OU8q=2bTMQ_>U)uFY*f
-YV-Ug1XJew5@V8A!ijpWNDSyY12VNv7-mxBV(V<-Xtp5z&TfE}qEl(*OOH2W06w7*NUX?{~8nE{^yDt
-a>5iHbNafpMMW6+nc6OmM#=up3f!#4RG>>_^>$N;p52>4z%zYUDRnqx2%`4j&F5^<W<YjyX=aZD66y9
-4Ej>lLDAJpaUE?y2|HM+65TUdGfqSfX2>mug5v;ILCn6n<D)Tlrl@OPyCHa`<Oof)J;_SJvERg@pWPh
-;{rBk96DNaLWyb)?&DgS&xy1?bS~oJCA<VKjbD$l%N)O^<w$DD3xeJGxUm7<1Y#Me<(Wc-4?7>DAEJl
-WM2|+}Wje1?T)=S|$&Yda$TqPG>Ngvse39Vfs3!yZO@jveR1$6B?=9Rx1!pR-@eRTl3w5}&(q3173#g
-N~$B299*PTuj`fL()WJ}y-VU@;{Dk(Oe9iKk``TXebhfwwLa5qqCo@BG?3U}T`kxvrX$w34f&-2Nra^
-vjq`RUmUsa}J+51huUT_lsdn3fx_PTr1S?>Tx-$Rb}UqR7B`6FAZ=okX*2Nn?W&5{MtLNglm-EB^Xr2
-R<FM+9EI0FJ{G!<HM6z7e9?o4qhXc!<`+ki`Vg&^m=)1ARChanE^?w>aYj>e240|Y|QE)UA#Pcj{qJ&
-URfRIX;CDX(2+}Ev(pV2=vNoNyg8(vho%>W)!A~6yBXlUabT7Y(1TO__~d6@dKiRGtgj18BAq5`HTO2
-oe|fFz?FQ?W!ej`*#`B-fboqzD@|rNCa*<3>^qa!IJ4t{}YZM;^s}f1N)m|LcEj|ubo2EdRRbJd~ygY
-h&stZ5y3!_qTnY%5ZG^A^N7pet|yGm!vd|C2n;|jnUqvO+)S3;HJ&T+@60wsuq=Xo|GDl)4GC5}5kH&
-vm*R#nbH+&t$t&N~)js!F*4u_O`X-v9JMcjrrR#AqcBhT9;F45Q>r1^YZ~K35=M0Y7>F>R4Bwt*$<s=
-VKU4seFEVjMC%C#NmC%tbCpW(E|T<o85SOesOR%0x9?P!3ETF7pc+i@cXAvqb{+Jp2&X0lXTr-2x~P~
-QsK?P`?`Y9HQjD@7x5R}*o(uL2XBur>iTu--@cX5Hv5NcCm_Egtm<|Fazu3n60!ncE*B)l?QNXDee(u
-%fWsFfoUe0~YlQRkqXYd-*h_!IAE!uI2q+}HQu~owhQZ=$we=(6CH+V^L$J8J()y9RkXozp(&=pk#zK
-i+70FU)iU6i>GSva{Y}E1EhQ@Ea?%*0opgs?4w^DnCO{4=NYu);t$0CRT>_(;NQPA`kS$~X94kB5B8$
-=w5AQ#0-${p~MIXXOkLD+N_adm}~9r7ymy-a^6Y3~}v`;I$0on<=3w=@2;M8-(J>B}1U;c&&5m%#2}!
-p67J)wIC<rc5fv4o9U%5gvELXu2(%O`{nj*l@PI9)rZ%Co4w|vsLik4r`R&8-&DyODRabef{k4tVZjf
-G%B5#hG;Lkoab@HBh{G%o?Qo?;W+LArt0_1`AyS64>tb&jU4G2Xpm?MBl`}L=yg6#xa0lkb39)rG-Ua
-tisyrGY3h7*^zxYY#hrY(i&A0DifthTOTzl&k~?-uODe*Gz+9-{&J(*J3mYN=U_oGCT=0=yuof?{6fi
-9=<zQHgJqAeNgIsuM7e*;$W8>od?a_-Uq7sjGOsRAeNjJi`psyuglF5>+AQ$JabcNkOg;#!szg@hS3P
-Y!YGWr4@Z_f@7UT8cbyHrdIEx*ZNkG^>O?(FE|P$6KIWP^-R^zi-RbKSI6lo3q+S|(_*G3vak5rJ6<A
-~GxT<pN69i0te(Afk%ah`>CoKt$@C8i?#X3Xcdf04Ql7va=gTL=`m<*%_`tgzJ3U(oM4zZLjI?Vp9Kl
-SfH@y<p6mluJvvwtB`q4fOE1Qet7cyl+3LAz?-Ve?WY|>NjF}i);~)sGVR}%6`D#WIa=hqy>IO6c@DS
-%o4Q=iBV{)HCgEvgnp^@O&$__yS+DCy3fn%Kvht#o-gi2k=XnNOC+ri#`q8Eolcv61q4hkAdB>{IGEN
-ryfvU=88XTMf!B4tgGgPEVs%4Qy<%c~+=VSCB>Wap>jVN}@UJn%alefo=JV=j-{5nXtA<A9hZrMmL2<
-gi-n|4V@Wjuja7SUh!qwV3I-u|h3ANCd>t)2{~Nke}H|FqkHEpEiT2QhYw+v*BWC+LNZBpq^~*nm6qO
-^()uG97~yrdlmg*m9uufuAaCTM9JL13__~-wad-OEgzOA17Bumsnx1?yI)=sSnztU?=X%e01V+lBOgq
-(b-g|hi4_79eDDzrz?s{?r*rk8a6rgA$wtTl)(m^PJbdng-UfhDL)hGMdqYlj0&M0{R?}a;<7H{Y?gG
-Hkbt6wJ+~V_{IDNAb)G%g2kfWa@<R&bIQ(dlYR2=31DN4S*$hO9{il5qZuf01Dm2m7w5lal&yqXQq_C
-lV=b=&(i{!tTuzi<Gc0(9rnR+Gi%Yw}>1qw+rf~_2$v9Kx21lLBNPsU<=St==Lxd8A2r2F*#{Vv1U9`
-<_M!+{p<rBVqZ1-7d&o00TL;$|j5Nb&?~%Mvu&#l`I)I)H^9(-9``z=#aY-87xV73ma!73ve|1f?K>Q
-?D<S-}HH4r0|pFPQrCGPG{Son5P<xB3YoUAP2JpSWe-dN8R1WPuyOs1+x<Y?EnQuPow+yBPrt$SxH*O
-y`B4cC%R{r=|@?wr<kKGpB|7Kayp;7p*1-V`irTU<08wVA3@iD{G=I&dTrG!uiHVj2*mFjTqPy}qRL`
-4i~ZZNVQoh5-@lLEfz+H{gZL^muvG#TUd5l&d|A*@G)(afhWB%=WH?Z0Vkh|$7#^c{Dku?#1CQVEiOO
-J^E#k?iZs!=7i#*~7^9~Ivu(1tm{E-skqKI$1y(R|HIBw-2%|NECx;p?n`cI(Hhu?kIb5Q&7N0Wz`Rh
-W-j8wB%@Nj#s7CRd-z<#pK|FE0&F0dIiL@gNXSO|Fs&77~7bo#05qP>UW1D;Qp0BjE$R0s$*5wCG+cu
-8RN|BEzGN=H@B|(F~@+(DTwu1thJao0!alb9hB_TEb8#C9K&An$1NhFqQlgrXNb^xh_$LsqoOTd%n!*
-nDZogf6=26;C>253_qP^&=#VvK`@fav@uOVS1w@b%E6LsgQPMmbq)p;$`C{a1Rr0eGmt}}SEyTqbQRq
-s1{%1Ls^Nw$ZJ7x!fU@okJ+WD|DkrlU@nU>{^U`%FcKGP&GoVqx?!z8@|A_0|De~~~6IEpR_{rYm;qJ
-#C)6ZR68Lw_-9BxIZ)ag{;Ze2(?U)-Y53ldegEGDoSmX#7K_wk6*-2E1}>L7vnGTB0;b_BJNjMPtnqZ
-j|trK*>fbne+_*BhKppn<d?vtk8b?O926z5RWYe{uhuA_BTD1r!Iu)J3sOY;FJphJ2`)3{Ye04xii~?
-(9CY*#Yv*9FOlV?YdMSs(rGaVqZz8A|~LXNxz@HeJMv-Ltyd|wn)$Uu&WPcuVdIPf!_CFaeThcr(Gr6
-OI3!83}9TdJg#oAJEwD2-FmzTPuLUWbx?vkl`RIgT(kj_brxX4;+l49cuv>VoYdX<i#2l&db(H>g1W#
-ThoU(%SOcv_qbf$h8+Lhm-R+9Wr_T^zQ|bvL>xzj-z1g<kJUiBP#`c>RM`!BI)PD2)C;et(zd3q&s@^
-O*J$NP9v0X%7MIDf(`%(|zk>0QB-PrF?(f=2jcTmc&Ta!l$;<@pL>gcw<Sa`f@!Q)j69<KzCS3VxEn(
-%nlg2!nK9;YpMoC+R)yLb<HR3;wuNI|?X-kf@PY=~N@sHuzpgtP`M0NXy<DGl9Knb=V{R8+fN+<f8xY
-cBe>WNBad2h7v55@AT|y`U(g-@`}EE10l>U)ZExFDGIsDe!#Udui*n-{S|?B;ov@wC@5hhCe=E#Ks5l
-VgakMi@<tb37d1;!m$ehSC+Y%bvlE8<Z0H$GBDngd0djK1harc<wQ~s`?DBWgmx|&=pjPi5w3msr9$z
-FAt+EafLBSD6rga`4k|cS30D$>KnN_lgEhfCv|ueW<bpIqq<<+du>jEL`86s#=#{cA?D%t>&I$OWt_;
-E_Xs**>8|NrLUat#YPU?UrbC{D@d?+)dX@IglPd_D!RD-RVwgJC2d-kYFk(QeW{_uKH-I`#H?@j$ku#
-SKZ0tNXYLlt&<N5GY;*9QFX^yOXgHMY7IzybTq8o+G}O_)ZO<1+d0C5UQwgiU_B=ysh=bvw>UyVGE+j
-g*YYpc!SbK$+tB_a$gH?G?EnqvQPMIQg8+kv_X@Ppnagm)moE%L6TTQRqA$PLru!bp}NXZGeQ&QH7$Y
-oJ*Az8s*7r$2|X02230n#vZ+i1VB7Nqe?9a(-+)dMkBPFk4D`xnO}k?8($~n{+$@|AMt5*lBYhfBkrM
-@{B(5o;`HSB7h8viJyG7iJHxlpzxda4*i<jnkBhUnC(rA8|NejteKe)EtGL7y*=~-O#M9BUqmzTPUpk
-H^PU!t>pJ8&5TIGgb4KC3&GH36&Zrwvv!k;{O(yIq!GSAC|M#5+UD%Q^dmQkMMO&&NrgY3E51lHAMps
-EzB0k8-u5bQSVS6or=Pa|fj9(_Hhw`4`5v#yd1exO)S;{}@9#z}RPB$?u$ruG_J3|3Jl`OEt+fFI9qR
-n06(retTlia#erkkDH)@iP8B*&BF?mO_V#ZkcqA8xXt)B#R(b&wfuA2w)6<cdcy(t$kw8)+^&6gdv-b
-#))jMG5V?Q(Q!;!!5XVg5d0)xf~W#x0H`GNt%?_koNPu(H5q8Dk&HcJf}DZ)3>#T#ZQ{si7BauR%W~^
-ePtjMRuhd;q!yUR}(T|mOKvdyl9<r!5ttBu5wy3n|ebQgeWv1SE>MnljYBql}ScPpE^V@qFgIH!64^?
-MT@Y}k-<(d%>GZtV#Aw_2|wCR|HFiomtQtygaiBsKU-VOcX(R)+mUv9hd*zQY>rmBVqdg^J{Fo;sG>B
-ta2`!ut3(&0=5F)J>DU+tGhbLy+Z$prTrAN#!!Ohi7x^woPGN$X=5Ggw;c-HwA6vcD<4ac0sx{c)zYG
-yA>c3-w+tU7H=8f1jsg?|qZ|yZd1^-V<#*2o#5WiK+`bnrmUU<Es_aajLT)#)n6yn8<tl`f#@kqw2#_
-styiF5f~2*j+q1U(9!Jot`Er9ZUWVb@pApvsTu#i`xSEowf^v_0ho7~nYBlA%7!76(7iH~YdqEk1P0I
-kzWX9kOa`#J^XOZko`(SOIC%>OJM1z|za4Y^i$D_KyRuXr7LOkqd~+k3CUe<`jQz!sxp;@_FvL!ec5s
-a<Kiz9UplgUY4pBPo!A5nY{5E*I7SWfD{v-<+oWEs<<KfrKcA%$n{EzPUedEQ8!<WYg7l$u`o|KKB?H
-a)AgZHC%&yFt6?*_rbVD$R%_2~HUZ->Ws1F}=kIXcRfRm|NsPrH7=^DjJt#}Whlr`zlG?9m#H#CqBJb
-?4!CzwQnn{<<^V!T&nZ0|WE}^2guV{q^B@-*qg5s^0JhAO@8<Tiwn8*u8s9ruW7D`um5y?T59TzZspq
-d_MgC@orScw<R9ETrbNCC93G?{B-;2)5qU$5A`Y4OY%TBPQ<-FnV9h*YFg$31|1QKWHFD?n}-io*AT~
-n*xr$Qli1cub+*NVMwlwq7`5+*#x`QmF6|{{U%z!`54Y+E`{D)D+~8lJ!76rnWT~2h6{A;)3CA8xb19
-F$a)1!E7;pCihtHB5mikSkQdWO&MVQ8BK)P;O?a10;1WNss4`ygY<b5yt(GrRR<F44LK{s?bW>)(c;I
-eY!pvqgVd|aVUlBNdFX?Ps@9i;Et@D-I;qQ;mAOhG<Ji&zSq<Ryr=H*qm7R}f%;SDVL3W?8+n-gJoJu
-SHPigebzgoG;6(Zg0&Nyfd+u>1mt~ccWi#0pf?RhG*=PKtdm`$duG)ecJnQcN;C$s8r1GLg{!}1pwi!
-zF|k6n*z<w1xilybdpw}8&2Y~QkN6RR?ncH2LR!{m;qj$@8fjGs`+vLrREve@om(Z=lLh?QQ<kElWQi
-e4O))Kh_NPteDX+xtRdljG=ek;4HF>!IZr{AFFw)vJ&<3<US$Pe-H(3bz34ZQ=*a)c(ZCp1N@HNPNoe
-6=e*PsX{q{pd;ca|+aQ-ve`En_rUW0(Y7BJ+t3fN2d^c+8!mEv1abPK9jBDXohlTrv)%1+vZXbVmNSh
-c>s{4`BW2`VK1I6H<RZW~*B6@N-HrVhku@CyDR^AkIDAPvRyO4<57ZZV?HcXxZpdun0DS;MSY)Mq3e(
-jj;d=ti!;NebYh1`Lu<2&k{En5Pu}A&BWDbvch`k$4PRZF+kxJ%3`;71jRF=#h=pmpR?|4Zs9xhMc`x
-+tY2*8wA!1wE5I-v&rd!fGMKUjfE68S|b!B1DP-gU12@SKFh1|89w>{8A7{(1+Gc8UcOZ_p9fa$85@U
-d`Dlx8S^^&=la=tpCUr;oiwSS4n=6y#lL%+<e1FGo^*pIsnykoI7$gwonuoxQ0|e?nIS-H1>9k2ULvQ
-FDz2!9H{BhrP5^V8KvFr9N@y(t_$4k$1S+QoOHo*sB)nx*%Bfiqle8D`|?8sO}W7s)JAk%gX_NO)YPv
-hh{X9=dClutGpY&BF&IcVmWru$S#HHpY&is}e*&}y1tj3dE`c3yUczcfIY5ZLwg@bqP~#3>E<cI2vdB
-2b^Ub!^DkqZJb<O*cAM5jfAmif~e%0iImR%_|3is*NCgOf3vujV<8Lg&>Sgzxi0HrUDx06;r-a8}(&*
-lRQUeZ*(ctRJEElwK~JoIf;IVe0|Ftq*e2IH%Gak#nNaFwUJtw@n>3DFHajRm!5E;PMQtzY8qE@C%{#
-vq88!&nlC3oVla@NvL1^1XHd$j3yIRHu?-Q_S5cHu6LJlGDlYD`c%dE1$Wk`ws#u)yRZ+fgxE5tv1ob
-uaq-5Jal&Van_Rh1{G<mMwpmFLpBkQc!Ir`-TEBE~O{2Cef0^dn((lZk}N-LYr(p2l-ky>=_9HK?!f)
-;HR|GK}`TYa>t&eQhnA*fH^nhvmn)2d^&tabXXck~df;8tv{7xReEw~wpx1B}Q}vE|b?qq;Uw<!v_m-
-RH+1pl5%-`hM610ncn){E3UNFggV_P(@@0QE5VZ_V?YdqB8WpAx>d<q$n&zZ6X5e6noegvH*2%_&btU
-DK~D&RiIkpDY~j2M>l!#DK7FQ)Zt4HMm$3h1?yuZ5N@FZsAj6lj4Iz3=q@vI7O?cu9-eyugD|nITQ>b
-`;$lXT8=WP<A}I1u(;a)o>hN4`)>$Lsj^iI6i<uqBS0CUEbVD5p0zh)5T@Nuck8J3-OZfirpB8M)17p
-w37q%AuzRMk4ee!0JE@?PBYgqt&IW5?-bx^kkYx%NbxB3#?t%~@jWw%n46Wp($>RQ(YKmyTw3-!?ydH
-_hnputXtRc#xC+TZYvA^Lsu4tHl!*w$!mK8$dF&>#a-Eo5yyqfxij%oX~2qrzsMh0s9lHTILoF+dD5Q
-+l54f&mjHO=LT-4;b1TiBZ~D#(HlE1C49ZL~Ri*K9v}!lwF%iurRiS<|+amdGb*fbfi4M`+>E2U3P>R
-LqVh^ogJI(8n-9aG1#^~r&IKd(_v`vav!Z7c9z4-rBGxkJD95IUSeO#*7M8D5`D>V0rYuqz_@>|R=*C
-rXHaPKqc8SL*>HSMA7w%!=4{f2#wDz!*RMfa$BT-@m_C{&UDE;WI$p3Pm&Xw1;rFD-WixcnXQAu}tt(
-%A4<iI)SqFd!DtBvvwL9l$#<=LWC=r;WP7;CYjOTM9gZiUtsKIgscqt1(mt3FvszN=*G^K&HW7b6zM_
-of2e<0K${c>Qa-ac?<*B%`UlsV0+$PYE01XyHS|8zawMT;$?ycb|S6u{H)ATb0GRm&A_`PQ&~I)IcUJ
-G3dr$;c2#wme)+E^P`6gyo$qvXf;&I+9pN?_h{cIe4!*NcG;88W%|f&N&p2fDUT0$}Lrn#}#VQUE6-M
->(~)vwpi5qd2@rUCOyS{G$-12216AL2xDCJI?cLFV~s#O0mPK@Sm>f^Ke~qIHtQmGA1{f+E`WdXg<h5
-WdS!gDxz<My2#yUxz}x=z#QZ=o?_!Bu;apbpPT&W_U^%_-*KF1hRpDvCJl@cT$#wCgF3g(K1^x49%E1
-Rmd4(q%trE?}y7n+`^Y{i%Z%uatOQL2}9SdJ@Yy|{Hp}j9X^eJ?EKlsYR@_|>zwB&g5%*KYkDuzE#Nw
-n~U9DHT@v|H!9nYz~{_x|gPBBeBLU+a?#W;jyao_!zM(p%e9R*9xaUvN)t7Gq4|O~v$9+dv};8Xsvuc
-K8vk)w|Rq3cXVW3MlFb-l9#bG8ER-Dj<3|Xt?%seU{J8($+f}XcJS%6TlMOtT$qOHICR7zYp!j<}PXJ
-EG>l%@9ws3e%;M>&8;Y|qU*e@f=3!eJI=wCIkOV11y6E01^`>3=X2iRmRXg~@w`er%<vZXS2#;~AySV
-1dTKao!T)8>#o3@`!!qoCm+lSp*1fg{XVee#R*O)~x6O>ug6eAaVc=#3)AMa*Pa1jmszbJ5B@r2vIl*
-<TakzB5$$=%&3*eSVr|(3)T$U7Rh=Kr2hx$SjQxQFbu^_v$MfdYGOHA6|9tJ2MefcC-1(t6id!ci4NZ
-21c+g7e$^*OHc!X(8^tu9j!rqQ8ooGqg0{WVTl|3zEGJgFF?|H-vtsCG<MI@Vf7uDV0BeJbp^7HpycH
-%o4KFwrbvJCUt<-n_PnPE(mIiojWs;43FjbgvCNMA~W7S@rrO;j|JSmAj0PkA`XNyi5WY@M-W!ruCM;
-6Bn-rTFa5O0gmAKtOyGDHb$QVp$_jG8rNU?=DIDLHAFmfC@Wc6m{W>8MsTrF#U?$mT+SW$hbB^_iP^7
->mBdGahGBfO7tkiSHKo>LDX-UD<WJIy{~Ydc7hN0KT9QqY{k$BUA0GZZIzPPlcGdgO=@&p{WO3md_y&
-wMhGdBA=Q{q<rOxj34DH$6LxZrNzdiG$4mK18*oN0GwCSv^NN`v~&<OP+2yOk|9G<*bF;alBZikqX*M
-^0ClfRcWx8eYzP69iw&=C~Ce6=@Z=2-9EfEhs`NUXLZ;y4wL(kdzZyI&NZq#`MR9CFd1`Z+0dgIi@Al
-ly}hn!hi54DOZ!)M06*U7MP8@Hm1FBE)Bx?#U;?Xt{L+7z_sQ>E!qjLoLE=#dGUO8B-RqlsHYQIGvZ6
-XKsmOsW7+o^=Jm)GY+$fQCd{cJ`^+b@T!>fj0Q)n3@P`sq++PuUf-x|zbm_ZgU@&&N~pX5=&JIvq=WZ
-pBBB2pZ?um_<vf>^TU~X)+(EsV!p>Xa@7rVLBUBC{hh@<7LItr`P@N$5Apq0l^L6}>yuecUJ<afYpdc
-F-u$W<Dz@Llw%Shse5YA*52!b$jJ&m~7hz~`m;)t?PRhTeRbBBiO|NEVev&xO*6`KSGe5*WVO3N2Qh?
-Zp{ij?=JV;S<<gBUpUrS*uC`!IbrT03^~CyyTK(ku?>go&kH1qdK=Qk!g|K2=2N)Gj#-m89t8UQw~2*
-rClYl@-{*8EMTfyveyOF@h{^5R{kAs-wdw?ih7seX1akb`80)uTmIU<LF=ES2RuDr3yZ!EAq#D=@hI7
-&@Vd+mE|Gy3#*l4baPV$yx<q?SM1lqH5IHyFQk@TO&iwD5k(3$I3K$}QTEkP<&n5I?9`QIN1_*IZHHP
-oRS;*!Q*FybnWD7j>W=<UGXntd&wo>0BUOf3QOpNNnNfh3DYHd(bkh7xf~-<_Qp|ogmHM2%qb^K82Q~
-Wuc7l)E403w1sX}Q~V1DD8Z4E9!FR(ZsEEOodR<~W%W?us{`5C-ac(x&>vx}LCSrz*_1DT7Uv0yAPs=
-AA;dfvAhv6wIhdG_TW<xls+y)wF2pyA}+=9eESIx`_M8qt<N8o@WjVl?XO5$vaIDKJk-0T)X4*REL!i
-w9EHxo0?XPc-FJz8DERtdQ_2y%Uy+=xfiOUne#bZO}#$iNm*(e+M6@EazUS%ffG`#LOu%^GZm57G1)(
-&+D`=k;%E8G9n-BMHZ)a3X$kwv_%nh>>_#<?%4$9_Pid+ni;!&cgoBHWwcbXXY<}bF%nqzY-X!V{o7I
-+DT^fc_9H4pDsh~O(!lQty^qEX{lB`0?`AnPlt2kj>BcgKu^<QaM)|vhV%yhA81_{%43+C(zf&&Z%M8
-TIq@2Wyq|;z!F}4OfY&|7?q&V=dk4a!@@SLb+=v=SksOd0tW-7Mk+Yl@ak0=kDYztik8%Q}}E3I`yb$
-Irb&CIgpS2j{-dRy5@y}>z++)W);_aPVuQ``-W852%Jr<$0ga=k@T;0&BWjme{d4;@OfiAy9h5^`FEf
-Tlq%s~N*bj2&R)(OfkGdW%BQJkROwwqxX}Tk%@JfEJ-e$r&{}AN%$qRkvs;aVY2>b5JPol?^^@IUC80
-ShH@@e~8fB=`?8bn<o>4!<$nXaUjS^lMT+9Q=OZ2#gW^c=h!@M8X5h@nKehx1Q<wA*EE`6Llo<y6hen
-H=(V6z8^qC@tdUr19<~mt7#t=<Dqp+a=}uAwqH{*)Dwg)E6L?@~KD<hB6W{jn{0z<ElIzZi5vqyKgv0
-mKmkUX8ZA$xh=Qpa1tx~vJ#sCA@o7>c8bdi*m+WamhSs>_Hl8J<`UVND()K|$<r}Od_GC&46%)M=lPn
-tys=g*Ih^n}zs!&W%L-xdE+5%DvLXKsFK+mECiG>Ev@kGhs2$H+`*EWe&_Wa-v6ANA$oE`gglwjg{Cw
-B#BUuT%;zV~l+RBM1L5^g6r<LaEZz>efFUqwKiZGO=3&AO%IQ;gCb>(i=JJlsw2bsNk(dA|XWjqm%!|
-NS|a?lDms<vlL4oQk{ltjK&yzpn*Xets7jkpC;3yddRYvH16J{OXp^?nRVzKZ~sKPlmU&(lk*hE6T<9
-6oWg|CN`|Oh^1L8<cg1q~lxfZQE;h^|Q=wQg@uw?PUq*ib=|u+=YDJ~v@ky~BO3!1jc?MyynkQZ?@sz
-&^3kEV6;ee-QN(p->Nf%1>c~k@Lg(d+gJb{j}Qs4%+-5X;%pVMa2z`L!CQRe2_IP&IIWMiM2VQBVrqV
-_AJdOwl`&+AFZfjB5@ZmzZ@R<C^>v5X=97ug}$4<)qYa*}EVdNPL&7`<6*)5Vdta$T<_o=G>M#q~#)^
-KbVllj2j$R_+P7K_eEP=3)^{ScYp3#UV*7hRM-%`X4^+C6U^kEjs$(ns_B7+%L&(&sMSzd$Mi4IXirL
-^qvyI>5_a3Cgl+}fBmpMqzrnXT|4d&3bK^jgMu~L7`C|&$ac9<&v0~TuP@743c<piO91RvLDSc70=kV
-e<=g~Mju2^yH!~*=l?KV41*<hRh}aPY)m0YLUdF<kd4Y#Uqn6-Qn;dCyoRBA$oSWQNDb#dU@&=+HoAZ
-A3!5Tcwp-HZtv!trUq7G~rK#YMd+G0;?)s};_onCF6i*!Q4)|$M5p<}>$<!5&+FB>6N81AlBLv5C=Rm
-S@40!nTgDb8@e_cUY%EN6vs`r-hzXTy|2*PfBO2PE0|O}W0cwWZnA!`+oF*|lePtZk3BaT2=zq}E5Kt
-(9y%#Ymw>^zq|1Q`JXTO}8Sh-J6zZY}Z%)`?!Znf)-qB#x($aNatqD`>?I6?|r0%e|Cd(Z*}|OlSh<K
-wsUXiN&f2&w#qO<c^3)l!^hvX1lefkb&L2G<fCa<{<g(}LVZDsS;_VIQXRTRn^VEjcyv6V+A^9K)25T
-(_S|3^$9`l)T+rlV=HT+K+bFyr>_>ID1`rwRph}Xi*BM2r*CN_9SvyFwVey><=dZbexONfT8C}y&&?c
-bNh49cCyLDr3W69&`8mj;KZ^w+FZGD}=Uk88vuVd)-F>o)}+Mw+J_Bk`ZBOd)xJUD67zl#}dQv^y+-h
-ROSbgl0J(eExsMgaS(ufSMxBrhWF$ZA>%$eper>{3kwwGh7_47Yc8cAnOw0hD0N$02$lJrvb2SOBH+9
-R)GtQ*wI)YqZarE8vtC6!;=>Ray8b35B^sgDe6%67H3Bv$d9FM3L4A=(86y2`CDwlq_?6Yk;Gmon>@2
-El7S&s(ntZLaCxbG%xZA4so}~d3Zp*4jahEDam8*T^Ow741%pI57H_Dj_&A`L8A#(*L<6_h(Ewwq7nB
-3snc8A-?>OI=V|HNof(Sjr2b~fk@)J-RsI0{e4NbEEHje0@u1iS0M#b?oOgDI{#5;%84BoE4!Bf-j>$
-KBoIN+bP=C44Vje3Jvc<5zS)|a<n1jwaiI=hGzY(5Wp*XZBNiv-$C54$T(Z0(eb+76?=e%x!94A-C=I
-X=ZvDmk%sAf<8d8JKIK|j|ZOiRC2pSiGS8C_(9_>(H)kB8LTE%@JqXltMT{WaUNK+r8<&;HYP(*bMDr
-6sh+ECTl{DZleRK)%ZzRzxFfBvO=Kq&;ohAo;2jVa$0&YWQFuAMhwX;QJEh#`KP|?VutU7gJ7c&b#EB
-_zNcu>xd};Er4`-FwHIdppiq12r)~TfH<W(B7J?0XXb`IX}x{A#^7r=Y8kQSy*hY|scmG2E%AYj{x@#
-b0V~wno3-vt^L~w2p3t9wHfQ*<N{DOrj^x`@u^|R?EXx)zX)`aZe{Y8EAYKB%j+x%ijx4N!{bj$FpF=
-={2>?58dOsUDMhctc%dF~R(gMV{wFxH;V8>7LXEGzLP-Rt0derdI)4k#2Cm$^oq!jy?G-WEc(Fi0B?2
-O~7*6mFs`1UYRg5e*I&hkpIu2{v}*#pJ>W1F6dmBe3F_h$#IJ^g4GVh`224D@;U#3?hg%M73F4R;?oW
-yC2}7utQaH+<*<Qr@V#)Wav7hTAGttF~8`t0}${Pt&nv=N>-(?xXeIaFtVo1!eYjq1>wBS~~T1pFG~%
-{eE@5nOpDs@Ae+<e!sGw;eo2g1FG#keE8i*zo0ms>VglUjYp4-g0+EG(16!_j~l4O;F_l(bp7o+@-`B
-KpcX^eq6i!e<ds`Cic7XdQ%u&8%wr6&n9eEr1+cj*>nNh0yZz`u`3a-ot*E=rL(7<Waq_Yb&T#*NUZ5
-j|__az;^2ubmNPz=VkagMWmf6zCzQ?|>lSEy9l6xzZi<N8(j}%Pixy!=5{jnLHW70qJ<h@F+soFfI_|
->2uB%GQPAhWi>fK>E>z`!UC{QS+q*}22g_}1XVr%xP96gk{SUR+@(I`pH!(NtreEA6eUs10uxQXrmax
-ckwUl<<QGm$cbfwWx+vwK#_Qh&obR+V3K4N#}L=9u-_j;Svz)B%F|BiB})s(n_fX){^IQ!vE1zx3eg&
-JACfZ(}#PHzJKf%gh_SoMBx1p`Pw%c>}#Obsys`s^UtUeOqba-&MIC}DlC9nl&MLJLQ820Z(SwE*h2J
-rD^MR;&}y?=o*424d!C@h$u|1n;bMKlqiI;SMKq=$A)hy5A(bECaS;5g-nar9MgnUWoa7P;3s3T+J!W
-`FWKs!1?P#6&QNcUHmP9hBI`KWcXst%~d2b&miI0RmRlVlY`bl8Z&}-9el`gRMqU~BF3Jm6e8IjzTQo
-|*#`z_gh@AzSO#F#I0jQ>tfAVs3GWV5PKyZ*y$;tD2ppJ$4w3G@33D7nc)AYo^M?TDiG<EfX`rJmeIo
-5UHNX?=z<q+tC>mI_$89828RJc_3vhyj%Y5ip?pI=(?Uhz`7m(QD8R1P*4kVb7?_?5Vu1(|7O5li?u3
-3<Tb#4zXbCE1NfHi{h(v_?nd$Hi`5F6fZ$CTHzQl7#vi_LfFD)w98E@ViD?TZje?8kL6aW)To<uKCjy
-)JQVzggXpYwu0)fd3V+QGvCi$S+D2(kniX8f(RHqJb>S1(<W*(vt1=-b?bwz_AtU5aNM}*ntOM1zn9%
-*j_ZoC<<Kf`M;+2YBn`KMnn)Mn}Mafs$xHQ$i>-&I3h*$*|yP;h+w1>g@>G8qY(fLT;tn3BaHv=ts4$
-)r4@iLuPm^Hv+G4;%=_bpTZhG!Z!At@|Oq2QEMpR)W$9?_CF5ki8+<zLC|O;dDT6<N-{Z58ISHAl7rr
-WsW|+Dc1kpVLCulO)^a`P(;dPR}k5UxYSI5HUZc3!B53e8INosW4*7xrfTsH@}V4i8e>jp*0Oj;ElE%
-I$I|Dg@WKal>-2yl7BJGO;HHa+WeLdC+JFoLc~6mSh**<n;XJ*iA=4*HHeHvf9A8qM)5YY_+~5N#~kO
-JWg@z>*mlXZML-D8k0pw|Ow<GrTUM7r$fbtSHaVIn&Qm27&&3dx`~}TIxM83OnK90nV?N-iEK3I6dqw
-73L}=6~b*X@frG=(++#j>6NN7f7e6409Okr4g5L%RBUT-j8#p?YbbZjqo5!jk}z1l|t&G{CLuUQWW%3
-Tk#b*#m64P{y;V=-S+aQi~JA2lAty~BiNoXm0pEDNR=I0dQTo+^#(Pf5duUfilEY0pJl!P1qd$vj-ZK
-=C=_6+nmx(LM2XSuLL})X0UrAJ<h2@Z-k$#gC)G?+*V@RN?D5#B^&<FldMZ`sb?qk9W-8*;l7M3c9<f
-;BB}bhzG0oZ1eKJS`6##g9`~+vue?2Eob{6LQRu$Qlw+LG+~aX=^fC-5-8SNeU963QvOZ5<$-zfLr1K
-oad`!LVzfz%D@jpNarT#5#v;RJSB(fsZm2}q1<WJ0E{~XP-m|#B$l<Qjka-~{AP%(%-Ye?{?$c;DiOP
-1oH=H!wQ+dfqf)rgw%hDM#ecqfan0WKNzJtzobzI-PbF)tdX8J8KlZuf-iQtvmYXc1gZ!cbMKb0#bQ%
-pD;fwVD6Y?qYEvPf&SoV9NPBU$L^uw0$KUn5atCIE4C5cd)o8mEJlH)t-=GIBxb5@X!dQ_aWh7zS}rC
-K&0aJ1#oEP9K;~3EdC>&#&3X2fbgj4juGa2TKe<^3wScBh7mRof;;chf>u61-j@CdzADdblMIArQ|iD
-Q<!l=g2YXN36;0-DjANG#O%4n`~oneq{@>cd52vpI;QcPEbrO;Hqt8pQjU?K9}+JO-m1YL--;gs&_Y}
-Q8!;)VgNe?M&Z6PYlSfY?nARO0Xo?fa@NeiKou1ZM7__=?d2^6&rZH01Xq&b6b>HkE*L1z_$zLr?(x}
-BVV2i)FpM(QwptVVkt1%;RDYtiEH22J5x;KsPmHYQfjG%Zgl3>q$$Frq3(3jO%x3RX0O|?>Wpi5~NR@
-Qt;$djne5ZEs#t;oOwGv_Q0iKIBt-V3<UnG%qo#xQlxBKF+4Kr^O@+pu;JBh*n~@pNJJ^deX@`><s8j
-p=iRr6xy@dPxHK0sUfWngTAGCFPO;6=@2;Wj%IA-Cl#G6WdFN4o|Zx7@S)<%b*m(a8SP4r8t*+{D8u{
-V5;5+3fy*NUUT62&>R(4^@LKV{{wx1&{u?s5m}zavnkGsc#1jDR8f@aB47d2x#avt=;NfqV=f#v%x^3
-fy7JQinT!J{`4S_Ykrj;&8h_Z2hJ)RQNStEEQEVAk8Ez6~eYw>ErkHV3vtnW6ihp;PxTq@Fc3{Keix9
--r96+A8n5@a(z$y3+(JC;0Y@rw!4p+^`YOM@MlXh0L#8MEno5X>3NjXMi*n-8>jlqnzN_$4EF}LxlNs
-eVA=JsSyp_SUzoIpDQ^539L-K4qVC)Hk>$bvDb0xHO(mq&-kFV6jCqNun5EqZO9MSD7J5W!VQw!5FT<
-Fd{Gh1zf2m}R&=D#tfZ$E)MyuQK!eZ?o%&4q=!Lf+9Z9R0qn4W`+3{I;~ekHwmIvOYGzQ&rlp?vYo-u
-UL&?0UaSB+!!C}TeG#zk1KDa!+{h>Gk3eo`9prX=<U~faG4v!HYc%n`3;9KLh8#kxwK&~$;o@%Q_qDn
-<T&rutVAt$}0U?cs<BRrFi&chd+QZx%vv_&OH@&&G={wq_J$OM&q|0MFs|k&}d2|`<i})ngavn=;K0D
-jQeLG873j&ERo==v%k)jySsM;ri0T5QOI^UPLwma4RA9>mJq~}z|I2fVdYafg_O+Jt|#YjNk!{N$T9(
-}Z!P^}d!mvO`Ew#BZBB9ObZxNbkpHcVRzBkOql&<zAuAThKx1xv>Wwn_;#Rz26>C+S)%qK=;iH=zt|D
-7M-vreSF_jD}x_j{?w&kt(zvN;LJ#bcYvCy1%CjF&CDWy|8(9hfTBl?Grm}IDJ$Yf56^-;cF#d9KP_u
--90}J=yrIw)9>^?t{MV<@?mdp_hVn$`!K{`Z9_3^A@ns45!M-#VH2^7A&6sF21d%g+qkaHo#FQD8<8@
-K<Y?cIhHgnw-uQ=`@02bPaQd9+2UX#IwCe@L;Is$A+rmk>Il$3fjt)3t$U0rAht6C^T;E+jcQS2%6SX
-;8E|Z!?WUH<;()Opu-HBP`ntj<neo-W!(|l=NGP43}xaRK$>ioJJMTTC5qL;}FDU_l|6{V5QxDGJHh8
-{;5YKF}bC|ALjTkS{~41fIwFk9mv--u|QO-g4#M}7PH+2L7Z1^hIgn&C&Ojvg$n-E{*auW?`RFwAVok
-6Po5G0k@vj(yF_^yqX;+Ed_I3*Cf4)~Q0%X#%ZYPqk+Fp0bZt4>Wp=LXQHg`USzosFzT7uEHIu<qJ!d
-EtcVR>CLYQbUaF89yc$zxfdnvOOlLBNPiB1U8AGM@YM%e{fI8MIJ}M0`Yspf1BKUls0f<T>&xY+<f#~
-?l_m2hgV{i}@buv$(DQzz>~?p)6i=<LybbRhfwM1-m8nsM4B%Jy4M$ZyAgm0uL{V1C;o0G<x1bcVUSL
-!wLr6<~(Kd`4=q<gf!8*9CQL((eUZ>*uFRz`7^X$_)6^~DTb}CM;)<X69PcEwC`C2VLJ9b;VO#Rr+p_
-(s`UY@$cQ#+e9R91GP`pC<imgMs~bkLQ~_7(DdjZ2-UTdV>bb#9AbQtb;iAdn+CWymm+WoMiL;u0kd^
-q!3imCmB{Qeuync=%&Q@|VwM^qSL*(a9<@vz@4$<<WIHD|-m{Vbn$QF#T5GisTahqogl<h1>v#CIQN;
-Om56MpqSC^dOUoUOgrN2+qezYz$$T$?2}QIkAMKqfDuV&SzaU~48u{nm>7tZpVCDc@%=z_V3EMMvgpm
-@qh>@@)V9*__7yCMh0c@D30@l>x)lM79ptwt_A#^N<4F{EV?>5$XAKmtF`C*8Fz8|qSDMlvVNQD#ck@
-SVh2gIO3Qxfnm~UmO{I1FAom?t-qrp>Z>7NQ>9NF=t1r$5fQwactr#hGph{IIaNm12s)rXNP4z+>Vp?
-Zsg?9=Tr9=WKf2=yslJ?=^o^SXFw9#`<)Dc(A9Dn-c?K$39<qY8+v&IEKp>0>Tq%oV2IYgc{fuNo!RL
-(s&xZ)LvmfLJdBkeV`*a3)Q>K)K(+Xh71UJeQc?^uwY6>75ia)~-A;7m+;Dfx>-gO##C#{YbY3G^#-A
-MH0w2dJ38!5=wVTc@B#NDYIvCwCFb+f~`UH8}@$-88o}fL|erc44;W3<r-zN484ay_2a7^1gIZv#and
-Ag4E4OU3M^vny@&d6SQ(el_o0WVV2y;J0K-Y-zuc8o6GU|nUOW&2@TMU1Ll^o5?1kVGN;r*N=DSjL&p
-?7T#~7kY#6?(cCil<eAk30_f4irg_&S7bXTlL&$xvGvYT$VB>J+@vT(v(k@Ht^HaERFp>qX2Z@touz%
-j_(Frx4zQ*Bl46!DFtPx$ffsDcW-0;9)s$+OdOT+-y8G5)b%jO5KfI~dcyQ;hMjEvByz==%+RzZrM_{
-Q*n*Vf$n_JpI{db{`??nE!b>Ky_(Av{81QK#A(3V+CYDI#^QW^&@{&p;m8lybc5U;rAn5U~HGD6GV^a
-RW`~O5|^lN)N>3r^gQ`e)m7~{GX4Rm4!z2mXK8G%;*!)qm4jN6WCX@WT#uEh$Mt+C=NS(eh3N|bvqnR
-KwCJRvk5<STox~&B*ApC%OG=!=p&V70NpP`kg~{B^%Prr`qsyZVBWLQwBi31^Y_^SFSqxq6+5E+<uXe
-k30QH_I-%Jpu0N4)378Q+OCOAusYlr7ZeCAIRqLwk*p&6ox=S9T@l!zgcmDz@AkuaJe(zfQHIr&4oWu
-s*|1uFj2PDH};;i}1DwZIlYarkP9cEtdiqHq1fBW2v7LU+|U?L|vscFB@Qc6AL>#p_Zp<I*`~brPP9F
-zQL&0t306$206J={5rB3NOx&lO*HJ(H0Q<+_b^!-1OPhnOfb%rb@oCqM|aXXZbYIDXs*J5lnRwPp*_(
-oRrP|B*#7`cFMz2UyA^BEt%Fc=NYWLEv^V!RcUaFQt}(R$0RM~n4<#6?e@I$Xm@W7ZJ)34a=K_U5>>?
-*;Ly?YIJs0ouh^N2RYWIwiTbp~ZZf*$CK6@336n^x(YNNnCPTKoYseVU2*6xG>U2e*v>J--5H-yRenp
-4z6TWm|v~M&{`e-u-EFz*GKTC)h#>(=*$B#umC~A6=rtVD5DC*R#AyBPO5!A;zmbsd@#z5dML@{WG2h
-bXGl>ZYuf3{b)_C)Y<ZS!#Za#~(_(of?;XGAzNZa_%1Q{9@cY3ly0Oa9N2d45Ai4l-@jVH#9o*jNIp&
-nbf{S+OO)1a9|+b!t;9I0S_+`;&;QFW;-YpX76%)xPHF)xtWPKw2!v^K^om-2Wv?9VH?xmy4w6Y#SJ`
-%O)nPWm6dpB}IVG1Q3wPe=iYhs5`c6qJ|h#4D575H;a`%ja$yLRQts>u!A}(0O`u7Zw^mJuMaPNl56y
-;`*_I$TA-ClPV*)AGOt4xs3B5btuX1TA!r``Ue(UT?%C916K!-e2WVDLpxGjsp&mpzB2f8>@$}_$oX&
-Az1m2i7E)w;03<2pKE_S0=R3R9%gXU95tzBVffhB}zh5KiR&ri=@a6shy_dngl#jFfjH7qNJp}_aG`i
-@h!kaz(qbb+~6Vp9K#d{Lx0={7-HObT(fmMR)YP(LpA?r%{yEfWH}qM`3H5DW?@2C>*s_O|p74+^l6I
-Z)PT^lLWlHx7i^?^{g}2#?wC>7oUJ@$b7^ZPmw6eYdf`m<eL+hpw*&y<b}^brx?ke}x6=Ml22%C^eO8
-1vKGt6B-7ya{DmcgoeSY?hk`Kj{mx^XEJB<EHNO#HAzdcx>R}x%J`Q<859ShCW0_{WA+?q&hW(ccr?I
-sU^rtGJA<+gkefBTWsJX5f8CBWLs+{TArKui&53O4`pR3Q6)TWpBIiq2z*!LsCwra}sk+1`JHTaJgUe
-?0GDTS&FKE!tdtWwB+};ePhJC;{<{Gp`a4dm+SEp<kvq*DyUp~2n=>oZ9CN2iV-K{Dg6tKYc;q+2l#T
-xZr^`V#(BfkH$LMv<(_vI83aTe2?x$zkLi&tAj=B}23`_c1ysnU~Pix7R6j?$=F(!T0>Sp3v^j;x+K5
-_^Z3Enf@bq;W(BNZiW_vfs<)e16;UeB$@WIoaFq2tj<>uW5yiz{(|Y&-Xu5bz}nRD-c_!u<fJ<K>Zbq
-0SoDDI7ENW5*y_$5rW6bCB;9UpqB_QDyJG*{7qhKF98ho`9H7%!q-=L=3L^!d>VXR$`mvS!+QlKaF90
-aCVYagCoVws&gB2=YbXC-{{xdROUgdn2x*+F&o}C$4O_Efw!a^Z&gq*sf(k=pEJbRy`yS*+6~}|~fO4
-x%yeOng*0=^0L_G#JPOS$ER7YaxIaJZC-W!3HVY-a-jn(w#&(RVj#&QB$V~WZdpE0zk7OFubCq|QE(V
-|3HqKBzZ@ZI&`so?+j=WzA7uQlGm@tgg=?(nG*;xp#&TgTIt#qK<$@HtT0gW5UeM)}u{``w2<z#e>~?
-ezlHZ|t!393Ko`!9OoeyR(uej;NN%69?)TilvDVmj13lBMb;H=lX<5Ywp%=Zm#u!DAL@sx|-D&gVZpR
-C!Xk9l%dJSVTBR}b4>=}4A{|Wz*H(yx6wnCz1I@A+U#n!$QG{evsF*-q8Z_ZfZ#kw)Blma*m%0Ezy9H
-}l&XbefZFtDunbT6`d`g62J0{l7)g)NYsRo19{?EZuz_{-keV<?&;GvqrpUkC)~EfplY%e78cq(s?+&
-28!z)~3uzt0T)weN@u5gY%9=e41>&n&RuW6=KXHmC{Rra#lj1J~=t+yz{Ia<>VgDl?3WU|%z1Rhn^gp
-88$9{nN1L7xD-f=pd}_B)iuKe{yPL;gNp*MNz{24uZ=xJGE1Qk8%InE{2xvTvU;C_Alk*xfVIu+wZhu
-EZEwcCG@;O65Uxlo2OMwwa`=n;fP#OG~oKaQ-=QV=XL>&&JK#zf=2Q8qJx@&p56LNzeY3=w^94a7K0V
-_Bgt4=AXMC?e+raMfGWwQ`S+GFEN<va-q+9bvC|j-<XF{uqbRzPF}6i_IP)Pn6=74V*_uwbYP%}nJtz
-5-`k&CvhlT#PYu&b(AV=!dF|(Ot!HzAbGcgDPAV(>v7ggdr(bhJW#Zn%C;7@#6Wtl<D>)*vamPgSk}i
-_iZV>(G=j4`8e)0SV8Qhd0#R@v6Pbf-CZDs<aa8P+x=S<K5F+nzn37mML&^}8bI4rMud5ja+8T~rP05
-yy4D&L->byB+v8zWJ(R{NZOR1cz)-OqBp^7l7p=c@l~86&~s9*4A{@j{b|4Oa1P@zV0=vJ5a9BmTT{1
-F_vDI6Sd(v~j#^=oHk%oyuKFY@QNvrc{?IT90bNo|=|;$0JHZ)9r=Ho)78w@cAabxk;iMOh<q=>M@3k
-t1<VN1=WUaO+K5Z{||*IVownA1aj<iq0eSiB6VZ8Zm#lqpmXL85oyPoB#JEb?NbCVQqF=2({n_#VXu$
-S#872MkVByvMAHk;k96mQa%<3{ucmG3s|o6()nh5?yS78ej9;d#?rf9F3p>Ds#4B8%;|UAO>qq9WNX6
-R4xyxtdc{#Ym<gpkJ2^k21;#iZ53WT&l^h>@(zGiccX?l5U<#iDRw@SmAQ@I`80tCDwlU95%Z|&aGDL
-MG?-41aC|4qhcD=HVsB)v@e5|DCYuoMx8q4AOC9hV>O>{dXXcj)kK$mxQY1pAN#q*l60?NyE!ah)8k>
-&W~e$6o{fvt>Hhq2Z{kjJs?WO+AL1@dQQksm@_Si67`<NX5GXjG|e<3<!BJF7x@a;;52bRhAG1F`4sR
-&`YbkGJj$AuU>MdTK#HTeC`|Xl&dirw5J8M)0LMsv#d+Yw}H%17iyQuq90keasA@+a2A%6{HD*6S3_7
-EqpW$sU8r@U2-7*-3;Vg*QEG|Rh}WAGG%<S%8z=USR&0S^=lH#E=kS0rs1PfoqQpikZ?ExISs9gAF-P
-eK?IE9kHZ}8Ab{E43J%^p7Ll|^=`oPt7hYs1w<EkK!Pt^fOg1}GsaK@?{s2T7eHfs>CQ_3_+j#+Mcpc
-&!6&2#0lx~7<K3<}yES#I<=u<&YdJ~}!-JABo};%?Z1jE`Qr1`K%CH(^eb&%wxuo_{$xUf1<9iiD4L6
-MW%kMy%UcTb6jyVsW)7{<3er`apj^1_L2cbU;piNe%OzB5|$_R1l`bR<!@yD<FqW=7n4HW6X$;-x>tN
-daHE5WZz$QVMBj>*zxF!WGKfg#%sMvvxmFl!xqnP;@dLX@ykjVB(a+J8XLm)KkNhs6hD5)Y93`!wn=6
-$j?O}4=HzJ$*Tp-!EtRe7#C~m<sFup+g=_UOrVy4Ok_kTX7OvUI^Pk$fXWp^)>pnYfL(sft&2<~{sgP
-0L;Gi#C_5+ly8}<Z@1q#apq(N^Z7}&d!_gYSCu`k{`P8?}40eIjQnz@B$Mj_PF<N~=6t}|W&L<Rk?p;
-+N;{qb`u?)d$ZJd`Fo#Yg@=$WvyetX1y}qEcVYt}SjH>rVIxSdFGijCM0caei?FquDivx(7?w<~3~9R
-648=8SfmM_{@sM9q>^}Euj|TGb?5WKC`dJ$D8}m9ezJvj<wsXFo)*7Hh#eY4Vyb<WZVQcKwr(>u<*7&
-x3Xm6#LD=!xpI@GfPy1QjFhAp=Vh{wW+69#7N#~sZ&p0_&M(!?e$MrMi_J~*WyNM60Yf)N$<o}Xy~R~
-XIjF8Bva>Y3z{bS#!@JA{M-<4S-{xhsJ>S|!i=L&)Evv<niY|(Lx|}o}s@V1g{Wze(dJ`_a3Q$qOfw<
-UJqH8j$9$u!N?r%j~fkY5gt#hyZ>%EfVX4~to#t7G1b0k=gC}wVTTpBHS)P|`6$Mfi!l{r#JfPl>|40
-pH(oqN;%y=kXG+HyZem(?ohd!*fKLp?0q*qD*c%;dgnOv!Zn-p(%n6X8F5`k&^$-J=lpgLysyjU2vpE
-ymvau=nJn(ej4hthN6=h*1Bs=Z2DK@_o`yr`H6mjZ!Ue7%ZlJUblbj^u4WRT}r}`GVS0+PF}wau4e=*
-0=d;NBe@o&B0*a*2-*A0KFCvjYS@>mqzIUo4yIGje&n2@sK?hFIwj6-b#_SC#MIT<im^#d<PPIL&hfk
-mdka`qlR?<dV}e=B<kN2FfzOLNNh_zIAh}<U6NvxgTNR@~5^P8mf%tQtQnm|=i<e17zURMb5HwW8^I?
-!=z-b?dYY#}eAyZzV)29hc_9vVxHs!^WD;<1Y4D|vLwuaw${v6o$789e(!U9d!zOgVaW=qPGSx2j4qv
-+%ca~oNh*;V_jBk4*feCsD50+TJl1f<ZfQ;U7AHSUh)Btr~8WE{vo#r9$os9@M^k`w2Eo47z{ZTqB6J
-sjYdZf9Al%au4&^@yigS%JFK5Z(L*ruv?cn(&U{_1y!&8qcO^3KC>}JnQcE=@1&}XixQhD$c3Cc?Cc2
-iKk>cL}e<!PR98Z7CWsVRPn_YZ%*aFPqw4x$+{#S4jZt)Usnkn>-l{`<Q6Sma=TN58OjNtm5Haxwyp@
-a)p%!E_brBO6K?A<n1x>5%eNT@(9GF7Te}yp?k*-5!Uc^ojUsM;vAT9Xq}RqJP<NV3hHurb>S)W9ekG
-Z*dl6^Ti3>9~qnXmz<2cr?O`+%<ACy375R97=IKNlt76K1;JjdHwA4l6(3P;8XP=o_HaON%>P{0EX??
-qC^o^pV?4mQ!iHq7R_YJL7APgS=sLF%#|3w_g@R+(4hr^OI0f$$$|NP_Vmydf~fAblTP3sY?;XiCI!7
-Wr>d)t7gi*hD6BBDGld4GzD}E<-99Q_5Q{iyTd~2p>6FQ?ZtuvuC-)YA_l*H_B-iy-TwxUQ<=}eo(_}
-+*#~UR?GUj3E8XMC@@>am}5nu@Drs)k#hbnNlB$8F6{H2ckr5v;Dv9#^=(fresm0JHvQz7l+uVU(zgS
-dsGm;o|5dlfn{J95yyZwTdvBGRnQ+#*zKTthdQ7zaY!5pug=#-O6H}X}*7nk|RlSA?)!*W!Q+p=aPC7
-1xP`uH=Xg9?k)kT{^IOye12~a0hJfG`O)z#I0X8?+o)D5tJL#|}SKXIi}9UM@Cm)zvVC+DPEYc~@2ri
-${L3}b)OX?Qx340WkoJzQWYGI9_toz&=4Q#H8+hKQ%HCCK^M8SBU!ieA#0PgS>W$^E$+5%`Kh*tmBb_
-KbYM;yGU^7r)q;Gs!4F3KP~>cu1HXp>Xi#s?e@5A&H<4c4HrKI>sp}=GmuOH&Ohc?9bz3;>eczsEjX@
-hWKJe>6LLrTDe+7VP(?a$-mpNBTsKeFLF8Tt43&4Elp(l=*NQIKd5L;b4hWvEXV@{wt&oEc0w4nfWqk
-@HTZo_9%c=s#Rtz4bOr;Kk4lg^FroP$U@1&~wLg!q$J029_o8@Ui*si2f`Qw)G0zjceqCTGy|(mvs_(
-32VQd`QG0NEV0WWYU3>O2EZ+Li2%hVcI$k@g33XrYGS>T6)fJ5P>X)s$=cyeX1`G&$OlnqaJTPzu+q8
-XvAevF0<_jJ8`71UOv5wby-VRLWdb8unbyucM3@0jH28|F11S57Z$GVz*sT7oN!SLE}woQum&bfjFM%
-p<(CRA^&-juP*+E(=O;XTpOQiyRpKc%EohT-(iR^A5!=adfhflNIj+x8Yqtu;(pf5Rv<};ds^M<zs@Q
-l_b{(NM6NlV42M^SIBRA*z1FgHKe@4G1H_a+B@QGl62L?mX+)0@9WXxL&|^JJUQyBT-Hv3mMl~l9JaQ
-`#Viqb-S|^NC(gYFRWM+{RWC<aaU{T6S%$Lcw%wu7-poi$Bk8za->dl18Yd(5`qAIKs~Csb=d{Q(G*C
-6Miy*5Ah>kv+2(t(@V-55QXfzVkL)64c26)YuZjbyC%t@>c-5PA)z_aI%TsxCpm%*+(YIkL-hGr~_>5
-lx9{A`K+DZb?JF^k`=U}>mGtJ-9_E|M7qYQk!LJ0U1O+UBbZte;a%B$h=3koY(uuB(}_Y6v>Wl4*v<x
-}e(eiuPb*NLt66ng(c`qdkKRnkH&yxeL*e{eHyLZ4QKvYJm!BZ>2l87&YIm*`tcxUOy6tnZ*2F;tz^V
-!6)%f9FG45EPItL&h#c1<uuW9gKs^sjB9IWvD-9nTp(4DQ$!g_s0S62x*`J&@BL1Flc)!OSO;WFvQMW
-2r<nE(+9m~wnGn>D4x;j!{6Ci<1I#c@FNjKULHAVD3ELztCBz#Z2GGe53ey2-h8h}2T|l!(JFw;^+oo
-kb#x=H$q^o0_+0a5Ei+oK@vZqp6xkkbXi!~}1A_h})thr5Ig9kN$Evr5f1WJv}LF{({JPj&v+4Nw9nf
-Xi!Lo1MNYsxZFWjR}^;<C&qDN(7;yD4nmJeQqZp{GpWfj6Fi!l!&d+czEH)Cm?&N8H>~&t;Ax`#W-uW
-3%NRyIN_p*dMUsD(-@Y%V=?RTc(qE?(Qp`@L_7S7Zz>JRKS7j7WkN>)>y7)>{&fV_k1b>ti4Jz)*IBh
-qq;a?GWt!|?H)U!?6|cfd5KbOjIkQ6lPKv3+e=liLJ6oE%Zi^o6ehV7+6f+x(dEMh8W}<=H@$*4r6C!
-^PwaEIZp^yeR99&T8m|j@@wEge)1pJ{3B`T{gs~vqn?shfK7&!oDGURhP0Zw+_9;Oe3~U;9uJ!n|Ey;
-o4x&340xI!_Zc*;bpXS)g2wp^^e&9dDUx@(_ig=TNf^D7y<JHet%N6nbQ%ez2Z&$FvWHu-!f@OPMUt$
-D5we{I=CHz2~wsy2eu(?0Vi6=@b7fZ|xdLhTC_+vwQfmld*oHNn*79mAT}jXyi~Zf&HYO-H17x<Go%c
-dmFF`kcm6-`yX3oM%K?$S86kR}v`Vpd`GTZWJq6Izlb%BI&iH-;8py4=azMc%D|bM&=#0P#gDUdmnxc
-#mN|@Oi*j?tDX^rZ!sBmc)h<Gf(rhmt8~|LaRYNi+fXojHr;&l2GZx}pM)c6iGwWgUuhbloZ}#P{e?0
-CWclFm@cq&GMU$d$4S4AEdc}y}MTjZ$WiiorW!#`L{FY-Hs#R#@nsvnn%NxQRJj|>Ty6zoFD(5&@;GH
-!ID?rERY39@ox{sr#PDnRJTsKcxxsz&Cxt%sX*j6`uENf!aTB0go=>e5?y*HL~h@uU}$iIR-M76pIT}
-{c9I%{8~fKOblCaCr0gGPTQZk+HGhbDO6<XzmcOzoC>ZMrveq(x_G>8sZ3j~%8sTW@K37a=}jZTG?hF
-&ibZtg#ET9%~vFF&@IDoCRt}u<<QkJ*blFj?-zCsd4>2*GcAbQLh2m=XA0*kCAQM8H_BSc1SAn-!Yo*
-NQHV%dJiytMyOmh2>6i`Rr7!~Ec^yUK&tz%eSLN8<+J0TTjt6u{`{x28WEcLjAa(hDJhnXPv}a;s3p(
-Vdja;8lR$a5Iqxb@>>eME_%kgRP{f7;QU*IEna;sot)9-)Yw-{2Q6vf2;!*Ip76Jo?s`M~@XLahji(7
-^T&U6_fwt)12_cECdL;(~Esol-_ZW8F$bl2GnExS?xMTM9zO6%#V{q>t9(I!LEd6LvJoo^rld>jopbo
-A8V!AE|629{=(cA0tAX-U9#(_*e#<77&Gf^3ncFB$WZ&db^2_|Y(PSU+^SAFxi`>0GTw-Z|?t--gH3K
-*_D%!fTq{4gQ>|X{72^7Yjpde3_|)9ui%ExehG(bgFGL=1#^6<eEI~T)AF}jaV7D%y83ssGD}M#m&^e
-!U&L(WjdAHjX*Q<pi9o`J1!%7m#FADq?YA5Mdq32AZHI&Pv*?L-wD)E-|r;K`mlS)8=f<Rz|4ETjR-8
-w3$G>u%dbOVX&|s%2LXRU`%^L}(g<BE#Sij7ZG6z1?y?`v?!xgXE(S0NwY`B}*U8J><oZh>n6=ULIxV
-lSSmGzNnCg)66LIfH+P7DairKd2>LF3wa!~yGg=Egw7GbjG9v_D0o`&z*k(Nv$?oS^^Gom$)A{&tIFp
-9q4=Qj+aD>ZKsI_^*wcFG)YWMNdb9ZZj^eLd3{WxB2TH8zlS$JZX7&Yxt7!^xv;daa?wu!Ih+7YHwQ;
-oN*fTb$YHi#q+UIMN$oa8)uRIWv>vIktm%5&U#q*mYd2V%yLnW}P~lV56z!x;6so(pCWvR3L$&oa<fN
-exdQS9#JQSpyf;6oGGu;ZUI)4O^FBFVkO)yYhW<(-wJ<8Gxh2!2P3@PwDaZOd*!8LN778%a^2N_^0j+
->sBkdbh>BXAQ8b(Xv-(E;n=6b}c2Z9sQ=g_(iGkrd#Ox8R86dy9)edLabb=EbZC{9O@D7vpM|S-j?*a
-Vx5}5qz_SXT+xh?~imlb(+S7q&NI`wSGUm1%0@yDP19H&(UjOr?x<I%Ws*fKmHLg8ig#w)k-GxRT>V}
-d>Mx3xDe$|Z&O->nq3XaVC}@M!KG=T(JHZRr27uoR9XYxL#X8oM$rOE#=hn9K^ZCxU#k02R4v@`^aj%
-4H#*K;aa^JQsC+`*w#FAJg1Oj?s!_I;xZjc9(CWV94Wu)U*y=)y>Pd4||Hr@B-5pO=NDydzlX#niGx?
-OVxLn?VBrgEJnHBFcl9u*O#HWwHp6XQ^Wi^a6=)i;MmZN%3drDF0yad2=D@t2n=sNqIe268xp`sSSa%
-4>`G!-S7~7<gC?bKp68#mMCE#hsp$(+Xrs_z%LkHg+3B-EOktN~JBM#0@1ZeZnN1vUa|yrU1a!qB*sv
-i^mKEOWL7}p*!ZcQ#d$l0pd8_oUYtk*5a*=0KI`I`?Qt&GxpA&<Z2>lqRhmM}9Aa3;B>k%C=k4EqfNn
-<p!1XFcP>nDdd6FK;qtemFDXc1N&=S79p*-u-8Gqg6}@MSw#`dn2mjpO-dtq#P>_=qPMI<lb^T-6fcS
-HzfawNql&0lJeb{LWt%w)MykpVw^0#4Ip>?ZCf{W=4jFT-Oo2Lr#Y0HFj#X8fnDY1$&%K;w2sCYjeAE
-XBq(g11}%O^-+KwFwzbW+1T^7`ebeU__0&28{4vF&ZkY8V3@lyc_LaQt~IXJA<Z@BZb)<Aa@@pGM`;C
-Icobl&Z`g+%2NBDld!Xl)8Cv=(o_I*bLqJ_qB5OUgl=wBEGOKFll0;>JSD_>#x-MsS58mM|V<<dc&Sn
-&|mSdXL0oIbDXh{`=H!FVFS8-7Rh>acxPl84{Fu;Bd)5LNFYc4dvcHA_l%k_0tf$=4+1VlgLOmv?yDN
-P@9%1)ATJo#jR)?xP=!-2Rt3_=U@AdB<~iHh|<9iTOuuKAJ)1_d>Nr533JCB^%3XtI&RJG%Id!Kk+L%
-Wb{jCF2HOT;Sx>-eKCGmqdLtvXX9ZZ0MgvbxiRxx<DdFYAHOo(?vV?LIqlPFc{c;xm>~ksE{@~tE?==
-%$#PnE;t*zx@#h)BsyPjS(D0UA#tANoBf)kRUJWd1yeYy*YQe*&_K*6BDKNRMjvS8T5cfLq6Z6Dq77M
-OLebR2ssnBT<o>M%BG64nu0r9sX{TRkQqNyTo5SJG&ZFJ$(aQwm8x-Vdmll)dHQ$LS<xtzGenqM#>oc
-ZmQoGwl(`CVTLq!lVL!xua8@h<id!L$ZWL}_%0ryF+V;HYwerxG1dZEZ%huN`j)uOUt>DBP2Y*=zmTW
-V>!Wz}tpd~u}u+`@v^G{;fHN(HM4I(Vvdgl}3;7{kaJ>%@va5wZgi>F#SfXBYhF%`MPt7VQqcY-|KA1
-;B@rFXDlsTq(<jqPULIa-{5!M(mw>6;aeTrEZbt&GEJ9x=S5p3#ju(PZUM4lOxqD;Kq1?j-n$<KaCr^
-YOPq4L|0c;Od~T_mdlEb$aEXV^Z<=JlVdi#v7y}rrJW7=E{l3V&;DOfO9KQH0000808trnOro2aoUZ`
-@01N{F03ZMW0B~t=FJE?LZe(wAFKBdaY&C3YVlQ7`X>MtBUtcb8d1aDMYuqpp#qatQgL+B8HOXNwfgD
-n3n?nmdEbO5KA=zVFWGor|S!es{JF>mI3Gv0&_|3eZo+PCd&->rMVA3I4*8^D-bU1<05nJ#M(tvPye%
-c>?f-K6N6mi1FcDB*UdRN1q6{Q^m*a$5~+dJ+}9t=X`$BA`@5N4YOz&9Hc8?COL&#nc#y3CeZ&}BVNg
-d@5XVMd~_Eq1m{#1MRdfQ>&QBc?$o!H%Ruk97KEHTo8VD?qQwPdv(i34UhISPSv}O&1%;QTO;D1e^Mh
-U`QkFI0VtbBlrp3jT}#^^-V57b@?rCMGA=g|17ST?ca2_LUNv>3w{Kpx}0)ArC=MaP4tu#s&!pKYmYW
-^gcW3G8>Urc69!Fjo3YsK&e^V0N^XCaO0}lGy?zAU7sRcz5Sq-1@@~(qJ*GXEzpdqW!dcVnXWe0`ZZh
-_>n(V(T$fY8LQksZ2`UrpJl}}b67qrXAnXwc;!pKU%^^qS4iuz(EUxfI=N6+Uz=(t@not6t!PMPqCR5
-2XF;AeiPJk`@_%_uI7jLY|@1iv85`})q@-%0TwP)h>@6aWAK2mnzTaZJ^C4&o&g002Qj001EX003}la
-4%nWWo~3|axZ9fZEQ7cX<{#5X=q_|Wq56DE^vA6TWxdXwvqm>U%|}A<r%M}C5NxjWiR1tRjO<!=a-5r
-lB@$sa5bCJjKZOIb!Yp(AMi8*%$u}pJC}Tks<sDcG#cFx8bFiacK!O!xw+{chKF9<+&GK7`*lA!yxy#
-r4}-X&`l-_{-YqtZ_3G4lSS^}$D{hvHLG*mNIXM~o^g@^3^M18hy^&3wQh(m8SDS&ahK*KV@PU86-fa
-Ftf+r_6--!H{_s(l)GMSuQzIb%qz&levVS4TS=ztRuC$^m21*eD%r%1r56o>RwBd5|bo{L_d?-`CC5T
-`U88r=&Lt;Y*eaAGTyke=K(oV)<1at)^<%~fdhRM0c`Vl6Wdp=X{ZhLdIB<gied{3IH?`w86flhicjV
-=q4`(Ucm${L}|0FZJktfw6o-45d^Ta$P9LLg{Kf<s7{#U+W26;1jsH9xHG$dJq_#gOFrGD-)7T;u$>*
-_5^ugWb&9eiREO(v3kghpv;V(k~9NnlA(DIDyBK14|~E;`yPgD>>g5Rg^3BIkcJ3L6Kr8coNBH)(Hy-
-ZKh<VL6gE*{dPOmDGBe##mJ-JVQbb`K*=dSs^r-MhQ==l(!exl2(wNFzaG1|VVdfX39u@)w7MYM>2?-
-~;<y7D>6SRyWY*=c7pQW&wWv(6~n`_}Lq9%hgD{^p(!gMcah|-!tV6w_^Qt~2oQ_DfG)N{3-)PrH^+{
-8vYhheF2j8FYJaeT`m&A!<aQa>S%u{jMHI25ZWmAWY=g>hiI6NYJ$Y2l>M!USf@tX~9XYQani%rvt$X
-Ea1+ZO&+jOwVbW6=OlIO6bW5vCOW)j1bE_qd6nQGK*M7h-JP(H6z3_i&*AI#L=T?zIHGRF}Yc2CN~Rd
-P#a?z;gcn)<zRVcHpVhWgEF%*W{eR>?`#>%jqupr>@6AXY*}h1B})_H*g;e3m6<&u%VOe~dCv*M92lM
-u2fcEOVeY}y++vs$hPg#7rx?qD80m=+;kkt+Cs=a3^m2kFx3J^{OKzhjr)bG-Y~&OhxrvRu(6O4AG-z
-oy*n%7^Y>*V>U|}6B$ic!oSdfE-b*CVA3hPcuM?g6*M>9%apBE)XROy@Zq72Zz49r}V33X5Ax_c6srk
-I)%(<Be66BKkDmJA1L$;`f5Qv8%QNXnFkNcApSrs1e3jg3r7GMVjF5XbnH8NX<qmY56Z$&5X;hnMyst
-H|Xlh%E;eR*^>4lY88m`pGpco?8&78V@N?W-DWp=c>`=k49A%L*m3nm>J=Wn)JNOVhN5n*TQ}dFJz${
-If1JSxi09Y(3lYh&=ZDQk3L3asX|la>88lng-{n_T`;Cb1@$V8Uom+a`&v(|yEAQ1n&?8N^`zurS{Xf
-9@A4<nda_gtXE~a3gGQN+g-U}^X}?Njj9$rfka#6cTxqfk*$bS?GgDc4332pR=~Z)*39L*&GC^TDA<2
-Y#PAdg36*8KyDlCjJ0Iy=(J)!PdU^qCS<xj2^W~H_#2hLS)g>w=%xt3Q^KvsosIV4kL#;=lOO53X<&6
-U+$QLkz=WA4qzoK}|98k9eoX&N`QIpx^$M<-oAJs0>c(>uTKro^fA&hOK@@V&XVC(SWCMJ%@h^?-4*X
-vO+X&+l&+4Lx&6p@62DRp}VnzI@iuqt0oJIivo~`mSE6XBYL<!W;Q0wDsuX(*uTYH#?tpPv7pIL4pG;
-*vdE=<)EqAyF)tULVH|=^k5KXg-&6!N;l=yT?e!*1tu#+uPD?_QLJ~g2y-ca%<&Kv1#$E$lBp&oqovu
-}qB15<VmXx5mO2n+RtkHVtM^Lg>*JjHIDuH8lPwnLZIsb70}IVqESggaYt9lzCkIRPw$8F#7fM~wurS
-(}S#A;qMh_UwK436<z+kyXl@<DUVD#j}N<CKU&dHtB9|ujx-BT9ypeb$rX<!}|(jX>|%>rpsQnT`9hD
-p6*n>&)Hsqr*bo>KP=7^ddrkVP6Iw@EGemF8xMj3y;BlaiT9$!Jotz-EDDa~9a#k!;R_t>lj~#n2pbS
-we|jV)c-zS#HqCa_W^EG_stsQZoganSz{b&fTqKi_)gR%xNA(#IY$FJ+9{#-aMqVDKslCCsXspgjP<b
-=JpiN$<*9NOHQWd7S+5U&4qcuC|t^@tjz`4Tv&JuvbnG}7i4om@TyW6>(t6KsTJitzDaXSnx-<a`HH8
-ru8f5322#=nQf6komw7^oi*bj}E&0PnGb*1>Us;HCf$2i23p)5Kdg84TGdooh5y#|M6+QM>Y}{#ODK<
-@%B&8<Cs*Dt7u@=t8)L~B9lKjz!id%YS$4+U-uE+~{Vz6;nXDRmZcJXF0Y`<~x>1~pIDvW5`jv~vU=h
-n!+RbUZ4|3+rNWF>J*lZd7ylSY<9GO3lxNG7v-GTLP`E0dE<ZuR7(C$};M$rM&kN$;1+&_)5hUMLI0q
-0B`7jOUwp9K@<Mr<#H#8|QvrxVqpu<147KDH`)f8H~|b$RmA}BK5}1_;i-~dh3!iQqY-R8cvndnO>4T
-OEHXRtQ44>zg;g@(@Xu<@YLBl&aY=DCoi18EQZ_l!{7|J;$+3|#9mKQr(SEy5IB|Wi6m!=+(>eGxSyU
-lhkqI)Iieb(TJ)RYiE*S_Wmm6Xa`xg}4syR(ifKQ2@i@J_YJW`6s_P$u)8MDsWHw5E#aC~{zWCMUL5H
-&g&egS4B12qsP9qh4J@nF@Z`PkLHp5ggHnR)3)aX$*a+u4-AnwjLQucm2bGmi!D2B6GL2PrrxnC}ZDg
-2vVqkI2Ob))jWJgL1f$aU+7Rr>`Wnp@eY;>(TLYU-trZ^Yxh>OAeoS=|C*cCj-9ccU8WbdKs&4L;iuT
-Xdu3V&kmVgY)HjB`yx8vVV8Z@9*VQPA_l8<2UO+t_ISz;}R5|zv<Tx_nYbLdUl{j4z?7lY5(r>%)6dB
-uU|Xf;aD`Dl2F!D;WKA`Ah!e7H~oV+kf?jX|7N&yaOI%wwmUT6Y(zi6KJrXicd{e0g~GaTNes5l>`br
-L{T*K}Xw@N>`gdcq7#{kSlp2HXP_h{dTY;ylQtM{j52CdKN25u#Sf56Jl)$A#@IPNu(LIdHg)F)#y}y
-;~N7jD_81~Fje{UTH${`+F^m4H^>ss4O*=<jw!&j|iJ1LQCX`1spJ>$ycm;2FSn_eGu_O5qC-#Rb1En
-TSU+x=;fd!TUI_3Be~GsBn5|8X`C_qcs&^scsXc)fln)F$a<U;Np*n4aA6$D8qnN7}KFD`8T}Ke;J-k
-={`57MqRSO=x}Z1G$5JXFZYr|3=Ql#Swfj-P3J3C3@y~*IRLLYC=J*9_~cX2VrOBLM^wWdUbe6tWS3_
-_4Y>Dwsf2YY3&vmNA>S_!8lu;u8*$`xh#fn)?Z=kk{k1L2tL0Gq}5~CtMxp3yB}5BTCr*Py`WL$ko|P
-*I-A*`7IIVm`TeEe^6Ye89^LGu(xV+cGw=w{<noiv^~Cu^<{NZ)s;z|pGrO`Z+{oie14SJdwqZL;cZS
-{I{2Tji?nSfU%iJ!5*UpqufbSLgts<W(@=}rCEAoRPKTVG20rWSyR3g`k{HVxOks0L`Hk8#Qs>wXC!N
-N|qs(lfK^IqI9c|!p&wOw6FsG(<evJC@Ct938)o_m@4;O<o|Z7lMW)q3^a-SSJBsK}*Gu<T|QpI%<cE
-br{})y3H#uC6Z6uCBiS@2jgH&aNKoNd8Myp}Tr)<EzImzIt#ye}0A^AGAXya6y@(ai?e#prL6L?L1UE
-bm=0hDB-z$=1@O@>NDpIm6|KsV3>J>mX<1=s`vpE_#rA0TKpsgtwCEw`CL(S_uCjkEdzy63!xUx!c(+
-^#ewUBs^%a>IYc>`gF;h~sD42cqS8d5j4B+or3%DEgNlF}@;(5RLB~}k^wlt72-RVjfKp3@78*2UsKB
-of7=^V^v;n{IL19vefkRQFB2ejkRf*<GIP%dF`Kl!fsRejO5eAMTRBFslR5MVppgC#-MFsdmKnSBm<P
-igi%vDm%Czh{ZX90v6fMsDw6@>+h06&Y=M6%dLC4pE1HAzb><uYRkD8>{Pj4Lx(?SaA<RzpioBi9(YR
-`4^zhhfSXO&P<Kv4$*b(b6VVLC+RL3bIc?bBCzot_SK<B>=6dqWW+TW^zxN$>+*U?xTwjSw9Aal^pnR
-Us=fm(ilXbj4B)yR&oRhM_}?0OOOLN9>YHl;5dNeNdpRl02l{g9Dwl}GK3TdQXJrLpu!0ij&;HXxdRA
-zhbgKt(=~jr-IiEtsG5AQ;d>3=YxrLK0J8Q&P)-#!a2-$!+^)&(8gAF*b{(Qmm{0|MLJUT`Kn)CP3Z6
-Q_XuzOOYGNtCYK8`eg;=u$6uKCiId#W6t9eM37?iYdh}E!?fU6N)b%SZE8(7i6Wx}sURMiw!wLpdNYk
-*$^{2FXJji=0OfLMb#X$YhSvC#w}D4GeDCWI929}SjqLx3~@q#-~W0MY=E21qnOqCq$`2!w|GY2Z%-M
-;bWNkRuHienb0dgFUoCY&3!fL~JzVTZ`q<!nYQ_weYQlZ!LM%!mF01zJ+rwoNLLsHjF?Ms;IGAa;}AQ
-EjcHEqnN99LA#s4?j~@w2-;5t)`duX(2!UWC<CRASTQ2O_<}(gVInxX^8gh6IP4ODP;m6)7!Vt@s7VL
-5P60SY6N6F%c2m*9xXz0~$BJs{=2Sr#bbbVyfQ}6cye<HXcJ3}#Hg-4<y96gshtsNK=nh9Zj^Vo+vNc
-$kc~5R_iZ&4{4JuuXiaLBfPtB>M0cZlsL0d&VwE`rqLBaCTE%49~pdmm*fQFD7LLW4u3iM*i<d0A^nu
-B84C<290L_$#m+MyD|#2B(MX=E6YQM+2qk}|5mdfre4VzrA(jbYT;Cn@Z1$UA{9g1QKJ(UBJ&Y{D7nw
-ZKa-hzY<ds70Wq^I#fgT~a|6v;@==pe3Ldpw$7HF65vMsDh`9NhpSpI{YMULE&=Oc%W!NZX$mm+Xkq#
-XlWa&phb{ahn^kUJH?tKD&}rW72$%a6*>3jA!tk$2HH@i1?^B#X3ES@q3OFSlq8Kn6R=c{;=4Z42&@1
-V7NVkJSkjs*4QPi7hgesGf`w4^<@mA^U`|-al}=u(N*i;9KqvpMKb<+w3um?dJ3rY<oAG|{`P_LwZ~o
-V%%Q_E^um0b&VKo0s^5Bn5ZUJ%>PzAf<hw|ALHbsJxTMV|B!#1E}4ohh(fcVup>Q1IfD&d*QG=E)kc_
-d$qA*=JnpPeZ}v_8xZe|;+0fQ|{@VUG7tN$5T<A=^o{J}R#|%$Pou9&KklyGf1*8f>RJ(LX!Mfekg;f
-RNbFcqmIj{;`#%{5#F~cbf5`G~<^g6NhO8Qs}(|LZ=D8B0+fJe7(54Uy9xtZt<TUWXAC4hkDWC?&?Uc
-FuDBx>QS2X=oa!{%Fq5cJ^QPB#;(q;KAp~9o}RzDc>VkT_|0c8{_xwIPv{!2S@O-s`QxfvZ^Te7mV@Z
-0>-w!|%sXRxM|dYz!?7Xz$+wqREp7+H)9|Os_~uZ(CcU{?tQNz~&2%G{-I3RuZNI*k3D9cu`MTlAgI?
-qA?m5wP82T?aPs-i*;+-_KSU=QDQSi-ezP?kIf4GN~O@~psT(wWik8o7${;m?DwQpHptE;r92l!e};8
-Oh8!+H>yLK;9~Y+uewl+F(^k#HX}pXfyBZ1*6}-XKq+Bzr#Dc3j0CY+DNUTJ}tM5=KPV6K%)c*hkjdu
--|grhMYII3gsVuvZ33oMc)Vo-lBdO1Vyl;uHuPq?q$c<>dtqzb7%6@9I9(O)$e>W@P635Ukta?$)l3F
-nC#s@>;K_&t_stMv0>vhe5Ed8Yw>2Wa+C@O8YZXv|LJM>0(pFiuZ-QgjgiJqj|Pu4buWmG!|Ez%aytz
-77q4EufB*jcy??&$-@KZ;uKNn6y!r*ss4EL~l^_+^k$#y^2RBUP^@VbCSdY(IQ#HtJf2zwRcDSvH-oE
-$ycs*mlk9u0^!;t`aa*geQhkM}3+1W&4q;wr#`tJd37V-#hvtA8ccINF{iRx;QS~j=hgCPT-q=4E<<d
-3;0QnsjDCr95qZFvSkv1-TQKHCq4kFZwuR-STL`O!AMRNuu+_9sg<9ZZhdNuHmdCpVy7kJP2xjWW1b*
-VR)1(5xTS#kM?s^U3VP2z(<RhyA(w_N81;`G?#;Iz1TnRKa0|UpRk~%d3|u#p+D0F?&V-F_2;3JdT#C
-{)z4b$&Q_GZuD*BVajseEmkdGE~k6?js}RdLETs?<G=gjbLU>E`taspG8T2!sb=(zkjabTnhBlKUFSZ
-oJ6=&`@2Yfbh}l!i``}zshrpIb1;cdm>13w9F>#;8f%@;o$p-qJzpDX0CR(2JN}6%{JW|Tg*|CTrO*U
-@q26=QZ-Ts_SmGy@;y6r1ro4gC#c870-j=wM)KhiR)cc$d-=S7%O@*y<MKnBuhp*v#N;aPR4({N4>0N
-RmJjID{GoJM_A2fK#pk=uE*1a<$dsoh?@+uHu|F#f7_`Xm$|zh1{6-beoBo+=yKPgzHS4jXq46Z1vJe
-zv)vrX1j~EsSr0uAd2=BmL<M6=mTbbozrK+r_%4zUp{(?QVZEq#|qERQr6m6I}ae;P}BTa$!A1O69ow
-Jgl}X$9IB9r_0*BC4O`kcCnd!`-vNVr@jPI-y!ZI^91hpc?4j6430ZaSgX`$TZc&{zFJz*H;hU`ZF>0
-DXm;{{P)h>@6aWAK2mnzTaZDZzZ8cjT000z!001Na003}la4%nWWo~3|axZ9fZEQ7cX<{#5X>M?JbaQ
-laWnpbDaCz-LYjfL3a^LkUW~tf|xhA=i{8m{`S+ATcUR!0$xl73k3j~K0Rv>`ILzMP%|2^G356lY`?O
-j(=$+7Od;$Ws{rl;TC1J28Q$tII|Q#U1_Ojxok^0H>pw93<_<`eOK$Y#lHQYCpdWKEXD`HWA}q~>LmR
-$E(hgi$2Lcyi0LSzeB-<W2#q`CUD!?+ZR;(<F<^d-@U_GG6Alyix<N>$;f4X~Hv@y(!Z)nQm>#XE=Xc
-sc$9sm!P1m_>^bRJ;@eoq2oBusyfPQJ=N)lvmvXBDCWo4Q5nUsuWHDmDo&Djyf(glE(%`8QN_C;edI+
-{R{ZoX=0y$IlKs@<NmC~pVM(r<Kh-6y@9l@Jt-8EF*kbT;dK}%?yn+s#0JFE$dRmrwDZ0z&?9hO<&ED
-tPNS+qEg<ZgcDwfY#yX-k&s;M|jGFD%6R+M~18z{FNbkGC<9@h0c&njN`FX8x?V?r+P_Xs_`0RhAZ2+
-;v?HP|vy`YjO6@d}(ilWzv7Apl5PbM+=$r2GiheZy-68AQf^nKMm$uX{k@y;nT|0(6?)MrkseC|=3(N
-!7q{EuxwOyx!%PW_NdYZ$$rjLH{1nzo*o+cZUByKcg=%;mg^{$?gdMbBbTi&Q9syvoD_!3Vm09iMD;+
-wy)bB>$b<b?TK!CqT8P8wx_!7nQnWg+n(#T=eq5MZhN8IUh1}&y6uf_d!yTqblZ_`JJxN-y6r@_o#?h
-x-FB+m&UD+EYTMgYZS>dKRgbZ4mgT=iaAb4Ip5v-1kiDu&nrFN{w@R?uHv0?=15X%8wlZQ>%?o6zB%3
-8AkCE$Hl+9RNay;yII9nz4wFJR|JjTGEHE<uWD==SDSrArvlg^-}F7sIvbAZT_H06sZl@JtPODPNsVn
-rI&K-|j;c2qOD3xr-Z@ioKE$g%C3#?%s3!0|O(N3@rty(@MIlnW@s-L2~jVzJ5UK6D-6kUg5i9Z(`4l
--PG!Bq{H&o%{f2e?)K|`XFZeJH0Ponv)m1z%%e)IOyKafIY&k7xyV3^<b7%(KO|U*n0#5aJCU_+|d?K
-D}L~Yw**2W%d^RJSxi(n>{H}PCL|6DmEAky?I9C?oZ%n)s%2lb5MK{B*nsFtW1c7|PgKiO)j~|a8MtR
-^%rgb$xoUZ?T3&3vx)*B9O9kbnYI&nt-fX_QBQ@qoK{-|}$ExLI^VOZGF{cX3scJb>EoYmrPKctR`s)
-nU25F;7(PVMmL?{M4l9Gz!rBECv`0xHMec30K@%RmWd9sWDK0Tr@&*;l@@#Xm`(lFQt$59LlA9Z02da
-e4Lf#~ZGw%RWr`Qr2rX8-#?K%d1a$Ov}S%;&u1Gq5puwCv~8UqM<81T*w{J@FU?4uY+yQw5?es@W_jn
-RFf9ayHf7Kx%^3k(4Z7Wm^R0;#xgt2^m!>UxES1XCR|k1j4SW$$+_TvYQHJ9$GE1v}Q@>7EMNgeg#It
-DV9-ok4r)O4+L<UvMI>qG+!~0yC7GS8YlYD&wl!8f1oxZ)-vOu5r8|BdNS!(Je?2ap5%`4gUw^nicCv
-?*bn7y4%y|E{h-LJgw_m?MteXAS16xoXDn-$Q(g{Xt8)+p?Q&|KrnD4e2>=H`?CS60ND&H}VC@nv53F
-e~cdxDvEJ{T{j}BSNvp$U<Y&lQt@q6ulN)FCLhTYnwR-E5RtU<f6Ua4#l<|_$vGL?iyhE>0vSnMCRho
-DtsVr_SI4SYe1Husub4cIF=+}@=GIXVoDv3e%B=e_PjOVs&XwY!G%pUGWMaWBTc!M-51+|Fn(Od?Sr1
-mQ?76L54_o&uo0dz7eWo&5|@PdlQ>J;A^*RP=+vH!e+S#?FCf;MNE+p$50CW)p!!<qA@>>|f%F(SUcn
-jdl-LCRk&=;e(k)b;J%$RvyzaI=eIAk0bCHvRNNT4#EV2XVOhRgnGif4MOe`8=V~(hzswc<jaUeo^pe
-zL;LvF7C~YoZ?hS{V=ia!y4^k~HtduDf(uQcuY&aGF7pRqWt(KAcyRi?HaNar7oVLNXD8{`ScGIu^-1
-O~*jM5ZOlSi(vUYvoun-f7y~sbpsgQCuA$pxXsbMT{XruR$3Hi!`<a3t4kcT$%l}q!$UHS7H$8FI%e#
-%?LB_@<h3$<&uKXBxTb!?+Uv+q`bGBm~Rwokp|Kj>JnC+F;8gTa=|u+v^|j21_~yhZOHx%Mv?zr1^!6
--}*VPu`R<AF`i*x>-f#Lb2{P`)gj_u&4x=X~xd)>uWfRX|rJ4`{-C72#vBkU~!sPydrxi&a+IoiDL-^
-V`T?F{|w`*aX~P~dAayG0mFzBoGpofegb9>#(rY1S7Zd*#(%lEIRD72BF`#5V0o!Gy3O9CRSt#)k8eo
-qMzdLx%>hKpRwW<~jV*Ju9vPZag!4emioRn2HjQvbOJ#Wj$Ma&%a!sw3fDJ4B<3n~9rE)o>JFlZEs_R
-m(rH2^qb&U0wAkSmi1~vy0w#lMvVOV3;$><R+5FNNg=DZ`U-=U@x1cZa`#z3zX#ufU#iR#`nSQYwcC=
-R(tNyXU(tbxLa{oZku3HzkRV1pV(K?|_FRk$HRk{(j8AIl#5u?6pQ1+swL)LKpm;Lm_?L{a1Q0F;B$F
-{A6KoR|4+GUJu8FKNS*Z=u3`tj>ww5b8yK!?Waf(EZ9$0k=U+T1PhkDvrQcGl#b*lzI>5M4zXGzl$`A
-;fstS#CeHfAChUKivQNYNL(BYi;(FGwcI#Qo27^@rAfwFjS)(KBiE!omk9`<s7dQ%G~++Ps)2y^cK4s
-`b~`qNQiBNq)?4V1MBs8svExXzaeLlfvhGr$0Ic!RYxX`bmjLf~@a81CDatK+TmB1%q^I}5>dW*g3W|
-0r(HXFvp(DqEI04fUn}hi=62}axE03d;nzCrg5#y0`0S!RtY3AfKLSKDU1svXz<LNCMa5Z5HHB|Vq7@
-~_KQ_&-4)bKH5Z^82^c$~}=J{yWL1}h2o6XQ)ogVYyMIZJs(p?P#yk3Rf@i%uh4$BYA&l@tvCvmXO_Q
-ALq!2J4Ir+nXF^g9$Y?NI8Jay-|QueYV*roUV;3()!7Tk5Uwa_d*@Oagx6eot^P*$eW{#sgTZK9W3K8
-2AFG>i@+y=q2n>flNttIftBjeJIN}PhwoK1Q*0jghXzZp4eiR<<H6=2>0xX)e?I>7WQ~9GE%5f+Q`u(
-kWI$sDWXu6CD`IS*gg9<m<x7y@;X8T;%3#;9Z1ps!ip~yMKh5)-rcf>YUQ^FUFM6Q0dNEknV9fL!zXe
-^6Pdbi)Ejidi7C#T1IYE2#x<4?TUu<w3H@Q5FM;ro82HK^7+6_E1%sA^IS2(`BGO;PbCWy~I2Fy}m<b
-gyea7<D1+azx)89j15GkEyESt<<g2B8Z1Td8arNdH<0ViCx4W(ZDjoTrs-mTt2X4kC#3?D0qT?u_KSk
-v6D`Gyx*H<tnZ-MO!f{6YlImd(fH|6{F}QG7q&=@SlsELnY-Z6LQrQ)|&}r_EiG8XAlQkn?k}^kW6vr
-nsGbWf5!=2w2?Vm#{@W8^;G#&pXgNxLIn9*O{!cdiBS;~G8UqUza?w^C{y%C%`$JY^CjCEvRw_y48ze
-xI7mC=Cfz=g0QCr@P;5ER+eykfD6#HIP?DOX4%ukWixbi^j)gUH=+pNj6}ariw+BSU<v?~B(?4Q+UUZ
-~y;$i4OGQ^Q}E;faKBuEv^MIeB$2a1P5?v|iP^=QTHGBRXRsUECwV3UF=!u(B;+<@(g+1pj4BoC~Zk(
-ZBI$JW3khHTe{d<C{+!|@EG+bBsf#WiMPvljMGKb)b;$><MIz%U$i@NC?{j5K#d>PZl@o|)VMH9r~|9
-OOm?_PR+=o;-hj=!k!tHq1yVay6N;{ed3<k+_6SY}wpq2ds=Hqgzy3&o7N$PNd!jX?}zA^W+0UwgbXq
-{X#nEEgzy_w!_1%HiRR=$M%j*WhuzbHS-+>ZOVpWNDFlmEdq1Z{hy%2gCW<}@({jtXaNuE$Z3iG8H?g
-FuRH~>NYK}hHiFGn1$5~n5tlVbJfL<}H?mKWq!EB?WdD^5n;PumWe!Fl_QCKjAHo0Kl#)SbBCKJ_Z52
-;uuU*3zWhzF1^HM~uDa!9Mo$LfBb+>zh(q#7zbLbQ$rAM#u(aF)-na_&dm{8MsLnONCIVSkGyaNkb)|
-*=3GPG`qG4#8+%G(>BzDt<+pRsV$IXD&Nm#hb-^B2=<?&zueg_*~qAdh|8gn%nlF3N`6I>K>Mq<EpxE
-r!r9o1g|Oqin(ZlsNH<7RG20L}@Cfc5^?5y{+P-Jqcr^D;9c#b&J~%FAn_6e92Lz6$yEfs8CjA4jzn5
-cS{G|81Wx@!!Quq;_xOZtQeo#_A;u$c}=oFl?H7X%Vzq{iWKbuOrOHzJgbwe;ahg2#DL^2nsvM=^QPz
-zYz7l~TG64Zqq6P~97%8vhh5*JSmTHb__w;IG9WapVZ~9FVU&QPx)s9??#iWqpH!ceXgrS+vCT`E|9}
-#?Z2u~tOItw{8Gd^K!+-Em0Y^LmtipbDM8TNvB0pAW2~6!lOXe*=IIr%q7=O|D*_1%Nae{J)v&?ppU~
-Lcf^`Vl3RMn;1g)lrjI}7Al^?4gS4W{j00Po+j{BSxb$O>OOjm5^YDnwZ>ZE0*?kkP;oX)@1J6~?uWo
-Y_HD*J^DF3<XWWj06qYs(>s`8yP*lH*8)YkewFT4r(bd|HgKsjNNHq5ixHBc2Froaw-5u>)1)M9So*j
-=QB~-h6QzG`jgL{)UA4GC$UXsLqcJ3Ak0VAH96XU3w~EnC>f;=O<3~Zngq0DNCD{rU~@|0yjg`gm;KO
-r7?FQjDg1Bz-Y65+*u?<wj8B`zWa1MNRgfU2+bP1VCvvrY6nrt(TkP$>aPxKx$}g+**k$j_m%AT#_wO
-)sAcqBJ^Gy>pp428oet?|jKYy$cGJXFeSagf7eypw@X~3p-zI9?yA`gx-#WnNJ)aj?7;5g7HX#$Elmw
-cYs%U!Caj;WVnnGZe7+QZc{>^_KPyd_*-i_)kXoxY(YdbWzHYzO%!jxhed;%GInylE@0{K~d%+!Dq_@
-**VHJul#g^`4*lOhGc-Y#{PLjG<1&ELh){@M^chu(-}sF5OqXb7@_1;PZPzN&tqCPZZvZ@IC{Tvn4Y`
-6~PJZ8`rhrR-Lr7@I_s`9l-N|=EP6H(c(dU6v8TDsKt)RbI(MulY$`@x}2eOZ=hyiIm!%IBnUj?ceN7
-%-F%~A)_*t@KtT#zB}D_mJ8#+65J{M^*X@EF4EMbOUabuUXqm4cvh>~w$pGg8KJt~wZ(yz`TjX_(t|_
-n)795TcXQ-eIKvT-;SIrXZ92al|&@x9~5Ov?YDJiBJBccH)Ey)fWL^LrX%4ho!7an?5H}XUgG=jppU@
-f4gYLo&cPwy#rlhiw?*B3dc%4EhPk;Dl=B2RXOl?`OaVtyM=F}kIo@-z`S4}2`6Yx9!Qo^^U3047&M`
-y?Ao3-NKF_osZwenkTS<SLRI!Pm#o9u-&wxf$^bO^i6}FxiwxN2_`i3hw&d$<6aBWjd@m_s~Y}IQ+<J
-sWlu$HGU!{WhBY{q<T1Y{{JUu-kB61k{MV6FkN9mvAZFH$||%Yod>?~t)eBL<Ylr*vI%Grpf(p)n%n@
-BJqSof{MvrK6$tEnRgL!cpYHdDD3mb{GUN3jS|R_;=>H$f=&Qd$-$g4XGqxjvV#$^QX_ZK=(+b56I8q
-*%2NuCoZfYQ#TD^=i7T*`ZQbn1-7VH348Lc)?9EYXM*kwEmt`)=6OM07OQ9|Uzhu-U4EfomTmeH0)BN
-cPv>T-g>wZd_GGfP0x=bHp35y|*wNwt8#aEbzAam|LS5cj=+Ke2)j{?c=a2eDw@@NAN^X+kqYeQ`}yV
-#Iq`5M__{#23b@+%|iNFWF#>-)Ik7Bjk`Yx}Vx$97%{_QM<+N?n*=qvN}z69syWziHaZ$&MBmjQ^+y8
-o}!hqt?_89;uZ>4f*aPExtL=#>8b{ApQ2WD_-ga=3cq;6S-_YsOiz%UWr;f))3TPl<uuBoQz(09@DR%
-ytNCYn!RF-!@}jmc8NI-dOgM{sG~#c%{$qrdMU3YlaIbL+95xb<JJw-e<*Hms+fnS`vqI||1#FIO)O^
-C)LvuXlGc?mgTrJ>qZwnKVbQW20<Wm+{W`jx@wJ01-fuxt&soW6D#x)G+n>A0a*VMtH!8<Hwf0Kv7JX
-rA^yw=8frsZlj47PTy*(uiwi|y~dllS>b)^{VawX_GT<(`*cvvOZieD9^dgH?#EkD=AYh3oaoyqk7ZD
-{6QmBJdt-7<|jW%MQ*-C4w^@H)N4`+Gzv4uTinzv;ndc@r$cXP|S)PmaIKTvvTiQFMMsRYs)>M*L&Zz
-SH~v!{s;804chZWQBv3qtvVZb&Y634$P@7RA*Cm~kHLV)w{%3QpuqMeCZE-V6Zyc7A9TDE#QYSdc|n8
-1H;PCrRQ6Rd_0g+3^cNI}zKT#dRXxZ~<5@5$-A=4HP#Yv;eV@{`fy2R2^&*4z#)SZ^uFC}n$rxkkPNu
-a)FM8@=&A#sxo=c-*&UtrF-HR^$1aQkcnL`f+B?&h0<&NsQ6Nn!>$R<-`H<+Mpg=iQ1sE-P%%K<iDnw
-q}6Cp{yL^=}dauA%?^rN9|j?9&KUWUgZwJC)u9V(ONQYv^b~Vv+#EoW}bl<OFVkwiU)11h6J^vf08ly
-)wR1E&eTQ-x=7u!pwxPjSVn9w#_+Aw3>s0NvG1TJ+z0A9>K_mQXo@~<ul^%l)LI=?Fv<eyEQ^0!C9sD
-#8fv?o@GK0dr^VH7`N^|G%Q$j-*uN@Ei(qEG!`D5sf8^aO6z>+7MT0is(w#TAV_W|6xELu$`Co$j;)%
-MGO+yyVUPQzt#9g@FN>OBi+-3aL1RCvWuX8j-egKjx<X)gx3q3tSCfvS_ETnUy#Yd$+(&6D@)Zeadny
-V{j(+9}aU(|{!I&=OG+&-1F@|FPZXuK$?P?5jO+H_oy*OYyM3_6nHNEzpP2Qc#o=EsRL%+jO+hNMrLV
-LX5LVLU)fCe3o+719s1N(<%@Z=(e1=eIHt2oG4*10}l+$YX0a~W6-tMMmZti-$-Nh7tMb`(V$E>j07q
-GckyW>%D#8pP0&^0>y7&7)qI2am4?teplBGkRf!RX8Sh9$S(tZ?%-0-G8rcGzt1eV2}4z77xGeJ+sZP
-bxU)X^?2W5W?I`5t8wl6HbBNcB4azWRAWl(>e44(%W4+%(N(p)>#U<2v5N3Tb4@lIwtQs(!sJ#`tHe=
-&+08=;Z!jb~@gKJuC8T<}r`WzpHXCxn6?>K|8M=%hUX*C09b}FGXlg2~B-5`AhO{;}pm7!JII+WG7Ow
-?_3Dj=Rsll^hA3&8sh5{l|p*{<P@jHx85<mRg42W*4Sz8aTnbwAoW%5)F5icn*U%~;WA?^;1&^J|4O>
-uo1Uo=?dF(yw8Ucs&0MkU=C6Yr7}RcJz<%F2xP9!f<aGq#}j%26R(W=K6OG+e-3RF8uiQ7Lm6NbpG2&
-lJswbSG$Qopia4QY&`nQwH_$2t&OB0b9obkYg-|DEp>0;G}!pnZ0OclVO5w6qSp{VgUR80>i6H)+B%?
-IZ5D6GSIqZq2jLgI~U$93BTcyk(bBtBvy>7cb~Ws5i++v)p_w&6&c!AXu)2&r5Vme{m?!xi-Q7}VZ4Y
-4x8ts0o1Ne9Q*Curhro<A7R*~z@=oK!nE9VTf_F9r{eNT}$$C72@;SHf?<rvR-5h74Z`+-}T7^2jo`t
-iX@34v>92egvRd@&7`J$&*`<a_8^8zHvec#yI&_w*e+WxU9$3X$RhIK`qi<-rLwV83maSO~@i7|~aKh
-{tiDUIqd^yXJveSgBTYchMx_tU8XrjFJuqZev_L`j`mB*nAIC_suIsXOu-nuxCz#*3C58i?g|E!CS(F
-(^V>RaV{xN_>5C^}48ViS?iey!k2&CTKL_8MuY#RY>x9bopnX<bNGHsQR*fCz}7}FCa0U|A?5Xg=(u0
-TrXNDN0o_T`*2v3Mb^4`_ed00&2G^Su+0)_wj&G{&4ppoTKD3*3;W=@({yh@6lHO|b7FyvQpefuK5^s
-9o;*`}Zxvz4ct7E-x~XL(EgUlj-wt&fu=-n}a%jMIkF30H5A4@wSzP2B9F{JY_0LQfhevFYU_?=Mu>&
-9KmXq|a)}9c(t$>b6I#)E-L^GIf=eCvONZBj8ITgU1Ir6o4VSJnY?QefO5V>9WU$ek!QoQi-7Q;0=xP
-Pq5%90qUXBFLx%My1~z%+I_)MX$4etM9}cKwr`m`B?;w_s8cUE2xiI_u(4KqCe;u<Jxf7s`D-(Jx>fD
-}M{=q>X+A3MDD{VWmCSl{7jR-k_`W9!4S<kL(24r_x+N1kP^wq_ueKSkJuzEV<D3jRG%6G#oHn#+g2#
-BesQ0bdrD~MpB29ve4Y0_Fnxk8uet+82Ci9lpp6yDxDj8T@g`sUvh{2jz8PIfHbNET#?gkb`dQC{eQ6
-glfVmf`<KnSg(v@n!V9Nw(W)<a>T|HE@P_jOsZ1c<yX%I-Z#ZzHy#54$Y<&BirC5-}siB(yOrR_uKf%
-Ojc!6T_K*CFXx|47+3u-akrqhP6%yrKxgKY+oKq}R_a$p$Lc3m3MzeToz5E0p!;tepOk7ZYyu<2N&2A
-cLpqu1u0zLw&<d<z<G8qLx|44J{MkWa7@MqD8!KBKYoTwaHmVzCv0!HWb`ppW=ti#&0z-Gt<;c{^2H-
-nQ#EG02!v46))-337srp&Dcx=o!PfxsIyyGFmJn@6<7M3oAKwM3j2meX)xYna1rt(&&2X)+X}aEMmdI
-0m{k&Y4}EscX$CS4zOqE4X+UL@DtAWOK|c9!qXnUTXBT96K{KA-ZAk<BlqM;ykH5N8{tb0d%>Zis7{V
-X%g@F5gQ;cwxO&6^(mBq0X@dKZq7D`!$OYha2Nra0)}R)NjbMMuzxYu{4@_r$f&lPM2%@2X8d}6Dcc4
-W+Jy((9WAPnnSz0=_g&<Kj2yZ)tWNU^onMfVVBAEvOY=po+c35)muQ)I{Li5J@p7{B?BUYcaM{Rz>qQ
-d?7@=`3rQ8upavL>YCSUcERTrcl}DU2}}qK<rygYVYvn28EkyCzbz4Do6u8er{g?wf2(joPJ5y<b6cR
-f_b>Nt2MrCJ8B$W5GSC$q5kU(8(gp>6H;l<p7!^MWN2YcV^L6WEh~1FjX$z@yjq%Ln*i@j`NaEv(6nz
-hP~=4B!Ls3Vrct1eB4oeWWaSx6WlkS;3w9Od>bV4f3eB(O=BUtUiDlot6Biz9?z4qs>P4_$UBK>Z()I
-cuU_T!pvR(gk(Yq<r3b1gbA0oaN>RU}bF+GNp~Gi4^};Qzg7!@q{A_3~2%|+A4Bet=18~9j(3pp}hOc
-d#)Urse*+QvNf)Y`&#*p$v^hy#te9{_Q*1Ot<CKX`nFlp1!rB~3=$;jK_Qvgxyu|B<ELqsFP1lix@cf
-x+|nHo=K*<xkU(KRvr1rFn<lZ;jD+mwx|Pw~rR&fCO{Be2X^38t-UK-|5@EUH!ViLL)m*tVMG=qCoo@
-n9Y_l3Ol36u%y&X6<sD%oegj;?0~8W0B7SudT7p$`?rM=I-Oc;SapMcC*U(abE+k_BX&0y$+CpU#|<Z
-CPGrhrE!~14MBatEwE@oj0@>{Z&LS7MTFs}RwE*pRIjadW#8vE-TokG!Jc`YzSt1Ka<;aPr+Y;&J6PE
-3xVIbPxg8{iot}FmXdAkZ?Q7b<HF-@`izZS)Jp1gT0qqA#IIt&c)MKw%@t<Bw*t}Z<7(eUJplu_;(Xq
-BCUh`M-1Ag=*4={zE^=V+%E*sYe?)>(Slw_}aL23ICg?`0$H`(Soz7O%dzwdSXRUFU~bQj64p-W48+j
-iR53evSS_6>q{6C(QaC98{Vl@;*aWh*i8a5Ueq*irA2^nb|6czvN!>p>2+V}^O*+iiACx5N_RrI7I`3
-b86C<0ejjx0=>^954}8^d(TlER=+ixY_II6VUPI%Va#?>@cK~#PWqZR!TPvjYROcMD)_SQx1sme*mb9
-KK}4-j9YJJ0rZsDE4*{4Gl(Sg;cIzQx!4F}f)pI6He|V-khMb)e*u7|y=;OAyLu077C(79b25<jsE}s
-!=tnQFBOl?qCYQ#n2mYLXNUvLYe4Q}ZW}h=!>`auv{c&`3rdn)DG8|{OwB<WtY~$q2wtRh{_f{$-<uH
-~WT%q?;yfy2vN-*e$oVv<|b-LDAu=wpI8T})fNbjk^A1IPx6^mD;8!9C!!ISCOS<dP5P&=H)%G`&pe^
-m}F{eF;^`t98-;}_T0NpvHYs6oRH%wNrRQ7GRCa6-KTmkzyBmIp79d8?8j%wKRHi^B-jY>Q>-V8R1Sq
-9LJQ9HOWH4Nyx11QY-O00;n48F5U+Mrszn8~^|$D**r^0001RX>c!Jc4cm4Z*nhabZu-kY-wUIUvzJ4
-Wo~JDWpXZXdF@?$bK5qy|39AsWoBx*wN$6O+ecbwCyDK8X8XuC?%nKlJ-##vNvtVSB}hAJo9}+l0SFQ
-#!Iwn6Vsbi-ECC0=dHl}70SJr(e@3pa$59vs^!l1Ov$-FH#Jpj?8-?^*{Cz}h=gwh{?;VlIb1dJc*RB
-)Nz;xN8M`NThcjlw(JL=hfFk;R-NeD|%17b1)|HMTt-*u@K0yQR!+4T2_#y^iN_#rgCF!`0uO^d#qnt
-^FSo2;xD^+G3fXzA}JvmEDp8X}D&@z*c&ISoGl-oK|oSuNX{I3bju(s!rv$FrZ#%Swm-E%h!Ia|*>mb
-8?aVSymySa~DQ8gU%}>j7wiT-aHCf7*KO2D|~nH!}qW7>o@%Cq-Yp8RF=7b&yOBSe&Ao^gnv1Z-yJ@B
-^vH5e#yCCRP3I394E&qlKs1L>9}##A!yp$^2V}=fhUP7W&t^c0KNcf({&2hrCoy`&t9(Kjb;lzs3Ib?
-~)8*e2@}2M6Kx0ZpP55Mn1Zj(+?t<J<BsLFxi!w&-EJfg2NHe5N;N6%)T?<Ka$}<{HeH;I}0bY1_(2z
-YEjmX=#Z*#;r>jbsezJv0BN;%dN!HkjQg&<+mF&K>FIpOv70I3}jLGFmm&4AJ1<VWA5N92=FZtu-t!h
-n}?Lqu&H1d?lRAju>(v-JdZs3$(8R3DQ!G>qn)1K2Oebft8lyvn$k5@nV-r{}IY0cz)9!@1u<+Tpn$1
-*nh=id<ghM*t+@d;W)QhUS~HHWK<uXD^_evCv~x5Q4X0^dYsgWK=~0V#wOGKm^7+$ms78uXQ*|1az1Y
-8rW7Wv{=J4S`Po+PeGxCDwz|<B2yCp!egVf|No)H_6abDL@Y90P}^8xaR}iw@T19;6W~k&E%j`q>XCa
-2)b1##ZKzlULA?t=d;u@9aHwl5Mshy|_ymDR3`i*rMPSA*FXz#BVU8k<BS1W5AsUe~%q(kprGG~>LMd
-?o9$a1>s#+DAfF)_GBk~^{2%w*6!nCH;RyE?@aa}o>tXe$=#f0vdHX_GG08Juau>Y>_&qYNL&dl+EPT
-FS}zDt!B28!4UzoYStXb|`T%a+1NF!oO)1S~e5DlmO%yhd|6!+OTm5iwAop+u4BXztGk$A|CBdXVz7t
-od9qB<Rv{s46M?hiFEBjAl19I76^r#319a@94X%+H$QOM;`a3G2<Db4)8S~zkGUrett^)fV0_>zJ=VF
-fUU$w08Zs&Q_GnFY(Q!7bEf<goKrv<*q@0ljL0i+qAv5nCxUecfWgK$264tDE|m)I)tGpGD8DZZoLiM
-Ws1?WiL)0`0<QY{?{s0>U_idvNbN8J55STW^At&U?acUW3!N#nBQVNNW&-|Vc`XX%=`3d%6-3oYA6#b
-=;AX3e8o(Y$S?$ZHjncjrP>N7KM(Wn`OU;qLNE!+1FLNaxr7Pq^U1(t;0SVggw!C}sDENn=Q4h_yicA
-{W_R+b0Jc%*Es!|d<+_Oj!?qZk1p_R$axT^V|;*W5S5SR7SZu-J3<3iRXze;63X=r{1mgQQP~M?wbK_
-MkBn#-}tgp-DUipbKU|d^827%0F!kg`f+*ij0ANX-i%v#I7=RmR0uzeG2%Ydkg?gIx*cLhU0S#VuoWs
-7<$0wz_Err(pwlu&1hk}chD8+-JeD>Ech$={QiBa5!3}v4hF~XPQN-nCf}YYT!la2Yk;0Z0FzwXgS6N
-)DD~v{9LpVQ8E*U<A$}PTjj=4}J-`i5{Ro}MoPt*KFb|{VDFy6d{)|rjdorLS@Xj;;jwa@Zc1GlEBWu
-gC?2eC*pJ-$UUw@^M9Y~M=cBZZJL?`aJ%9rQbDqojYIX^wsDb@MunZ8QKq+vGn2SjW%99;7LzBt0F=j
-UhfzvuYx6aGab0pcSn@S2}XQlHCj{??Y(-(=0dOIm-I-~6L3t$)axUr1VC$Zx)EOY2Kn^D9Z~EBVdWZ
-E1ZiYd)8>p384uw59bz)_f^xy_Daawxx9{Yo1A3XY!l#wzSR@Z91031fpH#Aq}6Up{sF^+CUsH-yzH;
-?Kg)ye8ON+>@Um^gT-g`okiy%OmC=-!3!h5ynHkKoV;GZ3?F8Uk>lFzK%|$zU-%wO#P0pzmTAagB;fF
-Pm%RAl^+<~!1mPw~9aOfTacBO=bR!{`Vz2Lr3Rpv~4DeJn7Q4^C$l#7Vdj@gp;UW1{{_;}(^09!7!%X
-mVDgtmmrf<{;ocx3l&%MLw5t&DTh#>_0;3-7BPk!gqJqQIeGcydYMOJ|i4hxGML&__RoXAHf81O&chD
-*+B<q$>cN8ymsnPd5`?-@DGQe)K!BJB_Z+H`6l=BOx(!qh7>>57AA4Ef@;4rbe)hhgB{L?J!lvs}g6A
-Cp%i0RsY%NhzRhMlJ-zQHT-&8xsiu&lefX1qS6aGsM|+LMSc_4FA|DnROJy@heqaY5073e1)Ddmqo?7
-UcSfx<^>>_Z;c~tSMQ${mdM!za)!?@)Zb1{GUW4^s1cA_Ivq2QH8ULr%En_OA13{b*@Yw{lFoNQ3XD=
-d^$QOePVsQ$@eDUZ1Aofr!!lf#%3b7qA;3yIJbWTpYrI3QzBM$yK{SkM5iMNQww>cdwrwWD#~TqEj-7
-zTIqgDBh~40`#C+eAY4IWXRco%m&;cq!DFrb#*9`qJc^(p%n$Rg!B3=$mB=YPdh;F4#@~+=ceVEgFJT
-szquO;dPeK;&sNDNG*88vAa7);I!6oPXxf*<{Oe4^vqbN$4i@8%S=-p+gR_eBO&aExcV4l8&D-~gVgI
-8Rrtwm6Y_9*VgOk2Of_k>m6tnK_ebC^Dp;iHQQy^AS0dt2$X?m_}itA3({N(!}*|OqW0e;+Qv}DTZ9@
-FtRTHagLHq*eHnvuEYLpj*SQu7jSM87To~PFk6F5AXA#76$3hsfXRM=F9?-{ZAt+g0C=tmV3a_AmhGp
-=;S6%Nl;m$T#^i{so4W2ZnwsqTmM+*ey3A_`6UNRvO@>874WAoOkK0Z_DJ%Rm86NY3r^Xm2oSDen;M7
-(TNsbyXJ~J1BbC^*QoX-`5KoZ3^c9LW>u$zTaOd?Is+vgc*K@0_MLO_HIT{(In^N)eU4tL@XpIcirD>
-ZFME86=Jv;vGLBc8ZNrGmM9is)4|MM3d<>P>)GCxD>dAZ<h&y#9+WN<!C6@AwK!-ZdyC6qm16z_cjWS
-6#>`pUs4h@-aB9G!7u+;S99n;Q*0|1T!(U`Y57QWyZatx*)BKwfIv}KlVCpYhwI#Vw9Qu5`F=ndf$+*
-p?9YlTGCW5Qz=}nq0^t96#JXu+0&~gk-+BkS@H9VQg7bNgMnnMKojDt3%HkJoL6W`mtai5chOiy*Z@t
-$9V$*?iVRCwjNN~eEp0RqVWxgr)fRG2J}N7VVmR-WMZY)(5^?7%FJWhK5~^AMi}yUl3luD#0zp`WK1#
-$uDovil;Oq59#oBOoF09UimCyOfFiv2UQ30}sFBR!)*4@<sIJl!@LOl#yAvo}C7Xl+31JVgaj6iWu4N
-KP{8C90*l0|p);DXsO>#=a{oW~0XxV+E*kx8X7&JW}DcxaMAab+2uw_CP?9>yCI%67Z(kjJ*=UKd}<z
-KGo^d_`E9@T0E@g^_SI;sBr7L6pPmxG(|$6h6uRJqiQUV=gY4=l3}krmERiPfjv8b>`U@=ES(t`ub2c
->W+PUJKrwnKc-YhHgr6IMSBP=EOG5|@3Dt3T^~0%?8qRnxuGSxG#tC;Waw+hQqnE{O|DeQjvZd;F?m7
-3rumEtwG<~%e#G)yh#1eW;?{vEUb{sjPiW<>8-J)?qjtt|A?|6k*&(IV0?1Aan~ivSD53LhEgj(DPr#
--sBELqMx$P>?*(|>)W$$=*rt8>gPF|bXY}gOQfwk>N%!B-zFXs^;bz%Pi%(aBN@SP$MxY@bctae+FLb
-JxXW6C>#kjGubu$_1XiQfx9A`HTMn8ERkcZ|7wL^)DSxIZx`g^8q?ljifIe4_^6Pif+>oZNyGCxx+}0
-LjduZb;q5XlaS%Lzb4YA!p^M1*2oXVD@2<8{iSoI3DKoi>I@A`~VD$<~Ev6c0V9)kvk#)PL`Td<iz<j
-I!8{-^IhnSz2FX(2nL82vZVQDIh={}N;g5qp$c-Qw;<nsG#p~iaX5SiV+F4YU15q+<s&;Q-p5$NmjS?
-!%zDRqf7p@HEh9bNGes(~<?!@y8eC=JFps{PAg-B5sBAQ_HU{@e=I3X*$M==@vz4*sw#YAf|2+iS7Z6
-^)aVAwxpmTuh9gB1<d|Qv+vGh)$cLKc=XzT>aL2^ZZpa6Z1M=<Y0`Y!CiB{aZq(N;qM@4>bPY`b)Ft!
--_u%#2xqGY?B+t*-SvZLU}K=KbhZz3geD>T}lw5q5&;eFVKhP0wrPMm4KM^%JG9Q#v&zw;H&9R12;%G
-q{cBr_^#WOb0!zO9p;cKUH;oMlY(<in+z!nsqXute+U*{s^9qZ=f<_CEzJ<KV5vfY*bavi9Zzv*|OSm
->(=w{U20FLElIquVI=4QuJBe#<5^+b-`lru$t%9m#t#;_-PMxY-Eap9Zv36VAI!1wT})IpzBy+^UPNJ
-zlI`QR6i_jIsS`JU{IeUBX}8feS=oiI^3~npO%x6%emD$pht%)}Z1t9Qhdn8-eEY0q6K!RpC@Y_TK4A
-IqH*Nt@hKMos`;oEHI(FaqlZd_aXZYG#p6$i`b@-P1E^uTWy4ejs8_sGAh`zj6>IV4bD(q1f)f+%^3j
-11AUjrm>TI=LODQaJHsBDaCy2Y+t7$Wt@>#(!WmgANdj06KM6AySG*9X_5(egRbb+Hl6cBxl6V~*iJ`
-L~+7#`?0LIkC)@;Hfg>uIVNn`vFZh{VatJg`Gi7SD81ZG5#30k5u}zR$)>7BtpSv8RhSH#wWY)FW#l}
-sph@zlF4gXea%YF;FKSefcw1C>1Vt`k!%2q152h^ySbwfnX)NABFeMHYeHj_#V-%xZf6@0Em(+Pb!>X
-pqGm>0vedZR<W{RhA;rZhGg!Qc#$$dukfGVEs7daNkU}?S?L3#zS@_m`Swc6&bp~;HG3XSvS`s=SU56
-yf9Q-CkQR=W@Ab~#*95t(=hQ(->rKm8%4XGeDG!mUK<nNuhNAa3t+TB$H`sR5Y-Ox5L18C{*KQkU2hg
-!PsXAgoy6(OFUi<NV*mGQSjENvGo0p7|Cd9IHehT)RM^BoCEMDO-8CQ)`kG!nt?M<r@M_bn`0P8xk+v
-KLOJ4@~;NWK|CJfyrh9lg2<?vE6Amf|Im^<?%`FCWIB;<45&5NTr+n=w)v5`x8gyHrX}RnVpZO@?G7t
-fNCYN^kLOrxWqoJ>cgs4In;+$8wsnHh2vaAuv%a>>^{I5E*amPnrzz0n{I*AN#8yMZreDT9p$$DVR5<
-2nY4L(BqrIvMAEz;ZC@g3=GK;bWn{Qd?~Rlz@&{v<y=m^4X*OhX1!Ft1=hc-G|5<fp&FykeY;$AgwaO
-0Wl7TdMm7*-<=}kZ1kKXh<G5y_7uZw=xXW1L%2UbjJL)=p)nBovyWr0uq=*Fdco}ynt3%8iCZ=0`IJG
-{4P`;|r2C-L_p0oy0>`y~FV9O{$!8&2Xc1J3#YVkJMCKNO7orCg&o0C+e;3pmtX;nQ{S3*D;n2izJ3G
-c;+erh!+E<9cOVN_ZO!Qk#aS4UKAxO8g<D?=$0BDpR<g2*19weGamDKbBe^*x2i;Lcr;#Zr<eX9I4tM
-!=7X+_1vu(Q;!f21|eFpx^=>`2bXr~(+Y04#ic#LrVjvE`t_O2(}P|QdfNcKjjSK7WYzlQ`ATb2DhJN
-Ig06Nwm+nSXvZH-csE*$qrh^(`+Ji|7wN>P@6^peWZPo04gr!8OyZTTH^%DOC!5LR|JT=#U)K=$5RPp
-=H4*($!jDsV*Y?R-uumV!7;LDRJNy-%cdBW841HLvaz1<HaD;Xk#!0wo`3kNS|)ui_9#pOc5wJVwyaE
-s;JL#<2AJ3s@x#q&+v7v4xRU;rPv8k#-TUDf=PTI9(&hx7{5&S06}NPC<dFh@T9waoYD{e{|C-dU9Js
-Oo_Gk^`>Cc=R!{lOJoxZ`?_*y5yG>S-y8igHT+kV-nl3^5-YVS6+jw#bfNODYfu6M}FJRl!~kB5dh$K
-ybUslJjNSE3(8TFhw4c?70vOJ@=Si+eKwR*v>>Y<jW2%Es5{>O)MA4}ht6$((OS{+!ZD2aw9wU@hwsk
-0x8cR+1ArV(EX}<xeOo*2iBlU5#^0ScTZ(I{ugDk5W90KJ7V;xI10NU&_=eZJ0l#516FMRnc-7mK^Oh
-yJm!rlI0QiZaoaZR5<a#%s+@bej{8(ca;x%P>l)X8ocqv_cr&*330&>#9BLe>*u;Ov{c&8lv8c@7ojw
-A3KB`ZLeUjXgQsOHe*Dkh(hf!=pjRI0izI;$CYAvbEw5xM55T}t>VP%av%oXA%W;DooJx9-hEfbucyX
-zn@|@Fg`E-EGqN+(2Y-tMT3E&O6RE^TxlUg){n{aq1sS@(mSJIDKTNca6I{lkPqUT=C@TU7OkW;mg`5
-o9hZ^Rt;6SG4EKqVi#uSKzs<1Op_ZC_GwmL3Ua%R-oF~P2xVr*B+|qGj{LB4{jb4A(OJ5`csiQ-Vd@g
-v*>(?Fw)+Nvx5;?6eOXEhBs`35abZg1MDl+679M;)DW4iIr+7IBbCTRJ{C`_=F!c8bCRaECjJ)4@hx0
-12495zSx|O-L10JT#RMziiy60?l23U{CtF7)g@d%lDN^Lx^bp`Xlw<u%cO6yl%LTvzX+`|E=-7uVdVo
-8{d&Gl-?!Dh2|(;|sKKz%(T;tKfUnJW#<rw{<FW<Cw#k9ArPwBK9LibLzfdKg!$owuHY)r=?Ow08J1v
-zA8mtkj5B%1sSKj)L=i`w?a2rT6Qp3oL7kFMBxJ9vpeTfFibOEGmPZ!f4bjiXV$DiZZEJFc=lC$X|Kv
-Xq9E(V4`Mu_}ZlnV%t+~1+btCg#>FkNOf@A@M@dEyGH3X4!u@0^}Cr%6lk?rTC4V1)KMBXuJYSdk~*8
-ewzQ2uT0#4n4{j`C@tvm+N%_|?^5t~DaQ$yy=^v9H%v(xK;?a9ziGuM41>D0maqcK_LSizpLxGsCEB1
-6H?nEIK@hejC=dly8kUS%PfO<;?$_=V~ix}gJ*Z7keh5pP89SbNc7oa}o&GWr!PB^Nw(b#WiV&k|d{x
-b^b+yx&vke>M{36RqAC2Erqi+<C*;F@N~yfT_IGtBah*iHc2gZn$i{7zW-kxMI)!u`~-rhJ=-13w1DR
-LJ4cF}V8gArD8{G3c?Yi7jbWXl4et(fpKJF7!Nfe6RGBEo>2fux_D+%VJlqR2)spVo;`iWicrsB~heU
-c%7r3YQl;p$LeS#YZ&kK^fIiq5{t{9#HM4l{EowYb_jf8W<#8LaC(rNiGk68DcL%|g0>~WiIW%{_(<c
-YgTo`BXW{3U;&X_fFW_@E=nW1QSn$81(i}g(7N048K0C<2u(Ol|wNk`wS1<-S9z8mz%*bwzQ=j5i8fP
-pkuAn5RzQw<7=vR{in2d%O#1ms4-MEhR%7#im`X0rDmliCfv-F#Wge*Tm%z;{{GEEfO7K3Z4!-Jw7Uh
-<=^9%<U+d(#5MIg~UGr@G__^oNdoP^dGPqLs0><*`#Eer-2SjL1hP#o_>bX5@xH%0kQA9-s)i8@{dNI
-sWe=`E+S$_Of+jG%%*E7)%xgxrc#HfYYegpgKp~Vf>aZ$Jr*EQa1F1VXWzf>bAiHyENr&-Meh5=;r=h
-6_X~K%g1HaKDgjd)^IvNsROG!R%AbuWi?r{EpDrDycnm4u@oA<fL|EuO6TltJxjQS!8gt%He5uvmNM{
-l9s#23p5_Jg55&BOy?yugy{vtM0mbKauffVUY1|Lee{cU?s9o3ZcnPe<dVI;<K~<`*s$cKUx^`!keAs
-#9=ezB30=BazvOX8E`dK<H0+>z%hkdu9Zj5Nv8@an#ce*jXNxb9~Z-_*5s&hUip!ve|D&Ou}<w(J9hR
-X-ndbo||Z@UPO${4qakdF&*mu_c)by+!s$*&Q`6RX)zB-a{s1t&jhh?^hwv;+9?0fu7SoAB=Ma6kqc*
-tIdMYh0V(XBRIY?)satF_W5|Sd|r@Ty?zCE;emkx7N=zj{?KEG9=MTvbLld#8Ml9O4X*~1>k(0^(p(@
-WK5&TyYQ~6R*~ypRNWPo-e(Ug?r0;8--We%XxygTO~lo}+m?!|%HwY85Sfx;mHt+BZcz;%INmpK=?!-
-fciq<>l*(A#{0;pbM<o&0tC-Xc4(+94Hb=R9La6-hoPCO-I<@Xnt!}MLO=8|no60ulyqV)X=D5oCI{)
-4!J{7wT@hR^5H6o<-i-8+;jT`*@LVR}d^Y=#Gu3vlxhJ%G)iHa6}erf1-`{Glt`?_H_+TojJK>4Oce2
-N<v<K{{?FXB_}&0q6Pxc{Pydq2<|1SB8bo>+WxXSOip<C|`Tyg*w274ngE@pCA4n>G_N#lmNz;tW6k@
-DPRkhVQFxCFD$j$K-k8{TL{1+VKor{3OtW93Wo~$h|o2Ge_sr9RBfq_`iT@%*R@b1E@VQgBx=~`4OJU
->mo6J@%Lr$_|O6=+hLX&*wp@p_@2AqRnafAP<b0=hBIJ1boAiaLHyQEjttVr%m%}=MWG-^?=W{P=`O*
-$oS%tIj2~oY`6~3sl<%OihSdMeyy??PfK}Wde5!7~ZyuQxk!ovM&DZgp3&03x?9iYzv``L8+=&AR>H>
-q+vUZKxvMck5{Yz!6Q$Y18R&D*QOceAdW@SZ}ykEp~a}DRe`5`tvdr^A^(Hi=*<7X!-coQEwx(}w-15
-+Dr?Z%7gopY-uP?2S;GQYLpv6*86Te{<YOm8Y!y0b4l^;q~ov9L;2>$9;<9sfqoOzfeghmsyjHo~nnK
-uN6$Z#IJx-c#yjy7Sz#-^6D=$bPX7W;I=}{vH?y+cx|5A#ZY+Mw{toUK%S+e;)#an#{+0{OhNcOHC_V
-LFR*5urCGVUBkaE!434MhnpU5+QUutlJVA7+X^<&ueP;fOCNn~XSJ<bK=rF_+WI@Y+V+s$?GB`c*5XY
-1ywDDCs}EF4Uu~>IkBu(3HTB2)m?Kxfw9k?ESh!nQSf#3sm)mMR|0b8)dMN3kq)@Ael3j<AS`&USDcW
-8IKb**Zr3H+9@%=kaNT<sD>?m^f!>fzsaz-1{rwl0Q4}9Wel%woR<a3!`av~0oM>5&Quw>cU{_-B1D<
-gNvf0Ihj@|Ez%`WLn0y92bVA@~&EvnnzWAK)Pk!h{xdr%)tT6@Cxj@bjnQW{9h+5_^<I;}ZyYt*67!u
-e62rZ-eQ3Dv3*mVwaUu|6@@a#^^T))r4xID$f@#L~c)QhnX;YJ_#r&hT{P^+?j!cUk%ZE6Ecs<DK%Yk
-?}St0MXpPxG@v9f`CUHY)b!+QT;kq|q#l-i=|^4|k9%a{AIa548G}#DJ|oB3f#QpT*Vsg0f`tu|lA4$
-L)*A%l(>xH4na>B_<kqHGrIz;(X`s+Hs>gqn-Zz0B6<huvP)h>@6aWAK2mnzTaZD!Tu2?(<0000G001
-5U003}la4%nWWo~3|axZ9fZEQ7cX<{#5b#!TLb1rasl~-+V+cpsXu3vFbQB=wlHOY!~GnN5cT4U|dEk
-IKYLmCLQbh5d~q(D-!-J<_}ccg5~cG6}-QCYmZhsS$)j;W2FLs8V7>kJkJ$a$-c12M6>=^Pf}JA+EzN
-h`I=pi{Ec6&8(jXhdV9sJF2z8`TWwRxR2!(mP#s4PMbw6r`<e^WqLwrA=<-a;@iZ=?dr7oLP+`pr;ot
-=S_~zAm-)k2Ir{U6@7rPP+={)#uZ)~;j+Zm!5eS&+8AvffcYv)6cvSN8j8g^T*o`IID_~dx|yzCN!to
-n&d~6hwC_9GZYmsJ3Q0?T+y05|P<Ev+D0r=w%CY6#M`tWbr_HK=9hkT5zAYN9u-JfEHoyGm>}7mIF7p
-ramr{`5q2WXoQq}tU<Oa^q;S7YT4uz*T@XI;8jG`xS*$7u_Gq<2LWio6j)f9MB*lr5R$L`gSCnv}B8j
-r^**qQE{3MNP(rRb(J2a^@J8PZat7nD}(a(JU)ii*pHMAE{dHzL1Q(Dr*1LT7o;4_D*k(;ql9(pf-7<
-;KgpUe_L2XK2M{<XJf*MKXQ6qP(aat{9*GO_1ENxCSF6Y-%qM7Aw%oJINY^%P@qoJ!j@4Mj8g$MroL1
-ITK1+DsK&SXIKVkOVQ%mJbc-FTfoJVl7e@lNuI?YL*(LTDZmqGR}GcGsFGGp8a!v6V{)bn1zY<xP{S$
-fgeoy9mf5yL($S_sp1|J-3bE?rD%}jaINqF|&Ng$d9X)?O>83XSHv~zW>2qmqhi50>|FppxINSXnZ}}
-0{qWOx)eQ%EL0h<Ve$3g7j9;$b8ZcKDTZBGA<zNLC)I&S5%A<tmHXOl{nu8(3I$FJxsgzgM%i>0J8ZH
-;c}L=x>N@_K(MkV-l!oM*vXTv>{_AgZJiX{2>rjY##X4Y;mt$P1Q~T2aqAPLTFEb7B)o;(%Z^h_XcM>
-z<o|+l`XOwMqO+{U}4BY9psoiN<5_cE^pprRB-LNX{E1`c~F!&iRZCM@ixs_)RMc$w3r8CvmMc^9bc2
-PDk|m6n{y3i)%0R{NV)w>DM(|26$M^Bz0gZ6n8V7pIk7SXu!L&Ruzu=bwcALUxz$^k(_1^hqWjY?$0b
-7`aDT@YW#x_Pr+Gxtq6*z3)LBliepttLosMpT!eC}Se06I-R@$dJ2${`3t4*BuLU#HWrM^AP-!}Y!Md
-Z&qhU7UBKGXXcoU>0N+vM?WnnsiqntS(ZKjHR+e<@VX^z}%Bm@LX%rWZ&Ncr_=9t}yK8DP*$K|kTNXQ
-8+<pjr9}6-C^a-7sFmofw+8V1z@BeNS`IwltWNgw1*f({#sd+kD>y8Juze!kYPB(ud~hKBqLOyjseY$
-RGD>vr4`$xO4cE8fjQ$Q*?Z&&6d=CgOG*(3BHl$RwvuRO(UL_@AaGphm&*xTG1p>B{PEMnyZkQ!xPB@
-rKuG4HIabsXq0@ocz*_WmftTT=0GN5m~^tK=my0;?p-31N;uKG*t?hT>HYF%sPAM#o63u6>Zd%}PnJy
-Kev<8oe)gi@#^Z+(PB#b_`v|8S1ik=7!TE>oIKxv=_n3mpfwGgFEKg79f$t#MaqYNwI)x+p^@24HiY?
-i3<+yjUFR?yU>%BN%;RXu*?P~K*l+MD`lvX`+@K)T34Bo)4(u<VLe&^ZGMB;QC^d`uSUQz$aQZS{{H4
-!w?yC*xk#+1YWAs+YL>ykRW`)~x63qe#&5&8UOTdh0B3Ex-35i&RuhHpJbN4E?9HK^cS!q{HAsnxg-i
-z4&a@+6M;se;AiKwLbvMekt@Phq?524Z7&NCG{`<S{54!*Gbg6B-%&cM=wJ&xte!w%VIZ)n3yM;&{zF
-+*~uj&Gis{OTYc!2!G&e@CU;BAt;`co8Wm0+vPtRxJ>BvBa*WZO%Y&%DT=&nseCbEtaP9DW8O0k_rIO
-P9kTAh$wM9O1F|#s0S22#z=nX{4<63?Fnq9m^d`GmJKXZIW~BE(twho8_qNm4t&4LlKVibmzGkj_nsi
-}!&Q;07ElJ~psV<bYmu2_YcslH2w(5gf9;V$dU6T$Ul07`we}ATJEp|@cyC3}rP)h>@6aWAK2mnzTaZ
-Jdhef|kZ006s10RSNY003}la4%nWWo~3|axZ9fZEQ7cX<{#9Z*FsRVQzGDE^v9xeQA3eIg;jg{|b(0X
-Kn9TE*>H!7N>hxWy!X><zsBQuCChJWM-1gQZkduLx*SQzb}vn-ZzjSDOdMCyZ!W279#>cAP@)y0s-VA
-OV_>Mep{49nT5ao){EAgG%I@EJWu1Y2!E@8Kko(6O_WDz^1N3jk)H<PZ*f$FnHT4e9yMk1B8!scqeo}
-&U-kafdzU7m`dj_=ACG$Ke~*(gjt~5mmwCP_`1sojT4CNPOwV9?QKJ68DXR)YZ~eTNg`3#(!=QH?6|3
-Ioe|`1p)#;1J&+BTV<i?Am;6U@VNu#9Tn$K%w&meW>b+uH1pJrL;7xDc;-OhpPdlZy8*Yv3d^`3t7tV
-bn!4QHy_!drIhJn*xFB)pBIBs>U{A}a1BdktCd<;Pw_)~m_vUSGUI<#8M?z4+iZN`mw@KNt+hLr3Lj6
-{J_@Z52(qUQ({-O3Y8WylQO`W?|xo&rCbMmni<z<R;9D163%@BHz)@yBgE*twdeMLGq;N&BI<(STRtf
-G{BEh_$fx_^S}PfQ%!S{pC`q${_)+jPLB=o!6MBb&XSU37Ut?l-t!V822<I$%ut65!-Q<^K#Mdji-SB
-|tN9S8$qojBsFFySG$Zk3_QX^h-fffuD5bONpR2l;X>kyyiybw$rC;=3r*#AAqPK|RP-$ddgkG?(od?
-w2Q>^q7HJy8lv`kQA;;mJ64-$u_{5oM!-CJvto!1<iio8M@BgJ=^A4G|&Cpb{kQ_hY+&seRZg{Net%$
-n&h3b*w=$-{VY;KymMEZo5&_Lc{!srJbOtK~X+x{hwQRne;JX7saYxhf9kYT{gl!m^#Uwd&S%ky;2({
-`_S7$aiYLF2lS~M*U#zWmgZW{lBC3-qSaiZ!da58s>U9X$s}#rdkg+S?Y&*)mvRCD}CKo{^HqI#vZ^z
-p02}UrRxmi+-P~H#&)Q5%@3DlJ2={ucf{E{UnZ$u;d)R0?VCS4bk^0THGADHeTI(E41QPx+E#s43oye
-^{^e=l72dP_i8Zkm(|XppM#ar)wfwC@3{{79Go_>gTH@Ivh~8OeW>(E~HN9qBHuf;~WzAjhqLte2`i;
-NA&Wx<OtvM(+apZfd5`*WOPP25gQEVDAswS1rh7q#1M@j;nY5uiR{!=f_T9mUP2takW{6`FDRnNm4+C
-P=;s<&CkC*gIeoLD`qWpZ7nj#i(zyYweLwrv@-*VYTeFO}yjTM?SHwKa#HdW-76519&Rqbjs*E;xH+H
-&gZHtJ|@L-=4<x;0I|rkHdpX1YbL;s~UPwe|h|DUn|;Z{++En+1p5x)(zx;s0G)Es7+Th7R~0RvEUCh
--g=QRbLY<w81V<SVh{K?JK8cW1zx^VZkuxOgVZnXH*T-s$-%)BZKj@_zJGc7(}%MsFVv2+uog1nf9|P
-;vu3@~Bi)W>-%r=;P;MKk3;)!xesG|9Z)v;r=Nq+G`y&lh1$Q+<d&zD^*g-Z(Tl01|ZmGfUI;!<Wcj~
-Ju>peYq=8#t<oIfD0Cu-PhVO1JXjrRjsr#8Np`-9GGW_i@(o)_Ljt;GXmT<PlHQKdC)_X|}lGHuVT&0
-g41^3LRZmkMoe0z^$*h-PYc%GY&0aO*>i{~4^4O=%k1;)*&O`&!S%-9$Z<+`z*I@By`bRYl!S*CVHFs
-*viI`p=|o(pFaOcWMvH>=_)&*7%<f;@IZYp|iW|5jxxHcP+apNy2PZtYfa@#~**}RfuZ;s@6@Hb=ui<
-+giON3~7?6t+a0LAWKuBvKrXaQz+Mwuz6VRmKIT#>maA6_R3B-yH%w9N_w_SNlC_6NqXxZ@+?b}FfH@
-#Dr9q`2Vk53q6JYaj~S+X2V+~?sD!h_!7#$>J^h!bdiFfapZ$?`904LrWgp%~T~%WxqqW+;sRnI@*ja
-mHKediLZ7O)y(>3(MIFyTrjF&wi0<qV!IXc_6R@|lsE46pZ54=qKu*!~vh3;js@{$9kKYK?>m)7$&yo
->TeFA6I}Rzj!W_VpvPqcWpT2Rc-#Y{dG$>d;qcml_pMIa^+$XR+!@-GR61&7Ky&MuFRU)=?EbbIIUsj
-oLL@R_T04@!VD3DYsf3^F6~NdR6^+*GP}TgiTf41@-5<hj5_}aH=izHv1zONY$DbC0^WC-Mg%d_q@EP
-x*guu2-9Ssj|+US2~6&7p_SZ=-f5~Mp`{K>7XP$cjJ1w_McuYmn@ZE_WGN7H-cxgPCC}L0lSUC6sXX4
-PU2SQ5eA=dqG(8BtEVhoII;JfTL$w7=(_TePcBkUFZE<_`wWa&Ip1Ew>gZtwes|WPU9xpFQH&v+JTZV
-~$e=vA4*i++8l*UR4bEOX9rZ;%b1GG_#>N4{-tKOgr(y5iAZJ<{-(DUM@Qv71I-oe7~AHu@$?_pu|4`
-E^S$5}Xharjj%9ByIZ@Zl_Um$&^Eja2t*?OBq#%=P6e%3FVed%IG#Bxz?N63?wq)AC-0fYk1K3+D~F%
-g-^#2C8&#qgr-`wzjo*Fi(T~zq3(Y#rBr#ok+9f)otFSX^^I0;r8nGNMY(`_3>bMr~QcPc)qT*w@w2m
-8>=V?LcN>Wl*L|YSD6#l!K(Ifdv)15?nW)UnpvdTdSCUL=0TNpU4{q9&*^ae{qi%4^Keewdh>Vk;fHb
-jAnk1`SLAMyuov|e+N_&*SOUGTrxqPur}l1FI@FMb*JYGJPI*u52zrgjxpN2}(EG2Lv%8%At!5)jZ~s
-oKp=#JJ=C5e);qC0))hH|OSB9bfYun_ikfcyeQw_XoM`$=!m4;;3n$X&&oh-CzT{}3~V@vk+(NtZeSI
-X=e!8)7b-tOOm?rnVgXv$W1G*v51vnsp#z0W?^debiJ+w3XvWNi6X=}VqE!uUFl_R45KKh>gKM^|<jk
-!?$H<)KyKmEFb?vfta(R;7DJ`t>z!%Mj87Eag9_-8S&L$W%4?)}VV=plyLx!(S4`L!vSJ+x#jS+wAO^
-a4jjb;0_ya7kgXIwJu9mdQVN@*%{%W$+brwUorAuAq|>Zd)nVMy@-ce>%M{md)hr%Egqo!U%`f)fe##
-u|C=o6iThx^#9VLmO%>@T-RU!uZCPXw59RMnSmP%CNF<cx_(z)j+Su_|G}mUxZD04?(RJE3bkBhIdKc
-aLnpJa4g%42NZk0wyw{hub(Wby(U&n7%WGlaFGN=XPAoh~r0jV*}bX~Hom=EM`(kL+Qi{2O?6qy&rIy
-COc^S^9xy#}ZBzvy{!oZjjfWnvteR%u+@b$tTZHb}i{dE;o4Rhwu{C;s%>BgJ;Bxx-S-L*3HB0}KRtU
-v;6LF68#>^#R90k~X7mXHoCv->SgwMl<k&=BozYSw9q@b!i^bfWy)~yrCa|{PCbnf^ZQfdPuS?wG3*5
->Q$)T(?W;e^3uQ3cM{aRSm|pM`b=pN-Gza+*8lnFkrryjQI2ag_3-L{i_N#+d~<ty`{H)=BF&cH45ri
-RH+L1jJp%HI)eh?8Z{8|`>OXHU+A{gg(p_NK@Atpa*oN><O_Qr#oK*OhcpDo(zP+efF@2>XNxp-X3jf
-VxEvMX1H)_r{+Ng!K$kH!iqO91{zg4w8g(&}4i}2Uy%01a^Vr3nlJ>Nm&dsQ@dH&OM+PKvdcU6*0Fn<
-$<Ct`~rvH1(RZn<UtSUpeuOwp83kdnwYr6mFR@MZTA!vK4!XyhK?YuZrp4Z5alwwwkmt#qYPvxup!k+
-}}x1L`6Lgzdn2PNQXteqWD8PxO=STd(hExkNT#;9&HKNyYUNU=yp@MmBpZwbe`>|aO(lkYqg~8At|!x
-YEMTMO`7ZxSFxw7<>P17fahveh`jjgM>`0zFyGVPhnOWV3-@S_a;GDIpQ-TjXrF$})lOwU#eOZBFLRw
-yxQ8fC{i{0ndN-X8itMJ?qjPGLQ0z1753>EfQh;zzV}80ve-*(pOUunZs`c92C&FMKJ}i`ryGI3sXit
-xV=w=VWo*oB#)FoWc!#zD&L}47{`)0}_T9(-!by}q9-Z9iReh-D-IX!@6FUzaJ9{g|*ezXUFxCcMpgP
--id>zt~+6#E3e+K1okbVXuB{#oA;2<rr{XzeY-o^rvPY-hc>D+?2gR@PmgdpxeZ^r*Vv=p{`h?GDf+g
-6WM(xv6et>9U3AUp-gb$6i#J+mYHi2(#ypck!w@+S8r&p4F>5U)e*FM`|l_x0@*5v!Yj?{T_-czwaO5
-6DwJl`zVS%OJU;eF;+?X0CSV1_3Yh8)oe2VZcl&Tnz3iG(5WeV4Av(0qGYR!4YGaa^C3OXLx2BT+C;$
-ixN-M;H$V^ABklJf_HLt;;P$&=g<f0!(0+{Yd+n*&jqD)VV@}IG>UO)&qq<wWHFC@5tMa3D;d7;e%dF
-bKebDbQJk+V~Yytn@>;S8N)Vy3Ojra%j=Kr(Zchx~J_`S@FPv5^jF^?l4CS~p?>WXy8#sJ=VxbbX&_2
-mNsTxvi=Rc$78eu++=(^MMp$^eLJlchQs*wTDxezuW6FZOjJjz;Uh-|D|xTpVpSs-I;N6;+5y13oCg=
-L*nL)e*khxV1btz)uyB`EIGTb+U;yjA?^tu_%>6OcUiT=!mcZy=*}ZWf&~Owio(u?u8nhFiX5xZ79<+
-Q-jxL<y6EC@?(qq*dm+KN>+*@3#<OuKNPLR8u`>eg>;tj{brSg3yrS+{;2+LahVrHs^dlGC3)pHe+%H
-H0b10iwH6@SyHec=W2K#0bf<~x-*4;Rf=1U9hsjczRYRw%x~O4>_P%=kC9jF@Kh!^f%{Tfvo)-P7`2~
-Cttqu0F`n$o^ZPyb<<Lloi_3xG@T1VPJQYsL7`oeKV*Z`FhgeMiSq1MlHgxM<8cegZQ{rgS*ThJI8)<
-1;=YtU^J)Pkvh{!sli6!}%7vs6)j^|FRpwdGfWNMMt4o%)4$Q%gwwdf)tN@Ot)PjPx%#I-AO2PHbixu
-#2AtB~-3~bu_Ml+tteYDt+*ZO4;fkC&iC8_MWjn+1M|P{n=pkV?^0a=*63rS5Y*8lL}x{>CH${EhvJv
-0)MQ)rbMMbHzE4fLPXEhq^&xo{{4|)_YLePz&4>*_-R>NsQTy2>ZhOx$_)5Z^}}Fmi=$0ZqTde7YqA=
-82B<~9P}P);VQOKoT3AD?dtb(0#wN6d**3I=hj$w_u_WzT3p2FJp$qgAGigxM>ECbb-z|+ksZJM*>R`
-3``M&;XD1sooi7F?cCJ9c>Z$lFm{;E(bR$i0npO@9omZHoSdQDcVS7jcW-=C`AEzNyigzH$DkWz0Szi
-lBGEu^8VJmTu{fU33X=lAtbLy;}RTHEVCf0USeV2p-n{{XXC|B|!#CJJxoX;r8G^SktpF?D4v^0NNb;
-P3pE^6B&wKYBxuRtk3avW9(XVGZrQgZ6$4?Uyvw5wwk0jf?(uk^~>rFMW(uo9y~HOu9LbtJAwkk6)Qp
-Cs_b|{&?}&6n<5^mo6u%IuHBS^NX^&*xh^DoS<p<wE;fwu_soee|`2`l+XMujqUOc@B!tUC7TLYkO!3
-PHv7;v^Oeqk<&qWT0VQh}TNJH94=GzaVO+Fw!FHBh$KO`*?y8(VNNwWZRw?Zua~VAWxlHwYPnr6#lM2
-;<-K8oU`c%KI_`LnyDWG7o$hYlL?Nd|42*p)a&xJDCuFyf`t1Zmar%C?27pKY`J$v4}))hU|c^LJd&w
-Edm>0Cs24T);0%Jr<++Wo&R4Znz#UCW<7tB+q4$CPE*-CI5W#n_TxjLrR}?DzXG+h08c&K_5LoXRSmt
-4gv$``J5oZcT)tHG@?wq5V<q_uC&UdYr6in(=Z!iZ0UIF!OazAlF_$mGGjX_$_Wpp4CM@Z#Mgilr2e9
-<f6Kto9}3&CV2KJh?Y^|B&;#d9<9Q=)2&1b+0qfS!>X6im^2HX`bt@<e_vGnd;09zv+X*e)yZ$(>~!=
-}OY@(5Z<LJd2jQCW(iiQUd-kfOP`M9}Ry7R`>C<{pR)cnURzvgG$ozF^{u-OVCXXMfc6D0OE)A*8M!P
-qx&u!X`+f9|-UG2-TAwaT370_&3GfUUp{H5c-ZB<p+(zvxc;@9rBb!5u4Z&E_)5OM202o?(cC`7HIzJ
-BDv-Mc510e<ql_oR(~J<%ny9Yw0@pHw^JC(oN7)&9Btb+_KMf7T)U_E!^^#m_ndi{DK>71Q%ntw)}7?
-Nzpq_<0<ueXn+hl;3A8WgS+ObULp@iPz9*!CN)uYi|PruM8?Tok_g1NH?)}|M+<w5KyZo8R(lR2*0jG
-o5LiE1p4{b$`#1(6CcFwVV|T{y-J8i4csz|0*h!}#znNL*4oEGlxu@WqG(lGmZ@)>i4wXGtI)ry|5SW
->s$SHy%B(8Xn5w;V2#V?epevxfoU6SJ$jo7&B^csEyYgug-=k1{Q}ZE3OmLcopo-V0wqMg`bMU;qi0<
-7Y^-CJ_de%OSO%nwYRmown)V57LeNg?PPNO7{Nm)FQS6$>kwE?f5bB)6Mhx$R{>OEq84YfAmzcn`ew<
-=N2JfgDlZo=w0UwxeQqIX`Xiu4uoI-k+^nkR@o@bTi2tD$x!I37(7pZD|uU;pm7-&6k`_D^2+dS{<Mz
-VCfHfBmkanvBPz(es9CfQ9PwyVJ8*=kLx=>$--6V^i0#u4{18Q`NkCeR0;ic>lw}wD<3y-(Q|wp1*(B
-dwcTnuT{Cj{!kaI%Z+ro{$Q%gUnshFy-#mXE-rc(XP1{}AA7HQKb&8_>AiXX{;y4w!=Y*NuxawF*E@a
-x`MX_B9uG%-Q*K<B8%}zv;*aM)zkhdma?v}xxH$jt>HJgM4#YHR=#{umPhP)1``D6<4areMGBB(V<<X
-#z{vKET9llhRzI}gs{_0%yvgz#0^N%k-zkPLa_G9nl<;$~omrXl|V0~J*Gg7R4P$k};U#O<cu#Ltf*p
-phYlYT4MmnR?2bw``lKGmXqdGhi7ySAaJY3RGAp(%#*?A7JLhxh02R9&xoCl$;g>CxyIJiM%V7!Nx<o
-WDM~{QU8(_x`M_aHrc8Zgf0A-Dh>(N2go*_p{wU(Z;K7Z7|iezeDvWt*oYlMi14{Y9X}(bE@Is$P{a5
-j1uw3^Ve^7mm3-#n2wrqFPr8Xg>x4hm}2d0Ic=NUSq{BxXNzL@yU$A9TCE(Q>Slrr6lZ7el;(eW)6$s
-9I&EgiK(TT57BojAsO+?v8>gygwH3HLzc{TG<oNIyb=9+Apjo>7cyfAHan93VggV=4FmT!z$0Qg-((N
-RGO{*mLpjj{l3+*fzSuE_B1JfOIfCSdgfiq|4Ix}E&H0hbLubQ&QTjtMCb?MXdle3R!+Ab>JQ*E8kn#
-IL(m*Zllo#kcykGI~`|8CN}`a|cs%_<K%MES;RJvob`DjEBiJAcx8=@oF+fxi8qLI0J0&m_R}s~3i=V
-gm`Cb-?pX?NMrQ*&p=H&gjICGQXjgz*!f1-&Sxq=o{!FtD&FOPJ9rI`(}f6vdq+q-qg~U&{+qpBjs)N
-qbV3)dwvGKL7xN-bm)!E?(QUArU|IQO1fDHE=R`(wb{h?ugav#WoWDHPr!iQrZ(J;1#s4Z=Dv`{;nW8
-zkCvwT;TW71Q5>{F8cFD^11{^Ndj&gW*vtlgr}lk$?By%d;$Q+?c4I^r9ufF9G%_9aLC?c(#PVHOy^v
-t)AB};@lC+HDC~uL2p$}w1qij^`J6nlRTW92^2E{5p49tjrXNEyGU9LCbwPE<s?2=!;p&ky6KwiH8@K
-Y^UZ_2P)2S`&+YuyBhjcG0z5;Q8j_%vEn-{&YI^|xX7a11iFd%Y(anxMc--^*CbeIUXhY8B*2LT6pDn
-d7>WW5ClSN(v0DnQ||Kv_Jt9ig>B3kDF1wo1>yCi}tiFb2mrRi_F!nRb({71FhmR4oxkJq3KlO-bP88
-13Qt}4>2Rh5?LMc0*gj<&hl+k9o`pdnKc<8F@!QCQbkr~@%?G_Anm{FOlM<820@q3qCju-H#X41k${^
-5-q9ft$ucWL8Y@_>mvRt?3qm-1G{kf;GfoW;777K<(xCKFDb|4M2r<m|i_KWFmsy${$$P|J$Ap5fl4j
-G0pgheEjlfS`lj>9{Qs%9UnVZ6(o&JTa0J?qpiNUDoX9gSgPrc<bG|H{^NI+!Jd5^&Pij1)t+EZ(ahd
-_`q26+e>_m2q5#un7Ju|<hUEw;*K@xAzj+=%(1g8)-f+1{y>K+lI0wvEFea1g#W4#EF&U@x%}>I!@!S
-*LIUhCVUrw5-N3oOYI!IZ&;&@{S2c=BG~_q{W&3)BslXK2W;vTj$zB(z#o$F}KM{mZi6*8_@ik;v!rW
-7Dc~H@lofMSY(G?vdb`ZDPxUS)~3_g(c;)m)ot)-;dMz}WK&7zVtwc!A>N0!7(Z{U3I;abA?UHB`991
-leN=uD29jv(^3zcVM@6TDF52dDA!--i&WP-m!WoHwUmcB`Mpz+hDkUYGCbVfJ!C)S^3Ai`o3DdOWVYj
-sC5Lr$6gDn)Its^E9!+vOCq&z)Q(AzexIx7&^*7wb>j8(?^clPeJfgTz)Kf8QW&uYv_1)6nWypNko=&
-S>l3&Q}7(LPQBXI&_{yJm3D*t^4S;mlqv%+xyL?VSakb-?v85>_c-#0GCL1bkE6f715^KPe-dnNc1u=
-7L1cODCBJGO;NfpykdwU`+ejCXe8asm0SwMPc#1BMIlVO8Fu~LPl{k&!Tb-T}NZQUxB-QmPczeWc2fl
-*L0)NXV@9e88+(x^*hb*dHblh$(z!5AhBqg241n!n0fZf)()enuk=Ux0_XVol4k1w8ijq;8K?lL>?9`
-Vrw>G#MapDn@MTBFy1Wt+H{jR81vHX*eW_u8#?P7j?XA}|BqIS23<7?`YZ;3f7z6y8c4`VS90I|6wE=
-2kZx9XhOdcAEytc>6$oKUUj<p%U*BzmQ&*~kyOgcZ4u?u|>!p$EBbBp9v8OK&FM;1x*kC_PG&>|2m9N
-EP`#a>cabJp&MoVA!~ukDq9+NM31>C~H(kL;cgjeOsDerT4BA-3Reyt<nIX#irJG0oo4h8f%aH&HxS8
-vaRV&HxQ|#6B(nIE%jMZyClH5w?|M%$zqoIjB0h_zlep@upl??vwr(wl8F~9OFZ?pq}$mG%yNu{udJv
-RV`t!eg2;3r<u0rynqH0I_rRGoeTwV)`b#tX4N?7*#&ETPD2Fe?3~v~UqWXc@Y+>_SRSEM3a+0F&hF1
-)tifabEULp{KIfo-Pf%-zGG|oQ-1Nd;i|W%K5w7++u!6(>WYi%Lv6lV>HHg(2VTg0v{v1NqDX)RXVx6
-<%!Z|xHcn3KcLQ3To>(c~qvz9IxHnV|$5z}>a2skN@Vec=t{WUuImrhsB@c*S_gT_FG8S`)Y^%vPM!`
-5F#oYU0vSF!3Do%pM_*^rct;{8=FQlkkF)N7F2y*2~<*G{jEPW-jgYtzbw;MNHDqFST>4L@h{w+zuDh
-J4|z=K*zd4n$&B#UtchU3k?eoY}2_%X+~<9t5r~q|XlL<-!sr8fQ@gs(0V|63KV<w|>Chu^^G#(0&I;
-o2dbI`3CLSaN|@;Q@sqU_q1B<s4tqYcgr0XCz7Vxo>}`tL@!$!dwV!?6Nug6lxbeYDaw!F@ob5SOb<H
-*7LQohta!=L8(A1@^Lc2Y?ai^^?J|q1J4B}T`Ot;tj>9Z5g<N^(f{8lnVe>JNB#vR~OA0$&uyCQp5D9
-&;i~C)qC@ciwZHatoT=iWnZ%fQedySQBEdO#CcueAOP$!JHOCJd=yQZEuV3f-*4Vb`kO3`cEo<iJU5@
-%r-aaT&{;W`q|461U+`o=ci6}~%SA{W7g2|DaiM6tzp2a;lmn#e@}GtgOPFi~~7vcqIf1%b;>fJfnTV
-3ct3I+#N%r3;N!{(`m>re|+)tTDyG!&_b&%v^b^7Lsx;b^?8b+unw;GT34(Y-I4((kJ*$)w!BDKEoFC
-ZAYkPX1x`AYm_Ll$QriaiN)OX{GD8_F<|fHN{Z;jJGqkLz~>!{%S^C$;nLHW=v-pMj;E!%Tt)uX1BjA
-+G&<6;n=UWHz`gOMeP&H&8yM1@ci}DecIK+YJA0&!`n^lPQ;l62j$q;6rAdWS%RMoD=Me#IGO>euhXW
-HY^a<)Xvm7#7p5{#g!tDsdPl&7&X`C`r+VZ}QvIBTpU6CrHsjTqXA>leBw&)@y14n}{g)1h~VPmU~Y@
-?J>l4+N~87SFSo3%Lcuy2V5bZT;i1v*4dR|w9yMIpVRot4R!g@(#G6<Qc;{Q4HU;}0BL1lEjoFuBDya
-8g?1z{<GGmUv!QvE4>Rc`Y5v4_T<JE#*xd_Z?Wtzt<g(mayB~VaOGJ3~zJ*qBE^|%<2QDj-t%Bk+7x&
-{SIq_)?$q<QXR1VRL*nkbcV;>t}>lf-Oxd{(fy@-mo9^n(yDUAgcff@ZQg@nheB3yEZQo4UuWn8J8)p
--aL*kqH-xU?c2#JpwnM14oQ_A1&bcIX%;wLs_yZed*{DMs-!<3dl{7R~8{E8eIYT3zI0(v8-XM;%-*M
-g`fywzY3jF?zqpa9hy{B+0jz!;dIF-N%r($#Up2DdNC0ESY)%U?X_7FtFiS>KiT>*m>R1GZXtOFMD(?
-cI{<&+tzK(6oCk)QF&pIOA;cYI#scD&z&$@UyDze8pb7`1*66O9bf_Z=nhfQqZnpI2Qzme5%T%o;P6(
-3t~F;aU&bXzxvMG?*}K)&VNBO<LW@@ll1z$ORq+9UR4uMu=Ky><3S$_N>Aj`K5HW_CddqN@+hsWO99A
-{WGKb!B#V)+8;O{(RAwr0gbNeT@s}s-p$R-({IqIO-r~@W{(bOz_0M1jTU}@BFyIiS_|)yXQS*@*Ty@
-n?~!j4S*AAxUg-qJ6N0kx0{hf#x=Ax}bO22PlDNSh?L$ZHA&8s?!RWWXnovO>Gh}9g?BO=L_3vUNjAZ
-}4!-kR9$L}cKJH^KN<Js$Gn-mgg)`7`gE++g(5qh2j%qfI@1{X2dFq-;NZk7>s`zSZdV=6)C184wx3s
-bhuE1TN{uFMCU=<~)wHpTYoBcH8-g;feIFcYqh);Oc&Q%NHuI>Rnf#L359d^d809K?#M6DXG)Y>AW~S
-wyZ-`8enh*|GBB777temA$f}<#T})vF@RbvVz?c8*lS()!hkqkDPevw>wF!fVb?RGvbZo=!V9@u5Xdp
-LF>?o7owJ`VUJedffdE2K)fyakROE+gOccHx~)UuDK@VkU7>P}kO*-Sm_nSGeq|h<hOu{#t0dEf>H4Q
-P@~*`c2nHKV_38bqOGcPs_+;5mW3E57uB2KxK`kvI!akoYOBe#dC%a>+iMTPH{$wvIM*Tmn)C#vNH?$
-(yb!t};>@-*vg`GQ!3sj$?C8a0fl&VU(s;@y{^@Zd+&MriJozWct0?X{JfkZg-2uKd@t+Wd*XZUnr({
-#4aZUU>Cp``kp2tJ{~9d`gaQ_vm`C#H&N1BK19dTJxA4J%b<ZN`u0Hp<?K+jy4?7}!Mi?wjzd%a!L^@
-IPVc9wM~-i7#z1)ZV+>C`$rIgcpJ{bzZ)C|M6Y32?+&o)`9Aav}URx&F)f|A$09hOnWmJmtHfn1t8dH
-<G}aQGCzb6<_D2*Ve|mC&5RMsW&273-0VZbakk7c;GI*A@k0L>=P-`53S+UQh9Gm+6*L(Mq$6T776ew
-f1RQs45=JP~PgaO)8o+g?>;fopAcwQv&m05sBy`pVbK1v(!KqqD;Aj}(eV&WVosi(189Fgi{Y+t&xd6
-_(P|_VE`Oh-Ug0=s%tyD(bpE=AjmC#uSEW#`}iqc=nGLFn|5-LLgiw;u60LB9C3<3lo5y@&J0T(Bl#}
-K_pL&JId=Z?~0P`0kQ4MyDe7+T1#SAdJeuKOrc!aBE0=*mX;>SF=79Cbok{vUNF=w6qgavSFv`a}@89
-GD|e(0)D`GMIDliC5gd*2;#C+cO=j-)ETwIDwWUp5-%aW&^)J<?GZ4MtncVD0|qgf6vh-)2HtPQOQ)m
-v1%h*>U$bV+>ZG^%&67=fXLySS>R5Td1PbFneqR&F`q*H5E*S)ju1^~X)LSVC%o&>+gOP2Z36_Mbf%t
-};oo;g8nU^OGByqUAbffpmi?e#;f9b6<3HGpp{5RFMg@Q9FlNU7N4q|wD?dX0ku~^Zrx9Zzf9y13#_}
-hAqyhH~f8tzb-1q!REEcBepLq2PBy`pROR-J>r>ad?f3k&O=GRYle{mG>Q>VXX@P0B=RX1*w@@IDBFb
-{r~+eVy&|14cJIK+I-7yj1IoHhj){O2%BtJk-;C3yTSTrsf4_u<h8-pk`m=;w|wj9v6-+;FJo@wgG#d
-J)8^kZ}`~iNH(${ux25!#FB{Te!#}^Wd`Jl+z=Zg`tLRjI8Ipfb7wDAo<=4&9f>nofUA_ff||88y}vn
-mFPD)K{%H7*a;$V94_*E1Um61hQe%CPB_1M0wd<hS5Fuon|Pu}!d~ka>+m*=*Cby6KsTlF#D#)-{Eo_
-)5CrxKoX6<~mxQqlC=@QTBOXJc>>)zR3To<@VxuHufP#FT6aNE=@I2IYY@y~rO)ZoUlxLw3yTUr(pon
-kZLM?y_EYuRH&_b<%S`dn3EE0Z$c)~oiFkpPjEaXtWA@-9R(Ox|FY3P?<XhSo?`H&|c*FlMn<wg^f1B
-9X37+d0DBjRm5+AMj9{(Bp8D=<=<2pWNnVD$=<20sC0lcje~HZ+1?ghAza^9O-{kKX(tXvZAG)HKrlZ
-vfn{odVHtW&~qLXSPV}@c7J@z{ZtDR=)>VmVmeR8!xEimf#-ZICGKFXZV||U7D&3a~!)PjS4Ln9=X37
-yOHOKW5&_l*WoCzFeECUaM=wx%X3DEhmFP(0ZYWFd1lffY454Qg+QT0+r+>N7Q`7`m#OJGmYaF?suFr
-WmI&8#OY>0Qf;P5yiapOf<c$@{zIvbut_65y_XLis0@K<>)fBg3h<!Gq6?1zzHFJ3$Eq$^HIHb}D_>s
-eLD2h-J5xaSXNCVPJ++ft04Q=y1ET9@CQycosLw-$ddAJg$Q54>tkfub-qB(lf+ho%L(mzn3?(v-aQA
-%zP33cP#04l`omTk-Y%A;-e6t~QD0O%^#&)Cu8iw$dq&bM8`uCRr5OgDyKCh$@ap_4`@_8S_~1E#5tr
-BKl^5hZ30QjlvNUk!$aemZ3MA>adoj|finq`s+tjBL1hvp@cmp0rp36!^M~ZZHuBHXd3!LYlz5vuuI^
-dhQBg4+SmKwG(k$M5GH~IK4Z)Fdf0e85;f(@I!{jfKM2n0Zx40y#ct-V3UC}o^Um9J_9~wcmO!F^QHu
-x+5b%43K&k^@)%Ct@)=IuVt&2{c)(zEcf!?t4|XOjo$tZUgvImy3h+6@!6r@vG@RI65PS~LX6iHl0m)
-~~aFP!<5TIe!(7ON)_qoI1zt7|=8g_1WMZ?b8iI=#>Ls313eZ=apmT$eWC^q7uw~#Qx-VZ(Iw<Iy~IF
-uwN=C>p<2{^<wV192PCYJUMsS#`G4XF{U-3_tBJ-fj$j97d(U~?$gAvQt3)eqb9zT!N)QLa<%R3g)(h
-R!<Rj(?14oQLbkw2Sc8e2ep!6PxV#<!RI1Ul@d)ANDpHzRGbRdqk$P#4{p&?2$AW#}ESHeC<GkvAgjE
-oVGCw0l#)2eCtukBOuT&5-1duck;+nR)~4VPR${gp~^gLqBMd_aNF#0A;_x`IdSz%xd{7&%t(Ytu@*5
-mdKSay+B|HAeCts>Lg3xY@JK>uU9fof64FpzrdE9c&+!rumN{R%hY9I{8MrLW3qvj6eF#kbRWmh}1Z?
-I4hFRcvWz)C3aKuym6>UmrboJK+%+x?4Yz5cf7IfmU!=MqwMt+QJKLs^YV+uc>$Aj`FG?-?_m@D_=us
-V-oCvq_N92CNZ9L(pEq+JauE3-j-GVUczM1yL#_0>9KSIC=~;nd<N5GNCe&?s!^?&u;B+wnf3)`)+2*
-exkU&S%c>to^v08~vWZOR3;xRJc&)Mbd8th?qT;h-)XNeHrAr0M#x24}!t4VZ)}u3v4p6>S~0YeL9fH
-J9+{I>#y9Xj~UFy4R;T%U<uAi{Ei1toz}0Vg6%#b?i-z(GHm7o=9G8`wa7T%0Ko~LpHw{}`pyar8PZz
-l;Q;{+MvNCH!3vI50VzuwOym%BLGm1uj+TMy0aBK6t*6F7d*O@tWw@bB`XRw{Ot^sBh=r6U5`ml5@Gm
-&ZfOmEjRIQ)9OcJ+p{hTm@*H5mDMRLq-<8aj@r7U?}^{jQZl$vlP5l9VyZ|LjWC*k!b3w@_BD{Nl+Zj
-mai2uH|*RzQNwWnt2&_o0N&9N-(5ZJ%@rEYnWC-^L_`0hzx}G!z<qE8v(2_px8JOQ@nZ;~1RKfZ&!?@
-P;x$urUg(*Mj>%#3JT)3<Redp?+Fd`hz}$5tcyeXJE&O7Qj%J5WUtLSgsceaCp;<A`Xw}+1<eI?tn1V
-Ej&~isL7IJP4V!$TM#zkc|<!EXx4@C3&@C81-9P>Ru)kXt(qe9F|fTU6j^yNX7omlhP(3dgUG}71~&$
-Rt?wB(7`aGK7@Irc=C(f6Ct8Zf3Tc3&Ji;owAZ8mW-Qi&m1&i842^+eFI8Edx+-H26+_@0HlWHMW5yX
-C)8BRwCohw9^8lyYH?jT6xxS4+c1u%Q%#-wz<YptN{-1G&UZ92k53M#`DG>y|jgewp;&>AmdutSe3)b
-~ZYrxqCUPM#K-2!%6vxJ5MC6jEvICQTDzdi{}uLfT%^?aVSQWQ;O7a0^0+fisI$&~aR*gd*j@*qKm(z
-IFh)Snu{iqQXO25Ii%1i7_5D(%=Q)P`#38I-bc1$`#vv)N?Ds=u<>Xf-l@J6!;P?d96QM7*u#lS+8Uv
-#U~S>lp&{xOeJ*I1?T)~021v&>lNZT5ZHSR5kC$o7sM05Sr;lkgMhIOdC!UuZ;Dro(R<uk!~Qm02$>8
-4w@f=Q$hE*;F65MuV+oyg!H6j!;YUGvtAV6!yyNfT6{1i--V<iXbVV>DM9^x0O?enoqho@KMp21;ff?
-24MbgL%M_v`2lkhFnjT4b?1|zff<A|$590DOq01T!m^Ai!PFkxbhpM3cl6786O49$jeB$4K-!8vRT4&
-6g>bcY9B#M$e7%wRqdmzWy^hY<;{MNEM>z1})it~r8=XB8D(U;bDYnM)^YWX!LBkn-q+{TlHnf`t?df
-w{7e!vq}P<?xWN7hd030!GW3n6(f*8^kFIUVQxrJmq4Q?gQ=?75j~tDMfSHe$gk;tOG+L#++fZE-*tD
-0P=~#JHMv=CqN>SG|h&)P3RXMU#g-vX+u2e?XrgpPd^K`lukC;#RXejGhr9XT%fuMV!(?<ga;)Sb1=D
-B2sjmp1p-aj1{qb!Cd{BOesAH6-wiDG$X^Zs7FD3Pagi9!A7e+bNYZxA@6)ZjMaP6du4(2u-y~NE6GI
-*1VGIpM?i_s1#YR77K=D8Lw2RF12g6#O<`#731RL8sz!a(whYh(ep))6Vj9SJ5F#%#K5XV5w88IY=4h
-4eRm@s10avDnL%n7Dijs$`j5`8<Q632`fQ{Oy+psIwhj|jnB!M^orK4p|GF@o>0=y<<IeoN%y;!u2f2
-H)Y>^lT}Qk+7`DjUcj7me#BF0T762;X>lldduF}+od>W!BylX2Mo}vc(UHiJ&GqGYO<t{9pT#3l1v!W
-USGRp)hu>ci9(=qHxw~34?)_cSXMl|gjFL_V1^ck2J4Ve+%*~P(@5eCS5lX@wFCxnZe$rOm#)|Tmuh<
-sR}znOEX6Jy<3*Q8L5mMZcrcX9*n{9OF!Aqzg5iWT8@wf~dLDy0wNs!Fk4E~=lFlbA@U^p9b`9WjFFT
-eWRdv5)wG^-EgF~(xpBz~78MlYqX&O#j11LpxNcd;`oLRqFYmW#_nYMUEW+}GA0nx`FXd?@+a9Ic!&_
-k}U@-gkvnJ|uBw_`$VV;~E!WA~>dDx5&F`75&6{e1|9*)jw-VOCfwVa>!Fp{5eK5)ojd*()!~c#Glz5
-idF`_R3pFG2$yYTV8n?M_do78V(E}GFV(eJ!TBu14Pqwv5expEBR##qXDZ>`6v{Av=Aa>NjT+$K^VAE
-y$Um*b~K3htZW;Hx~}q2M4SZbR-({QDk3)MX1XpA*c#$R_Enl*b)QnkLZI=ES2U17x$0OADl2dEp#vQ
-k0K+7{?#csYeWt@G{OVq$xZqOu>VC6A8ZR9mL>wy$By`pR8$&}Me~2jV6AIw03njn6XlcYzADjk8dWT
-fkfbeK!woL-Mz$Ge7$H>+vqZtuLcYFz*b-*S{NFU#b)c@FNCu(tw4ADi&0>SrbKn3uj3$>Ru3KRV<zK
-;TN%Ws9u2@X$+!k-!*(??+FqZt~dw;%3O=4`4@Ur&nGW}~F0?h(KnbL`fq<7zr?zy}2C$I_tIL`@<ZB
-I;kkDfx8@hc!x4_9}@{9)&qUeSSH}BSg5Q@EhI5tKxE7OT}KcGW$Ib!AXVU<Ny!Hvr)?478sVFNLc`G
-+Y~g<pGbinjkYyht>euyw2;tQ2i!4B7>?XMtO|@J6K}I?xQM`y8G~gTF9=m|#FiE#M%=iXM&=nZY9s5
-DFknc0ItBaB2oaqH!)7+{clk+}G2mp!Omn~6X2|Hs?>x!q(Y)U~Lv9rK_s+0@EBUDyIIO?R{u(h~iI2
-ZPt1CD~DUH3jvOZ;U1O#;)_1GOZ99=ClTq^0)(f5@|S~G&Z5*rkw&{rKf0cFbxcPHW#b_?*rM=YE=A}
-_oMF-shS#NuT@yzdc{-#7sfrwqraLZl2B&5f-O*?>jQKGQw~O08aq4-Tj@@$nl37-I1P;W2~hhT(wW2
-nmV;v~e2)dR?Z?Iz1P_Sr^J~ZJ)s=af!ZRQ^6N_;tb&kjbTK<2v}+I=rkhU03mqVQ1+52L3@fR_7t&r
-qjBKT2*6R`7NlNL3wSox^8yCblih*bk;HSMj6UFWlkEsEp2TzWFw1`kSWWylf?Z+VCCydvJcgd&6|Wj
-o0)rk{pGd-tvFwUZ2#AP2K@|H<N*j1*3j{6$AJ>L)sV$Zl^Lzm(9~}$^Ss+e%j|fxdj5?&o`SCnRp2A
-(w>CUc$=0S^NePQ)d_~yi(?_|*@eTf1YYxEHwjW?}O+Q1PLI5s}hLpK3cG3ih=j1bMdLz7>Z(bC#viQ
-W_|wSZXJCR7atzhFB#c1VnK41l<`V~5my?uK#{=9u6dJ4C8cY{w1<76!2!yql&_+%?MtC?v-Yxm0e)X
-~v8c@t6r?!fQH56vEUvM)InrkX-CYR4D>7P+}`33%a@3@^!D+_AX#Rm#(Il6t{$|b*#lTV-&n}%@hrX
-(Z;==cr}mdHX-y&crIX(KKy|?#6n23ugZo(jt1pJ#i9dK1c2k1vs>^brC5Fq3I}`fIxP|88_g|*=dVH
-+l7nPWdJ)T=GFWOMp(r4FM9}Lk;A>~IB9@DxPlc!B6P)8i82psiOs>cIDXX!KcYUeqh>6zTCdbr2TKJ
-4~l_nO_O*e6toQf7NbGJNdfl?o)WCl8}G>JoGKMV<By&n&)PjC4G#ejN$JGbA7i_<SgQIV-;-C>p(Ji
->uv_PFiXQ-&bGIwgZBQmSc<%It{-bDhy5&r4P&Cm@7_)a*X(4KkXRL+st+++&x7+|ABD2DZ!j`LTG5e
-U)bp0mEr$LJVEcEl)5PPSde~lhcH8vOa_cUaA<xzv1W1`pqlpgur~B0SOgbmaoc3aJdJT-#|670iM#@
-VV{6dU70vEp(12{kzJ|5^nAr3!;y4|RLi)`0_k3Qgp!$uXuEs3acsE?;&8)4t~uFoh|Q;tJ66y;ykUb
-_qyTd2$dJHz03B)Y8XV%$3xT1X*@U2EJUa;C0^>BSMoO!BD3RnE;|NpVh=V~G;|kf@=Wii<@IKbO6ES
-voEwlI0bm-+}76#U<NM@3+Z7&DIv4Ri~QmQ^|QV$5CuoZCDh0<$FBZ79Gv{5jgdk6?AgqnO!#YYl4>w
--B?8Ucz5j^~bW-@8K4t7FF!Q9}3-O6=3+r8&U3;!Y<~>ty5p^5HrSD7|t>YSdXKp%5EaMIG~vZs$e&j
-8WA)RD|b+;drh~ZMNuEFz$D)OE)}u%{c(Sh)*je;@kGWh)*gh+>Jnrg53|Y;*xf<<%_Jio|B00m)ceH
-2Qn?5E|@3li)xAEwS3(CNvt<L2_fH*1e4wz=?p_$%1*2=RvrQ&9ze5L=jXAe1m*X!tPWZ4UUjfWZxk0
-?rF;a7Fa_Q&m`p+e$H7JygH1ZlE0cM?X)J!9VY4o9*Vh3P`?9=+7MJcu1Qy>0C3^X7&<POYCg_oX%d4
-O^2YkB^!^!3ynlH^e_@!VE1QUu#Ggu1wENO}pD2<>9sVLxnZ8r&JBCORlD|Z*23-viWIG_?TgVwH3X0
-9GegzHP1iM_5FTb+o+H>)Aa6+<#`!f9a=e7&oxPI_2}BHw`&el}*ul8o4bpqUFS@<_-^ibM}GOe@;Fd
-AProU`v54k|d&|HJ_lcEC>rEqz+Vt2ws3#oRpCH7bhQ<ykwA{>f)6dVkBn>uLmZMFsUbyuI!AED6ZYL
-iWs2HcsCT-p~!b4U0)ha<US4aA}*ZNylo6U0f(dz+DL?RhuS;t3v{vd;}9z_FIq_$AO21SoKJr(F=(_
-r1a=VIc-v~G=P(gUsWG@UfiQ`}@SN}koLjLl)JiBZ)C%;SZ;`;O)L<`;DS=hukpAf{f?vcVVhLwssQF
-;YXp_d`r3j2GU7JUGs)G6@X$K?dgvnlc#l3M+TS#wpbjxMJDnPMBumx{vRB$}cIvUy4iQKiRJ+EBH5m
-dLBFA`1?!BEos0*J&bs1P6{AVB*&s7c4?hdYq#&-iSan-y-C?uaFLz+m#D4h8($iP*-#7JbgI`Kbu{o
-Na|6CoZIp(g$&l4;c)%*SBqeXy#bJcYWZt!Bb~DWy!+3n)ThIufLOXy<?o|EeS+YHJJKnFDF7^2!Lz&
-uJ7D7c<!TJR`k(sw%}xLl%$tuaWOXGmuDHw2P;&y<FQ9xqZm*8(_-a(3X-R-AmBPMfoaoBz<R>`GXX+
-e#v0(wc!l7^T`Vy-a`T9)Z{COlcc}Oc@Am?06s^w|Km<497KB}@P5HLrR!$+-tQ&UGrhO_Rj-T!N+E8
-p4F2j~KJ`=5t2q6o0Iwl^0^DXSH*d}4DZsj&<#0XkxL;?3_OOo3}?03w#r>>`=Qc9IYPFl*TvJ7^<Aj
-RJbqNk%$<j^7wE~Ok=hSCPqjCi``)v46_^6~%(xcnXr1wXbs#O>r%U%JOJ2jWs`D84U^?k_ka9S0q$z
-3)R!l>SJW|0$*FV#kwmsxE_Z+=GLXl+)d(2!N)mR{8kb(5d?ws8l{RgprFyM~PlM)ig!kRm$18^u^?q
-&Z>~Dmda0CV_?Ont#OEvTA#Ki(bKX&#alb6_1q>9_GSSQ3~`8v2yeOx>Cq)5q^9!OP7DCK8_+=c-Vwx
-xV>S<mlM0IP`~WAA6&$I`60>M_H6Fue4&b_m%>``M1x8EGiiQL;%HkLk*!sQ#1enq170`3OT|^zB?}9
-ImC3MyW<1*S1PZ6Z-0E{Jc<^c1-8KO-!!lRR5^ws3lE(C1W0p8Fg9U-zNe9|#Ny=E9D44b)t(x2u!X!
--GAy6rt0!Fh9Lz-*AsY*SOgZw$%55G-mkvtJNwjkK;l?sfBAqGzBLxCrqub{`q<8{4#kaelvXLQo|6;
-t_<+$~@aw=^MndqDKKIIMd!x<={Rl{MDAL&>L<S?8IJzmnrG8OO2pwFd<`bsah0i?9IP2M0|PzZi7bA
-@l(ifQDVrLz_^k0uup}cbEz>SFyW6xP3z{_G~7n7p)(hlHFh{*OmT~3GB`4ub+;P5!ihKn*zA~mDpe*
-yV<JZaIO{+u^~(bgo1!_9QkWkLi40sI8BE442<kgq41Fu%h+7E#<|RCLJ2KS42s?`j>s*E9Z5Vuw3MJ
-B$ju|C_fzUwtX7f<M>1>7=NY0#%b3zvLyOkw+){>@`T2Z~2%=9p16#F%!!H`jTnJs{#;ZNz*G+=O%Iu
-Y9hRc2)4kqxuy#9|;6db$NZ{-#WP-U%ASwQXHZ<JazsVAq|wWF&Ge2Nvu9b%$Lu#ji`R2s8a{OM31!V
-62$ZRIbfj`R@Y6kAW<JX`;Z788VZgOx~ZE1J2+fz%tL>2q=^HCkzvrxD;V*D}P9III6>e144>Vg^z&<
-aA}b~WSw<xQjCD&Y{4mm>0ZQ;;q=PanBjb1f+{jMBjDX;bTfjXyrCU37!!JWG-d={nUHY08G#%dI|$2
-gzDf}?g0E6|jNq#jJ|pNV#i8IzT%|Z<3}2-XY;jN+aH(X(RT06Gz%Q-fi8$d#8F`lijmWzcU<!9B{!_
-qe;$I2IcPV^^i@Ow|#NaLkE(K)rARL*+nf0~%BSP?93M$ZqYQa0-!9t7TE(NL$VtF+J70X)|fq-XD1Z
-OltydhE)24p@ISX^tJGe%x(6@_TX(RAqJ8#Eq)n-@rNh?todNC{>oucN$`ybc!a)dbd0WTYdAk%^3SI
-NF(&k&dpK{4lk?Q8g*u>;u?wnlkJn<qedPAaGql@dqvvO0=VXXad(Il*0~1_XdeCXq*>Orh>$A!Gw&7
-rf}Ubp=R(v9o>q^^!?P%Q(F*|%<o6XVv$>nR$@vahJsj$`U8oOiTXe$;wgEkuFQ=O2+q0jL@#pVVFqM
-g`Gnw>7c?T2$SbEdth{op7;PiZ7(zim+(^nc_Gu~fS*CwOGpr<RjBCd&L%-Q%LE3Hh^sfYAV>lJ?%!R
-Phm!TDwQi4nIp6Qgq9D-*!y>oiZa85UvA}>W58kus8LS{QOfUA&OPMNWO`CJIY^neawkz$?uw52%&ly
-@}81m<NC+gEv#3kxj|atSIH(FG8E^LtFy@WyLGU}lp#DmPwJAZ)E20VVc6#1gI6=r70dvFXuZ#5z1d4
-nZK5JeR3zkh7JlHf995tfGLhwuJH9%#$OA&APzmLqan^^xH4s0%8oUSD6PBMkP-89kSEmC+5~djrd%?
-?M*kGuWtr@f^4sRB|phBB?N&Xm`<+1NT7CvHuF{c`H6r)vkoj;((`agQ>fqzAcg{Q<3#W|9zjKhrAG)
-#Sr{?++6|{SdP4@&XPEi~r)RVR2GbqD1;Hsz6Pcq5E*Gdn!pO(1Acrk?+4Hp;s$E*S_VN`h1@>Y2+J2
-N4Tx`*eb%br_h~ab#-6JT4)O-fhWpiKN5XsX;!77Vl%^|}#1fWlJ9Wt1s{TPdmyMQtqF91&y97fd$@d
-y>;T*n9bHGg0W7sDzzop6k-e)ESzhwwEjI2Ajzi-~NQg@8lza4WS!h-{FBjiPxX%MpKq0m?doXI~+>A
-*+nl5S7EH`)CodzAGvb@HI&Lu1hC)OWY&x_+c=XTkZPR`Jlh`ic>p8+T=H21$Y5Cbg9U^DlNtS404Bp
-k6{AFwp$sxLnSn3NKj6nA~4%oB*4gostJR+09pQWu5X$EGawAPIJixx;naplaA7^?+%;)Er-YGtUJ}8
-{PZJw;?Uswe@dv8}e>Lvf-6=k3fxE8}^fjeGG{xUdB8mD=ueS6%hZDz)>>N%6j1_5VjOZLrcmgX9Cnf
-^5#UWLwEq-SS=z!D&+sO$n_~m9$tN47%u$cqczIZ%j*vtVOHLwxGW)2{RpP`(jM_@6NLPm&@r@`Wcz9
-R;UId({x6`jT(`BQ=6Mz}V4H<c7=BWEm2h-a+NaN?M25;N8(#j<h}C4%SIk&U``OWB^6^A7IX&AOPEJ
-P1N?hXO(K5<JN4GK_(hT{d9^ElQ$**x3*!5!(~YhA(l{1Qzk-tqM4^p=!}tLi8i7YlVl5N9dOPZau)(
-ws;JL*ytiSBm6s~Qhe3AkCUGwjOhq=g!AOW-aQ#RQLMr&G+%@mBCDlBEK>S5j==GQcgF&r-y@qV7zos
-j6A}4W_Kmq?fpu?c6iR%DVhY3+r+!jhTWd<Q=IkE<whB1wK=~=VAs&ycVnL1090}me38lS%Un1yY5si
-{Y(Nls{#`(x)k%l-UKuT9Zr@Xjzt)TP?^bz*l3L&l=4+vrH4#te4Y!eSb*&@w}CybVLxDK{5FTkk+w)
-Jfevhi0DN^4OZ`=&1nxe}!5O@J-=(KLG-0*Wd7Hcq5YQ}l0J=Coj*X7xDaszY~+Vi)TnPO4C11sO3LI
-c)?3f*1TS1)lCIvQ79Uf{!u6wS%Iw4VV&&>=raigjf)WEaVdvc-E`9jSvnR;!vfyO;@28IPRf^7K!U7
-nwdVOSbL0qm*V8xC`ie9$DV}Fx?o<VQ1x8A4H*)gpZ3T5B_(Af&joPSg_6v{wfx@S7;ur1jQg6UJVyk
-J*6A7{tkuP6NXbdVQwg1Qz~a+>n6{<3g$Y-%lutcjP_2*F`4Yj;$}mcN77dNd_nV9<Ek!yo-g`1>mL8
-FshmrvkkIdo-yX;t2Gk403rRf;3jpJK%80U@aLvtkF7H@sx6LJ<=!^Z^Y%$+fV&10$~<e!w*zMM-meW
-PPSNXq(>T_6!Wnv4>o36}Z5aDb3-Db8$2B|8=l^ILw+4%#PQyTvhlDUOB445s5Bv)GivfRH?p$m=s~)
-&bhzy)#DjMp!+=$<24<dmsl*gOLr59jSFA2lT4hj7|c5AhPYT8HJS3;6kDbm89C+!>y-2mve`6G=kt0
-hHp!2yAd{<tKvg^_(3;1b6JG$hm3MWJ!C+Vi8%b>pz3bawiEG=twSY!_kjE2yg)V|Iw<4?G3@bgI0YL
-8<z*|t>0A{~s)CXeJVX+fLa^)Q0nQ&d7~)L*CNxj||8Ig77Q|k?&>L~vn*<?mRa&<oZ{&SM>;B+P$G~
-G+Zpp&Dk#CiOy^e8$sO%`Ar3QAeu!EKn3kN#fu8Ciw<rmM))hRAl-HJn7WXs)#0dIS7$}2x|jb!QyPO
-2~kBBE^l0Uk%YwFlYQ+1t*5ppdgBs3vl<ZnF?Chzmq#jEp(F<D(B4jywJU;TUh7-|>+LHZ6DZ>#0U*?
-(7a5Y2Wc<7e{bd@7T?vhZ67T%Zg@d-NmAkW57ivXq28tqIVYW#N!x7eed}8n+Mgp>x|WuP`u;8$Lj7<
-v9ZB*k-JQE0X4~QznX>Pt}~Pnwm6XTa8_|wO0Eup5W|My6kk(EC#=uC8;RWWmL!nSnFCB41fyB^a#|h
-%PSj>>?#<Wb#{`;nV7C4lncVZoN01hI-x*t@nfD#Z8$G-idmaKCCuza3nGO6RQ)6&x;fsvaVY9>E3`X
-|l7k<nY_ZPl|VS&S{0T#J0B7kOO^Tn1L8sLpHglT=Mcz_RbeCf#34B?lKJRy%;^QEvp5^lfTCIr^K`_
-D&@lryLHkKsB@ikHfCc)tE>ZtqXM|ES9J@A?(}t5>g1n`#s&s5{W_19seR>OFZ0*r1^^j{qpxu%R2A0
-5)nQZjL4u?69Rf18m&DOcYtcCM~QF*ij3kc8}{ehA*k?w4obO*^}1eC)jr_-4w8w4c(Y{K5hF;aye_Y
-iD0i<x>p7^?KiL~+MNzs85{#<<Og1+qZS6)PmTQ0?$pQ+JWpHsnan5!YvpHdVkuZFzf)>s+D-_n&&Ut
-5pBnjL%%?_v)NU)kDe-LN2R)d+YGKE<4j1WFm|Wg(LMZOz)6_2%M5%kfQGckn0uCDBr;Sp6ff=@#LOI
-Hpo<3L@HK4O3r~!v9Kwo;OLF2ZSbgk!-f=n972j$a;XKG`tpZh$j`1O{T%<>}Buk$Le|LNb*mA`?5U!
-V6F-mvj&UH_K<i2^N~zyA8{(W6J3EL=o)Rm(x-t45#RJnvmS>n+l(clEq?(~FW`;;qA6%O-yj72!I6`
-b-sV3;yl#swg(!e)G-k?d^-((Tg-&elwU(kH2}V+^6b4Z!aGIs;YmizsT}fHR;D*p7&0@!n;WG{0Fra
-RQtfEpYt$l{(kmt)tQYVGvptuT%GXj&JQ>Gdcjlk7gPTqP)h>@6aWAK2mnzTaZF>_cihZE006Sd0RST
-a003}la4%nWWo~3|axZ9fZEQ7cX<{#EbZu-kaA9(DWpXZXdF_4uciT3y=<oR}So!RWeAiNvrtR+L)_p
-fgldjKgK2GfYxX0JWj}jr7Yl>7!%8J_4|NYGj01^NJ5|m`e=~gEvmPlX#3<iVw!eEwXi{SEdwklUSyS
-xnI#WKswAe<CgvMSjn|9uoh@l9OBS$Y(#(s-Ih>@tZ<mWN64V1^);@p625!_p|r$3^^6!db`V)#ZYf;
-WP=0;wZR@+4`Do;M@EEdHUdiC{=Ejta$LC%s0;-1n?n<(=18Yw1hSb3GH1Tv7ANU$J6ow`#5FGGB}|(
-ukt+0mAYzgGF~ZyN;WvW`(yd)GESGPvM6&FF3eYDcFofGXO^3lpfsDT;sl@ybd1$U<4IUBS@unsUpFC
-KuF6=Vay*40mtk5~;~vt;ie)%uFR#KpoC4+ng<&y`<G(GJEdTPyY|Zi`QH)LFFnN`*1p^pI!4(UmIGx
-uIrcqdi_0L@YO+aX<XE-fKK^e}^>YwyF4Ht~MBYt0%i{vCN**p(%!ro_bTGkCL!t!d7oUxCkvkXBAqk
-pZ6@^zN8c%D8l%RHU{2^KI;*Q+<-Qmy(18hZ0%{rX5eKmGd;%0sH~ivRh*mSJA7S42$Es|SY<9z2NHE
-TG53D4QOsvwJ*X_-k-fW8kl6Z+?`+I6li)>?rt;|F~X<`Mfyf6ge0S-XpXi41lg+CW0&vW^uwsNqo(M
-Z1OLLq?wi(lpyef0iT3PaIDeRc+Sc*`2B+a9xCq+sm2m2V27wZct3G<)cTae$QiJLG+2%m6jUQpvGY0
-)=U9&y0irF#I7J)*uNdr(w)-%8*AT03P1FFhyUL==h)pvf^enHr-*C1{iJyr9(!=0;UXVpY<bvWAeh}
-E@Wy;o<mqUbc#4BLmj{@W<g?NH&OsPjq5GX8^6#tfLR6l{z>Uv{f;)`NvRL4&|3xMGhBbu^dRr`oD>+
-x$bmNUK6>Zfk;IFLiH0Rg_u3RSPpwZ30K{px{MNlX^@XzY(Fb)GBi!|d_-PzZ>x%z72$D^B|PIQW6V^
-oPWrh)Qv7uco+*@-2uKJ8U9BHVcN!tSI71vZ;E%2osp21&a=;L0s_<>Pe5&xP+k;ESd3jbo@3;VJOHx
-rseT#*mYU^T8dz0%y~g&b|hn=ZGvD0qaY7s<V|V7BohqQS1g4A&`<-0dn?dFz|v{90tTKVwj>xD`bgk
-FtVTiExJYu?#F68bSB$0!u|ZYJs}QAwBnc+<obpLw(Kx_0jyzFg0KpV`If1@TVdE)S1VHj^HNUFr<2L
-kl5>LimY=fv)LreAJAo$Qk2>inl%;LN#1wvG8R5*nR8w<o93k=tgV=;6<B~GWlXy{ElzY|RKP;XADIB
-el-Re9=t0X5Dq9_VkDSGZE(4T?&`^C4e8)1(lDST%QeNDQWW5A$SY0P+Llcu%m0M3#q=>0BHtM9+5{(
-GsnkBY+EQ496l#zOl&^(>#VLO6RhKvWe)Ut6;qW;S~m1{nm?BEkKd#yD`DCO`K!--Ix?9DMFE2Y#d{A
-XY$ujj*@efV?OkHJJA5<tYGEvP+fN$oq(v=0=oNSmMw>Mbs;C4f{vxKY@-coHDA0izE=24MIjAX^oEw
-tX&L6_S%}D^DRWb&_9DsV^b{9pmL{8Eg$w}I3(o6;1x%~5hzCEd;{3W81doD25-)(_qCk0+X7ZOg{fl
-K-3KCIEsjIk2PZn%e?~zJ0%7U?gus$?4zy@5}r&Y<kxy$Ob2An6P&DMC#<@-~7sX<_gwat7#jfU$I1b
-)9(kB@_g%LI^vRUU5JWCg+2Xu+Cb4+0J;Okg2K8)VElbpF&<+N&FOWaDQEyJC}2i0w)+oClu|CJZ<%`
-z!2cg9}F$z#p)U63d9mvaMZOh$mDMRz1?H${QMJX^<|hQ5^ho0~>kyEQ*V8lCWdg_Sg)lIU3!Bd5n)n
-xW9W24+R|1Q3vK01abr4Dxd=Hk;ZF|l@Bk!2Nbsyo8`C<vhv-3!+Vs6`1}7_<{9Y9<)&g{Al0uBaj#%
-6M-|!RXCN4y!M2YZ9SJV*eJb^D5&$BV^K+2~lvQF)pv|EU5HYGoRt34QRW)D}eFj42v;T*K_<tlIAPk
-_xG%KMxG_yb)2OCz7AE@0@*%6inWT1#F_RohEH9j<Cb0PK;(u`*f>c+l~al8^e=Z`POh>Lm`hzleWQ>
-z!fV4NzI9zbV@;wb^bg+B;W7ywlseFSm`!7FO49JLY&I9RhbLYxn{iD7VIA1;VaVh97|a1vUmm>4XLs
-twmg&uds0u-AoYk-%CXIt3upNOS0tmWBi5U5`+P1;J(zE|*C>CA>WPh!6jW*g0%lymGV+Y#nI`#2&O-
-Y}EPXCKa3Q#yQJ<y3uVKsykDOA;v1LO=2Wlp)g#TtIh}YTZNOJ>ZUYXJ)?+PSx7L}TH>8j{8bt`3iCH
-g(U;i*$7~%2f29=uKAR%PwG|exl)|LZl9kj}zJ9B6WR&r#6iyUzhZI!SFah=u5tN4AV41TUF78UktiD
-D4yi{A)-mb6WgeheN6KrZqjfSc^O@qQJ&jD#~xj0u#r?3sAlD^JIPcACqtMQgrS#u}`@V7NvQXebq3K
-~#5;|<jU&<(2rj5KZqLFWTO7B*`SFMMp0iru!uck`;`P-z0?pTWgZ-74y_LwXFNLIJ$(mtPMLtx#18v
-0}$A$B6+96P6C`(|Cvjdkp)nlTF)aQzaT;LE$PX>$fe?csE+Pr_$h|bNk`IhH`3j&eK{+nDEaBNHT*9
-T1&8uXL<HBEL@ln*fZzJW_g8s4KC_=x(M@Y*g+551}10<APo)nd1Pg(hwb2oF0|YB_Vxic7LKQAp%1J
-dl64egi^a`+&^}^88CJQ;pC+nV(0Y4h?uE`tu`eS0H05=NVB}hfb|5753;)ea(1iJ3=32^fE{u-58&o
-+5*N#BgM=N0sq2^I`=0l2UMFbYKZPB^`re7D-ncb#sQNLHCim<Xple~7X233(~o9X4%do`&FPFpl7s;
-f<!h8#D;RwS460j`dhNmh_9;au;?xgE8hPp{K#ov>)mqK58+A9I@?q`(SqvN#$ENqmGBv=OK=F`DT|M
-V7?T3ijw$doF%{;au;T)-}!ue?3&K>Hk1q0;<3Xi0;7*H2>lX6t1{@SOl-$y;igafnTY!%NLbdS}_T7
-VX>-WNTF0=3<?xWqhZa0bkb1UQ;aH-lHa{HtSRx#)gFGr0xc}6#Y1ekyfd{D(-5HzWu_@~S1P&Q>LzA
-MWQgSia;Oqz?aJ0I>;Hi^=7!4^KZ>`SOhD2`A|2FgmLwzYyCSE9Vte8KE_4Q=cUyIC!=QxgTUbG*Pl%
-cTxD&>^sd$#q@{*CQI!r2K3zh;RL;K5ORg~lnlAyWmB#lsOX0@RWn~~MWL2xqT5fZbQMMu0&1zh-}$b
-fUCQ06?$qXbDMo53>O1TWsb!6BjIpQDv03HdG#yZdT-h4Bh8`p?i6si^B*Pgd|%`4L8lN$5zL@n^Cyg
-+2h`{R<>#@doWn+({N>sXA%82~4_E#B>Yi2=^kIb8j~Up~wq@`}bn{hbBQ)uJLUNYbF4=2&*bkW2|=0
-j5MR1Ko@{`m^0{qSxWk<O_`eUPb_FCiNwdzBIJ8~@Gy#R9{x_)p8;Wu$dNu2T@kKH(R_;(RxSLF*4yL
-3KmYm9(JGbJZh8SalT>HPGp|tjK>+1xisOidXvF{`ScKQC1_?jY2tz|QW0e>sM7w{udV37&vyKw(Gn4
-z>&~C?Fg1|rl7>CN>>R~7fxwM6F_qAbRB-eOtAsD_ouYg?yf2hG(HaxyLiI@i3qBPz>E9PrS!qci=$R
-hv&ixfjZTccQzn%^D;Jk`d5;+NerXAWsC?NQQpp}p7MKuINba0qo9LIN5g@OkhZebuU4B(wuyTESHaJ
-9!5DELw4+FDwEj;${|qgx4baU>&DL1B%wlc(shsBn`bdfA(zj<U(1RGGd0zWz`(nqvsrR#S3577I8kt
-BL|d2vl%TIZ@V@$5RC>JQG(kwVhc9Z9N@$>h^pTbtvZ@%xXxB7vf&YMD%x4~#Vo>$NNjBQ+jT#lAvqo
-dx~~e@2#-ZWhO)?tGT8+15cm#ISTYWVCn$o0V32W#RZL>K0!}VPT7l!5(9ucP@ZN(qgq<S(q>(4;E3i
-|7rZ9-pQ~q67F9v1A-@XJ1pz-di<z3F-eaP00SCcH-@V94(^cVQE0h)zTSD9Isl^tcKA#LWOpW=sECQ
-IgdwpxlpS+ZKBKhOiSL2N~7(0pI_+18bM)V8<MFUm{2mcPsv&;bP{gbNzms|wUR4+Q|>W)`O|!#eREo
-#UmoSv!^X?1qnEsd{$Rm*ne=4704(<l~EW)vOuxBR_(uHO<q~>lP>n!OJT)y(Y|nFc`&R<3d5KxXM;Z
-!~<8ZXrmU(%@T&hVNFfLn;1Ox0}X$2T^%XJbtLHHNX(*Tzp-PZ*;2_df+mYpcV&FhW)yEWh;nh9u9&5
-bdNh)IG^?uwp;{AVjdKa+;-XP^0#d@Y_LS^EI57W)<XUopH`up;P(d?fOdh-Nfd|K^8wQVULra(*Pzy
-2+MVf*{1a+UEJ%9A!`9IEH{qu~ZFqE;wWDYF7yjo~#l7IvfIIo6cy{Kswt_5AFRf)<(9V96ZXmDr@nd
-pGWqR2QD(=3J_D+Mqb$|YP&_{ny$MUGgOUeQtdzyPcB7<9DvO^djF(lxTd9-@W&!GH0y9peRCWY8i7i
-JK9T&nhZOvbh;2E~e_oY(59AjQB~8Varj0b}&%Oc>BUO1zRu+;USGsonaJ<FKHRe5YORFn4tP}%{Dxu
-6TTb;^sqgovzDu6D5o;nIEr<SOfC`x?zRaC;*bNzAa3a3<t0v5UKVJa91g_52ILYUp_-t8fc?0+jHSs
-Ii@<i!d~e20R^3Qv84534eR!sz>zqs15An&vi;G_y)p>}e9V}@~jW?CDB7o9vpdPbv_px?2Nf7w^p~a
-V?%9B7=x`HU48_T1bfNle@trc!Uy}YFOZ<xg`q3r^oK}!Br5xW-0v{0F<6AX5mHntg?bF3#IQCuvgdL
-IGa@uoUb0+PFWysr9siLL07S6WeP;84ra6$5Y!*HzAB@IHI#Km5c1@x-BiW^kyDm)PYIa!JjJ34HDa@
-<0v-S=kj!mcT8AnT}h~7RxHCBdpja=t_dYsIh#SX~A+RgA+VIoN;K`cKCaA9nlxdzEp?p>kTOm2t&am
-?2-ZIZC0Mh!LW!dF;*bbJ7!l*`Q(6_OWL9Iv(Pz*EJ?C83KuaR<H%vVDaYu^$r*RtkaMGXeuG2IZdjh
-jQN+@*ecVD?ki8S~k2^f)&^kEjhjR~3V@-+^Y?ZQ)pxXlKMv;h=vNxf4ZaZ30hK11{hS|po-1H6KLJQ
-IZ>;|nGNDEQ?udvM~EI-$rdKV3$4jZbffVR=niqI(3`Owb-;Ktqzrr?@r>%M0CHnGYmN1gr9ph`5$zG
-Y}w3#O!}5jB??fMY!JR-W&nLE&~RgbB8YOSH(vg#nUmEIh<%JVyJwTpM_D<p!R+x_YQD40&3wmc0yvU
-fUr(tSFt0POVspUu}u!>ZnPl@=)%eUOHEr{gj85$MJ9hKk8&u*n>9t9&o}V%=wN&{~Jdud#^%@-rtVP
-dUHPMY~7aQ@t|sbDd~e)O_F$e64iy|6Z4$GrU0T-3(6-(L9sp5<-`Lsx(CA|sC!??m5nNC)gL9?(-l5
-dbxAFYoTGYypu<VFDxW269!@tSew@c<2XXHW7*dhiHU=>Ywabp^)EddE7-6FXIi-$3k_r-z%)$zlmgH
-9@CcP1QZkds+tY%O~9#lM7ohj>#RBbBinp4~!4*vM)Q4uGLFprZ*kD@Z7Aao?|;O24u<Vo=4FMs*d<0
-p@wJbKg?fHD|8dK5-CVUf+sASojS)YI|fAS~7_0@>t`pq7;^#hev|2f$)4U}9Fz6hL1BpoHD9B=8uMv
-+kE$)fLB3cWGV&u}d$usk%j-C#-j+r&~1ibo?d8F@?!CHT&1;U4ze8|8Z?gD%;Wruh)Nk8d>%q=8g+v
-$3>x4-*)VMt96$Lbvut&f(eQr7}{5WFcR`m6%QcsG|!MNb1--qGf!Cw9CVpvIjF<P5qb^78{(cok@wA
-m&vycQy7!Sj-QP%`_82KtET-X-ft0XVj8Rrtj{6XnyS`WneqgePIg68IL-HO7;@LFDSg5{RMmHGR?IY
-0kp6nT3&XVw>FI=3xpH>tVGAq|%&IH7)M7tQ5nZ6l6e)bGRroTM?=JAtf&uTFRm0D{1t3FLxTKGz|@F
-$ST9`De?ax+Jr%n%JEW;_7=WK^ws*-ttvR%yT&2Pq7NM$K7?!Dyc3=mV)2eXpNR)jc0Y;jc%JpN_u#s
-&`$GPNF=VdGMTOMNhG&QE`hZ#df^}iVI{M!!~tEJBodGG`&7r4f7cFb09sKp>H1l=}GUQYd}EX`RYp#
-8KeTSe(Ft7nO4J3(p|Gj$);CQ4#<86<`(wgukQL#*L@VMR;khDZ0o&POf(3Vws%D75aP`}{mcy0v4i2
-E6noNvZAAHG7m9vjlJueb=$L9j@v^k2))kqyM3`pF<umBbdOeOO3rw5x2yK<vvqv{io;-qwbZGs_NbT
-JiUUwN|^b9O!k{0|>5XaCP?>f$@SGWm#;M`HMiEk?!dl1GhWU(Vr*o<nuX2?jcV=;HB&fzLbLV0GUJJ
-C#^VY(@=D0^kmh<I%8n2mIH?@w>fkj2JmdY?v<RXLhx<p`5)6az~Z7Yz&MIVLlr*XXK;7pQkfiKItmI
-QL<o%3(3{oY-Cm+UZW{Jxq{K@7*Bne&PN@%VygVTAfdaJ6c{;OU3SMIgqY+9$ipqgKDNQa*a)~nSaQ#
-a){3Sm{o^WhXa{6rHb=Ev<%OG>0=nBvh)vvth`eE_?|P;m7=MEQv>#$xt8|f2J>c#o><w5rPaql`Z<(
-M?`0z(ct0cP<W-IS3m5OOitwdaZyD)}zw>^6u8K7XE;r(oKjQFwI39kyxSl;8$_tZrY-+3r@Zomz`p5
-0O7r|@p@)p^~h?&52k38D*4RO2g;{qg-DR7SAd1F`=&(a~mv%@C(t9jQ8!!sRU7Z$E(bW#RwO9m)kza
-tLUtgd<9`;D-jT8~ut7|^uw8;{l@b2R*=F&0mDt)kVk!-%1{c9<?^ey2QkFGI2LFVBb{HFCq)U}ZdgB
-Tq$ZfDsPEe-|_Y(d|VM36yt*sM;NVwv`wWr=|#@4u{C|Q%#|<-ac(Nyf9%CY{jM(&S3gRqFX%jYd2|K
-*<Vi5f0w<bj7vOfrk6g$hqmGvYR63zIP*ohfx3rA<+m9>Uv`Rbt!>IP;byaM#dB*VdzDjXh2a3xzte^
-Te`i@r2c{<TB3q>qKRdO+<JkB$iPP(W1&H1j#u@(zC13K2)?T7>!t5i)F#l%ub*<9^4tCi-1G%>GBlF
-j{ek4oW6JF%EvG*TPXlKsCBp}tcuTaoOB{snNZ`WIy1n%)(Y~k4DIvXL`6r&Kd3{Yo4;V6-Lmsepr%F
-;#<wqwQZTMSUQ`|(oCosOTbtV>#oVYBPF=<j=f@uOtIZOerqQ$tt|4>gkoKjAue$s<T^m__jhcmuL|v
-XT<>dPOO>G@i~`mC9Mo*elz(XzG^SnJ^H?6OCT9<lrL@$cX*4if{ZYseMxFUudos(UlPoKeZ#`Adut4
-V;Er({O#=Z=+8W)J;obJuEOaxUJylmFWF#{32_Fwk%YX4iF`7g06KwZ1%Kn$e2E-1N8}2^v<P^PNJ|u
-;!w|XsFlz$8MTOs;5tc^*3>+$BpLuUXJY<3y2olPw?d%mL(V<i}EE0hhFv91jFHcTJ#cIiLYJ+u_Ul(
-I52+HYxtljK2mgsx2!MqO|t;pnrW8UO&uqtPxKbvx`{8R^hH1G{946ze-2-wK9Iw>S>U9uPLL;nQU!B
-I)F>%+qJW6Q#}XgLt9Hlj&@tw)gPSO(9R9s|X#uNdy&_@p|rMYLJv6&i`7WKr{&yl>aV@ndJ-d0XuUI
-<>8;ZyqMNt}dySTTEwu8%LuDol2`5yi0jK?Ltl8ZOwib)##)0mfHW`dd-4b!+w5S8Sz$%y*$@#!;F_Q
-yOpR{%h+wFKa@Pz5^Ek3gE;zMrFr0{a-rA15>{fmMKG9WW$=e$5d6WBzQY%Zq_x`&B&I@ei^$y8^3b%
-LV@m5*bAoKx%bBfAwcXlsXfaaAHT!R1tQfjfdD7o8n>E+IJ&Y6{x_oWns_Yde6czslh<m2Bn<f_ytJU
-B_%DYk+boA~a-kO2lW(dq?qc|naa#T;ze%1I+FKnxd&H0>}vDl_z?<2SbMd>{uq{RX2?aJtZ858IZ2a
-fk`^6)o7^ck<OvBg6g_1LVGm>tjUs+U;P-gum9^w`yn{Sd3p-tI_nQh01FJXQHm_a#8t-Aj^1f3|aV4
-`s50;ANO3GA%F9zoA}?N&zEZxc0z`_!^>I&6+iF?zxnV{|zKL85E$)Wbn*dxXNB=RFHWLw{riq%8X(i
-TTC%Ro`gc&bJpoKdYxwrmxtu8JV1@w-lF7iXpi4;m^r;ZcK^?vN|V2Pc8un*iYNEg?pV}Q!B$24n}FK
-4Jduad+I7hV_HUMI?^BgU)!8q;@b@IUjj~la0*z;}8F8-RvjqLO?xxhE-lAbf&2-?*L*!NKZ<kRPKO&
-i^VZ7>-=w_U=MRvo62*z%DH<Eqs!5?~eqWLZs$A4!_oP}33#5lPx?izM(%`)p`xMmRk3DtH6;Ma$>)>
-mP<o{zJ9{s_~17kFZC1Z%u_B<>y?p(E|l!ICGJ9pRmupb+3F6@W6JBH4`eKQ}Dj1k*hHd86OQeY;}oL
-2!x}dGKsp)Hx|6Tydenf>f)?p_&`(+qYTzK4<s9_SqwxsS<6iLTsg|_7!K}a|ChQ^QRK+!zjuzFDzb`
-o0svFk031Kh+`<prq@5MvXXvHF;yZ3B1M1?m>fGwqL`P7Z|Dz+x--0KiT4h^&t<xI{%e(+DcS`jOdQV
-}#N9}ItI~Aiy5f_Qu1N0)slkjIG?T*1>0(paaIu1E&WZ7?lJ4okKoIuchDGcfu|d8MT9goYYe)YwXPn
-FmbbB_e;;>YH<ge^gp5=?ibi*@yTS-jQL3AB8E%4aTNy)602i3LkW^?c53v0DT0N-=Rf+Sjt=X~{X(q
-jvv4zWC`?_8r?gh|5JTOMCK2nXI}DS<1g`l>Np#8X&0QJZG9(Y|(QPfWu-FFaY5CDD|=Qt7E<*)5j|U
-kpHkKdl&znCDq-^z=EEeZ$MWqcYZBd|WKeF8p(`w1=wlTM_iabX9_*yRbD0g_UMz!ib9E1)=zwZRU)Y
-)Y_rZYVG_zi=%ez1HIuzPBh8cDxY$$3OmSkbA@2RQz~Q~DFu|6BR#=~b}K?-(*J6o@^}%>8yGynhxXz
-i2t@2-qXKY$cx;~|SX2V<`ZS5>_I79&Xf#86z}^Cgu~tO`m9fX184;Rck3g2!E@(AQ>8ZWNoH%~oTpb
-^l9~@P(YKwtyeA6&1zjF-`ugh(e##?#p#p%Xcb2K*&+E(_yDc`HqyC>uX4xFl~xR>RK?tD3t*Q*@SH7
-`f<MizU;yg4S2s}hjV?sufLDhLVtyh{vHCBa(#+Jo>@G5JaivdTVEFhcn!OtLxub~gf%6eBuiBNzA<=
-}1F9BBoO!;bmR&$Y80Lvr1OOT3n&w8U1JzS?oet9T(!<diX}?Cy)p!K@&_I;s}W<ZGuUSuC|TQM{wYf
-e8q-43{IfC+^1+VsE4VZSwA8Z)D!;aOS_$x%u7!yGZmHOzub5K$_n+(=v6KLsJ*Hh*e&aZ=GAHVk;n9
-PD@hc&M!TbdRo>XydhSlEu@LB&CG-n{@nbh2g6<yQu*NXDjENXV4Fq^?Ub`zl&AWy8uw+<h8@;4-^`g
-8t(+=Mpt~A7Q3#C>?xS{c46tmW0@a=K%R4Xm6C~TGl`gqzFY3f3xw4Is|dFK9}u*4{vcZw>fcp~_(hp
-UIe%vp5FYQmZ2+0QIRZ$X1gbM@O0RD6u=;^Po$NPv;2pL)UL*{5#BR4!5qm<Z}VdtuEmGUcaDcq##Bm
-J#`BuAhV8w9J-)usr&N9etl?%eQQu#A$nc`DwObWsDae4S8<=Y!-YAg2Z=6!M8&0_>LcN_*QBz-vuN=
-!LnGJ*ITT^lr9O5pmkVEv>oGpU)T-(41+j$;66{Yt0~f$Svq8(U7hs5>A;@&$<1{+X;7vK!@`3^EEPL
-<j<M>Z2Rrnuun>nMhKCl`Cs2le&YwJMoIb+mZ9EF^#Y#a=Sxw954i;lMT4C;6biW2auwkP@FW+ySzeC
-;}dmIe@cl8)P7S9yFyR!;$muGdtWF2k_x_}}`S4o0rX=31D*}8c<7nd;{{I)+{tT@p|WL~gwMmLU%yQ
-?Q*L|h6a3Y4qEblRj=hj+t9SYf&uo?~QVb<>5u9_$R2Zeqkr=7ky;Hqz_xZhP<}zAC*0q}!Pgt&dh){
-T)Uw_6R2E;}+#xsNuXua!SPQ(oM!gvdt4`vO_zwlAI7PLEvYWn<S%NrYVMEzt6Mf6pvp#1%9@_CPtvh
-<Eoe^-B-o5<IH(ojFm=wqc*molgg>I9j)9EUD&Qhsz||d;fHy8(@t4Z3$b<|nt`vq?g6T531R=`Rh&c
-)44#`}KYrFwfptn9U$}F0xjSbG%+(9;`G{Os#1D72d7K=i&IzIWBt4zNptx!2Cd^|HGLNO*&b3(y>r*
-o*VQGy*@VKZ|-#4TK@3R_<Yf^mz*0vGF6(z*M<6vj^#URQ`BDiX+RBjGVh?Y&Slx+K$&Ml_2=d|j@6`
-XmRlhoOfcG&I19`&-I!qR2fZ^9+rCY!`C1LyeXqFwDr69kszmWU|oE*}}?f3^1nk)rg<xH`>gSIF57o
-~(CqdHZE_wQT`K4B4uOL4hKE^xTNf(VO&CHHs%LsIKd<zTIfY@4*r<&Q{BW_a2s19LlVOZCM?Hrb$Kf
-&j{ZMQhl2(@pkxXUj$ngtA^Iyw-p(6@tfFHe9x>`K`5vCMdM~1>Al-+-IAngD>6J*``f$PB9`@O>ktX
-IA=T$CQxVSC^H&xpMl~x=wSEu|8Yotv?S?y%39smvx*9*f3<$_uAv2IG5rEXcUD!9Be@&taZTwgtwOb
-|KCX8DF+^=DmU!toMUA_@#hjz9ISzUB(M6FEJEgGtNcMAj5ZmC19T$9}3+vQE(|DuyVd1c+vBiGW?_j
-Ah;LmXSPu5uZ2$%?Yz*Q1wtJfCCQ9rXh6z1rHhqYNI4xb3d!DIVR`4A+r3${dS_Th6i^VMpF<^+i`wq
-5Zf~dRSb#?CmY_q<3U)_e#yz<<{l_1-)z(Ry6!`vAkbW;?9`vW2D(NxfcZs`)Br2Zk73>zE<XzZ6_UT
-{!WczK1NZ(smmg&M@`?S1-qwQnmy2KMGysbx8OyCV{f3@2M6{o_@E4!ly0)&Q*xR;v{L81_C?#><NRP
-|97W7Z`3C`oy9Ws9m=_D8j1}p_GT@mF1IJ)nk*?ISTO;Zi{QI7#RWlW|$;zLB_2gbHK0Nu*o}V%krya
--Rv70}3iIAA36Q6|kqi2oJF9VstP|At&;Km?j>-yQ;6dW~Yh4j=n=1?4fsm`r#k<6j?^&V^NU<**nEF
-U)~esFQ<*vrK!lr8+n5nIA0Lo;IfOXP`{rsLStQ)7w6!Sa`gFto@2@~a7W5c25t1_N#auOXewS{G)NS
-^Z`U$`FC@`y!3Hzt*GCUA>`WO&!OpyI>^YgtcA{#x>#}vuT*bKhu5Zfw|UklAxi*vh<lGUa~nY0)jp*
-c6F=*F`&pQO6y#(Fo)f6LM{p*(Q)vK{9gQdaLqRBERPDHVJDW9=(R?Zzwmurm|f4{JJ48N0akXvNAgV
-c&R8MtG~ysdFE>rQj7s)xaVHT=wB*@V>NaMm4?OF%s0HLDVl{KvhUJO_efwHj_1D|sxULbpv=Y9|Zh4
-iv8Yiyh+9u?|!%vsAIG;u>35$1(J8*T*TLhw*mOW<vF%D98Sbq1NYunMfTCT+crl(eE>$!yQ?)YFJj<
-w>sAUby%$U~<`RZ_qq4o?m#U@2ubKZL5cVEcIIh36J$A8K*pbZUQ(b7Rp8NVjB7>gnz~r8B(u#601**
-o=k2Z8R8v&}yae+%4=dUW(J6J3`5l)gt|YPJiwOiN?fp=j;UML$=;^Oe{%Y-}G1(PBR)O!IR3Irb6kC
-A@+goveDsL^lfbl`D$VfgRN`KS;}(Q`c60l;OxNWL-620XoRH}d!19-JsJRy(BCF=5Pc3Kyk!L&d-LP
--O2F&l6TB8Q#Nv6{UQG$9pi>ki)>glOR4{=6U3}gHV`|a*LXSD)7k8-nQuBCzRZ^rGzQOxD@WPLr?v$
-~(st$rHy6&Yu@QNW;?57o8=f#sfeOx4IQOm_9-P(lPHd^(FE#Ap?cY1THCUA`)PXGSHr=cOtD)Bo3-3
-|d&c`w=p&!7rjB=^2JQZ@mUVeo#=QalDpx0=hN$fD#`c*BBF0~f`!8OwRN3{D;zNHD?Me+Clsn;^uyr
-{*b;kM1$>O&X#k0kb6#vE@WD&*^$46cHzJtL!l*-nO^!iqW^lui1ripZtfnBX?^3k@o&pF+e}xxr=+j
-I51(4Jaw4_JSWGJ7ZTvMhqAf4VvjBEiluOfKIlW)R{B}?6MeSAhnf=Km#gtZK6Nm3TVH+PTZpscP+=#
-1x=w6)NsaiinD*<W4;}MHjav=+U8niKd}i5kssS6p=k3`IYUbJBW~gytp4Cd`w%QJwoqKNwYA@*)YIq
-{=g8K|4`UQd1R<!?d13d{OSq@yfBzdEfQWW{c3C}@-t(~v4FJvi`i@VCc5T>-fcOc-G0hFym(Zqa6xZ
--(5V-`*!Kh47xzPc&h24+j{T_?e6_0RqT6N4;S$Yn(gX{->B<3TV1;Dy%)35c%E<a;&AFaDZtEBjD5l
-s!#wSBRdC-(ePt*1^B0TQ!48IK3vn6lO^w2^qL?DI{J>gNviqlJbhtY9b2R_b~5+i$(4!Sp`R^J#wDo
-TI*KBaU=ljY;*AA+*)7!BT40YEVFFH!aUjdo@{6v;GQ<-jv@KBWFgs(^NtOuiYMJ6x#}nUfSejMEHgI
-YyCBQkg#b#Sv{gLt7SX@`&tUG`YKF6oL++W@$E4j_yXmu?wj)3vt~(*Wg~~k6ZCZI7p2uwTL1-+&F;8
-|g@R+5#ik%)?=uhiZtuBebJ5r_}gV~bu*vDzIir8@rZx#sHovF4A+)02oj_WM!ea7tGbKLHOgD4JRb`
-Y<#dTkOA0%?m|?#H+A(-a%;&z^keI3)NzNew@o+_1K$33hgK*LE$pqBM>Jwi+oh?bTv6y&BD6GVpr$h
-%1;u2t+j91Yt7I^0>TOn1;FPR*T{$Rd2OevkAY>BEzf0OEyM5?m&Wl&Y|Y)CN8j*KmGZeKN(;#5bOmj
-QP!yGCRl)23tcJ#0G{K)aA3OQ#w`>jTLw?GhuI1M{g`FTm)T0lFORL&zSJJ_`D|4FHu&?i2aSmk5S}(
-(H0uBH7`o@G|CJT=kHP{!t0uI{-8tbV_ap>;OFoO6iOG28M%-7?;LMN6Sio`Pvn?=ugp%Eam21YheuM
-fPfU3Y^=Dw;Y1+Fm*lm(r=kt!0_JEEhY>E<X9%3_rqP?oTOA&q(+7wpIy8jrn2e*=NTm56#LPw`sR4v
-KN3-psV)_B>Q<U7g+A^bi?Evu%f!V%RL{G+DXxCA7*$jTVTX9lGo=2f+!=R!-7?ngs>$l7Qz|g~z}~C
-Rt7dT;TMwr9D&J0g+IgLWwX!62;ky7&-_rWJl1<0BD8JzXOP{GYsHMnQwq(lWg6bYWyhn0xitQR#sRX
-Eu{9Yro~u61K}VPSeW3M3iRp-70CidY!+e#Os~l=1XEe9Oo2;j<q9n@6a&|P23&UMOI6UxEYB9o!m}@
-(#$+{-N4C}`8MY=h>!<k0tzyJ?pwW}@mwgfvRG_`ig*QfW8zjKlV=D=SNs)EY0H>sCN-a=m3G#`+#cY
-y|P9$8NbnF%)nhksIOBCC%mE9=gtMONTDZ^_bt62<fyRMu~3yf+LF7&x1=2lemG8Rm;9RlK$?AiQYu!
-^Z_lW7Bi$bu$P+*-*!f5g*e0wcwwv;?#g>wwW(V65R?38W)NQJqG26M#*f#gCO+e9@LBsw3&47sq(&t
-yJ*wlKk~`yZp7vaSfC_FR_%p%51sFin4Ma*=N<hqB&21xy0<xxkfS8RT;|3FiG-A5?Gja%Yh=TQh+CK
-fCe^W%zO*vz95@55*-XJOIdT0!x^KqK5jjQ0`q-%szfGP*KH;oDwO5Qa9k84d)4BgV+zZ0rI&J3o!M6
-x`;{L{GAWLIBC>C+L}mz4I;~Y~oCSY-P6>W35a<@{02D>cCQfCMB#V0ApJZhTUxje(qO#_$Qvp!<P_S
-BJ?2cWEh*LCDA$_{YmBv#GDYoG>`K~6x)S8S}<$^Df86M_KHa=S#@-1!Rg>l<XC$f)QTMk&w85_&TO`
-1D2>n|d)?F1vD_CGaV;QfeM`aGQiVzZWfffchE1?EK*3j9CY)YUVh_UsxJPA-crms!E%+3=1H^wz}@v
-=YxYGI9+MnDY1>t9*_ti4y9eec|gdIy@;z3+k~{c%XrouUQ2~R3gu+gA>z2nlPAezLz*P^D#QQnOMbq
-To#bi5JSRlSk=+LjGO4M@N(=!0ZxAInvcIUUZ6?fEw`!)<Epl-n(GeJ^tRe-cqxy4$bOfwu+*8&d~3U
-V!`dOT;n+%IJOcNE)dm`xTqzuAoYm17k-V#gR`c{ZRlcyp6&|{Vn$|Dh7Jhu(MXtKj3>ICwYVvH3K2A
-d8Z(4_N+>1ln6HaQ)H5Z9!t|ncBXj_`wVtEnDf<HQmN_6wj*4NVn9j<(Bjp+yW*unD;f)9)WS2-q08K
-62_?hwt}*8J<LgU4uFpMGf6-j_hV+Y^h-U7(thCb#3SKXA#Wq92l6@Y)ET!n=@m&o07iO%#qFqo9@>T
-)wlD0?`XkisVzg8uF9J*7pXNckU0C>IcDVP@uT6A9-d43J_rk3l7s4T}TQ-C5HIG9}Hn55i^XqVL8Wr
-ITZozGiuCkK*Q#x8T+jnsDmHhx$&D98+d)hReDb~qEOzys>JTqG1qnQoy%g&yL2St$Y1asN@Z7bR?_L
-GH*t|dFIa@VeV-LEs@M+BBF3r0tOlw#)vWKf9T>>4ldF@|n*3BU%ce0(<(y7{UpC%oy8_HIN5e}I-aj
-O$EdZMiBORbR;4WBSHQwyi2<pYqah8X23p@(Cy8LxZD>m7pS2qpbPhIP=y-3kloe$cio5QMouKkkZwR
-xy@$I)*n$Zl^K*i!Y?wCz5TAzQXr7oH}7oR%{q7J7Qoc_zgxCTS0ek9by8CF{|oGR;|&AMN?9Of#CdJ
-6lDM@SU#XKYP0E@7O=&Y7a4BqWS&AfmI#bYY?3LwB1d^XRSSi5<iW5dF01+PiTw7qVq0-Pl2R*EcAK`
-5>OFfT9x-0#6P6}6}m<0zPyanxV*d+q|LhpBn~(>D4c4K+sZc=m~o|d+pXL?-w58Qy~~B*`la<8(kZ{
-Net*{$_qnRjWP6=A%eCLP>fER$1tOifuM73uA_VDn@E7Oi;B#9*%gGhFK@s6<HN}Ar_vzg(ZZGZ*qg)
-@b$(-de*Bk}XMUWDP75#yX!XI9K|NQLvBa!!oPIwH0KZrH`5RvfEdaCBME9p+(uvgJ>ZNnMZ&e(2`Ty
-9*?Ss|jd@WM%2a-^Fl2_R=Rn{i`!mL{9vigXyj)69SqWz!YOVCZUQ!8*&Yi*5GiTcRk1$BJYib~al@L
-9W+pH3||pi~?gJM?4sk`_4u<%tr@tIwB?hellwd$E2fpM+PK#X1x=>K5ed*7inwkRqEsDdL8lHRmoD`
-R&?kzl^hxXK4j}3Tn!H88ObYYVKFMBoVGc`maP4ib{nk@k(Rx+qTFyhk66NHbEo)T>|3_>WU@QGkND7
-9TqK>;N~6H86VuK+`F^)@4W}GX3q~aowC6(*#NK%UdD}(fhgz3TDAKAMk^Lo&19E7xTyWt+<0zzYo}#
-1wEF-MYz0V?DTH_ewfQl<YOLU+So&4OuO3oXot#2iM*Gg8Ga#glVez@1>z4efwg*sU2x00V)rs+TtRe
-H)Q)wKBRE(gIsWQ>LuCjr~yw>Z}Cg1CH00Xo$^q!gN^PNfhq=$NQwI@^Ul&lB*D%RQYUV>YX?>vMw1`
-{LF9m(8~b0ovYeJLB9-5-?Jmp)_ty<Ey6GGkf3`p_+9a!?h&{>7!NrCXmvB4@F;cBZ9)K){Jr)$!s|o
-@Fs3b2T>I`A4;?-a;kKsoZFtt<_&<~^SnizF)qS+JpH0oqkEla3&LAh&h#41{5ZZF55CQ{WE~YES(kL
-}+(-6)3rqj>jP0aarAl;+U+nsON5DRZpyp|G4x?)XjS)92s;UI!va7mtC7AN_ea5JguhMlNft2HY(OM
-0=f!0ch+#aW0x8-;UOgmnqWn7_E3318|TKt*y9)up*XoZ~7a9)`gv{xd9EAxLFJ{7&G1*-y%orLhbZ_
-S&lq}pxCE4yx(xer&scu*3rJR;rFB^g$r{8lc0_^D429y2=G$wQM+Bi&vi-%En&j#L^R2*W|R5aqhh!
-X0be6RmdWt#@?y!uMA8)vfpyp>K4PWl@&-dQLupm}as9-^MILnqtk^HZ8DZ)Kxw}L4<diD3~|7Yw8p7
-SoBSNqGZ)_nFrcFW(uzU)&oD|h!>Xn#~b(-7WmIG^XG}oE&8SzL~7@!2c|v4EZ}VrFgv6r0ko_PZdBV
-#fP{Cx&>k)czsQWwjJ*lDZF}aXc~m~7^V&2`G!CF~HAQOOB%flIwR1yfm?f*?$}q<m-9zyV6B`Z2|AG
-y8c#f$)D$!2OX<}=#nRqQsHylP4%x|QEQ$b=Yw&*FIi0`=1eM9)?*Y*`_UUSfJXPX=ahJ#?c<s1TmMJ
--d=JxS7rk}XJB>R7qvlzQr!ogQh6O5)+izpdUh{o{RXi*;r%LC2_A{O{^9d@Q?|C1tB^=A?P3#qjBG5
-=L`6E6WYf54vVD{dUT3Km^WNIK677p7iJyhb=y8sDQn{QXag2G{;%_r|*~C5`?X8zixKn>ASs+#cdP1
-eNX$a!;#sRncX63S{<005y~2Nea}3?M)Uy()fRiOr3=~9Z@eYiZ`*H7z7vA}N=1-u7ZNMBJ*#((byL^
-eI&jS;f<o0DoMNqJy)KuF+dM1nFuj!mQ=~^T*k8rT;%EiR0j6mPk_=?~K%P{d#h89;Rf>c&6pDsPK`d
-84sB<g{!Zz<a+HK|Z+by?hgWDKvyY#IdbJ}XEWsRlKo#Wn$Oq-hg{EUaoO+{3|Pb&<2E8<0*VAMsX+I
-vuPAILkX?$A~vr?IECX7>!}#z!;VRIKIR8gD$%c6;U<ud^lAn*Po*uY1rwoh4{X2if6ohg05ni&zg1t
-(%y14WV|0?^#PA!1};`Gg^WxPWE04@kTtb*qJ?}fveJYA~~xuBrRm$vWFbYxV%2Hvgb{)j(ERbyx4l<
-j%^F*<e?H*t+zjU#Hd*A@$llH%B1XQ|JrV(JB@Nr(zHjkP>+ZkA6Z3gAXvWtU3*<y%V#(ftjRdqoxAq
-&d@>PCE!1_7K~FEFpD=32<`#lan%M*%+Do<*bUq_$)Ld~WgWbXbr^gx!e={eX=xQ_FJeqf$7_!<^@xJ
-Qa47=uOrsj^<Y?WyEK8t_d$F&r_ukFOv?H&(`T8+B*^$ZZM^p<l#eb4h46V=N`W1>vj!9T^>p#JtD?>
-+7oC3S@cN^vfCXLGys-FMpC{e7{m>c7$6zE8pQY1`N0-x>VVy6WyA#2uKTE4aPdcy_ZBO#wo+wnqN9e
-0oJT8C$C*PP{e!i)ToEmn_GfG0)F}=jjIX#fC+YrNLFUMr(a>70PQzDOOq8T>h`Q`iE}6ndG0Q*UWYS
-NDCCfIenmXKoa|{3CR^Q+Jn%mI+o4bo|(&>_6{!Eb-Abd;{KSh_u}L-d1$wnOGkgV3fkiuy^bj3ZAj+
-!RLO3l@Hd)o!w>P($I|W*5B@v5(dzupZe)pD@f7V<2-w2n(uXg$_?Cb)_G|yhv-NM%_;J@ZjV|r_^D=
-EHrX#_ZtcIhWhKoI!OSZOvIPFe%ZTbj?D6+3oyx5_Z%_#y!oRZMXA8JdqvAY1W_Gl`}+iV*<ST>N=Y$
-0sy+2WyLQnf`3ZF!rhLPD84pzwF2$6XpdeC-BptLQHBB|sN#iAj1Trr6$S(B%L+GaYE!USPF!7=k7@O
-Q0Dd6bBpdfCJAil&r%|6$mOX6w`&whIQhTM`&)LytdAOBRUf?@2gfgNmeJP{cEHmErkl<zUdB~8t5IY
-fDcS2<5UxFQ5>`giO%I+u)#Vk6dI52?OOWOc9}ji&=`sOqL&%v?$lFnDd`?+r?{!@Iph%_{zmoFJ3bV
-3?{!X##;))hx4zy(8ML~(?W(Hh<uy7$OvrSb`lF!+W<@RO_R6<mvx>H}+e)f#a^1+}x^!N;%`Cgm)~~
-Sj+fcPWhvQtGQhvLYeNV=5+kCo3SV^>>rCIvZ9QE?iY4<N^wH@8kAZ~k(O9RsHESKrw@0BJ_ezv&#1L
-J?~J;hJoMEC~E`rg1IKYecw>8}{x^5HEW2GZSme{s6!xu8#XB8fzXJN9eukpmamf|c=tZXIsr#eLMOy
-E&zG3fP?9RbHP@sc8%{>pchW+^Ghjg7un%cjCFVQbG7Mt8gsaWo()Fe{jt<u+NZ4%|1d!7B=rJaNY-?
--;z_c%kLYw$LfwTErRs@C#9<3J0-k=n2_61Qnpg@c`tj&>$jRhUf^u!9P(SM3j0Y})aRBaog=hH8vdi
-cpcYlJP4Mj_PR8G1zrU@%7mXVR#(k#{hn=|&tb2<v9ljeE9(+$c-FpB18{*92j#0(A$&N`>35Ij+HF#
-Ik2q5cinbO#!k5wLFYZqJ19TgL<<TDAQ)#lMXR<m+X;mx0W>3ixO=AzzjhTdxO_HSMH$i#9t>|!6Gp?
-$EVVM_MjiKH&Bdce06D)t?ZbDYK{>@uXY6xIIHV&m#Wt}{uw3&xi=Hrr}5>AZsHqzuBO$f{x0gZ@;!{
-~&m=!hO2D!drciitZO#@d4Tit8)+98++cyzQgTCwP^<>Q_+ImI<rk9>P&og36l4jrg)z`UN;o9-mZAx
-?FE{%(bKi%6*#G14|tEY?OVfu8uWS#O7*thD^9d`<G(W7>f^!MZQb*T3Bl5BvYv9Rw#Sh^l`nY;;I|x
-mW}?{FX|zxDHkfR0<la^=P_LP4pRGMupc_liZG(QD<t(136vLM~Y|-T1$yQPw$GqXQJo}l!4qpz>2NP
-salXy;ll5BeY(<&>8xk=tO@y}{Fm@>S1g~v`r1SKL47{xdAhr%i%e<^Oj@UB+)f5P~Y`6u-Mm-PQre=
-t{HQH`(Z|8MAjc?h3+8`FOae+S?op(;sSpcf0j0&-XUZyDm>H0y&n9&kdDCd-@<m#-#-{(}Bngh}EL4
-R$ixsERVrc<<m_e9dp!T}}9(r9ZrS!=p`(#<`*%!#Zo&18+x?LC9hBuT@c={{0775SZ|?eal%U;k2Up
-Uj|`P&XdjZ3RMF5{sVn)M?qBw8ds}*&$_OUuWI5A1!~n3{M}VIjTd3brdg8ZRG0sLNx%K-E;4Qks2;q
-@JhF?*!gRG3U6fn{IIEs@z?dfS5+o_YGk$*`I%3Y0Ix_|YmPS}*#$M3Z&KiUs=vf|r<n;(YZ}<a`+KX
-kD0&(!MvRuLtkI&>|KS%}4vjTyBdelsBvgC&8gW%76#}UP|*$P%cJij7NL_ogh4}X*oJ)jiTYFUI!38
-jAcChTGt97+kBF7>4XflsI--SuZlmI)eoO<%iftkP*HYQWd$el;d_jTe43=5>u9{A%QNjSt;5=HaR+K
-wz09D^c+W@#F<Q>8uYcbS~)cguZsxSg>5yctc<PYM^yNsr8n2`OcbIzPy6PIp2t?_3zHQ*=z=a3a|H$
-fA6fb#0%gQDx?eHJZTWUjjJTg^#ye*p8Bt-VwtI3IE9~{Jpi3lp!h8Ayvz&Buky(XSmspLs(*LY<>F&
-D`4^d!st51*gO1v?z2$skr0*ZPcf}-5S(wlBFp7bxU`_ty2l=F<J{AiTwLX91TOZ>C<lcneX>a;fHx<
-+lRIW_mnFv*wXsQx=@nfy@x%Sd=VbA{kx<*kf`TF(i@AWL}6lgnCwUAkkQWY!T{kOx;jkhx4#W8J{GS
-PeUa!+SOXR~E_la^Zaz2mZM6<^!lOe5UPZ`%x~jXNU|a}6?~x($WP5)o@u#i^Wu66f$Ppr)oFb9~J<#
-qjVj_&)*H;<%^?^7t&Aaw$Ll86zvZu<lUYG4!F*+d)egd|@=@isl|tewYQhnY+so!!IlU;@H)EU0vA5
--d2@dZkr%z-nv_$P5K0e3XF#C>cRb^rEiD*po3_4_2x$mtLW2)WhV6@d)WEyb_@JC5*^Rf#i2|A5N!3
-MI3Iujd$mY>f^fM8$1(66Wbb&gDw*}Jcit=C9uzn8*5;d<qoYZChoNG3Z=2PGeWtsrvOH)+#IvmfZ}H
-K2U6osJBUn-7DQ-nwpGf2;Xpa=gzBhHD?0J$#>?1%)oQZ1=gHiCLQLh(cue@!ocT9Ijp!<8CyrO>b(-
-ubV-E+V2aDHf%(o4ie`mmH|Ls3EwCU`9mGB&m-f|TL>h55z`M_O(5Q0~^_!N?oiqShN#J1%f*t!oP_Z
-@Jk`pNX~=f)s)i;vR?U6Kw#o)=Js>lIG5Km#6&L1N!UbGdhM9VtwykCROd`)!8cD$sM|7E4HHpMT<CH
-H3#HAhoIu3IfI>7xw^3>lXgh>s?q)V4Cu?9M*6;ca@~>NTG>zOeAW9Xs$mcB$|HIZoR-;=<^eV^?bQ-
-UV9PsK4}vq!N+|-CMZttk!xgX}x;GaiUNd+U@C+S1L>9U2w}_1I0wIhW5b35g7&{4>PywT+>E2JgfQw
-5H$tJ*cJZ_>+kr`y~sozH~7Vy|K^!HI;J@!J>8%H6oFP>v<+tetQ<PzQPRiv;xIFNTMp@|C4_MDt{|M
-;%gvlu<)7_<jmnPEaZg^<-q8WBK#pxZ+U@<jwSP;C$P>l^kMtMoZcdgZ4U#-07<c915c-@xW;JAEUEX
-I7BNbXT(0uoh1<-ile{t$2Qaqyi5Faaa|4I=g-wvcs*OEvg3m=}s5<ZsU4yty`d+sO@iQa)Z5to1d(W
-%XRa)N)qa{?fsa8$As^8heT%#vIj2Y@Ksc7BQSU#&Kfq%!_^4-9yCz-OTG4NSUQ;nYxXd&l6KZ@F3<*
-m3Wa(6j`S8N9a_NEtw}W{7>4O)fyr?Y5D@!11~xu!pN}rlN|Mj5OICYc1d83@7UUp8&C}ng2=rNtCk`
-vdClO1wGHL8zt?v>EcHKTd^%+59lzZPnJB$?lHPt)gsr$!_!d8E`$@XJ!-TYz)JEym8G0LVZd~>S_s1
-1R7&-tgF`dUT)ptwy|<!GLj#0P)3Y5HQTVygGox@AyIr~kUw_<Lm}`*gOw=Z&r8x5k6}$)&GvRWALVa
-eqR_eIHn?B(TpwK)zM3{yFjAgJ8Ky;<S9mQjBdmUZtx78VmC|ts*`aF>Ak6tqqX(#bE+KPxv=tigkAe
-6NX`#e<f2`@S^(RD25YX6@wpUF+m&Hn)~(JOk_)w#pDCCIEniL;B)!C36oX;!m5OK<u%4<!%K_>YS!d
-A#h(T0vHE6#GY;aU{?#n_Qk?6?V&c1{P?oF~=?^?j1{SP;JDRSBrr$fR6~w%i&y-8K^d|9wk7sI9bnW
-%2$N`~eBD54aQE;U_X;#pWlTr=K2~%^L#YlA}OouDgzGtQ{(1fLwYzh@-;pb-S&MsIK-e)e+rLM*U;H
-a+nU-LNr`ryHX`cUF!Xasp4X~zHrD~e~q`~P_wWVw`0-v7^+f2z3@MurrZ93a_IkAs_-ttr}@vzCV#E
-%NXJBfqORS~~<ww@X`~)+c})VCz>+xESeW0IQqPAVC}N@`&XO<gRHs)L@P00Q~wWxIR1zZrp)->IaV%
-K#iOFSb=C~jOQyc6kbe*d59Z1G3*ALB|9GQ4FY7gda8~whR)97akmgLtjBa7p`OCJKAOc5M2!XI-Er{
-CuNre7U_az8aR%Rub9{1vr-k|c!Mn?&{GTbX^e$?lyU)~~B299^{C&N_z4|z1JTD~g=3p?O7l=&S2ct
-lWbnuFbkQn*@0Z>Z=1QY-O00;n48F5V9$GbFh4*&pRHvj-40001RX>c!Jc4cm4Z*nhabZu-kY-wUIb7
-gXAVQgu7WpXZXdCgmYbKABV{@<ShWiAo5%5v;BZE9QDWr@4>mNvcES+k3CEJZ>VYKr6t(zd$pyYG1ck
-OWCcR?^;W%8`~p;Qfsk&kHb%B3rQ_SX5<I@E~Afm1jlC!nw?ns^o$GJz=r95mIF7gjK1CvX}>nD0vYk
-a&JK-a*<Di8=l5lF_q%3rc?5}GAP$M-`g`S1-_~gL?n`|X}%H?1Or|aSutUEt0Y>6MZp&Z&yz6X`hhf
-qr%{&5GEB>cz)dFNvxKiW+9qtCWeE?{=Ve)lIrKo2%t7S^XoeB^$W3&LC=Sc8rG&dE1rdNqXXb|)+-O
-;Fej6s&AUk0}Rf^gw7&4XN9bKxm9>8T3l1+ktRawa!DbI5rk%W@XnCDG@$wcb+#2&NHnRn@pW~a}7_F
-UsJwBS%{m5YS?-g^%NHnIV&58k*><`usRqxHuT+GF>Byvw`Ck8vI1I>Pk@t}k&t!SxlcuW>!SEH6`US
-88)y(Pe=<$F;b;I|Thh&_4wIL(o42{lh1_(mR9{hmhj%DXwpDg}A`uFv1n%0+++ZuGEeo%MoPy3V*}L
-m(}4{PwD;?veJEVSsguo{CG!d)b~)`kJSAOb^lV`pQ!s+>i+dd(0i)x->7>?_aoJEq*{)Yd{1`Ow)z6
-PP%I&+d8!hGnmOxW73K(~fB$DM5HhGD`6YfOJoUZHw@~TvxA=HtHk+}-y+u~A>j}GIB4r8EfnQI)DRR
-w9`s4AjlI8)E*CJ=DDk;T&RL_lOs;WL>!F<1A8K$vfdNXFv*x{IEMMo_^%}VC(d{i@~53)rm(u&s{Zr
-Ep-sgJz22O7;#XmoVk;c^4bb#|D_3fb%`EcuV2C@!)Wuvd=RUSeP~geQ^@31mfVcTz%-^e~yj@MO@bk
-V$sS3xC|D_JHL`udv&rq&#8S4SjocaiY|hVkMHWNY;#e@+e&8ClmJQs>Gd_(X>Nn$oBos2S|F2Scv(8
-Ez4D+pLJ8Y&+j55612eTqB3#BseQuyw|bp9Q^e2os$kkKiZGQ4tf!i72Nj%h=lc(q$Bbor?J9s~>{~2
-gylEs|#e_v<OrBONtZ$_fXPV7_;ZgaXzCy^NJf?40?LPEu3Pp(W@nF(8`8mU?A(h7b4nqX;Zo{|F%!H
-GW=XOBZA}cb-E372%jm#56`g3;lVcb`sW3wINb->A@y~zj{MNidXr1!<3sE@h?ThC6zJcnL>(=zUOG|
-I`JZTBuGPD&0UczVT4Kg!2_dppEL$khTM6AYEMp7Y^T(4^VR$uaU)luO?`@f<$sb2{m9a+|Ot+k?A@^
-2B2gnZM+Bq}=<X;}7GpHFtmkQ|8ym1B1sCW`ag{>vAyzHbFHtzxVdK$j<i$>A;(8Oc7&~LL@Iln22Aw
-FVegM93{jx^EmzS2&2J$BE6dZkfnUW{`9A&e-UJPDVt^E-Me?k?0lJ3Nz86Ji^6EhS-BMQ&#HsQa0mz
-s&`~5@;O9^3r%z9`EhwS<?c)1a=M67^$av4PlbjYXB)VzJT9t7tJt-R{p_F~HdVWC(qeWQbFGg?-BN=
-!Bo9l&7L9~GS1UF$)sf6ey3etHrdd^|a2xy<p*9^uDv5Hy)$(0x}@<yt$l02AmSq7b_Y6cr=%J7QGby
-|jZ9Wk<%C<EOPCILE0d*&k_VTJh>v^7u<8l5`bh<jOtB7u?tDiRS_vXey>I);Fl=gywCpbB*Nt)-E8k
-d%SYLUiey$GRx!Ji+Y9k{gpV1n)Cj2^sMu2~(ay5SwF|<jZi*OA)~?9kpBHA|;OpD_(}m<dT=RStJJK
-!R->LNEx7Ok}!opzqXCq9a;i3`raTyFonF<zx2!Dc5l*8FW%6{G<J(`9W-1nCMsJ!>!34qBvI-3j~e=
-Jb5PpgAR6uPi-SPlJxU$p6++0=iLzP%QDMNqmpoZe+Pc0Ciz{hmf6w#2qj4$`^wPp~uj%%8zP`l@**M
-uZ)0$lgl;mt73R$9VPdIXmM9n4^g2!V-S(H>UKW+&*^qW!C{np1VKP`E=M5+`7JdyND7BU)z6+#uxtj
-tJ7ky3g^qHQobMRK;FMvGdUMHP)|apfRHXLSnu%_9x)Croa`we%c9fwvlOB}$VC%Vk)CTRNf*hksR~X
-i}&}CI<=4jLnPe7TO_aF2fs<Re+$kOIXwljwywbegs_OumH3I-q3>ebs-bXDx}rlDsN;<{Z?}0CoObq
-D*`WrTt8(mjdKO`$t*&cNzkpDC)`jn9`9K}q0JCpgUjshb{qpQA$+4HR!9&9GQX;OVHAu8Rxvrg<YC+
-@I-G(t6*s^20H5V2J%pVS$G*1)g!L@mm1bi{<Mxz8W<19Fr+WYb0B?bDniZ=sv51)<mURb{{+ni5!89
-TMmg|JKV)k>(_NfC=%m9{#D@ZdeWVPS~;IQgKj_$0Hh)3jpLL^gmfhc_U{VOWz^t_8(DyqJt;!PKF>=
-AjAe&m@vu?Q;9rr~0N98kwLf(%nu1zuY__43=j9x3<=<s}HM!c?VI)Ril&3@WY=p)IK?^Dn^DB10Qcu
-#=?7OA@Oq5f1Cv)GYv<JTGgnVc4`qw_8>vx1RtLi;`oSm;uaMtHGM4Ec>NGVx<Joi(Pvz(Jbb7Fg(OO
-RhW;(LWY=k@yx5gdCw4+P!+U$eV(;;cP*7}+kdAsJ5BK@$t2%bAPv|OVXFlO5;b|4slrmhI5f~Us%s|
-re3h4LYi2A#R#BmWh!Utd7jewf@syoSk)}?U#epUK*7e-&fgh<7ARV-K#R{`Tpaw<sXgYdrfr5nUw0e
-|BNTg0)q{nDAOqpTY%E=%od!uu@beh@H!z|=(!=KaCP=Q*dGF)(4532M!&2FgzMZzqq2-Z`Z!&z0r(e
-_@-Ip^$Ws)e2;Voq`t&C(ds%KmfEbRI%4w+&yTpZ4&9aaNsGV7_{ME5iot<5u<!2k78MZ(<<7k`pXKO
-m(yH%5=(tEovU49xU_Yg99qcr&n2q8BQC~2l+ug>flyfivuj3#Y=mn4V>C(lk&S<rL=(H6(BIo|0`xT
-N_>O3*uK?9Xl!brRA-}&HuieNXov7|x9&#dU}jvbbG<v|dkxGRvn!PP$RsThc5R>=h$%JL=%E}@k&Z5
-<Pe&{RmgA04qZVF_$naXDu1HEFcO^I603&Y_A=?anawT;#u$8_}3|qBrq8qLToovAsab4s0_T}gSEih
-5pEno;R>unlCk~*PiZbd`o3?S-T8;QEhq&<b|nobL0s_&i?P06kZOf9}me_;CIPR6#)+YZUTPUlMF{~
-OJ;13pEacBe+`((a`6wrMQ&9<Y3kWLqAaHE&jC**>7cdOt<H@_2uqWYM+k1&<+yD5<|%WlS(E*qvc#8
-?B+JHo&Q;qa5lQK_3GyL_#pr)xAFO`&M=7jBPDLVyfr9%UWa0PS5SEYNcJQzkphV-Y6d{Kq6(eQj^!9
-Uzi;0yG4t7(H=VL3@twk<CxYfh@M_?owNxOw0use-Xk1s61_#uT9E4%62)HDK<x%N5XhmW4_}G`=1SI
-sz}>J2Z8N<+#J0;PTHm($PYvSK-I&z-hjUW~8O>jtwe%vq>alyE(&{R_6RT>)_+lX<0aF0QC;$fEk;s
-i72IlC)?QM3j;PLO*y%E4TbQ|N=>3<yGA;#GzLETY7oKF{`vlf=wHR^JzyqX?e5h(T2elhiX@6j*sL#
-G3D(S2sj15{BxhWqrfenLC7r=Pui{o>-EKc2CNl5l__O(mjd<tv-M?vbOE7twdI_rZO7Q1keF#zySNw
-|{x{-3#V{$Ean}k{D3nNy|yDk(F0Faq`&tKhH1Dz8{_<?@rFu6JAeaf8>n-z-D~}w%cHD<lQ%zK6(b!
-tD1py=ZY2+F)jaegxc(>%(HS?7p1h0bT(w#EeXdtQT^$_v+h<=`*9!lI7!qy`TbAFOAjUeQ-?$C;K|T
-*6N~nE7>zc~XG6)?f+w-HeAlqY4C@ipAxGo{ol3Ruz|el`dH1y#*O8e$_4?guovTs8#;9vx1Ub@}LhU
-2h5p;TRZwNWV=WUDsPY+1D7cZY*Jl_x#1EcvJQHFyy$HtJ9UY>gtxBKCoib<?;<b^ZZ6rk@8^HauZQ=
-`dW_ex|U!aLQ`NW<KRrbNBjnyX*eQl6soR87&|Hr(Ll7AX!+r5oM12g-dOj+P>6@Q=b%+TC@N!|k;6_
-<^pP0%Zd8U2ovhden(V^LC6|z6b2$^~=}C>^aaK(bDKZR=HXs2{t;1UBe^|e`k-Ix`&c#w}3P59kG!k
-du$tV?VcRw_+0hhcBTk}UT&PD{&oEZ&ET~`RnU?JkPE9k;r@6`F}8WdxQCSIwS+eKYnv6k*_MT)hE0w
-G;2EorOUM%K3rhE_eJ!O;^P~Q#d9sDOI<xr*W{wvPF~`CpT9V{|%w%OMBR^RpbDZ?)GU>M@KU%77>o$
-G#_R&8`P?JlB@~>#y8TE&*>5kb>@94E3Z={1^G+`rh%t#$ujkHBZTOy2R{LR#CcF@}{SOV0M!VXb6JR
-I6?haRs}#VaZAVb$7d7snceWJL+JY#msu<Je8x&e048prh<?qgE<FvpQYe+&_9C_a<a#f7CP}J`Gcn;
-CC?Hgh(wN?fz=O{cL*P9w~1>_~M&w?$+wvH=l;oVGW|L4#DmrzbOyfAo!!k+pli^(G2gm#ZKZ_;L3id
-zTFjbosVq9&>9_WJNx;BRgfKQ@Y{A1Y^3KRH?$QhnvKYq;`}U)2?~EA65fbu?**>zcS`>^$aOQGKX@p
-gwTOO;8DC^8MclDVqV?@yUzZ)}iK)=`_qSGPP74?T+M1q-e1xW-?e9O7`}@zV-J7~p+ZsJ|knpL|bIs
-}hYpAZDGw;N?-9mj#;;&x~_z0_L`Pf4Zata=0S1F#xTdOohY4D~TWfDsm>;Khk*iX`augAZ~Sl0&Crm
-1g+dymZPug-#I<JJTQ5B%oh<T9Ge`*cWR-UHqJgv2_XaGt`<>vwk5|C;EE;yzRu?{K!W8`1H2>^T0>2
-GAO+w|2aD@7}SqH*a3QVc(yfpFjWW8T;Yv?B&@@uX7Saz35#Q5%W;L;lx(qHP=pD(OXt!R;;b#`1VAn
-e$!dI%rc#Irsz7VJ@3feyoB3r_RrM2B_d0WxSr>!2l}Ygbd8la>%-?9WcL0GP)h>@6aWAK2mnzTaZK;
-iuMegG001EY001Tc003}la4%nWWo~3|axZ9fZEQ7cX<{#5baH8BFJE72ZfSI1UoLQYeU7mXf<O$0_j`
-&auHXZZFqr7z=HPxgpqM7d-K8xmZ!d7j;9#fzX}+(2&v5{2`%y<mYk`IoS-~|D{itYjE})|)3B^#r7^
-saMT2G4Xycp9jj$@j>@SO?43EZY-GiJ^89uJTvPeH4W#5Er47sv1@GhC)9r1K-AJXHqf$@<ReqWO7oK
-CMoCx0n>J>+!-IIitym81#ZUZbdd|?}6b@jSo;u0|XQR000O8Q5kVe%#}WtoB;p;(*pniBLDyZaA|Na
-Uv_0~WN&gWXmo9CHEd~OFJE+WX=N{8VqtS-E^v8;Q$26nFc97OD-O;gp^AZY=wQG@hjuAibjW4|1Z^G
-dLn%_YqgwmlmlWk#b{vG8#CPvYC(EG&t?dv8My-LmK5zuHmEeYmx;!_~(q9q^zJbBhF0`l}MP%bdDVs
-TV!8zQ;1d%hzPt*70_e!aqGa~TJgw^!2UMWatu~>ZFN@TN(ur-2EkTx*HgqC!#MqrB;{@_U}L1!E287
-&>xzk<h!DW3=EPmX+CwIpWiaBX-$bm*fzwqz~xD>75T8f55^tL&?ROk6KVjat0|$xd280$J{&mJeg<&
-8OK|<;mIL1N=V4L-6o<`DFz@WK1flOKb=9xk^!YST@Hoe3J9UWHNAEN;DkhAH_pe+|)1irI&*dov}It
-bOBuTG^;3+Cv2wAh$-)NC>pE2BYF*+Ie+E>)oq;bX*uxX(gnXqi68iz^<5m^?YltKRVvC8Y?4Uz)PO^
-Ob`784>21Ptxmi8Z%YCUgawB$@(oovhA9(u49QZ8uUS6I4mhQdKZi>7v-{hvLGxLq9YMLsWyP2NSUi=
-48O9KQH0000808trnOe9sEsipw{0Gb2<03-ka0B~t=FJE?LZe(wAFKBdaY&C3YVlQ8Ga%p8RWMOo2X=
-N^Od7V<rj@vK{y!$JNoMgc82Q09M^l|8APkSp0L9yvXtt=TLoz4FJidGUk@ghab6D7`!I25}WdeFKXd
-5owv*nS9+!R#owkx}P!1+6_=vcXp{dfS8+wX=-TI4X)xG+M*a;)VYzxgq$rl`JC$JJkA!z74S^d%8dw
-PptWUz_U=TcZOC%+b>@yrJ`t@A)4;h`LcW}AVrH^a$>z@trel`Drw4`s}jw@M1p4^WK~{oyAa_IzJv7
->zD_x*1xvzq-~&S%fhRV;L6uO|-1{9|A{v`)yr$y!7(-N>t#k4YK|d114uR6d{GK-D4OiNcMx~zwUkg
-tzYSXq#va+}W#B;61L-Lp>uQr?dcd&kfQn@l+!O^%8uin$2_AB$V?$1Q|mBc4fv6y-jJexF|>*Nz~p%
-O8zm%mJT)>}$A^k?>(m}+Wfl}nmz;U~Ol_%DHf^n=45J!6}{;fB0N7RQgfzOz5`r$x!cA!27w&o9B_B
-Z0hI8N6uZU`R_vzga%$T)q*0sQD>-^@a<6kHr71e#iTZu6#%Tzv7vEdEo<4O9KQH0000808trnOiNF0
-&K&{(0Ph9>03ZMW0B~t=FJE?LZe(wAFKBdaY&C3YVlQ8Ga%p8RaCt6pdA(K3Zrd;ryz46#K2fM3wATP
-Sq(yt|$+sXNXlWHMN|ORfCC=Y>sfR_$PWnJmo-EGpaArA#TW3!oW!s0|p_D+U&bk2V;H~Zh%JI8^hMv
-ijH3jsBYTKaH6woQ{vo=z6)RpoXO=Df@={)lUJO>$GJIuzi19_~&jE-MYV;d&Cln3Q;#`lg8l!yDzU*
-gX!%WAE>ANIwxncro=tHG9Skf9)@@Tgmstb&@*xTpnV*_qaYofsdKsZpGZMPm-Fb->!q&|Ch%S1<B}A
-}*&`H0-(jt8><g-M!WjE8*08wuIn=BlF~Ud3I@xf=U@lp&Gb1$k1PbXVch-^zcn#t?DE40bIP>-NHIc
-CPXgru>g%`Aj>By<B)1=g5m*O2E|7uCLMAVOx%ovSd^y}Ogwd8H^xJkuGPsgF>m%o@U6xt3=E&%SG@E
--F#fpo52G9#JBKZutMAs}IvOJY<RN0fIhb~;IO+Hu!?WDhCKR)RAeNHk{x1iV96J~M3x%Ut-{>Z0+7@
-u6n2GJ(uF3{Fu8Nh(Yf4nio{NccNfc_2cYn#2c$>4!-t*M(L{=q%7^ZS_auHc5Uyh_P8TJD`rh}U#tc
-hY>shUQt+VWKm!G{VyZJ%ZGrbg!X-_;<b07^!1Wg@2TsQjQpM$K|$UZwDM0Mi`b9M#_S_#cw>ZxZ!KN
-n$VbyMg(}|2%kg1HXz)_7hM`0|XQR000O8Q5kVe000000ssI200000C;$KeaA|NaUv_0~WN&gWXmo9C
-HEd~OFJ@_MbY*gLFJE72ZfSI1UoLQY0{~D<0|XQR000O8Q5kVeZqR&y9{~UWZ2|xQHUIzsaA|NaUv_0
-~WN&gWXmo9CHEd~OFJ@_MbY*gLFJWwOXklVybZKK@Y+-bCa%p09bY*icaCvo)O>4t242JLi6(XkuLfE
-;`+d9~3hwfH_QDSA7I&qMd()|0`NjuuL)yW_4BR%Ta_n>t*$;6~J*nadZfKBjj64L9v1Y=J&SU;374Y
-u`$w6j8tE-2Nd9@Q0XFpyHh^F~3e<+Jt9Q7e%T*Vq>uVlwZx6-DQkMuE@eXUFXMhV^UE#Nablsn%f#@
-L^r_$<y>|Jr`>eLtR`j$!eVka^2;98Q>YjA87zPzztfx0#ey-We%ClBV~1B^K383@{K=P3E8e6WlraR
-WGWQl0NdLg^5P+t#0KoCgcG`n(ufc@CzD@B8x+jyDq8j-FUp4ouj@$j)?wcmg!2Z@hqwBP<)7&xS=7;
-Y@p#DH*~HYs+@)qq&a6503s6e~1QY-O00;n48F5S^fcwOi0000U0RR9b0001RX>c!Jc4cm4Z*nhabZu
--kY-wUIW@&76WpZ;bVqtS-E^v8ejzJ2;Fbo9meua(+gg&6qYri2JM-D2ERV=yhuR}~RbZ^?#jueX=fE
-cUQLWsb}TZ(~SRZ=y=YhGaE4=YPvpk@xT5hgY&KB;pqB(DljPR*HQeNnLa?x1O-*yx<u5GSP+7f`7sP
-|r`D_U&@v(PKBZ8@0EGR-yKBhBKT7!aO#2GH+IXr?WrkAJMl)N?&zfP)h>@6aWAK2mnzTaZDk=JdC#j
-006cM001)p003}la4%nWWo~3|axZ9fZEQ7cX<{#CX>4?5a&s?fZfa#?bYE>{bYWj(Xkl`5WpplZd8Jm
-tZlo{_z4H|jt7<@^?4D=UV|(1o_EwFe6ikU45}Jf|M^*oQ<B(yX!%*7h6u^Fd_H!I6tr|jU)!9x1rGz
-)F(w4A$qeN$c_Rkq9`7<|M$&7T87pep*xCPCGiJ}TI@`LL=GY~~lA(%1bh6`tv;Jduvr`w3QRYK*$a>
-*^Fi2+e%#HdaekP(m$pUa0}iEHGa&w8bUDZb4Q5aen=i^gFcP5>AMF_u|y9&zg`Q3EUE;Zp;a(Mol)b
-l;O{2yVz9B}WWekRkTnE*joeN)xLdK@u+C=QB$Om)*C>$ot*J_!RFZ2D}P3j`m;6w7q2y@f71=)?-N4
-IE-AV7bi>V{d}sYK9iDg87eX{12K+&-L!W9h4@(9Gx2{A4Xt1WkfLVVfF&>7)`S(dW8x_7oNLVtt*vb
--Jazn;7D`%>mWGPnxW<K9Kh!BfmZoLcjkrxS^2|gBC|$^-WRCPMchWT`N$1&z%m*-R6{)Omm-8ODkS&
-+pJVRW*@(4Vx<R%npvkX4T;O->Xoh#3z!xzCOC*xKxP{wtyfjxelluri5yY%912y^gWfoZzErkAMc2R
-Scy!&%<ox@1w?C0rz(pw=0Q!-qIMX`xSP^&Sni+F1B!f7Z4UzYnM6>cVWu#kW*EG4Id%@(}SUV}~E{&
-Yf#64d~v`?X4n!(}N()tjC^%D9LL-1Gl4L=gQ&fYy*dEDbc==+i6+fRs|fU+bE!)T&n`U4$}1s#p!k`
-&)Z5CvYbnL-g({G9A?eZXz#;*<zn$Y5w675&48XH!D#>m7{l~F^*EL2Og&t%PaT}esV`fw%UjhZztUM
-l46&kLkC@+W2wdN7ikF%TSgz@(im<Lvj=x9B*tx#}SIb~C`e8VwcOb-C+$Fw!(s#W#H+B1Tym|B=P)h
->@6aWAK2mnzTaZG*d(zW*j001Qo001Na003}la4%nWWo~3|axZ9fZEQ7cX<{#CX>4?5a&s?iX>N2baC
-z-k&2F495We#iuBAvIAs!&op3<$<OD{=#iB`ygA#npXwN09Bm3Qyhu#5TIf)w>spTINo&3NXUu?r<Dl
-BPvt8U<-ecvVYf2z$`7Yz(CBe@t@z!Znv7CXL{k%pong0mVuk1ck+@d7Y#$Aabb^&0kMI23}2Sjx}^@
-$w~0QG;~`@CWSUk7=027R)MZr20A7$lIQypDnNO#XyLSPo|s}8hNXkiKiLsVlkbv?a3qO>AjnFlHTlF
-#+z4%8N&6jL2Lx9R1*V7#ZqhW=P!=)KvQZhtM8S`SW8x}ivL`McQ^Owh?oKt(+1jO>8gW}lG(~_Y>G2
-#=)GMPnnT5qO%<cz%km#Zd(hES=AX4aZh%onuv#5}Y82Jo>a6!DICrem%*?J<3v%9DEj~)gJyl8b0Go
--hMDRajjX-w$8s?E`Uj}YxT7rlo*Z;kLz>O;*LC9Es>d?H+vFH!)(V<Vp(i82V!^0+5#^mniimQ_n?B
-lxw*t3kVi=gcsAunn4-DKHiy6w;3w5AG#;=e62BeKJ)^4-sJ^Z)3sw`RzBYnHO41ik(;Ei8hoP)?u7E
-Gk2n?mWz0~bLM>xx*}mU{^p@i1^XFIb81^=qK0#dm5s~TpfCw`QKiEfx_ifdA9~IL&a=r=-9pomhfUx
-vJp=TCA(Vb$_ae7t{XZi%CH@~a`zO5kF<kl$4M^8Rcstpv7;;o1Z3WxRUz4j4+c46UT#?_@*vdMWZ!;
-4D53#k8wH*Uk=3ztEvJNj&xHH>LoB0woZ)9chXSit_z9(DT{woS^71#8IyG#3bi@i;6hfkTgOZB~iS}
-<|&i)`!%^(fGb+_IR7Hj3Aix0(Z^m&)@|X6`*QKRUL|f(v6{O=dbjb@Nd2>~l^J?}Mk08ZVSBco)a4;
-pRA#tHswwo3^$1x1cyH`7cm=rKH;8==7{vb~N{t7)__I;#tU_-Hq(Ra-+zioo12aiW9vJ9UM87d21Q`
-0Z>Z=1QY-O00;n48F5S@?VTja1^@siDF6U00001RX>c!Jc4cm4Z*nhabZu-kY-wUIW@&76WpZ;bZ*X*
-JZ*F01bYW+6E^vA6Sxb-GHW0q=uV9^n)_~w*H;+S*6exn^*h_K<kOl@V(rY2I=#unq{O>z6lq`y(Y{`
-#p4iz9-kKu40-wcQ2rB-V;pD(v|tL1#o^7Te(%lN{mVr%8xJ*Q0MkGaWJnX+w}XG+L<kz1*GVQy}g$Y
-WLyU2r3BZf>%I8^b>31yJ4MyP3P6zP({^2)SgY$OU{fvRGDc@z`kjn5(V1WAFF(_i+E0D&?MNsWh|dh
-b&oMGGs6_YO6EZu)!l=dfaluN@a;nn+lIzE(_62mp0>4H&1JXFV>zgN`XqW#}AX~kUV6Fy%Fbg^uv4}
-nh`Bj52|!XSt)<o#$wL=)Ar1Ew~@8b-zNAp`5qe8(Y$Aq&z5WZg+ENX76r1~iizNsPrfsyJ4E$?Mj)A
-TGgli6IOE0KAoH3>$=4uA>ZydfOsCz68}oG?CktQtkEQ69Jt~nbMJNwRF;)oEi$F)ccW&1lC=<AoKcD
-~|b2Mx#H<H77Dd?tlCwQVAO=uLy5y6qH?7B$W624%6mJHv6^l~jrn;1p{;Xt<LJGPKat#fOoAa*Osmb
-o_YeU+CF0k6C?06ik|dDh{;nc476vTVgQ&j8&hFlU)sBh{?MOiM^yrBfHjg8a9W4~}w@0z#3~hnkU@O
-!uQ57Amy?4#`S#(N&w_>x*mc@kFh8SwGE!L0`XqeaoICgG8%nDjMGiQOz1Ml<SS%MZ=a1w2xb`&_^W2
-`v{CH>weK&c}g5r!yWcq#LxhgcGB;Ng%Z1nBk=X59pUpF2ER05CVysfV<VFung*uGbiT0xFPO*JT_N|
-R7`ZsUgasGY*R>Qmx3bt_+-L9rv()TEvHZze=y+Nw12Z6Ju-%FqupO+UmGx%*pg9y(y}thhz&(VW11m
-@aexb-Qg;GBlcM;GSKt7^Z7=#B<mhhxWmk7Ji6D<&dP&vL?s-jR&0Heij@21$&^#Z^8&YBH^f1RTe$2
-mz^LR^yRfHfi(j-BYqRPmtIb`y!9`qQPODCFx<2XE^aDIvLHS-lI{x!~)9ymAG6T!CvlQxTj)@Q(-g(
-2O`5lwc-{;a7t*!f~J0BmSvXd0JtuOP2La6k*oFZ;#Pt?6Z_CsBDJe7h@LKO@^bjodG&<wLRJ1UL)Px
-ZX&k&5J-V0;C2wCZh{m!aFJp@w@U>B;*dWj6Ccf)doYm<ZUymWFi9IzKn8+q8DZtC*-ncsI}SvXxA7s
-V>W6O$DwYtm5?4wjMDTa-cA*)HFoL0!Q5}*Xp_1lwgNi3T<$3P{<$VmHpIDuoiu~5gXoZj4i=e*0Tvd
-PT%KEgbbJMEKnjWw7Yq-SY&L=*e(u39YxyyXALy@EQV0E`lrsUPG9axbMHbO(%O&GoESIOBM3;H{TTE
--F&TPux=L}_WF(yciVyQPg6A>_?k(ZR~p1Ntk<V=9GHhBb3r&l5HCGWSuH8q)Fp@fV0oJ7{25@5x3Ls
-)r|}aK}aq6qP`xojSTfBdAmrA{HpZ4t7LCI^Gf9SV|N^^kYMa;UbAML=u5W_Ii*%11o_CBik{rAQNE|
-<P-oMh2oK_Ft&Rcp20S!c$9G=v@{0FKyCA^fYp~{;TU>yQK;<4KU-yi06UuxIv3a<=Y@K}Uro(&xD+W
-ArLqu4cF=%zi3Gx>((9D1?%=$K^Cg_G;Cv0|o0PWgNVS3!wAqGSN)FQ~m}WzbK-g}`%u<iu@&(Ed-r2
-(EcKQmKTmq7(^pv^)t?Z8|tvo=t=z}Efu<1LJ#y^Dj%0qNdJ{rRdyy*r$(hrqSwNL4u{5XaqdYp=|JG
-$P}^(9?j(e*W5-;Ckua6;qgidey4zz0=2#TaH(5CNK~GvV+=B@!YEZ??slR>f&64rTyX7024p?#q~R2
-FTAUX1wX*dA+kS4|B^q{LAc*x-NS6J3Yo_3agC6ff?s<*_ESmg<mvZ9Rf75rXbUs=q^PMuR8QeRR<0O
-S@q_6^`BE@_`;@7TiLF!$hi<}JpCNGWn7E&uuJLz{Rw959ys9Cvm^dRTJ!Y36!k#y4`;wyS5xeVMy=G
-cRJV&n9lv2+$=`gZUZRoi8cO><QctU->ah*ph5FRpUdgd`Ti8vE?1+P&=@D^!>hs09e0fPK`BNNM=|H
-!2fJ*%<aKLN4CUv|te^9wLbI^+QLZ&y-SJDm&nDg@TH?OBkt<>+4baAAY@3DWj-J=sW60ZM)=|2KfgN
-|n@9IZ>+t7y(1k+4r`4dE!1bamCT(c?d0-T5`uIJanQynF>vwKC1WP)h>@6aWAK2mnzTaZH*XRG9A-0
-00<b001cf003}la4%nWWo~3|axZ9fZEQ7cX<{#CX>4?5a&s?pVQy)3X?kUHE^v9RJpFeYH;%viub7pa
-l@v=#+S}WE=fufNQ*Sr#(k3rX+wIwoj+&t))-%Hi$<as7_rD*&`4%yvvv+!}qX9q=1OX5rIa(^21oQb
-aH@V{Tc_5NZDig4UmT_+Qym+1jk=O_=WI74*RD?3(^H><JSgcP@$~KChERowTiD#Pa@c-P1SXVr`4q3
-*LLGkURAkRcLn{Rj;Nj1}AH%sJ(*KKkY$6_(hn9@988lUa=vhA#*TQFVrKAVLy)rO^}W|Fdm>x_k5Pl
-8PGrPy(hdOl}y3?se>t_Ob;F$`vKdvbCDK)L17oX0%j$mAjbzF&B%xfzX40{Dy?hS$TjN#fz{Bp9;cc
-ybKASSSxgsARfNJVa5XxYiyb#eLE!Bf^+_h_r}&BzYv{agv1xEmj_aScZ3>b7?%H_|&_|jgjebnvkU%
-=20$~t`S~FU^?6*P$+yuLO=6S#9o4xl6mH%N)nbv$B80l*h+~9P{l$U50#G#_lzszhCyuc5G_5^6bTk
-fkNri$Gmj7&Jp{h7c$CFGF@Zz$G*c~e6?)8NDR>+~AoEeJ9%SS|2aAS>MoO<EEM@AGNGgvG)|^GYe%9
-Z5@ZWjx|Kh>_#e@G>5B{$nyk~sEgHAk_F48RbOoT{1E_cWGEAFwIyM@R5W47@5f6Sp99~+NCJSLSePt
-=6`Aoo#tjX%j_Sc-jNJY}93lk%PMg=SwTGB;iWkePYFdLkbXJv=NjUu4OYT=`R>&&Sc8)|w?AF*OhUL
-)DN>h91T01Ts$#iOhW_|Byw%0z6g;0N<F55_i6y3}m#Pprdn7f~bAQX4t})$(n_X_8t<CW(_!)Kd&|-
-@ri;fqK9Pd!^2|dA@R(w@rdAwYq`f#H_X%j1}Y1>Zb+C}*8#ZSw>o4!3TxAFr6es=n`)_8=p~|8l{ST
-q={i&*GjxDy6Z^;KR}_@Y{=sEXJ964?I%I38oh7|CcIY7ZK5&St&*ZyATQ7};`KdlDe|OsKd!j~%swX
--f(DcQqE}5UEKa_Q-{F8{$%1`9C8CY;0U|E*xAvT!Glpdbmtd4A=)Yw!2GY^M?=CzD_{QZFNC)pcg4k
-$k=mg?S0q#_Puk-hJWNHvjAeY-CeNyL}5V>JYtj#U)_k3kfDycaCJrprF3a;T<=eITh;$Hk-bf*Kp|v
-*S8k-*I((-eQq*rhZf`61=CvY?B@(NSM0ovG1CM8-}|d$BBg2B3(`W<AZqZu_8Z#jQ1;#aU+d)^r%7>
-KS-0RFVn3E`nDfxypeREtO+*9O-FBq36CqLH$2t^!g&1C^rpxaMPB&cc-(9%GXq)kA~&4cRz3~>{_&@
-`K|@op{uyHC<Y51}f`uW^3=N%zYuqR&v06i!?jkyYu!6>7MF3s4xsjnvvY5Bxa|^eWVXhs-PB^dy3-7
-SPY*jinCT3~qa9^y#POPuNP#|Vp8NuB?q-rl~9VpGLK}8S<j-WwZYezW?X&|G*{7baTp%NKFoIZj=tD
-;bA7Xnts)0LwjGz1DJmrEB+0!c#(*F3!A&Mb9ywJTW6v@;2?01|Rh+6SQ9TE-m*tihn>(3KTdCESsZL
-^s1~p%vK)OsoU##P}9$89T~AaK=_#i!V;6h-<Hr4VZVT$O_JvEO-4b;xThvxxHmwgEWrZl~A$Oiqc86
-PYLOG8k&9P5OddCJ4r<abLX~`PgO9*-0`o_y4AkDiCJNCV_a`8HiVtYTXV`m*HDg<5eg6ycdTp;JRF$
-fj^`i@VwNNEx?9JTP!YP}S2%jLo3u&$V5maq_J(B%gg8&lS9gQ80`jHli8j<AI)^+JOs1<&URuMYBO1
-a&i1P#!h}*6~Ay^xx2>LAnB8)d-I|76;(>T+aK&)`Q95TGMbOcL;Gi`PQAak86B@8>2l<A~WubDf^so
-W}emQi0W45CQx_!i`hrkyueU}DlUDezc{2wj=fgvVu{T^5SRk~tcKl{s<q7R)YXcXPSIfG^85cH*3Jj
-ac!FGczToy27}#1(=xdN5wzqLb)MR@r?t*pwi<z3T%;r5v!NVV>emRp>!R%*im+61EV2`i7BMICtQYf
-IGB8Ain`k=6);brZgQqg=ULX-xi8_cHj6ak&dh-fD>wfz9I{R3CL7(<y#mUtC&!|~W1bfJrPf8r>WMg
-;yDqgMQ)htY4$lo!g6eA{<J=7x8*=s7sKjxGt%%&n)(If(x@A|NzBO7p4Ss?m^GH=<iv~)E<mf{jQ2P
-Il!uplU5CPSfK37PGV+6I6qcg~!GBVGyVAA#>c(AzahQv{EVabUC2e(wnE)cOL^BFROqEjE#omq?UE+
-srNCQS`D^!m#*#FA+|BCMsmOa4*Rj*4Fp#woBgYj<G+O_Rp+Pryk_E24Q{?5E;9sn%jQJ?0yCRV%^~Q
-J!m_F~y9lY;6=b;o31-IwW*}otOXvzAG;uw2~B>M6Y|c@EekLq&N+(e*LjOu;3M{DQ&ZW%pt`hf<MN1
-BQ``d%GQwc8sV&PpuU9&r&JxnbjV$UtOfp=@Ua^CkqC)+N%1|D-NJR{#X>sE-h!{(TxH?RXb55EC!!t
-*S=OVzo^o7d)6R}!6DrA)T&k(!xbaVhS6gp8U}ub>8&e&C(<pKqadN8q!glVAhbmx2?D!$VrV@SKI9x
-3bGdL<tPnRqaZUSpjR2(Z1g%9`OdKQFfPaL(lzSTmyHMpbor6c|7TL<!;1HpanDOLBZ%H8B&QeoV>8*
-&iBu6n9>sl=Bli#Ah7=mG_QfSZdYs_TeD3Bt0q8z`JzKd7zWV~OMl4~VObTqywaQ6w&$s;`R^hbdv1B
-_?sjFEM1+Uf}*tYOuhOGf|*^qm~U^wILaXpvoLip=xb6no)KkmrG)|vB&9PW(mJ9=G%d8xWZYPLisAF
-#k3~q&4*wumzqx<yQktN!rqd53mIuOSQ2ry;jeTCYyAgMt2`ueGaJ7A2Lb!tg<<Xcn%ZqCP(QdKu_}K
-rcM!_)>c5-!loWph2Du{gB2F5jl7?8hm0Pg8g=0*W!cYi0Dn_7FrQ^xclw8g%rpLsJi%w<@$?j_1Ydc
--4UIW4#QFp`;5IT(*l<!Kp3swtHdq+ut#v8iDX$$*@bp4`4C-^=`Ea0CWf`0uVmP{=59w*{0M7Nx|2N
-QjD{mx8T8m`@GGLA<W=S;prP-VU2x4E-k*{cjkqeMf|JIm!OGCkla$m}X3$KX57FycFdv6}`?FA%LXA
->T&u?e}griLdW0L`+Oze@WnU>2Tfkq?kKL)jRrfbyFI!(ByrWJ6cpKRI=x2_N$7O2XJ{vJ=1$mOxHZ*
-h6~mOM+rLV0YyO8lg>o%ok`g{_Wwo7<W(BIFN#)sb`2%X94v4y^gLIBdLODvwupUfVo#AeA*2tV`;HU
-n{pbEIiN2#Y@`#H*JLqhXf349S%rk0LZ&veKv-Wy`o<sX1+C5&NO*6W%40EN4Q#ZP{A(VP>@8!XH=8^
-1_%xJZfUN=i+tuIv5JeH7d&ezA4#bWbg=Y~xMKe$2G1;3_p1Nxp=7wKLNJFb5ICLz{CdIoxKF*R8xb)
-M66VW+jkQkG;W2X<Fzd$FZ+uO-xa-dwjJ=4Hsfh$M#|3r;OxEfcZ|Zf{adiwhGZ3ScqAYi$nLA;kkt5
-@C;PNKBI<mhj@1LiNzW6jNJ1MM9N3bTy#Zdng}y%r~r!U&fM|`T^g7YJIP^3)&#NP0#_@Er2$pD*fBA
-vg9v8>&{cm(RilS=4A!N+@?#2mC+K<S<B~)<;@J(hbdd4?RG#54ldD<*;`rdhcXc=K}v*cn@p9@PzJH
-P&cn2P$*TiP^8{Z*?gFzswb?{V-+<t@OH=oV`zuX<Mc!%mecO<Thf;MoSuh?{HJYw6yM>5E1>2xAK&a
-~S+(;4fgXt}gdCI5l8rH{Yv7%QXo1sk{m%HQpE#6Qe9WIA#xopoq=d3pL7+kM;knM-O<yCRid~f-!b<
-Fxn$!$Hd@|D-dRXT2pwF|FVM!=?dTIS(ei(0~!YTRa}IIny7Q}I4`%fbb|YZ^A@ylhNcG#Z6<M>f-kC
-;NFlgcL$r{he+04O}ISRh7r?l{dt=!(3T17V|C3&sElVrD_JL+Ww@0MUBxS-ZTshZ@R^skkwaQVKSyV
-MpqUh9m}a6_B<{ewrw=HiXM;CHZzzs-|MQc4YRwPjT7NA-Fcc;2HS>J#i<LmMQIn@^x765M8{i(F)2B
-ZzN<}nY3hE~ru)72ccH?@Kw#yqy(Q(_nrJ1nbu%|<+VC<wPI)~STfPXJdD|sfO$Xo>?<H?60?&*q2Nk
-tJD!or@!3?XTveu14Tf<XE*WcN)mfPM@I|vxXp8Ook5mJEybCM@nvk(-3KQev*S&3yA0He>kkVVo`)X
-qGCrO?hX3Uq?Pb;JQ_6rbVUJ;-23YB(I)rpG>?ycG86I$Q@VD7y-5SI=3NLCmlb{l$~#2z%k>HG28}d
-0XHY*HbqA@@o2@PpAJryFGi-eH=erwsarh^-3szxC&q{01^c}g~bFG<Ohg#4*xwXFKAxC_m&_a2O{Br
-tULbtm+|<eU$7v!KWucghllVy4PI#t3tV8<JitA{K<EH%z}s>%d+eq8#!CU_H1QFE`TctN;rn-2muR5
-&fGj9}6l8>om=)j0=a$c4FbFhc{ziPUW)#R}@DIGZeO6qSIJ4)PFp&Tk_HsgCbG6o4=L~pQUJ;Zr^SJ
-<K^Z7{gcu9y_ywph`4u7lU;t+78O(V;N3p&!So9bWCU{CuhZ@Hj=N7{CmuL~M{q<y`9TsV+p61M~A1q
-r2EcehP04xXuLrndwxdf<H=4vORp3RoJlZIgrEMumM(0<^&KtT9Myd5w!BdPe+0&LN0y(0Tj81=5Y2(
-vn8>H*O`#6qs)4BuX@bZrn~&99WN_2a7WaKWOUg%N;<v<oz2?Js6_7yZ=IgPuhVEtf~xbEt`X~Fffqj
-r4Sy2R(zfHHNa2N;Gz_#2)}%8p(FdZyAp|I(c;{3lRf?jN`WjyJq@l(c6Nz6!?%>rCdKbn!7_}K5!A+
->N`q3rdi(a>Z<jyJFW+ANboukgs|g1Dk{g}{Wwxcvjct9}3jK#1UVZ%d;m!BIe7wAx1y{IClw4XZAng
-zA&t65g8%Swz8HIuwiYUw)CfI4lL$MS9SnNv<RS&PPuIBGQynBE7;p3ajE6bsc`j5-se|z`g2OI+QQ(
-9h79%ap3X;5~MdH(CGxAQkw^Itx^u?<06X<A8$w{-)==x_~+(~Wo~zm@_(w2$vzzk7St?!WA}qz;05!
-f|p&!{^0isTV;c=P85Lb*@dmT#m-U^Cu;0IIbH97cYW8$L3jYBScp1db?zSji-Y@*oGCf=MX)^I|!fS
-XM-27A*;L#pjzP8zQ6hQ>C@*=*r6EDSs!8TH3znBlY+ur!6RyGhA9d0XPYFxFcK77hdO`~5YozA^P)k
-KT}NWM<XAbz`?`4xeNjAI5AbPlTa#2CR8YZ$jRse^;ro%T29scLnMT#OBr|*be&DgV2i|bUrxy2$z;1
-MOsVwM#6oeTyo9YwWbc{mLOOjNM+c&K-|HQ4#+GTs_^z{IzesJsSZaj9QjN%3gye@rju;Q`i$64U}JI
-A>2xI0}J7s22)m<NbA=yJ{=w{0~$?6~Z-6&}$hyM1>}vNc5mOzQ`zCnEM@2+_?<Thd#HVs6!M<GdN!C
-No&7^$07+HtlKff#dHUpbstVTRMkV39C=B+Q5=#$<dBm{Y?8(6k<vv9(RSmuG!u?#7!Twf@D+^_l=|#
-W4FSrgJ#Yll)ep$Q($Lk*y?ape<o7|Vn|>M9DnYy<YD#g5S<2ZAY`UP6Ra7E8H6ARgc^)sW)04y_=@i
-`sI#$e`zwqf*LJ-Rgb5NXbOCJEQgecJUH)qDva;Eh2e@rg|5D@(1o$I|!tpMZTVOhbB{ANzy$%)}<{b
-r@5v;G)GKZCZFLR&^Alp;L@>mER7T#fpUB_JYGWZ>4EO?jNRKQ**hEb=uti>_Whh?=DAZ#Q9s|q`nj}
-xi*W5BW$m0<a7g+?hrBv)9Rq-wNLu^poG#b|K-UpKp_Pp3D#@1EZ5{%r|g*wY(*dj?_m0ab1FsW=z@b
-d7&+$Kx5A7OY*wsLD~4FUD9kHS<)=a3gJl@eZr=JS*9c1~;$@FC$z^2Cg(l?OnUIqq0eF^^2gh>dUCp
-iOY}g@b&26SM;V!{8gA^+;N#8(HIL_+H`0j7$OJEh2Y;=kp|H{6{ICel^xOr1<l|g^0*zr3Q=qm_A^a
-D1I}jM%zE?)IpG;%|Nakjhl5G_`9D-}{MZF9nc4TlM#Hv1!!fC}PU-Y@GW5pSW0jQK1qj>;th5lVjvL
-2ULonwX{rF}Cf382Bg3n)n8sDD1ycs{-?So(#d<``nCY&^^lh1Xva#$cz3D(iu6Sc0a=b$n;Q($ewPq
-iLqkH2P2$3Dd{kIHjPrFM<E9B=DruD;n|?`|Kli;{bn{?;jeL#;<NX?NB-NlUp=&;)Bb<8u;DI_dlBI
-sy~ZvUDKo`<9S{=T9E#7lYtYPXW<nyj7!vbhAipj+QWW;X)>=*SAg}7^S)_1}4F#&T}gPX2S3UQq`Ub
-ov{pGY#t4RNBUy$NDtsk;SM%d>bfq$tULgMbD%+z>PM@uQ+-=^U;651JU%|zgXfQQsmQMDVhS<Cv$w*
-A#_eL_uqvRK9+{hJW@al$;s<CsuVab7dvjPK9`fy`*XPr3Z-cX7@Z`nd<m8}9VPq)E>pK5vQMGdQ1KD
-VE@Ay<<>eiQ9@}AZ{fk{VeH_q<ucaE^S(fdZ*$PLe9_%j^a2#=w;?4n)NuUHOsIyY@q;_9ZVb$2ird>
-UP!PoAAVn%(I7Eap$Q_cz<=&GvqHeWP!-w`arqLHTWPe>1wii6)pg-i*hOzX2BR=vu029ltrfV;mk`P
-mwQtJHP&P{_OVg=ox&!|Hkt6ajwC5vnK6&8G0CQu1<<t2mK3rUWzmVwT}j6zo^7>D~9cS+|y+#y5;0L
-BxVO9&G}&y?7m8j-ISuU<xDWeAyr<EgkZeGb6ADX$^pUSv*BUsU-hc9SeVgpIvig=y=}{I-M-p5seit
-vxKX#N&(6Q*Gpyc*zI8`|vrz7iWA9e-QaB>Am3pfhkeOI}7arI3o1^j`7~JUe8tj`*m$zs4YPA5Liq0
-OroZLi@;qOcP&&~Md{Y~`WPbc5~&&}**`E3*?_Z<G)-HY@-N$#`oJ~Q{(?*7sJ<o*UvF40&^xyI+{e5
-w50e<-<7oZY$A1i5pApZ}XN^qFAy{NbNB!NYI};iy;(EQ9gM{{m1;0|XQR000O8Q5kVepN?v+&;bAda
-|8eYDgXcgaA|NaUv_0~WN&gWXmo9CHEd~OFJ@_MbY*gLFL!8ZbY*jJVPj=3aCwzfO;6k~5WV|XjEoS8
-HjUbAB@PIsy`nCMO52s?O(tM)?8tVY^w)Qs4_IeuC48{r`FQWmc%0VR4uoijFgO$fRM%S<Kpwo+LqIW
-|3ux4n^2(Y52BT`*pwKFyliD*j=Qw1njd10Ha*!TpQ(0T%gEYY}PFFWF$Vy{}WG%q=vc~Is>10j7o~_
-Ps37nS?R+((&$r;<;TwPaN@uT`){iHyLMA!97W5##qe!t;xzQ(64R%_`!d{deXSrl7N-}zU@fYz9D<I
-tmf!bK_JQ%Qf&cnsN&_YQdhJmBvj9ZJ534QS;<me!Z&6J&!ewL7*>h|HsIi3{e{&rHPd`PJB32f;p~0
-cGGwWBD(XxWY>xQO3L-k0-uQ0#rN4P*=AkJlx7V4!@F^Wl7UO_Nr}>v*Si~1RG^V1?9WVTIouv++4yJ
-mbg(L>#9sMs*3ze(tqGSy$@$>c#DZpZ*`{wF%iwR#jE4{Q?@g>MIXSLG?3nlCHP=RI%R^h%~0bsKpvj
-&(UEuDpW{YRC(tP%=>z_ua*irF)x8F<t=6*lC?<tj;?Gmw7lnFm4855+z$e)>{PRsaq#uca;|E##;gD
-UxMFC?R`wLJ@0|XQR000O8Q5kVef-++yj{pDw&;S4cEdT%jaA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWn
-pAtaCBvIb1z?CX>MtBUtcb8c~y)(4#F@Dg?FFA3JXZ62S8$E;0y>^rgb4wnglyR<@OW;18;kO->7Lqq
-Oq2$LWF+GNelADQm93!`7I9q;mxPG#TtE|2BF}KC<g-=-;C~eHJ$;8ID`ea$CFzEcLpf>+yO57pI;@~
-%_FWbraOboz2t(&PkB&H+D@6xK!QoLUw+3qOB~j&QQQVzP)h>@6aWAK2mnzTaZE8M$G#B)000vP001i
-h003}la4%nWWo~3|axZ9fZEQ7cX<{#Qa%E*<WMOc0WpZ;bXJu}4XlX8RdCgScYuhjoe)nH-s03v2!un
-bWqa-f$A?dal))I_SZMo5EOU9DBg|YvAI?GA@BQ1TLAVl(gce?NH)8(})AxZMaG&N5W5M`xm1ME?&qA
-@&i=KwPCBD7F4fJTZ`WjrZ_;WaC?=j9mViA%i~^HkOR806cAl{|oJV`}{-Xd7LBj{*ocs{o?#-fow7>
-vg!Xo7LSidiWZ8o|o|)j7pq4{l$uBUi()b*k$-{0}I&2?I~Ba1wL~LLW09NSPMN=+(KLXj^K&JC!@%n
--TG0o+_RdcmY*g8kZr|M-uvXghCF64XH~^zM!VP<GmOOk3C0TyZ*fD<gWyHhu_k2xQwd2C<p)4FO4{0
-ey2PJ9xz8~^pZwOa+C=OLQxD6^9B@C%868}z()LIrK@txkxX@^?B7bK3?@SYz0iC)9{ZM_@j=AP<#vS
-+#Knyiw5v_LUj<!;wy*v<rEbxE#IR>FYDg#)x_D*NGjBP1jSkZ8Ql0$EyY7pOHv5bR8&aKo-P5lu!*F
-M@QxXTgA*h^ailRo;BCbW`V^cpoSRwr8$$_xS1t}kAV|9_XyRIq*fgX)dcKYB+;&P!F6TpDujQJsd!p
-phSqyi#d99?nJXrcy8{Qm;N$^H_-VHnX4J)7%lR588?g;qUSu*SBI?16;t(?fp8uf**TkY(&V^7w0vZ
-Hy@uh{{T=+0|XQR000O8Q5kVe<Xm468Ug?SeFgvkC;$KeaA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWnpA
-taCBvIb1!pYcrI{xwNy=S+b|5h>sJsu*?{LCP@sn*Yk?gW6vze)C;~&V=~Rs@8Is(l81~;s`75@QU_E
-p?*p^5>K0eVbt*Ic(%EmVqvkYWa8|y*roKcO(tlKA0$XDs4(FrtK=BB_*Nsm@2$5<IKj+IKCIHvTrC<
-?R#)SdTM?g-1RH{YsS_5Nv^8|}Q%-i=9%m&W-AV^Qw)DJ-PCVq&beSjuBoiMp1054Z694=as@?mPiya
--r6u!UQxuT`h71sjuZqUxjMWMez*-TC(hcKswOI!`f)<OkvHFKXuzJkr-1k#tJOKn~b!H-h?`!P2gGR
-LZR)GaL!jkDcIco`l93kfrRm>{on>W;jjRs!CS-*1G*Q5wh+B%N_txV)#Ob@@lo8`rfSS2n6ppmI;*k
-pGtkG@`FrOZo#Dl7%;n7ib-?c^p78v8jigO$f8t@sx1*7i?(Da~sesmc3Joi$B6Wk~A*vyWl0|$IX#N
-m;o&dkEYX2U-<2i<)i+03e*^^OEst{iAZ8D3wx~_I*Jd2;nc&{*A&3Y3JDMtw@FHFw(HvSNgS;&VXS`
-p?Pr|OT|-JF39rJyc8zmP>K@r8SC>FMH}+<zqYPf~63t)7JyISoV?+HVuGO^)KrZ1d4$-hbChUzsYDw
-y3=p&P@UwE?V9>q}lpFlbU8A|EUk!yy^ZgZGSWNIb(vfzceIbws4w^r@v530|XQR000O8Q5kVeN7*-S
-;{*TzP7MG6EdT%jaA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWny({Y-D9}b1z?CX>MtBUtcb8d7V~GZ{s!
-)z4KQLyjav;I0E`{GT=j+4cY~o6xen5QWOR)jcqoR=yE7KY0>}Q8B&sEIdOyJ65AR+KEC&6sL^P24Y{
-)x^I%*BZVja?YKsJG=V4VFTbODCg;}rBV-?`RR0T<0@QASXu2erS?tX#7<#ovglqt1vkbBetLC3NPgF
-ZrPsPF*cX@@Py6rNnozhVKwF^)3j&Z1xe;U2xV5VlN$W=efKfouLX$lBa$qK4>Rd*f<~xRD(u1e(Feh
-S*d-$@8hYab^1DHdSS?*dig6H3c~C9<~Uk3h3857q)7-(u7&>M3mjT0%5Fe*t&YNWho;vRQxl+R_{fE
-PCP|sQ|VB9jHDUgcwSOb@O2)XpYqWVPViB_WewqpTHs@-SrA?nWS>$$fwtseg-7Bnq$bdn;|+YI5_Oq
-^lW%-%O^PM=$--`#jtTJiS8Y6sjo*pbegE9*PtFO9bIpM%V8M@mY#yzigwvj37-Ygn(?OYv_cwuJN=}
-cJl<WbB1x6Gj_@U*%#|XijRUMGMZv%ECw!>9)Cq_V0Q&T4?tXv4Jm!o8Zq(OJ_R8250qQpQq*&x+;dT
-~WlL&8$DzF6GUkopvod2(u3;qlxha-NEr+F)qo%V3|8qf=1?_0AoS7k6>uBez_8(kQr6-%sGvI(FE>&
-{k;px{536%5V`<pwxje{gF@Gyh@&aVGp%6f3wMn7E^^TK5aA(Ta#}==Q-}!aGj{>s!+Zmt$|Z6qeP;s
-O(h@in<9{q<XcAKF5w<%HY^0sc^N>8c?)Njuhc=5<VDA0#8arzXrxrk+H$$BrOlR0iMR87t`#}UL0YE
-oQ*O$=A<pVl0CFa>v?j=~p#~$%mUS?eT7&}Ey0&47N!M`9?v2iw#~l9oS1HA1z_#_GJ(ki%Y{1iAo8P
-nPQ~2=V;h_D7CNl;6$EWy-2b?}>uau!@CtYmfg9+O>t-}?|LiJ84tBBX`-lVb8WtW+_G>+mfdEDECj6
-qnD31*Lz489~dEFxa-Z?A35B(%qw8a^8pt{m~6*Q`dxj^@z61wQ_IHxPqE*eEQ?2yTei{%LqDZN}hP$
-sywZAfu!hpk-%tqHQk|dS(<7;N#Ab(9zXPbfBFR;?|Wl54|hnl_!FDqBQ999vT=PTzhS-UfI-3uK*aV
-=W%~7h2`?3L|k)~1njF}JHROqr>d~hf-h}uO=()iI9Rgw8#?nNE+5=AS1`V*z1)nJud&_E8jOQdve_C
-Y;~{0KODl0EuV0{(-d>IyMd?qXj@jl+l8Z939?u(;#epLWyB?c&A2aI?-20Ps?)9;REs3LRFh6D;r+)
-E#o(?}dVVveuH<<VptpD^K@aqE4#a)^TJa{$VElm_*yz{uunk$)wp}_90CMO8YVBi#A%`&WJXTn9CrX
-yQIO=F(b4lw7>7QTb~+po8uA&*0qUm!Sw@>z^z7KPlC&E%IYsa_?^Pe9V8BL!K!Ld&~YGd^X|8@>Hkk
-q!y%(2CeOm%NA}SxVVS(a`MQThu>Th2xr6vPhlrzck)z>6uNZH{To0ii<DXl{$<KyA>VYXc-Mo<h9|~
-uCH=a-Fol*n49*u%46;}m65sEe~THtr;%L1@V-+#bw<N*=%bJwA1nU@P)h>@6aWAK2mnzTaZE(YR;qF
-i004G2001cf003}la4%nWWo~3|axZ9fZEQ7cX<{#Qa%E*=b!lv5WpZ;bVqtS-E^v9>8*6VH$ML&<#fF
-9v5~a>of<7#iEfU3U1yqI+32gvH6_&>(x$*Jte7k3gN%P-3GyAyRyCp^0`B0QVWb$rzUOVrdESqY>?(
-dhaZX0ob&*Y}A8qN4zRYj}Cz4<+53;9thS(Q`PmNKsv;=YhtG`vtJO9WBNI=lZU%0<;=N<KI^T0H1`y
-{pBES(asaRVvL(t=tloSG6oxuM4pe@Oa8JpBLh?RHD&WfT(*>@{Le6&xJZUdB$$mg7ylw;mv!|D8?JX
-B<&Lmwq1*o!9LLda8}KK61ir=!Gis;>q9GqL&$Pb6!3$W3-^H68aTGk5O}Kqu&!9$2w+vSWz}rB)_?%
-u5r3mX@b~b01cbms0t5j1=n0}DAUnAt2H1?ftxAwoA(eJqU-25A|8m0MgKy8-7!ds|fK5H_iEc7wZ{R
-@0WJ=3N^H%Gs939%i{=@L;?YNWe?P#qx#prJ80Zi^Deb7kaX8^8>k%e^pCk?4BQsj}`WBT?`LSGKilH
-O(z0OlTI1xK9gqcB&sUNu!)AC|=4z0w@al-)F~n4J82a&nRvTq)3!g%}%!o17Emg;;`#%Tnt5`!P_sG
-^S+V65XQ_ZexuA)mCtRXfwQIVB#ClWTwH^bR$IOcOU?EN=B&p%KQZERW3PMpVVvGRRUPQsRkngvoYK3
-k7`Nl^0uL$xSoxxhLjx*jNUG)yxq9h6A$krFIq>1`JRNv>$;Faq2;1KqNfT?&;!b=4QZ`^09M^dP=8o
-=$~bsGu-<i5EKn}U>(t__xdg|9WClAd5fSV8S{949gct#${op!!Yza!xo&jr8u}!PAha}6qXn`$W6yB
-jQKnxq;KLLuOcq5A)s{mSKM1UT+WA1)g@D<YWji+NH75YD3imC;E=)GQZ4NkCRbAh(Zs&dE{D31S*nw
-60v%t%J@3wzww$3?G<C{u3&p@I|qHGUb0bjEJ);+K|3dJ!0b(v7u&K>Ir^*BZU>h>fzJDp`(iN6*#lN
-BHyOXvCfyTeK%XIl_CPT7=3X%Of`R_|DJ-)fg<jQ-Ebm@p%Nb5fI5sHv02(#h$Cb5Z(S{rt!`WrT`zd
-7fuhzBorumjG;u2+6-n1`N9RBqVq~<-H}%^X@F5;4mN8ICSfW`m29|F0`y8>ZfavHV)43Zs-~mDBn&s
-;7c3DAuKCnH{#L*liWw?qk}h0}bdg)JeljF#%IZo<^wr=K=L8JbbgHU(L-t1uhBz5|zKQ^XkV2R8r9q
-c{9>WGpAonR8+VbsZ9Kh5uXyI6Scwh;am$C1WUd8^2_Ca)_c6$Jdd|HRo!|LOHq6iwXsXmIsn)f}eF^
-p4cM>uf{VEru>5G;sX<AsIoC=%Ou^gJf(3W-A3{}?%_Jsw7<EEG>rutF?ACsk$KJO+2`@fTJ3C1mBAb
-QSfQD;uClAmNclYF`0vh>}~rOG@Gy`{9QlAm*rb)xu$FifclzD>Mwqg@NJ?qFjj*%Zk7Hjp#*<0sy9-
-<Bwfd$8P9aXm#i5lA*&NMqYraQU=xYXrvM3)HtvJ2T*N+<$9MCz04qTbMxJ2LMjZ2CSSs`qKj}C!)bL
-{`Q)ex&E-=yY|Yh01<y;ppDW#9fa<&qZVL3Pp|hT{B__Kjv)BUOr&457)NgVvKZ-ZLdU8d>7=1*Lw3=
-f~o2dBE^5UXuDW`ZD21g?Qiy1RjRjeYYOg3q9>U4X4etLEnFSC%`%2^ti`^+0C`cnH%)Wf5Djns}Uya
-6xaC*bRMGj^6FD`0)bzD~m-+{V#4yy=`JrXEiq8_K;?rhuL9{h9gatAHmu2xAXt6!~vj&;}%!R(6k)X
-$KWmCuv||Qs|&{&yE3SpJL_Yb@B#0;I}R4yJ+I-2~_)Au1x(iHw&<JVMNL?wj0^l66J!Rof@Y=-@y^L
-s;gz@6%^H*O{J`}00+YTZUSYG>ma1R-(3BJIlG}<wuU*lE2?t<C)NcAH`q1GNrL`;#_C-mOMSkO3hUq
-*oXu$tJ`sPM*d^b&l8s;{MC7_1X8BE$Tu@C@igpn;63$a#M7&4BdJ2?CAdv)PC~q3R>aoAHkA}<l6zE
-j;<3aldPi$VPC9(RG69DMEE%aNr94nl)*7f;|7u)SN+kTx@&FaP3t5>gHJWz+>Kvl30;IMSVK7t-k!a
-RrCL~#J3r4@J^-!~eTa(qv;fTeo_$)q!Omv}%N!=MXlt|&QL3%+>m95QzD?2i~Zu6hTxpziu}(R<w3d
-mk?_>Gm7QAaAIvIO{tjBT{EAv-mgZN+?CE{+H!7wmz-0KozkP8q3T^@>08cB@n^ol5MeDp_I!@Ao^`F
-@6!32^1cjJs#^nvGPX542xcWOcTrjc`C?S+iw8I@O5SIfL7-b6JL*Q><&UCb7CpP)7poh*l}b{>I2Rs
-}Zz?B3s96KplZ`X;Hjab9FIG4yJV<MxNnu|WE5whuZ^nA<+FN@Hcil#61X!VC>$p+EMAu05Cj;I)X=1
-8K5Fp|i@`kL3Q7wEfioTFNxHvF>65z3w!@oh|F+^ZC6wM@YTIuj?PlTSL>itW&s-Z;T!7ffp3l&6-rW
-g7cx?X77T<>)aJr4xnL6xb90eHMvRSo<$<zCfbu!jJxw5SzeP&s57V$m;cpD|U7TrOo!`G6~2KeSQ{p
-ZimvU<h;oDyP2RrFJ|kEuq|7R2?8Fn%dPm3+?+FV6n4vEZb^Y*fByEA(*gZ=K#oBV;BSfx2Uqd6&`fA
-sl;kP!dIkP$Qk6N=uS+B!xur|&ipk<#;z+SQCO#E0V!xvwhG=$%LM#+mm0&9X6HQTzAd-%E@ap4afv-
-vIOdTnGDFKeiuFJE2U{qcgazm85E6`ehN6BP4f;ML@a52Ko|!U!i;6K9CbHs@zJy;;m=0?O5YFkalo-
-}6lAZQz4$Ix|&*4<GWdLwucV6(OkeCgd4gi%7v4c4FV0xlMPjjB4;*ULQsX|IE{L`n=5pJSZ0BoYoS=
-ShtAd)LC%VLKz$7sW`^$@iKx_Tr@-m9J;6=Cc*8G|Kj{L2U<-RPW+uF;fk_-gc&n==Z!u$$;NJ>aMAr
-XU)DpeIj)gN;%Tq7%-qlcadgUPezJJ2pHdo4X~Uo%QW1sOt~IPBsRN*#s>ku!Ccx%~6_|)m1&7^lajA
-D%?4jJ&lj2ARZ>02iZ&ACSI&X{+@0sN-u5k01iTd^UzyiLQ>e;HZ+APlf~6ta?#bi3nJ#yKf}ycV$%|
-@*=;%@A$P;lrC;w;^9qaDC^2()oQE|b(Ik4t43`MR`uL@6fV8>DITnuS!S$DzP21O&Q0%X+IredT@Jv
-_GSx44aTcY$pFKXz|DMQ0;_Fm3h%<av?aAjX;L2lOF9(-R_?z%)*??oAEc<jumaCS2sW3zaF_2)WIgN
-9X96h-Y_zqCi<ccwPqL#4f@q{p|$M|R%7Zs&!}FBjbc_as=Pc97+4!bR@MD2QjaLlBg8zF}Z*6CLQOh
-j<Lv7SMp}3)9yKxt`i)a{m?!G{bh8r81)>ky`ls+QA{AS3HTAW&OLnENrlht$-*9+)V<aW9>*E6?zj|
-7WxwGm79wS!#A21)TUcZbHiTr!E-Ky1_rIjAefJXm^V%LJ0|;-J?u@{<1P1YiZ8b#5%p~_if+^_0zxn
-2#=@Q}SaTWPYeEEoR2q=G<&KWw8q)aO<nhb4%&F9IBT@Dkf+KR5W}Udvs}__w+MCUdRHaZjFJdOH@D)
-1wIS04OSCC^3<_r3)far+QP_5}fqHh%?R>^G3NT)lfWc%xJFmH)dBjq8zbpzJa=-oJRiqq7I46Hmt^C
-=!~*z+*j+I3c@Y~(n6ZmL;3_lMW{QOoCl--?nREFDDlZrK}|_L=BVub$%H&<Z-wW@ZWP3|43oPYJf}K
-58Hc(iB^h?wP$zUaIWV`#$2K8HFvKxf>K<m!+|gO)&T*c&V_Bu;ryTO^Y5NYP^6~+3=Ojy*xk;O~cDo
-*uun*iB|D+hZ7!XE#bd%P6?~McXoVZ9QO=mJVud@pdG@)x|WtvusfRA@OOye)5*|F{RYZA7>Y?J65W&
-t%>&@lEL76ZOEf|-W8b9edsRrm$H^Drl;5MD{q}J@jKhZ1Z-PcAO!7wY{a@Qon&rMedsRFPdN|MUH*A
-GrhEgfKld;<6t%ll@5>jr{1hqcaOfGpaZvJ#)nx|%wxrgkhEdA*tbAOmbj_OYhV90WyriV-ll4P9w@N
-;1dZ-oO;jmTjij&g!ddX&yuyLIM*OWV;NIKZO7MkXv=@n9j=%`ORvZn6xy?~)Umz2olf!)c05vYDBxn
-5p&B)uL`pdth84p|IhRLKmR=4SicNlG%ETv9igja5s}rbdBKs6VG)^O9r($4aJB?^f~gl?TG7;ot}96
-8;0%LSmb{F5fP(@YIrJ1M>Y%?vRsIVvBymP_PYaK=~28d2SrV|CAR+1_;DCa3!Eg9V)43M-0+p_I*A7
-wgzkqUoA@5#%Z++yD82RCG?yCs-#lpO(CL90l#8PfVgQ}*M*PR4#RBr&(L&?jLXNr_{czGBzSEz^{MD
-n$BpILx!51^f;UrOnM5h(^3p>{QuwO-;d)WwJXlt}y^zN(_->IyNEj?&>$)~hjVVVjFDNX9-MFphnvL
-SJMj?J+XId?ZFGH~T?Fb&<QEFnx$@|&!0{q#%-*iB$O4%iK5gkIcMNH(Vcc5uj|b9`>P!|GWy+A%&*M
-t~h;gMm-Cdytp87ad<v=ICqDK-88$i)Qces$XIbx}Br!f;nRwA+gH|xIVO?8IVovu*TDbqnkCP9jDz~
-AeHqdd_nv)*L%vM!~gN=s6oL00#Hi>1QY-O00;n48F5Sq>Mr=(2LJ$rA^-p=0001RX>c!Jc4cm4Z*nh
-abZu-kY-wUIbaG{7Vs&Y3WMy)5FJy0RE^v9x8f$OcHt@TD1*;&4yeUH0kHK6ZP13E{k`%2wY)Auxk?4
-f09-c_$G3>|hNRbjrk+PF7n}EhOc`x1_?<KFBx<sqhy5(&{Rx3oyP2F&WZ&+QloUFR<3Cig`Wwfpm)K
-)aBbFwNZCk-yxY&Kg9B3WG&B;x?XG?nv~<C}t<<IRRvw;kAHS)@69Dv**^6uu_t0%*?E;se3o8nRY|Q
-w@8A8Bt69S_bSmt~k>h{ep(5a7ow(XQT&NwVW3Hep%;jLEhtx*UgjqfHUP}jcy4)t;=^UEppPt@ZS&R
-rXVG$I2PxeAI%Uvu#OgJv^$fVS%Dct$DB96QpRIjBZ`1{1iRG=l)+c4n2}<gAkq;tfW#yAQndwa)&FK
-LA+U`i<lr|1EL|Z15Sz483^LLiusKV=ktY_<=Ppr3IG~lifI_ngy2nLJ942&)z+0ptG7@)iyanwza8e
-*l83FV2UVS7#Ynr;TAW6Z<7+1&)O0dpRKUAbSt+Q5s%Nl|?Io4;Bvdq17Qh5-dCO=0Y0bN}Qg4cj0mR
-yAuq?$AW?1yaNC|~HEO;Hlg6*6as?AlWv^Tjk3_Si{oJx=l;d51d3q~*GUxQEC|@qal4h%$WwGtP)0s
->79tmZ?~HNtEf4Q$KiG!QRE_E^P}=eJqB}O;c}3!=K^;mp3_<xJT#?GjTx6?-CUCh+jT^h~@}a`AAXL
-V`<DpMs)*Ps)*ya5RXZfpWK1!w8?GFN$G_?Hn`~yC%}S-PfdanPwUya*A)XDEXgBRY;(+UqL$y0b={D
-K6xWu71HvwGPY@PXj0M^G$bStkW5=_Io1n4aZp%2F&ZOXX=%AVeS+9B&+rcggT<!J6*g#>CO%wFkeyK
-fHwq$BZS>KZ_t^(RMSt@#hDO%We+oB+oTeYLi!eLyQyG==_QCSBBCl4Rxx+DDqfDu~`xR(-H909`qSn
-5pdx<0w44eOZheo9GboT7VKy}si?k_@t5W)SV_+SUrBs=hFoN`!s&X3Fe%DjU&Ckde(t-ZAWrRS6zz)
->d!}x?Jo@>0@L?f9Kp};0VC0*Vljx4#lM#h2h2XSBnd}rX&}c02CZ+3g4sXD1yK8`w!P+YwE`zBBppK
-l0h8HuS~04eD1`1bDh{klj&3vc)GIJi#mO%pn&nD9A>fI0}dWxCREF>6WcW%x6KMLvdj=+_cx0QOZWl
-#J@kRZtp!EMsG-!U_yqB(ATzqH!dgq=$3B8|-4PpV49WsNtauNd;Z=0U%Obi?1`^M#FMC=h39Igrf;(
-pF4>UKcxMf4^D$ZD#A0f1dHcthG)R9vry2(XbwT$G4_qd_ryQQ{VRRkx3v`=qR++6ptspxqx&+S$=o~
-wF7mlv_nYl4QqbDwQh8=u07AD=qbzVr@6`O`+{cV2%Zm0NgqS6^;j$yzY71Hh)eDQNZ~AAt0V1IV5jL
-{1Y>uS7<2kn+_f1tm;s#X*qA00f2V=xiy@*xh0+T+++qNnP4-R-QBOqGC87)pc?pvCyLxPfO7u+7+Wt
--GE^mNnOste{|#DyS%SLRq4dKh@xy)OvoCyg>?TdSGAHQQ!kp*=~*X}r<?cR)JZBTF{s<yk=zysWy$A
-+(z<l@B&+V-V(K8(Nk^wE*&QD12H#Fz=I!LQz27TRqZWRrR;VYsW1j<=hkqszo(lT6k}1@Bsv|fUezI
-~vr$W+}95eE3!0mMq#&zRwIzmfFUG79<*OlSE3nTVL?0^sVBB{duRp-EC?;goG$$XdlvWI>?KKbPc;i
-9M?x^A<QMKoqzp$~*m4Q9O~eS(n?BT95_xAbz>d$5v3Rsv%sLJ>O%RHma;2f2ikj6=4=86<8Ns()pFw
-><lOxw^PKJ(Kk;9Xuf&39zMJ^WuQHh8dX`B3$@}anzNH?GubCd9R>z+3o({xIEO#WZv<$235&-XevGT
-d3=+HIZ;zeAR}8g_nu~qX=*yQ_uV?Ja&c!~k28!pj9SXvyXXvmdU^8Y{On@6TK@6zOzLlJUlSjW80@6
-_7GBpF(4F<=yGq|-?=dP9AE77;d&p3#xa_uIHuu_xqA2=jpZ)j>^dU5X_8E%yStS3wg-x`-L+=wGpab
--sGDBi1&0EU6q$x5)b_9M4LQaX`VHai<V&h>lcjM$v{^oZzgYBLUm(h#pzyEan(=!<z>Z0LU98WIKcj
-F`Vcz7sW>+o>WSU~nS*}gtUjy?cx6XI(m{=JC5&s#vISSPL*jiJ56XJfJwNO&sR!eNlOsBoJ8g(mb-W
-KAETTlLYt-gS&IJ;4ua#E{M<vCTjHw>WTn4Q~Jg7(=yy#;h60m47fKCTdg^01d8gNi5#Gd0x3qOvluV
-#=y(9n1&O*Qki_i7}S@3^ef2WePoy}>!})EFgf0vC~^!*r(LgN*WF+<E$R#xeh1Re_UYcUv}0&pc~@*
-s#hk89Kb~nSs~e~w<KTSOd<IuO09W2;3z0hy25*i#cShf%H*@=yxYL&_umyT!tqbwG**OT-PuBV=nD6
-y~Qz%JbT_z1o!v)oALsP2FiN01*`e#k6xVcxm`Yo_9vmD0F_RtdQeVp+Y7pNo{T#(nIk3v}eisIF*`^
-m(){04^g{kS5wepWG`{R>b_0|XQR000O8Q5kVep?#O|GYS9z+%W(EDgXcgaA|NaUv_0~WN&gWXmo9CH
-Ed~OFLZKcWny({Y-D9}b1!9da%E*MaCz+;+iu&)^<7^v%fJYgrP*vAgO!1eFNJ}wV`Lp5h2jchaU`>)
-NP#nQ>~8b#J#!;xhKCg8P5RO$5?dnA{WfRL(5t%Iki}xP6T6x%79`(nt6C6x$E#u|*g}6#NR~h3Jg>@
-x?8<yuWo%L8g4ML(lNV(BROF?2o8_F|6>PSxE5Vk6Wyf^6WSmbXE6HV>Z_~vCE3>LjdH!fw3HB%!;%U
-n!6LY6#1|zjFca$@8tGTzx?<wGJitxd*D!HJg;Pydt!$OpF!}ykhY!+m(6M4}*-&EPIU>9^Ls`|<Nno
-I;;FKV`Ck6SVW8G-C(n-?sOevjw>_<H+l`ZZ2pO{3{#GRfGAteH5!sTq5>%ZrTF@p-{EtQ7Lr<z}nDP
-@zn^+7*SoKf3^Xvgz9ify;phe!bWs>}j=8AHkqLT56ue5#?DlO+lTBLS7b>a|;<uQ>RzpU?YaSq&ka5
-Ugl!4h&d}(i85i*8gh13l`e+7Bw)IbARvhR)$>#lFd*tP0>`v;fkswl4Py;{L)Wnq&!h9atC49s^{C~
-m_7TZBk?Ozg@KbV0xSJig%vF)kqkFL_qT9qVgon={5=KxA%-Bm#-QLn#8&QgjSb2F5p(=gP0cL)SK&%
-S7HV^&iaE*^fNDv(349EnKTtK8^5rkXFMTvet;$M$=M2<-8m`Hx~-B~jze`SjsD94$&0vt!NXN0;5;Z
-%#(4cV4P5_)yoHFhIUAc@h$iGt>_5f7^Kmet}Zwq%k<!H|!+tz>YN$Nc%MbpD36Xl2}I5G|8u6)SSbG
-$vp?Lm&eDB1E0v!E(v>N?<jo3Z-lBfK)<gb0Z-8f}8;{!3cZIxyZ}414>qT%|!tI>C-22OvF8_8QIV$
-a>odT9|D$f@&&$&iewc$&v}}r9`35D$-meW$xBiIuNYG$1pppTr`?RqSb-`(2aH>cPeLAOv15{5t5OQ
->#s(O4=|d@j)<iAw5CRHc$m)oIT89U<0dVGTpcKpBKiy8dH3h9S4lzK)OLe0%xK=MpS~n+%9Ipit*v3
-K<#0C<Br%mnN8-s0`@5Wz1#)|7x>v(kj7F#TamJ{h}yQqVo6_=jn4qOW+QG&$=#nInm;+d~iB?(ju%y
-&=uX;li_Nd(G9QS?DuPt-CfS2Bf233Mc)<`2s%0fl5M3*eaL@2aW@@<u{Stb&#PlW8Cy-EN_4)&?+D*
-zeCUlcyRhR-gkV*a2$=@Zi;>rgf0mzIfU{?-;n0Ir1f-`s%7HXkKRQ5eRiF$uw2ZVuRNsjxWAu9xFu6
-_nBJMY*Rh3LyfGl_8Qp%8zr9V&k!TuK*$*BGAd}|*&ge`Wt&xr7zr`7jsk4BLIX#<^dZ3vRW;gE2Nm3
-pGbMh|&E<Y5^>>9Y$fbf)iKqxd9;(kYFG!^m6gD+NC#S75qZFPW|8$#5IwO>BU`Ht4!s5zf3rttfJ8c
->Hop0GPU*#-Qq0_-_$`YDrT~nB(v}h(1U4IN=uMB|`@*1}rYHE#hOa?99wPb*X8-G6<=7)Y?^eHirAR
-Q3~lB5UL%IKAXWdT_s%MZ3%wHswQQqd4`vujM+4W#L1U0k^)J3WeAmlgP!Cd_Z`B<x(0x&=WLF?73S@
--nEyx(c3}NVLV6eYsZmkpgEQrEOvE3W!0eq;xhTIx4z;7?G<cHd-zt0;C5Rj}Tyh1PIhf$ri7ZLp=8D
-IVN<QVNtr*ZSJhePNK~GW_Z#h6QHy8`N&Nb+(EymiK;1Iy_3T_xs`#2kI<s9EnyD*VO2_;fYO&*c0e_
-{NDR%MtPV=N|MjTl4497IYAVlm8vTX@-r}R)*O}as0uo`<eWuzH%fR#cS+(5R(d0PS>teLs-4*%rGK1
-pv#G(FNW`V4RRvKVOKmTy{{`BVW*XJkEP;+LK>lv9D=2B1du?uA7l8vSL*!9`9K_Bfmz=<QvGy;7hWI
-p3j#a#)N!_@PkV$t2My1c_pt7{h5{nw4JT;Y)I>TkwQhgri~x6c|L)o*MKhj(ZV$N!!+tT>4$9GVnk5
-@KZ7L(qTx_5A8)@!|dZn+WB0QPcJJ;(GDnm%qvnma`-X?SS}=)j2Klf3v#T#kZ8}2c*(*i(%*d1}{<F
-W+`T`@!bw=%VitVf=7a`BW%mlmUbu1>I!Id#{J&Na^@8mv>U*)cuLy2M-b9I<0>c921xd`lx<-4Fdaa
-yAM9`-iduEa5hszHo5>$1@Pr)ocE9?H-9n3&^Ft<Xj#REpCu)%AaSF()4QA*?KUcaO9d0i&lROc+0Xn
-QLbLjr(h<}dcf2F}o@{+tFu?}$ZBY87TJkp4*Jhh;O-Orrn&_2m!_`I&GI*x2v&{M4?EhYXveb75<T;
-Fbz>DC`Yik6ugYWaJDp7=gMn09Xw?RPDHBs%C}@WjtQ93RUFKR!Nj+@ZZO=m<Puq2|i{yEC44q)ghQZ
-*cNw)H>1m<5nG|+hg~Htic>dJRxRwt+sg%RX1MXTX!GCH&iU|<p!}i&ra1XkIDq|xy9|B%qRwWB<>J9
-AiGPRSOSJwx~{9;md9O9<h8BYDp!LGd&ZyYTXO%&Z-)egoU=C6DA>WEyn+a^wZ;z(g^F9PKT~iUcn1P
-=TnA*U9vsK??$ldT_XYxP2S+6*5Qa-l%j__}+Uq&~wU;!+0=9(mXzT!Y+p9lFaR#0JLkMa{C?=L-2it
-a(Nc_kPo6A%+6ot6=aL~Ql_<afSd&FmQ<$l?>*tmyOdl$OzySQ1n8F|y0Q|ZZW8}?WWA9Rlj#rBQ^{T
-()m9I4W=uM&`QRO)YMUptOBo1f@&8KwWM@-nU;+(x?65!1HNa)uGSf3+)joMp!k6!^jShBP#5O%o1_b
-kqIH^*R^kC`&E7Tux9Z(Y)LfE!(FzuE+~{d^~I4#!4^CRRz193-u(Pj%(?=jeK{_Ot5!<<mUq$`#(GT
-{?7jT<Ga6Ip8g*-_<x{t_bS()UAgMYJH*D-YI))HIw1LtI(^yZA935{4+j-~GIw(i4uyZv;e%Z=SugK
-YQLXAMFKPX>@6^$E!~RsT8K5g}D&JfEv?<hUU|#osP_9YlvNs}Tt(im4&z#k*H}MfER5#Vk#(ELQHm=
-BPI9-!;>w?@?NkV_Tck$Evdk1!?+g~uv!Upkxw#Dm7oXKV1dfaVD!gfSY6x}zR)oGA(<DllmPFGG9*;
-zBHbOGdEH+(L0y@4^(TbT181(&)!*vF<?w9Sl}iiRxgw6p=ty*IE2-_G{BpI{8CC#QG^WUSsZIQ7ZOV
-;4I{MkclpCH4h#Bto27yLCY`_#ROS?Xe`tL3c&_mgI=_ZisWbf{wbs{HT}r)C<&*A}IfZI*$F4=(n}I
-c5eph{l^$#R-_%Y*4`5buc(%^ko)7w#J(E)tNObHh&SvH6yo3y4yKd;0#Hi>1QY-O00;n48F5V7{z}k
-n4FCX9Hvj-H0001RX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7Vs&Y3WMy)5FJ*LcWo2J%cx`MhaCyBOYj4
-{|^1FV;mWCm!m034m4#-sj65F{3NYfy3u2;A|Vok0r))cAZl6G{x{P&yL7k8IS`hnaDXd{#J-kI5%*;
-N!pKi7FzGP154!n@tBZrY-{Chdli^7FP#Slcl8T3j`>*(c;2o)<ZzWWyTx#z|X~jx$0z*>>4xR<8wWM
-cd-mpyAtH&3SQEvL(4I+D+ZHfQF3L4ZSXa|AuBa91w08$vWQFTf$1VWmP+?=#~MW4Q<I)!{`mUV(lGc
-6=?v1a>k`pd3{%L5RC{CK(az1-2p{fRdovpyM}S3Nz2kmL{LNiSHgEJE7nB@@Ag88bzPSA9STW7*P99
-$pt>1Fg?CL2xLf{wHalmZTLR|G>MaV)QC*}An4BnsG&S(o8lBeJeg`_CB}i2h)NnTYbptxlYOhd$2dE
-)PWLeiNQ4h8)T0+SwZRuN({#V*m05OZAXf|6nV6!w`cWu|OG$q9r*OJgHUYA|VQu+6i<i%~li@I8pt}
-3!RXK7iqtf3{J9gy7~q;8+*1*f3h3Y2VF*0TJFW*OsrHd9pZBxkPwZkYbY_gu-6Xc4Ypk<_Ckt1I48G
-?IGh>!RTFYXk4mlx_)z7GKh<t|)WXa34J_zylcgv60+zYK=VufxEIi$7d^Y-gIo%((ANg*X;8So-_=^
--tNFl<LJ-$;-6nGzg>KZlW!N%Vm4EYp0==}04oS4C-Pw&QJzPO1gHUztfZV1So;p&odbMaU;P2*T|A!
-=_~dL2>sM4oo2D^m<$5U`V@Y-$_)_*JU!rkawtbT;4E!Kqf^fiG_>uEMqryx5)dkQL0YHBph<cBhzA&
-kBb7jwWb>#__W*b<oci?&)-d|kK3|+e0u_`~o*UAEl))bHA8jKF%6)zH+=M@BFtlk>1Mb9Dy=o7==SD
-;}KJ=H)=iSCFEp|N94yN_Lhz-fkTTE^RttSM+&{F^ngt44Dx^~Uc-wXQj9Ul%0=Av`u7o4m2##E`jef
-x>AG%g9bC-zXpBD|A>(L9V%;NuHYb5?JN%@9Nmnw^$QQj2p^n+crID1TGs{a0+$^r)=-T;^%<8hNu$R
-6>=tL1Ayi>kqaJ22f6Y!2q_;7`0DipD704sIf^wEEl<x+hkPx)VjockL0aUHuY-vC<0H!8NV}#CXsSP
-Xo2R_RRg8Z8=Jc17^WWZ|kwg9>B8LNlXtmS{SeHF#58@L!oJe%YBk{i%@CLZXk5baew0snrG3w*cERz
-QDEcf`&AxFhPpE;S6Z%Hg&nS4i{Etc9Giy;|I208~|a#j+UgfT$4+h8qXqaiTHUQu^EUSLsyj)h4ryg
-nYwaZ(T9eLuHBu-oW5;)R)>BCN=zE+#7>w4i<vyK=_*On?i3MNsJ7)gIDeFhhvaserOa)PbTn@_}F{f
-;>CP6Fe!oh20;jniO5@;`oxRR^-`K#sQc5J;MJix02@SHyvN~P)tIWQ<6VC$sK8B1KAGiaMuSaEzehT
-0kMdBogvesvFtj=W#k&|$8U~~Fw-0zy%@J#0y~&*zTo!J(xQwOQ1#}PJViOw^l>XEh%9V{{iU1mDp|s
-%XS#H-(JH>BZMM;co~b*NzF<rQL~NONU<XZQGQ2CSG8ANT-PGMK{$c1YV)Z<*K(IsFSr?zls;{RL`H1
-n0ieKJi?jK>j)i&nYTN0Vh`|ii7cM>eu|FJFK!JZSNr5+S=1K|RaJyfD`aqI<LsQSuag?t(REUrS8kb
-DD881L&o`y*mrl=`={?3fkui9}7HL)*fhF|y?tryO`8QVpm6hq__UM7ATow}o~xgCpU`Z9Fa>eje+z`
-hzyZf&e@B6;?w;6%Wc=$vE5Ty2~Z}6t#L!&@LQXMAiEH-iDumi*RUXSswQ!N8F<im$|5;R#+d-$BHS7
-Nx<vv{Ql@9?J}C$DioZ*g`*Kf6E?Xi4mL!AqIbgo<EEtbJ#zK!x2Ew{?O2&!^`p`6Rh0Zu7ggNcnhvv
-;PUH2KQ1_d@6I9S_g*HXYmHjHw#kMsRUXluqkfcgpOFky!)0@agHFE)Y_;*;O=uh7oji3#%#zX$=v~#
-_a=sv{(8MANSq*zh-<iZWBwnMIKHaql|E`8q?P@=0@DpX8RyyoaMSHiRECNC<S?&`6ow{BHG@l@N`WC
-WRg+|qCPpn3p_<026iBNq^eD=Ql9ly-kz@Zin(a!AZohlDf|(hf`GhbC4hYtFt}cJxTudVD{!E_V1oF
-^2}!!sIxcOpab=bn>E{TjEggl`PC-oINMj13ko4o!E&$Sea3$eu=^4zdP62LkXhan*pba#KCjj?FE??
-+nppwTWDW(V`0rJhZAAGqZ#|@{O7mIGEkZ6`St2Gg%GiFu4+(*4GW}~GsKX`Ke2dg(a~ReNA(AlVn+J
-4rkA~Us%iE>M>XCaJn#KbF8)hX4#jzqwchp<u&D7_5$-EowLl>SPOj1cpD2_i$cp^=B@lPk*t*}I25=
-~J;)y6z7bauxe5R_aqaAH<q<{!Vcy`6|0Zq&dH*9a$j$-kqnhJN!Be2^JTy<jnsmlH6&qMx2RosAg@$
-7Qx)yi4Tnv9v15>P)}2IhD8nJ&qLEk=NTn6|Sh{TG?%FOc>n5EoXP1^fs&q7BVD^)?PzNiFOIPRQvVv
-j$(^{^PcPy4{~-a~a!uCs0W&(Ic9BV_fd%CVvF%H=&Q2s|C9{PZmFPJ<h9Mh7rR!vjQubiG!+u6N0p&
-=j_=9w3DQttfRYRa^xhR>0RWUUWbnwdd^GhyRyJgn`=v(fF5eoAMd<-79Mq_yK`#yPDrIKI3kX}1fxR
-v%NJfNkKB?>w(s}5ghRk(>7Y4^_cWHCPyr)A{sBZB)GLNLZRt`ye#KyK8QnAya>U_IHngD`{0-YQK;0
-i#4-g|D{O~|omb*h)eSTw@eooRy{Tg5WeSc08YCq0qiq*8i6qKKcBvQ~P@e0QONGLCJ;AziFPzwi}k>
-tKGvnhI{q^OR+p9)ves#;bM#JqC;%qz?Uj91z#r47u1gz^i0y(GHef9;=f`Q1rq_ZU>X)>%K^W@>$d4
-TxG$u2wR5lrnuuZ#{ei(m)sHqlt&9x$oo*wFQW3p>!8y1oo~)jNS22Ydvy_q9=!It1qc|R)E?`_b^`5
-Y59?E1D*RM6Vs4;ajm0eTS&d|zL45sTnqM1f?x!WT<NvHIKDLeY*oj{2bx8AfG~i9rwCORyl=P{K~95
-iew35w={*yg<6dJX>365nag=AY^$n{md#PPqJidtVuc$Yhb=OG&=qDDCb>B$==_k>pGt$866*6#j)c4
-*J{1QianQU;mkg)Bp-RmhrwDhmI`SZVFxQsiX%(?kHX@_A8es4Jkn%OkISp}4Qu%g(0;)@AY-P~-{w6
-zx5GPa}&-guibnjY<XzU1aGr)-c-vtPHULt*(+clvn2pnu|ozK=Mb7c{ZyL}~`b{Vp}o=4V<|4^RcxI
-aX4yR<2+;lnZav_oTFoqaQ9qQ|HAKVua>@z_x~$CiEt9#rAcT4=&5{sQ}^~Z1S<S*U2Vh;cjBFZK#1=
-KcH^mbQ49<NyBK%gjB|U;=-FcFTu|NdBx<VV0GE|j_&d5GbsLy+||tul-WfK_>5O`^b)pJQ}q4{a&1w
-gVwi?;-E8GlP+W^vG6<iiYXre3;(FbNqWxHfI&zjL7O``@sEySz-XE@*9N>3clEVT8M@JH`5x1MA!gY
-rdxSRh0kwZes{BBcZ8+ExFmeb66)g|r<h3|1e@Q>=on(d=@AO|mK*Z|4kd___H&O4#O(Z@6*hKB=THV
-^ACeC&>(gJ?Ds3o%qd8%g6idH?Cv+czijvfi8=jt;lr6OZQj_uW;Ik0=2tD~kNf6akYP=|`>>?Rk-V+
-1j9tO$`N7vM%uOU>+^VixoK*=K$7=c{G<V#s_;|7SW3<x$AtA)fH41P>=y+$pn{NjF`#4x*Dp-`!?U8
-vO-MAR3#)RRAEWxpN@}@pZ#S%dXplg^ThQ{;|p_r6fX!oVf<+Y!2FQUqft^5r<@jvc{CPYFCssF1_6e
-}gj1P4v8vEHPW(E8lDt^2nb^n#6G&117BRKTc7{0r>CMOV<4?bQdV89_JNx_DhxFz9_h&CZq%t1g{`S
-44rC^}%^W%s~owiGYR$+5MUW#2?h^11d+10F4zyE<qDy-Cx;k_!rulStq%x*+uhu%em+g#+GN}?KgE#
-BNa&GdM{?WUwA)@~>Cw@U_*<MGXzRo1|26ke-raJ;fZio6H|`#%~GVynUfS0Hx8{2TtZ$oB&Ipt#<&?
-(ZNbdj`{BYY1c-N9J*)rj}4H(5@77LT`GDt%4yEJRFh-Z|b6+E!i+8ZBToRZ#ejOmxP@pyuo!`Gapt|
-I)wDS3pv>O9@|VgJpoVeGW-=0cle}UUuw@yVt>LO#I(=9@cEc8^gp!F6|qglb0NDu4uf0v_<*AjZ2+~
-Xstz=fw(hD7tFFh+O0Y7Y{TEP60|XQR000O8Q5kVeb3`GQO$Gn}s1*PJEC2uiaA|NaUv_0~WN&gWXmo
-9CHEd~OFLZKcWp`n0Yh`kCFJE72ZfSI1UoLQY%~)-3+cpsXu3vFg5!C8zVc17wE>NUd(GPt=>vbK{z+
-fcWW=)YANhS4){`Vb8SrR4Lb+#`PkXRP)o_pbQ$CKkYeh!)BoMwhe0dft6%qvbctfc~Gs3L}m4VbNx)
-n*GhTd%32!oZG+T%$r{6s1$xP|?WB9Tgf_j$$k$93P;*)D%jE;2F)~c8^b}mt=oa6?v;^6fGrWiV{PC
-fJKIT!go|TcL)f24`yFd>!`Q8mlZxmNHmhmh!rKLh4n8~m$zRqM3|sE9EF#-^oL(TS28K?tglie=oT?
-8ibj|xnkq&(y7>eOih-alva^BKCWr<tIew~5<xPt`Qq)vRI4M!*5hEC6DUISdj-s`a1*}%<3YF+;1?Y
-fO2y~0Um7y#DeTwP7V;cROLM2!xbGqUVo9h}QO%J*llr{uII4rCx!?->y=X6afZdTNW5JjsMCI$^J;5
-yz=)8;3hLR^-L31jbaS=bM!WN$DYy=Bd#75`fB_$G3k@cNe|!;N0Rx9?FDp-~9XCsuHY8#;w1=frNr;
-*Ave@afatJ*HJB^9b<5T)m`rYdiawaiTq2?}%cu(vBedz!11+W(&6!<7UPL=&H2gM-J{eB70za9bAEl
-HY%Arf(lZ2u355LG)F!~|Eicm8X=uDMOck#V20h%ByHgA^}$<1$veU;bc!fCj{=dIPwE_&XacjB;<vP
-5g5f8;c>B7Sm%gswi8(y?)M8n;UYy6Fz6ScWl-lz$0P9@TD_HdzXFJ3YNU}A_FgH6P?}aV4d#QFVxyM
-khJj&9QY1a8>>jNxPQs;dyXBd=Y(H!2Eh80+Lc{iq3udh{eagOwO>23k{k&>d#_p2ZkHfg@?v^nyvuD
-jPX-Gu%%_S0@i=vffr<g!w>P4YdEvg8c+-gUvy>w5b-=A_{JIw7tx1jJl4w<(wRSUrhbXX{o(NQ1itz
-4~iO-j!V}YVHL-`EJp)30VZIJ>csD*bO>oncEg-qegk(=wYW$*!3c3oA%=8S@-NZVY_W*XWMU8&hw!z
-+aEa*tRqHP%fK|)HaQ<uU{7w*>-JsI$MEUXr#Za2`grvoGS{rPc)(BHy)6eclA{sFDqM63*hX)C=>%B
-*%=02C_W3KDi`PzW61vps?EQq*AiZo`xaP1(>Z1gYxC|!+fq$1<qDY2aYUz&Ei9cQIW22-Z$50v>ZI8
-Jdx8&NSm38qsrOt^^7oB~49ouj5O;Aa89rY%03vJKB4<)wB&Z8vUp@BOowg`MSsSV}CkoYF)&`0<77;
-O(ghAh}K%5(VU9iKzbNoNJ0#_1Qy#AJY%d>;Uw$YW^J1#;+3Cp`Vn9(o@5`DEfxiFQ<Yhg33qaEsj&(
-aUMuU#+C9Oj(&W6r5}A5VwGzhYUHvxWM|u*z>^<WtL=PgT5+Cv$yv>(mckYbK~ZbJ`-vKc1c^}#W(JN
-9eMm{(N2YFv!Jizt+8X<NFNzR_j#ycN=4V~D;=Sqy@aL6Q22U?dNa@;(mp^PLJVZx^oHH`Lc@iQ;Q}T
-?PrHiUDm!knh6(fnA<v*g6{ERdFZ45KFNPSN){L4upd_?dlkKMk{L<TQg7X)<#o=G$K<bA`OGTSZrj1
-pSD#wXWY(hk<*U67>CgDMYFq0;4Q{WQcikxp#Kd0Iq_9iC|EyZ_?LQj%plpzh$_-1t_9zq?L`6Kjc0E
-c^Suj9;VKpTW{f{hZV&C^4;>Y*ClfzW_F7kcp-KR(At7*uakk4TR}Q@);M+zt1G9&s2vn)WiXm7a<-O
-U2&k(rAl(sC$Oqr7Y~x-%}ix&7;{26ArW4SoMUbV{**a3z_-j<V2r5-RsKgmb2_tJ|;EdckDcW@%D20
-=esNGer!2o|2>QC9v&rPdxepnp%4c15REpthiK_Nww%Ihb@J4CX!(yvZZcLGV+#K=vH#z+wxNyY;8=G
-UDS<ZLks>(9qaVhVoO9@%@NC4d<K@^H>3&fCN1NW6h2NjLLvuuHimz3_5sVhctmA_m=&h`9D&3Mh3LA
-W#RxGza0TIr@nW$eA;;tY43@XB~AU@hYeWjFCllXUW_~pcolE(ey<<A!5-)NkgfA@($i+bkuNlK!B08
-mQ<1QY-O00;n48F5TaBbdOV1ONa_6951x0001RX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bV
-qtS-E^v9RSKV*hHV}W;U%{y__U0Met1<5-ae-i~Q>@OqA_xRVqHQ*mWKeWkZ^-|?JAOzfOO}(gd=bgJ
-``ricj?`M0IZKlD-t4tV5+?IqsSV@zRjKwyByK%nnS7L$EQ<--7cwm~ktk_|=BkRKHDY|t)ii^z2Ur4
-&BTT1hSyYA>rV7M@=c3y2R8$l8SjudnL@t0nVRrXo%Qa5{9k7#xD+PAV*=>AzeR1<{v0TLyhV#{@_Y0
-h^7XR3-#h;5ny|{iCrtrC1eZtwz@{i^9$7MW;STo|47UCmU4?-i)vMl}*>0VdzQ4q>q6b0pA3Hmk->t
-uO-xrn?u9U^Wz4zx0maqf1#&4J*Tj^>>RG{5w6)~i~~t{laC38eV9H-7Qv_c)4<LW>OX^m8eT(Gg`FM
-Nz7FRk0=lqw@Z<NX>X=W0#3F<cut&Ns>_|)Ox}UuzD&E+??VbsKHM}<v@v-BNCd+N`O1&D&M(u5ZOZO
-Qa7RkmtJ39ZK$w-^exzbu{rESJY(?(p(R)HUtuBeWHW9!P(bd9Am%%BSn-Vqt@F}NCyX1TAuG4My4Xs
-UX;IAILdsK54^pU%XkK_o)QKRlXR&C~*~F`rc@C$z!{+U_mORx|xu!<VT2js;djc+E@!wEmOt`3`980
-}mJZ@qEC92K2SPaJ81H>ICh9mLZP#njiImIG7Y4?!93oG}X%q8|1@zr>1&|+c&E}<guQ}5+6%ariDQ&
-kx)cioZ<+)AvC=e?aNQH-nx_A|q|gBst_G(myB{2=Gn)<ud1WuK0XcS=r}ug{pT<z`#kPfVV*Y<8Q&R
-`(k01Y2cdHNG|gR+yY@TIN_o{fFDhuM5Xb@bE+6vNA<plDQMM+utjhUS)H*ieOnCDkE~g98z}auwI_c
-K_PI2X%APh1GvJpRe?sD1My?H?2!4WKN7Hg@lcdsihu?e+zKSSh_u7qI2p^$P!Z^1KQ+SjmDYd3kD4j
-D;x@wI^?E4`m#QN6yzJTnn70xN!*=U$L0Ljy`5@tlip{scyywvQt!J-BIdzFcU;{Q3dHo2e>0clOqQx
-aEP>;{W;;7y;7xe&hbQT0++!DjHpAca`yZz;^-o5>mbQ>JxCItz5!AC6yXd{Tr=5yvBdb3W2kXtvD^^
-acRxQ!+h!NaFu7i?W>X37V!NBTUscS;S|m1s<`aswLu8?y`1d*jP{_zP%1ftsjxAVAFskF$ni;7GFo?
-akBwHr|?C#dl-Ii_Gq$v-EeM-^*@n>Q~&52fbJWgE)L5+{Yn5gHor~F^_=Fp#!x()~~YxABXbH|2+)m
-ZMfZ<ni)cLKOKXB{#tk*UifF~BDRCL(tB|X(-%NuN4QZ=8Zz{p#<8yZH|a;Dsh?~|{ie0xu=RDUAsi<
-=B#w5&ZKR%I#0z?H7_aQfVZ5d{lbD=sU}1cRMn=>&6<0SZxB8*KoB57sL;0+R7DlUZvYuM+k1Ckh{B6
-S#l4CfnubnqG1y8ZwYr!9SsYUZ1p(#OLDQ8mxjHf7PGq7tr5r2gXr+aT#Q*e;HpIZL?4^T@31QY-O00
-;n48F5Tyif^g+0RRAn1poji0001RX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bWN&RQaCwzf$
-!^;)5WVXwc$5G_A5g#tLskl-4HY<Y)1oK@S{fxps0Act#3=gjC24B2VyERn%gmd{Hw#&crb1a(cB&JQ
-Wr$U6BNU<s+3-$5cK*kxU`HldQ)ATCEN=?PI8z`fm!4M|j<<@3g?>8%q9M)`_O=6++UDh)N{Lbd@I?7
-52;bO4($qW1J0aN-MqlvBLwXfZqGwQsbOVYqE`15S#HiL5hcSzl))JaWdTIf!R#r*4NuvFIOwug<@ep
-Su*~DXzSpszawN+@a28A6Jt-yV@-GQ@wTex3&k_xJA;SEf{7Xny~e5)Xhzo&L%d{z`~*6BKXjH7g$5b
-Fr8OESTDWd25Z2RFCv^Nzp9Htl7`R4F0R3jO{wGnb99E+d>XseH?8EbO4?L58nzl74WZwI|ek7O#7??
-n8_Y-#CLsh?Z>}w#KrhIqY}aCGnv4r@uhsGXZaM%89lIzqABvI@%gt@&K1`a|b<!fJarg_*{d|<Le4N
-8Jbbz&>Eu<U*Fv!U#N^;7%xoWOsW5=(NS`LrP0$la;X0rrD1}HGc=jv!FIP>e;%CgPqN>iE*pVod0lp
-8Dtb@8kmQNrxh`*dG2AgBl`Y!)_kyFd1m%F8Q4n}jk4zu%`uSsydIZl%9;krYUQ-`)v;)@r3s6e~1QY
--O00;n48F5S^!4NSL1poj{5&!@x0001RX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bWpr|7Wi
-D`e-B@jJ+cpsXu3y2bU!+bE>UN*9dO(*rMSvwKG7sBeWCA0dZ6cH?kdzx^=zrfG^%B{Z@={>HHX(pz^
-6t6k9^R3Rms;g4NtTtZG$aWVd8xEz{MIO0SxD;d5zE9z7@>-YRfR}Z28k3FG?&Kntll1b44)-|rAkUj
-E!vtE?Mi2$Av+bR_252*(z0_mGt*k>+P4GgfK=_3q1O-)*^PnG)3aq$Mkt=wz-aJ17orqpoNS=Tl#Y$
-KZ^Ia?MX^fkwgl5y#_ilKH_!~lNo9rXvdmRhNjT%FReIZepg4S$Xjs90i7Yh4sme<sA@KhS7Jq)dc@u
-sO;y0lmdY+fTlC8kb<{IFqN=W1%%p~McSQ^4C>o1(d4eLyM^N2rcy>EM>a`%cE?z+XzOyF~q`C*LoJ?
-ETCZVV%n-?+R(W+X&>sfuezD{aIE9_GSh#$K~>D@9?CGhz6xglSb&2C}0K*Mh!x>*V|XC-g3uT>~q*w
-j!-0*E^YMC^eWinFvjVlf9Q=)B#$>_(qA0RR&iPeH}k?(|}cuW$71Kz{Y3XFk2yrVPAw@I|56rUiAh2
-I=EC77K0pn-N+<nb2LR*jS~!N77z39>UmLQaL?4z;WkD{K_cA^5KCbVCA{PNK4u@W{&;#vp1erGU>&v
-Y=E3lLGF(c&V!nlY>qq#>h4is)7_Lekpun={7OB)ETE>(<Lj`$<MzSG_oB4qOssY-$xKV^8>^7IZ#91
-&2`>WZ#H}!mpn5RGhCNLnEk&6-@_k$Bd++PaJ98(U+Agb4<uBCHqFR@x<`+=jNm9lMx?BKXvLE?s$xI
-ZV*)CD{+!;o%T6fD@)aF1L2)aB!LfOtOpeI8ME+*%#Dhy)f6kTEa}=T>1#Y`uLc3T1;eHx9ej0*S5sa
-DZ5YLLV{GAz^}W01&5bo9yY;$*&i)%XxBrbv37~yMeRokDuseNP;H)y760&XfGDXezfV7`5#`P?fj3=
-vmgDZG084!{BcF1LE+l8Dc`^^t6M43bKI<=-l*9c3ptHGMR0gm9Hr`*o?KnH<R6&s2N_y)+&}@(iM=`
-}9?{N`gNe{*H+xuAuW^H+9ncVFl|x3|j;+B9IyFVX^|srV_I-11(=}Gi!@(50p+~}@V$Niwj(HBI<SB
-Km>o#W_ue7R46TGM+S|kLaJ#5g(b{*{wrvs6(XABzjj{gA;OWe{ZTEsS7R<u_$DU7W(AP8|A<NYQ_{v
-(^gxQqyU7?7UFW$ef=f}Vi5w?=(IgLh$ggJB)*L7Z`Udl5+8$SLp$+D>!Mex5ZYzq8!q9qJ-QOhVyQ4
-e1o=+NIZ&%_(svw6P~^y!Cw3Au&*8uKXi*2ivGQX3hA4Fs$0sAQ7vjT-?-e2RrZckC;a8gTf!ChR_W=
-C+MRm)<_yPqk*Imo0hF{8)<+BCgx>{7wFFT89WwmQLMK;B7?m?UdMf*4lWy*(k}u}gktqCs-r>14U-y
-a+N{RlLjPA5<7tn6)zXcU7g;U9t7+31-&V-vIb6tS$v!v*8}r4{<R)ZCZ1QNNp7DYpzGIUc7na`snbQ
-62FzL4Z|EXNO$hMK6v#>8$awN%TmSb&?YP9`Rs&e4A@Pb5||L2~cM{_B3w~u~>#;K}`b|@s7Cr`(X25
-{WJp)Jn7L|zX<s+3E*uzBr|5Et$j4Z6_{{In75{ZtWpe*;iU0|XQR000O8Q5kVemJOUoXa)cPr5FGJE
-&u=kaA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWp`n0Yh`kCFJ*LcWo2J%cx`MhaCzleTW{Mo6n^)wARKg+
-Fh{8Om@NZ_!~qJdY0-ITiog(PiMF}Ql0Z_fjbZ<N=a9OP5@okrUxxW1k;QX99)9OaZ$z;talENiC0HC
-2zAp=*2wlq}s}zgP_Zdm~flFTGGg9R|DN+_^Troj2IoTjY$;&7{uskh9B>AzyQS7K<bt>7!h-Jrp)~q
-ol7&EV<2%py#&r&92q*q!9x{U?fvSV3eM9s>Y$_6)TU&ee#Vb^^&nM_i)AuN}8GO0u$!<z|#58n_;xF
-nB7&deM92nH17`lWuyGLVBa=Tgx;VS$`=rwIpYveuD9L>Z+F84IRVCY(=aWD3^sL`_4mG0CWu<b6@7p
-jiLG5>;cP?QzU=uHrb5EZfY0Fl%3Y6|s!%S*|o)x3KQ6COhC$upE}2SCe*4iBktt^TAY<775QcMZ|OP
-YfiKK<-IF5z>R2Gg2#jVB0*A&l>?QtAIm$I2?E%NbGm2YH-Rgwb;gsJr{4xno}^;?xDr_yhAkjFCahH
-C7jOn&L*^`mD1=L337$UVh8$u<dokKV0$@OV6?&`QZSff##q<I~mVzC4QOO|0;Li)yO8^UGsN%sKNAX
-4ps)Xk@%OSg9BR7UI<v^y*%5H)3tXZ%U25>lfr^%U5?Bq#S+rDQIS#=PNAt*D{>~EK`yxwXkJ8!eQNs
-vnkZsH#3m=TQr8EGSTM(U`8Anw(GRteZ>pIs3IL!#lIyU^mpYWwVpwEKcc`~0t*be>`NOr4kJtCr3OL
-AO};bkW2=<BT@yebVgG*uZ@d7^%Y649TVt=8^EcMO%4~|4&bBWP4|8jJXstn_50b%4P(_&&7u$?TUdW
-2*BU=HME5tl~gH12};b!OFZn$(39^q3wFP)we*rz%bX^8Hi$+{0FM1881lU)z|v(CMr#V1&~mOj)4+|
-jlx3)vyBGzML*C_E*+kGV_B%S#BTCf@(5X{)G;lU!DD@M8$`mw`A-N`V_q<KE)e_IB^gWrc&QLT`0>8
-ZC0x7*>8^`OS$VMwDF1CESOqLXg`O+#aTjzN!vs@P1O3j@6)r#kOg7!+MR44rs=C=<t`vm!pGi?O+zh
-_A$BtNijZM+EJ{AcZTMamO+Ro$dq(sjme1p_6Xv-J8v1;<y{dM3AnrW<q-ZALOKl`qGd5^~p7P|1{5a
-=Uvylsd)Ql^V&yksZ9~9@H}oMn2x$GPvOxjK6@~-Xo&dF!X@|4|*kV!|)Lz<ep*OkWF#GG3RE4TGQKA
-Rc0WAj#^^Ta~d{&j2NU!JsmlV5HJkxIk*ZfDVSp2#5)BVF%99N#gqh+L|<A6bTM3qeo<6;N?yn*d4Uk
-V1lI&E7f;KXT}hkr*4h?Yqgwy2WQ45N+}py0`Tg6w-`^}Am$QpV^#J7uYp|9d-z^OPk(r+KqcuY5@17
-aPzh|!#hlB!gIPW$c$%p~(+vyp@21IHrx|-1%px*-+xxF=4<LIu~qXFaCcW>Wl{s!=-;a<XD<WRX!<M
-06ediik#{ds<KJzrrA<7Kua-~Bi_lh_dHJFYL?5Wdx(r9>5E&45z~&6MX<oJf6{b@cXBB|FH1?ni(~z
-X}F6(QW8f2spA99bRHFI%G)`Ohx3w$VFRGRHf|Inc-0!g#N(Nd<?G7NH>=uj<E6n`Iqw=hfWj12bxt3
-^Bl{u0ipU17-7!^V?)1jz0LI?(w8&Xj-Y-ulpOVfA9$Sk_RP<L#d$D?vSok&Aq-crowjCx;rEDzj1H-
-XFF%S?gciRpOb%I5VReECe_ndpXOFNNp#S_oA?U4Vy1nZLKz=5#u;}))v2Gg=Tu9U3{9U82@mOs}x`$
-imcl3aF^7eu<o%EqP%WSIv1v?m)G*{hnWh?Bj<V_XCE_AN7*YYU-{K~y=KZ5RWW)S`FH&L)v?|EBuG7
-Qx#^7Qm{Lq0Q-&>US{NhpM5s;6D!BhzX$Q@ATe^pqq8Fd(V~IuH}XytsmTnoz`QH1~YFQ-omxz$k+i_
-kn_6G@Z)vxwrP#r)eX{pL9LH_Ls-Awf}poqk+dkt_PadcD~<?`cbLf*+ntl?-1XsUq|CReY3!{_&)@r
-#b>W!8$WDlmaS>>38QD47h+GdDJeyfFbO1Vha(0a!8^uZxJ-JSTi@}*$=^^*0|XQR000O8Q5kVe6JKo
-*$N~TW1qlEEDgXcgaA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWp`n0Yh`kCFK1<Lb7*NUaCwzg!EW0y487
-+o*zPcA5Q6PGAcri;VZf4htATYW3PZK&RIn@smYl8__U{vICzfk_O?9y)k&k@jlav-ZhbT%*TNW5aAo
-9H~Ebs@TWoa?0=L`~Y5JqUlpj0B(2}V*_EVwk2NlF+yROV64VqM@7<olNAIJ$ciE`Edz*4q_>+s(IVy
-V$I6t{2NSgVohC{B`Yq!u4(Ve}HIvQ(;u!dS$s<go}Ey`Mv(iV0pFKthZs4?d%BhzzrVP9J(@=D{GFs
-2Q8Ad#2nok1Lf$LJ&)0Gp2U(H17U&qlgkW?fRJYGeEN9;ZX}qx@=~dyC@?6~W}U`6_)?}R7GNI{@IXP
-pXm~=1xq?063sr5VT1x#S)DE=5lmEWJgV3dcIc)v)R2MZIxl_!Ub!oM6X^6CS7Y3BJ6-L+S2xfJLss*
-E&36Acpjy3JO(s&jqlNzA2@8w>(PrRzEw0dtT@D6QFUnnkXyNi?ESq#p|o}31f_Y*&LvT-J$hPG1${`
-SddLM86FaLXA)Cw5-aWB~JdE!J*a%XbX8wS{<~!VpMjp9JXEo!Lz4m`j@X3@U{-R;PK#%E|nIg~cRlW
-BvKtt6Rq4KxJ!;`XzE?+?`MznHU3SULE)mA@qXY1zDRPgRG@Ay>|&6dMGH(fIdgCsjCjOfqE%@uTFFC
-Sl?Yf+FV}V19vT|itXt8cfdKv1M|Io4*4$d$k8wBr^yD{j0_SuX$@RN`rduKhl@E~b8h8LK;-<Xa&{V
-d<GCGfLTz2qcWNl?dGx1kUr>4{!%_M?q<cCKX9&MC8&-a&^%sM!r|METD)+11_jsd923U_#Y+j=-qK6
-jioI(b~WekHJ$5(GV*XtVOj2o^Op?QZ#vrKespZ6Gi7){gV5sW?Vz4v=W#N)5}3sUrA`boT0s+W1GGN
-qqXKuJy~{{T=+0|XQR000O8Q5kVe07qP#GXMYpIsgCw8~^|SaA|NaUv_0~WN&gWX=H9;FJE72ZfSI1U
-oLQYODoFHRnRL)OwLYBPmNDWEJ;+z%q_?-Dp81!FH0>d&dkq?kLOAQt4hu<N`=X4aRC5OO9KQH00008
-08trnO!G+8=^6t70OJe*02u%P0B~t=FJE?LZe(wAFKJ|MVJ~BEWMyM6aCzldOK;Oa5Wf3YEbhU!YOE9
-_4v~B)Z4Uv#fvV!rRMFNRCyO?_);?4U;=i-6#E-Z|99mJ~L!9h<GxN=O=kul!e2a>T3qWMsa-k5gir0
-{%8vGqod<!&3I@}lMpHDA@;35hR7FNmKF9A`s(u~;ERn3)Lnb4(KHc7TEp^)n2dZ}l#H?Y)i&26chW(
-M~2-N{XoMNvhul<3SxO?~Xb{mAA~gv?b#6G)~KXk(aSg>wX!lPnXd1gTWAL)(iq!HQm$Xa|_@&Gr(QN
-a$)y<0~e0Yb%1<JEIL|H6?6~mhsQouVow;4HsLiQXf0Z1_>Egj@T#-C@mO@;~dR8cvuZZS+6Wd6qx_o
-RqY?ii>+EummR7)EZc8{1*-&XfhkNcT!X}JSG+fS1_acHh-|*^+3MDzRuAr&95sYtn$7>+#-*-tJqI_
-6(u~!3(hAv9qCx|AXl2-1CKhCTbdvNl`&h%gfsi*{zdpGcnkRxLMREYCf%ZZS%s@j5*ZafhN9ZF!i(0
-PCV<ni<d!(7c61g!Ac0tX8A{40&AO_!!3>nnlP<W*LM{4YCUa6^Fz3#$F^22J~Y`<WhcpyvIWF{Y_z-
-<exPQBEo?la5APsBz)<mqxAm*^y#TD8;U!*$G$&<Ael+!3`wSI0(yFAj@}i@5k^P^n+Z(D9%d(Nvy3A
-R7;P2$VaIso6e<Kh1VPOw9I!y7&@iTaSnP$mKTgUCQsIS4W#lal~5?SOMY;UHQ33wgR>`g(}XAeo`U{
-lM1uSE30{bdyj0$;_sBiKu25f2z}C0p<6(wmuHJb;4^^O5GH}KjH1~qWDOi+EGt6dY?`9Q1X^Z)_B!?
-)0;m56h0{+iar#*#ZqHmlxsU}VyHo=3_NySuXqY>$=HXym^i5&<TH`YG`~tXsz|)%so>u(UV61DidBl
-AhjDceR(7a#`Pxm!2yoE9$HN#2X4YfNNmHxn;72*89H+ym2o5SCNZooQ$_MW0VJdaJneWU?ANPGvEt^
-;?jcV)kkV~B7~D*GMtkSzKQP)h>@6aWAK2mnzTaZG%HmT->%008I!000^Q003}la4%nWWo~3|axZCQZ
-ecHDZ*6d4bS`jtU5q;p!Y~j8`<!Bx%21$)3eiPC;U*1mfDpe(mTa%J+1#H*ip6Kk*?BVxM>-5FARjY}
-(!Lru<}iF<<uKBN+xx{@6Z#jz?p)Dw0-Yrh(mL2a#eOFLMSuJy{_m$gA`7yairV`L)Un!_10s^b-9%V
-SZLeKR$EG=vV@#A-X;vRrzho#2D-Rs%rT+#{O9KQH0000808trnObIUfakL5m0Dde002lxO0B~t=FJE
-?LZe(wAFKJ|MVJ~BEa%C=XdDU85Z`(K)e)q3ny$`Zc+i>E<vkmG6+BDgAHj^&ebTHV|Fld>IIguqTDK
-*I!^WXRICXu4#OK0b@0wPBgdCqsPJR}vdbc05SZnBi+h^`X6!a45f=OyJN%*|7g&@f#Qy8|QUKmNo!k
-t9ZwoZ;k-@RF)&ScGYkW14h2i!YSn4Tgrzk|s2{TZA#@9L>;+&H~4HN#aGuNJJl@X&F2w!(q@_XaI{<
-n)3xC@QRTUkjQ9EdPQ*ixfqX+$>(AMKc9;z8WVA!9?gS(r$ZxwarA{SPSa#TlPJ9%&(Um#CTAT4m!=L
->dCtm~HG>AYcRC8;yEoUbE*MK$@002;ANq<!x7$UpF(-&Th9t{@4~kNTa2(5VLz2J<kQQ*qI43KVv2+
-=e4HqLNg$#IfY+kSFiYk63XN%cI$>(8B60p~bGO!pl;24<vyMV_HNpg-b=qpLVPB^DLqQJYEW%32bba
-f7bWhoeLAFdd!C<htS2cQb#7KwNWrGTL!geXS^-<Rz<I0|{(i+jE%E*BxCqy~<s-%4VLwt`rZ2-SVD7
-iO9%BYD9R+x<sn-=6Xj(YdebP`=<Hqgf7(1El_SDR}|WOW8`07?cq>Qselo`kfo%S&=*m6g}>e<Rj@@
-q!*YTff-VOLh9XvPtU)O&&DS|{Su78LpNCT(29_{Tc{X}NphF3d-4G&ND>f8(5&0g-_TUYk463x$DG*
-wZdgGa@(^M|(>DD90<F+kG(&*5aqAtQo`^=fFCxGW9iLA62O$a9B)ngUm@xoUOPsTr9A_~61&Js`tcW
-40@pW3n;O9yFgq8&1EQ>`niS#06LfWPreYm*-ikRUrhomDZ31&*QkX0&dB1!b<>JboRec`qwDK>;b1Q
-}#UmS|;+0}b0Lo#+?tRE_{})}R>*f{L0F@T0;W(|ZDPfqR3bGM!_TkO#t$&YLKWkWPFK1+WH~z)e`er
-{q3K9};B2qWP1MPpRPR_!oq8l%<?XWM7XecVr}E+Ug=I9{VlQ0I}QPLoh(Wt1EfG4(6_Kj?Sg|owtnO
-d*f*$by(eTvXV`uTX^oJys73R=%};5nItEei24RYi)fZmEO#U!v1i_^px(RkH4!V;+a|kRQpR&TsoDn
-H6z~olzh=~{0s0`4KR|6Tp-7H`oeF-E$Vt#f1^&JyY>_`@<adb-+nGQ^^>C<cdF;H=KC;#Q;C`X*AI1
-G#-Y;&%{k?2|E$`PKf2ezEt3mYiXz>+#sSM-<5!i@|Ntw~Rbw13~VN9Z28L%{s8&GwbCv}<I<yDgULD
-yhxFZ61T`)sC^vXfBd9Zld*c7QJ})PPu<*K$U`kGNcKEg5)y-B_!0vWPshs5B1{SEFy7<3xhqK&`A|B
-SwNIZ})=A@;*RYm8X07{?(tx--UoeP$}_2{yyE|GFR;$^V|BkJulfEcI59XnXI8JM-Mb#BO1r#4&0(r
-pqsn{oe$eeB&c+Aiep_N6Xw-}PH7Ce`7UKo)y$@sS%EEfh1<crBzK~6lBmJ2E8x1^uIef6#BGq*PZ=x
-@7U{iTyGmHcXD132EG&1TT4Qc6aTIMCUlX>HRl*72H69uCT~=E9VIZbQ)igXZZ993(=~gb>atv!}AOU
-vO3ere+s3M8Ntp-a(h{W_iuy(k<JO@|TwKn*w{BJ*qP!WJWt~D(zz5NoN(0Sl4Ec9yZXET3;+6=HTTR
-@*e<W#XBQo4fo^L`1u>M}#)$K&xhJagu9=nad6@mW2hz15w=01eU6yx$i@TXrTI5?8$f6jyrh%}*k8Q
-K1{T<m&;q;n4u8zrIWM=Tvdj^GdlEwA=aUj^q}4I<F-*5Z0xmlo{LveP0M+44Tw(R-J;#fs({k0JXUM
-?@iEeNQP2+F9nKARoS+ogiELQE)8eRc9>3|gFdTu;{TamKm1C)*7TR&w};E>&k!!{_Ez;sO9wxRq*f9
-cRGV(@>iyuXG9E9#JF~SkMlYqNURo|TJo1#*pd&+Y8p>(H?eX00@$EYEC7677dRDiyi(cY!c2<rWgVE
-Z~a*;zx^mj(cy;V)_hwU_)h-u7gJ@F8Gp1BRvP+@vYASNCT1vME*%QGjvgju=l^$ZQ~U{n!^o#trSP|
-UT3e{F9tcniUEhZ7w1g+}Uc{{cDbzV+=}oHS*g1AJ!uIGuuP&njKKoXN%)`>O)FN0Nr#!Biy1)96JjG
-&hxd)2M+KH9?CGgEnn~HvJ}ORzW4%c_kI)P`Tzf3Co>{-ts9Yke9>{W(+^s^OD(+lE0%BQJc3#9u5C$
-6_8bY3OC(SiCt_mu?eG>cPj7Isz0l-UL9MnT5A1HwHqUIZS!u7C0{M;)^;QP9dOg%+5#_^D{4+5{5JU
-KkFT!Yy$R+u$M@n*I?=Z>Ie&kBbMe#7_Z}N(CDvTWdXA+G)pEQMe4h#(%QdW^Y*rYxO;MrgugBHisM^
-vu!t^C?Q2@CcZvRVNyx&U~>95j7+45VfqrT<QjH?c)4kC>N2pi{tfUKaa&LGTM2{$B}oISPW4|Di~c}
-S@>`8h+xRoHYZoyf|m$|sHbsgljjnphjc`p6CIL$_B$ck4yVTd)1MoHA|Yt(Kg5nxZ&O?)-UP66sh%n
-Pb|dJgluasN+8i)vg8abqaox6}ic=#tM2p?Wa>u-DX5}lGpUoJpzBOrSi9fw(4)U?(BU7%|d!#(cpcW
-?}5{t=Yae9?H;z<qT@!F==j`4)UuwtT{DvVEL?1`^jtHvP2RU+macc5Tg#a}(Ar4LV!$Y+0lDd79rkY
-F&}8A9pG+5wY;e|Fr5l(K28idY$wD4-&P2^4&tnsn@o-$OsRY4pxBGz%VXQh|FV8s5iMu`t#bF3@zxX
-dt(Wje_CsXmkLr6II(A~(K!K<%EBp@*hnXg952H7bsatJ#SX?m37SfVabWeGrW>k=iLS1+u{LZx<Hp1
-?TQcO-k3J_wcu$*na`ECZ^im+1I(D$VUL(d9QZBlWWoo7BCMAOufEWPrN=>cXm8EMy!i;E{R34G_R|T
-k8PxN{mDKp@-e;cy4M)(<IBti8?O7P7`l^(le}PsQY6VG~-DlF1y#8Zh1;-drN<xu@g16ay$8G3j<S&
-fLY(qu^i(0OxoOeEeoC+839m`k}PZxKkOx@2X!w2wQ?NAY!$@<?MtKyKLf(=y6x4~iae@x?`4<fP2cY
-I<#~6YLG<mJv!dnADfL>(LDN07lIxmU!6Boos4_lO9VPZ2bS0%jyKibHJ(=)<%s*kSQr18Pgn6)%oNj
-5%at*6GzGJEr5z0+w?#krdE$0@A!R>3OU~U6*A@y~-vp#p3IiI!gA{I@zbHhtXUz@EII-bQ8D%+8sFW
-mX5>{tKLP7mX1(8HR>#B?^nuO4s5*6!sB=Bu*VE3){`#jG-K?KFj#XD2};r=gV^YdR~pL?UwzQ|=wuV
-5B}rILk<~>N#b2iNq${HgXwg<XnEiI11!$b5C{Z+v;fgAc}h*L$xaFjZ{;;A~v6e>Cn(#d01%t;bEXq
-9PIz<w5%ltw)=KVK$yTO%E<Yng1}+}uKs(3K=I8XPz0_s7G4zm7f?$B1QY-O00;n48F5Twy!sIj8~_0
-4fB*m-0001RX>c!Jc4cm4Z*nhbWNu+EX=H9;WMOn+E^v9JT}!VfIa1yCuPDJ{K!PFtwnt)t0Pz&VVua
-YW!mpv2rhC-gJVt2#JHFTF-l}tYdNHD;lI6(nI?u5qBf`$G^AA7#;@>`g_hEnhYJE7R{pa`J{D*!2ao
-AU1{pQ0j*VpS?`+m(2{Wl-J|K^*ozWcL}^K1LlY2VuyUwrxHf30u7`}ob*Uw--F&p-S@{%QE>^9NsiH
-@^M&>+ioilK=hU!}<4<zxj5pU;X4~AO7gI`ttAjpHQCHf1$)bA#sAZve+PAB(Cv_YhrPRxUjfF+*v#z
-o-AHhY@Wmxu6VI{UpfcR=VCYgE0j}qmZy2;*|R+3_gQ}5_mvNBAGdYeWtO`N`C_@p@1y)a;`dR0pYZ!
-sMcyDck$1?4$S365{^hlc$SdyK6U+PUpFKoAAfJ)t^Gz;zCh%<O&)Y$#l=e5;+52<3cXxbGNvh@^_o|
-tvtTK=ofa%{x;E!+dlfSjE<r(qo_JUuHdim7*m2YC}p$-19Cgpsd*I_)R$_wQDv>iTI?v3T4UU{J23=
-zsdJGCG06ZEt_=+WBk%C}`2^=$?6$$TI1vOKAqJ^sM=5@@`RAl?g=9{>-<^4s1ny!Zd=->(0bAxQ1DC
-!RE@hpsjs@uJa97=Xmuv%7o!{qCW#{PyQ5r^pxNo8`BoPw7P-AeZ~beC6p8t{=a(U)tBEM)`>t_{Ns=
-Y4ggBAD8~3;^+S<*^a&28UHxG^*<cX@vGl;Ys0NKTjyurTRXO_0j4i_k^2cbKdIrG?I#4bWaq)YeYDH
-N^5U+%Ev5W`@+W4${o>!h`S|t6uYdXF_rLk|`sDha|2d8S?8BRTdZ{|DdaeepMy^(_cB=Ywqg+2#`9}
-WbM*dSZa5Zu@aW!+xg|Ak=+W4yR)y~zy)ydVx)lDsjhpUdO%r^vTDnza(t}@?HxXOG(<0|tF%r`LKz<
-dMq4V$X*Wqix0s^hDktIRht-^hF;^Nq|mR_e*fd?WMCOd&Ic!edl;j0)>yVdXEZlO=PNb+Ygn6~<f`b
-Kx;6JVu4bs4&681S>y-mB*;^7*!sl%41Y{j4F>&<uR%}MwOqzYFzDH9bBDUU0mg7u<<k4czhd=Z{zW8
-Y;ziqZ{zW8Jid+jHs;%Sd>fB%<MC}gzKzGX@%S2#ukrXAkFW9g8jr8>_!^I|@%S3+v#~xK^EKvc%-5K
-&F<)c8o%wd=+nH}?zMc7Y=G&QXXTF{JcIMleZ)d)p`F7^pnQv#lgY|hZ-@$wb>+@iJ9<0xU^?9&957y
-_w`aJmg9sK+b<~#WL9n5#|^E-KbC-a^B{7&XOnc$pct{2;l#rNGjf}2NhGowvobi%UFn<~!p)xg!r)x
->|Bxmvhdx!SmD+;ZpY;OgY+;-;7&2Xe(bt}<WGd_D8^iL05bg{#chH@<3omHGO?SD7yda)krA5+_&r$
-B{cHapxrNoWz}zxN{PBPU6l<+&PImCsnSpG9>Pt)Va#akhpUa^G(b*GvCa7GxN>NH#6VNd^7XS%r`UN
-%*v2i`7`s)tPGj?a)?+sL@b5*a>Q5)^W})Kl*m=)TbOTQzJ-;)@c44XSU6%V95EJ-7z;;?g(Jo?xaGk
-uvu!VfTV~r{2Di+%y|8UBlY4Tq=1kU{$vru_CnxvhWX+kZIg|NL<~y11WWJO6PUgFq?_$1-`7Y+WnD1
-h~i}^0*yO{4{zKi+3I==TwT#e+*D$nUE&*>`9=_=3ZD$nU^%-nL}tCg#be{6iUb9Hcaa&>W)OnqhRUD
-<k9w%(PkcTJI-V!kid`&0N)U#$1%Ra!Zz9L86U+bhTImE-oxaeL*sy>i@MIc~2Uw^t*tQLS^8tf;FGF
-+6p;)v1$eo%-V6b69cePU>FjLF!TJN$OeZf{)jUPQ6Lpq~4`Iq&}s-q`tWxgntnJLHGyZAB2Ap{z3Q$
-;U9#55dJ~<2jL%te-Qpb_y^%1g?|+OQTRvUABBGu{!#cx;U9&66#h~8N8ulZe-!>v_($QNgnttLN%$w
->pM-xB{z>>J;h%(m68=f}C*hxje-i#l_$T3?g?|?QS@>t+pM`%G{#p2E;h%+n7XDfIXW^fPe-{2(_-E
-l?gntqKMfextUxa@V{zdo~;a?xN$JI&QOFc+EN<B$k{6p3IOaE8t|0?}orT?q+f0h2P(*ITZze)c$>H
-jAE-=zPW^na87Z_@uw_&4F-gntwMP53wA--Le?{!RFs@HgRa!rz3y34as*Cj3qKoABpVL;pPEbNxB>`
-FT9ypPc!6E>f>jZ=csq{EvzMG4Vep{>Q}snD`$P|6}5RO#F|D|1t4DCjQ67|Csn66aQo4e@y(3iT^S2
-KPLXi#Q&K19~1v$;(tv1kBR>=@joX1$Hf1b_#YGhW8!~I{EvzMG4Vep{>Q}snD`$P|6}5RO#F|D|1t4
-DCjQ67|Csn66aQo4e@y(3iT|-z|5Ng3b=d#kelfn8>(}3W{QCPZ$5-~<cb~mq{>eZ8%U}HC-~E;5jUY
-S0bFvh&C<5hH<eT5{6ng7Ek;t$)Uja!ulH>F^h&ct|2@rEe&V!61PDODy6Xl32iyOq8X7qH3IjiTH5c
-4bh=dy8*aXa94jN1XXW84n7CDF<Ow`1H6xE<q0_JDJY+X1&EYazwKdB*L5+cRzt+@5iJ;P#B$1Gi_~9
-=JL2$9drPj2nvPSkWBvkWNREH~@EG+yMXs14M$L3ysAFF{f390r6z<f|znaTts$C3@nZibMDtoqB&wt
-@rrmFA_I)*s>odx(N&UP7tvLTyDFip5_eU?5GNkugdR-Xg9$w-se1`SESY-=xFvB9nNCjf_K@l1GUJ9
-dagx=Tfjcwq4BVM<XW-6^I|FxS+!?qt<Icd%8D=g6Hz)hJ0^Egh7vSa`Rfil^R~UBzZcbfwNL_VoVO@
-d77S`ATjV-LPSJxg_9g6|5GQbLel>s9E^@OG@29nBM)$ousen=YHZrpam=rkUN20D%D82X!YYaMcHoi
-QE5Esbw!pkqwO(BH;L3<_aClFr2)i%dHw>8Bm0ptC9HAm90x9k(1zXP{38_X(V~n~dZ=VU&kq0^nqT6
-973+(oJ;L<gS|Nswp|DP>9K0g`mJKes&hdk`toc!dNaQzc7}I$8zD>S^VrQbnN11e&Ly4+}{iRy%_fb
-?#&(hp4u##(75H6#Ae)bYaTJglD>RzDY=Ork&@>~$s<zo94UE3N}eMnk4VXLq~sAP`A1S`JH&&<6JpM
-eMWp08Qu2tDJV#0%k&@>~$s<zo94UE3N}eMnk4VXLq~!5ndXAJlo)Rxvy@-@NM@k-%lIKXtBU17lDS1
-Rno+BlXNXc`g<Pj-(j+8tiCC`zPN2KIAQu2tDJV#0%k&@>~$s>o=a|G`Z`*@ChJhmkGNNVp9`*@Chd<
-4tLEF)M(z9oVj&q0nykmEVX@d$EG*N_-i(+_5OGx;AsS-ik<G0U|e=4{{R{tJ<lgF!wp`G5#7L~bOZ5
-e^mtf`!1rLO`(agAFYO;>zL<G0)ME86O%AS}<%;VV4mm+Me9@Y!Gwy{=_YLD@2$`m}YAqVC@52`v7aN
-+h5k(t{5f{YaiI!2Uz>S);_@62e$SB);_Sc53u%ut$l#C54^D>YyjjP69H4&up5hU%T3A_p;nQj-iW9
--a?~3U^+t|*Bck5OQEx=l8#(HYh<YPOy%AAw<fu0y>Wv)rMnt`l6*)qYBP()*B1cx_h^RMm)ElASk@Y
-(k;4X|CY99;ZF2K!CLoC2u8FvNl%D52>$I3`5Zdv)36}RN5H&)!T@h!0pBsRWf!z~+k6=LMbF>-9^s>
-T2jI!E5*6B}@IL>(J&^R|T8fSWgHL<HKA1MP@FJ93~M5okvav?F%eL}T0r+{U;KxH<lgh`%Gp-_d}Ze
-M9WP-5GZW?#{S7aLe|i4&0q_!|%k-xI1uj5FZi5$IiGraPxk=I6TCG#S!Af;tX+NafP_C*dXpK9uTvw
-!Yt#sWD-wwEPK~D(XqUJE>3hT?<b4!JCXfPgx`tmcOv{wWWN*PcOv_p2)`5A??m{W$bKin??m=H5q>8
-w*^dU?>~|vkPGr9m;ddhYod~}Z+3!U7oydMCZs6XG8}2BwJBpZ-M4pqx4cwb?W2zE)suJP6B2QH!rYe
-!ADiKqa#8Z`osY>FhO2Skn@l+*Ys*-rBk}y?CJXJ}UswAGOBurHjPgN48Dv75m2~(BCQ<a3NO5&+X!c
--;kR3%}ml6b0;FjYxBRY{ntB%Z1yOjQz3RT8EuiKi+FQ<cP1m4vBE;;Bl)R3-6LC1I+Pc&d^xRY^QmN
-m%hqyyBM-wj|yq{l4Ro4PJu5OKkAcc-tQtSR5f{fCB)3&)t;N_S+ka?C94SyF@dG{Q2%^d@{#uIbZXb
-3t8lhuqCq{%&>!bP8MH;d6A*c>l*6JrXcStF8rjGw-+#x=oHMQ3VT4T8a{<B1eOP%%JWNXkAEsJ>Q;l
-;9E&}~#Imm2O63ien5jICmzP_Hn4{iycUeA-L(m5HjibkgVQ3uqH3WW*mpdDlI~#A{ZwTcY&!rk-w#L
-hb4a<g&7Xn-N5C;~64#yC!-{EQO=Nr_%u|sd8L(Clu@7mbAwztjH?CRPA5_T{K`)zEf4TjpD&f?ou=7
-_w(YMLk9=5JS7;9mz1abPiS$?tdUZhbytWAT7^viPz$p12!UEsWp67?vlD*C7mVRgB-NSi&t6-x3;YJ
-l`?sps@}bbkKM@VbDS2d4oX*jdjqVgT^{&&_Uy<*AVp@>!3jgjZLpX2W{}Lp@TLUH!QO8VzfaAjdjqV
-gT@B0LkBzSV22L&XR`QqRc9US(810+*r9`+b+AJRd*E9_2RkcUhqB4G`3|k>tW_Oa)mf{0y5u|C!4B`
-$*$#GSRcAZcVFx=;#d`%ER<;gh>wLCE$B8AK4PM8KoX)e+j%jCa+(<*8G#(w8pU(5kj)`P9?m@ho>Be
-nCe>!Vy?+|kg(J?#fY&AQkL7g=g)3m3v#&#If&c?JuV>@f?fW{8i*a3|ltg+*{xCd+OaJRn)YwUo=4p
-z+p)f}vvBV0a%RdZmaa<FQSh_+cZ2VM-1R9IXg=3ByZ57yWLjUBA91FAV#H3w94urD4^&B3ZUpqhj2;
-D8+*Z14sQ-eC0^FnEKV?f{>`>NB7|gVkps!W;bJY)s&u<f1XReg@mY0j(OMRhR<~j$`L@$xl|c31yqC
-Y!k{hS=lC(ZE`-ug!)WYp9%GutUeR!GkN`cB7tDCWy34RXR@B)<f3P?o=m*{o*c?esLy2enNXj}=a0;
-WMmQLrSPq)JWHVt4CeL8-R`Z#>+A^UKlb2QIxb}PU3)Tttll5fc1?%Khi-}`UCQtJh%*^6QY2h55#bb
-%^`&m3XSmJmVKgA32$*SBorUHvk%38HR+*oW7GZL(sE)H^5L)*Nrx!_<HyNrb;$;E4r3u}*y*B%$v9v
-81YE?9`gi;N3#%i?H#;cfn6!?Cd9w^&c`qUl*|PZsRSV)a>AtXphPut@YQUJF~WCyVt26WtR5ITm+_i
-6zeVdN!{^K-ZqlZzMMy%;xxeBfn~g%HjsGG;(ooj=wiDrZ&Gd+<0raBOhyo^Po1z-y2y?o4wSAmy(mj
-aFE!uGimJ31~K0fan&x2y8t)O{x@vZ<}8~HTebPw**IlxbArsq)3Etz*mxRtlcTWEC%izv5m#;FK0#c
-yS?xE}es}JZ4mzE02}RyRjx4+X+{5pBKP7C+K}he(mV987!+}js(?p@3&P&3azuw2mTjNiOi>w!?ULl
-uu655eeHII}SFKJJ{;`fsG^qvAKDM9{D!%iuglpT0F=ks`E(fA?l474+(oq={FcgJ7f;sSgAQ}>Wd;v
-|m#3rSKWaRgtGoIOm$U1%bI%e0iE@Z$AeF7u;y>h~zW%%1+#@q3<VI6Sc~FG-Apo|H#2<8B1xieo$l2
-~u(doWnEjieyU`=tB|wC8Pbq{ao%1PATo6-%1xbjwmd06k)kjkyA>3;0;Vp$$I#n2`I@=aPX%TIr^bW
-{^5JpA5X>{-ix{_2~b$rbIo!8yypW-5-`>>PAT#mY`P{Xn0O0%N*=EUoJ|t<@E+7PUb%315qe6NV{y}
-&Bw1s1(^-;SMCgM_CZ^rD&(5l}5Bp$E<Tq3~CHMb(hM{BxV>WY2Zl~XO`>u<=b@Wf?VA3I6af3a%!xH
-={P2|@O3^{Uhyk#p&rs24$hHh-hDa3uJ=)?3ls#May&lCl6`TY$GoXkF6jzGO~(dT&=huv&HmbEB2_k
-F&W_#;H&r<BCS`;P0BlDT*t;VC6`@xJ9crQ|N&*IcKR<i#7+ol>$FuR}ehq%Youv6nncmOJ2={R_(hz
-iePw4*11iEC>9ug<(117dx{Y@XPbH9PrC7hUI`?wlORZ{IZW>dEl3g49f$*>||IT_+=}@^1v^98I}ir
-(c9&LUv@Jr=<^bNUIF-nCcXlH5c~o7WuwCiz%S453cw!(Kc1r{&(R9N9|V5@{wVk(@JGQPfj<iV2>fz
-%@QT161%Cv7u|F#Uzu3bCyR;+@ToL$XkHkvAFPkJ*0)FxPD*?Z3lUND(WuL^t5yvvYK6T)ioe~T2)sp
-yg;fUiUao5VgFPkM+27cKsu`=+>c8QgNU-nC^4E(ZTV!^I1*)g#)@Qc4*i0hW@nOFt*Wz)nez%Tx572
-ua`6RQBf*!cxJzlz{5z+VJ^0e<mo3x0e_T#A*FQwshH{IaQHRp6Ih6<9+#rQol?FY&{wz+VM_1%8>2t
-P1=RpRWe|P4GA1Z-T!8zr-!8!9U9UZZ+Ij&ius!&MD=-hWpCy4Xo@qS=n(|+Htb9bL!|f6P$*AllTye
-KBpA?2K-&{ci``WzXQL-^Q!~D%==ac{x0}C@OQ!AfnRostPcEL@Z-q$B}cxm0sKSo58#*WCTjq{%s1B
-n{vr4W@JqbC2JjETKY)J-{sH_`@K4~Mf`0<P%$wE({weq|pIS1XS`+wXUa%(c%Te$PN5L<df2|4py5D
-61zixP0z^^-A7Vztqmj(Q~=VbxEZhBe3ue)9r@awjh1^jZv{o2641^)(qnP038{4!5m8~C^2-@q?BXx
-0XP*+R3hUbJKn&D!`hfW*~!oASd?9=snpF2Be8R8~6O#{B39pF;StPaa^NxW&&RIq#IRzX<CFvi9h(_
-~>Nu@zn8&fl@?{PcxJza)Z2!d_d0g+4mhxV)x!ZsUVx$-an}z>xA!Ho@Ac*=~D~RKUl}uOMbu552F8{
-KDEGS{kuC)Jf(bs;lA29C4T~7V7JWR`Mw`F?mDIJJ4uiikypr@$PMx?@&P&TR2c>LEpp!*FP&2GUwt?
-wZ?YK`?Nn)}q8*M~JYLD3GK;)GUPay@H<5S970-lxiF{u<$1SH0{7vvT;BSJz0e=(x4fvbjZ@@1f%^3
-J-#%O}S0e=(x4fsv)8}OUpH{dtHZ@_PY-+<o)zX87qegl3J{096c_zn1F+tuj6-vxgM{x0}C@OQ!Afx
-ip>4*Xs4ci``WzXN|4{2lm*;2*%R`^E<F55Yfxe+d2o{6p{$;2(m20RIsD1NevFAHY8a{{(*7;5H`kP
-r*Nde+vEy{8R8x;Fpi6j0yZx@K4~Mf`0=468sDJm*8K(zr>C$*hAU5H}2LwKen{9(T;rF=Iv0EDf=_$
-UH>^{75Rjmd10%ApILr?=ZRi&4?H$WpHk%&a`rFS?r=)^eaG*+{2m({B`@LB@%tga$0kcjLGZ{yIHmm
-lZHJ_6M#j39mvybrJ{H8g^PZc)6n=25%*~=ZC4WEb$G;`hAeRrlynSP)$yUxE{V)vfD<68n3(Fv<k_5
-aM2(EKGKlUM+-}9qJc<u05<kTlaBDcxL3*<XImLJJGMS^MO^+`h}`zgK11LRTU3GyuR0(ljAgWN>kAy
-+&T@+I<p<-A^Z>cB7Qw>bfS68s7Hli*Llp9Fsb{v`Ml@F&5afIkWT1pHa>XW-9*KLdXj{2BPO;LpIH1
-%C$qEci3<XThI=zX;Adzc{7vD&SS+_Z7UV@T%Y?na;U_R~23rysGf3;8lfJ1+OZ+DtJjMb*{kQ1b+j5
-$+6B2_?zHwz~2Oa1O6uX8}7U0_ekx|l6hb5`xGnuzT?yb<Wb}a@+|VVcB;r5<R<bC`4IVpe2M(>Dnal
-E;0%H@0H-AKmjIkWa0cL%4F3{<GYHNAoI!8~;Ed9ru!lwLVSzm?Vh;=KVG(;+U=NGf!vcF)#2yyd!y@
-(&J9bVf_+bx=*uw&QSi~L{*h9%%ICbC`dstu(i`c^gdsxIC7TCig_OQSn7O{r~_OOUOEU<?~>|udDEM
-gA}>|qgmSYQu}*uw&QSi~L{*ux_Bu)rRcEci3<i=8Y5_<3FB)D7}3@&Wl2IocPyT3}a;*wq5NTEwmv*
-wrF-wZN{HDmW|fNW4*QuJtK5%V8&r*vSGrS;S5j!|zRgZ}`3G?}6V0zX89=_!`F7WPI;FIjds#kilw|
--zypNTdZ=vrXgANl-xd2(XDQ2|1OZ7lJyGtFxJF=zU|>@@|+@%#Tw^*o%+=i$yY%p>tn_rhcp9U-Nl5
-!@s!dIHsM&2cA(G3>qv%NLNnfWVRk1lr<D7m-(;81se8!zzS#bAN|iUrSwFkO@16YqZTFK`d4*is!Tz
-Vtd1a?QAZK3K*m_FY8Fj~Hik=_sydUQ@&c`@)2f3tj-h7NxCXw$e_tK6>J6_uHXva%CH%>Sur|fozkB
-B<{i0DE#>*D_0cyGJ)z3uIW*TEcmVcrY+@!RKhXih1oG(LB(_);#tu<wPa7ZPrs^g_i2O+UR0)b0moa
-$Qg_$CPpkuEWIklydai`w6CjyYL7CE=2u{*As?bN=c#(xOvbl+JKt}d2M$Dw-bZBKYJp2H)>Nzq}3BS
--1ByBYt=(n>r-)|=>@wNg8s#8wD(f#Utnmf9Km@6cWA5RUA!Od+MHhSxFDG?PeUg*dF6Tp>t2v|r4Mp
-Ubsy}DAmKvM3zvsE{R@Y`kUXg)X!k<UzX%l<x?Z?lVo~8{z?FA5@8{ii9gmLhOn2>Fyw!QSyncF+CZ~
-JIaB#v)-nJZc>YmrFJ?`a<Ub#^57rdn6kQ;u=rT5slATI~s&*F8G#p_=3m0vGNUpb^XJ2&(%aC0XwfL
-+F4WKkb?-`KpAa_lX-#D~lV00%+2^SJYcj7Ke-JRffdkLE3>%VxY@&0CKA%=>l1>t4<cpbMXUfmqHFy
-#M}RpUHmvO!Hs<{GWdD*Z=y9zt^LspQ}Ho{M~=>bNK_D!SisJ2OK69I2S14U9EgS8#~J$Ss6i>KACmt
-Wufr3?dL6!d;LK3{{c`-0|XQR000O8Q5kVew`26O<^li!)dm0n9RL6TaA|NaUv_0~WN&gWX=H9;FKKR
-ca$#;~WpgfYd3{t(kJ>O0z2{eqSgA@xh{*P~g6*YhkCj$?Lns(B5KD=j+D_S(`r|ue8$!@_bAb5cJ-_
-#6oY`!a{FHxCfq+(82l@z7IXt1UIdq~%7<!&e8{Ok^XxsOUw%Sg#EvTW}qv6$7s}q<(*@OlMtt=h}N3
-=Iw2i^69LjoJ@4O&!AIH?uGU4wAcrc2V)I$>Oy1FE{ratPx`KYq-hD2l9r*M{{fd#1w~`g=g@sb*(k;
-SC~vB9&j(MxLY+tvC2>20Sf0gkNc^Pw9i#on=Kbqbw5H_1ZYtOS0gSq(+~I5$c4tIvU+o%#!j?l|3au
-58+-emOh9PNE0Q7q*5J_R{~oAN5|FDTdbB>&s7Ma;uP3+4t6*+WJtJ)E6*~XWf1U999;WOyR=1$W5fk
-w39B_tuROiv;K6FjLl%iAd-3uDl{)AeYqnseI<;d#qe@t<;Ois&WiFDawBx;Q=v%bKC7nQPDOaq0e6W
-tAn4@10snF79>&LC2rL&RLGiz9sevY+DE}-9>wy4q@+AJ2tCqf07mt^vO&$uOSyII`GEv(nmnR&Tglv
-5Bt)Z|X80j~>(!5C_Q$}58@$!KL>J~87J6-*bR?<v5v3V8>Pbi%k<Zu99Gn?<>WIh0v;Wt&7ML+l3KU
-{okc8jj0CUr$f-<@7BVBZ|P=I%lEK5nkgB+}xoIJU=rc=hrXP=H-QA;U(W+EzVO&mC{U=$5_Vu^&K6W
-PAcSr?Rd`)j`Rt#%%DLlynIGt7g3As!t1W!4rCr5K}E?-jfWGLA;n&E2Zq~UguklAql?MqktA$>fHP7
-f3~dd2Qr2}?OW}~No@h|iEJ*|a+{SysO4mRPmu*yhEjiuTmn`KOmSgL&4vI#e8ooex@q2k2!cbRax3_
->%%p6V#@M$~8lD(SP%@6c#`LDA*Hd582uaMr=R@5D?-K2`6gX$CYA820(?VoFo;~%26nEV4!O9KQH00
-00808trnOdIEYq89)F02KfL03ZMW0B~t=FJE?LZe(wAFKJ|MVJ~oDV{2h&WnW}rbYU)Vd5e!POD!tS%
-+HIDSFlx3H_|gx=i&kYP)h>@6aWAK2mnzTaZJgDg@ta4003~(0stKV003}la4%nWWo~3|axZCQZecHV
-baON|WMOn+E^v8#y;+kT*LCOnu1^8W-EFEZ+m*wa<W{@$oXm{yL*JL{zTpVlR}FC%N0HRnw{HM7Vk7_
-pAjTpIVxCbb%vA+Oh!en&2m&BQf_y=tSQ8~j=p%HZAlCl<*E$CZNQ&CO%siQE?X~vWYfpc<;-8*+`sE
-c*JpJtBE2{rr`LkDEcy8q@Pd~cy*=K*X;>pLKfBdDDuRQ+PiXZ=K#Vaqo@a)Tf_w-}Wul$?GR=%?GJA
-b+2=TATPgB347{>swbk3awD3y(eh{F6WY*(*={O>@N$zVn^$e)qfonEzkdivPay#TP5E;-6OjxcZSNU
-V7oV760R({_nK@x77vT`ObHK^rN3Y{?f}&zwrEzezf9;E52L*+vIQizWbfW9)DuRk6wQK$shGS^1UB?
-XGQg&mmYuRXD>a!;$N2jc%<)_ecxa4SIJ*}@B82W9htvl^LJwYPR-vn^LO3+-7tSQ&EGBacV_->o4-5
-e@7(-dn7>Q=y-omD0+AI#WMvRpAw*URkrhK^<q%mxL{<`!6-8ua5m{kGRvM8NM`Yy@TY1E;Mp${oRvx
-jHM{MO0TY1D*9<h~2Y~>MKdBj#8v6V-BUmpJt3kq9c<&pH6E0V|-#I_)@1*t8l*@C()XxM_LEoj*SE0
-4s=BeC*GZ2d@V{Yb1lQd>XL`||kjfA#$pKl`hdERL6pf6U@!x%g2Qr_05UvADKe{5Xs2%f(NyxUpRPB
-#WEN#ZR%gwOsr(i?ik8pRl;ST>K1+JIlq-vN&HZevZY(a`E#lE|-g6peOBHE`E{4LEb-Qagg^*EDrL1
-nZ-fgudq1C`)4c;^8PuCgS>yi;vnx|vN*{5S1b<l{xyqj-L2WWTeEeyX6tUv*4?_TyLD^Jb!*FYvE_g
-JPH0i1UM*_fT6^7Ed)-=l-CBFyT6^7Edp)xSZClW>1=jo3t@o>!rl4WHU&BhQVI|hE-mhWh(XjGpSa~
-$8JQ`LW4J(g^l}E$YpoXnM4O@d6wgxq94Qk$($3L?mvIVg%NNhoB3u?BYZVMW=plJ(Qwji?wZClW>1-
-UIKY(Z%XT2>w{E030yN6X5iW#!Sb@@QFkw5&W@Rvs-YkCv53%gUo=<<YY8Xjyr*tUR&@9_GF`Tft&$H
-JP=V%vw!mttPWplUb|Dtkq=A@HW3)Ltw2Z3tpIwcxHV{W_?O_Uq=7P0_#(<5-%|b(6+v%ZKc!>ZCcFY
-(56YxAjJ=@CJ3$C$CE6#0&H6Wwkg2F1femDSRBO2mb`7n*bZSsbZ_-wN|Xzd?+)QZV(+q!yAy(kci&=
-ph#ubE$MPWRci(1tkoCL!Ssnt2cMq^U$ok!bEDs^XyN6gFVu*K_1<YnP?$yk8LYVRH5k4`f=G~(#54w
-5x7|TOs_wI3)2OYh8g5^O$@1A6N(9XN3SRSIgcTb}{hlb9u92y#9IW%;Z<<QVL%b}rjEQf~9vm6?_z;
-bI8IRt-+<q-U3mP7DYSPsEYupEM?x#kf36w4v_t1Q1S`20cW%h<QDey6a0r?B3+u->__-np>exv<Wqu
-yQPHOjB5|T-cbVu#Tj#{<yF)USa)lVO>RO<xyIBlvW<4l}BmiQCfMFRvx95M``6zT6vUK9;KB>Y2{H`
-d6ZTjrIkn27cBF=)dH+wqP}31?+pmB5{mkQJ-#<2z=|sB3#RzqhyW|Is4p1fdus();YEGH4&PfZz)CU
-d3nuv9MgdlwQD3mW_cjS|a*ZI@EdrceBgl2D04LW7a@{V#$u)vpcL;EDjUd-u0-RhU$aRkZC)Wsa9Tn
-i@8bPja3UG3bA=iBZoLpnbb-w^7*BEj=D8R`zhFlK|aB__y*P{ZQTw}=fxB!tWgN3A5un@(N{7HG3lY
-9)xpBCUGp9IN2{adkAmnDpnAo{0&A^?IuFTe>pfuJu6aDq-kYy9370oI8|Noa`Qn-pNZX_SOE_`RzFt
-Xqwe5cfR$8+ln|4Bzh;VB47p>B9F11=t2BLay-rVF9+~iI6CKe~kd!1VzXael+>KkWf9}7k8REvqzTj
-eQ~F$t9(cizAx@Hb(IhK!S}_T)?D2~a`1g|r!{Bx$PB(O?zHA=BhrHJi#x5k+K8Os`{GV(&g_v8d|%v
-Y&B?U}xr#fjIl0y#S8=B`C)YaUD(=)}3!^&ZD(<xI<XVSZ#htqBU{r@(#htn|VN{1)#hto*VN{1)#ht
-puVN{1)#aX%xVpNA*#aX&kV$^_K#{@XJHXzq=0Zy(B$W^?j%Q8j{$W<JYOE*Rh^l{!15d6XW;#OV$F=
-_<2`o6f;hI6Zp;8x!kx7u)SwGrGZJ2g?$M)6TIxY_Gs^vxjM4<u-9I_WlpbU%=wwdthW4AQ;6O+fIrA
-BeYYI&a$y(!Kt=fKYj_i>qk{A%CzzfD>{vRMii~TQq}6uZwePg&KQZTv02C_Jh|1xE8DxTCnTOi5SK#
-Y0sFY6@-6Xyi3aozXjooA7};PUq2!s)bJ1Vqn+ny1$S^=Y`hh!?e(()T(xaM#$u*fknsoNZC%bZ%201
-b9xizrWvI8}ZCw^M%7W-VS|tGWRz#P%dYd6i5R1y3SIB}eKM>!VIp3Ov3j2{5P8Nju0aHhjOQ}ZfP*X
-ozCm;y(BMD!SUH#yk02gv0vHHOU0WRcf2Vs6B7Sl#Oyez=gLu5@qm=fSbhxFuQ>QRw!d{)A6<OiQu5N
-i2{uL^Lr9J#&^HxuMeF-Y@$C<4iy3qgkOL-DM+(+HA#ABqFboksE?h!1xPaMc@`y$^Q_aMc@0y$|;aa
-Q+y1yALHK%U$SD1Sj#KI0=`!i;7UMKNKh7a(Gb@D#?f9BwR8tDuR>vP(m`7)r*Qyp+6K??9zKt5vtsW
-5|X(*UsQy;|Dm`Im+*@U$W`36%lt)UsDzLGS^z{N?%L(`qB4l)1L-i7@ShSxm5`8_yi52+B_uQ<z)7f
-tgv2|z6kt?BLi%P_LNRiI*H#O#H7`ak@Y;X?Tk~S%0<R4Tu;Pu83%oWWz}CDNxxi~{1z5Sp$OT?oFTl
-z*MlSH$a_5x+Os!V{6T56-jBMexO#+<ckuAKoMSzn$vW3^S3UHD~w(#0^0Z#JB7GB#Sz)2q2!fU$(IL
-RYhcx{gWCwXKGuZ;?Daz(cA+M5ELT#+sO;0*yzuE-W%+b_V$71_dT2L(8}B3pRvumC4lWDBny72xEGY
-~i)z0-Rit3%qtxfRih7f!9t8aB@X1@Y<LFCs(8buZ;_Ea!tZ#-5V3ZB5QYTQh;q~V`S|<*e#&I(+>%8
---oQ-^?m_1V2P2n`(TxTP)j}%4~692M;ip7V<YY_b(ID4{I2W6U1dS;?z*@?m%EFRySu(ofU7LX-CY;
-w=5lv&J5-jZq#QyPeIQ)_iIfLXza-`8J6;wLBz=8C0Qy1F(zUx!^NSI=|4Pc8xN}aU7#7k35&h;F$T}
-fykRw7mAkqZqIf!UHcQb$yY)ZE~E`oBNmGYpQm!&-D=9f|qE08wG#hpnS-sQKe1cY~yxh{#b#st>*+p
-Pk^d;E5dc?zb?To&LaDlb)T&HzekZpt)Lf4>_O;3iWe_4m7R0d7_`Qhy)GOS;rwg4EydE(#Dg!my^^E
-38QxcCuO0KxI{VHLOEP{yfR>{<VKE<#sMv((E;%DQVU~jOvhw`}l-_V8=2ZlQe@Ne|%Cv==XhmN<i?R
-AD<RrC)Fj*;6HC{5MXE5B}mZS*eD=$t8cIep0r#|LuT${scEfHuRcC2AehI;QsIz(`}mvy7{_@55d8%
-KLG&Ms=#ho{_>usKUMf@zqQ4>_!~-8s2nZUG>2C?rcOOp)2#Wals(_$~kJ)ibkj1+peku$4xFOXvv-3
-ieEGXi}fPkQg8-oIZB5n)`2#UBdEFdW2#)yERh#PAJ1V!9fD<CN1#ySB(5jWNguz^{!H0v(!^2r_N?2
-uZz!QM!Md1P9#kzvxhg_&e3HYA$V05O+LKMDCJ6*Oj(X@zjp$r8*byRl1vTj7GKWH<H*aBdc}$Zm`Zu
-yI?0MAVHp1=zSPL2Phip8(g8Au71BUx3ps0)iU{1-OO`iKrWg1vt4P5q0CJ04G-@qHY`);N*%#)D3AY
-Tp}t#BI<^;5-t&yl&Hkw)yiJ}ql9?Hbllvu1j#HlgtC_-cazl;B(rYlGu*nYveoO&AZ78;E}4~-!8QL
-*FAXyNojCI{_=n%onWxBL-P|l7i1y|d0YS7kUlS1g!_DPLk}*@GSIm?m<8^bJJTvIv=5_(0rr&&BKv2
-ca9RfmyzqwOD(8$eQ0)j?v?iLVy_{}{6LiNA7S3uC%%~1hCV>jOr5Hxm^ZYM?N>ytAAg2p}>6A(1^$y
-otGW1ox*2>STsoPeN@PtFSn`uOC6fS`|0E(!?x_~ep+ppQ>33kdr7<cffxk54891buumDIn<M6R`)R%
-09U&An4;01~(}(W;a&}fCa4<01N6D01Fxr0Q(pe0Q(pc0Q(pg0Q(pb0Q*=Y0QRv~0PJI(0NBTR0kDq^
-0$?8-1;9RD6#)BSIwf^Wa#Kv%xw%h(ZI)9^*}1u2fNeKYOxd}4P=IZgQ%u>pd02pLmQzgGxp`E8ZI)9
-^*|~XKfNd~ROxd}4Qh;riQ%u>pd0K#NmQ(cGZ;Hcl{q_|7_M75qT)#a<zx}4T7}sx4(Qm&gzQs-1Nik
-*TrZ^S1R4{EouHsExZ#`{5uHr@-POc5eRs2W8$+a2edP^Kf)5#TG?OS4LP4}+oYTptQYr1zuSNoROR@
-1#JCc)g2Frnq%6@BbmTLri}fX?+TY4+XRmK43}ThiXQTpd7n`j#~GZc<B%e)KJA;ag6w=s@3+roH9li
-k|bW<u;uWQnP1-)N+zXr}~z7H8(XT#nhNv;?>;Lm=wL~TjJH+)R+|A=v(5|+)Bd~{pVZa)!b6U6dmVV
-;?>-0!xWQcZi!cOlVws&mboQfEpu{3^8J>0HMamUMcVzAc(t~ZD>Cl4#H+QPT#;(OC0@-fKunQjza?J
-HW!Y0KKD;Gf%`HDnF_Y$&cr`bZCdHz|TjJH+lEbuP7XznQZFpPappMN_r&wrsTLPeto#c{Yjp1#Hd^)
-z<mSVQgZ3%fgw%e9s-QaDBbvkyEONu3fw<XBw*bGmK$wRj#x^a_-QY3P2i=)k5wL}Kzwm90{RZFC9Zi
-}PMUA08c=C(Lmm$ONcv$-vf*5zzc<ZNz>qjfo(6givQ;%HsYCPmKXwsf9c&L&09=C-&|m$ONcv$-v9)
-a7ha<ZNz>8+AFG6givQ;znK0CPmKXwzyH3vq_P&xh-zg<!n;qY;KDibvc_9Ih)(!MqSP(Mb757xKX!$
-Fh#QFwzyH3tVxlqxh-zg%{)pm^XRs?QMa@(#gwDl;zr$+qZC=1+u}xDmL|oNqub&}-ISvgd7InfM%|R
-78WJ|2t`=bBT0^Gh(*XfJw=HS)3P5T|(R?~253`c5Avg2shyW}38j>=ft`%S<Uqd$L)Aa(Z<ZDR7e7a
-G9m3$5PmrpkdaFR#j<<l(!oaB*l`E;uQTcc}8wS2l=fRih7ET8TW;N*(r%BQ;oIJqLL^64G{POeC&d^
-#$?$rX8&Pu~>a<cb8!r~3prxgvA&>3#uDu1J}DdQgCqD{>{D9v0x_8r#9$S`vbo&*befjpwts1%z1UG
-x-QC_519AfDqDrCf|Y;f1e!^5F(q;<dc$6F+MvYAOtv{9TgDj$7ja`ggEE3;{rl8`Rs&%5bk_-Qb4FJ
-pPdpAvOJ%$!Kq>D!)Ip%Kp$fQppUZxppS6@(8oCe(8qZJ(8mP<(8omq(8nbK(8px~(8m=4(8q)T=wng
-<^f4s>`nW0p`d~v<!*avluM!aS@q1~nu<G#l{Q`nMelN`y79ak8P(aYf@1<?R8pPiZ3$R-R)!b6UTHS
-V7YA#<`!>ozV4(eyPO_*v;_Y-bHM9pPbYHkyynoF(JI_|gJl7d>{e#>p`P%G`;O7%Xs8ChgELaIk@qp
-(I$$QOt2oD&pOa%YV}L6~2S7!=Ip&N_qK-e<YY9g$txdTw-DcQd^jeRe;mM&$N8ORZ2FZsK2~ZRavHI
-_^28+kUIhUek=-ep@cp-AwE>p=Ro?skxoKYWCZkHTRs%JtuRUo4I|fnwj4;%y!tDrQbHp{#FYsgzp~M
-e)qtnz!u=^7G{7uENlbrwXg%Y&%zw=Z3_#);}({Hrwy#TFL%?)TCT#k+`e-ymnm+!edStik!H(Hx@tL
-h)bd-nx%6!-^V_T0EJ>^Fp3}Cqr`2|w!MUYlt+wB}&8Ase9k*p%$3}Loj(g{hjelDmS5sZ?qm?^-A#Z
-W_(7wBeMB&)B=<cDnEp$7|<)}P|PMgc!)<vztDcx;6)GDnz$Xrh{>$A_vT(2+dvo0)iU8pRwO3z$}D2
-uHkve;IhEOF0q+w5itv+o``d-uqsK=(mzJB<v%_1z<v>;r57k-05+v&2@-%uT+}5^Hjq+bbhWtr=u)d
-V7{SskzDOS!%0O=JtZfYPPY;=v|MzZp1+EdSr)%@UBPpTIfVkbE2RhJ#ySWK#WmZ`JS7vW^QlQtYLSL
-%$)DcobSw>@66n8n3?mPncM9$bG|ckzB6;aGjqN(bG|ccyLWaY4Vm+une&}l$H~X}&aC5}<9uh<aq@8
-?YL>h2axN`%E-iB|Ei0{@+s>u6ol9#wm)7pHHL~qoTHCp_wsUE1=hE8FrL~<)Yde?Lc3!LPyjI&eowj
-p2?bNo1ZRb$h&Y`rOLuosQ(yqBpGi$azY%{JpvG48)*>sa})rq$)^uOoyQFk(OHs5wJRlDhA?QFj7Y`
-*QfZ|$aa-fb5zwcRcdZMTDM+l@%K-G;R7meZ@-lD6%(T4-lBR&2XL;CANfhuhSkow@gMd%L!se`&YfH
-67cywcR*f+r?&WH|o}Q{-y2wOWXOEwu|4|E`Dn}|I&87wT|;I9p_&<&cAe=f9dpD`E;Cr=|r~vbew<b
-IRDadzN4eQLmJTD+p0SE(n)NGx8vMP$E^$MIQP;?-77oy(s8>?bzCB+Q?pgIQ*-a^x>+6PHagC2bQ;!
-lI&S0fj_ZnboNMVg*V1vWrQ^C{9p_p)&b4%$Yw5UfqT|Aejtdn!E>!3^Q|`D>q2sz)9cRiNXUZLC${l
-CQ9XA@?$(`O^0;iMP?pnu%6CD>$bey?&N~cpdhS@2t8_WBwE^_A*a_16q=Mr+~5_0Dfa_18A#JZ^5*=
-g?VG<SBIJ3Gyto#v^PbMCfy%Uu|dI~&ZM4d%`Ua~H1XE*+9P8_b;z=FSFlXM?%hM?P=4Z+FSP+|B*T+
-qQ?DyNNV;+t&HqB?<G6dmm>zdB^F!V?(4ocY1gGzvRxoa<}nIUN||st$=fvQ7&9lS+J*mdE?znX9c>w
-lwH*>+;a57<v0u1t1H~m3q{lYmOFf*X!cwZ8ui>?v~cGy6iv5zvkN8*H!-ttoy?-;UfCUXP`F^Sa6w?
-<CJh#uwUEM10W30WjfI>0S7h#eTnkiWPF-#aUxBskcPBR9y&|>5?LJkw2CHxr-3n)Pg)_RsHEM-x)Cy
-;qg_}TDxJIpT@oAB}cV_PJ%JI8bb_vWC?i1*C_IBo4x;%S{nG<&>*9&o5Wn<j*?o|KXs}}{jEx%J+4@
-$T5LWu#%yHgwNBi-KI7(%=|wZ&ZSHZLu4BGKKc*X`wQe{uFxr}o&(ojB^qlTEF<d-c3Pw>Np+HuR;NH
-D5L;;jz0@X9YS5W7KWw@^b=_&AfW{?$uQS8v?7F4ae}y)o}}30{zYI+p+hgzudLeCDvfyz51F_gmZwU
-bAY9DfF%|;-@UrmKGIb*OrXAdb)UK1^`Fa(;yh$8cNGounD1UaZZCHgtxb7vHWjVyH^Fxm&2_@dj=RQ
-9KrM6IK1F@be?)z*Wr_MQ%l6*6!-}k`s-hfMpHyUBXw>I-&g;XpyXk?wiu^w6ZlE*jvXO7>qTncYVQ>
-_?{%RDv%`U1U+gMaZQY9p&=)M1ET=Oqg^DpIcW>M@S?<jTwN>${a<-(6Bc6%&DvCB?Ju}e=!4>puBSG
-lbP<F->z?3(DR$p507LS7a5Uv$lM6uZDTiv5;{iR*$@MeY}q$o*mx`DfLfVI_Wt>ZD;!G)nxYzKJ`>D
-oWhIeU!MMJW9PO*IhTND)M_=yPRWG_rF*#oxB?U7aOkg8#P?-H)=%g?HjRwmK&gp8g42?)Tr4YH)?q6
-Xt=hzD)R5u@Zac;zpIM;FM2&TTuP=Ya(i?(-1u<Ra2bxO$kmC4oB2}}xvTsXl&Z+p=%zn)q`5Q{{Eu4
-XUbX3F(^N(NCA?~zE`1+0yX<f664X)CZ-Cn@-3R&ECs8YM6`<wcs}<W`Ow@8SbgCkMm9Lns)K#XIKh&
-UAcT#P+Ga0KQXD}@<ua@hBMJ+F{mK*AeTD}c#`B<Ul`Xf>1W|CD!{wm)>XWm3J?;bO^urkWrv4>IS8?
-a2Bs5Hktce9K#@Ab0Gsi*BLS37lLX#23C?LV;XmDnzw-)Or-kD^ZE45*X19aA49<n=0lB85+QM;+fnc
-YL7N@zthNI-i|;dF5C{zES~>06U~4OeFZR0#`?J?9}*}g3xPuTmd!}9#s;0E>9{5Q(2!<5c+UWD+v9!
-pC}07^)m`Wr|nq<p#$-p0&H@vz}1c%le}M05VRoMf>tDG;Y9^uR?|xYFw6TD1wj`-QxJ6V3k6A!T7y~
-M*L7EJO!L0JMM+S`^tpaTjUH7EGrhH5VWzj%EAB(NOG%hnqel<q+>lat*hX$e>!Qo6L^-B;Yn{S0Z>>
-6*=B?-5<VezJMZr98JrW|vMDOWyuPdqn?NC(jQN57&(OQIArCN(H=V|(!nlxrS>2U`+raS#y0eYn84l
-2SXYiE^Um$h*v*k(<(;Lowqh3vOg5p0w+q67y|Dd@g;Xq02)3zb^E)<Xc;|H6D_z0vC{u@Q!B?NpIg&
-#%mSex-L{$Z5$IFp(coigIk9cU|}6$MXM272x=b?MiSY<ryV72ScqFtNou)fIVS#pL`^(uJ2O<%hURZ
-<^OshNRHj~^bC<4`v6=&rX*;0`uv2VApMWjz_6v>_2vAJ1Yte*-mGp8HDLO}kUlr4@FOEA_{=dS(4lG
-y8w%**COMAZxUN+iI}2P_!{x@l=aoQ-my`r0exywh_8QRhMsgm>aa;-Z_g$+5XLGDm5_C9yPOB?&lzM
-(hj(rGZFXxH`1^rq<(9cKOLgP5(kF<rx#sqqzNZy9~REheyH7|Tb>f`AGYjUSAtybiZpun=+=}QBO{3
-#SzcRPJ)NRdB?0!weFFO4YjXHj7F?ewL!iu`dDSb#fyX}uzUA_Yd0rY~(&<PW95GTiA)n-ux;J|fC{i
-y|-Yi1Oa5$jdvTytgaz@{TC)9g4iXBg%W1A}{ZV^4_D!%R8dHM-_Q_N0j%QioCpI%3DuZ@rQ^OG3Bj?
-toU<8i<t7(b5{IOqD4%3>rpHIG|?iay!Esdf1qd)Q{H;uiaRBsDx$pg%oTrVXc1H1dhCktf))woJ*LR
-ZJE6SC6?u6ll=pc>Ufv1ieNmB@cS3nzR^;WKP~H=Yyu1_2drFa)cS3o;qsYq}-OTCB>c3MjZ*(!IFRT
-AfyPP5fd0$rloqBn*V|iKqx0|9}6+zyY)qlIO^{NQ+zP#+eC9>+dLuYljR|)!>)0fr7`$SQJHO14H)y
-4bMON$y+qAuPaU|Q6u5_R$Z4AX+$%ggHG{V}FRjVe(W?@ux<YE+53cz>8_QKL%K#ryM23-%)~tBdyoM
-n#SCRu}J2H7)9tx4L*g9$M5XZ*}qhY}2And8>=}$D0;)%3EE$KjE~fQ{L+0{UN7Co$^)}?|X<vo$^)}
-?~ghy>Xf&-cz@by(V)E5#rp$Kiw5PbF5aJcS~Mtcb@Be#)1pCntBdz1pB4?uTV1^GHWv-bTV1@{OtC7
-Wyw%0K{S>Pr%3EE$&-@qIQ*ru=x_CdRS>O!R=_~5u{VAvgjzOKiqAuPagj(PPhUqKn;+tOHIDKLIin@
-5Woj_DzJILuP8lt-mA*&+D`-=K+H}x<ouqov974_e4rCU_AC~x)OZu^3&i1Jqd?N-P|MT_!Q|LxB{Ew
-Gj2%8#xpYJb0%({qb!s-hr(mtR)mzdz&m>!bbArA5Z?SAXhHFD){Dzxq>ufN7DjzNtTTlQp9vV|`P9>
-h@}k3Z`4Gs6TbvHAY3o`lkNWA8%S@tZ(X1-KLFE(WboBpSpb;t0Kx<{i#mhmguPG?wnE4rb^W1y0sKl
-5mllt*X{9G6;UPXa{Vc&MVl&7m+L0LRz*~ax?F#3YSE@j)aAPU9-{|yY5#ongu2|0S4jsdnNXMOj=QL
-eAnyrvxg9U>4&*(dF4rw)jULS1{q|~gxg9TW91J@>p)S`gf~|@m?+JCe9WU<=<UOG-*UjpWik$LRm+S
-V3tcoaab-8Yv$f}6)R+sD6=2S(Lw}#Aa!Ch5Ed27h*_KS>)obuL?*=-paasKr5goey+*T|^IDQ^v#yP
-P^(P~Pg|yBs`QP~Pg|yPQ2+P~Pg|yBt4TP~Pg|yPQB<P~Pg|yBtDWP~Pg|yPQK?P~Pg|yB$SKd8>=}r
-_mNA<*hE>t;ed0C~tM~Zd=K!i1Jqd?a#C=O3GXPx7%E@Dx$pAfBPeCi<0tI|Lsq;EjZbALjAX&>{^tR
-xB73l(PUIIJ3P5c5ynR+S1ZE%PxdQ9xHUPT2;VU|s3->-QiSiB99C2UiOVnjytC3z)GV2+o!qR5U%y2
-Wzy38v{Q9km`1RWq@$2;f<;cx0D*dFik~z@Hw-oU^_9^0byse1ev0o9t<A5T5$Ff6{@T%wDqt)G1^dW
-sP6)nE6^po#OW+*4mD55mR6j2&y6;T@FiYSe9iYN^|L7SP&$qS13sp57@KZCGLeVt~$a7ry2lTfCo)S
-{U;oKlO%Je27vwP+>>r_`b`6J>fzE!t0^Fa2D&(k&*fiunF&lWzHURmAsJTXZW2qq4^LRU7oP>q|_}n
-4Xg0r}Xm{OXjbp)I96_BsEXwv8L2K>-;n|Pv*0x)I96_#Dj`ZA*a;#>ikr-JwFZg!TP2LSIg0p6>-y~
-x%5d+os9gtr-%!m<Rr@I!Kx>7F{YfHR^sO7b8VBHPZ{}DO;r(&_S>k$WfRIqkhq*$SrK2Sn7x`@B}YC
-+TuoIq#ug$Bn(VhQ0UWRpA<^WZg_wplIb<Qiqsd_lF(+hl#KPvozO(hP@5~<do$ZHxXXjzxnLq41i-&
-z@`H=5qc5L!33#re27E+&YTS$HGw~+cgU?KH+&_e3-kcHIeVGElN`_9(GzB7B+ceWq)ot=k$Xa2D7EF
-Siq<wL%c*}f_JotU9j`Ed)O&nf$zn5R|watoo)Df^w6tyTGR3!%>``<<M#HRZmu`LOS7J?uNPhka-JV
-c*$#*mvd+`_7{KcQWdXd+rEZ-CsUL6n<?)$*khk8GAh%v@y$Y1my|K+~SSWuLLSFNo)G*1^WnS?WzX7
-n5Q*;RfAq85~s{vI80bua^w^JSMro~4Z4t6v^SMKZ(7PP{u%vF<I<)4;_?aD7E(>;%<ti#nU6181~r|
-s%&W=m6HpaFP4CzigL%g(?PcKf850dL{Wzta44gw_q9SA={YQ$HeyhENP9aeH2^~?D5xQUPQQ|z|kF|
-rHyHzZu+o7Z?g1p`_4?wkkM|%UzA5LliDu=){GR%FaAg7$R89C*JK$TNYIc+m?^6U4?0&-G2bbBdRMH
-GtmCkhHh`x8v^O<hscGpJ>*?;Y(k6co-HBb=i6ey`){D;R|HKLxl=n5rTg@}#N9B~GheYZ*>de$_H>$
-nLz~s)&Yc{VfxIQ<oI=>`yT7H#MmUD$uS1(trLVsRI>qDb-VvU2PXXSmpocs}<N~o>kHP7kY4Hxt7~L
-P2A_wa8*%=l<uwCtjKl|tD*+JVqB5!$;ExK^(j@6&DB;#HnUI_l|4S+rI)Ir1Rrp=`lmEC)Lmdx%~eq
-y_nfc(DQy_)F7Sd_N=rTXp1=4DB{pMR6|traDY6;kxGxPF`G<c{(hNj@bSd%l=hrd!*dBJ=S8I3)S|R
-q{Od;;MFK~5NFD)<SY_yWs?b_U`DD_uaM-um8(odg)Q1PEuV7C{mib5?)6@-|-rXbXzx`H6ihJxV1nh
-JvdYAMK;<@eVLg7dn!<~2p3CjL-Ca9xim2-Wd>3PPy<yntpekt1soDG04ftRNV7qM(;Xn!PmA?4^-rF
-O4*NX{6apBh6kKY4+AgvzJDiy)@G7rIDs@NRahdsi6DH+6r`EJ6M6Bi(e|h0;XL`f-;^`5R~zZf}o6N
-6$E8Gr=ZoN8X}$XqJp4|mlcGj{S^gvA$Z*9mY!Ed;T2!f2fJxJabMdm*N^?iI&q)d!y}Fm8m#=gM-@d
-tFDnXKHTMLq{^pE9Hq@<(YRkXy=-<7ds1EcqMM0^ubhaX{t&A|v`I|FOC<+>VQbD_WJ&Q0T`QBk6SkL
-mbg1CDPj3O_NsMfviMOdTqyo$*!QK^br-79K@k<Fhf2;cjX0=up_j<AsA<>!<H7x2pC`mI<`@`}014&
-+xw!Tx`(z{OS(7L(jqtHcWi<EZAr&YmKSo<5@>$m-pLN`krnSV72esYS$H#2adu_|XVk7icX`TznBBh
-E-`JeAQ}%Jqtcxj@l*g>bakEb#qX{=Ueo#!BRheO-azj=UbJ8>Z_KNxL`8E(Crf|f2j!ls#Qv`V0&Ci
-+3OxGFS)lyztJr(sfvO$A5+lip<N8?>PKTx_a_RxG_c?zy0?0;p)eBIQWy)2`jjR@6NRBl#U9q=&YHr
-y+-YEtRN`TfR_b9(ezUGHn03v=w%plN*pU}9Fqg*~7&4;`4@>z?Vf9{Z3bq1x+7N67U{TQG(?3@dRA>
-Np127M(gBa8xG7QyR%@rf%1_X`$(mbpUVo*?)HbnJat{6k)YO)w0S6|xbrJY7k?KFC8r_ob8jb7Sm^w
-dtHw{{v2(N3eMb{f63)99(4MsMvjdTFQ8OFNBT+G+ICj@wwNDzckJS4BPsLuahd`7^iqR2;d@r{Wlaz
-`ZrctA9#!L)`@~Du@vk+*@<1`X@B$Gt^z+ny3dGNG4j;<*LG6<z|J%2_~V<tXiWe16r%dPKAsUxAj%*
-H#LmY*e>XgQ#W_2Dsmm76#g_)5G*!U5DYd^5X?1I5UjPPAXsZ%K`_>af?%pm1;I{R3efcRDG7Rr%(tV
-_TmE>7{Ce(*UfmpOdSnC?YI$TN6l^&%B0^iJGJ>y-R7h~PkxB{9Hc~Oc*TyQQC13mJ97*&&MWL(uNNi
-B(sy>n!6w;}Wqy~k2>LWFSLPGVCx<Mf&^hm>?c0f&oLQ?3FmO)4hMSX@9U{)R_m=Q>`56noU8G#v*Ea
-mOKWkx1T-uqi-gwmwij8vM?TV%x2gyJG2mnJk98@af1f#b9V39r<vTafUN4T69lH3;&3Oi>2$K5h`C`
--DLd?vn;Vwoe%Z(LQYuB>NMCAlPRNf?S_92o~|2L9mGD4T43yU=S?gMT4NPpBe;xy<`yd^|C?G*DH$J
-(AUolg1&xk5cKs6gP^Zp8U%g)${^_L*9L_)Xr+SgTj5n8v_X$52yM_~3PKa~xB_(I6@=F1Nd=*Cc}hW
-OTb@=BnilCsr&!_kjDpaxJgXqIE6*ti&C2r%dSqSFPKXI!R1oy>Qw2dEFDVH6cv(Tv$14hgK7OX4`zC
-l52>SSif}oFIDhT@cm4cuTNyVjkj{$}>k9yR^yhkcJ#pD#NiC77zH8HRCsEJq&r!_He^r(q>kAzN|_e
-kiZd5?@^ia9M>6R|Q*Ya&h+(VB?Waat2`D6!T=tdP^1SVTQ)B38*Q*F=dYd+vu{-JA5NtXNE^m9^-;V
-POU8Jt}L_=uufQ??x*tX5DCI#he?BBi*vP_`zQ3|Exu>!<F^fuA}cCW^V7TI78g}gCG1*QSkadG^7q<
-kV~FtsBHI+kN)<OLibAT)QxfZEs?7t*P-rUC$@WM&M3m<k~3q9VxY5%Fr(wlxFSsFICD->4d}cgOz1d
-sK@ny*oVlo|33N$O3+S?<4Csm?3<95-Py}V2nN)=I!<i{X1<+MRNI;x<M-WE7?v1Td1bvOIRs?;G^(%
-tD#s(BYUt@!cps%qZMbOvSup;PdY(x?CHMT|(^fk6t5%e{-P7(Aqwq6nRHMT(!^fk6o5%e|osv_uXY?
-Gjv`r53B`r4w1`g%<f^|e(I^|ehA^|f6Q_4T?U>T8E0>T9PW>T8!G>T9<m>T8c8>T9ne>T6UH_4S4#H
-`Su!=caYsKKgN|PHpZ}<eHZb@>$o9E5SO2^Xe9m(z<Sl8<6ePsh}f@+~9ntPQ@Hk<i@u;bt>e9BD*@P
-D#FIET9=W5x~{DVGEmpmG?0P1uGQb|^;8wnShU4)dp%V}v;=KV+}gLQC{(?lC<x#Ca|PjZuc_-s_WZh
-fZp^v5cUC>O+iNNAV7}G8v&$Y^g1(-oE>w4WkzhL3y|e1f-F8e>5&Xqjb>eP2rm6^j;;cGvw;fYe1pj
-bWownPKsVahBIIGUuZO0UMu=woWS#{EGJEpkPqDr(vyX~0bPKzp0r|h<4s){IYb;fQxrmBeYRwvx@@@
-`Sy>U`ayZdDQGtxmV)<=vvZ)!DYZyjzs_n~J==Gs;^%tK0smDx$piEAsNrDDQ)cyu35Y`>-M}?~L+3s
->sVbqrA0AaN9psMU?kRMPA++<$YR_mv@`;R=4c7f2xWoZ*{Tm^xnABro1(ncY8ZkMU=M&@osOYs)+K|
-;N9)*6nEN`w+8KQZ>PA^ro6T7b$dHiMU=OCdbhVz+(G8+-nhDWx3^PO1bL5ZQ1142s)``*arNJBZ>P9
-}Y}dVU_1|u9r?`Vm*S&G|-)?WGxPvU$y>a#5Zf~cm2=X3R|Lyj6iaW?|-5Xc`?e=zxJ2~a8{@d;CR25
-O)>c8FIPE`@*t^V8X?Nk*}-s->I-cD5!<*okP?d?<*QQqpm-QG@B5#_D^+ou#dIpwYX+wJWXcM8f|{k
-PlOsVbtp)qlIaovI>4qT?Eg7CsU!&?OjO9+{W$sONbI)!lA7K&Rx(s`GOjBUMFiRK4RiEsFEl?ln>sx
-yq3H#WlIxDm#8~R+C=kdovG?2hpn#f8RSVI?MgMgWR3gR~5N>;E#Zhb3fVo!8sS^D%W3ma4>{k<rWdg
-4~|<fSNUhTb1`FodO_?DjIWCPvpW7+e)hLN5I*)N!dFH9S#CvRT(~3f;=)h4Dco6>ap9x50_*bUPK(z
-qyrv4Q3S7MUrXp9<OJozjzO+hF1aw4E40J(J0`!ie;Dx`IjiW0R`gmW<{<0OS18q>$0D4PN6X=Sf(5a
-psG;bKZ^X$+;MQxztih`G(9qw0@1HG=O05T5@3ZEU(??N_lcI3RGps(3As!C)NXV>jf6!bN_{<5N=uh
-|XT71e-tE2;xsQWW$xyK%LmCeU6*(AUPJilDDoRr1It&c3Qu6xqbtO=}cEUz_$Tg1+|bPy~JL6_YEGO
-`P4YT1GZ;_JF=TvWc??)+vI%4yaO)O`JV&SP}Gfa9k1eb#k*J=<Af$C}b07Ppg)ZO`JWmNfGpQ=50mL
-*BSFb=xgkhBIs*uOcC^TQR_UW3(j6tGsj%P*^Bx>tT33pcvTVfb@{9!=<BjNBCIx;y{wK1>kVcn&MAV
-vCd_L<Uz6(<L0_^pU(8+MW~aI@Zs>VvLd=chW@QVnm>b8<PHCmX>Vw&L1{4LA&aF}F#Kv)RYt*K(G+}
-P7emd4B%xycZC<0P3;|Pqo*GCj3K<Wu_6vo`^2NczS)Y0NdjJX}^@3A6cZiiM?tcjT0b4F26>D*qGA-
-1}k+pDcQwz``;VO}HXYwn~PF1EUxJ88ZP`Z}c*AZ1LW`oc1exzpPeL0_lUrm;k0&UhWH&zL)79teHu0
-B4D{8S|^vb7N)3{F-Bm8bDe_u_|MJ&4i*Bka_~F$e3TN^$_bZ=GSUGh1D4IYmK0SzUJ4RP!#kv|LUNk
-5=gQNC5Bk$w`$XkiNo_-4=D=zn%}llQ39mRDaKmnw`uLg1mgK^Y7Uq}JpZ~@HjKy2zy6vc=xdj%65}%
-SyQUODU%R!j!uZVmZq+g-3eWE`cR^ooswy#1GykSqC3=eUZ>s5GsAm3vwn&&QJby?VVT{?#AJS$A^M&
-V+su5vv#{6-WJcf1VkE`Fn`i%K8^YYNwxOqe9Yf|-v^%?WBb!J>*g~t3<4YjaDWB#gY8KX=Kt2C0uIM
-c!^?XO^@X<?OCHVic_tkO@$SkuC4tu|QUztFE%i7}^z5shTA%70-*-4_Oy7Dmi#)PN=x1$`~7(ND%||
-AjSLdoj?outv=si%b^QsySf5X<@B~T3GeJuvY5^2A&pnZBzt(?NUFF0jPz28vkPN!-akN$ry-Q*r$@m
-E&vM$)rc@4wQxu+1v>#O9M)=sfvJTf`i9sHU_qzaaJRz+o$$fE4i|LV0e3oF7*p|LQ-B2>XW}l03+FW
-=!o~m#=hb6l;A-K5)<f)XxDXEHkZ`r<DHbs|KwOwmb4QwG;i^_ujCCzs)i=e~hYMG=Lyj@8#eVfV*!F
-O7NDUWbUyCEE9Bg^GIHHvfV_=IT=C^`M7q@Fgz*yMg>so!V)#2h!ZPhU*wzyjzEw(va+^tR>V`GbZwC
-Tnchl``;<qM!U6qP{Q`eCeWaa2<VIEQxeO|>(OnJvC~QW5lJnp2FOExx5q0nVabd|N*mV`z)}wX$JO`
-Qm={ix^8=Jf!I)%qw3!q`@G@)D{nE#D}@%i^t3xLSM%<K*Rj<#pC7;p|2C#U%?#n#S_{O!&uwm33ck2
-XTEqsn;nd~EuPdQ6y};Qj_Ye+>}~O~8Z73UFPaWH#^4sOm<K{%S2V82Slr@-c5^ZBd~rfsB#g-|PN+F
-x?)l<`+84&=7AG`X!Tj^Z$yXIYUnVbrIp~X%+8xAL-QuKvGUlN#PN{>%nBC%(wqrSy)+!B*-7Q{KM}+
-z4i&xDX+Tog{*CuZju)|$dQFztARba=D67F9%BT-$_=ME4}`k0839B74@=p0mpEX&3rMRvd-=}YZg>Z
--_pqZ{~1`rL$*<iYMef0o)z|1M=6vfaw;uvb+SD%4E>nwkD}LfueC(pU0^@tFZ;GLp#67*8U1Tyzq-v
-9^R;g-j2wQiS~$2Ujb?48Y-Iim*@dV80^lQapS@5%wq^KB)+MFAfeU!p@6>gNm^G<=~JaY`r*qMiF)<
-9v)MK?JtMVD#EVB!{dsuC-Lw(Mc8h5_`Dz<P&>F=5%o2!i252)1bq!^&EbKygUdNf2_bu))RA!alIg*
-<`e3MZaGfHmbiE>~bb}(QbfY4ubnsP0Q0d?%MNsMBW<^lx;1)$t>ELUMpwgjzf_T8~(A$cj(xLr|pwg
-iOil9;%o=dpR%Jk47MbOvKVMWl_&=Ez@*U(W#(ASW90-n(!ql5{!R+%1BPr$P}hSU@AK-{5IilDEd(~
-6+4AvJfN-7%!*&I59X)ZFXTmzp~d${kX3=cMT&HTSw5icYwj%JkqiMYOB!ilC<v^#DA0WJEmx4;~p&l
-jFf7BWhPXcw}U&BIs#kha%`{WS1h^)m}x=)5xeG9;`d^rXspZa~ECZ8;a;E-%><ZsW#l8zSM?!;O?NB
-T!Vg4?TQEQ4yy4q=m*t!cmVI98c&0MP>qKN@eZo-H0TG_40s^#-~~mrD-9}mw8@ZGQ66kEr1g-;nvAH
-S@=%izeM25;GNkp82bv7+R75|hRg{OB3~Ri>qfCZ1-rzwd!)kgw#$;HV86ILXtj!FMFd0_ozynN%wPN
-%5l3{I}+~%E$->Rl6;zSqKDzb7qFQr15=yFLT1Z3rA_v}%Gi7uBkctBR}>q}b4k(K-UlExLt%FS=nYJ
-#ksPQ|HE8xJ(71EkS0vU0Nr)U1(mo87C85qbnVODBnZcOY_mcqWmX5tc-SZ&^xrRgBKyBULBhdkQ1Me
-gk8|0Rt1lAp=vw;bq9cGwFF)M|FRV_m7x|*9q4e*dSbQV3Tlzfi1#U4a^8P8Q3P=Y+#3Qi-9@eYX)MA
-iEqwW#bJ|)KlJZZ7(wNKSbxAksQeG3lLkWNe>l9xK&bo=XSNv#mH)B-gn`iKAGZ%02z~zX4I@763;)O
-;&m1uj`uyYNa|S}6|2|;E7eSx@zQNRl2>Sf@?N+wX=O6c5@j;(|+<D-SZ`n^Rg#Y^<%blx^W9YJS%zA
-wcT~@Byz?gR$JBgvo$~_yH^07wIF?2aQbke{&f77^(xWPM*8wg!~eR<SC=yG=BY6GFmxxJ>&#?a;bYW
-the<=h!lf8v~vH8n4WA{R%DRpXF>M`riFsW5>)=XM-45c-^Z>zIKtU&!b)fj;LCTs08-oZY<9K<IOR?
-PUX@&xN!541_-C4;qyv(C6$rBijV}{CZ-)fzapd7Gq%v^f`O-kb%(W{2u#Q==1AIQ-^Rg!Xpdgrol<5
-&yB_$(mo2om_thYoHW%Wg+3QXjIz^&aNIylr`x_s5u&cklZr6+O6GZ02y+cinFrc=;Yo~a$BVB#t_b_
-*MM|&}f2;(Xuq8^cqim`qd}drzg1uzxO2S9R4J9G6jGIbAU>UcRgt#*4Qxd|;#K-_U#~K-gpfWKs2r*
-@1WDr8iL}kGAhNgXErZ+T!8#BG3so0q54b8X4b#|MF6|vi_6;9F|YZdiOAI9~b>BE?54$Tq9Omk?CFl
-L%VbA&O|9GWAHndZ<OVT?3K6|yM`>Z$^^t`Tw1BTbSRnUE@?lLsRcQpIzMf=a7sPEk<lA7rXvg@Q_}N
-KR2uX%)vQ3M#FlI7LCFRSc&nsI-dU6a|%5@tdNc(kgmW6jWNpZi+g1jZ5E*zoj&2wTkQhIBM<<iv8p6
-Gm7j=qa;Qi#B`=(<UvelI&QKHu10}8i0Mqn$b(d|nj$m?nr)4n?1HPYBM+kMKPrSS_~lVW9MW5@h!b(
-O79tO#Q%@^|iMVI9W*`ruGkYt9QQi?X+h(t|3rUQLOgi_tLYRpA)-gqxh`U$yg_KDZjVVIoy?LV|OcY
-#uSrH~O$r|(uq47SbN<qq`iop~iWpY^SI#MR{+b$}?M0Z(TQ6Y@VuRf{>DU(4XL!?YLs$Fq0*tlvLvy
->L!()I|ml&XkJ5!NmY?^1+`(<k>UVv1{>BCO@oWL2EezO)s?ET!3thZI3yn^e4*r8K)?LJ@|{Pwh|ye
-VsJF#fiA)lXJ*WZ5gwa7RI$r$1J5PN*07!O0x&{Dhm2aG+x6br9|U3%uz}-Uc(fnMB_EgP)apk!vv*N
-<2B4rN;O`?^rTedHOx**HD1Hyq*UWI%uPy-41$tUBZHu$)W{&HC^a$&8mg%bFfA#vJ{t3qV#lB($FMW
-DW7r(qG3<}+7`DiE47+4IhK;fv<6hYga=UB?xns72L3K|(sU)cG@s|t=x_kWRN`mg5edRGhn4>h)|F)
-tCNW(_VQJU#j*MK=nGyTh+S3=dEhrm>Kr?^|aJ*F|u^lNjEtq5lN)t6#x&6)nwikd)Uim(@bzxq;aO)
-%4cUQruJ+dgbjFw?KCGq%~B=~w5BtqNxPrxbD0&pU#!Wx>pVdSGm~IWwRkIJPdB8PL8M_R}=8i(>4kI
-WwRQ9QM?l8PHY?yK2r1XdH`uHD?Ai!okj(GXvU9!`_-R1KLf)?wT_L+Tp_f3o`@T6+vGE8sT6chM55k
-rwiz7;0;C4*MJ6)CH1BKijw-$$gQNl)No7cOAWWAzSM9_>PthWlKRr{tfaowU`y&t4Ys7dw3k>?Uuw%
-G^`*94QePShmeiM;c}abpRpheiNuRjNnSm`c1Cz!clD<f<IbKz)nf`rxO{~|9&kXD~zBlPh^qNT{!K9
-Cl@<3%^_n*^$Mz5*qHRHw|Bz^Rohi3YZR@dkS^qxm5&sF)*rI%T&mo??G>Vp32!zc9`y3}J!Z+lrU$n
-=6qV+=_j-RtqCFFK|dbmW48>T?F1f^xm)Wc3jDs&u<2maZ{kDfNPJW9>=As&Z;Z6Cp_y3B9j7eSwHIr
-26%PU0yOu^dZ%^ta8_+`ka$WYlc?!XGv%(_NZ<z8`$@t=G!_MHQbe_yQm;yZRz@pEq}q%&#4w7R+!WG
-CD1>)R4dG9w)L`;OE14suVKv@TdKfXIU`n^@g-@m(+di{p!$hXy?}M*{QdV_dS|&N?vrbl47Q6Q#H>F
-Tm+FSI{g_o~qKoaviMv466tk&V)kP*T8;lVX@gy<ZjJ57d*=#t?#%wv(nZ{lY3L1E|O9kU`K?9qXs>G
-mPz=mYWjdzzo$6jWi!=`2P(gi2nm$Hr7cHfy-Uew!8T<T@6ZX|trfl4f4ps>~5%UI!ld-SbuR5zX^df
-EOi4P3%n@%sITR5h^wu=~ZDJZiwTEL;vSu=D=+_P^7mnM+ttb|VOu4n@zig{lWM<pKA7?Q8lAEqRgqm
-aR%oGJS$;xRSPBP}QbOdI9UvuB8j!(F<6QM!#*Vjo?|2_Ab4rxqvljkCk`YCqHrj`KtUh(%YRX(%4;K
-euCBKjc+}iI^#68*VtdF$p!Z-=_b9Pt`{6P-MS=g=mq0TKJu`8TULxWzik=JH7&Wugd1sQ=(j$=d=ab
-1J{t?99Yedg!!(y`y0*P3tH*&ZF<M%>3-k#!){sLFB2&G9HRRX>zv~_n>orG}vW6VL@5W5PQcLxM$t5
-3Seu6dRgl!vZb*1<1Xr}+H`xaJ`Zb1r$b^GRx!SifT$3mru9mC+RV@TFHhI2t33wp0R7F6D_48y!l$A
-Y3;j^R8sCm0O%Mouyq?2VjgFx(qC*<ipoa>BuoZ{(zdLEp%Uhv(dR`5<@a1%%w4mr&4T>?IUb8G8u@U
-B+HQL7B0W5Jq@oCn1dSKK0^CMM0a784^^v@@Gnd9)G;@B}GAtFZ^6dP~nS@Dhc{~>^UV(kXR9phk7ni
-6cqQgd2x(qTppiWvso#I40oQKeQkqMPTW0ghItYU@XqagbxwBVttiH#-a0lrx#{c4-DY4f!Jw~E5ypI
-<HzX+U<4J>XbhjZvd(RjWl=sY!l?3HIXGl=qlZN1Aua(a#3d(!Nv7o&dpHLFC_q-t;$iW~S(mna4qM)
-<q3<>&rMhS*`pZc|uprvOl!bx8i1vNcsQP9&X7S-@kDn5+#K4%Eb%#fg|XAB97dO}STqrA@>(#FdzBZ
-<~~p4?R3jkBoCb8)DzAwiMP7=mMcjRV0T@S_$5Raz3`mkffz8Ha>1;72VAnzW>jpE4+D^0|9!w!f^fs
-nEP-P^j@T7zTdEqM*^|EW*)x76pC1wDK`U1(E-R(qjDxj0eA{cVamBc|+(b4T9zj35t7BTQiIYKW|7K
-KV%T}W(X|MkXFxo;3$8g1dh@WI!c3rx}Gxx=4D9P>mDA5ctg7(7!ZEWqWenHlskrjfBaJ=uqq8GFa-R
-lRy+&<KU&o*<J{dI$yE^|5N+Nt?)&7glmx{*r6z$9-=|(w5)||F^GbqVo_R(|Pq&BB-e+DBg2CQr^&X
-7%KC5qlq26a-P>Erv_t{@63ED9c14eP5ds>?tjN(4`f<eJ{UVKW4-Tu2Of|q;Id?u_$LsyL5zHCTP&d
-X|p7`gq0`O2W2pI0@_yhPB?N(T#0rqJnRNx{h!mT@wLWt>c587EU%#>o_xaWaKvoJ?UECsSA^lPN5e$
-rKjKWC{y;ytsorVcbC;GVUPH8MhE)x{;F)Ms*`6AdKrqPC^*jjh%!rwi`PMVRSck62kay>?DK{-q=Y9
-W4y7G5Jq`pFCipKyo7>2V=p0eu)TyZ8Qx0>^WnXOf<B)Ny%LFBdmcZPq<wbrWSY0_<~ph0n!oj6*CAe
-&^|@zdY13Vmx^=i&>YA`DbsP9+_1JE@pVg5a{$|%|MRrS^swl?Q1B&d%KUGnRtA`ZXjcBT(I<6j3WVZ
->biki53ts=WgPgRuR>h+53_CQrp2Ul-YWOwbUiZFS9*Cs`Fj(1kCQQlh=d3o0;@2!fwyla&Ac12#^HO
-hO3A}{Y6<-JRhmv@cw-lNFNyGD7BD)REKQQmJV^75`z-uo1JdDkiL{ffN2>y-CFMPA-@%KNY)FYh|#e
-N>T`cb)P+uE@)~PI;eH<mHV7)i=A<L%5^-sv<~mw|WS7PG4073GP-8;m+x+iXg$=>LJ`YeN_=8xLZAh
-JEyNIf&_P~hj8cgRYj2CZuJoEoW80EHFmdp2zO3jR&P<>>LJ`YeN_?VtscUi(^nNy-s&OTIek?T<*gp
-Vozqtp*?7Dv@?TfFs~W!1YhVt;H+%Oha$nWJe1&iJ9#rJMs)6YV-|RiC$bD4<6B54JdsLCDMGee9_-5
-~MMXnY#Fw5YZy(bm9TGYUFf^YVoR^;T|NGQQ^MIu27b9x>lRoz7)pVtR^Atw~_MMYl7359%Fkr#48Ax
-|jsLQW{;DMen$35EQQA}?eHPot|9Ia6&gcp4p0<SR9Ur_murUfv9zMn@ERc{6w#U8~5;o59oQdPQE|4
-4y_eD)RDX@HDzfk(W1vC)o$LLSEhso<_GS^73ZzG`d}pmp6l_(H)Asycs-=?o#CC&ERQtk0LK`22Z1-
-ioCoTJdM7o$jh6-)95}$Ufv9zM%8Ki;HkmjX;huI51twfo<`Ma`{1d;;AvEywhx{f44y{SY5U-*!Qg3
-Bowg628eG{ss!qG^<=yD(d9^zwx+-en>MM%u;n!7B8&^*%vPTY9MOdtSUOjSypQJ9*t!d2~j2_=m7wM
-zN2BXI})J6K}vBBu^4Rw(|dTcOyd_!HNj~*Ksbo}Ox4T`+DFxq%s>vGeczE~C63FcXYG2a{N*nG^_V9
-fW1IyN8kHClGRr>v3j=hUv<(Zp2|e@^Y%9Zg&nQ7I}5cQkQTM5U-*yQ7J#BG~mCYS->);;Jav_4Pwa>
-_%Bx1L>^ymfu5Sqn>9xRW}Dqd|&lZIzw#wBuvvCZdn!ClMl0I>aS|JXu9c6QOuf4<05)h$5qQ_?tjsp
-+n6;=_x3Fxzqe|x&b55=(rUQWR?EMAt7A7Pu8RD#{M)y3_l>Q>Zi$>_{_V5GCDSr5`z&?umDT)JHTPa
-w&H0b4;iQ^*Nn}f7VtSQ36F19B_x5eKfp=BZ<tk@F?LOzK+L3=&<ewG0w{OQ?uClwtR7L(5UFtMz7f$
-wVw})L-<YeD*+Rh(1tbdjwcP4Aza0%9`$jUx%IO`}|SUa>Zwnh;)3D|Q^5l%aiV>l{=(@w_C194iHY>
-ZzaE;>J}2nXhEI;aR+_sib$6~fB$gXXueKmUk9n29C32~`M3-W@dGg`FElE-1ngPm(9A5RQ1dIwT0Ib
-QX5LqX_4fym3Vll(PSlBJ9uKzey34a-?4oj=Vd!M-h&A8rY=>J2z~4LlKUk**v8P=PAgh%oT#Z4v#6q
-W|vpY%R^rq&ntqyP7Er7zSfve#`!WkPYS~Fn8i!_$vh?W{ANYiY2%&aieN-LHY&oAK?e^gg1*+TRfL^
-3Ms_N~kwI_0sR%na7&FIOm$|(=6k%tS^Qua$Z<${|sR%o5$hw*eVdsXc%PW8-`ssOOP<1yC>b<BB#^w
-&|Rc~0;GPhOh2$r<W9p9=5r>w0}ZDS3~{GP*#pi()FtU@>iYUi*bsC1V)KP*mJxOiF-jx^b;jus0}7E
-hYHV1gIb>tK<|{M#E8VKa_{>c+6JWd6ciim(~SCauL-NwT;>m4aNCp8ZlGxXk0PE5ha}`?c<4(a7wi`
-7NA^H>NL-RU!+kuPTDeT>G{nxXk@(XUK&ujH`#kB9O&BTCtH6o87PGj#VGCW9Bt5)A)#1Y@QN&aknDO
-F`m@61xq{T&uNW9u5A92zC4z5EXrtTg`ltXuPK7d>^FB|bD|No6s*~p9nsp$Q$mlJyP&TNs%7NT7B*>
-Ph1D60yR=0@PHjO>YOWAYbzQIGtx;cEH?T5e;kbFjps%klT~-8tcv^iFa&2>~RPsC}^i>U-cuMH@Gm2
-ne8?*u8DWUr(6d_K$s%DNH-0W2iwXhW9>r2|4A{RF|t`z{wFy^*vJjGK&&#4h%3C8TE0YwN&_Gxp&Q$
-qJ@6M!7u!WQ+1SbDK=Oj}yy>gG<V$HuY?Jq@oy2uaRrkc)K}bL+K6Vd2HXdX3Pr@M7*&b(K6Nbi26=`
-nqyT5kit7)iM%}vm+`fti70fTgA&$LdUhv^OVrF>b`hN=y5d%Bp??@)L<KoH`D_l5jnd>Z5azKbbGQ2
-!5>bXPy~JL(C!5ilXLH=DzVmL{(#mfBq$eO*Z3E!Ef$ZOyAW?&Q8UMKi^U0z_%Pf(yH3M!WIpHiXhg)
-#^-gM=!c#)0)L=3EJ$qTZxma*9H>}|tH`iOE9-Eu%y|&y|O1Rqdc%tfVnBe4oeK11EA+6vTIiG*cAgJ
-`P1{WAXpTDS|&Vxi(Yu)ETqLYUd;ULkiYPeXLvAD{77f!|7Xx<PmbB$IX?!ULrJP;~<P5YTxdNDts9*
-(Dk?pG7!DWS&Ea{s*vl|0s7%)X=Mjx_Y#Ms4D-_G0do$`I-3`7>&`SbQ;Wy1PhAe?6f+M()42M`Ho*z
-h`0r?!R|I+ZHUmm|LYm6Bb^~zp6bCEWDWCqE0<ymP7+jthZQLt)76Vgs#zw%~L}6XtIW<gpO+6kW)f6
-pl&lH(ZCanF6IxZDtSuiuz5qc%-tGyVA;i-Y`at;90_v8NCWyBFfxRFoi=X>`#Phc7M5Pjy{_3Gti7-
-?DHdPMkEp-L;*0rR<}PHlwra|Nr-ZIHh^J0!#D`@VbGuc`JSB9eN(1}w&8|~3$6}1RQMF~P#+Z9ko9+
-&?BpQ-nJ;vM>H6kp?nBQz(1NOCDm4YQ1^ZPW@)L|D*n>d~lYQj~l%FsP{D}?rIjmnUxgznOcjddBbtM
-m=AFk|+deis&I%w1HsjD;BslLjG#GzN<m8goP1>BkC<xwo_>!V(SJ0m2%M#ocO^Sfnw#Mx7p3Y0Pfc5
-E5%NX2&#Y#tMzOo!WiJ0*$#*H9f4)n3F?}D})eo-24{ejm`R9Se!AxLqjdB&6uCk<_1eM7WV5WV`av|
-esy|Sn6YTO?^u?xxW~K({NV=mY*>;pcSV~vEXbJMJgNxxHKIm@#TfIiX~Th~7z;b}x3Canaks`cScb7
-Uru7huFcz<9HVaEI=H4)O!5>~+HV1~QY0pEAs=Jw3*6M@x8S}^0&M=%ke?q&37_6Q@t34~M%$Q%VF*n
-v_%=fF4z^aUelSTtbEKisRqSw7a!vw6ym|Y`!%P^WYyJkcYT;`QSieQ54w<<!&KmNKRxXe>Sia2odh9
-bDk-RBh1Wlku93GUmVh*_<TijdVhv|bTRaKd~tLJ~QNuR<`v9R}Ia^fJRJ+U&mFitH$HRRksMQo%%a8
-c9{eyrD{%Lt`6`DS}1pS*HjVabQvrEaIT~Em*|CgNk4ghc+ofqcp0O3PWS_XRj)Ple;>l$WC}DvzSAe
-uPO4v$57b9@k@%l@G;J{xXN6O2yQ@M(#@W(iqJ;vKdlIT(*3Frj#M2uq6jCoU(iZ~VW`Cc)gp$W7I#b
-DBEvA$*H=#|f<qZNtO$M5A+<>iL(S?KVTNI-SvifPLa6Q=w<to|_4QFjh?#ZpD&sNgyHtieMtz?eIge
-3)+uX%r4fFDFC}T#37}n_DrU-qUA@f^I3rRGUVHj#oj`pk&VzBLMkQj!V(~v2{Fx1>`l{|)_=HAu@0K
--so=e0)hz@$s+6)_AoH)&o2?rBJ6h+(MtHOCdfJ#97*<glUnF7$B@s1L$0)cirMy%>g?*ZCP4hoKHic
-$RS(>Y%zp3`6M&6cxg-#v!#Y3`5Ny(z=0RsQIH>u`vuae{8iPG$*IcU1&};eV1VvYW|W63d2zIm(6cM
-UsGCpF$}e^N-G<Np%z9?Dni;-&i<$n#xAxjN2C&V_B=VL%rG3aa6nax;i!c}s!|L`Eu7F#$8glb34K!
-xM=gwNtb*aFg>zczFdVgT^@1YgeoXs?;iyG9zoJ42wBCG25!$i0G;+gm)ZFUxih|z$bYQ(2HO8YB*6d
-VdC%2Uu2AjUVq_Hgqn`Vdg_Zw`b)Wc%1>FcXn=`q+eJERp6gH5x;<}S2S>oqXPVAJe+4d*%7WZE_kHf
-`Uo2(6T6$1?8pWgLBjgM;dqxyRSr<BE_eI5?;X-IRmcwsElOsJ;dVn@*@wWUxs?I-cY-p`VPwrrD{Zi
-lDEn>NqgiG&i924}(o}L+W8M*fck&=7_;2+h+45r=hnL!Fo({&cP;4F=sr<X_G1igH3ar_bNhEu|>tp
-!KUr%(m2>;x-D{&(+)+5D)#PCgs8%F4lt55cT#;MMv}~MbB2*5ljzJak~BAAUIY4?(7q!^l5CiQk)-)
-m8f0T6$wn|3Nt%B{Bk30B1FHMtNYXm(JYXcrb^$SxG{0p`5u%E18ZKibX?~kJc#I^??^GX!k)-*ZZz@
-7mVS1t*N!p`I!AR1)&Iryhk~BYR9*C%7RNXR0lIHhoUV$e$9W#Q0zD!8Ok)$yrDCq0FeiufPY#@b^r1
-?n=Mlq6PLn4eMEo@X<#z@k_CapFYNm>|H`@%@l!a+46j3g}_(rSZ|BpV80Bx&K8MiUrGvYl~^BrRx4F
-T+TZjjh@}CnIGTNm@9rO#nucY($2Uq=i#j*)Wo1BQlO8P3m{aNRs+_jwFTi)g(^sd2CR1H&PXAH45Zl
-(=N?0V6e$Xff#JExtk6HM6KW$Y_hQ<2AdY&Qk7z`$%d5}Y+5{_6&!<2W>S8J!KOdGy-yW~(WZ)NtBK*
-JKkeV7(H2j9I;H*(<4s?$(jWrkO<%9l%7yW!KOJ1FeJ2b!{psMi_B$}*^ryonr->n_#i;>B(ArfEOx&
-WOvW*1u6Hh1!GJ4`^B|$<@JgX$Z)67jNkhv=e=;c?G*i|TH8!Hb!JNMZIWhvP~Wi_(n%7PX?yK0}=;C
-&~R+2v?eQK-kC@A~~YWiF-M#u|Xn&;DK#D{W*vKYv?EP|fF?l?2s%zEw$(+vnSq1gU+#M@f*`=X;d|i
-G4n*B*^RYBT7P@{rs4caM1Z*D+q4p^P``yR@Nr#SJnah{iMA!S8DDpAY7}Gl1yBF8=2LLO)7)Jwpa$0
-y=EDdw$(DIZJT9K+;+>Ly4Nl9_J+jj=R57?Emn5Jpt{|bL3Mj9gX;ELW*1OaMbOq8_Hw(nu52Tn`uSV
-ta^zD#-)EWKv9l_IZuZ;Dp_>Di+10645ma)>UJiRYY#DTO#IlxDa%IrXG0WPlI+vAoSdHINmQ$yO6%>
-bIG%4d{kW9TZrX(26oe3pDmUpfy319u?Dkb6l?nqy=jRfBveQ%`W?x>WIJp1y1lJGlUN>;0l)YX@RO2
-Y4aIiLi;Gpq!^Be|(IQZ8RE=b0t;?0LdWb#tiIUvALH;w4{I5~}EzYn0&icPa_h?8_}m@L`hrX(KoB<
-!L2&w{azS1Fc@@rGKdv0zL6Bwc?@Q{FPQO^o_sLmIyuBFSW9w-}#k<!)^2}ztSdtssE_)h1+SkY$J&M
-Qo|VpoL_0RK}`9TRy9mj`bzbS=}2FV+|ft~^O3%iE<zh~j=maF5;XkPS|yOYhC`U?bI05hB>%;sFAgi
-~fPJ-HSpjxOzZmmxs{2%em}OHjl_BQRRLnfHPNrXnnJv}3==Wig%2#5moj$(h7blcOWG9vJ3+@alOM1
-RZr;lHEXPvSTr+jh5zDu3Vyi0@Zl(Ht6ea{w|dC!c@yl1H8UmUaV*&#FUnUk6KL`^zo-?Jps_rxreis
-^e|G4~h8&3j@#$`{AY@1avwG4p#VnfX2F?}YhwbgI5MVSf+$J89n&`a5awgZ@t0`!X`~F3{g8`%LI>+
-&(iWGtVr@RJZ8XeKBr+58b*i&YNeVWB0{*dmr?7!MrCrcNH_wOv&^;(ZT!Tg8e<{@1lJs^mozT2mM{L
-4EnolzXAHYZ102quGssazbp2>puan-?R^EA`M#1&Wrlv<oz>>|(9f%w+7bGB6;nGxKkrVzc^CBa?)2N
-=tC5-CtCN}E3;Me=psimA9lnaG%+TShn0e2P%*d<_c4tsohs=CmPG-KZAY1-E31)j9z*5}~6%U%vL@%
-*o`kCk@R!lz=({AnznomJ@v10lu=q^@FRfU;1cZTeH*2&C!Hpt9-Ld8S&JzHevJu@=%o>1|yea{Y=dC
-#28yeCvVY~Qma)AwY*aoD^kX5ri!G4IJ<<%sz`%)_ae`Ms3P{2uhT&i-DVOyz>PI2BX5U^32~b@n}5W
-ad3HGV`8rv1jg_Q3e+~W*PLi*0THhdyv;#ac9GwEecD(jRr1F$N3h%YGDMp$-)?LvxN!Z7W1}s2C83-
-DXWp4RmKqAXah5IDmJXFNv4{rOK7i}sxwfv@7X3Z?+Gp1z!=kWDrVlZAT#e-lIeRk7^s@}#4MhQ>3bp
-<;sRsL<EfawCnoZ^pcylHT+oaROBFPm_iT`v_k{jzK#kcv6*KRdk(u{wlbQE~7q!7fgMp5{4_?#;37F
-I4f&@(JaX|uR^|%HdIVRVjV_uJI(2-tZgZ_ZQi`teI$tTycVs4LXS(|JH?e|G5Xnqe~blB9FrnG`uUz
-%(M?K9a5n)=d|R?vK(w1WD5nB?O;GiLczt&4sGQfU>_Z@@es*YaSZPsQ{bT5JW)H?-Ia+Hau$G_7Zg{
-?oLcE&5N>dbXJQvER@p8&O98Y2StZ)4mJ+r+pXkpZYFHHC9aDB@_Rt?~>7fhIf&`xaavU)$Me#=5;f1
-vF3Hf#hTZpi?#Pb#Wsh4`9Us+fC)k_hk(4Q%OPaU1=#zbVw)$(Bo|=rlU#uL2Ic~cJdw+Fd4e``0p^*
-QDO54@Oz6+%5ZaOp&~Ion7hr#{PG)`&`m;F%%olPw1WXumd4e``0rowiKbt3LGZ$d*gZ^xupe?xobD!
-h_^cy<N1sJ(>Bp0B+hnYjJzu#dlz~09u(!3{T2D!dDrUtpbd55_G)0B6Z3$X8kCen7GF+Iq2pfNwlb)
-Ydp$TjnrAyhH-FPI|aI?0$L<T}ZiBjh^Cm?Pvu0L&3`on4HtxXvzS3AxTLrU|+50Mmpjrr(ZH8`q)5G
-$Gfa#h6aTG(5=JQMAu&lbP@9keTm;{%q)g@t}&C?}Pue&2_=C409irsJo^WV@a-QEu@QK?vwV<+z0<@
-+qgp7KXV`ar)>i;epNAZAN=PzdtXLo?t4fsu6Rf;t`Pe(>>-JoqU>FFF=FQGL>cw26Btdqv&!WMux!1
-eHbH>Vwu;&e0T!=+anS^-9E-bX0#&R{uUaK@Uz5z-2Q6N)_hn?}zBX%yxsM|n_P(4o!`xSpnfqXcC-u
-IZBZ?>WzMLb9C+vMOnYj;Ec*@?Fl9~IUzw`FKI$8IOanBQhs@o;dF^_JNnOCBrsx!?w=y*<@Y0g2%bL
-vcU4muj+&pGILPWyIwp9HFgLB;0{<DlaO%c7nplXK9~m`u(=$IJG<w5Q4B9CW;5@2mGTnLKLrG?_eV_
-B5G1YV|akJj!~SOwK_^Ycd>kv?jwrM{6=1bhIYJK}Tyc9CWlMql1p-zPPK&JYY$0dyqj#dta@$J#f&`
-+5-n2tvzti(b_}Y>TM4kbhP%sK}Ty39CWny5a$p1zTzR@SN8rs3_7~+!=R%L5^@YW+CU)3prakc%`xa
-`JG(gs9c^bf$DpI_?B+?Mw_K8DZ@DC`hsY&+$TvWLmn?(+4&Pa?%uUnIQ+tj^nb#z{ZITmtP4Y7)J(1
-TW#d6Z#%OKOHA@Z7}S%&PB>q=FU7*krJD$ANCTkO4>QZY7NYb#Z6P?ISZP8yn6vA-)Vmi31<ooHe1tw
-&1rcQLo~J~eXYXwdoUoz0UalyLV-O}F~3Ydl~iS(g^Y>Zq>mzI`%eb-}ec9ILtD>QzHpaVyD&`U-n*s
-#L#-V=tGTrEv7+vVU?@seVyIf@gPcrqsMuTd8?6$6CCsWJJZuO2$;|TQzlVfu)gBeP@oW3_AUCY-O;r
-BdzT+g5thN$4TrL$!LhPUyg?i@rxv|?s=S4^?<fMz<hLv)Vc=_oD8|j)s(!@Df{A*8L}d2d7sabk^8T
-rw%L*y0@mBKWR8HX6&xQKcC~^dB*RYc7$do#jI#H(l$v`vmgQ`u)mCcmWwOVAk&b%UCv$?M^MRRZTlI
-H!?881;M?Y*FoN02$-mAkK_FhhQ^!IYQqtlTLa`-2+_u=0eUhcdzk4$@zmcq+j@RaFRuLVu`Sjv>0e{
-xA`pWN28kENP;wUnuIPc`{!sZOOcuB0s<(%N9#v{UBEl0<j3DK=<-SG=pO&+SZgWZtT+ziVjcq4(wwe
-XBz2vw16~gPeXll2&(A2SzMqYS#U3CwbWSc9=DA-`kPYkh@oVF7|hgk2Tb-1I@V>;QXCIUBi(xx7qJ0
-L~yt=Ju}*oBfnYk0XqpOXNGgBLH^>jauLL!9YxET=Nzj-<29Nk&NbILXtT39@|}0qRQC_s=eOkdjk{a
-QdM2PNz7@iXZ+~q?_s6!wjVJC5uDJg{OShW0<7Bq4Hr&5LxjogkDsnp%6-znKf0Uvq%vt-sf}rggJ&v
-h}-1?j%3Ukzcpdeiaf3Kjn4E{nveHr|Nf(G8`bwy2}9g14+W!<@lRgqgmS|CGlZ`C$MG0;{;K@dMu5W
-e>j1>t+Yr=YP6{+EL0GWg#LS`dSI<qT-MqBhWGMIE3migKWJiVC3ad+GK*sjR>p=b2TquBgBi=b2S&6
-|uT*P=vh^R&7+20KKXx1=^&@9+6uW1zr7%f}pE^QxKMqulVhdqP#~Ps`WC~T5n^md1I~hvdLPgqiV&q
-UN%_^->p`Ryo|M;TC0a8)UqCyP;2+Fgryu!H%qAHJuRVD^t1%b?)^&vnA!WE6ogs5|5-tp(fij5LY4a
-)1wkwSMM2QYe^n5)@<RpQo7F=-{MUa~64db@6a;nrM+HG0|4o5AS+!_zPV{<3h$mKA#tG4C&JDK}ZqZ
-0_wOV+?EnF`ebzH4RkD0UghiH{Gaho~>q;&3&-73p)n|fDdbM6o7D(m1j^}L)myUH?7UVlwd$=j46zw
-^aDCFr-ltpowxekBOi4k$qoc2EiDJ}N<`^{^7oLllCn#urDGFcYnWv!9i4Y)c4x^(U3!cTOq6@0?b`)
-eK7T24hMf1DW+&a4O!o5{_jlVUVi?Zy<Zk6dmSZmEd<SDdCbjC7kdkgj1WeiQ^=sekEM`rG$9`Aq9K#
-N|^6b!f8oL@H-mJaEgh>GBSxoiS+i>9!q9JjYXC+?M*GOl&NiMVWr!<q*$6$A$^Fl&m|qpzR)iIg@WM
-NzuPr3?0qO$*%xB#zto2Y|NkEpgr@U9DhO@Be^L+vnt%N(CBgqcq98P&-%}7=|9@5x8qmL15WN2P6@+
-T^Hwr>D^S25@Ec15)Fe{=@L8x|-f)GH*3WA$W6olY8RS+t0O+o0s*A;|n-B1uB%%*}+*;@*NK7ODe=;
-QAd1bzG$1tCQLp@Pr=|5pV;9}+^Bafp!qn}VQ^l?sABeykwq<52}cACD;r`gmMH(8m)Bf<B&95cKhsf
-}oG56@)(NPZR`~^o)YgAAMFqu#e{y1p9biL2$n>2*9j`7Zn73{8T~E$4d%=K3-N3^zn*<ppTy^2>STB
-f}oFIC<yxarGlW3UnvOs__cyyAOE5t*oXEi$|M-bzbOa?^8YFb1|q%QG7SduKNa*ckhGV9q`eFz?PVZ
-oF9S(?8A#g8K+;|YlJ+u?w3mUTy$mGnWguxU14(-sNZQLlYP}4k*2_R@y$qz*%Rp+q45Ze}Kx(}Vq}I
-zoYP}4k*2_R@y$qyRf}%u%;{Q_+?Bjnc2=?*+D+v0ycSr)$66XNi)6H*7%qG$Jpw6t=21U$@ZB)dp*l
-I;VGcyAdit0eiy%dIhwcdwom6(_^)4xw2jJ$9EenrTI_8(M)TxkDcMaYHrA60~0=z#exWSa)eZz0<>V
-15gU&H?G2lvss4Gcc(LslNWV6+xx_2NXf2{f87mrTs?~L8bl26hWo^#}!duClyg&rxj6OV~VJ+aYfYE
-c}37y|3yX6SN~;2&{x0KVkA&z`sGxm68V#v{&y5XUju3}m>DxOFsKOn8c>VIisKnQySHr81lK8|39eT
-JeGRB5z-r@}0rdn(*vt&PstEcT*rW*h8hA|+?Q6Rt+Sg7+w68siXkW4oe%YdZy{U-$dP@=YrH-gYeW_
-Kps4un37WJi8*`mJGDqGZ-`luH5r3TxgzSLk_)Yl0`)R)?Fi~3SqZc$%qur1oxE=9C2Is2o`e1-w3x9
-P!Eieex&IZUOQ9##Qi9?kS%zoHuMQUPHG&GfJe2-9b#2i3o0?#%R{T0YW)(}UW~W7f>{@EJvIAoZS@F
-Ec%SR#6V5dcsVZX+4>_M9Oh`SbZ+$$V?Ba3ft6|dbBq6HKGXm(z8s;Hua^}hy>^K;95n{*Pyz{Hua@0
-vQ2%di)>S0>LM`<W_nOvB&NVj52}mA{Fmv$&5EF}!7YlQuR(RJZMUOviTNtiLn=E=R+%1BPllN)(?c2
-oA=NuQq)rZVRHlbCIKl*#=^^!hes)TU^|{kS8cJb#?zA4FRAP1R^pJW><eI04mYsowrM(Z|DzSWbdPp
-5AR_{&^slUj*C(Ee}bs;&GaY_-Dq3$=QGSpAxREGMAoXSu?k$Yw2RED~aoXSwwky9D!I&zn4F0oMdH(
-C>sqyLRoL@bj1jY_`2HcG!$pNkc;ztL)ll>cwE?qYT9J=0St-0*9OHL>@$Y2$*igL}hj?^qFgZ&>Xe3
-u5mLtG#1A?7iWwib9RQ_qql*SPgq`hkC!lI*_QZug}h*xnE|7fA5#siAhzNn{0Extm&^?N;{eBmNHKE
-Iy=+pewjUtwJJ-yTvzMz9knjkHM?9_`uB^v$R%1Dx3JgQb6BggrL3U2F6nYzv&-+cy8Ld->m$m$T<2z
-rMU^`Ib#cp@XjPVVxo&BsPOnS4$R&w<y-M8NtovnNE=khmy41@h>GB;(%YSdu^7SR@bot$mucyh9Q`P
-HIEHD1k=FLY8j0le!7!w{dFd;l{U`lwxz#8F61M7sR3~UgdHn2%}#=sWgn1LDLSp(aI;|6vJ&l#8#o;
-R={ykKBScu`>_`n+VI=<~9HqR%S^iasX{6n#z_DEgc-Q1p4#K+)$r22!6}RvAcrZdq+0^|__rK<abLf
-PvKKmO%rl&n;b->C}22J$3(ns(j0^c{o+RWkg|2m2X*NAXUC)t$|eemURYF<y+PpNR@BdU?5e#Wut*q
-`Ic7=q{_E!GSIuUw2O;OySVx^vxhT9RZHowYxa2;+3fSb+w8Nmb?=vD{<@^g^SU&Z&7{lox`Yr-cSy_
-qGT$ULYh8Y~*5!BWHq4LuT3zJQihL8@a_7ibWr>$_tIPYf+?wC2tV<KvYTJnZewkfDT$OeF^Rh1Ak@f
-keGV8O`Wbc>x&@b!r`pBX#&x^V|&mCrUzpUl2>k?W$IDOq-=R=6Bi<}>v1a7YD5=uTeX4+g=?{Zz!%e
-mb}&h0Ms{=tDp=DIHRv|aPx+iv*KwB6`(U6=Rkba}rA8!_v3MVIe=Fd0#<i@J0vqAnqO)K{}7hE!z@_
-kK~AkiGg4XXjO!tM}E1*jdw6nGc<-4{_fc^_5+&E1msDUAhWUl-TL2_si=3y42O@DC+XPQOCbumo7k6
-=HIX0<#~1QH==r{%XJ<1yts>g<D~BDL7aBEF0H$I8mEme*EO76k}kiSq_O<21QR{a61p!D_o#a2o0xj
-p<+{=xp;eW6mr*ahY1AJKWti(+PCRON`P8b+Rpq?Pb$MUuTt?odisq5;y;o(<1?3Uu+5c&DXh-$mgXV
-&g7wq&GU|9Rx3#$K~G8aYNE;?;4io0EO#$1$iyJ*Z@ly<x5thvawRC(k*ZB^Fx*C8|fr_tfdUMk2BR~
-KCAazXB%;KkN1+*7(-RCarkk!`21+mq}?k^j=%`Sv{SQsLs%SIjQyggmMFikbMfCr=vQAlO}BX-KGFK
-Q<&(sz(h8HR&-!LiKsvkPzHIVMvJVpEM+d^-mcRx^Yh%68dmIF(h>0o-riU$!84-mGL=4LM?pWkWlqr
-FeKEs7nPv<{Zm7Ne*RBgXVTrqc3t6leuanfN(Mj`?k&_H1AsuSm4A?_V<&MMCyw8<op_{PR7>?w4fP%
-+N~EZ#o}zl`O)|(xno1dltO7X0PY5J=sW!gCUP}|zt^zLZ+2=NUAKv;MkUBo!0IB2iEs#1szXwvs=MO
-;Y`1}z_9iRUMQpe}NfYkB%6Of+csO+x6QQ2C9qq46CM`gzhj>>i!9F@H?I4T=ua8!25;HYeo!BN>CgQ
-K!J21jLQ435gS7#x*iR&Z3RS;0{$X9Y*4o)sLGf>v-;Dq6u&DQN{qrKS}em7-Q~RH|CRQ7LN$N2RV69
-F@XWa8xQ=!BHt~1xKZ}6&#h~R&Z3RTftE&Zv{u?FJQq@`2*Om9GzJ$+L!fwdU)VyEPo*j8p~h5g2wX4
-ub{Ei!Ggw82n!lZB`jzxrLdr})WU+sQVa_kOEoNLEakAEvDCwY#!?Uq8cRhiXe=eMpt01%g2qx53mQv
-RENCocv7oWk#e&9C7z-LpWh`hcrLmxKXzVbi*J6{ve?~ILPAQB9JEbxf?3B`2uv1Q113Tq}HLz3ud>8
-DLT?N=F+X=8!_7PyGY#zW)*)f2fvP}RxWp4m>N^LCIDW$Psr<A>dol^A*c1qDJ*eNxyV5gM4f}K+F3U
-*4tE7&RZu3)E>yJC=)YFBVnie14`sdWWMrPLK1l}cA|R0>_eQK@qUN2Saa9F;0pa8!z1!BMGk1xKaC6
-&#fcS8!AcT)|PPZv{uCycHak>Q-=6id(@^sci*ErL+|smC9CdR0><cQK@SMN2RP49F?k8a8!y~!BMGc
-1xKZ%6&#g{R&Z1bTES7NX9Y*4oE03EYF2Pmidn%?sbvL6rIZyMl}c7{R0>(aQK@4EN2QDv9F;0oa8!y
-|!BMGU1xKZX6&#fcR&cag=`iR><to@Ig{xratVTDpaI`P8`Se)g2-<6^NFAw81p%cv6$I=xwUUlho`P
-UfcnX3^-6;qrWv3umZ%*e*xhbe6)uy196q|xtQfmroNvSEQC6%V2mK2(TT2f~UYDt+Xs3ldV82+Tl6a
-<qRQxL4*(AlTg>X=~Q>o?rS>9u+&!jLBtA%;BB1;IEG1Hm{sCICa86r*CulUh_TvRRrly%ro7r34jRl
-nPV~cJdY(Fj5XL03)SB6^xVuRWMTOQ^80nPX!~T^c0Mg%2P0MU=_}RRX7J$;T%|nb6^$DfmJvMR^c32
-g>zsP&Vf}p2Ug)6ScP+770!WGI0shY99V^OXcf+(RXB%M;T&3pb7&RLp;b7CR^c34g>z^X&Y@K}hgRV
-nT7`3H70#hmIEPl@99o65unK2k70$vcoP||53#)JzR^cqH!dX~_v#<(hVHM88Dx8H?I18(A7FOXbtio
-A1g)_9A!Wmjl;S4ROaE6vsI77=RoT23u&d{uWnqHfuZO$wZ?Mq!gJ?!Mq&~ox;XgT>av>HV((`!z<3@
-xW!hL+PVL)&SWq3yKG(01BoXglpPw4HVt+D&aNw4G`h+D^3$ZKqm>wo@%b+o_hJ?NrOqcB*A)H<!<$?
-exmfc6wz<oL(6cr&or=>6IaIdSytQUKzx)`85!yT86}_mLYMfWk{TA84{;jhQz6sA#ti@NStaJ5~o^*
-#Hp4cb*g1ZooX3Ur&@;8sg@yis%1!>Y8g_eT87lAmLYYjWk{WB8JcB}(`!zz45`yAL+bR(kUG6Gq>Vb
-9LFhQ8GIX3$89Gj>3>~LbhK^GzL$iu#dd+E+q0`*vhmKPkL&qtNq2rXs&~Zv*=s2Y@bez%{f>RnpX#7
-pd^qSKcLvR{n2u@=R!D);kIE^s`r!j`$G{z8|#u$Rr7(;LxV+c-T48duPAvldO1g9~E=rqO<oyHiV(-
-=c^8e@n~V+_%0j3GLWF+`^^hUhfL5S_*tqSF{dbQ)ubPGbz>p@5@tj?y@@G_<cJ`Sh?8BZJs1pt0C2p
-mFAu$RIWgXe>4hXq-8vGGtDv3}Ul@#$vO8#+g$xL*|sskU1qYWKPKpVzYq8nbR{v=Jd?ab$Vv#Iz2OV
-ot_!GPR|Tor)P$)(=$WY>6xMH^vuw8dS>W4Ju`^S0*-c_su{#)0Y|$|+YDW&ZHBJXHbd^T&5%27GvrR
-&47t-bgV-$KXzmowkUNDl<WAuXxl=ep?i9|DJB2gkPT>r>Q#eEJ6wZ)4g)`(%;S4>eaE6{!I781VoT2
-9w&d_rTXXrVFGxVIo8G26P3_YiChMrS6L(eIkq30CN&~plB=sATm^qj&OdQRaCeW!4SzEe0u-zl7-?-
-b6^cM50dJB2g!ox&OVPT>rFr*MY8Q#eE4DV(A26wc6h3TNm$g){V>!WsHb;S38-;S38-;S38-;S38-;
-S38-;S38-;S38-;S38-;S38-;S38-;S38-;S38-;S38-;S38-;S38-;S38_;T%|nb6^$D!5oEiW+`c3
-#PR82D}oNJ2s*GL=)jeEhJh>d3<Ilk4y?{OusY|!m3fB2oHEZpBUT3;SRHg=b<m;JL5Efc9a<f9Xm!w
-`)j@}@hBFMU8alLU=+LU6L#u`ktr|MCYUt3ap+i^08HQF99a>Gau$pLLHPOOqqJ`B&3#*A1Rue6(CR$
-icw6L0JVKvdhYNCbJL<_5l7FH82tR`AGO*FQgCK_8#6OApWiN==GL}SZoqOs*P(b#gDXlyx6G`5^38e
-2{ijV)Kn8Cy;njV-5)#+Fk?W6LR{vE?c`W83MYvF-HH*mnA8Y&(54ww*p2+pdx`ww+2E+pdx`wp}G>Y
-`aR%*mnAAY&(55ww=Bj+fHANZKtosw$oQ*;`G&+xJu5LIF&UfPGyaWQ(0r;RMwa{l{F?#WsQkbS!3c<
-)|fbzH6~7FjfqoPW8zfSm^hU+CQfCIsZ&{F>QvU4I+Zo1PGya$Q(0r`RMwczQCVk}lJ?CVpB{EXY)qX
-H8&fC5#?%S1F?B+0Oq~!LQzyj6)Rlb3)Tyko<5bqzaVl%<IF&VaoXQ$IPGyZ9r?SS5Q(0rjsjRW%RMy
-yWDr@XGl{I#p${IUPWsM!Dvc`^6S!2hktT8y1H3p}$#^6-e7@W!)gHu^!a4KsIPGyb3sjM+Ll{E&Zvc
-}+4))<`18iP|=V{j^K3{GW@!Kth<I+Zm>r?STARMr@s${M3nSz~l6Ym821jnS#BF*=nsMyImI=v3Aio
-yr=cQ(0qlDr<~RWsT9PtTA&cYs{R=8Z)P|#>}a#F>@+w%$&*^GpDk~%&Dv~b1G}hoXQ$Ar?SS(sjM+`
-Dr?M~${I7Lvc}A*tg-7<*4T9_YwS9eHFllK8oN$qja{d*#;#LYW7nyyvFlXU*mWvv>^hY-cAd%^yG~_
-|U8l0fu2WfK*Qu;AcPeYloyr<>r?SS}sjM+~Dr?N0${KU0vc}x0tTA^gYs{U>8uK|St1cy@eH+N9hn)
-}`b0@^c+zGKUcS3B;oe&#)PKb>?C&b2{D>aQhr?N&dn*RF{pgM;C^9)e4*fffj^p2lYN9o;TKy{ejZ3
-3!;@a_qqItuT$0M%i5_Y_bahj;uzbs*k7pM}IydiMfQ9g24^0oAd1_X<!QjCZdA)zNtO22dT1cW(jJD
-fR9rKy^;N-wUXY*ZX~da^D+uyxt!GRLAT6K|po9-X8)~$LsxJKy|#{9|2Uy>;2*^Bo@>Aqk!af>x=kA
-ahXV8v6)C;@tH_pF`7tUahgb9v6@I<@tR2A1s^bRn@C@=n@C^rn@C?VoJe1BoJe1>oJe2soJe0Wok(A
-Cok(Btl*m!Bj>u8*j>u6lkH}GRkH}H6kH}H+kH}Fmkp6FRKQKS+iHAf6h>657i;Kh`CN>iLcj%)s^jS
-3YSv2%nH1t_C^jS3YSv2%nH1t_C^jS3YSv2%nH1t_C^jS3YSycEeDtx>OpGD#<u{Xq8VuBSu!3v*Xg-
-@`;Cs^SVtndj|XoB$*7c70nWFmdVWg>mWW&(XP@tJD+&a6=Fi$Oj;-F6Jm#Eb&NvzCo%CUz7Uo{1j?h
-G$|(f#I1rQeb!{mJ}GCi6;eyXJSf$;hDHnV0b3B6d0a~F9jNBVn2b#nfOnjaV7>7Xq<@y1sZ2!L4n4Z
-cu=5mCMFc;iL7l$#!P%DGC+(dhFP4b#t-Y+{%!lHv~8kgZJTIW+a_Ap_KB9vOSC^jK8q5cMTyU%#Ai|
-BvncUdl=v)4d=@1>ixQtjiH}#}vna7Ek4)?-CRpMVEcFSN`UFdTf~7veQlDU{CKx|4TKb9$Mf!>jMf!
->lMf!>nMf!>pMf!>rMf#>bU}8p*zT!razG6p_zT!ubzG6s`zT!xczG6v{zT!!dzG6y|zT!%eqhdahqv
-Af1qhddiqvAi2qhdgjqvAl3qhdidCV}9GJ#nGP0I{JMX7Qo;!^DVU{{|nG;Ik<BEDAo0g3qGhvncp13
-O<X1&!XV7DEKUjK8vEyqUf_I`Yeh*i=vNLoR>v2D^~xKl<Cuc<stqRb1?cGj6MgW&%x+(F!~&fJ_n=b
-AU;uyEHYf2EHYfIEHYfYEHYfoEHYf&EHYf|EHXUv0TV-u3>Qa>3>Qm_3>Qy}3>Q<23>R063>RCA3>RO
-E4DVXeBNJzf92EnL92EzP92E<T92F0X92FCb92FOf92Fa@F;8^;$S6)086Z{`!`!usZYE|{qknx=a-T
-)H&!XICQSP%S_gR$tEXsWr<vxpYpGCRPqTFXu?z1TOS(N)M%6%5)K3+YaMLoar5ci4+*7FJ0^9k1T3D
-)xo*7FJ0^9k0|1mh?6EPd7D0)5ru0)5ru0)5ru0)5ru0)5ru0)6{FU}|xJzG`uSzG`uSzG`uSzG`uSz
-G88azG88azG88azJ0G~sKo`2s*eSZs*eSZ_N@S)sgDIliH}8&ij75%ijCEn1Qz_Tr#==KpgtDDykHgG
-Y{43j*@BOX_*n0+0csvOn28nDn!8l>ui%+JTt}rn`?2CxB|z$!q(JJBbb!<m2|((2L?CrIG9Yy{x<Kk
-+<UqR3Zu&El+dk;oKIq#%Sg?ICuzfJJeNebQ5Z4NQAf^@iKs+n-fml}P197a-2Vz*E55%uRABbIrJ`l
-GGeIRBP`=Dq0pl|zN!S=zx_QBBhLE-v9Tq^W|m{jNk@u<)TVo{+F#GyhTh(U!u5Pu4NAodjcK-?+xft
-XY5gP!e!zU_kr+Xn;N2SeKjh3SJYFCUv3N{2%+sy?g(s)P37HlR9cAMOIG!}j3;pvIZ2(`$9aJ}v^PL
--ye@pgLwB?g6TU_Td?zI%*$}0jk6H@c^JYZXXW<sss1&5TH789}fenL-%15P#wDuFJ>WeratZiB!Suj
-R0rzgen1kaM}X=C`|t!%9j^~}07<-l1SIjg4@lzm5KtYj4^IKr@%r!_P#v!iF9Aus*o-<}|I4T9c>V8
-nKy|!6g6zqhWJ`QTB|f8)#*y9AYjuP^9s$%i;A?u#=S$LfA>;I#Pn5(bO5zhG@rjc7L`i(2BtB76pD3
-wMlyqLA%&aN>i+ZL{&k0fLlPL8`l=>t}eG;W}f|&a3X`YHVz2?&<Z7jiu!;a@`XHI8yJOP_;!ku381n
-kUdd&e`cGq3HQave{(j;CChlk35AE%-q>%;~$}iPU^y&-9w7Ntn~s!P6wn>FVHV66SPu@WX0oyuERH&
-5x(e7h+GZ`SCP*el}kPJH6(|(>SM(qo;H9>yPMJ9sRHx8;9#ouleybdU8ik?&!&#`SCRK9M3$*n=dk*
-Uh^E!{9u{+!7}q%kj=@0%x6L7ml~N*hRiQDvc~zl(`$Z>(R`inaM<;$_O8!~uFr|CU$u9AYIObLz3Uh
-6U7tK%pFCZkJl#3tRM$@lU7tK%pFCZkJYAnWxlf+lCr|E^C-<xN+~-j4b13&Yl=~dY{i;3psg(Ov%6%
-&3bLN$vXL--Fyyscoo7tPrEd2b7cBYT{4Cwg`==luj`3&g!4Cu|tfS%8Qp3i`u&w!rKfS%8QzR!TZ&w
-#$qfWFUwzR!TZ&w#$qfWFUwzR!TZ&w#$qfWFUw=4*F`!=mwG>glz{i>Zq_Z)z`EN#pa1Ryyatydl^Wt
-=^pbdW|WnX!RQ}?4Dkmb6@kt-bHKBSnEx%&AD&bys!OPwMsvCW9zQ~C10U7q4X=15bAt|QbOS?)FBkV
-LV-~B6^ewqU!jap{uSyH>V1WBLXE{^(f+I?eYt(lFMbZJ?!7&KN38C?J-;MY_urmh5vx0J&)*ZPdvMP
-`5Uaaz&p#5Y`*6>%iPfFB=bwnxy}0L}iPhb>=U<5RYwTZ%E!5a=hz)A&--r!s?B9tMHTGLziNx<eh)M
-i@M@-`P4Kaz|x5OlVzb7W~`vWnF-yexd{Qi@e#P7d|N&NmqtR7pp_n!Y|d+!C{^#J=zAoYCsJ0SIR_{
-(1blH-&91gJUAwMCZt1rT%W!4xsa9!wE)?7<W<#~w@(bL_zsF~=TE5p(Rp6fwshOc8VJ!4xsa9!wE)?
-7<W<#~w@(bL_zsF~=TE5p(Q8(Uv;r{{Ui+J(wbMjy;%JI{H`eOdmEUBTNx<GQt!wCnHP|b27pdF()HT
-5py!a6fq|wOp!W-zh)Ea82*Nk{9!%#Dq`F>-vFw^_}ky|6YD_!5xEhXE0nhAE5E_*Qcn6Cv@JH*N$qU
-Tr^_zySD<{}T(-3HIg|2d|9JMkM7+7}eXq9n9S2<Va(n;g^dI0v;4NSc38qNIV5*MdtHfa{?|lcX{+@
-E_1hAUp+Xs#St69GDlF!vVFK=D}Rx^FPz6vap=Qe<K<@;^|tNC7CS^-v5XLRs7u$nv7#mm5I&X-3|0;
-@@1zU6PPSzjLJbA^20!&yxJ5~^Ih2CR<XXlp;PI)0<`KLD%aH-3!%6bq_cWm_bEr(Xc8<5#^t53G(~b
-?gGLI)2qjVs-p>p6><L6YMCkI)1zRjscVSJzE1dkk7maOyakMoD|!tI)QwU1;Tg>{V7X?>gYLO62G;5
-!0PyoHeLdg_?=z^R>!Y;iT;$uLbZ(kl;uLT%+Kr!&(JTjWGIh523E(fy!aGYb0ke<BA+e;tL3{~2qrS
-2Pw$wLqIpL$bH~dQ%{x-Pqr5-oGdg<5X#b1m9bu-WN6$6yh%=vY^}FUB*-Sf*Uu)jco%xmvb3P+)_M-
-fOQTY}lzF1r3(gR>k2_l^%L8M9JbxcJ%M}kPx#$hzmYgzNYrl?+|-8r8(N76{=NE+!v!}Xb7YtGT>LX
-&~%aL(ry&EMOZ(=VOoOT&szXXd_{1*U(I&-Af5U-_BX_{yT;hZJ94;mP}&T^#28gfDMI!+o7O_jQ_~2
-y@nMU*5EY`#u*_&E6O1{N67|S>nE?TU*3ARQYm{%j|vGoZtK9Z*%m%>B6mXU()+>(8$bvz2@g7{V#u;
-`nR*!8vU2_yKVM!Qgmg>xbyrCu(n{&fz<=v&WnA(>Y;A3a_|N~S;f6s0alN1J8$m;i-NrZCabu;`+?P
-?S-I~eFquX6Uj`<#$bofWeZiK1)vJK*v)=<7NXJ}aV`Ld{=p?X0u=BH+EW^t~H-X8(d*~UkL>hB`8KB
-HoXI}u5b-*F?jIP5E<44Fke6n)kI6w*E;qQP+2oLiY%0lkd31AY!!*_v62oG-ot3x>1IPwEPS&1LvgA
-&5U1HkGKZlA+v&aA}2ZCQzzM-Ky&oz%=K=o6L-hS1AOeEa+bU=qROM}S4ajslYa9!HR5C0-r}?PVoio
-;U<d0(gSIT>^Llgwd7wNw!nsck&D{iQma9z$67vZq8z|5-(3;5S5j9dGaS<9m$B>V5lsqNBbTElRzvT
-115o30?}kiJz2T83Q!`k^dm5d#L^>R5{c7@l8A97M?;b0%F~!$M35`bECQ2AoVh)V$y&ZVi<w7O@#VR
-vz$BB-p9UtGbm1H@84E9<KV`LEUOWg)f^-oxkF3ATi-?2hY~@9;P?WavJIsP2wUx^kfk})mA$}sZmCI
-kVY-UAi-{<q`aS7vPB%26w<>e={m~JK(F$n2qVik)7DU>UJI0a0?_yfOB!nlHIOO7lkzsIa4XBLzz7=
-Wd$u3SON$f*V84dlJl*G;aU!$>Lz7nG~~LW%JzMtnKCpuC9~OUd1=cJ>LA0NzACN$p*E3z!^VFu8sON
-h(!%lj~RS0F)4}qif_0gYx!OU=qUHSe3{r2IcxCU=qTOHDIz=z6z=}HW{C;Np{}Fs3n4OdG{?aS#Vrm
-=YtZS2Ut`{fnNE5KTN{&039MFdgTKQBbi3$E<RMM^vVaA&EzzK@*z0Z-11DXNmL$!KT@c-{XMo9QmI!
-y!VW@?A}AjrVp6hKZtevp(RqvkK#KMz*PkIFrEIU<LUiOng6V_cmK5-nTWqO>ZVNMjRPvQuuYt+X`0P
-3`iQF^vwiNSiuRH)IdG!oy8!6{2pCieop0DJ_QVROY7aPDteY(ze%FuY@FnU`~F4(@#j*+49CDu|>-B
--RuE=YM_`4US8sqZUaVGSk)ev><=&d!2j{*<pU5=f2T<i-ii8dAzPUPMwzEnoQ>-6j=#+pCyOrDSiid
-JL;DDcYN?9l_KfWqaitexsz*8xU9u_qJEDWRi0U%D4PJiN#MyQ8}5Q{0W-@IhvsS30qk?o1of{9+is0
-?VH%NNXg*#O>CW|X0Y0iy}F!FFu8G+plIj^5GJV&tPWv<kmA7V5VpWl9atU0f=J2(o6q$G<Bt~)>o7l
-aK`^XOq*AcrHeN~vtHT(9q*kyxf<1&33sy()eNru09YOL+xnQ-3^}f^#R*P6=NWoxr^s8q!vmUlDCHn
-NZg!mY;TdE4H<DiC=6;>zNTuIU!cM(UaEUZpo6qeG$>No~WsV%HdVq}-&yQ@<egyr0WY6&rxgAXP*9`
-M&okWXVYk+Tn~B}fEv_(63FQ;D2@uzed-tQ>z(o#As5<TDtc<@|%{>@{E#!82HZ%LxeE8(7xL5eU@<$
-cb_WLUn=9)d8HW?!^=&$9Y%ZVVITkysN7i^W{MA>N2zwIYwdoE_SVQN<wu7TRk}^VVmn>IVoZLM=(at
-N+=Iw7M0Ty%EQpG<h+Dx87n<GF`>GGp<B*O81KIatPbGL5`Md!n@}xd`jL|ps%4BOa&|(sjP;tFo={!
-Gs3+$qRM((L$O#IQ)g`2-9HOv&55bjV6sjLE<jX+{)%VCiIZC0rjv&cl3e^ohCoaM28T7WCs8HR&93y
-8cR4Wj;<Wz;~CI(SCS7G};Qddq^sBS?!k+T)5HDr>Uu28LGCoAVGRCh3j$_WdT)hql^Nx>gM898QQ`y
-n=Ga?nC`7j%-N7AC7VupN}s7OH#bH92o#`w=1`CoWX?F#F1x3)Ou@Nlsm;?t^M_?m~4RT6m$0)jL=N%
-Ha!>>rWum$oUJC)gSql62!(&l+EAjW6Y9r4ny@AyJ0zrq1t3qWwrB&v5+7>nN{j?G3%-)Z-Ge+x1Ir$
-G~C(;Ok%jT0Zd}J^&FVQ@aZ97;`FRO`5vIGWu80%CTaNm0We9!7x#h5-tWmKFiFE#$AL)zUmXFa1L><
-X040LYUI3E_zClCVnuc%CGvd}wR^OfiC^7u$Ffggw*^AbQTQ}OvFBFSm?^R&3X?zMEidi?>cMO<R?d<
-!y;?xy#X5Y2+>G5112aUC`4%2fke%@r|{4IcWm`8`eRq^vCH;=9YtiwDyybO$m7t?EE<c$_@1Cx@v#V
-ue`l6CYnFqtQBURnew(LJ^om_+y31z?h)H<#HO8D?*;oChfJJ^2!t1n(45O^fYc-UZf|=MX#b^0r@M3
-=+R?bOz}we%<H{LMMLR=*%Nv5~j1@idN2@1Mj7BZu>QINqoN1`J2FkboRri0HZvJ0YB9!Jw6LiqIBUQ
-uo)HY2Y`}em%v0Z`X)EuUI)0KAOa;;-{jW5g8*eo^V4f!brg5@g8Sn2jjm!M5wCA@>i}j1G5e<AV}O!
-ww+>zg*in!lEBUsJkyh&RM$71O@%u*Cz$)?kb~v(&-#3CWm5blEvk$X{_<cM3F|v0wP^Yf}lytj}=}F
-wY(T!OVA{RGrv`S2Bj1FM*4H~CQYXD`=yM<p7G)z~n0F;Egbrl&dhTdpx37E`!>pudMTJeKexQL-Q+Q
-1kse%@#Uu@^sYw86GWw%xjgqzM|tJL>@FOk3jC?JVvGrkQjfKU>VY(F4#-%(~HoqrjvHY!MBN8lT7LF
-LCQen;7%Nt=l=a0!(sj6BDzzcB4&DP+Ysw6ShT$!&`6p>t)HY#SfKY@Do^$i=#JshAB-Pz0q@oNgTb=
-3y@kIy`2*nD8<m5tZ~UAj^1SLC|V;YaO|AKI4RcNWbHUXiQyZpAjI37tewD&C+6PhEfzFl?u~xpht@$
-H?`7Xe5ZBIOs1S2+vUVO(6nAgD4|EfAZ?blgy;{hFU+3nT6|#NT)AaGKZXr%$E)fTCX9-;-4&Zn{W<7
-BL#|IAplR%%wJR=U^_#nci4&WUuF}oV)?=b>&)pq)xPwGzo)H#5vh@Qf#PfS4CXStYw<3+4b!~`6_#k
-?*i;LaHgj$#6ik755P9^m*G`cyo?@i9!na?nS44C@cI2VpMcVh@fR&q)lAy#XeQ=yA-zY8|fK#T+Eo;
-rKX~^x_<jPw)pyuAW53iE}tUh5es6hvO4`P6Bv}Kd=tqcnLfd=Wu*xR@TkMIUJt^3&lAcqdG4a=Wx7)
-wU9W6<0X(+ox?S56M8z_qF^8w>u|ERi7`RE!=3YdP(pYPd=l?)d=7jP?{It`D>Ly9C+m&Akr-aUHc8C
-G$=Yk|AH_Y~xd1|md$@A}dlqpICu?u<6U9E9tRKKyL;S;?3+OlT5673Wg%ba8d>J7Yb8vhaR1|Y?d>J
-a8n1kah#3Y7SuzwP7aJ-D=ym*7-t2cm28eYSmM7+WAGUh$;2FKUfXOf2BV=2`*1Y~+mEWz;)h^knE;}
-wkaVhQeihqj9)IKGYvT`a-zbqp_J2~O4-IPnC>s~AJX6CAH%Vi8Yp=Mtts@dU@KSnG%<xPA5&FipN2P
-$tC_oUGr%P%oz7&J|4aVhZkD#Trpe!SNk*shEP}A2FJXDLB55Q9?|?@godpVhT>yAA^753XUIxf8q*`
-H^CWo1)o6K5m#_b)m>b{$@*(-3dI(jtgK+gA->@F8CD143yz;+(iLBD{0yp(`hqKDoA`p`R}lQf7aYH
-at|PwS<o0(MBgGh;f{3s<gS)7b$;BDmJ@9o@o>?H<S4(|*ypHqkL9DyPJDl8JMhb{|xO)(R7V~g-k-b
-m{diOYTT+GAW<ClQdVctE8P>OlDyM%#C%){N&$N=#UC$}G9a1irw_ab;D=Hbp7K2*%Z-HTv(p;2ZEh<
-UiPjxj~d!`-Xca)^0YKE+l=%){Mf48>v|PBy6Yt9!Vyh^?NuhdUeKg_wss8(4aYcewilMmY5jH%?<16
-Yp^64u7HqapNqOP+}hLuFM9pCkEl}$_6kA)W*f903{t)Zvd+UwR3k9nB>|`exU?vZ5^1T+WLNAl4|R3
-fk~JioB}38>c-uN03}X$&jOQNd$bpr<l5#NU@|LivN19%Zr%e{r`qloIz|n`I|uNgVi4|ZJ_ja3&Ygp
-Y0Lr|0XOW*OTZ=o`sP@Dn+<o~9nEXlR)<s|v#8)qX$#{tZ*q-=*yRZ2xB!;h-fJqErvn>+C*Zd8VYIi
-On_>Di99k$w^Q|xbMuN5<YAUvI@e*f(^o%pL?eEW-^{q@hj{rzwM_3!t5Mn2D7tvx^g{GY%4^56FCf0
-Nn&rnCR;%>Fmb{x{D4H=F%$clN(In!#qFU2Qb1jh401v^Lt-M&sIOT^r47qkRe5m$2W^z69+{(7puiO
-VGXq?Mu+U1no=Fz7*|C8CbM0Mf*~;FGc%Ov@b>bQnasw_I1#{4%*it^U%Hy+Sft*I%r=9?dza@0qqND
-UqJf;+83A_XkS440@@eQzJT^cv@fE45$%g;Uqt&Na~JK4XkSG8BHEXseHq&KX~p~(KmUvW2T)4`1QY-
-O00;n48F5VWnInLL3IG6`Bme*)0001RX>c!Jc4cm4Z*nheZ)0m_X>4ULUtei%X>?y-E^v9pT5XTpI1c
-{qUm>KJi!+zF-NhcT7;K8|URz**-J;hQ?1ye)D7G?D$F@>Qo=pDzk(6Z1d7Jb)hc$|su|!cM^^hXzK4
-G)V87ovNo0}`v+U4wL97&SVXp~f{xLwLhWa}-Pv9}esOQq|XY)Y{f@T0Memv_=Ay=6$paDmB^<em81N
--Yd~yR|FTuphI3v9_s%F>I?^#@Fj=3xhvprCctP-(eMO&!l0cY6OD?oUMhP*_9T&WD9O!N;bygn_BwW
-wN?dkq-ognqv1E=DoLI{e@=q1IYZ8`L9ldeR4q`%@r35B-d-hHmN9&gIO7G0oK9$1+!tbP*^3GV*diN
-I_6ycpg6cibDI0@;6;Uzn)@0+D5edS9_B5A*H-G&#wrn9hx4@+`VsGJ%vP3mb!e6ACn<bs3$sHTe>Vs
-}YXPQilN^pbPo@K5hJYRE=iwHK-u4ulK@*y!!vOG(uC+ylHX4Ea;GOHZD-N-_)rB*ewE5Qt}1#>V0xs
-Hf>004f24=dH)tXQMKL)yj)jr-lgflirG1Z6leI4{69ZeF*Qm22<=D{El_o70-UB7jKM7=SJc^Ga)_!
-QBAXf)y19goD>H1?p%IC!{7?e9%5e*6^yLebKoNti)%4aNzKwaT|Hp117=EJg(VFRiz>0669iLJ<5R-
-zObcxLt*grycWR7sHR)`k*s$@2WQ@gwQ!7RcSH=^a06#&gD(x1yixWKQadL0%NMPsb&D<OS+rVXtaCP
-b>J35>G9jep`LeaG7J1HOy;d5+;=-t^wIX-#N#e(sZBtmKDia1&_m{!FZFqBgfy!ZE!*v6%CP|*KKb5
-|9IDY%;?az!iC5YS1=;cmmgZ9BV*)d_YDqD!-iCmImD{i>8I_(IiY~;1f-PmYyMds=#vf(^9=HAo?8a
-TQ~=H_9m8)5SXJac~&N0J4C!7lyW8<<LxJO^xm$>;3Tn81S(wDX4W@&Q~?wH99oSRYSgIE;JfB4va~d
-<Cq8MfBo;v&%s?6sO!28~<@zN*xcp|IhEzihg8o|K9-lNa#>F{+uL<^8*qj?IMM@8sZOs|8_c1WG<|9
-w;sN@z^A!{mBhRo_4ie`S4_W#Ee1Q&KoGLCd`dr03n|Fixt0deNlpY{5%t;{4COu+cTwgc9lE{u^uWP
-y)4>BK?RfT@yu-~(wpoeB-8KaP3avzO&X7w=OkP?8`AG?vRRiRZt4Kw83tkK7sNzM~Ri=~Ze1!&(Kcv
-$8J}M8x8}k_ro(~=a<$({#KG^LMr0<>bkm&A$!O%T8hGW;wIfi$eJ%Z#>06E(o%yED4>Dt-;5N-dR9?
-^xqG~#*KBX|>JM(otQ6ezk+jbO43xAQqr>h|50KN91cv~V%|d$n+QLu_H8f@yh|Ts)|cli*SG$=|QI7
-A2x6Rf{j8uwEI6IgpLWM%p}2ji{DWSZG&%79SkUa18EE{FQX;LIUiTSr>!mZ$Qy#c@PJm7l)%XK9}rz
-8CXz`UP~})$x;A2ahyUzBQ1ho++pm|TM9HGi(iT8c8u_{$NM>ZHpSJ4ZVhrRyW$p(vDt#=g=$Iz*1cX
-v+&gL?r^Wr6N>|LPLf}IcjFmo}7LdcxsYYC)uzgI_U*;(5fk+8SV=YR_t$?anF5_LJ9YX%So6N>1(qZ
-kohBBmvoD3XyB*P2T(9E<8!q8~apM0nW@#K%3^}E9n2%qbL#8JXM-Sy>16*|w6QhS^q5&Pc?XzmFB{0
-4Al+BIg=hXo<m=*z%PJ^{IXL$ib3?;|I>gxBKHWQeNsem^bN2bA@~jefZ>SL{MRAF&HYG+CaL$?_cj!
-dyDfr@iw}26rsQktnA0k#XmqT89>pS&Kq0W#Q8xB!Gf9C~_nUO?`?X$~m?H&WbTRjR2A~ZUmf17wt@C
-_vEncTL=MZSnjMf$vQ=x-3AARJLUxZIaG3F*$hfQ{O!ouKiP<=c20PujP(VMtNXC534`g*E^Apj{y+n
-NN7HiIDb|}0AA6`i^QBv~9v|#-xLThs5^S{fZM&Z+3<|C*3CJy#uk7x?)3N=x!wBm=jIU6iLjIyvOCg
-loVdYILK|avN6^Kv~(%5K<MdK>9lc9uUgkY}G?Bbq4?%4c;J-c7}r(fmzWyg8+rvWvZ9}MT`N7CT|Px
-^TG1hN77wH1sOVv+#o29cXDFv`ab1D{Gysi9D}#zs5<hS*hVEC+kzBD#}jGncb&Bm&TG;8H8U@Io{pr
-bZl4EQ2hTl`Je=t&I=DU|7?IV3!-i-HHP<nujCZR|aRMB#29zk=p}|Vr}506<p*SEp4b6!i5Ea(hL{U
-J`HXWv7pUDjyQ!FQVCkMP`+Q+2|o~dV33AamFw9+L~<qzxiy|my9Q9Z;EHZB^fJdZ-$BC{C7aYkVo<T
-4d`1`M!escPkH^8g&*!r9^br0&77#-IX9nb-{Vg)tiBuugnTOEcUtoRf^Tc)iK|qQHX}Ck6rf3uA7XO
-FbN9MfFeW80g0iuf*FD@5$F{`DBdAL%3L=hL@N4F&7X#s2SKqyftJ!9;n5zDqhS$QNLMS5Q*cXiDp=V
-fPQDj4d{%U2@DJPWsjB!?tgR{2U)c)1r9MB`dPe7WTM2L8Uhyxo+>iy3;X8UB%uu6@rItMLotd#Leus
-PKIZVs~*1xg9El%nwNU5^N$0>Qemab^+}yEUTdYspdaAN5Z>UQtO4Yg`{@z?bcl%(vAUe4TLx9if>kk
-GVquccCKB_14Dtk2xE<B2KgM`560@Y!0L-YOD$+@mTV+cLl6@gH?BNi(1l%NB2v-^4rv3U!nQ87@>^j
-DMu0RjAi3y9;jNF7V4GaQKjR`Uodq%RU14l+fZk0ZQe6M(*=Mwaj&Sk>8KLB;3E7F?DH&=p4PhM?cGS
-oO!VU5I;p%hPsuB(HpRoCy{op&~mf>0VJK@`>QAnUhpMej3o{G>4cu9vy@tBIcz3Cw=fhWBNv(cx~U~
-$L??jUV(4XOnkKH#jxE4&7{%7v_?-TK1nrAxJ1gMed=*x)x>Jn(A=ziIf=fP#ciWZic!ViC}pRY1}~H
-GBz(y`7e2fn!V_+ahwKm?VoOfK=|_wxeU7d(gOp*7@IRU6SMh^VUf74fY+-A2INNCL2f*n|MI>Z8jc$
-jrd!Q>_mBFE1Rz%ig>`xL!xXbNNngK;kQ}Zr#-#`-Y<DU{+FUqnuDbw`H{tniH0vQxyPlh@-7_(8r~m
-;xAF^p)8cg;;@XS~i7Qu5;L1*iFdve%RM8h6UQMo;Z(X^&g*qT1VGoTS|Gz6bRe$wrji26e{ZzNj(|U
-_n^tjjYSyaZMAsj)PW!Yp{oMF#%aFj?*8mFjjMEz^`0X5rbzBX<?iFd(qJlp6j=q4C$>3ano{)eaIe^
-2(79B2>W)3to#$HNUJ+!JO%?CX|&4zy$64BBDr6^)@yHUrqf4H!PZDuXzNP#iwC9uM}I2;^1enxmaN&
-S`8A<&(a?J`vi8U44KZj15Ctl7w@J{=Y}^Ur<W}1QY-O00;n48F5T2-ts3R0{{SA3IG5k0001RX>c!J
-c4cm4Z*nheZ)0m_X>4ULY-w(5Y;R+0W@&6?E^v93R?BYNFc7@!D;6q(NT{nOIR>zc7HEI~c^n#`M}f9
-hHW5m6NUDzizDrV)t(TqXVw&O(XJ=<g<w_Qirg>#5g=q@B*h*!9EwvPt!PNf`f_mQY0-LeaL6F<<q=|
-|i<m&Yo(>Mb=x?@~mHiIW=?B9C$xVL}&iWh>Dm6-+5eSQjsEZh62I0%B3U|PciFJB!n;kJ9lw=OyiLp
-uX(wL)5IBrwQn9aNf^YhXqed<9!2x2Vh>WDbJRqMJAgT>N6O0AT^<-EA(lEYJd7#vfca1GBO8F`M5pK
-?ECqexnR?BKcNvg^@;)&zz{F!u&~=O*Zy1YJb}ihNzb=B&kaNR$*GQf}{?2%P>w>LTZfSHUQsOxHWM9
-{97rhx<HC?jYlPl!rc8@)mB8^AYAAWE}*|z930qr(j-GO;`w2yp_B$}LVzTJ2ddv5D3)1j=V}c1{wRY
-9JXU7y`~t4JnYEB#TV4msyN&h3i>k02^o8d34!2I8!G@{K8N^D$P10FED2ywPPMo2J^>H)SGO4vk+~w
-=5^!#U}N}ifEndil23BFDVz$4o)5q5a_4<VD)Qs6h?y5+|JqqMv<iA)r=VP-%vrs>qJ8pKi!n(#T?4E
-fdaZ4jj5YhE(pRojY+deBZ&#qMieGY3NC|Kg>>39Pl0&WCH6jIK~fCsjFkWnDH!@0p0GowdAW<eIlH=
-xF2_1J-^e6E?0JCtx3vzA8uk5l_Y(Z9nk&K$W(m>mxM^>jCT-H}(XyC!#-g!jn+LC-j=-Qu$-yli@Do
-Ei;?xRHv)gJU+qBy%2>L+7^cSN$~#vJioIHU9q)5+(zdPr0;NjMXdl=$#t*MM>FiVx31{+!pwEJYm$@
-gP`5&Rt0)vm7oxM+(LG{&n7FzmxlX-IQ9O1fv^RC5tqp8-9n%R#4NnfYZxVdx+UTLpC${rn1I>1#{!C
-bslooWkhXN;d{zyyp)*Kzet!M{Dda`+SNAnuRNm=2LsMjW-qJ9aib;d4|lR{1fojKaw*?YuyNuGOkOh
-){2I_ch5$)v{r0Z>Z=1QY-O00;n48F5S@CcJ)g0{{RR3;+Nn0001RX>c!Jc4cm4Z*nheZ)0m_X>4ULZ
-EIv{a%^v7Yi4O|WiD`erB>f-+b|G*_g`_igxV~4?Q0>0ZL~00w?X?b7{e&BylAndRFc=`zu%o?D{*XR
-3)4#^=kB{--<?!yRYRVajcqi~a}f1bX$x#=RMl9X`|}(M@mm<7WE8a$R@A)PE7R@FE^N8hQbkco2C@z
-}`J`5x_ssA)(C(gziWhVEtSlYd?Zb`^Ug8POsK(AC=&yH`=B(Ixtu%_FRmF^fhfN{0Lq_0WEWL5+aU9
-bZDDgj7?qG!wR>+^gFg(pyR_R@aLQc5gCFVs)Ve>pOyej9gWp+IWyC%!LSUl+l!?51L#b+fuJFTs-zr
-DSMiVQD~{JS)&=H$&~dXDgc5BIFX@J6k6!DlC<2m$OtE?}P}VMz&u>E#IEYsFR^K{zy0JU84+OID+bw
-CVs$*esj~EAtAulU*QnGIA*UrG#`2W)yr*aD$ppu6Sm$nVFdwX5c~A%2=}S?-;%1F#a20D~c4UNoQgc
-TRk_J!nO<(ylFpUX1bjy_ge!}Ss)eQSoqdY|8IccvdHOMi{buH_T`<xW3mX}Z{g~u7k7Ys6a0!M012$
-G{K5pqbCq51T}0<cg=+SiT!rMoTe!YT_m*DP#4_r;zOvQ3n?aqBSv57#5v$UEV6Q8_weaQfPHUxyAUM
-R(E1YT>N@5?CDoMXz{}{+&4p206GY=LEKm4-0yKf&KpN6QkF1iusx}6u<s1)LM9l~FQu_ih0p>!O6%m
-mFm<in)A=6DInDL+n;rsWtCr(?>rR|il7o(()=0$F}=4<vEBafG4SZB^G;@tLg}`#D=G4Q_OtsqR}GE
-0azt4rzY8F5nTTdg$jhGj6DoW7Bn_<ulW}1rr>DZc_J(etuwo4b4^DRGe=Us=`ocI_?Yjpqi?Xm)76D
-JcR4&Kvx_n{G^eL%&2iP?pfjA4@q3QU*bZG>hFS+oj>ZM+HyH)u{p#q%Q($el`@BuH2CBDCJcJbD|Fr
-u`h)gF;#1=|bYXH|p5&;1eQe=9)YX&}Lp{gp!>bnlym1lC`8QW*u4*4+OKda(b%SHVG8$}TCFEvk>rh
-75W3xEqY@d*$toh`QhBb<lv)UoyY?y#bjw?W8Z0!0tna2a0OXS?fp^cRMwB!A1Pz$tgDAKD?V<c&#S6
-y3zQ_m@A{XWthFU%iMO9KQH0000808trnOdvdREgA>_0Lm8t03!eZ0B~t=FJE?LZe(wAFKlmPYi4O|W
-iN1PWNdF^Yi4O|WiD`erC953<G2<6Z}cGu2ZPvMN6BWl#Wrn%X0k~eAe#&lx4Q)j$h1Vo#7Lr-q~dtd
-AM+0V+de>FqmMFA(sK?;U2Hj-=?DQLQ#>Ef{lYzV@aqGXs8p7ZC#<sB!FRYa80@j7OmmgI&txv5<$AC
-OOBZUn*79*-*?<4Tj*pJM`}pCX@b7o*tti=*EK9Lwf0&E%tL54*RQX4E&1f}}X~e5D0+}wPVepq}A(&
-B_U2!c=*jiPr;A`Mzxt_2BILhEZFVjP%St^aya$Z@%ERwI3eh*MpnF<Xnuqt$6n9AtKJ35^`cx-m1U?
-aB@)^21XN+TxhNoa!$$4qHJ$~hn~ZrHM#=h7@h%I51=z#^c#RSZ@&FYTI%=cN|L04Z=Ri)AiF8nFi<2
-nY4ZZmusbZyzqBcMn$w$1Fq1gyk|f(O@tf4%v-YIGc+Ff0C+lK%x+(1>7ge*<VWe%-&spPk=zj-~rOX
-Ak(T~ahz4Q(jtzLP-)Bf+^8HB7rWnsfnOI|mn!^FCcIf$2#*y7h!L{&mZRFvb1itf#s!g1h~F#VAK!1
-44a@NQ1MQg*d#wi-r*MR-?07Kv)gZ~aF(?ip0Z@I`_#}wdXr-+Su+@e#K!->%1!be-I*m)*Rw`Za+%1
-&6XpGBkaI4vp+r`YO^PK4SO^pmrS%R5L#4->mu#(GCkiUs%I|<+669FLfQmX{KfdRw_aK^zo!@6B?Fi
-!GwB{lG4J=0!>v$HcN!)Zr1`$iQ48QLFz&Ngxnd`U$H9s+#YI35|1XA_2EPvCeot4L3;c#dYa&P1oTs
-tks}hmrydS;4SWmHU>NYUy0ZgD|xenj&NZ@y&R?;%kG>o`@C_orG4T@C~F~KSuSY;0jSM&s|o>H5KlO
-s#5-3i5QIy%AqBsYSe(|#UKqqwnRjK`;)LP^wInn3AXK0QOBoIx8Yq22)(j~j*%8$kZM%(Fm9NTCeA5
-j`nZ@1W0}mF!@-r4N^5Zce9aajPrb8*XWH6`p9692#h7m>ebO%R3`x~&VDyNi46z-#{rz&pydX&+06t
-X|;?Reo7c0a@i>G_y!LZqEsw**@1(Xd6jIx5;WFg3(YVxuw=8)HoRTyNl?C2vJydX7++1O`{l?YYwC@
-gx-n4NmJsvW7N4<FXvU3UZ%D(2j6+zfwwE&$j%adud6f^|l7X<!#GF`;AK$!dgJ+li_`*QK&hR_c_~m
-A)Zz%tFwFH`I7|HH3nKFoEGq8t`9h2vMdnu6YdlK5F7~2OjD-te>%?la5=~kYCk&H7u_ds2cQ-E|Jyi
-?gDMr5^5nvr&WEi**Wz&5lhSN9xh3>kgH&28xjP9^@s{8x&^&NmzO_XKTNlG<FnVqYJz6QMkJ#$8Zq_
-*UxS%UF2oYb&0N~37sIR3YZp`&bku+3|Eu}Uhy1Nw#z#Z{0*#QgkN}uf!O4a%LTx`opJhSWZ_JRr`Aq
-U1W^6y`wVxtjr_UJ;-%!WO-6C^2;q&=>l|wQpS$_1Ip$^&CM;QM{(bwBpyQOT*=i0W>(D@x2ja*SU&F
-|v0AKB&1c5%%G)a|}faPL0#WjuWDMWLQHvmWrKH^{oVugjv(gS~YkRl+HBq4KS+tHozKTjBQ2a?sU*(
-`wxS2Y*4r+E@BC+5vCZ&|Ubhs}A_NZ?~a=b=iH*3bErTO^S`Fh{Fjlwk30Lg!jZtp9SCIS1LFj>yzyW
-;!0abk?SYGkg!LuP(U<J2L*&$zyUAzD6fk(X!m>Frp*73X=gKV+{5OYbuAL5)24lJ1H{JA;baCXj8Wf
-0(B`TTS|(i}Y<gjA=m6FzH88v0Xx|cE`WlYHPy_@ohw%fwTsG>%ot!=KToSL7z|?Gpsbn^5@g4Muz5O
-X=8aKqW%coZqe23<~?C5R6_O%~0e8IfFqk`F@h9S>w=%kN5=zmZpzG$E%SATwB$I&<7!3kAG_^W4K)Y
-st?*N3_)TOchs*8>xyMFlM<=*56zY>r+s1!c)hLT4z;4*B`R#r5@pC=-QtN<|`JZk#|t%5$}HV<SwHV
-nx$mvf!F0R_JI4Gw-x|)V%Ps9vZDBj9E}uhNT{+wH5Bja`5AME;=9}G<^gC;P3<${Cg%N5l!5Z$B~aP
-<U&{WY&GxDLw5vi<dP>aD?tt=W&a{HgxUn}20&I3^aG?a4>N3__tKKP@idia7MP`R&1`qnH7RN6H24j
-5$+$EcM|hL7Z1sa%ZJP5#S=td&G#kBl{gvmH*l@6plePRcN^)gHXw7{Hz&D>1dYi!=IpIg#TTA;|E(j
-xJi2wF&z{d~&0*a3x{$1Y*Y*eWl1(ON!h<VdTh&z&eoUTCH7ZE){jo}(+Ie#>u(-90Xck#vj<@uETgV
-B%6pDu2~`;Yf`w>N(qH*^Jr0gxT3-+ue;przJ0Lkj^-Pcmo@oHQWgHnk(o(hhM332lG1?=AJknPG46g
-&E-svH`nNy2cRC951aVn5q-4(4ctB=+E`@>G5wSHUEdSD?%r&Lzp7m-!ai$N$WUs!t6=`SMo{FeQDsx
-JA;d+*5ukYMMU0({lwo(Y#d;@`@N1IUqt(>?anfa+j|1VcLG~C5JZ4B=dI=slOJ{lc-7SD9oVw6hE*X
-8)hMYjbf;!4w6k;twGtse`fBOYSSX)#PUs9<=?2c|iKtG#0=+t=bal|KhP%ec9b@C|-R14{h0M0yfm3
-%l_#aS90|XQR000O8Q5kVeyM^$*2?YQEf)xM&CIA2caA|NaUv_0~WN&gWY;R+0W@&6?FLQBhX>?_5Z)
-0m_X>4UKaCz-mOK;pZ5WeeI5DE-St*YA1E$G_lE2qRon*c#k6arV8^%ADUHA#8B|Gq<tlBmbN93Ofp0
-V7;-o*(BMl37Vnk}O-*x|Wb-gq0g1HK9u-c&#C8ekY`0PfRgU1%Z>$tb}$hR1j#ndlwKKb;WW~KmgA<
-Y&5x}CHy9(kb_mSAWF+1SQ+<e>-B@kAAY6^5^^WB`2mHUe%zTKiCzDUenpKD{lq2EV%LZTL6CE*6#4Y
-W2d2S%e9t&Ut;M+U9{viYsL(UjU_`%L;#xsCO0nub4FfBsLFr<NA>N4!nok9+5G7VIon?^%zDmf3>UB
-c&+C%}x;<KzVZrwz;Fq+P%^&5uW{O0DyIz;=UU@w&@VTH5H_$+BJiuaUbva^0$DAI#@bSd;kj96-7$c
-#4(#O+};To@^!&|?i*h1)+?@s{GC(_*VphN;^JrtC)aXj*Akg-~vc^TArSGHJA%*ovg(gEI3d9taDS=
-3FR<P;0VMSDaN3QDbYkS^#ey&4e(Y$-+hDCEcW<9yyA?9U_>Es)Af2=?q&MiS}bO>%c=ZH#$QrX<kbu
-q?dok*-k5kXULKFQJ7;rAW1Y`;+~sLR^dRjA7Qk21^@cOd7?63QyIPeAx;iy_?6@7>{W@wJ|ow3TC{%
-O08$-ur`+p7?bu+$=rxfz!{rHlqAZynl~3C*H9RvtSZO|`67Ct+os7D2O6IF0?mG?5A8RJT5p+*aai2
-|5xfwF3n<`QXZFyreYm#xRea=;pnQzX9UH9_aV~<uv_x*-k4MFQne%r+r>@hec^_DV|&sBQuZHuS$<6
-`Wt)i|(?PNcQ*J-NQ}XksaGh%24wc5RB-wE0mdT3KkU0j4r;&!Z@QH!0UQ<|rf0dP>mJj%d*|cdV0%c
-oRWSNLDGpN@JB%+RMjoAeo|$eu>Yky=3xrpD3^4G%vRaxsAi*nCR%lNG2ym98XN_W#J6IzpMelM0^y0
-*_SOAtHd6*1|llHYp`AmUVuD~H#$a_<Qrn|C?_MnT?4uto_@EdLgT3=GgwHmRcOvdx&n>8k@ILOh`Dp
-9A|oFoN3W;F*Z_7XHh`u032zczr?|%=)g}pC_!F;7PY7NuEdW!{=77VK5%A<V1GcY&&Ww}bGvlPDZpO
-5cwBrr=tKJ|uU*HnMEf6>?WP!M0X<-wc)scYr>uT63XC3@s#N8Ma@nW&Rikpov0NLg$Pu`ATXy+r{Ey
-3We)}rP`b8=9!WTtCZ_hY<|9FOiaMf$a8;xvBG#N;IH<GK^16quoj$2?Q!Q=$yX>%EYo&`nxBQ&a9{a
-S|hmDFs_?D?B1ER7fsPRI_DZ-WBK3YS4z(RCQZwF?Bq^3m4w#pwj6f90rfWD7;W+i)i!F9l@B6ALytS
-z5wS55f60NFr9O9&#)C9tO&d9iUVvSgSmI3lgLASds%{bSA&!84oybgi@43E>Mj$bOlFN|w9MQycdz~
-Cncdpw?)|;Q3Nm(<JA!>6!hbGQe5@9xouG*$+pb0CGPR+24dVD+Y$*AX6X*QicCe=%zMR<qG#Dj3Du9
->g>^i%j$2s}?@A;$I_ct~#_ojyq`Z$s|ivPa)r%%5x>eo*Eq$BM$(>-=<IXnzi%%73>aPax}UxMO*II
-(T_Oro52xgTLQ1+@cii7orVBKLZ*y`Wuuef{ih75@TIO9KQH0000808trnOpzlA**yaQ05}Q&04D$d0
-B~t=FJE?LZe(wAFKlmPYi4O|WiNAiZER_7Yiw_0Yi4O|WiD`el~!AC(=Zf%&#yRS8YH5GjmJp^fy4w7
-FeE1NfKcS5C#zLAF1AC-zsJW;+~(3wv#Qo{&gDDbxww^*TgdaOF^$4J2fp1&Wq=i0ipF5>pQETdm%85
->zQri2NImPdk}tB{d|(<E@J$+ez?Iv6ZRueF^nGs?Wn&f*4A*<1kgZy;l}1ri3Z^yuXt#pb8#=z_0)v
-b6#u<p?m`;F|C0c1Cfk9>EpwYa30PVGtH)&=iBd4;$%0|p<Zt^_QD5?eQm{~8ttO)_GmiMZ$As7#I`A
-ycnH(D2<n;oiT1T4+G%_PgRGzj--v$GC^uk_f<PH+SEQ?PRLEW9B7tf~2*2J@P25tcS78QII6Mlu#ie
-_j7R1kTDo4OiH~I2qz6xx=avqJ^fek*H;=g-WWP(d<arsP<TwmQ}AONEQ(9i#W|nAvGq)vEsiHcLqM+
-eN;-Su`$KCMn~l>vrMm&xN^Ug?b0%65H58LmlJLdF1kQ1S^bVzhpmQM8Xyt?g>~iZbZ>(RtXDambvE4
-lqaaS$WA!SWzlE!tLDdJ7F9WV92<+EX##D+!r3-u3I=fx$jB-*)!Aqdb5G&kd1D!#J`en<eZ;xrF+=;
-N1=hRK<5Vp_O-H%bW4hX*x4hN6R8ho}gfUm4A5cc@uFTzSTg}_(Bwfnn?4NIqkz;m|ENyv6{l1_ac{P
-}tyo_!!dfn@Mq$r7#iSxtp@?A4Q3R0OA7-I+D2Jr$(g03n+MI;;6eeRSnyYosrVc>p6*laiW57<#9hy
-Gh(_V9&Ur8A&tKPlfobsp*P+{4^F^13ppRC732xdQ$OpCi>+A99$kre5r|K<`2Qw*wgVniqIua3&dU0
-C*(C;U!9#TSK0Nbn`T2C_mFN%Dr471Kk<b^c#zUn{DYhpTvyj&>MImzZz0#`M@?jL5;)&zI`=${yUY_
-D?(?2pQVhh-5rtx4{!AYS5B_gL??H6`9|}t&*(qAs;t6MVmNoTZlpPJOz`-HF5euHIaEo&Nh@Im|=1n
-D!*czvchJaO}YMqmZ<#Og~3xEo%w{eJO@_Qc1jlX=kHX5Ekch|=N+-X|>15ir?1QY-O00;n48F5TJDO
-kpd0RRBd0ssIa0001RX>c!Jc4cm4Z*nhiVPk7yXK8L{FJE6_VsCYHUtcb8d391vYveEtz2{eml-|-zT
-b5E57Peo9g|aM6>7^{jlPD9hj%94Qkbl3nleBYb4so8WCq2FB3|>YGFpxn=XCJizLmk?HJw)512N@9r
-{S<(Q0`8pd(($~cHSmf)5ZmeuuG`B7wCzjU{r+*wX<?68g3rGmo__D2)`qskJhLpdlLC*90}1;%)f?D
-D$CEQC2tA4>6WVI<Jb_X}l;}|@pvkcp(1*Y#3aSM+(9=6*VGTG>RuaK>l7&`EX=4)e2fS5~o?0m(F{x
-PHWDw#sX+Li;dfGnUmsvNcqm1k`+UnqxL~hrslN;>V&7O{<6vE%EV{Mz1)XCL<`bhRzS0@Vc%>#RcC}
-c<oLviKLoElqLI2baesLbi3hzs9$yCcaM4{b7V=VqsOCk?8TNiyZ?roAoEZJ-={WUEaNdx^s!<+qZ}o
-|Yx)*ovn^On<6$U+2!ezVLpA!fT03;SVcvMqZ6H#21T{*C>}fv1@T*g>Zd&_3a|PZs0uBa1NictN&0-
-0|XQR000O8Q5kVefp(V47y$qP0RjL3ApigXaA|NaUv_0~WN&gWaA9L>VP|P>XD?r0X>MtBUtcb8c}<W
-%Ys4@N#dm)SaksP(Lh0V2e{LuoU9NN~#kh&m7;G!Z^1*%kI#DjI7wbJsKR<g9@1xH!_<&INzPJFvcbG
-EvP*RT!G9n0a%s|5;9w*n;?Wk=Hd?05}$?W02y=%awerbC;y<B@*I3X_P@%8!eb~>yVrp03-QFcwhI8
-pXOe5t&F7&?kmKtbqHoDaD*15*TRha!d1TJUiq7I5F0LJ_p88|eMn&%qj)*e9t2sgpUV5?X8BHx>CK+
-!&~<+C@fUYnxhkG+o&LjG_`_&7kG_O)7GU(eXuvcnPz=;tG59&-zi;np<P)HKCH=0X~<$-8Q#tX0Z`f
-E)Xp@jLK`;U32BEA@z8Rsq)`@>cE%z1yD-^1QY-O00;n48F5VJX-ebE0RRA80{{RZ0001RX>c!Jc4cm
-4Z*nhiVPk7yXK8L{FJEJCZE#_9E^v8uQcY_cF%Z4$R}A(cb`eW(F2&$Oo8(XkrQlL1rHIMyY%QXdHqx
-xqrS!jdBsnH2tuB&g-h1=8gwF??ptp`d?ruT{&bH(ebujskBJhELDGmujUq0_fY~{MEFb!WQCL6q3!l
-t>@fW9lR_xqb?OaptOV!Zosefx2LdkW}_Er!5VTQZ0=hGaR!S@il4p$)_6hzUAkv@SKOk6{2~`iZAV#
-(*8h5E<}31vfF7`q$9eqs@tF7^C$p1mAK_RGk=UPD-gyUpKJJ@8(zwG1m9t+vRuI?O-GBtN**NRL;`j
-1HIjX505C?JqTs1Ku%%_{KN1(QpzG6wIY}3pWb^+R83m4>Zpe&%Lg+^*{#ErR{5pjO~I|J#A2~1_jM$
-c7GV*A0xxW_ocYZw#<C7R(&J>K#22b9Q=p%tLyx&p+cF-Jv@O_<FmDJ47^GamchfM;C#`dkGP2+a939
-DJy=t~TF?zN|S7ed%q#d>r+HxXSt3Ao(u-I~5#=p|9YOi~8>P0@eYsPqbGG^7fq`~7L8=5!El)lMUyn
-yEuN!G|0$yG(4f$D`nPpNs9KF8N^!IYN?<7|rMLc?mU;n(lA`U6l)0|XQR000O8Q5kVe`u(I5a{&MVh
-y?%uBme*aaA|NaUv_0~WN&gWaA9L>VP|P>XD?rKbaHiLbairNb1ras-IG0UgD?<=cmIl0vw%cV)v;2C
-exy>QC`+QQmIDX4GB&l3Ncs0Q5Sj#(qIBp`FUG!m&M)WJGuRZ;K_(S~pVL|>P%=U7FojyDXn_g@LR&g
-8S-W_uMB=AqmlnZ0S|^QWGq{iMA`m)l)1KF_eNGH(#CCJJc$u%(^TUC<-Lu9}SKBMFSQ#hD*uAfp84H
-OiD}{uRA_=Kn%ra|A;5@6Tw#YfivND!HY@JaxA@9}^q;e-4VG&eTYVv?is1eFoqJ(p>(3#Yd_JP@cU_
-#*oW8g=MnJ@2!Sk427D)Rw242%9y4L3b{bBYwg6&H~v7&Jw@cz6mbI$#kP-w`{e--L2_hTzo*eoi62U
-D}b*2?lLO1WkI(dD}0}&qV7<1=`>1RVDMuK5T4#_D}hwh#{ddzj#M0%mv9E_P5Je{{@dnw}jsY8s`7P
-NVk9Oq+vg%jWi_wgO5g!W7<d~<R>Q`9W?Zachbl<A^QSQO9KQH0000808trnOnodXR|N_H045*+03ZM
-W0B~t=FJE?LZe(wAFK}UFYhh<;Zf7rTVRCC_a&s<ld8HZKZreEa-Cx0~50+4kkk0G?1EVhBc0G$=k|v
-vUg2ft!ph$GARu(lRl{A}XzkSc)MIvQ6$?W7ImdJDG;koHG`MfO!*_0I}@LRN5MXEBVwV(xQ>w<D3x0
-FcAcY?5udRa7C4nHRvEGAc!i;~ro*W}0KC?;85D6kKgf449RxujGro*aK%e!5&5hP7Jbj7d!!B;d4Rq
-Lhr^1HBF7Bxk#(qLPw=%B-wJGTCspBWb#6Wy@)rl5*EDE=hJRSk+3J>i3uw<!y<A#iZe7Edim<B?>w*
-7_6Z@16JL;uun~uNnpOS@8VueG~cFdlJu6=1>;F`-(;YAePcxkCj|b^VUaGs<+PECyL!K%qOGKeiI5=
-7&85sxME$a?i+B>ffd0QJXJ`DBaj^P7IBT1j{L1)U#*3Kzvt^PNmx|yENS%~$rf}GqASZ;pCN=vbGb$
-!2+B}mMR12BP`-TbwAsU*On-UJ*0$tjbm>k!)SydL@%49N0)2yoCsODs)OcWTH(~N(mJcvo~JNVkBtZ
-DHPdGk`R+FM@Mw<Txwj@I&1wxdC;>GT8uE&~gvv<C#BH89VsObFs}46m}PrAy8kk7k-u5UAfp4Q{C*$
-xeZiJ226P!Ci<+D^O#xWo=b}r*80eFmk>;CqEzkl5}(|%MqPk#8~?!_>SV8NlAANoGpQcjNBptxGQiz
-1*4*#!U467I)hR^A;Z9cPY6P4*dMS4HLoe^U-YcOXC$HDN&%c}Q5Mt$2t~y?hJB$vv4V!|`U}k^Fjw0
-kCEV$<E@hgAf>xVYYifkUKU__;`g6VMqJoziOb3Nih!Hh<aM)u<E*iv}!+62Fhoi^v;q5E_7`+b?j0l
-<3l+skGlBV#4_Da*ZV-q<Xz+*}{)c?>u7Fj7MSVA6Sd_z0I8R2nsR=NV0$*wCJqPbi<9j5848#$yv?>
-|jv8i4x2)YZEudDi?Txvmx$$BPdqOE^j$HBZ8zw3blL51~utl^`PDErgBBX>%{P0ODh~kONwHL>?iHz
-iA;XJ;jI9ie`e2?mdOKgA@t3ZgdZl30$iYX+{VFY-$nRbtd*yVj{6i7|<aq{qWP@es%~YE};<+yPY_4
-JO$?H_!QW|qZ&hc3Kl{z%UgX@z}IBkNX9BbDteRU_m%|xCV3V_kWUvU$BWD5C3x6_+MF5-O=tM1>^Ie
-EWa?T6w_USan4x(PZs-epu*OCntX&(zjw<hAjzd^F|0nw7vAc{3SXEUk3soqERkph>G6Gdg6%#q@Ba$
-&~azkY(S4V5uh5r!-zN_WM<?-34^yBHdd$;HFx$CU{+k5Zro%i<2d;71C=b@=XpPVi(ep_CoXUN@^<v
-YS)#wxW#VT^#M9{xGyA>e5xJ04eylix9bxusVaOci-=Z5m7?59xVBW4yNPKAfGMD1AU?sIIN}j0dhP7
-pSm}s^5vru7f)MygUUkRXc_b<{Q$R?M;t*5xI!Z2@Myr>V-ZzUtBCdX`#a)O0Y=bRERK|TsT{izh(I?
-|8<V~nCdp{<XC(@Lj_!Qz8iH6!%lof;tkQvB9HL9cf_Ul#wn~rV{DI1Cl|1G>i0cfT{#a4PL&rqqdcc
-6*4`9y3AO;C{t+fUmK*51pnQ^9om0E#_YC`qbTvx2j8wx^Vqawlt#vI{3A#taKv+q2j!$*X8|t4J+B7
-cY{4?+BFv$EAE6rYH3mR5X2*%n8Vy|bg<<M(#$#zthJ18CRDA{JW6zW-kY;)}7pzr)j$!e7($$Cxhwq
-?G>mJ}d>5_XG_Gzl^>#O}6~>!#8L0E|*%kpVwbXj$)Sg_A)2uPfIa(mArf%W9~czm|<5r#ew8`cBlgi
-$pMu2}lLQdK;o1QE8^8tQ91TurjxW?`y(ZiPdmo&o>;g7RnT<R=J|JS&hhiPTt~TcUFqR5L?At*W3_y
-_l|e;K=Eo$M%>PmswY*}HFP)-#D~PJWBi(dXKAn7q1PEbdIB2_IP(;;#We|%FRZLX#imE{z12ks1Gr-
-YG+c=S<L2X9X&dbq_m<FVm-LnEo;K^~@Ey_+*x%Ywg6OIZ%q}xxVq~?2JI%LZhEM8#!h!}fDd_;H-gU
-s=0i<P?RMM`_y=7{a=iV~?!z{n@mTL?B-dn!umc3Qr_-JDWg?0)w50%KQQDPfAOMdS(ZVk=BF5N&N46
-Nl@<C<O(z~rF}t_CQ3!-Sq{1F`7v(IC$xXHevTKcIxh@lg|yr9UuL!}xMU_KGOr68qJf4m-E8=HBz#e
-s)0~j-Z3YAfZ}Gb?qO1gr}tIDbafN<ol~&WHu_HG+_?}Ue|UU=0vyCm_qg8fLb^U37tkfR-L^$A=^m1
-jXIhFL1NOA?gNI#0CV)42aPhEHu#p&_Sl;t5Ok<kPd;3+Ix8vh4_L<x1bWW|LexYoVPXN8&Y^1zaf8(
-Z-rLn`z1AdE2+-4?E)IxZ*T0ekjV+%KzP)IxAKtE$tZ8UngoiZq6?22>%VHw_xz`xXVS}3s;uBK{wkH
-@6GXzuXX5;<{5OyXrMCJ}Mw_qOBexevMtw!;N)W=2Ry=X5v6B7qD(awzeHF_$!8E5L<ZKZ1bm|%Us9$
-MdkL7{-#``T;itYoXTe@C+VKFq2r#7fB&i>hX-4W11iCf&Q!5lFWiW<!Tw0@F<&j-bW;!XT94Q(1RUI
-cJaE<VfKv)URcY!3q}=Gh3<XEv;;fQTwleFhr58n)V7>o^R#~1}Yg{Z!6j+ct>75FkdCKMkCYVu&=<k
-naCs#r|!X_r-T03Er@Pa@)$D@P7r)VJ120;q5YW@HWd4qxHFR44EyQP^cj-VsdwxT9r);2Y&J$EK8Rz
-dLo+3h17~MaP%h{}i?g>k7@Lvdj0E!k2)rG@Iq+s_9NrAq9B{od4&CcAobLGWBhx|$#UI~|a~hv)?Gy
-0<#-w<G0IS(gYX{LABF>0A?9xz=-Bj0n9(i^)Zz}!XH@$)n|MZmHWGRfYV=b$0pA)raW+jHQ6Ebxn=z
-mqi?^c6AN;$`m0Km$AT{2S6bo~_*#RlOZ@IgPPim|S?*bAjLRhrg`CKbzP>OVxDU)Fxc(&dl;jmZcUz
-4R-^pv&?M_-DRZ81_nO_p`;w*9luqm{WD4;~Z;Vhk6hMO9Kooxt1#FGvkG3j!pD6V{kufqP`T`imtv<
-dp8g=Y(Yh`8?4P`*Ey?0bjm*WMNI;*1jfV1&zAf~O@i^m6a&BK`1uJ^8)4jO5V*A8tP6^tuvMw-eVOW
-jKLgN!pM#@xK{|QMIc}e;8%G+>aw<gPnyGs>ux`!)=N!#MZfQ7>0t;ln|2RN9X`2F%(k%ohdp@>TKYD
-H!j}eY0{{v7<0|XQR000O8Q5kVet`VQ}cLo3e=MVq@B>(^baA|NaUv_0~WN&gWaA9L>VP|P>XD@PPad
-l~OWo>0{baO6nd6idLbK5o$e&?@1>4%UbhU0e9nT%4`VPq!NL{~{UM;(^~i;#_!A{YSj(Io%93xK3Ri
-OHmXut@Cgw<mU&M`(FN1zOXBAo$I<xIhJ6ky4NxZOfc+ByR|kgl`05YyA>ccm+Qb!xo@7gbT__=Lr20
-9tQ}Qxn_Hjo;5rnN(s@2lkq5?rE#sW)MuPAX|TZpPAVp-Wc&f}){LVS+f)US1m#3xT8PkDbGAWQw%*D
-uCs~H*rea(od?i@1l_WFo0m|tuRfYwq;<S_?P_Cph)Tt$eg!Aj>jT6T}SF{SVTT<qXht)%c!MpOh(c(
-D>{)}WQvC?B+;xZ2q<Mf)AxLA^V`I7MfEkK&Y_bXCq&HfK)_=|8h=TpWZv~L*))VUVMMSv1=P3{9UVw
-)>kk{<w@P)Hr*6bm##=m?eU6Fw9Z^gi6MTOz_OFA93qNGmX+WZ_sp*AWUgnEwM=Z}_HB@;Xkk_}wB2&
-{WfEMp2O!T~mv9Lay=ZA#KhB)c2SY={U}+z(SyLd5a60C*;$Xa<U<%^xoiNOJdF$_lG(kuIuXGsDz@@
-?2yiuAKifqYqnJx+6rZhxMABu@vK#WGqi{o=-1<?VGHIs(PZ&QG&`T76P*RmWI4oQMQH{FDHYD3PJWm
-}-lgyzXYwM6Mz7-~h)q2A!u3P3ttw80@O&rf5HGvL$s$VPnIU<5au&(&l1B6CG%}Q+OG)GDcr>5PYq@
-7#YE&EXynE~{&S#_Ld9)mBIqkXoI163h8K1?o<@n`TC3<!S#5O`-khd#Z&qDAaKn<4-0K#<%do9SoDt
-xc2%Llt=(KH6J9l>);ydhv${BD^<9g^dmCu2C#x5eX+F8)TBgGavSLK%a=c`^Z_2N4(`U<7atk!F)|s
--j{5JNB3;4-BbRnJSPr-Gla)dKQ`rK$CRP4_$#{0VX(a;v|ItWl(reo*cKfwih7GxH`z7yaFiG5cprr
-p>KXsFXLCUc@mGJH1=DdN&G4ry>Ef`ZrKmRwRrQH3iqCwf1|FtmU|k_-djnvL3-n8G5CSLbUl9`87)(
-Ny-uLEVX)*MF^m&=@)8$<KsYmw?=sb4Afj0VnJ(fHn9^p$^XiMW)2gk7#OQM$f?yN;J*-d=sk?Zjhlf
-|-%~g((2oUsRIYcsS&4Big9zC*xSlhBU6}%2U_|Y~=*LVJx>WiN*L7UZmdz4vJ&j)3ub%Q30u&+pGWM
-7-<>z=p(j~gXWP%r|A_6bZBFsg-5<3*fA%egYG?MO8djt;m6_AuE+GMb%btxzYt*2Oan`hs@_)Q#`q(
-@o_pOX5Gz$4NYe_5r*fwDY>%9NcMjoxMHuUG?k^0lEun?F#^LsCKYhBHFoU4?K4Dk*wry*e%RpwufBk
-XktUTrZC$(L(ph|`3Un4W|bQ55|S&ns~a`qRX2sVb{K0k@YO7IrgMcT!BmjGnT%KoTCZ?kJUoWAZ9_T
-}*jk#b8LJ+S&~kn@AEFU1(Vbc}1&r$(0(&7xf^FbI8!ccDEMfmE0r!ro!>;$IHJJGuuR#{wusf79g$n
-=W4VI_qOuv={P#_9g8NLQo_*I)|rh<^cF4{rU3$Qi=!gNOpy-lgZTeJ9{qPGAJ`zPBPn0h-p?Q^h%*g
-)w1HS4g_w~McSJvDL3$r^TCT2h&1o*>0Ku-(l}EbD^MM)HSYr;!4;ng+Wf3-tzP8miZW)k+h+uI{a_%
-4f2tLDfRvdUnvz-SOd47S!7%QEME6_<e9cAOFO^esJAT6%g*hsr}ls{DOo9TMhMpxJgeh)xOZMtI&ly
-%qL1zKej}=)@QI5bUo9S<r$oVRI~er&4X9V_#GL*D&afE+sTFkK9lPFTBjwEV5qN#MZbp%rXOXGQX>r
-yP`;U&HW8{L>K5U4z0lz@e%D^^$^wS&@LS9?R+4VaO~+8Zk4PP{x`kjdp+b6o6a1P_p`(jSzYEf~BQ-
-s&j{^<Z68D76^{YLoUutFbn^vYxw(c4fQ+?H}i0UQ@P#0|-T{?F8SgszFkOXI|3g#hv2Yf#MdfC=BY%
-`%+Zae`WL?rht5Z||pw^7h~`W+o$zSm{$L+UGa%g*Nr3~lXfB>I3%B)^CC>=4Tc*>Ie|M|=t6zyw4i_
-;yw}se01Vi2Y_4w{9Q)?>m)sL_ptvP)h>@6aWAK2mnzTaZG$ggN%<D004Py001KZ003}la4%nWWo~3|
-axZXUV{2h&X>MmPb8uy2X=Z6<a&s<ldF?%Ga~n63-}NiT)K;04={ecAU(RRBaT4#As&Y;$P9=3ED_U>
-}k+T}ka0f$CjOG0H>ux-zfx%Fe;#_vKVU;a$252-I{X#d;I!wM><SMz$3z@*r*;*7yk!P}0a+a*inXH
-p$A(KYdOO;fY^yT$RWborF-E5qEFKd-o<-uX{JUt#KqMT8)&)<D%+oZ`mDe2)?r(e8z`|gbyu%u^oRW
-%wmU{K3drShh#w*c?5s*|i*t_s=6WF{Mt7b-ottgB^madEkB*0sF2Nb=>Xs+&YiRaLATd7;0LlUaV9B
-VyxZRp(^`9m=dhL=Rk#%>GL6s;W@-K@L;)9@O$ckDOj0N}{pjss^CXFPiO2s&TT(o5jTvP|XUVl<9G;
-DP(&Xf{l}}<XmK1_jM&|1*05L*W|Rk7DYaLw~|?Ynag_ky(rf5O<h;@=*2+-pTS^2KVJi6-8fOUb+Qq
-#tQ9QbI9V$gAyJEJUCdw}m$;}^^39uXl0X0XICY@xz@G~x+fn@q4S{Cq>(9UVA9yfMs_EZl){Foh0`e
-KYgk@-Iku}g|QO)T2OkToz!Q+dIp_0X=L7z_nKi^7N&{7dkKx1TuS}IvK0$0s(h(iq+^-3BXQsQF=%F
-J~tJs{W8vTzF{ZxEx@Luil5EQDI@Hye>)+vFM-j~IH#B<_oa{D;8-mI9_#--*f;I9iIbr3!FvvRO#%o
-B(bmNFvGmrV3DWz%;4=td@!V2k47?V_nMM7He$27v`(FT7eeWI^1FSS^_Fcs(qF|KoNRBwcQhe6Wc6c
-VuX_@ifRKYce*A1Xc^f~Cx$CSCsncmjn#|kSTkS`!tZ4B>tnlvC$b9UGcPTwpnI2NK84BKs_eu4ONqu
-QF9FM33-=rZy(A!L(hO|C7Bv}}9C-RrOu=r!a4nv-m=<zxT)z`nNX*jpM16#aDzcgyI4QtoqAK_aR;D
-V8t!cAa<k`Xj!-cqGa^7O)IBYOoqwz0JOEi{f{aeNFnE|WfFHj-`m}iwtk`Esbm{{j!-Z;TV6efegPR
-cArlPv%YDd3A*&gBiTv8c1f5WA0DLs(bjNNV49$4@PCCA*e#a2lG!7s=xf#~&XLQqaHvM-MPMXgQZ~z
-^8!F&>Mq>P3LvBUJVC!`h!u5c7HV-jr$uLvma~AhCWQ*0YKSRXr7rc7ENTCTs54k!4%jVm<eykmI@VV
-*Lp$Y&g6p?{BZoJ{@4-`M`W)@URPMPE=n*boE&n3*H{*?j!aS*eQMIC$>1d{;PAsUK;XmkkE0WZg$GB
-EctLD^aRI-TVhQHPUnE!!J$L^x;MrNA9j=ST3()%TtR>1(%Ss-MxW{0C;LBl8#~nr<NDLlssTxsca!7
-B-o<BPB#igmY{sa6_Hz$UcbQ+q!qVk5AFBG>fNHeRqRdb5Y`w~pHoVixAFajOH-NPZkJ`Ob`C70xho}
-B*5X}ZG&`GclAY5J&-rgPai<6ud<>T)_X6HQ}V4D?<Kws9auzFui9%~`cNA90b$Dp_ap!l+m4-{^1tN
-(L0UwmYq1u=6s%i~{P|ecMED&20ZsI4Seoxn+Ud=#iyMl9sw>$LD=8_+)p2c-9MIhxh7%=@^Y)=4i(3
-61Cw1X+1zEmgw>HAn3eBYSTiwuNQgP`i{se97FV*V2eC$y(evzQ_ft0T|?+T`}lJXttIyW-Xh}{`A<^
-2tuVB(Jc%O*+)AziA*Nt&kF6KtS~73~-G#cz)(!1A|Ms`R^YnOt9w76PPA1O>%*VoUt-=ZfjL|tlw~b
-`mZM9xuhyyoh9(h8~lmXL}9UD-yiiFm{@qmCkTw;?9e$f1qEU&Y5-Y{TAHP17>5rE-b+y%EUoQXYc53
-@^i#W<9lakB@qU7~99FQQPA6Xtc+fDa80`>dj^h}Leo0vuqKW}Iw<U}uxUU~!MW^#emb^dz^VgH!u$G
-}Pii51ktO1>2f!E{hq+#l#T7KBtgVAnj-8Esd@=xN#V;27?zqt8@g*I*i&${H|Whj~>lIA1%Rz0)Ywh
-26k1~xc4avS_9HG$_5+V&I{KV#uDWgHen1LZNA8jAL~idlax)cZuzR+$pw;+=3;iy+K;GQ`Rl+~(pPg
-nuyJy9bhR0E9fZT=6im&!?&EqLnFaaTND~ABRZgk~HAw^<TL#oQ5{2(E5LMB3CD*#80D9Lzhz#WhfC9
-_TBd}=ch^i#W@f|p$KrrdJe0Dn8&yaHvAlccdM98PtHelXVtX8s|bq#+zvo|^UdRm+{v-(tr@mm#%iW
->B!EF+Ng-Y!&~6hTJLoys|EvCDavUP#>dgjy*@vFUH(doUWEx79{RAYj$6rIoFj7A^_@ZE3N`zFO0b&
-A8koft+bc99z)?st`GdWSTYUJ2vGMAby)A>y<C1WD7PqFytI~cp=4%pg5WBRrolbB@BgK!d3Ta83_Cx
-ts^8gK^ASqTLT;my0|b4MMH4k>FvmC9!wg(`sSro?<d2_<o40z_T}XE1pdE08MUnXULART3|=Q5+Gjt
-G|NFffogZO10;E|wh8D@7Aj}7?$hJuyJINSl;X3J!6PaxA4*tGYn02YvxZsw3HbyZpp6Uf>c1yS<n+0
-&BT8Ru58%X#vf0|WARnp6)sIM?+qP>W5FFcWCMWsmOz~uuoN>ewJQWkAlVk-)v^+G};p~)i9>Mw<Xl{
-b%(hL(Ypgn@9yT8?a2%C7E+GXXF_EmL$P@<MV}_z@O%kUZhM@&q2k(?1Qy*ysB<-+un}yEn-#emVW?+
-poWU^Tq3TZ$`05UW>zI0tR_N@$o@RxWOZO45D+<dG(TB6%w|W=%RHSoKS;#Ezwr=w0Y^l@Op=x&C8FU
-bVum9*uC38uhkIaNOq9jdqRVx-s;la4UVu$L#e{tln$D9_dKi#Ml_<HL>M%(L%H>O*l>^TIb6U44;%F
-5JqPXb)x*X;dFW&xIL(L8@`3Z)Ip6_}Rs;R=+P$=+4==4qeC876>82Jdg>M|P_+%w#d!W}9M6Y#R482
-WP@bI#qC<m;W!O+>{U&|W*Jh=@FGJKyfCDCh$hp%Fu{dc%?nPKL$*(R;xCeNJ=9vCXAGO<Dz3T>%&+`
-u`C0E4|LHop;>J-lEHut|<vb+@h7075NjXNBuj6kXr*P#+*6KMa=?%%yhSF*#_C7+CKP%qcc;{$k7r2
-Hy{Cxqz8w$x;e*c(n_hn;gHJKAl&|RR&ugF=xJJ3v3F01{mRDjh-G74_vk_<uZM0b!Rnv^>Ts>hETr7
-1e_+2PTxnCq62_CUG{SZ78@KaLhT3R427Q0IPT)~?sUk<B1dDRQ?ryVgkH3dKp?onu+SD|f3E(9=5|j
-`9F`!Pq-p!u5!hh{%Ux>+yQne|V?^g?=}?<>FK3whw3`76n_S}N0tl}t#~*>z;$R#sTxjSjOWNzBH1s
-VpNa@H27A!bTRJoXt{(7+2ieJBq4Eo~i`00P0KY28I#RrwEisg3gM>mB&?^FHj=!jaIy+;gs_$V=3`Q
-AP>&eMzc>3J7hf+=pNx7lr--HKwhfG@HUw*V0TUFUMs-4x#ik*3n6)+kD?_<SnW?3@sEd}=6mizL_B4
-6)xWpnY49%p;9UcMgC|gwOsLRHD&hYm7q#j4pszuW`dq9N)V+g55$j*U4VsbV?TMuoH&-0LU!?TZ${G
-A6F|p03{;YHzuRzxtSjz<j=I_x<kVD4l2HXaweYsWZ6)Ia!*DG?yyI`@pBt}`aXSsL`u*RPi@Oa+@Jw
-U@8pYz=`4L_FQ+pX)_@pq2V}cRkO&Q(Ae!a#ys`1Z2s9gnQgV*zvbbLP*;gt_k0FU*^_yvyC*JIm;SV
-+(1KUb8{}^C_1rkX_TK+xsPWbtM(nArLcMJCp>At@Jy$0t_r?gu`OOA%N_##p3DMgckKQ`!j#wDlEZ<
-tl7^~5vEo<R4l%>?yDr#%(hbs<WSFr9?4SelUFWquQZMq)|F3aw63QNezs-FhzG<jj$z(CC0vrUSQH#
-(Nl}`|-ROa)37A2IIuY5~y`e=3u)wxLH*`wjL&|olO65TK-TTpH6xFlf^B6rXXW$P<aUPUnZt$uqD`{
-p5{$0>a8E|{H!lX(~TLm#MmPwbC`V5IwLOkViGdA>&dT00sap9EYrMnXYx-b<gHF7xIGs<7oRH~hWL5
-%JbjMe7!c5EC-`_gf&Y)p&YmA>;Bf58B$JaU{p%>&FuB}>V$Mno2rBu!!9*$0<XWnf+(W%>))qh}r34
-FtJI~4_=YdJr8J}Bh;FM?2elY60-P%()0{a!{Y3j^>$pbE9YSHR_j{UsEoGWPzq&AaI<<h#wS~SR3*4
-jOFDO1J4VN#;nxO7CsnbnpOL~M`_(!W=E>7TPKauuAs#E-i)lQv+oHVaSkz3yT;or&b;1^NU{a+9h?)
-Q!UZ&v1aV9E|Qv@|us|7YH*Ljp7L(CopOS4u}qXc3b*dbaeLO>9cdD^B5Ih&t}Z2KwPy@H2Um^EXiNS
-jJ%Grg|vNw#622xPTLJ5hdEH+jD}tLMJjcs5bHnb^w(I}gLU^%EBnUSNeD=ktYf54=g@hja#lFXS?A0
-3#3K;UB?S_ibp<*F(cr`6R7($?Jg6>1U|b}O_-L0gx^MH6EH?hk>6Nb5(<0AC0S@nwmGq4zJROOd%_+
-LBjY)F@QjMfssg}u_uGtB?3I^cvCV)4?s5mAan~jtuc-Fyg(}WqgWJl*?PO?W>9vJ%hIR!SqmCNc{U&
-{kKlNU%d*naoUkkiP<i1(Oq0MDQP11226+haLHDl|1;+0m#oWjtIa%ic-ry#_71SOQzga*lBu<@g{(v
-9bp#D5D%41C#8&hCQ-_jI7OD04ll$!I7{o0ob>*7l5wTedpo4zd@t9Cfi7n5S7oQ(m|=8B!F-ep<UG!
-?4OQ?I#LAiG-0}oIS$unC1zee%4^VyT=$#{IxQvi)HoB<n~X+Y@<Ws{+4#PjacjYzhAT6xq(0nZVj`X
-{amS-Nrdvb9Op9>$lVWQq3RT6&*oWOsI*oKDb?R>7_g8SCISTX7?%4M|OvVH9(E5OyPFQlg6G`yh7n@
-I&rjBsXJ+SzMdFx+>$bAyo5rOj#E8BeT*kz^g#Gtjqo2tGded76|`gWl`>E~YU7E?fEA+sxls-)Z{TA
-)*LhWhw$M?<?TREjcBjxlmx?3gi`BFftFOf)p#@aeRX(piOyNZx>PP1YqkLU>OPNYFWr7Mu%!U-vt1{
-GB^UX`)UzS#mOrrXIt<X7Zkyp-aym)|4ex&Hy>@!tG701+!r}cM+{)msw)Z#<}fU&<3n3^=(8Sr=d*e
-Y4Y+v(`V+aB!lN}|0VD`1t0%d@0HA<O8e@VUX42BCB4`^LCTe%_x44oTx05T3JtAnjZiUiM)lwJUgqg
-6=&3zGIj<V>Kq^{JJd;h?aI>TCVRN*|3|N=zUE?E||53~B{*s%0wP(-|`4LD9u5${V4w?QEJ@~uTKxU
-HvDoW_&pFjy!s@YQuF&MF4_fbO(lvYS5twQqD&~b`G#r4p0{ceXMg4eq=QTzJ0Q$=q|lX36~ZW2CT_9
-Z+x<jCtSu21N(zRgZSLWvu8o%!K%GS;~d?|=^74rynu(O`E(ekZCssxI!My%{Xpqux(@d-~bMq4#%B!
-yR^tcj)RN(V8w_V=w#g0oN7n{>(*F<c$d@c=rZm;|i{L7g$hzGFY(fDQCcYc%s8UDRkEr_NapFxkRbQ
-`l_m~@VEh9PO`zlHgc^)yMA<FOUJrMH>%vb<>wM1?nXu1JnT9{E5HcFRi?wVowx-(W@n$<JEojI?P<I
-+Im0O9m~tayN}-G?Ei=|Bjq`Bpj&XOhq0|-ujh!(9z|<@zHP-j^^agnoh8e7FuXQ|YDlaKkE^5`eEyE
-Fpp%GuAoi)F^0*?4;sbPMjXj(UpQY-04_RRw2P1nOVGS14VXecdROkRXnWa&)Hzo5L!pJlAtN<4eWG~
-2Is@%P|D2f1RY!g}!I&}2P_!&fhCB6nn-{b}G%EBj$RUuD-)t&2uqKE&^+2yD*9uD0$sNcl?Jq9h)Iw
-k(Oh2+OD*D@j5Fr{Hnn#W7Y7L=8u~LRqGtxp3BwWL8DLwln7evqD~ii&f|IMPufHPc%`?bNz*gF?P2x
-50k%29oP*+u9bI>Pz5k8ij)G1WqjJ?&JFM(9j6+O#spzxNWidqC^$V~8@%O{QG3q-o}6Jgw0(7Ud_H<
-{-istXqAu*E?PCx*EtTD!z%tEjUV{yvQ;Rk;_N>i9oeho$=gAQ;*3Ix3Y1SDjd75-lHhHWr-uD~I2Wm
-zN#&<(;?raALmN8q1yc{02fO&E*-j<EW1`7}DzmrY8LQzjKB5h&sDoJG19iZaL`<#Lwc9lqhj%qo}XZ
-baTyV)M5q+7=(o2su^^NgIn0Jky_%+-ElrvL+Fj{k6Wu08JUZ$XW70Me^$At8OT8+92=KO1#69*oFwv
-2D+}|M87Jo9||%Z#;N6`}B2cIzFD)sy%>&dryy0&OG5AO0ZFs;}&{HEW+!KEVHapK!*YZ**&HiF~YK$
-?NM+=15H8RhV7jW2VwNUnkx)yczct>=9^)Z1}*wDOYc|$(dDwPe!`oEQg7vzxHhMJ-EC^N`p)IT<<~u
-tY8rT?h7^s=46d#^s85rjcZDu4tfRiP9aJP>!0;|Xr_fX<&-A-5IOQoD!sNp<UU{mmBZWBcUomQIPE;
-sNGtM*^F4FC)du4C#RYFR6J%Q6cS-~S)+sLC%P}yilIU?Tee#MAd?GOw;>Nbf<4VR`{Ud2eU#qVPxDn
-Nk(Yx?cABV_3KV$ucTlWr#;??B@oD0H`}cVIAyq5TO4>o~$x)2}Ud+dV-v_(EU7&?nKP#|$Q4jXN8nl
-Mauv$p4@V4l5eenCnjcmtCFE#tE5leZm55d&^cAYR?76JE5cY(IfoI;@c@zrGf%&p2hft725vIi2A6X
-sNl}`+7CJw(qlf*NAK;J+sZ+H&-(}T?3F((k7A0r#zT9_vYHuhwT<fWh?Y>w9#nyy_uL+TXAJa-!+NK
-tb`>7DcQs5}-_Moa;VsbMXW$}|k2Yq&f=Fe{0-);LT~7_^s;oAym=r59<A?X2_PTI3FVU`E5BHT`tov
-)^uMMhcQxQn#zjQ4nR)d#^HanRbUR}uRyu@UK2F&7AMi0=aq|`g{Yk)9R+&zrDRKN3@c06x`+W}i*ti
-Pa~OPO}~f@vx}@}6}QO))tglf0{X+~b<+qGuGL=2GqzhI?#kR+*Lz9Eydjs}4gpdA2S@ZEBh&m{;<m|
-F{RjOG<b$J4lsqJxr&;uavon?Um+j%Q;2L)csl|0)L1c9@J!+Q;OFX^6~|Kx=o6zy3!4JSfV4b^v52G
-tv()))uzqdbUA8DOqWRNRz?{(T@Hv9v<pMr`gEL^M9f{)CzuyU%}aL^AN%SXOH(!Sg-$%P)Y>zB0OVP
-+aoO4_FOiLUpu&3IKL6+smEk{`7#L!jC5vi9ECNVuY<WWfVcSfh&G_Wl96AXl$15g@vHwny!Tpl!KcL
-D7!@tE+2P<9Lp$gYa+kHxh1-He5t9XY-FSEpBr-Hc2O!-CcJd&?<mJu2bM|xDY2xzgFt7dDj1GXlhLv
-pGaA&QOIDqqpN(o@X(gLj_Kk^QsWKcr!mKVakUMSPv=Yt7ymLd;@>F@lE`O#DOdaXRm>_n2cCI#t1;T
-dMA2ZJsXj7+m5$w8YU>{dIW<421%IhV3*{X68r`U04uB^7`$UiC9+U+)Er&*LKg_^)DkHl?`(SJl2gp
-x;f|!X=*qw&TIG=GI-I$AmGV7b?h5)T-mYX9wOU2QO0@Ieziu5M-J&w2NBVb+7x^9%o0BlR7>+mIiN!
-+xEtTLCOZ*@96B<|T$V6NRw|(zV9?zu1bucMEY9xYrFH>rA~9b4Q)3^TpFzu$fE}hoSr%WN({MseMxx
-6Izswi2pH4|q?wy5=`zuOzz#xEFsf@q)%TFY8M}ACnoMg<KMr`)HN>oq^byw9k`$031mpswkBB`V1UH
-p9arLA*n*p?3ZM8JunmSVQme1tnZ<Y<0R!xZU>R{D%heV;0*{Z)z?ATl9_@8gZ|(_8=azFcC5^80&D*
-@-DluCg+YC#!(uD-CAM=AA1Rt^nxToW0<E!#n{eN4y58z09=RjN!*tAPXTJ#8j{y^x*#hP)h>@6aWAK
-2mnzTaZJVPCl3(;005-{0015U003}la4%nWWo~3|axZXUV{2h&X>MmPb#!TLb1rasZBR=~#4r%P=U04
-mFJ0`0Me!nd@UaJBk%bj6A|cyM-C&xON$Ts@o2GgY3`2&Qd@r)V!_h``))8_yqjqq%B_GLP^oAJeNJz
-weMCi(JHRv|C?F?)1NE~hOVu4e+ZlJv>u<QNpFGgZdRF>Pjo6Y@x^JD1CjzdVZc22-FglJRX&#c!4Mj
-QIUQ6d;h+PWx3$DxN(-IzuurC|FZaDqO>;KoF1o*NkZW~X2c2DUzBf^X9lRQxcQgb=FLK6u+|XTL}>z
-0e0P^OKy6bIO{lr<Ib=C)F~e4R!cK@VcjZx|SCL`7GuS&6V^kd6clb%?{`5Gg%N!Ik(3@zA}!7x>{8Y
-ilB7iow#0#Z%|7E1QY-O00;n48F5Sw@5Z5F4FCWnEdT%@0001RX>c!Jc4cm4Z*nhiVPk7yXK8L{FLq^
-eb7^mGE^v9}T5WUNHWL1>UxCs$6S0<AIqluGo;YdJ`Z}J;xSlwZez1KiMM5%bieN#?FRA<A@7V=F5v1
-hEZN8l*6HCNmv2R#ByWoy^f0b2YmgQ35Z@P?gk!Oi4Dw&F9kxDJ<D=BKJ7nM*m{_(nu6a0B=$VTFW)K
-#X6!H#$yjYlFbQYL$I_M@YT#F>=*@a^#rM<-`TcEN(5X{Bnz8xm+)sw%6Mz6ZaV(jrldGMBX!sjTBHu
-cE<BtA&_MX3Ki1<zynVMX7Wx;%TMwWi2P>_eiAKO-6!^M5(i)#)KlNNzj3vk*GYE{HSt|GH6;Wl{XKx
-9GC^8Nmc7*LTgrT$>U;{6<K{h7z`$pIL{%>p*SB1e1bC8l?+BAu;!t!Z{<8r?pqIzi<>yl($<p?NAJ#
-#e?FO<zJCAy=-o*$xFqJ50Nh(LM@77lX}yGbhGxx4!-#*M2QX%GMQpXqWo+b0<qiEQHUEOOYx<k3B+i
-4&(ICWnshkOxe|TdUh6iSWAmG2JG{(N0XE(ACmP)`vSuy7b&=Qs^gv>ytMJx`IJg%yPU#*0{3N`%=dN
-4cHCh%<J$l&}^7AY~uGTCg++F8ZCV!;*_r$?van{UR=Ft3p_Z}%+nbgK2eQIbAZdMia^1s<1oi7d(YZ
-P)dtdTOi~3<j)bXZG+zoG;~()=GCQ{ThlH(ngcp82eRWZ;r&W!ZT4_sbx+UpV4krPW6>~Zqdmbgn(Pp
-7#7Ph8F_p%xr(c+$z)i`d=~aJqCp;tCfD*lY|qPUJ8L8q`MW>a%%i;=YdK`1k;vo4G>t`tSqGvLFNE^
-B%Fn{}u)|jV{yEqlcG=E9i?lC$Y(I->Uv{__pGDX&I>I{Y7UPjv$ofj9tp%`q3nYA`=Ax?OB5Am{!?Q
-)-66!?N$8;JjWKqj>(3RONwTe+IgNs+Y3;dngS+r#%%IuAmZhB&wRc@NZjNIqvi4_r+2f@T-pGmSP@n
-Go9_nZSx8#kdht33(l=H^+!3t#C!#(#z{g9yj#BCdxtbx7j#<j~6UeW_K6!|=XYq+Ct`4Yn7o&tVE%J
-DR`4hYza_3{F%bH_gkc364E`7H*jTpE$1`Wq<>7D-HwaaH|Y&4+sY&q9x)%%ZQ$2?)28d@FLw658^!D
-`*=xTE}{pq7vgjVDR9A?pU;l?eC{%a1M@iHT`^h2C3yc~F$m810}&+lyuZohZS#ANz5%|(`5ps=q!}T
-AfbZV}Mf_>Oz=Y92vmk!e)v&Uv6H22egy$a9IjYJ$tD9-`;c17xSsjI<xvYmoI^qf8pqopWjgtbIIfw
-#3e<Z4?vtlW|nM8eluzyK%2jl(cUw`w@fBpO0?>bX=K$o(P#d0BamI#yPvI_CpCcMuiPGMpieFVJChu
-^O9fJ8(btf3CR48$(aF_P^Fz-1sz;F}nTHZQN@ucpAgUnRg)SsDWdBf*NPggjEP_Xcfl{3LKr^AnDr!
-gj<j5=XjD6P1D~kQzZng5i7n0!b5?{dEsSK?>ln{2mi;Fv-lZ?B-fRJSrDrMqBcCswDtN#*wKpZebH4
-XEQ>tHxf+BWo>GLc5WJ3cDGj<!~wvmm<Ia937FA|kwR*$kj+V1@X1z3f|%YTg8&jUhIhOGn5@M>-&Lw
-IILWAg2<@FGSm+9s&Voy$I=%+l<Wiu#o+CsnwbY5MB5!N7R;Q{%5g@btvieyi;#8G2<57cQQA%CMbHc
-TGHr27dH`4G1qgvv!zr)sTMTcl}bu0BS^iNw3Nf-`<w}9hA1YOvTaV-}LE=5*oOeI#S63WlL36?7$n~
-OQ0A${P%Tv|=2BH(Z5d)RNZL%+1Cr$4XJKPpu@Y;AT=(psY!B)ff-T2;m`5_KsYpfky}s@t#3%;WO7X
-k+_XBimZJ%)_{(3T0>#RNIH9K;vI_lB<m<<VIFJRJ%V)#DLV;MF?t2YXC=Aa79YHh=PTE$O2;}7eS`x
-8WGI`A&M{qD>yB~UZlABS{wcD1@Cl_X^Cw$=oFfCAi1LB<`w@LzFHXo--oYGU$Dq8&&PY;UG9cogs;~
-5uJP0=I~We9FKjqj2H<%SSzcd;>o~aZtK^*ax5o?7`SOwFd%QruXZd+<J>Q#LM3=9;XO{mYe>sdFrVq
-)3P98WJKTtA$z|ey|PQ!3(W`(ocYPj{4sQ@ju*9j_tUaZpzmfdp<C&j*7*q8O8JEa%x>$GXh3j5HX2b
-khPhfkkgJnx%?KH(+<0hv6>=b&F}pG|H8J#@nV+j*79H+wa7o9JSfh#9lKBy8t`->_|-U=K7KYR5oac
-Sa4`Rs3U>3y!6^yjue<>7#@HUQ`S?x_f^YV;K5}?He(1133Xi@#FZXlb_!m{qUL~sL^iwQfWtgpbiG1
-7s^=fsI-~4qMU`34VkITBu><39*Pq_lTA&)szsHIb#m3Ov@8<jDV^Fe&agzM;o>@PPM8Dn3`NnirY3U
-yTWNkroYhK8du(fJkSZV;BeToK&S7p+w@P#!x}hf`XUapEV94@EbFG%;(01>_kd#|Dz_3z`N4~ly-Ve
->OLp-yP4}y%)gU7}-1w)I>0h`0n=Z3^}Xc0#)Yv8-4eCus%k2Pn{pu=n}RnevDN`Or9*F@k9^=TPQj)
-XN~qctPXKOrBIz+V!NbIm8E;}r7=2{=_WGSH7k1do?#@wPqeMfXp#VDJItM-2-Dz!|hpB>{0$1XW6-l
-A3n{+;%u@rQu2E?SRN&o<|65Og=_}sCjf4ZhLGTCVgy}t<*EoR!x?tv{xQ!^|Zi$%RNUPnnFfcV_53Q
-js5KBfztqzebETEhJl~&-fe(iKF=tKep6Y&D&Cn?b4RIWtzZ2GPS;?vo@Q`2)nAm|skif(dRs{XejO<
-gFk6U0U~5Y`m>9O+U}_pY-@o*w_)(%LRwWs_hgo{U5U|-+7SL`M1%o|F-nOAf&-p!B3{u%nnqIOCcH6
-RT8B4rk2hE1PZm^4ncIEZdrl#Aq?tt74Mq)oaA7B2J4(I>NzJ8MZ*S2z9bHm;z9<ChGHWa);^7zDS?+
-tvCjx+Z+I&+(L@l>h2zo!UG^s~<2>ME~Uh$e-8hqePj%+C?ELZ;0v4@_sCw-Nd;lA5GdW^ep8cM7K58
-KnMNmH?xV$=q?flD1c|oS|FHxOrjvFGvk2T2zw7)SjdM6VQI-!FHC75=cLJ*fB)^z?Ze4P|vfEB;dVO
-r?P#LObhOViG(DiP0`FXgy3hsxPIASgCQ!lkm6S9v~t$SF{>buRFyKP{u3jAzGkw7sA^i=_!S2QF-Vq
-5+=5+<1P^X24Y-Tbu)~mAYBKUnYAxH$9Fb=}r_!MaxJA+FS~VI6anKCN+@DBYjg9lB>*qnU^X6uueZg
-?KiIGko;iS!533~H%ep8{BWn6?)p<|=m1vy2bold2u8STV8Vsp9RFupadb@Ng|Y^g_LiW1Kb5kEI<__
-lb#iG_KC1^<>6r7iMnvv=CP8d2RBb$lm=GMYzXKN|1thy4(Jg2Hqq)W-djN|uD>m9G3=fDX<tqRHN6&
-`ld&)nLw7|3!rN@ipQ%cCUEk*)@zZO``p%zLh!M2GDCi5U^^h`C$M8%CYdPAws3;G0klLUymNF!mSrv
-+=n~bcJH?DfTFBQvpI6REse=WtA?!m`1e&C>}C%MV~Tb)V9aJK9oxcnMGNiP5xaUsb>T>~Es1!e7`c`
-90*MMO7Z7&+Q9D66DwvbgCf!|_E`w#)X@Q%@cp8Z_1vbw>jiQa$Anqp3<Qa>G1Blttqe9(Ueh?*Hv0D
-~(mRo80FrZ|J00%(<SV%-88}-z7<`=nSRa;(sM3{9U|1?gnO-vA3qL9}Ty0A;_*0hal2+PjqXUnS5lk
-UREX_Oaj{YfRNi6v*k!)~D1_0u6K?Z;2^mRCfk;M;&cG_@}~+#LY+AW4q<m3p&+13{fKeHAugyJuz&F
-lqYw0rpdJ9hgJF>K5m7rQz}g5zs9eQUsxjvAdhW@7TWIL(It6sWRDTdXH_n%0E;*S(w-4vI$+`O`15f
-GcC8)fo_j+V!>}uaSF4{B5}+qlP?0XYfWS-6J|x@ICoGts_A7e?N#6vyqrrTHJ{WrE^_Nwx??hOP+Bn
-ELR*714>s08C10`cH81EHfoy?Z@rI)2oeyS)_SLSKIl@2j6gw((FIZLlmf_6h{T-_?Z%!<3?-6rf?yg
-9yR|YqW)Uva;w)OtHWogltaaya=)3zlxubZ|i&~?kR>YG-#p70l^hh3H1Ip3#VE0m#qqBVH?^2BZo_!
-se=6?@B>O-kv<J+X~nY@6oR*#`lgNXHR#dUV>njc3UA#A`xo%>|`pUU_<T2e+P|%eyR5a~+pgSwa`&-
-prG=b1bJG_1P6h;dFOb?n#)dV%{FRH4uoC&Mdo=ZIN9wU*5&E!+Ty@bI1=f;D&(D_tv{&86zKiz7HGc
-;%Wbo=Z-h8&~4}WH?WT%--G`FP)h>@6aWAK2mnzTaZJfAKqgIX002Id0RSZc003}la4%nWWo~3|axZX
-eXJ2w<b8mHWV`XzMUtei%X>?y-E^v9xz3X}#$FV5-pHDF%mp1?j99<l*WGS0Y6iIfpV@ukSY$uE628O
-_poDjsoGXN<#%a3-x^GN3vPF=gJdwM|1cJ{aMB^H6{sjlv>uCA`@K{l)B)$;sFwppJY{(f(Ne}C^yF}
-p0z%d9Eedeh9x?CG1Adxwe7-riH+sA{t!Th!;(tXO1c)uIH*%XLvL%XxNFtuLx2JYO;BaaK3J^<KL<o
-mWjcTi4AtTVIq-S)b)u_Wq*O7Xn<e^1})mxBkavaaFc^>pHtAu1kbaHSp&80{+uLyS9XXi?tw<O{Wj0
-({XlhS+DP9Hy7~Wx@_<*KnT&HH{~6`vuXjC=XD0nvrSuOb(>R*dR0P$s$RAk^n6t;tJP)!z#Lk8gjRN
-1!u$dzZ3_rgOK6K-!8r20z1|_hY|hKJI>*_AH*V_Yl96B5&6P}WyKUFymA>DO_ww@moS%%dVmZ$?OMC
-_p`~w)u%XKy@U@;c0z@?R0R96+vP_d<s_VORA6~9BUsPoyTUDsFHn-_1gPai&p=_=-B1H*?o%-YRrRX
-1xI+;n<gt|#+iT?|Ll>E2bjzNqIp5!c>X0}v*Yv(0+bl#@wTUD0dBX<IKg>vF>1_x9v>7^MDLyT7Vh|
-5{g9rT*Qxzt-DT=^Dd0a2V#RbRj?76wMM=$hB|Rg?o0kSprqo3-@q!dA?a!3x^WXK;5{<Kmcd3Li&AH
-FBU+mNF=^V)vg!SseUi7ifREA)wHDp1IrrVye>biZ<=D|#=kBbMvG=skkYBdx#vFt;@-O1KH1CQBTw<
-sUio2GuGZO0`sqc})D5>e$lh#Wt(MuR`C~x-3JASAtrpdKYeB$2S<x~i!Jt~@lk0Lh$NeJHSbgX`%i+
-iTs=fxAl2)5$0dp~i?XwyqwGqk(K%grm4<shoaj*eSx440_7D(~5{s7Cxuxk&9D8UUjdU|yU3}y@zf?
-IM78)H!|FR9^oZ(qKDF?sjRn>VlDzR!-b_syo<F+EGzGYw3?lKVJYHT7w6y4V6x*bLd1PhTYAegXTf+
->5aW`dQ*s*6jrU)W^(VbhcZ<y#>NqcbAj@fjP{tiWxB35?E-_`kyE6XBj~;o0Tw=#d_UTr?BC0c7bG(
-gUd|PIOgS|*doJ{2`pz9z~S1fHaEQo@bk$8XLmB`oxa3NFf*^}W!X<g#cBn^Z+o9J_d|l12+>a_!-1t
-a*CGct-@;ZLjPB63g(IdqtKf}0HE+rvHgJSpmCN<rUbrfnO9l?C?kpRAI?f)Bvj2(vPVt;n%d;AO!e^
-h3cnYuDbC|Lr{f(dfcfxjI3H{!Ec!>M=qQJuk2yEWet5rGAvoDD0W&*#>_C1`NY5}JTu%Zml-<+R}=)
-cM!bNpin7>sa>&db@N0AOu>Rc7Z4*aQnX2?*3_2`$d(^v6RH&es}VYJs1$XInmO;VcA1@;#Y5B?UZ_p
-u0(1t{rvkL0>?$aPa*0w-3K#e1>l~OWgGGRVE0}82tAeJZ*0-VDuzVka)6$|F)Zw&$2?N0c8=l+H}ez
-<6CU;)TWaV!QqhyUFWV3MQQS`TyIvyjK5`gUsu4NhV|(`fbk1bFcWa(!FpT(LA2%KOn%2t1MfFW<R@h
-_?12WmA79EH3|IjVcd-_zAXedE4RD~Ws;!oAq%CLVke-e+=wVTsMg|Ld#25nMQG3^{1O}FT>5ixqnv7
-t8efh7!{^-|6zf7WE{_rnB|LE67pYZIWfBvtT{m*}G^v~0?fBvr_{m*}G?9-&b{MStWZ+`8`U-nFXxd
-ut-%8lW&+;;hzLF^bBoLB%T#&#JZa$jKj%k_lL1UQWF7m$XB&0zTb{C@Ud*>Q3B;|c!peg0qB;b?%8U
-H<Khw|{>9?#0Mp0OI%zVf-@~{9x6TgD2TwHW+t)zpl!g<g-Kk70$C_aTq^pX300^<u(5PC-eJHIn3Ff
-`%1GwlK(`He7dj>+h~#TaK|TjRkPERlTg@cjvs1%q;oLDuVeag)M*N|hNm9Ap&bGL8RUa5SY9AFcb6b
-0CjjBg$4?%eAf|(dj~;*e+t2>}cfbFS9!Lk!eomuXZm!Cvn(>{ZsoHv(d|_Lai#c_Y{|L8*#qjst;dH
-4ze0y+jkliO3dqJy%tX#Hy=>Q?7SgbCJ2dCw_cmTKMc{RtIJ<2<$CE#0TL<)N;==5X|u5!JYhYQ_VGu
-BibWydGIE1xEnd{N)PCLSedK-MD%E&@$amKnm}6AgLzAil!Y3`t!FS-|ZEgr`MW;4Q2;PrfL<fV`k%P
-j`Tyn+sG7@mNu-Kz|({0=*!?-IM**|Gt~4d{wW8-L($}vTi_}MJevbvVkiX-5^T1cmQ8(D!78yXO8R$
-W)j+Nj33Hp2g<w9<!5lkf!o2byEy|EN^M7;tPV01e2G9vD|H5R3qmewEGn~oLg_t#zyJ4o!zwf6#H1j
-rRTb8h?Pjq?u>0XVtIP9=s;b&NAjv#?k0`JvusknjTOcHWUjdFVk1+F98-uHsz)sq#T?0pB!5n*EmN!
-m3XE_@#3r#)W%t(g@E2t+{4Da{(!#sPr%&zJd^;|9L!k`BQ2AAD}ClqnnESDwTh6}j8W?ul75irk<a3
-b{D1P7xky5zjf^rUVxR%9*!-pkI^ZFRbfC7q_UaEN2ZS0JQSgi81Ux8{9Ey3`_ub-FqC(`BY()zo<LK
-<(iSF8B-*_}Q|A3*dfuM1>cq@EMF}cDX38%f-<n|HROr<xC0owr==bkGPFz;O++1kv{qblFn5=m*>(8
->WC6>zam<^4f;-|lO_5Nz=jwg&krZ$S{gY04Sr;UcW2<58G$HLx?R6qUKfjMF3ooU42OP=+J*@#H~}$
-04@IM&1l@^T==t#w9-|g@oZY*3c_X;XEq^%5H!D03hwy|R7?ApCUd`4yvRn}QT4*@V1mb9<9ijlqFT#
-bEd!Vn36?F)Ix=#0$>Mj8mork7Z6hzyhAvSt;e0hQpjt7$#m7;j=U!M%m;b(@XVlcLKShXH2`d0_P6B
-laP#e%wSrE7yPU~n>ocM%nU(2ot_jdKYLvJk-14t@a1c(on638kK>F-$t#DNe_k9YKAX&w!;gf<Anew
-c<uWm#n@>cN#8S(7C+U*L`Agi6F7ZB?z@J#SBNjEQ+hsd6C^Kn)CLFs)DdLd_gp@C9odRy6epE@9)2r
-qZ7{~eLQHhtKvg-wYhSt?S)f@<#I8BlL&R`K*#W36xR)OF}^IeC|1`f5g_xus+I&(0P$GQvagF-_WE7
-+H_?gJ8{m7V%IVpva}W6cJ=o-M_OU*0rAOT9Ho_*${=8X}u`0VM;Y`QF5|vxCi*knAvQSx%XB)u3T-G
-;;BEfRnt`2G}*WPR3Gz3WZ(DDYS<O1YMIH1rnRi8N{6TKq53GN=VYE84j3cLc(Z8+8vU5&Aut4+IRyH
-kMKY|}J&`kU8qUSGeHHF+tb4IJb1YE3O>@J>q`uvl*Sw(FKTR`0>?tVFnTP2hM!nP?o!Oj&!O%S4MZh
-m|O1v${bGDIDp6f)QaMO8^Qv-Bb%pg{-NChgZd{R-XQjy3DVN_3UDZZMhjp&sVrycmqQMCm|D+zz$cC
-Gxz63b5kw%J!1)u5rfWvy8LkXNellQWS?Y1xW?uGs4F=4_z|5*!_o1R$0wt4c9owu^=38vbmT=(Id#4
-*7Ms#&@AY#)xaz`2mzcJ-+yarp4L$*CnoRI^v&RtrT(lr{JBz2<Bw*-B@?@BRDSH4^(QLC7V86x(Gn7
-twXAFeq;OajB!kwV7vs&Xf+Okc3UCqlzzgwVk9Uq|aazY(Ur~_@wKV228@CVez>#L-<Ft4`yKnFBo`X
-c1aPi1ix{DhJnnoK&cqlpj%$)Iuh0e)<QpU5%<FUzF9SYB66y+j*Cv7lReQ}Y#dpl3T-q+u`9yctD1e
-l6znNdf!dnvB|nL%GB`WDsySn+Fp~xFEBJz0wr4fhK6T!k_V+S#DPTqM%S{HOjLB?iQ07+{H?d{+p({
-0zn)NI}0+T5FRZ4mrPazGeqp>J08J19>81a?CW9)tjZz&JXm~e=1evC^#!iu8>Rp^le7cKYD*vx@`3=
-+e!$mcS3j$lXTSytlI`eKz5b%!Ea!^EH%nxB%NICR)T^5_fv8=7r`BkCEiibPsR9uKnZ7bE-a1TlXbF
-WgpwcO0F*LAGjrCVGh~YvOXG|XMi+ku-&Yh&V#O?@nKNDn<@PT@kB@+m0sDQ*~LNW}DIw*BA*0tFRu)
-SEgov?`ve<|UI4N49AlTL(jgNTOBx}1sgD?u=Pd{;k~LZ=GFE*xBN;f-=$!fkFJHxXX!)=GX~emQym^
-4)s`_UD(cp1%FN`}*$nH*cT4a9^MO<;AnVzW(OD`{DVEZ(n@%`i*?op7-Afr`pfR8g>R-6HcXY3y3#I
-Q=TK9^wWbyU0-fi=qe(pz5Kdd7wB>E#_+zEx+Uz7U%;GcV_lCoFdzOm80h(V@bzl7-dY$X{$SWFLwU7
-XENm-)V!uA;eQ$sI&uaB10>Z-t28#@*6dou)IrcTVfEigtPuU%1f|m@>v_1eA@~^2Fqr6?+Bn&N-xc;
-aMd2kAiZ;ECf$yW7pp=S^rJXb|U`{(I(Q7sDC4bMXsxp(3&q!AYxIxgeI)~BZ}@rCS^ZvHje;ZZpR)V
-QVNlHbot1kjQl65r&D3kanNb-Lav;8&2p36sgh+3Mk1g0Im_If~gMhi=5-h7tOaz4a-26u}8M-yV`OW
-U&C@$*FJzM(b4;$dJl*?Hh@(_s)r6AXcv{+OBi|nui^1THGH2RDxwVy)oS49~1PjS@2zR|DQB?JlcLj
-Nz8Wvz%zabaOs&!?*iseume_QBi=E%3J7J_3g8qUKRoGs9pK;k_9J6M;d{u=CD)PW$f1k%@ZLT0asv_
-27;|ubCnzxhPZn#A4s~*Btvb5g_<4C|8?g|(JS5gIRvZc|)gxfObD)aQ!Fk60Zi+=ja(S{_F;|$b)3z
-<>%>9lN2TScH5y*aM0E|cR-1Xu#ych10{)W-_c)!H^OUw>4<O!%ig_}u3nljj@YqI{aqED_zB4+zjo!
-|G@%ihhhV=Kh-@1Nbz25>3$yFq8}r@;<V)<(CI^kdH?Q$kcf>v?MUh?Py@hRj#0GkiZe*5N)nUk?2K9
-_)Y+X<wNpk?9zo(3zj6MWO$v{n0Pk?K^n|_i|^Bu>;1$DQus_8!a4Ca<2`L+KLq_1V}s?#JJ!I$+yrD
-+UVD3WfL6A?qg88@|)O7=l#SMoH+BkY?p(z>hrUGl4i5BvOpKBeN|$dSJ&l|{FB*f$jM9-5cNPVMLQH
-LVc-0H^7YgI_4+NcDenVz{N&S<Jrz6Q(WiSx?u74;_l)2P-yiJ-k|+G~aL<aK@WbIFQKF>;r=j_qd>b
-vYTdQB=ce82SX3E~sm!*4~6*W@>dCJQb{6sn{G=9JrG(+>sz%&-l-*`H`s^^<UiQYK;=43i$Ne}m80u
-?evIrR>5$gz527uh|Ab}wVC<=AL0$XRSU?a0s5DUF3#t>6-H^~CZXn?a&BI!4lHH1*MtLBDQ5fa$0-0
-kIBRf)qQ#&jmA_L~}qWilJwT>1k}`rS8r#+JYQK^8iWH7ny$Svk~$z1Qh731V<)z{?Z<s*G@#qNUEs6
-mfJ`XWgIMRUmppcmxi@?=nyNgfLVD81J;Flxj;ovcasTRk5+5+pXo08SU`^iqSKOF9ULn_j*d@cvW4I
-B&wi*XKpi>tCA#_|h@qQW{J?D(4tu<`5IKBZ%-+=2s$HFVP)FHd5bF<NKcfQi!8^K7KlrLTZHi|5;91
-?2@5<)7f}5#46EPvDcLo6%=tSI?b5>XlsZrWF;i711*3~7RE_22F4T0@(Q=qmisxH?wC;V>i-jp7bZ$
-qbpH>6}=%OD1*9}a-_oAT{Sm=}&?kSE?s%8RKce!c3j+s+^#j6$-a#&qNd)KWCFi=ntohvt}n4&I>m$
-D3#9X|!6+@SLSzCb0Y%Ytmlm6Y@P$DCls{;0*hT)!4TgQ$*iHhG6;iP#kGzfh^VXeEjWif6Jb+u79y*
-Xu|VbU|Z<5KArBgzhKl3-pMMqK%hyxW&h&~pn5)LzN(g+4|E);hC1ZX0TXiJ4v+KSAq)Hb=+peMdrA%
-?z(4TzTAkbI3K!;q&HB9E9f)vDNjQ5<+Rma7*%E+k`%D5fRC3>fhk>V$SOV-u>R1gtMTgdbpplRYG=i
-<Y!6OD3&u>q1^)1`a_Q%=&WIyS=vabe-dH%`#@RN2QZ4yA4x)*@jN8`-?@CbhBY{BGK_z05)&L9v98d
-y+dXHyp%tl-9qgu=6#u`W@}LgEs?SVXYa7fro6zsMw#OVrts(k^7KX}d_*JQVpm>g1u@<LLXG{y7}x_
-eL<+jPcI5xk>PL1mu7=Wu)lZvlN&#aS78%sep%a7|y*0!84L)1?qz4rIS}wWSdXDZ4MSEBVi35D+vGi
-k9(rpVKHspY)V|*vI=d06*3b%w~=Q^XAVcQcLL;Mk$cYcinvLr>LcrF%vZ#9XIXvN0)HvnkiVceoQw&
-PAd{XKj)LD@yQ3rb-14TfXt(4Z6pLaMqa^xDXUiqdi*}zvtt9{xpYAY2x)oB?`4x`@qIe4o9Yx@pMtq
-%wZ+u&{u78YgmI6KAt9mjhS;nivo=0MjM#5Z+zhVT(ctt(T|2@y1!gh|{E6yl1g$_2dGUA?(z@U?s`l
-RuGl+et=Yg6oeJ!e*OlqGg(XU^=)LOT3@R|=VXW{vF9Hx(1^qfuApA$<LN`=7MAuwY(k_v$zcet4XK1
-?bI<0Qo!G3_%B<Ll2K0=AZ5(b${P0Mp-Do?}hT){j?xv_dvK%801>frCgQ?un;#yUW(NDByo8jO2J`=
-TQ8Vg75}KcQ-k13CnDbI0;(2@cGHT!_|Z(K=O%pd)9#C(j*^;}4*DWdIer7Yf$?WwADms{h01$?7X>3
-w(h6uH`<#A{N#rgVC0G`6+nAkt6Jp57)FtD*rnt1dZbz)ja4rBtl(r@aW1R6XWa;o{&{s8DcS2p?)V(
-xiQ`?4oMzX1aFcomh=$EbBF3}t647IedxcS*ce8jj7lFtz|JszmRWpE;I2fkQg3w#Csv?^XdEWGpOX1
-oT)F~C8A{vbZlHHKFWRwyVq2<8T0Cxv?KY9E}pPB4M2L1Bj+t45&MI^uk3^#cMKW2kV>tw>8^UE}9`E
-47v!GF>xvy%5uy3;`CXS^_wDD0N_2wVzds6cro{?*U)7=Iy_rtOTXn;R7T{2C;xZV)i`?LE{gy7_oDT
-ph7!uoP`7}D>G#xwJtODSvI9tSZhU8J|$^{a5py=T^+$BO$&JkD~pdIBj-Y6(LN$AO7~7#1}MWzj4R{
-qWVf>o9Nydzn%oWD5ETO0#S;B`?l8NEgZC7%^e&j*=lLguRr35;GzphzPFW4wvF`i0(u<;<T*=d+!Cm
-lwUYC3#h~zV9!<{QhI;{3kfc-HrFC&&ax_RGu-FSDQ9O$_~5+pl}Bmn=N9L9HmCcPDga==aQbWtoX=`
-Y}W#D55^JB_|7i#gr<&|Iw1AvYJ*n%x8N@I*W@SlWb(EJ$I3?=Un0Cb>iorc*?Nh_q?|7mvv7qCjIl9
-B(L8)K}GdjZXM>4&3<3mn$*;mu+HcU_PB=%OA6BxTr2M>4s|F7}jVy9i{sc_p(H9U&&;;jyQ#h(1%ab
-VtQ0yo$h+iDD}n&yMFPZoKZRgH(Gv6J4bilMODuI`x&}A0}U6=)<$G^wBy6h?lA^LcXp9ZUyg-VJrd!
-HAE#$&J2c$!=Nn$J2in-ZH0e&YJ5cEg8{~5Vx+2aJygl_Y)l}e5*`xNfjI0&n0LKg{jVgO1ejK8xVMP
-xYLiUg-!1BR=Ew&i&|54bAc2fA8hSrG6mJCb3GRDY=72<FQhA~G@uwZ>VWWk}|=dLaSrs0|8&tV#|Pw
-K92m3xGFnLdtt$R_rlona;gvibY0I%FS2pVd&HZ&86n8dKa$Ly}6{>Z)244V@R^5GNCKHF9ChcotV>Y
-vmQ``5Ej0;80=-BWDacCG-fQ-sJUcD0;yo#bachSjY~oO@pXU_hdW4&>0^L;~t*Ulf;9W*nb3~z1C@0
-qJ9c*ZXOTCH4O7&xeJz28isGPpTS%t!y)}wT^?vLIsKELZq_AU6=**m&K7Mr$?oqr4W{7Y1A!acnNRx
-$-QXZ*3#-BI=)5HX72bn<`l*R}$hMP7tW{2G_VIH-Daz<V1qa7D+yTigfUXfl6BwLeeRNXy<(t-C-(3
-iD8N5gW1k7XqsBT*Isu<d_bXDY`i%;?j4-=TnD&b@W&chM(_@1w$*|qXrn9w09p!kBDCWk-cyReTtyR
-Wb_McRWLu3nU-sdWUMCYOVZ2%7^>>&;qq`K|ggT0UalI^AYuY0(rhcs`KdTNX5Q)OdVi9n5~fpSy0^L
-pK4zg%umq;<okT8V{BqV6KcG{LrZC$YB%-uj1Qe+o2KIr*h@BDzEvRNcE~}$*o-Zff~TV;RhT+pN1U?
-!`bqM8mS^rvJQ__f_caSQIu1?+LBHK1+or8`or;)6P_#StB*F36n&ST=|_H!PjOb5r(;|nc0HXcY&0v
-N69C^Pw%yaGGT8;D({Att4|Pn6F*y7v8oA}LFl-#zPZiRvZh#P0HFqoqD0l2^$La{XC58cm#H>%*lpb
-Oq4p6bUDd2EnyEJzj4z5JMB~-1jv!-l^74+`BY4J1Ei0{*KR-mSQI@RTXLCuQrf=TLB^yLR;R&%BWua
-vEqv(gP9z($>^0@z+cP#qzU$um4O@C5JVqa+uIPTU+gi|_$mB)fm@$*p#MAzQmcbQ|8X^68^g6cW;q6
-rF*Go6KqJWEP{VlhM5w!<Z<2L@k_<l?Yo@c1q;9of+#i$5ID55#Z}NW_v*mK5MNMH}VW}4#Xi!Um#r<
-VdrEIL0Yyv9L;`49H;m{pTnzf453%KjD}6Q(STZ{YE&K6xO?f_Rar_nr|S9RLj}`=xxh@?)rchrW{z>
-D?~0>F=#%@XKha5Y;GCq0jI)1EEhb~2=ja4y-a#6@d7hlJW&N>prV1=CLAEk=whv1wqFRk91z;1QSW%
-RBMilW#KgwwVFU4{enhfxiBCdgIvQTUxb!O~;&3mY^USWZvRY|rJ%_sD06mf~W0PCd!Z7bbV<kVEXtE
-2B}bjO4R5{<2h<YUf_fV_5L;nMxdsc}i*F(%6J+z~cwL?p>9b%PUxfh%b5X&qJ$%xR6fEa`-NDH%6BM
-F=gRj-dz@Ug_VUDkV)1mIdN;_FXuLl_V9lwmqum@#sk2UbMS%Wv(bWoiafzzWs0-igFcVwQ&9PTy@N=
-{P-A~pQLqOHj1K68KY#*QU)nesPMbqCbi2Rg`d0Fq^Mo5U5cRuwkiIp&pw48>(i}11?}y2DxI{xL||^
-0g+xy2qUz=0e8c|cj-#gN-)}g)s`1(p-Rg-bUzU=fhQcN=i^Cwi&EJ&9y@2E@mA-DhleU<GGq|kti3=
-j7Y>u>WOu`p560R6YDP6)mAXJKm;uVUFd<i+>Wv8jj;1ynsF`q@bO>}mQh@2#SIPnFCVVQ7S&?%toZ{
-(q#YQZaGj*lo=912BV)Dh9>i1{W6LS?f)LWyUr3D1sLXzB>`A`VGPZO0_xu3FD3lOmiY=8#=GDLUIMo
-kTE3>A_tag(g7M#K;7sSC(G6TTdUafx&#J<N{0XC$Ma5vNM=&0y-<vR(@tl&QRET(1sH8kVW^Kg8U&O
-@qLt=yNQzz>3HZPZKlS7<XmtvjLQZ=>m(r&+8c*Pgp5ru0yycL<pOo=Q(ZD#z-b`DP>+Ptm~L5K!KJY
-aHZ~AM{mm(5Jt|S3m>KN@el#uZj6$M%W6PMDLOP~XiXTjBiD8ksc2c^ILjE0f)Nk8<<=a+ILZuqlLR5
-escSXS_k9WTn^cKGD;_EnjqDp7EWevPXJ5HA8OO($pDp)a*73!4EYtK-w-|*VWiA+W;Gv<cXbU7dmP_
-AR{esUX#$6XkY`+;x}5|QI%S>9MZifYPHLlYeQq}f3lx%SM8V)7dP9?cF-`9#BIVeh5*7^&G&N(|3Mb
-cg1>3uiFqM*)d{0e3XIO-wC5*3=RF?(H2gShy9yjhwjG)VMMrLt{yoH4E3%v7Kf$(~V6s6|$Zfl@(rD
-#K!{b5%@4o3O92ABF5SsaiKBSuE507U(a}7i5MF5AA4xSDBPk<$H5pnyrWuP*O$t3$T)1TiDW{Y6-yk
-(Dd}rbQ)pBi-3V!m+#hhnGHWh;b~?3gBRKg!ud80u3_JfO<f#EE5q}-?Z3#{CaR6$m@#ruI9_2`dO;-
-Yri4-SYl9OoYT784nQ~;6WOu*c$t#R%fymq^kf!S-lpwQeSt@!02i@X|sE0<c_6P&CEkVk#$)J)oalu
-*bn6>>F6c4DAK5}Z*(;t{x6@!5r$@vJ)6&&?63{fG9q(eaZfhmTGoP&K&<qKTOdbO{TAe;kO82PAMEe
-jakj(~@rArro;MTrOo~3_>k4#VR7Y6WG`k_1F#rt?Spo1aW`VXCZ;tihZ~d!_ebu{RabT)0StO1<4H@
-cZqN*vwd-jDtDI~AdlyiqRNkK4UJs*0p&OYObpJPr_)Yld^*XD`iu%F*Pr5sTwffL>qf+kf5?skfRx1
-ZVdrLw4cP+33zm}1U-HQ~+s<I9><>PNEre;jEIM}-)O`fJtfW>Gm|&p6FjTzl1|@nMB%rjyM*35wP5S
-zMkdbZ=cL$MTz;bD;&1w6JTnV@Q4v4!dka}>!IUPnyB*~i6VT3(8fg2UHl21v9yY8QYJI|H<AjG4<m}
-5oDbO;;0*PG&4KL=O<!JDN@-vw9m;qwnSGoGy1bv3^Q9G(Mbn}(cq6X`t6^xgu<(#A(lj+IhVA6h}<I
-ndYM5dE<b7z&-xVUE8|TyVq~KpK&)H>U7zEAFD+Jzqf<r*v-POp~vZmNS_jf!;Pj_3^9bG_c}rdYAWU
-Vexa2y{=a+=c3rhx!TX#Iy);mG*OtuHQl`~kI=*Chj21*Jx)3=+@|2ogZw1{_|aZ`3~XATV>mdyYpu-
-{p78jAwv*_jr~82_yNFLQFOCm<v+{h3aB9I}46=i$3$afkE7JZcNoO53P6Qm+Gw!duxON$$)+c0@!a>
-T-pY@n25OO4SAn-cNB!y#jM<=bm7GW|ngh<2cXCpUDVqLKer#Z7d#fQeJ$!f7VhaD}~H2yY$tv@Co<H
-_A_Y8q*M6dCcHl?%jF>7VW=9X0*bcWiEBFFq6)M9673pFHUv)egp3Qb3`>I||HqBkZh><)za9ylT49(
-xZqH@$?p;_ZQV^o3z5?2i5l$9e8mZ;vIvAhj2b`Wi%00po{t78Qq7-rKT?C10DD%)a=^%yxYxFZfjym
-b-+jqmXK}>GCWxW-k{C)xmWMnwr{Uz`YW0v7)hnD=$g3`VFyl8CE}WC9QC2U1P55>th01Iip9+<GhF8
-q6FVd4HXz;2x`qP~3p2t@h=LN8YyMz`Sq!YItY{-3e5*y366@3H!nWS71l(0wa2gKuFKD*LC(sB3ftg
-=#-Ywp%%egZw`GFc`MtE^VA5ai>Fbu{$a4JN!`;x=O>DHxF;?7l%<5h^ddh+TtJ6jZZhnbW4p~XzRBp
-2P3vXcJxyvCe0BxDI#%$4p_<Vu1QAtN>-Qxe^F9pn?H^>>N|0X5I<9)JPMI=B=j+2cb>CI2KFPJ=m{q
-M8}E5rrH~N4Q$nz!9~UjQ+xX*_Si4$e=nP=4uK|k_<N`ZD6F-F_3WWU8gjGZ_lpdlg`|1-Bhlr(5JmX
-kxI%Bj1l*4;>e&@Rz%$_6{pN?<p7DAWN5D#QRWe(*Y^`geKYEmqqsr;n{V0;5x);ACk<Pu*-=?8*6<{
-({i-@k>ndakoJ~x05`JYo3qGJ-<&^o(TbF8|oR(|4s?JRzp$K-~N*bkL_*}Lw&_;xl%K47;84$fPsXh
-hy-7iVl_WqGM)jevRD-*+Yec!ilc{X`b%<CJeMHl8!46YX_SF%#J-Zb9Zc4+{(wzM92RQhLpQgXqBsK
-kPiw>VWvumn%KCOkE}`{5j0AScl)_+c@eHSpxc?!>m?=%m}c<9zDj(8gp}Vm~<JyGW|=;7Zj2B#x?48
-ZPA5*XdrdtRQd$-g_PA5C_)LCXExt%<E)BBuL@({dYO`9A$3(VI4Ac(eB}l_rBj-Ly1t`dA&cNq++Oz
-tTiW#`t4kn<tjU`cU{6!;dPmq^xiIesnsoZB32wf;VGRg3t>U@E$xOPamMJygeL*%kg&!n`m5Hqn59<
-0*){di=wrS_W9^Yw!{Nl7&v+KaGCI+mH4{miEV_T(3$B1+K$NLQ6(Z`LibCrR`FzT)XMPtO4~NK*MR&
-NW+qOCdfpSUCU?XP%vdVj`%sm!&xUI(2L`IqA+^>mVDY=?=JX`Du%95HfH+5mU3O2m{#sJ`kOOCUf#T
-m()k@x%`h%sXwtLtJJPiE0rbHZ$~A#1a`zmhL42`_5Z_B~dz{ciOD5zLR&QHHr;+5_AZLv#=*TW4T9{
-6@P}DH4<;L2o8!B2<}poKem$wG~A%MPzEprZX=EBjLnGxyWV0!kfC77?a><MrY=dz22lXIjNyj2F(0o
-(QB!9qP$wAoqIqks=*)WK~vR-=?@({xFWR^=5BX4g&kXrjV(Fp#*0wzI>_EWY_XPfPRwDKmejrN$;r6
-mMZh&@#(}C{e(M5q*a9f`G|bi+q6aiMxtyF%Y#4}hwZQ(z8TUEPY`BxWw3iwMsdjZd-4-s+%8V{-<pQ
-pP(e@A&TCD7#U7=uaYMXb{0e@Yr682>A{9$Vy9|Yx9K@R&>oYI;ie61O%#|zsln<S~ez9lBQAF|>c)e
-LLKhtrydem)il_v>4el|yf`2<?Kxzqt=O9I(i=@zQ53$P{cW!6t1;djAt%6MVZ33Su)|{~#8zTq_3*|
-2g1t15fzPpF)|1{6}e|y3L$YemELowrJ7;jtmL=&X~utK~DP3xH8SqVCjST?NufYZhTi_hBLa5w##DG
-UepP5YfbU3)RL_4yP_Gn85KMby{4vGIqEB-6mH`cWym|y^t2%{y;B_f95Z56J-s~bM9ny_f~i4z>LXd
-aC!Cu<PaEMoMxhpYvKZA8`FXOQEUg&}TeH5%s+)AmrsDNqlaioVs9+VzNpyu1`6kF9h#w9=-<?L$iEg
-HR73xqzCz{)w6E%U0%O;8=p+%N)cwJ~T9vFa=`O21T{pQLesT7B0exAeB4L;339ZaVq?+dU4m#_u^ey
-}v<6)J{(nJK)4n>il>GkJi1(t`YmgP7PQ2075S-Z*f;RW3L&@hZCq?D<|Ss^k9s2Tm`*YCAI=D0wt{p
-i4FfNXX#bILsai&k2eJLM*!ByC&schdj6ecXA|qGJJ@toT1qS=8%OalhA>-6D}TD?8PUPbJ26ee=S+k
-%-;KBsDTf|dT=J`ni5buS5OV6%J5NR-SPo9ROKx0nv%1N!kRL!a4slEXtzbHsNiE~)i@H69%QxE3OM>
-GV2g=nM@M#<Mp2e89C|WgB7>2y<B${r_d+ac+q;Hux#q1bom1PJN$Vv=?|GR^Cy@*(q?I~OqT>M7i6J
-NM=<CtAg(OvVm-Y6;;lJ5gfR5Z9a}ip?Vd*$P(_Wt4Hh2(j0i5FsZ5vn^LyMkp@hcz2*>?#tLrtqsZG
-*l5e;<tC+D0++yCWL${e)Ld>ROsE9UoYg)A>BuDss544^i3Hu0v~Z5FIkL;EZ|o8}xg`v~uWxi8U7~C
-@ySmDv(oHz=jsGV6B3K<V}DvZL3wnx1eL6OAw2m!Uk|r^=_&G%t?eQioq}kVH{<roynENBCn;uV?Gz`
-b{D~E0kH?TTcBNsg^8j7^1DIHpq?)j$E<;kB>3a0s*00SjDsO!?x$tCNHH+#*?XU3b``Cq8<845cTVz
-dn6b0F8>M|U@_8XhiOie$bHC$^Z$er@=;#Q`Y!vId$uYk<OgLt`7{CxNW>>2LCELWYaL9w1cjJBJZf|
-32;E%l$60QfqIZWPofx3``$%F^vS#O|E?TIed+*Yi=6xfTGNoN&xQP~y(yNJ>SurOS->bgPLuyPJh%{
-81H<vw!x@f<y62P0=;kaiV%<nF6xE#FV5HFWlTFKh%u$wzb?6lwI0ut6~|1W^)4M|N0a(@prI8!d;IZ
-@9pOi%E_h@X^#N(Z_UPITVwe0%w4ZPmZqdajzb8s)e<!{T^uPRP;A^Qq&PUUh`$y+jTsd#6H`13MB4S
-n+W1~6H&y;L?(fgbgZLuu791dJ8hM8flGlFYfzod>l?BtKahz?a^m!ac`hK&J8>ktH~(w)fA5R0w?=@
-eT+*(q!eMN*#v!Cyh!FvmZJ?h@KtYNO$(kzJ#ZEY+2pI>FZ+!cbJ!3Y$8?)7pQz-zA9}DSOowvjRCCH
-!sO7p)93DSfDXUIbb3bIIC)b*t}Az&$F+$g8E7Ab!4EEf+Cc445T8nrGVr<jizGA61f10y~?wT^}wJZ
-Q#KH0K+VZM#8g;?Hv17D!LuM+Dy@N}FW`a&zP;AZ)hB|0oUyx6xznj3y)CsI&iQcXoFsemG7Po&_VoY
-%VHF(n7?hi$jTJn`;5-vv^@BsZH{(6y}#D@V!Z4@#Cak#>DgYMG}(P7^AMx?GCXe4=f$}t_+KssI@;a
-djWc(Ak#GfcM{w_E9j&H`R|hkiPg>*rWEG^jgsQ0U9MYJi}LO)gX1uc;u5!<^m?JIY{FN=C_Y6G%8Jd
-<>6()pT`Q@MQ?rg8+$VSOjuN=Mq4dj%q6(UVIbA0-ba3&S;;>5a@a<-~uCB_s2%gjfbuLGlR%9mrquK
-a)2~bsYRwGBFr)$Qc<hU-smq~%3r0Q+!&J#+UNF-5Wpa^o=|Ky=W2T_8O2nqwCNcBnJOp0*m;P4KDY@
-HC$zT`B6sGI7%S{925O+)}D;k+erdgT7+A&~_c#;?;F)NM6sAKkq3_Y_jB=aNzbN}ExcY*=zqDy0?oW
-=qJe2<B)`8Ah!GRgj@k3NFcwntPwr%_I;Z?vj`?${R^=|CrF91&OrN9ggxHX)$|KTmI}J^d!DqdegE`
-f%$U>6yX{jx&}4(BsEZ%EB0rP_4Wj^{$itGe(splX>L2m-uNRXKr+z&^5O4JOZzXH1Ht~6&H!e${iQR
-|9buet`_~vPV)~0ltC?PZ_HZfeJ<j2q*zMjK|CerXMfu~lxZ(438YLv_FDot@%EvYc(-`le@*a@#Rcn
-uMr0ZepbJpUgUd(~t&qSjOe{u5o(Xoj<^5?3{1rZ%V&><zIXFVC0pR-<V>#NlQ-o>b@n+D|dd5K|FLp
-!nfVZl&<E4m~ho}V)op?6;>gG90m2lB#wS~46az~Z8d!3}x{Kuhh!Nb>!sOxI6cJUkr9nByf5)PT8ib
-sQ?$h3qFe0{*6KE{au)R>%fTY4rwO&on(Oh00ToQj=<&gd>}y8I7Q`A`Fw9T@=f63A2w7J|#5Qs;GJM
-_xFE!{c3{MW1l^J_Lmodsl|f4E}DusD5g87TxKj_GiDXv?WB{i-Vsp3C|^*{e4}=T6-9wI5?+y*5|w*
-{*K(B^qextQ6p(X5X2dq39EcU`c;P)Cpi2!r4Ks~<aKfL^4g#ChrmR02j?yR4DLE=*cmt<X!OH_L4H+
-XWD3e^R4YaM8MnTG|xQLiDql_baGY;Klv5{~c&hvwG<u5=+=}vMFTKGdOyiIJalD3}ew!Sz`>vFcJIV
-~*gks)hUP(v%hD6waQZ~tSpLZH7f4khehNf`iufA8l2azCShNJ$1EQ!}=8)PndZBNls89?c9PvBLU?+
-5Tn;41S;SIX@q?RyNmV>WQ9_z9<gNWeegsOF3YCU1R5$YAt<|h=PR9PN%GbCEygNNtzULGOh4X3joRM
-V@XkoUoKg`JujDNU(jL*d~(#XRWWzla<j^?Qg*Y$d1|))IcI}{SQiZ)rVK%o$Ww`L3q9OPSVsO3_`qP
-C-6PC*r0JfVZqbcx!WpqAZeI*d&vAC^gd(PM8k^&dbp&upUrsj5wm2&%(If;ziC?r=vSWi(nB+|3QT=
-mCkd01{)hy1Cy$cyaBJIofQoN?66r~|NH4N9+FnmtTgcPWe|8y(HY(aj*ds1yTu+@S19>9{3D^a~F(a
-5=CXD4(V+bp#rAD$O$44lRre{IIEX`~b@4C1TQuZAo*#Rev!seZ&1q{SBX$a(f%Ays$amhLa~X!FUaR
-=dO7u-%S_*1OUK%$M20r@#A*aHYV3dAUYU#9qrf&@|^sJjw>k^}rWeMM5`)R%=W+O$Y1o;0A*No54w>
-$veP=Z{NYQ8uJOP%7!v+i}$(gW{eO676Z7laSAw&EN29YQzVyHD;r?Sk#c|?$`o{#pK4egP9Wx=tYbL
-5!8j)m%r=%MOlXkZPghvDleRjNE>mNU_DcBO&KtG+9~gVN&fiU5e)szQUox8W@aHezz6mGks>K4P!~I
-VvpR^qZWdwadqmlT6%>t)PL>4ByER;!ULCJY2@jGdLi2jln+dO*)YeR+A3#JtzwFD?feVC7iVWR0d-n
-?4JDgj}anC3*YQI0Cskmun?7Ou_lk0DIq7`+^t@AzkPD}m!-EphfD;vfmJc%$PEnF|Q8;<L3)I3^l+k
-|=1Z0An+9)pB?#)dIaJspNX&67;*HeO@oiKg8t#@z;Uh0i05Bxm{m4|H@*)=cfRg*MU!R=g5|3Gxq54
-$NuYAU;SOmfl9~`Mh2R6VpgS!D&0ntH*psn;j(4Vw^y&<a}UTfm#&R59BFW?%4uSX_F5e4XX++ala{L
-6<Pe|KSf+gx$Y2OYjJ>+HK`v(}v-y--fF$3eF}`Li*9)>RnHs5Ls*4V{wkHxb;-Nq>)rUdM7{4wqwcL
-eMH)0{Ez?zL8VL!v6G9aB5$Am`Ne`OEr&p!KX1bpUU{X6&s5a7kx1vDIb%BR<iqg!|5I(<ca_P&!G-6
-TA-Xih}#7Te9NKlj!(3AP-MV^;VjIjaKg5)1dVsisk}8sbj$=)p4L+|ltm4!x5Qo7mMhh`A#7w}f~%M
-VEr%cPQgqdciTed~eff%(14^B+nW%JH)T`#$-0@@DdHTL<c-Pve{t3V@DUOdbV+OwcYvc;ORL&>h61~
-^lauIt+@8sbU}kSWjxHy%6fM!`NoPpW7y?VH-{+)rB%gf^3-pc1T2J%2bACUx?lZ0k4xH<?*-BT@eiV
-a=~N_ncR;n|VP%A?dATU1WLhX(wd^;GER`9P%LISEDVhSV8f6&M(bt&^SC_Mv9YiHsE9lXX^YB%@E}!
-sl<f3S_7O`;38D)8Lovq64deH}9aR{@u=o}!2GKYop2f%K*65q^vVDyZzrzV8=M)N{`$~@{T&Ue$Th{
-05b9u0de>*O!$GLBF}h%X&oBa**TkgIoRjLg4alG90%-QUldmco^FOj(d6|1!6GG)#vN#f9~VF$Yob*
-4ABlDfx<~cEJQ6=F}B3GcH0TNStk!Jb|GajWPoRfzY8i!z{-@elxkk)IO=E1Lg(p=$3z@9#Dx3RN*(T
--+yjYaQ|FvFykui_Y7sCMX8C6y6z>`$2d&5!kGLa;sw>(211Y}RFXq+C5yslPl0>?hYG!H+<b8`gbRX
-@B2%g;AZLhOgClX-g-A&%#v~Du>Dv|*4v&{G=FOB=z4MtuFLDZMJw{wyFJ5%KPSjmWSDb8+rJH@$_a4
-4DKX3Q*0G&=Wq`%ma&+H&Zao|}8cC}hTuWgQ4h&~Z*2k<jhkQkVb<wY$<OP75zsD-6xpRvy{4Wc=%)^
-u)2C=OGZrnd>4Bgig6Fwl#>*>Gq)X3VF&9!oe&;g0zr_vK0Xn3S9PTobqn4G#_n$$4tZ9M00=;Q0SMJ
-^at&@W+RT|B;{EAB^#Zup}^zPkndg--s0MK2&w`<c9%}K!tPwBZh-}QT@oLPB+|yjc04M1L5^o!*{-o
-kmdD~#1!4;FP9)yRdadE<KO~ATwIXM@o<pgMCF5yugvaQRebEk(w<~R)z2Xv35&cV)!db4CIi;_YBeY
-EC?!{1@{x0H@AEqo*CEft1XF;~Xq~$|&&Im;mg%02<lL!hpR9xKC+nIN()#{k+0Kd;GrcQ6E3gLf1b7
-2cI2C|qa$uxha8z)}1JV&xOh*%rAswRGE!rpF;&Y7I#b<2hee>c?_SwVV2i%eY{6RalDU1kA<@$2LQ@
-&12-oL3dnl`}D?u~a_5Ys=nge}IStjwK(;V6uzDswEWysYEj1^LoWAIEv|Y^9J9(uit})4wj<dDoQX_
-FyWq)4IkpQd51YVNGIum8iRcOag`^L^~ywhG^qXkQK<)FAIOd?0^2MvuVX4XRz90wg~8dfLGSdV%H)`
-4@ZVkNrZR)b-Zk5YU6<E9-gP5gy(%NaoxdMH}SxSrj+?B5b(k(=2WeW+^606ji`?-#Fe9_Gu<&XT*pr
-zKBl~4fRj@`l;`J@n9}e!NlfK_<M(zuVvS|OV}~sFE{F!`MK|PTxSuEdY=WFB^e&_~xnXQM0a<}KR{|
-Vv90E2Nj7Fi|vd^99)=J4iWYC$Ev@n>(Z}xN>IPu)I)2hz@yj_>=%hy8<wZChr=N))>SDKF-Jc@RAo(
-9u@;MbOLhUx1M-uv18={}JDc68&&osB)|j<u0MiY9k=XObNyfRl7UH@5@UJstH<d<UNh6uqC%%UL~#!
-*jDfJN*4%L|66dL;mLPpOO<Zw@MFXf+tP8bN0x=+_cMssfgz(>9=?%GVm{aEFrkT*gijw6jGh{6GM*+
-*PVuGU-{Vs4g2j9;_XDZ3z^%f?s!*yx3H=isy0?w{Kp&?)BuQnz<;$52HAc4T5?B)o1GeuQtGEDN#1b
-(RjobpefN_F?MAltT!h(#B*~+!OY73DmsY=TzF*=g1pn=Y;=kGV`ra}kVc(hv7Vb?q$H)F;Jn=m%L_4
-c`#HxRE*fNgZV13sS*}6Mzb5zz1LlfML4HIY+A{R9RFpd!#<4voa4Z?Tvry&9`#AE5m3(1}E45>W7ET
-zyJ*D+^ry8u1><v7CTq?0oTKMOx%5)sGQ!*Q^r?P^i2hqRQP0Y+-eU{1MZJW(F-$IO-i);DQhlG8J<W
-5D6<^QvCIRFSisC)Bv2!d;0el;nJl?Nw96W@$>1iBP!Su1bIES$snG_WuqT#csL(9dJ6+;72sb^dB_U
-S@<Z)`2)`+hIcP`ONsiypv(HPy}?T*md-p?B%YDnZY~Ev#H0fSW;%$uw>g%$ajs2=p^^VrTLQTxxl;E
-Ix8Z0IEW@5ImEL1;p(Ih&IJmx<lvd~G`r|NY;cj^Pi?<~f8QhoGSfkrpy?14@>fFO@M|rw&c=N(&;>~
-KZYRa?f!_ZP(@F4QnKENaglnJ8D$dJbAoi~lYmZFvG6ob55&I^gYBQU;w80%%Zw(9X3#2R$x#4P`C$h
-ChUXals@VV+4!AYm_v5}=Cj<>E=_pjq!d^NxF7FXpjMg`KPE#ov%~Y$x^-Skz>*#QT0Zp8$rj*I6*3=
-Ay0p440QKqFrB=;5E662iue7!NH3!zdU^T>WkNd9j`Zay;kE_+=!FB+Fy7kI*qwMGT?hmm>r12pOE)+
-He)yvH{{--@YXnVON4>ZW_0{KLW=J{uR?AnqD++MY3K100^pYM`@0VV2SJ-fum5t*0Lxr=y($2yG^c~
-nT^Ka!WC^;^7`}*FD@HTToavEDeAMDkL=Lgfrt-_-Y++OQ3iq5*f<jg6u$Z=}PA69d2IiOO05Et*qxu
-4f;wyS-5T@WG227eHdqO3cwC{49%{b*?M7p`h)^KmE5p`GoEw$b_wFO*Q$P-Ib!AdQ8uZm-m#7c7)RB
-&!lT%FE~%rDXtle-JoFWqJ^;08i@=|;yK`V#8b?iOQ-j*u`NR4mH{2w@CEFf)F}{<B(rT`a3J9BV3_=
-a1D2iJlr{r<-b_S@hk+BuR-{4r%#zIQ#w?TZMHE+UlxW6pi}&K=*PVa7JABHr)p>H#KW^%>hHTBG6NG
-jm}0e#FxmUwb*BnM#<V=y-Og@cw4RtN_~@&qgJ^ZN%A;3b};1ML81h=Hawa)>T0_})4Y1jrcKS%@)?(
-W0wDs>#r?xP33v97$YZ194U>E&Z$8~$@Dmzq9>6VDhBQt#ryfy`qfjhnQJsd}Gfm?F@N8fZ_>EGL?<&
-jV@{r8dlz&Sr;vf&eRJBMXj$XemuWIzK4(Qf?iPO<adyV06#N3942mKlS@1jzTq<<ii8V+nT)CIV$af
-RXRmW3nsy)Jj|Z{(7cR93(g?3K-q5n{V>S$ljdakU{X*^_=I(#oR^+56tRR)lua7aAV~9*`WG;!C(Aj
-+EbmLIrY$1hN?Y5jjLF;#wAwxI<U2^5C2_Xy$vUU&h==H$AvTN7_2V>25Hgh+Mu$g!2xw39$)B8gQ-`
-cD-A%j)Gx2->x&CKl5?^?;)FHrj56rM2?c4{1WK>;w}PsE{<6zJf;wulCpfq;q{BUErS~YX5|JT#Eb7
-0%{l&a4--0^w>?COKI7|VGebMGjvYqUnL#q!uHcYaHI=Pg7P+74g)*9NvIy}AdoGpH3&R-u&h%~Io;d
-8F$r40vCL%cgcFV%f@mkj$*BB6Ea~@uNys-{xptTp32{fEIh67KM+-r3Ai=sjCPWMFYAMS#>o8*En*R
-SlpoC2nQJa2*LPmBfbtd02Bfp>BVF22P2hv@bum6U7xd4vIB=&7L`xZRuv7nlQ0;^t~_CQf}5hlm$ej
-zY@fizHS&Y2&aKI}>R_<9Ci1Dzm%BJ_MPy7f;(3#_g2Uq2hwWJt$^T$B4qnCoSca;XcN}y4Wn-ehnz{
-PbQxl_D_E_r83hL1dQHf1;yXc69h_*jky7|YRk>MK0Ir~8zrNvM58ox-yw5{>2^0;rLntByuOBs${#&
-Bkt?h~_!q5(>oZ=AKOtv>F1BuIWOwY~-g&s?b0-Bvd+*n>e#gekg!b@mYB!p-E*c|tEOp7%X#-+UoM#
-$|BX;xk<YfxoEb7^1<ajwoA1h$2qAQ{}Fj9Rx2ug3xsN(Qj*Er8{5*B^WF=A()ozPF#U)s(f2*j+m;r
-6`$+|EP(B_O+5tyJ7iJ;x72)Zj~JWq0c;&j~vjRN8iT8z6`7&Y(=ul$H}Xye2K2L^MonYvl;^G(5`m3
-AsB_W3#l|tNF!Md;ex$z^#8v|D7ABY3f5nO9#jQct0CHB$LeHBTFxj{^R!#VV9m^#DR*qbF1{jmjToj
-<{Zbr^Q%kzXXqezrp>)ErePT_+nLH}#~IFRX~of`O92O0yYfSv`_0lu(Ck<NB$AqeMB<CHb?{5x)Ev5
-j`ceB(@74INxOS;dRuFv=I=ZL0ckJ<l_}iQt;oJxNF(g7gXQ-x`o1oEN%;vs(`||yZ$-8gfym|fheTv
-P!e9f$Fun)L#9N0byYWRJ#TvW@;eHUQrnc5&ZxBMBn+GL_8Fv?u=R*Pn)SSZhuwaKHj3~3&r%v)JP#D
-pRq8!7|NoHN8kyf}vrkE93@t)puk!mT%JymnB88S1^RE>X?98t&)+CRDPIX_cF!m<}AgsGb_MqgcryL
-r&U^Jll<5<(mz@8a~<(3t%+I+0am(`!fQj3u7Zm^?i?fI2p-GflOhyzAFkU^ukB#?7}go{i>z(FdkGo
-_u<c9bNw9nu$I$uhOA0sG5J`oq&C4ti3XIcIIXYCw6=($VSoxvrd3FECoCekG%OcjJ}(z!@^H~N0HEo
-XVaE?8rHmro`$x~bz)bTFl>65BXAhDyLVIy#7kMCarkhYfQ6YzCO;s-E3#l`mB<o#?BGNlvOfHU+<l<
-L3b47xl>?QxLuW_UWlibTD`H(NZ(YZ-jXutg2P)KrYM0?AjmcEmO6*y3GG5Rt8uI+@xn|4h|p$d%tMf
-I5c?sQ{rXm{xOfcGAoDS~Wal)*TVlHH@DTezxw%iEF6GCN~ZRQ8RUm_E*8?;)?SG0l#`_d@GdM<S2zR
-L&WWW%+bHU6u2XPeOE!@HHGP=@vY}a_{;2!y2`=QQ!1)f>kOGfe%~4(<;O#rz}A8uFs|TVn*^k5t$k3
-k$_2F0OXO`v?NtVbJsbmqUs3^y%qDHr<y_aMVAX<I{u){k4|$S3d>IHP7dcXI?9Y$I=<8ENA3Des(gX
-KLRNAldIhz&L;K?=hmTIuY?;*8^j<|V5d8-OJUr&6Ct4?gf%n43PuEbdpWPL3O>aoX)Dws$D=b!Q+l4
-C!P2u0v3gge7IJ^zMqr>Z5tpmlMG*4~s)PiTM5>4NWdW`xVjAA892b*1xLvw#0Y_dcJAad`zo$8Wm=G
-lINi~2`64|mk6p@S%@pLVzpck~{=PS3l2m($KuPBWXkzwq{H)aYKfj=J}+m2C$0XRlt@=h+1u>I*TUa
-7f<*Q{2D#D|^tep9xRNH<)AciMe<=@1>)#&;18Dwg>C_fr8l|nHVK!9dAl5Fi$055l#@Pqn-fDC&|bo
-@K_+`OmdhZK~mXa5Rs(m<>V!rd?1zdlVw}hok+D0N)~6*yUAqr+6f|Zr`46+9SV7O4!v+vw2qXsMn#g
-8>*%8cE((^1JowaY{;%cMJA=FRkY#X`QJE@@`$p6y38$)a?~22eUM^=fChj|uxC<$6-5%|WfqXwD0vQ
-_XNI$%-DB&5%+yaG)V(MGn7&UodmNfOg=%f^iH3E1$BdyG*`D1ZFKmvV|87LEs^hCe?|L_0(e+CATPJ
-`3I_aDl$??0U4|L21^KE*Cz=k3amDV#XTyt@BSw*)_h=@MAWj>X5QJE}(g&HFD7e;+EAIjL4p>dl~KC
-zDhUb^dBGG{W!Rz}Ot`iM*8(9M7>IQj4FT+k6x~jP4+NUS5}rdPQbwG(MV##uw2rKK9#th5jFC6v766
-UeRH2!d^(R4o9JlQd~9|sR9{i-FGmYKlZC6`442|VaL(Zy+1mBcoM*X*KL&n>XW*(MZ=C<Z+^=h`5kC
-x@f&dqji)`DO<|$Q**v_4%lK-G|1H-uO8<H5OexGrTkC!{{-UE@!_P5d!rN#(*u<!X>UJI-X62$oB=k
-TFZtSuDtNv*{solt}d~nN7K$v{m??PKek5D1;jLu*5r|E*mAd@09QcIBGE3%ero35!mc)^9vYJ1Bf9S
-nBHj)HT#vm4MvjKDYsw=19~0X&8mon5gz`Q8MW@d7R;WVwMO0G+eoqztMhPOzL6Tt|=o`IE-|JDHImx
-nWG$c_s0-^|X*gFw;b{DSHz{RpH1BSqnk3QyeepH0ao6o5L@7Sz!XDY%v;nz5i0lA{zz}37$x&BS}S<
-M36G;V2&HkFm+L^$K;KP@}S>3RG?CmNhp@CpvRa`94tm=H#`+e(+Vb9Tv`N1^%z6Il67o4U0t3V^#;|
-slsrq*siu=DKNM&Yb_JP|YkM3_BwkVztz_{N<utKJEX#B?COdMFw#n6HiYjjVRNYvQYwAEu6;U^9<cv
-Jguf8+h8;lzoE(kH;2P<rq9HwC?^sc%mgjCGj(u`+hM~=raFe$pA^}Z3$0R2nV4)JwzoUB&N{{Enekh
-eb2LgF&8ZRoye`HgJxyj;%NBV&-?Tr38G^mubo0^dlO!o&v$b5!x#`gbTfC1tVXY*kJIS8gkJ9cqDPA
-?d1v8Ke>4NVKA_=Ag8vMYtA~kDm=SasKjPhQ?*JcAS=GL3)l$v?IV$+3Dg@Gi+G{E-9BB7TsYtr&^2F
-Vc!Wq#!#)`Uet+M5ioIRr+Bm^qE2LJ`d&w27u3GBB%8e152dHkSo=(<KDTZcTdjfYogRfj+<mZ<#25d
-LyGXNLjS{_Utd|9=T}@71!D~3}+8JyY?37$kq7C{brSvOYp<X2>mp2ag2CcOR1m}!ypVO_+(X+Wa#pE
-pX`{$p3E=lCza&}r!aPe7P<3EyP>v8_O{Lw=ciJ~7L({B#S&aqId<2!=%C?G;7T|D2RsIac<MSJ)N-u
-d+Ok-ir{`FIqQ5E783&tHZeT7Mt?3OIT=w_&Q}6j5JnQn0qLH${V09ty1g2)FxsNk!zm;wW&<2x`aCH
-Hc%`J2$V;D@3*PSU!<Z&*4U2F<Kf^dWdn-$MEh+N0o8hO(TXWeoE4tkHkvQ5YwTaBng3PDe2f5%5K7n
-!)9hW<%K<u(4@9^K51`}H7JbJ34Wc*I}SL?6D}VcyLHU1<l#<`PIwwOP&FEN9SBHm{&w>EueTfs9#Y7
-NZ$0-qY&&%j2G`Xd^NU3|dG_oId+dt?>0V+EvUXN1{gn{s&8aZB#C04H6yS%h_LLa+sBc?G@qaw4-4h
-exY?*o^&<PJN%;ScaVSJ}k#9Tks88@^NnvQHR$|%G+dW>`{&(qc<bi2MqCLpAG?PDRqD!82vByKfK3S
-cTRi*h;T7;|dQJ|H+1<<c&N>v@Fw=ZF3MGY(`|2=q9BM0;7S`khelgOX{r+?2hI`gAyEJ{_h>AiE8Je
-I|?DF#9&SS_;xz7C$i=jE&F^*Zvun!<v;x&tH7|;;YwhCeL5Kd!K~W#f$uI$jbs9g>jd5coq|0dNQ=+
-ed6-Cn~u{nWJO#8-M<7zY`uL<$^D8hM1A|w`&ZmD3^EqspObEwUw{*}Ayu?87<z+@5v-x^pAvjdZpt3
-W4x==W9b4s65Nr1?ymd3(!kDP1M!M=ZvhN_3-40ne19};|g(&dDgyD2QsSn%xyZ4RN<vC!q$X{NqUWR
-uakyk)KFcDGd7;0n)Ul6>3yW*tOYQcNCf2-4DpEA!Snwf}xi&c5IH`ju&Da~I8XsiV6G)SocJB>&ID2
-RCwt~Blc6}4XisZi-hB|A}hVvRO9JN=U)a;q|BQrf;Mq@qI@{DmLqt6iA)aB47wf`X7QFr+%1mRD}Nb
-e&1@L(EO`g^SmoQ>{teQ4Dn#Pke$@oHrEEfm+83b2Kdlq~ykx{MBw2$Exbw+G=E0{`cWIf&vdan-K9%
-CO$*DMg*u*Niv0Fz02!jL5`~oDbKPm0u`sB7nuNbK4x~+)s-&F$+C4TJPq}1i9OR*k#^ds#(}?1h+#Q
-PlDWC~o$!Jan{!z<%73OAIJod!*@l5l{(draWjTDE%{yvLjS{iza3|~4O*!iHj>L6%`Rw={Y<c5W$U*
-^J5R|{P<fxMZDvdipQ$UUl09+?ruQvah9%6O)ZU-Jx?g%n)H$=<Hggv;TWtFV6DoH5IH`!1bo)sWEh3
-a2X0GmL4vhS+R`VQ1@rlaQW5^AjE_FBXqro=lqAXOV>itdrRcX^A3OCZ3b`3oMai=8SL-9vF;#eaH9i
-srv5DVQ7^`Py<jkanTM9D^zwvjYXoZ%zVGYFM^h+2{YK*E^&_<q0^~GFC~#f)sKoCH{*F!jk>?W_1HR
-XjQZ7kdt3jjaNu`Wuo>8kJPw#oX|*!;>8-sO!i00x2_Px87`L6tv2bqy16VGGCU#JgU=p6B+h>D*`rU
->=?8j!P^Ht{cIwpt?AzmOk))$Wfh^X;0bD(8!Ue3#L^hpj>4vte(x55Y0JDp=R#mY^)9SK&VLEk%ZKp
-E{l;-me?yk-{t1Uf^<y2sIh&lB!3bv!B^IaT2Ika$0u(Hf`VwJn3(($8pE{|>#<fx?^qH-=Z$s@zH9q
-k`KIk}xOT?Z$!5moYZ%q!USZqq#%IZ&*hd@v47(*X-+9XZit^SN5(#f)lY<MsJcE>8j3lGm_<i3lfT;
-1q@K1@tiXKFdlw<1m>S#-Qc{)-k#MLck6LG}N{7u05iq1(HcPL8m4afrYKSi?rnUxOJ>Fk0MM=CP|>l
-s43xE;la!v*PTNGKX>p?r>Vcg;mH`fR}ZrHSc*2gF?1wGQ5`$go8)pj%ksucw%n|kV^v=Rk3?M*i%-j
-Jv%+W<@28!ZP%N-0m1Si9#vomcyyto9$h!@UIr)xl5T*L-PxLN~U*hY92%cQHO=~$1+IZkid4~CM*jt
-ahTJhd7j)1X9zr`dWi%?B_yC}?fpCMniwpiM@c+o(wGugOm7WlAPB__ve8hAKSQ3We&ubT22YrHMChq
-7(viQA?M;T~OgKe!8D;e}9fKDnSQ?lM6H)w=QH1-I@r22*HX^3qy&>-0{Yyy1kP(Z?@JaGkolgy~l2S
-$(y_lDDv@mhGWVn@$0jT=Pi?B@}^tsymKex0}s-c&cNm?lhYx?LdJTYqd_%;TW2DI$+pPbaZ683)jqt
-n}k|stj<dXT%2U1H|q-bu)RfNjg(G>5-%0+Q0MgMxPo;a?E=v25)gs-MVhicjms{jS=>KS@N%<Q`~nK
-Lm)o7ws;&xAe+~^tBqY~HIlqC#U%4VtydNH*UoW}dy4-Y4)nXaAO#@OKyH^?vZK5zNXXNzO7%Lj~={z
-Vpl<Tuz^Dn3%e9~or(j~V!cB#CXqWQE}-+#koqSmkjrEbkp@9e}q@(YUojs&qfInT>A*0^3$Tq{?0q%
-DO9bkR^Uu+x%je|wkWTdJ|qtcq<gGATs$)OKhW7|rPZ5b-T$S?qmnLd*2>9tGK@Buu;wxCX6c{!9pNW
-AQiWQ?}@U0)P5-)5hj`tkOlPD<9xrK(yrO&PET?+e+mxN<H_(25nZ>1FlssNdi8mY8w0o>E>*{GxE`*
->m0P?ITIsFbk?Gzs%DT#yg@T#cDg8*myF^ALAVXt;lb-luD3Q*(%>LvJ!11in_%yRvqQR@aD*NOQ{3)
-=zqj}G>*wEm^@8?MuDR@+{qJw?55LdhzoUEqwm-@_*ceL%zIys~)R^g8S77+ZH~$mK;Pd1Eb9i!pWGM
-a+A6=JC_X#~+ZSgrd)2CZF7?^|O^Zb6~MexVH=ui0v5F5)D%)fo{_Rp{1y~zFxzr6hN)$6w}o;`i{V!
-Wp#bZ+aYk$3~-zZRD4Y4kNK#hVgKW|vDYp}mAl0A}N=P+h=>1K9%j<y}7PR-q)?CEQ=_(QqWyzxYoyS
-y_=)hziMxS8!-xB#Ud9+OGRj?n)J;lp-a-B8qDg{t-ADSqF1@ZoY-hXh^7Rr39MvE$V@X3QgXYBsWvt
-F?Jyu?teJ`q&>l;U4yZ3C2l?%jpW4;n1oBPH=>_-*f8C!i`XY-3OmxgU~a(U&Je?Re>bq0S=<Nq`2_2
-tI40`bc0up}QZO<c_P`F?ywFV!WrvF7*_&Z<-;=jY@h8oQ3ad!Q|8xe^hF6B%u<n{gQdZMnnq2k=kHe
-VDMWgv;ag8}g(#k}kcEN&bltRDwFJlnSU>N_^VI=!+iUt;x3LjEtGR(jVQ0KU<XLw`Jv+NmOfOEx*G6
-;16<%*D`3N9Dhe7~C`<+%W^>g9KgTDJ|H3bV@v26r7j4xdJ0chq4b+(Vw+o+FbR)3|I1wf+>5O}L;u8
-<ZxB?2ap3Lk_J$Evc{+oGl{w^kO>8jL{v%yKPKB(Iw~ztK;BLSRH4a@f1CbQZU)sP#rN=3?^qrxWaE{
-t{mOiY~F6t%%rM`!+B>Z#>y8U=B&7bpjlXNiWh}9QMtS(Ha_NHjs-~f3AS!oqLUhwv!!tOW_h`+Z<a5
-pda6{<(2hs0NJbI3KJN20SnBw}B@e-dN>6Q??`Zz%o4UC~=?X+cM^p%k25ZJ?3_BQue^so8_SIrOA2U
-pyJ&=)MgDw-|24Oq+zP)EcSqDz^$nXDg6g@jiwB>dG{P_Eu9Hfo7!4voaTOpBXo6#Q=V0c<S|Nc0?_x
-%aA__u)y@c2(MH9E6hO2^wav-I(fY3j-I*A=4eY&emGrvPK>b$l;OvzE$M0^3EGJobdZ$k``R$}%~?+
-Zyxf(Y!pNzj5^B^4k=TL>_s3;$MC5xBvm5ka;gsh?0<K2-X&;PO4)+p`ACK;tLMebjtm-C-8vpG-M#7
-I<Lhd%|<Xw_k!-INGUAE4PiDq>3^c42pmXk4nnR@eoDHy0R@uEG_dHRs0}iXJKj(1K_g%Rcv@Jyw{WX
-m<>yVkSy7gA%Wy>Y!J$luG&u8Li^(mIxu$VDFdBW8r|2<$8Jw6apOg~PCtOFco2UnRWB52+<g4_BhmB
-u_J#z0%qB{#m1c(!9^WPIpsoxb_&BG+~4iNq!DH#qvpp<2MiO$I!e~hg&@nR(u1V5-)dCLx-&~ox%=}
--1!Yj4}o%U~<hn+Z`z1bcdXXOW&-t3=PQ`g0NmuONkw^$WC@M*45mXSs5_4JRL)C{@^IfPA^)8-vsm?
-laR^^q<4c0E-d_Om5%Jsz8hkO91;=o}ebkMCLl}XLb7;;z2|!$eysbuwrP9T8Pg2wb23^J%qxY#Z?c*
-`Iq9t=;X6Zq2oF%t!babiOGcthGAw2z%H@EmNd!#v6G+y6<b6&$sAkKLLEYTTqk=yK)b7LPN>##UX%*
-hmLwAzt~TR$#Q!FhF@6wBnuw31yImVcr}mhBKe78jSU`98chh|U0PkyZRbK<?%|Dx*HN`pQ`A`RLArh
-T%`L%P4lOi&N1X?0C&0<lVGEzBwkzJ}l6(+YwYet}j0!)qu-K$~@6g8X@)`L*c&WwqC2ZQk_aIMj9b-
-WsR;lfb@4ikmgEh!3#6)0yywGz7T(gmDRPJa_`iIN3Z<P`^wZzbC94B6V4hRzzBG2R)G$oq=KSFOXBc
-%v)NgWsO8r?RSU?HtNWPekczVX({c0-drV=t496igdTc_$-`*VE|)9HM6PVWQ_mQ3dDpFicI8|F&roc
-)&)f4%(&{X`dRB#_}XAL!$z$8`mO=yhsv%Q<@-kqW{qi#D){2Ol$bN#JkZzzoz*vg{c=K)!ZzbiuU<?
-ENG?k*IElXo89(T!V5`blwXqBQIePQ=$=6T+*Xy@qm&iBqwh4tmjVFddbn+^h{*fi)1an}qeE{<_kc(
-NEI7b6PlOA)f6UACPa4X3FMhY}PN>uc_FHs{IH8zny!v;F-NL0Foqmk?6APn~<Y-DRrxgZyeq6!L9?K
-qgjfEGHO^&3~XixRx>LZiOJR>3lBG0t2x;mSl7n)x_J7$@1i?6(ep@2Dq)QX2$|i<M=CJCI@DUb!*-e
-z?+HPp#AF*g!c6uWEG1!C-mO#wV~4OsHkT_2#4Ig@Ew2B^_DB*9Txt*ChonlM0{y03h9@+R1B3(8{m0
-4No!~J~@CRMLyiie($HoccgzX@wit<SZ09yPIc3TnfQW7x0UhfmXNq8+KbuMs^`sNmlg1FJ4p^P+Lno
-jm*qD6H7R}s`+t<`!*dwqY=cx2rJJZhP~8Sc->aL(heJ)cijx$)y6^`Co!vbN59QVDe{w7R9zZHT4$@
-ISsPm6Q>hm3tJ`SnRcOX^%&<jcgOLIY?7MgT^LJWB_=>(m;bnYX8lt8|5?BOMeMBtuo^fd<iFt>4PNJ
-l${w7hk8R88u@@aqStr)o9H+!|f4DR&9m?H9$5TOLBO#yTV>xrwt3EVly4on{-5dKM2h%LUd(CC3^Ti
-WXZ5yvVa`Smk9tCZ$>!bFRROEuoAOg7|u?+@KpxHMfWcYWh@g>a9)#d;Q}w0mBPM5p}DRrF#jE2L5kH
-AWDWjOP|<V59T3{OQeFf5fn@Y`;+jc{n&1=RTNAcc7tfkprhQ$R7vWLK*aeP7v*^|+xB7p)wj+!!=^|
-0ieCCQlG5OEz|b(J#&|L$uowg6j+)cGzuP1EAp7ouv+1);W+l>fIlEX^Ga_ZU@-Q~~+$wAje03#OJz+
-fEZ-4vHixj*s7O=T6)&6C<z$i8IzS}Z0+#;;ehQIJ?hN@&O=2_vmvMVg(sZcJ8wZ&si5agEFy7U{U!o
-=}OIK@g-IId1vG#c{f#J1I1JzA+)R`#wIyCrdm!D5k}qsD;LX<}$JaBv#=3TkE*SP0jal^77rPF@>Jr
->)_n_sE?~C@D2j4!wbESw6?(e?7EXDEtimX}9K2+3=qN{ihN6$DfvnlqeC<+9WF;9_~vRgsg7zrj=)Z
-uQ$ZcC_P&}p95fEp%sPT%_+eLhp&VY`7b#gNHyDFxmT<<Avtn6BM2fy3>Id7nLW%O=5PpwQf><q!yY$
-tE;4mhoj0^NwWCL^$+{?0xVIrnFo7ez9{Xyk-!D<3%?5@+gcjy7C+RiJC-VWgvjZA{g;;%i8Fvr&*v-
-7-OWqwAxMzb2rHrq!5M=Mo_3l3E+%XJ^r}c)K`t|FoMJrY|_*S(f*+ogQfIuJ*fKEPXX=8Rx>>Z^Yf&
-3&3FpF)OW~u_N-JST!yj+nE_@icC-};!TpI^C5>-swCYH8lG<CAV;eO00l)DWw+3*c?^8KkcXPi`%-H
-fED9`ig~0<HS0%Q)gPU%eUI5NI#Vp=<<Tu1$H;&sUqC2isq6NrQmn9Up;~GJsRzNAGPaj?U*o(A^&qr
-h64N?WPkhH-)QUJ+ElFJQCW%3STwe?M8z5wCiz&DZtsWYN3}roh5etr_Ad3-{K`gz$ed$biIk>bDX8&
-AwU(^*qvRf%Uv(TBG-<MPQVZ=RUrCxYW3_8VH1<wFoIej2bjo0+bcxu&VPp?7vvJ~W2j8RF!(ViaFb5
-b!!RjGO<FBn`k2s2rj0MS<r4aIQxE!M>;HuY!+0AU%aU;2o=$wWj_)9D~Ji8ETI4g@a2CRJ2IHxsQie
-1^3bS=wOT!-b>T<v;E+gSp|8WTH-vTfm$K7Ukf;xWVWMc0^o!Y3&fMV}nYL3S^iDi_CNuUmLFS)a@$=
-M$Y~L)jchs=FRVHarb$?w)KWd@TqArD22I3Mb5@UP>IYqAUN7Qe7ydXhwTuasp*dXBAeL=e|-#u)u>v
-oKb(}8-?RNy3_nD5nXs`Gp=i4yM$+%MBv_Vfg|M!vUG5L;5rb^+~<U*Q&BQWoR)UU+*5MtJcR$Pw&K+
-p?(RCQu^L=oL1ODX*X!Y}S}`>+#F{Ue&p=5QFSX!~o}Y*4*AO(0H?hn6XA~r9r%&y+Ye+QUkjV@`X-9
-^c^pIHBF0FD=*Lk$Z<+j6Iy-a$p;RS?(TGR#{DtqS;aStyz9sSQ{#rBUk%!2jDll^$EadND4a8my~3K
-e-Y45zQcFCp1KFY%tW<{-<>5-&05ONuF5ZB7@}j9wu@k{nd?PBQa|RblhM7}>3-&IOYL`IKC-I|qba1
-aHfcQQT&=aT|xMHa-?;x2?w80(K=c>yI@W`Ameal7M;U3<&|aP~~q9p4N&*{XDD4rc)!{OsA|NAd3ku
-Tg=Tc70qnD*!Fvhq?G*$-H}|OVr|!|oH6G+I_f9aL>D{L$Qz&^3pHNdt^*hQY`KXivkIptBi|6&J>pv
-ti4J}p$f*#YP6M|b5I(2$>J;~R$5+>`0=YIhk%cj!BHy-ayJlsNr%cx)*!sGFv_^LY%HB>>8FVo2R(v
-j3Ts=IhUcwmarB!Aq;k0BX$j%I2JW))L=^=**@(kTbc9JbN*_p}1U0<0=eEelN2>{KSQEUQ@vLke)Bp
-X9GBGWKk1}_Jz=v<!CR(Q7thyz_DWVJBkS+Y@Tm0Yp-yAiT+NtOItW~J^knbU$zr-<=%YM05XC_*}6h
-b9^X6SKqAORHYaCUg6ph3(LD0H(8Envzrad3hFsaiVv`!Va;eg`|<nm4;j{w>KEHJkI8ICb_)x2*is-
-(oF))>S)SD&-!Id>cRn!zRtBrzZ;;zQ<eP#9o7oeUioA(2qn%oDyU$B2+8IHn`^F_y7JWQU~J7Dr=*U
-iBpZ?%;@rl2@CS(HqB@5*AUsrcQ?0kGP&MNprr!H+IK|x;$dt`Ncw5fUdFVzdiI#S)OSRUe0l9+@jc{
->-3Nf$_>>0zsr-tk;TM@Ut-TM0_!|IAO@Vj4#({y2`WzcA;DWHZc&b^w-w}ZDrlXb`Bg2E5|K6a@J%H
-`&&L^b+wnMeRksRS?!_7RODd2<wkPG1+(l`{L2<!bE(xPw+_TPFKqc}+oMvifuN<7~<Oo$I4$=!_tfg
-l$|1JtAg=v;t(qh~1yq1qa>3x>z5$d<(D{@a8(Ez;Pru1ER+I7`R2!X{;I0H?O{W@$Q}4(s=Kmmgpxr
-7n6r`z2oB8hR>!}W@u)FGm#T1!m86+AFrOAq*oy^Qv!0g5<@>UfmF`eSsrHf@@x?XL+D5HgCRE<uIN1
-Kwpm7vmdREjwRNfNP6N0*^1F!N;`=Z$sPq=FN%A_cbWOV}O?ld`V5RwNxGA+{P$MjsYfJtiL*D~-2Qq
-ueLE}oi-BT&4A6=sSrfY(E#&A7Apuh}fN#$tY{T)AD9+93LtPanFyIh^H^n!mSHqu4$o9@&S#_>(X3r
-9UG-lJk6hlrzW;4RRRbq3hN`Lb>}e6m`W*A?p|jma7T9co8ymOUBnT<&GNqDbf2nl8?OLDIU@tM;?m7
-H8cg8a+xNJT8D4t9>ff;ksT;C{Qz{UPLye?@OjJqhriM=rF`2KM7kUw4@20W->;BGl(jn;UGu`i{>`7
-p7;%phLpZE3HvP2YMIO!(&Gtb0j0Dvla888kUJy43uN43f|F(7evX_0<|H{)gote%uIrsAs%<yrL=4}
-FplZ&dik94)!pQDdQdWw*Gd^iK67ZAOyC2X=mWZvkhZ|j&Wzxnlnpi;@2TZ#yj8==g8rQ9|_pZvua8m
-ZaSz;Pc62xhn>;v~h#jLmkq%N3Aw>advh7VyOWVxV4sxwNDwc2*oO;oO_U03T3Ilxf1<SlTtVtEdW0i
-5EdZsrt3AJ>ebDmsBHyDChLw%hr7y32`|Yz6_RpdiwU>j_Jml{mx7<&8B~a*TGU3+CTwfA~oZUmGa*8
-K^Jg%GINeW;b+o9MY8bIS5EZW7=Q!cwVwD1^;!dP_6qFX0u$K*m9UJmuGblWMRJu{5yCVhxLJ6Mmi3)
-o@2EsBn8aT)q<#;pXXS03aA9{EwgI1HT#7tS8v*qgw-1J!kBP_u{iMfO+$`~VJ)kc(jCHrWmg48D$gl
-dqI(6H$u)}{RKQW{W-(sl>{0&cQT{NWm)8&PKmPRbf0RXO-Nek}i98<V;?Wsa@*(FTE-38Y7SATFFYJ
-Dw*EcX(z@V;huIw7{c!L?Rqc1MmZH}z4?YiVEmn2}v8L*CDJUhhr?EHB*QqEDgCZ|<(cZ(`J^(0WR4v
-oLelLwDK2W@v8if@<NP(cvUUFiJhh7^r6UkeA;V7n+&K}KJ{c>nbI)AvuA8NK-5FaCF&<!E^P{cwDOq
-5s40=lMO#8ZbN_e?K}I?f0?+b;Cp{!RhwWQNHtx?%!D)3PohF)4fQ6$A{1^jjAap)3Lrsi=S9z?GgQP
-u8L~G+Sewhv0$VdeMci-x1M=F`h9cwf6eEr<8H-2%s8RsgdM5i$f`P}Q_@}gAtXVhY(>&AY2CIj=RGb
-jX<sq30b~E6gY2bqWu+q@Gm47=3S%H!=Yx(PJiIW#zKWckbq$G*;8Yn7#D3Er;#TGwRmUgsdi~Jub}$
-+lyO4MjwG+T0aBS-Ol?aB|x;Hi%<Mzd=jNg!Nx%y@e|H-)&22YrO|CA7X@x$II0KlV)KBmM1fyMq<!V
-P*oj4+Qxllc`#l<90RfG86$pCY%<ywuHZ56Mp`J@xIR&ri%ndj{>%gNa+6PzY(e9`=rnS7nqPW}RUe2
-eG|Q7#or-wdBNxPr|?v|AecWJxR$&+R7I{dy+g~xZO_@a2yKdCLfZlINeMEJI<_*xj@br^(n~VsZ_lO
-?A6SNa?`FkQ4>%CO2%9UrOoaE1>S?{nd2qWyh^%jd!fv<`hzLhf{kKFa#p?I8HmR?bv7ilNBP-Au*Ht
-gLo(oz-PfV*xV&IpYWfm-GMg+^0xNqIr287VbKV$q>6l=Pr|-*(vuRfljb+b*L}`?>iWf4$L{d2;V?#
-Wf&N$r|70yIUb9Gj!8D*JG5sW0w;lEuX0?jZ<X0{?5Y6<2;uKGLj;pvn>w>}HQ#}BfZmY_%Za78WYm3
-7^4Ch^i%&H4UNF586<4$_!$3IgvW%+$Qt#@{Z=%W#lAhch?RT$I`2Az*_sRVEh{r?W<<eNKB*WZ%5~D
-u_rJWCsHU9#NUZ#lt_xPbmBxx5yA*7zGE>8P5@?;-|OlV8_`U(X7^d%U~TR?FI~i=eTx@5dGk@rGEc?
-tcMBkI(&SR%o9P4?n{`xiN41VvwlNN)F4UnL+_Yj=`%M?f(;PFx0^R6Ol^^W(Ch5g>-X8Sr(b=Qz5mP
-0ciA_up1*$f&DSqpy?^mM1JU*`ub=;c_(#{PV)UDxf@Zq`VQgq#6W{sVp_o7}mbrSyE?H;{a7vt(a*{
-|h4@#hBPAXyuo284eSE(q-G1(iA@0!NJ@?GZ@4rU7<?2Kxow<y05N?*YM$*(0xnOC+vepR;^&eDo*HG
-1v~Zz`LU5V*?=#c4B1UUo<O*tUr$40rl745v&56L-RaLnOjyUL>&HMenPxnE1RqeYgl?lz%GBvk>9SL
-BUjn$cFzui^6|*1hpn(r@JApc5epZU)`y*k*M&4LET{Vvtv^Ebtz-kIv`O|-_SdZ(~KwX(Y86XAzJ>;
-kz4JA@3~bxh9J1SF@XsJXYg~7J*CR7aEXva|ET4?DYh*aa=~aG48fud1tj=LB?TW1R-YMYbR%LX!W?7
-4*avCNg&5Err%t|E3#7E>SRu(}r_o&o97PBgv)M+{a3+<0j?QzPe3@4>D6KT@7iwqBx*_3ScU<R7+GW
-@2<g0(e!i&``nK!TvaQI>DVp>BvDV5kv6Y`L9psCSI)5}s{mTT0-!0%F1At;(y&G=uFY&(i0CznrrXJ
-pa~^0|pw9_Vq9Q${}|ipJPdHatXfGC6+qgn484kq#&*e8wsEu{=P1YAZ{!+a{XMsa<wfuty5HSk<RfH
-c?FVb>~|}GCEnAbly}sU7wNxM-<5e9zOg!8im_<&9_&Eo78dW!{fCULZZrH<-|D$M7im0$rA4&WBhE;
-0g@vf$`4ra)RmrRFOq~`i7#BCwQqxh(9+C|44z*VmnA%C-BVqW(=9IR<d#vqgDrhpe>mjUsIqX**@+n
-#Ma1{r+n4WOOx}I-=FRK3#tlQ<FkiDwG1x~mF9FIvv*XQ5EK)V6h;z0K&6h7j8QX{gwp#=<q!US8$pj
-V4zDQ45@4UGA)0Twt(Bbm1{@rJv>FmY<eP%-ONsuK!zODc%0+$}j%VUzr=|Ef+u#UVBU*M%_I+Zq4DR
-N5E^a>`<tPyz{a5IhQ9PS^>FDH`34JV~!kkXriTu7Xl1I<?-5Hm%CWpeAg6I<>zhg7|k9_5+8Yfw?9<
-(9*x_{G!mOwI0cg=hQ-8e>gqsJ8=3S&AEyQ_&UD-cAMXD{;OIZ+<!rChkB+>lJi;85i4-Ur6C)XRzHr
-j*}a7u0#7LaT95#Xi*6eLT8uSD<+FhQ$I?&W<7esx#YU{tmOFhllJE5&ueK(49H@i^QP@`U6-z%=M3N
-D@X0}jA@kX0l>ysETA&O#dpqVpSlZPk))!hO6iPKLBv$%nriy>1^ho$}-4sm)WXo&-E-S?Utma1m5U7
-a*MbjgG!T^TKey8wZDvPT#9cU3=to=fDdr#p8m+Ddm0z*E?-XT+)@xBSd*vY`iX4kPxo`QFGxRExkxa
-*-c>;ik*LVp0Q0Tk*h82Ue0(K0LW{z|E1@Q<(tZ}uIk#FpfqY4ifkW>EqtefdTjl|{1vnU1ZP^_k?_Q
-^gj!c%tDh_PwM0pqR0t%=erYEPQvk&n`PaaOfI!4xIWZn2NEWr$QsZBPrq^MN`b`+~pw89_61h6=80T
-NzqpGa(LF4NdGLI#9gDmpqoD#I8w?6ZtoR2hz!q<oIX=ehIg<UK=J&0rW1_@+u|H~_PktFrzMNdd`x2
-H@58pZ#wx-DL)#uv8hCvDYyL$x{`v7>B5ejIlsk<6c6?7=Z17l<XWbMpblKh+$#j0K8DCWj6JQ#sv3q
-g=MJm5!l8+Dl@k#%_X)u{T(>=G=Ea&K|#d)ra%Tm%=yF}~LDZTyl&C9H~E-I=Ao-@mNk75SV0x>blCX
-e2BuszDNGtyPod;yXLqS<HGau#omm!xs7kTr=5C~5Gn>r0YpU{xhO3cH!fz*+T4Cw8S;Xu%GctU7VPW
-~FPYsdLw6o28eTaPV_I-dOak;9hqF5^U98h6kdVVpy&3_!|&nK9N$pG`B)MamjhUDS$|Apd6XMg_&#p
-g*XvC{mPOWuC|R1iQ0Ca^U&sSpWqPWiZXBls!Jk%`!2fJ%-}lCJvE!<1i!A<F*@#n96-o@Z!oM?lao{
-+wQU`cD=cn)lyzQvDlyR%HW+$8n79CEIL8eXMP8@~bs)mEFH0POQ}1H3O&H>@>^)sTv4_biSCXfU^mb
-E>*fRr<1C8mX)GjyWVlmbO88MBc6oxh|Vw8($PPJVqf2$t^{fg$*5>7tJFo2$+^!sVKsBat-;-*WxJf
-6K!*#j4N9)`ZiC7gloB9Wn_i=|=>Js@dBW4@RH7PbpZH(Dy%iBAWjUGcS``-&+rMUNdZh>p;m3ptl2r
-3}GzPVD{vP)h>@6aWAK2mnzTaZLJJag34#007Sm001BW003}la4%nWWo~3|axZXlZ)b94b8|0WUukY>
-bYEXCaCxm(TXUjF6n^(toSHm{S>l*HZf&N9C@NJ5S-?!q6Gfmky#bo-ZjJu?J>4LpiP@d1^&!H!eCIn
-?a|L5o?Kxe)NHEd?+>LJUU`82VGXYNo70D|V@W-}({Jt&{nh#S}eCu8HuHcdIf(k)d36jA^5ED|wGof
-G^UEz09W{^=KIep$p0`djH1Y60sgcDdXjs|<gsW!Y~g1{S<FMv|@%{CHNgaCTH5Kf-=u;xiANoGRD*_
-LJ`L%c-d9|FlU+Y$sy+iXfEX-YH!9kn`AJ*cXRBphf7NuDcDO2km770qo3{b}^W3T$vfcntg}XJSv_i
-xuMg7qGmEHnNt{+z(*lgk#ro79m)!3+NSCUgX#zLj7=}IRy613edwxCxkmfdt-MwalD!Ka~6-TgF%k|
-;7<`^VF%+m3akgmb)ug-_|%C!I}C>i0iF-`lkG(i&J|3D*MkkNV?DSwO#J|nEbk|TkM`KHToXwL_Bb*
-T;qZhWW8VwyKbMGxHZZXk)=bd|v}^OKvYJ~_=ws9Xa|@Slq;i-B{sLS-RJ36k+8Dx$Eai;#L&Bknem2
-qz6l=><gvOEMd&(XIM}ehSc=pV7X0|uBm8-AqBR@dHW!N~FU<FR7V*1OdE|RZ75yi7>OkH?Y3uK}>*Z
-~${VQJjyX(NWc-iosV;&`=@8&2XFXi+gPadx*<%}isEvOFiLM1g26$ln`MYqLZWNegmNsppL3GO5)?g
-2UaYQbO}uD)udukQw2;7N6tvdc8QtEmUNX-aYhhhj)FHrg<U+IOU3#R1$+d|AhnxzxMz?E1DBDZE%%D
-6iNI>%Z$CD{C3pS!i=mib>$z&h9LRMgzJQ_1%6$>zNx1MPa~jyhzMkd2%}T6kO`Nu6sS?0jlrq9)|^<
-L8DtU-bVZFK+2y3XudQ3wM?`fzUJ0I<ZIY`Uu89t@28A#>d~0x-NXeVr4qk(9_G|1My0!&CqYemNDM8
-IzsN-bx<NjF?PH=Qe@K{NDXR`JC_{yvy@Ey+?UMIP4=_K2=w(Ue{ki@1i4y78vSHKc=-jQZoN0Q?`9b
-Jk*@}v?ZyAXwz(x@8<H>dr&NVx%w<t5B^8Bm|HG81)c8^2C3HkI0=bCe3F{Ai=;d~TxlLA-o!Q<9x*n
-o{21p7y(hZ!kLTaH+TEY_c_$8e2oDZ`w&$-6_weux`yz{qU5TfgSrmuXhBYdLM6G=jFE!z7{u?>(mlQ
-`Y?4=cJfopvr}6`<!Oq0O7aYL?|JD`o$Yf|;z4_b9ywccB7|``M@`6IJ1`rZEaL!W>QIAW>wfNdN(rw
-97OA-fxOPS#C4Cc5-RSb@>Y2Q>2kKJSD~4MM*L4_9@c*Eamg~W1sK34pGP#I{Zz(C?4gKLRDEF$V8M4
-HDF9IE!^f6LFOXJq;&e_+tv=_;>^|%C@?2NWQHyv;jMuUG@>kFg3W|AF7TOoC~w@f)sLCwA!?G#gww6
-gsV3nTgd{3oTIHg$t(XP3z?C6$C|UlE&g#!nrO7f5~n=SBPnP)h>@6aWAK2mnzTaZC@xMguei004ao0
-00{R003}la4%nWWo~3|axZXlZ)b94b8|0ZVR9~Td9_vBZrer>edkvUVi=YLN_E_qB4~or)Jh^ikuFKu
-2m-^P#ig_@MKVj$wt#$q(<|Bn3HsW8K>w*<(%I#by2MFS6cJ#Lc6QF0v$Hd+1L*hqFwY{EE}lSD#{Dm
-ZN7D|#%<?s7i)9I&c^6KOAD_UOWqgqpa87X}{FW8)<xTzdtHmm0$zYzXo@oaNKBIiaih^Y+lo?b7)iF
-uF)?tOIVzglzLBxuZv+Js)P%e?I$l~%g<P_qJW561D@`~qKLE)B_OF*x%Sye(zDIj7=IlW%Pf`@5IBO
-P*{-LQy8$QPFQk3x8z-B2W&x2H+7lFg|UAhYHhsm)fN(~tv8Axsj1WV9H_V+9iezB>vo43B{2!<pxvT
-SGF0M~08<M_@QZ8Dz|YiR;18@=e>Yral<94T$m#C$NZ*R2Nn-0gsFg4-qbckZwcmnD%UFIb(^lrf0T=
-Nj7+JM@TUxo;g8>acbFC@LVPzS%E`*e}EL=xIoT{6M#PvG+Vk(3D}l#Y7-c_9x@rubMViIX&JVTqCH{
-;Ix;lh5MjEGPrjZZ8^*xUm>Odt!;?_86sMXPf$w5g56|Y$>_D7h<hfI@U0=wCnNKi<5f}oD^+UnFjyQ
-tyJfYffgdj7pTt~!X;=nV63WtnsYfK!I2&gOL1J}dAnXdpk7@p;eobD{Bi{wgDWN}E%DGM)Zfl8zX;$
-ab{hU6XXUc^AtVxFyF0Bn_Kyo58JEjTR-<zCVR+ox!DFE}e{l1|wjOEpcKCt*>*X~;X<8+uF9eWC$=Z
-druQ{S-bwk;@hCgbRv}qa*1ksyJqMVtv?QX+-b3(PxL9Rfx6@xDNSM&Z!E5R~zpJ`U+|<UFGHaDrVT&
-BDQum%Y%Bk#1XohSG>T1dkO)ss3!dpjiJh;u%w-WCb5#=5YXr<q3J>%g{7qo8PsR%fn4Oxxm#SVriE=
-m`n#N33)z%MMmNhtxoo5G@J)m~TyKwVM?e#~Rh!<9v^Ko0r;Jytz0?Uy>&qK_ld-h(LMha1%;v6iAyT
-jNY;D%0dP}$esrN58HLQzPH&{m`@3yUHE<?V+mtC|V{;3Pw?kDWtIZexMba?n+FFn*s4|P&?^!NSmJI
-#ciH}^-alo5JSiT|>~2fh%3w!|r6`;2e?c!%-NcNk5^=gG%1zWr;T@$Kskqm|A%U12%GWVd4ZGAw9;f
-KG*{*QJu5mHkQCAC>(<+3%J8PTAMW-XC@UZJN?HAGTjTN3~~baPD&a0oxzB2H1m-8NN?Hv<*Va!q9!y
-edz3p=rw2W{*QsL8D8`sU%q$j@p0pL&wB`IE`h~L@H03Dn&21p5P$f=zz4Z=tnXH*FK<v~>vlioJED>
-_56b)BkG+THKRqb^GK|(@Hg-ql17q@wvcD?(+twKT15ir?1QY-O00;n48F5T1fAKI60{{Tt1poja000
-1RX>c!Jc4cm4Z*nhia&KpHWpi^cV{dhCbY*fbaCxm%&5qkP5Wedv2HAt{Kx;HP6+sh}E7LXsS#n8v7e
-P@JT8pxY*rGsEyV+yfq%F`xQ6N9>mnZ2^rq@{@=%J_%9&tF|&x|Ra!TIBJSnEnPn`h9u`utm;iJ~(|b
-bDviX6s<M9>LRZo;-z_(q^MATuR(1UnvXU-5g%O-|S1Z8?W{LMRbPXr8IkGt<nuR4V{%SinMnz>`|)5
-ST+?@$~vR2J14<yk<9Aa-Ihi|tqm63Ay3<xR$B?T%54F&KI+avEhQjgD~-IqgN-R0C#x7*qi<9tE95I
-3{zxdV^^HWL^?f&uc4{qq1HEc{vU=QVTUi=V4V1f`M=EK@eOtwxg2<=E72y<^fF;i_*@RBu5fQk41SF
-gEMPyaXa}E<Gl9aH80FtJFC{D71QGrxfte69*Gr|#(BM9kE)LD|QCM=uvIJQ`(3`I_O$froLpgfslf?
-Tka6)$`7DJwE6#26_c%Yk0ftN=0hG++3-ppY_hky4oE9GOV=62y`wjHEG|<}@i{WH`PdBFQsBe^?<K*
-1&`;$jsZ|Jv1zRS94N`9922?CRS<TdzkWk0ckG0ZCDA45~Ls=jPpaoB1RlVd)&JwnKzUaEYEyB3KyJs
-7a5(UY(}$$dT8F)7dgkml?Z?s2xr1;=Bwf`q`W6ZmW&=a`@#EJpp)JM<v4@|>3OFQ|A=uE)kg1O3~Jw
-M<A61_YLvs{yfk`aq_v@7D|dL1?6L03V9`RoR!tN|>s@Ireoq}9QZqbl#rJfhXA$7DN4|0+;W-QjePW
-A;`R8?KEFS&mP?%0eeZG=4bZu2SIka+D2e^Oya(wG0hWK&yyJOW<^7Ux+&`G6ln+INw4F$6QN7_id7a
-F`=zK|ELT)+A^>2_OMX;F394PX#MH~9SVO^CmQ_-lx7LwpzFZz293;va+2e{83@x3QDWp_@ZybYG%yb
-FZ4=vGg3C#CUDEP#wC0$49Qw=&QpzQU9oZI?ZXR<glOBSH|-B)1QY1KfMp}?+`zP_!l<*4^T@31QY-O
-00;n48F5U`><>=+0{{Rf3jhEg0001RX>c!Jc4cm4Z*nhia&KpHWpi^cXk~10WpZ;aaCyB}QE%c#5PtW
-s7?B4cwNNfnUrwd%1{Sbt?9^)#oq7^7W(|91Y~)>s@b5djHel|!l&Dqx0Je9&Z@&3<#`X;i^6kD5tF?
-ko+=ctQ5BD$@d9lhRJaJrzz6uGyyi}*ZuQriLdvU(`)w;26;E@*_A*IMOP&t&6+Ylq44V!!^68w*{B`
-k$hg;<n|gIXh*%oDYX3JytLV89-Ewq>!+C5N3*YrwnuKQ9#|oC6}(yx@yHtcoa8d}+hB$X~>gFOe@&_
-`@Mu<S!hF;$t;gu0+g@0F!lll6qL$Zh2II$RJ8njTBt=Oj+TC0`o`VGYKd-3?2jj$r;iiv<SoN77%Y}
-g2*hK_yG(ZHgJhEWk6gP5ET$FbSOirXD6IMK*uCNgpVMkJ5hTBcQ$mqvB5dhN7un5Cp`Egq?poRFu@z
--!Ev4NlSw{uLXR@mLkjSGpik5bflV|`L)QZZ*C7usg^?d16Y)L)d!z%0xHgIo=peL_;c$kCf$uT;=M3
-2}28Lux##%;Tp!KD$YC=NhW7Ys`V>36@HH-p(3a-zzY?v{MDM&~(82v-R%tjnVd4X0<JS}JtI=-jlF>
-x3Wt-_;Y*BMi9KsD4i@u44J;EdG(8%W?VoztI%l}WxKMHY`%oW^+V1u8KbXn-b6iQyfcZ$!_sk|N*0e
-4do5Eckp5VzbQ)g`Flcg?F=9Vdq$uHNifZ4`u;F%09F|zkXQ!_1pc=Y1?8G|M|kox{atfjiiL<LMT2J
-uOjQ@i!VG@-H#UFvBqAW$7Lb0^ZPK0Qpqi|u;dA95}8o*c}Maz!NKBEMl0U;@(hRV_Vz1I(n{7u`j91
-ddgqkN1`X`?jyy-q34#H=`A#fx`1){nyf2bNx)c2|zFt8<eP%UrCL|Fl?+F<xweNJ#DGnix($53*Va)
-F|9JhgI%YM6UgQo5ulXR``VNH?O;ZB;9w3O>k_p}K+ZD+j$O|!44bYYrd(T3Zm&u1YqhR9y}rIfYoD&
-|sE3-}4*ca(G7)lKx;<hCK@Sx0uSb|As-!8@jx{-J*J%zb-zt6~}x^W&1vh9}Mb$MLC?T`@ra>7ZO~-
-&KQgG$Ky%WtV1G?ck+s?azgIr2WypBH6C;uQoju8Gm0&vwl!~X$~~yzn<!M^z<c1-pcxp=i8N2U|vvC
-tg<LQyqu~l8<;b8ys(bg%fm8%73w%XOst$tU6`I$s}=ASexmV0LUhQm#wJX8QGH;=_<ba6w*bGNs(c9
-i;h5d(`FLZ#8fv~DuWzs?sFBvGvfK6Z4R7i<bgj3sx!<fD9^S}NZqVN%+BAEzw%YW=DWi6<bJw;022e
-`_1QY-O00;n48F5T^2vU3K0ssIa1poja0001RX>c!Jc4cm4Z*nhia&KpHWpi^cb8u;HZe?;VaCwbW&5
-qkP5Wedv23Ztd2U_Rn6a-08u1wnmWXU1vT?9!`Xf4VnVv7PP?Ph^KL(n9LyhxG)P5Ux^k`8IDciU5R;
-D|Hx{mfWCf|L6vurj5t*H58qtCJ@_6GcamnC9B*^`?d6)es&(eDoNm+Ss*maHg<Oywwh#UG86hS?>zH
-9j(mn=jaH*3uSlOIc;ia4RlV$DAHWVutTW|V^Nn-YS&tQ(X|TN4U#!iwO55zP#KF2*T~a!wlPk@m2Nk
-HSszW;LZuWSVxz3OxQ4YY>Q<F8G}c_|QkBS8w0I~eF3hDuqSaxV+O&G5f`Opg+*-XUHH|7P=o*Uc)+4
-oYqcE17Q4sk=o)b=i30Uy_jE(6S?h%3adqA>rXd+8F%Q=jhNK(S)0!W$yqBzMUqXMbUnVbQqQ^FCEBM
-9kksk0<qj#)MhI5uCT3`K77kWY|ePI)rJ1UY3XlP`n#gvpEwF+vK+a-e54lOSfE=8msZ3MnI}DTPVSk
-%?q4K`dy(NE)MQP7@g;!_6Bak~|ai#S+=D2gYPhrrrh*(EjSDnh_~-ROL9ESf<j?FyZ+e(p-4kuoM&}
-h$J42`$NMbMjS<Z+`A^3H<U=0XTBeWB`4lRMyDy8(k!7KnumUwb8K9S9uNcJOnA+FDfdgt11Yj(bk7+
-U?{|Stf(OcR33C#7C;$B+Mp0B*vx5=nU1MwutgdveTh*sGYKxzbyQ!XAEY0;hT}M&0+7`}%XmnjGdwg
-4p4<y5<5#X~^&J}9~&tWhKiDpwc<?wzyI2pt+c>UU+zxm_AU>I69_?7><>a4^6#B-3gQ&Gs5s)DX5i&
-h;wwXJ#u|7h&<sgbTr^$vc5t*S%MXfHQBbcW=W_j|YgO1~K%rdnuqGgu#crGxcX-Qb_kf1qU_zxDBJA
-HNLV9H{2T)IY-Yp~rsg<L`a^bcZX|^^f>^|K}e2{(B$)>f_)4yMIUSe*sWS0|XQR000O8Q5kVeAI9!5
-y#)XO_YD95AOHXWaA|NaUv_0~WN&gWa%FLKWpi|MFJE72ZfSI1UoLQYtygVt+cpsX&R=nLKUmrnI&y%
-uFzNtZm#)RqEJ(cWLs6)-MB8j6Q6;IQUeW#b9bY6nwi9f?49B95cgMSj_m-z{^urP4vJmxh0<BpbJ+~
-A>o&rFY*~ci$VqCi~_}>h&k$vFy2qIiXM-YwN_XsRE?q;#m5k4bA27>{);$K>>jfOX~*(IEdxngQf{y
-y{}8)l(_)n26ZA_?3nVGOT9)Nr{rD_JM7kP239g{*Uq?q~`>Gc9uX^=w93&6a#Z2%2(wdJ3Xyq%xqw2
-_0F%w5QP}H_>oqOrs~G(cRr0ZQMCjs^u{5C8##cv^qlwxh0N|kGs90H_Vw2jgm{nstOH*lGV!=?HO9@
-70qRho){}OQ!OWiQVQtH<?q+CjmZsLmy#7|VIgu8-SBlf9p19C<>@d1d>x0^@s@Sl{xnhthtMDUm<#9
-3$ZnvDf*Cdqr}P>cC2A8XYWP><h~J32Pc+dl28en!m~?a`SW}QN@Wu?1?TxhGNC%$&J-MgwJ0Y_b2We
-JZ`5Uh|f><Dgii2(&dvCmeBhZ|~r`|c%h))z=w`B>1%-ag_WJbuESnv(J2yXi;JnF^J{ZmTFB$v%viR
-H>nAj)IB#Pk`=*YF#!YdjvVxG;ZFGATvQYt1L{vSB%zIi|;nGvxg3tFw#iGZ%uDL`w^9m?$-MQBM|1R
-?vusX1Ba9kSD}nt4a*$lLz<n6;r5*gx5Q!Y8%*|pYpFcZ>*EL<L@%&7v7*AUgzsSy$B(s;0x5p^BWA+
-szGq(q7-Hw1sm{WrG-tSaA-$}C+>oF*f6kmC{#D7FB(!Ge!#Tm8y9=ICsX(^Ecos4BfwL5&y`rLJ0{G
-OdT1~yFsI5AZ`t{|6o$GiK>llq;UFrmlU_#F<r;(B`j0r^Uw0DIkp4tdAE#mgC9ij#jbS>4@uZ8;J(p
-Nxag2t?=u@!Zm4&cB+}`&+IQ?lA`z%!gnC$j}yZLG#FsrSWU)Tg*KTp#~<ZK4IojCDpyB*e!Cl0oCR-
-H~ErQ?*Q3A}L2@%D{4Ro3zJ9@Q$flH&tp)Pg$hArPYEzag*_T3aFWVRG{E|A3$~3mrM3$8?Mc;3B2R2
-N5_q;Oc!?ya5&#Vtb<Z-DexdXVK-E;Q9~}My-8tJ(74d>)^<;KKZtZG4Y8G(Mx9&63>*f=)AXu)U893
-b_IgkMKtK*A^LXwJ+>XCLnr!{BB7An<y+-^WLwpB&}YQvGYAGf8BkmDnfdn)BnQ+zSgK-+^GodQ6}oI
-B@S4p_-o^G%!}Z16&eX)_HMTD;kOjpY-hS%XEvdA#)^=MZ=3U8b))EcSx(sstI~Db3o|_CqOlCnivNK
-J%jkiwTq2Ha^V9;3WH@5D1r$Mh|TNXH?fEHMia$eBA`rjM7U*h*mdw=N~SxUYTrQs?XiY10K$G(0DVc
-$Tu?x<6rWk#5i+nda?g6mufcfKc}S$@&WJ*H{iin8$hti`^o?yY%+4boFWTYX$x-=e)t&Tgzgkmwt#!
-KS-I!&ZHR!&XPGa8N6EJ7$6l-5|_7flF*AIBXPQD~REMu`@L$fD>W@E6$3<2B8V%3Lh=5@f2=Qo%Ht?
-)M&2t_H~B$1g`y}W7`asJ*#_pu=Ph|E33}B?F44nEv2>RkE?ULE6_8ak25LXv3h;Q3#8=+TdJM6LTPy
-=aq`JGwZ=)j#(;f?R)jd}x%xA%5R33aTpnLzvBANEwWWblE|+%tU9q|-ak|6YX17vcwYiWzaUt8f7;F
-kzH~Iu&S5a-952N*%KKqgM>E4|XWG-+TeB<?!LrLojbBQ^-%^3wHG`z=~>A+4<yuya1dAUe1405T8t^
-G|2=yYI!oZ}L;W?9WD4A_{mqUes=J~noE?I5gSDM2o<##y{pyu*?{l=NXAvwrWc{46uI|6#=BA5cpJ1
-QY-O00;n48F5VCe0e1T0RRBB0RR9a0001RX>c!Jc4cm4Z*nhkWpQ<7b98erUte}*a&u{KZeL$6aCv2q
-&1%Ci5QOi3iiI51ixpW7*c1vay##s*CA|e~*V#lOw(RPsG{p~J$%-3F5X<h)e9WQ+(3D;a=>I*X$pXe
-ZfHCz&N0^?UEARR-bWaffsx(wZV~^$K(37Mrt+XwcB|HMr`03DCL%h64(`Y$Z*{f)7&Q|ma*4ym{4!w
-r8>uP0aV4ZFwBdi@Bmdjy6(>adz`WUb;)aEaa)2yJYAb&X7?kACbGoBS}<;B|h2p!Q^R0^$tH<b2=Tu
-tn1c{$wS(<xFqK=Z{`HmJ<ych5uJ2n0@9u$q22Yk3qlnlJMToMk!OoNVe-jB#Y=c+Lyhy)(wL!+p*mD
-kS*@P)h>@6aWAK2mnzTaZHG*IlB}B002k?001Wd003}la4%nWWo~3|axZdaadl;LbaO9XX>N37a&BR4
-Uv+e8Y;!Jfd1X?;Zrd;nz3VH8?9gOLeCTN~(8I8GLk|OrtvkDlP1o9N$)l*IzU<paNw(8wI>Zt6_(;C
-TcW`)rfZ8?2K9vx-J$#4}r8b+5BK#B3vo9)R8OiFt3T%3>{=PX%-IIGZ4SI;rh9_u)t=Ty1fjiBh38j
-YhVZa6!u6}~!1mEWx>eQLKg9b;m4LA$<!h{0~s>M^hr6lOEACWw4eGs_z!aIzbcd233k{h7NAuz+}NI
-t$Ar|Uf&gX!7W$}{ajew0!Tw!p5kn$0uD2T@_0KYKu%Wx2W1zBcA+S1OPrb-oJPf`*I)cl?Dl?}6}1Q
-`4jO;DmP?F~&HM$e`ulNa)eBj=~5cu_bwC9%JQ-kh@uenP%w)w20H-d^vSUm}o54QdZMcz(Z%GoR3<2
-`1s?~-5ms*nqt?BvQmOh#$&NelfI@Eos9LYZH=o0uOyqNkH-auo4LOf#NOliIZ;K)&!Nk#BF%%_Wvtz
-bd`tCTUK;&%UV>(kBXagMSQBxT^pU*VhS}V+ho4avYA_aKzcYR{)XLV$zOoiYW)163lddJl7rAITN??
-d7u&|exMC>FF>)!=@3!dSK3t*iv`e_}*{luMY#Wg%i>SOk%q-cH#N9X!CW{JC)7JD^p=^!n3R+DKu3%
-R^6!Y?bm0%i#xDCFMorN)urXKwd4W!(}vDlb#MXt7NF15ir?1QY-O00;n48F5S_P~K7z6aWAiQUCxT0
-001RX>c!Jc4cm4Z*nhkWpQ<7b98erVPs)&bY*gLE^vA6JZo>;NRr?6EBfpYl4fPDlL77)!YF{_cy5eK
-?40fF0-Ft(me{g-O_4f2tY`*vzx}GJAM7TZikxKjuyZFMjzo4>SJ%6$i#%p0-<_~Up2+Ne%Ia!)@+Z7
-97#tlP4GQsJwJ57H;tAhWq9_Od-Tn*)cPm-4b)M9z061C2Wmd9kC0JGPtlZ>9#mscL%qw=Ip|ZLZa4B
-brSjtQcc$Tm=%ti<ZDHDrI=2;mLE(5tHSa}(3c(pP=%Y5-5s=;7c<ZHH(n<#!1S&|n~U8Jd;e;;k~JY
-DmQ-;09jId9?88+B>IHbwqv7vuC8ru4%p1nea%g#q%@-QC+8eXW01UCGqUxRYy<*FcTZe7)uM;xm(B-
-Ky9b5I6Xve}ee55F4VInQ)%wrATnY7e$d5PnxPYpizDDbfgbW!u`hf*Hb{e;h$*3Po8)sw&zxUo;>?4
-N<@Qt^Ye*7s(kSUWWNzS`BIwS-o9?|Hb0)WxDseJQO%4%w?*0+qHiwpHK?Px36M9uD8+=$IVg8kfK|~
-0QJ5`|(W{Fe&)&Vhi_g#Em+!7#y}pRwp56U4VfUhnMW)P=Qpy$315C$czyhC5AvUn5xLmBnTEuc0XF?
-<*QGj?|t*mBG5IL|k1;5AZVR)rTL1<#K31f{o?4n*&HR!+94A|QxkRU5%B_G8rxu`5P@(0-r6raEb0z
-7>=uJZWrTr(s<{ZUJ3CoLVExWX~9+zxMrK8@^7Sfff4c9}i$R3^7bHf}bGWHG43z(2WA6a)ec1~7L@>
--0(!+Wtb$BeckkL|&i&$1P!@4emf~n_bd<LPx;`)^taYzT?GxIbq*@_prrp<Eh<i!6g`DZzH3lH?k~2
-asU{L1qc!{V+jgDkXc!8aMkE&JQx@We0zQU`sHi5&1URJo`PVzcWy8LdI2|{o!YB67k4+87q@Wn)EgP
-!UB0=ves>2qu5$2ZgTW%@WyxNGu$(FXH_GRK2X5+3fK$5zFNycropqIZD0w_XmN=G~tm1eC;<<E40NV
-ke&H@ugBO*It+yDV_O$fk*X}1oet3vSgjJ7>tl@hEOqCa7eqL9no?5?OqOTZSQFoRH0fW-96K@70Jh2
-=_+KLPeYB--UOMSuupu`WRHjWIDd1{TB==JB;bb;^)bQ=;hfV;kxZtqU(cvbjJpfIS1u7D%<}DI4Xae
-LNkrzpMlVECt3Q>Mq4EdTk17LVz^AJV-y~TbAaqG=SQ2S&{G|uu>F{dIg}2N6>^<91w<)g5AqUM7-Wi
-(1vriOmhy5LX*y>g;-8Mj&x*XmiL(h$S3B`nEjx?l|YfI-lW3WL$%w8W(%|qE<?lGJ5{paZS+DC#Q<@
-LEd<Xd41%`pN-kDxff6kh-HIHH{#KKBD>Nhz<%T*#2#j9el6=XfT<}WhohwHYSYllRf93*)P)z87&Ee
-|#8JpKx0+A{FgmAOHF<i>q)>*d0am5Kp_M-$(f>zeW2m#G8wuO~N(vb<R5FShvU45M;lFU1YkPZ>tY*
-PB-h+E`pQOnw0<rUb?6kHuhWTKt4QSb$ZdTkQ{FwT)Z5NvNu7|zO#Sm1Vmf?{1p2d<;-8Afu(o;jw+H
-)``*rqv0s3r8E9M!I0Ug~I!-qB2VQy~sqt(-Xy7Shra6g`hb$VStdLB!>wkqf}#|;!MW1O5u-NT%%-j
-3Yyg(P^FN>9W&c36fw$U)E>7oO$lCI);t9k0mm1hT0jhhTRFDqR-wdx&|g5)6bukML8?!H7CFdwsdsH
-;1vDpi@*HL4vU)v-iTToy%1MQ2irPH~j~8{It@)=?{wx$E_#xNz+JWdSMwW;_BB^OVINgH>vt!IXNSe
-do^lc_Ms-%V8_@`A~rwQW~h}j0LK8O{%8Kg5xK2FUur2tDVQy}iEt6MOi`9r+{r>|2x1I<MqQ$>d?#>
-`DvCbX3`sVf>Eu&ZQaSG=^))(};q1<}f<3{b>g?ogL_ol>x+K_od~n&lN!xtPK=gjd8amu#2U45LtX5
-7JhryfB84<&R1t@IoThPDo5FEM?ucLa)RdSKS2IC=*~QKYpZu?xT@6B*_N8SXh*6LoQx{OXy0<JO%1b
-8_%b(a^=jhk4BOndO0~kd{;u0Hk}%`{o=(7gQ%gubEkyR$W|1zx<G`|4B+knQ!|KMgX0M0?0a`=30X>
-=Riojmsy5R<{&5KYb8IXU{U665hea93u*mzN0|<r=VP{KukKf|9RyG&4at#CVwjM#G8h+@B+$J53pS4
-5H0BCpV?s!*CXRQ#m4;W!N>%_l~*N{sWE}P9*3-r_jjhl<S2`bqbolYnqQ32-I&Vg)F90nnx><x^x%l
-QTnO;fys8NdAM-%ynuQ~RO&t<c#Kt-jFNLhA?yKx|(M&CskfqxH|wNTp~qhe<6I2s5XiHEORv@z$6q)
-txo)#;#;ShFn(Q(z<y?LD4zIDx(o<4W-lgMa!|eMnV6WECXHuTho_Q!w!x1c_@@V3Yd_<F9(xj$hEU!
-1(utFIPkqZ!O{R5ddwZFxY}I@T=s&y5#O;E3a1=M^+(Q9zMdx#YS$T2aiXoTEOF(HTs%MkHFsm@KI!T
-eOMA!A3eqc{*5rI?%MnFlqj6g+x<sdWZQ1MyMp$Ae0lC~$JfM#fp|+GdTnw%~VcxPWf$W$bOz;VKC(8
-%xeF+OlNb-LsW|^SKso^?VqpC%NOUo1EzR+)D_y%zt_++YHV1SP$Z$JpWrc_}_W1c>3uxP5nRR~5Qf&
-ezvbMmt~lx*UD9S1t5g#EDBiM{yPO>@6K3Uq*diy+Verz3@zWSxi>8N_Ra5Pn1kK^A|6$jDa}H{?*vo
-w5t8im?Z=+vWvChsAx3F*+RwB#4o;3@4<J)6BBk5e!$gaT72YxJ3%0iaw;fSb_AEC1l7Cw&4eu?~vto
-t<KDq-4XDGrkAsj#>@`X(w4f?Un=i_30EbYmWDO@>)Ejw$Yx>{yiU_-Ku9xH6{k^2r*LQM9{2JQB!*!
-84)m1vF|`@}PGuTI1>Q@CV3A;VusSG5QWshqXxWZBOcfRY&MUSyx3Szawb^%YkgHNs3kG?pj=S^SR3q
-5kk?-l(2PgD1kfSu;g8YvoaDYWsZe_I^4XJiKY`H-cgN(1S+z2crD$Tm}{gE!(KM^yy*R48tv`r~P=d
-!_UW>M_U)F{u)m+p|p1oXJ=&J1H64sqvU2i_g$E4p`kU*xVP=|dWy(E8$+GsZufJ(w%r>ND@xKL_!h@
-J<^SO&X`zCyFXo#Z)KYqBAa2x}VS>-(vrn?traoRW+k0SY)U0(X!0{TalA8$bmpfohmR`CSORZ-l3UM
-#SYkf$1np31xup=6W-mt?hG^K@ZVDn9CsZkbt_!MVV9)fG-$`M3IleWghNwn;9*Ac3%X!W%iNpC>?{S
-SWE)O&u^L!`a~RCw$lJ)90jQ{DP!v&aG3J?e)XZ5`GocLy=bBM_=Z6ol_rgOy;&0u-5{XX|Bz<IVkGt
-#XGtO(Oz>kj3ty(T65Ef*jmKDa^Br?EfmwAfk6L!>r>VJ-;IzlDsnX+F_e?5vof7iTfFdMg+2O1X9P0
-$lG`or^!8>|ie=ex_Bi&w)S70j+>naE<_rWJG^;}D9?^-ynM*Aca+#;{Cic6VmacCN0kE{1`D4Q3>{p
-IP6RZmBHyG(;d-VzHKI3qjOzTPS*|gzGG2D)dI*pMD4rgy_;6_w2*L)NC#BS@<2I$YmQ6T7{4zc%z=I
-4s^idn@)y+zD@;voW{YO+1>Bkm>KlN`vL&pXg?MeCk@0CyCgPEZcU>A{wX(p6!8+rVll?JaC?m3_-}L
-R#Yf|XDS)t9k`v*mfjR_vYBp$M4zI-ao5UWW-h?OjC77g6opx42pZsbPbXO=hesEK?8z$@wo#AyD5Om
-!Z%*?i6xCQTH?1V|@eDQ#|qDG^vWBek9=wGR5S(mZm22y;xg3aLZRv~!ldS|;gXNpSSsI-Z<Cv2#04s
-}i0MdS^C5X__(81kIRrt>PWOp}QOy0k{EW%XcK_m^MC-m<r%Vx|u*u!^~*6VYJD+Nh1wxC^J?TRQV9H
--URZNqyUl)>l1`;y4cAenct2d{>FGWoj%O7@<zu@LQA!<jH7Ay}!eKxn3B6OSZEFR99@7>4PK1b<S6v
-+D)i4t|6Je?wTNXoqw0A-q$n`mHAq=9|Pn7!%Qy^Vcos$<P0h$?POqPXk#&v@y$GKF^Ty7T~Vg*iHEW
-kzhs7qN5CXD+1J6Q@gJFv*$fKM*TpN<tdt+rDsyHJ-A~GD2Oibwm&up5i-xQyp8F$tI(;+kVpr2uiG|
-moJyf->nb-e0a(OxSG)|QPyLAw%S%f=MN4lO$snKxUog43~iBMfOP)9-X+CqsQ>j-mGJAr@uH2aucqr
-fPn?ZLlbl-rTn^%2G%U#!BJeqSFxew2w&1EYHs`*ak<y<H#gN58F-IPmlBPp@Q&T2P|=@NB0#en8mt!
-CM3Mye<lnRq0N*s1U%?9zmFbE-Dzp0qccE$gLYTbse3dD+o9mHz?eml`@=Dcd3yIu!{}l=v<?}G8?Jm
-kM>ETs<;|hmS$RYh{UbdP$TyqEwAVFY(}L55?xPFW@XJEOqUfztw3I@mKMMzg%E5lO6(dzE7f#q!kr?
-o?^j?Msi8}23xTWCl+4MB<AIe02jYo#AY#`Tm~17sux_pJk^w~Q=v)ipV1{ieR1{KZP+`Xc`>NQ}7+8
-n>zqz6P4H{#uK|X7lU1b(ZtY4U~NQG67%~2o(N*;lrW!DH}^LR+mgBI7wjBk0ZZYb;ISRH5lI8wJAJ6
-*;KL=vOTjhhfaSyI}AhWRfuW@=V;evO=q=|mzn*s2C`yF$Mwh`Y!t^R3Y|RWsja23B;Tg^o&^{o0_6N
-P;3y4>UQ*_EE&7t)2C!0h8`MMd5LvW1wwth_;3&iH(d~wkFWs52AvxB$`eW(JMb{`Y#(x8nH7n?vKx-
-Q)RiaU(Z5<jjd4R=T2weyvA}1OT|((Xk%kuArn0em0droW^~v>b6Y>ZP=Wu?m>R4;0}l=V0wJI|0!6^
-x15lehAbCvZ{Ae6@oYeYgh0Q;Jat^fn!g1f=;i3)Nv<v(Xgwd!B8c;_ljPFu@R<Rg%^H8b-2NUeC`Mq
-2qC`d}xfi6eSCwACA(M0w+1R{$H<1zA#szX(K#DeR7O`c%{z*$v;B9QnP+~l%}X|AuXF3#^7UrQeIpI
-8>HkJ3dE!!2bln?34eYF~PQEDwrOQ$lchx}J6j?OI(k(>JDik@rIiAWzN!N?ypH>1<<&ho7w{utxny%
-uo6l?7P-lWAtsF82bN*gnsuA39;sB4*O`c;!v9g-{$clZwvMq^=pn!J&67>>hIw3p~EV|j@N0@@m6Uo
-9G3eztJ{#ES`oZiUQ0qNWTp9TD%wdx{iWPUQV(^oS*+^pfr=C8&@ArrJfXv3DrSRJ49}Iqp1c;>eYF~
-*aG0^SUfWY;HA<!Qpp|Od2W8!lCZ=kK2h=o#&NzJ?M!0VXFxouxz|8QEpFrqmYyXTj0Q(?#;AHPuxyC
-i$>9Z%JBTO9=(F0Qg0Ysg-a2ZpmBmLy9MfsQ0UnBOGo<w0I57BY|fz^?jO_Vh13af+4DQiQvu-XG*o}
-;#E6J{Uh0Y|AiLG8(xv3KJRBt?RTXd~F7TP*8gzRRI@xy4Nxy4AMNaM`XvTsC+&!q|~8(`TS0KXASXi
-m#hoQ5*A($hyr`_)+~oGouIUXE@*hI5X7j;7wGvnX7r>VWvf^rFY@M;JGD+#X9x~jsdcx8A9&ISe@86
-c2futuq4)wd*4uXLUPDR^CV9Dd6w{K6F&7>gI3!Go=WNS;Eu7!Pxurcgk!}^I`vX^SwA{~MaFigrTJ)
-IKmyZ@9(2a0`8IaP#>R0NEt!R$kRNve1&yY=LbRzXz3I^*;u-q%ifiaoKFCeX7idrI@g9Y?0qpUEA)J
-z5=h=>yV27Xb=-aNEH1dG<EN-WPd>GHT2T$qZhU$3$LX-@w#HUdT#zT(B@1IXUsAJIP=&);A!(isazZ
-HMWhKCN9-vn-Z=qZlX<AW29A@NuUbI@o{%v(pAVa4tfX9f31;KAD+2ye!oNB{N*430|G_KyYYdA(c;a
->kI`VmiDBlEJF%9fQu=ZXMLqc6iujv{Z*C>v-Z0;z;LB9sQe9FN2YDnaXOXN*{Kg|7y2MwFGP~cskNO
-tkMq7eI=86auCa$kf4OU9nI{w2x#&s;_4sL#K<#)?jCrDI~@FkoKA3XmvxG5VP+lUF$`o+D_N<7sUn}
-JV3im)cR+lO$r!#XpjBh-fd#n<Mfxg)DsxrQ+F}(cGY{<{B)+I>o-+H&n=m}fa&?v$mPuNw5d$rvBkz
-4n=GpOxV%RZ7!9`1Y70RtQ?qKL=GnZL6xzMY5FQy8_*nY%lS~=RU^P$-RX8>fqesw(s^Rv#$`aq}-2K
-)QyG&-Gv*%9pc`JbLW3wiohA7Qg{_l;ORUdSVhMsy_h(PZC-z4uA=cD^;V{PLBY*L3x+(+v5Fb<A6r!
-i+;+%?p@=&yTt<ykL*dqUX=a^rgHKfy7GTXuy9S!yW-XKzv&-g$oGqm&11W&<oe)Ll?rxl6d00H*WlS
-HTxRo7}q3tkxElvCzgE)pWNZ?{84ys@%o%%*ntPE6N>&@)>4;xDLrX*eA=RmYPR|xP)h>@6aWAK2mnz
-TaZH$F=r0up003PW000{R003}la4%nWWo~3|axZdaadl;LbaO9ZaA_`ZdF@wGZ`(Eye)q39v=6ca#qP
-2_3_=qiO}r&rkOYl`J+wtdOJ|#nBzhzj&l|SizB`gqA}3ASp$}_N1GWW;{O<0%?~bSEu)VbnnaX7~Po
-TE5?H~D0ulMZPv!2G^Yc$pj#ZvbEx%KJwCJSkxRC!$>$Z}a=iIp{A7YMJzF4#Xm9`<@krj~0h=L?%aK
-O4Z#i|=+|x`tn|s?aWIxwL-{dr2WPtPCcwzZBU5cVaMzaB_SwKD`*jOldNw5puLb7G~%i?9H?)VaOgR
-ZE1rsQdOqc>*Y9u;C{a(Gb)dv)<q0kTURTg=Vp-ffIftBKs&6iGxAteIe}C;T|tr+!k8ot;lRsqv6oU
-%yfs-0ElTj{N%(h;G7A;1HX%|_(+`;0;qC3@R05Z;Pd<C2`!&R=T3QNP6azSvnY+|$Ah7A$B4tFu6ge
-mhvT_Cpk`_?Nl=9Z<rp1n_Tv+jdp+XWpY6i9@9T-T{H~lMI$8ar*8VB#v6#6S!6zm6?E4Q&Cy<t9xy^
-Aqp%w&Pvg}lNLD*MfuXq=v^eC=#J=IaNes*bOG!$t6)Ar~le)E}pM21k?0IUM<At(lc1bw3K8DRm|BE
-;y5N;GX>=^d>2v2F;v4<aL@xl_)VvZrI=Uh79M797xl@I!j!J|4!3^ugAKul1y1}8D%-qb0u=`1%J}?
-W*=c@qGA;Y*zvdMc|YP6&PeQxkOzY_jp6$Tm&6cds<I^O_jbL+h_<vw$u$8#eAf0Dvf5Zxz7M%}9;_C
-q8K7CZ?Uqs)lKX=%pw=ig99c01oR+WwctazxxxB{8*>`OwO}iEeRzObq=~Mv&36CrCT>3mVf^2P*Ea+
-)l%WR_~1X0^XM+f^g>&Nj!dx@JVUA+=UW}`znCn1dvoO52-yt;#DWr?b`9mpfKf>Kn}Sdg5~T^X!|w5
-?YL^)>2N!d#JU08^ZCZzqbph++^-@r=Y|W1r7N<19)0gk8Bx@GivE<VAi%gugq0m*L9nr9RH!ze`B#z
-QbpDx1_^ZQK;2>jk(lZ4xLC}DOI4ThA?)#jdE!me?N~WqqFnL@!9Fc==|(rGCIGc@BZZAXmmI}8BfNe
-qw)SBG@yhwghQMOsv^f$noe|0RdU<aJAO>bc;^(*>W}-{N2u~rESF3vEwd_91>50d@PQL_$q4ICdMQn
-Ew(dZVso@}}Vd{gAxrwe8GFwnh8yW$;RJAG$myKJz!hqDK$EB#1LS$faase4?D`zqj7DK9iW!+<<BvJ
-bQu@rXEg{2aJgMFCRRqj<?8+?#oA1m2HQFdaL+!=oog+Xot?5{?%q#@y^uAAdbmL;WzJTKOet5wC#5A
-$w+r|>r6FG7GEg)0bCKvqab=H<Rg^oL6<2SYfX!Gz@*LqFoD)T<&oUZVkRmpa(eXlqU9-pzRsJbu|+?
-KMM0*ue5ipq=oVWq!1|G-8fP(hC&t?d>%qR<q&O6S@VvH%QIY6;VB~uM2CJ$!NrXQ&|m_o{#2eqd`Du
-9fUVKFJ8RcYo;=9`#HQ?Qzo0f8u7swQPPO=(j|h#K#jxH^y8J~CP41cS)mN(oWPnii2+VrE13gH*mWA
-CvMVHYs3qQLjiv({SLaUd<eaK?hQA5znlMSysImcLUDEi%?Yy9)8eHcVGzrqAx@IF+yg_j_7@sJ2a5r
-P>@WNm82i)$$-K3SZ&uMdi*qvr~Zw<A(-N80YzeIB1J@A9#?y0Kq&iJc|>5DM%Qofojb|>7gVMKkq^)
-^J7z*(?H(wNuHdkHoAG!5a=S!=}=nlD~F9qoE|h6Zi!yHG#cXy;TO+>(4Lgmky%!$lI_SwaT=-`z}mc
-1{1j_nTV@t{|LFUpUK8kNQApwE4;y_~!BJF|r|?_1}n&!JVb|GtE?fjOL{>p@Z?P82T5#%{|`Ac>Map
-<UjNd{B^(H{tsofDHE1LBNHbE{t05>pL@hp-__1Tg1P*rm#3tc`aZeb(TK3w;<Hr3FLU2?@`QB43it%
-2<XE7^N6&o!n*a1q{Y@G@J$KLXe*sWS0|XQR000O8Q5kVe1FiCsL<;}_044wc8~^|SaA|NaUv_0~WN&
-gWa%FLKWpi|MFJX0bXfAMh<r-^m+c@&Oe+AD$A*r>M$F|)fSYwfGvfH3-TBKQA54}R5ZQ5odiz-RQ$u
-9PO`_1qnQL-JUw>aG4&MjP7oEPUkWcSGM@sLc!lo#`3Qt8?71-|L^`u%=Svac0WTBWqoi{3xNPp@~i;
-EF88w8|Oa7n<@y5xrmpfmxyXglaAdvY^E@XHt=wkmS-+H1vCXSqiC%Q2t3W|D^e{eqK<u$oaTlT1ZAw
-VE<x8WdT1`uQ!uoNyb#M=TC`S96x``3fLfXtLa26ORD{HCG(O>#Rf!aIWV~JfW$qtxaLfGaCWODo#@Q
-H&a}wBQ0ZVZUT7u@nrD^fd5r@w1?b|2Wi84r7$ZYA<v@A?n`5%qd-?9->g?hwyZYPvv+U=0mv6IQFW;
-P9ynJ_hc1lJhqGg#oCGX!3SF6<!G`t+bhU|W)QJciuU*BAvXYWrguMm4#<(dOmy>GClRMV)}>rL5=WS
-|5-$<U4{aa<|f)Dl!wQl(ZxPLtyvfe+a5lIco<;VJnEk;n-k5xdRQm>A*qNdFv+RDia@MFc4;4G3dCA
-BsEz=UFbnUkLb$79|lg!qLW5J6uKYl=%%`;BsTOpf_AplE9B?wH%W%kXtcQFg7*RB?EzPm_r9*V>Y3%
-2~sjqg11u1z|rzMkP(@3o%S6pe1_yrbxjquZ`}K<1&}m&3kF|G<baO6mf-d1`QSH`YjDG<BG$e5nCD#
-IIec_|5FT8V<oucuKvF3&5wzlY4g!KeOK}4m09xOr2k^(B@);=v_^N{7(zKYcz!;6II&<L1heC=EasA
-p@>p~Pmi$FXT$G;FH7sZ@Oltfh}x}=rG2Q2BgX;~S``<#Ik82>lSL?$C*{Dn<4xf4}%!;HsRO7ZUpf0
-2JAsI?9)>KulEmd1A)gmN?h3n><iN;0d!(HLUW8^Nbt8l@EDoGn$_Ptl*Lt`(IGT96PhY%b*8=#+t@*
-zozQRayg>)K8uYgiII;NpFjJe1!Zt^LQ%%!{(_|$)7Thr{c_06LoPn9FntQ3R;5LqB;Dm&9*V3fJ9)c
-!1VqxwV5@JauBRIjFL_C8W(8O3uN_=Tj*it1zb$iHmgSD$yya@yr-^k@i;n;(l3G+@usAmBq^enu~m;
-_CQSzSJfQ?kazHSN9GJ7%8oSB(KN*iQFeWKea8N|XN(Lr|Om2(@xtU3jmSC}~D}gC5*#vO1ELJR^4M?
-aWNjVU|5c=HHV$(Azg^VLpSQb!qq3Ng;=5&H&D7aOMdUImGy1IIAbcXP;-$Wz*iPm%i+1vmIH7jUXz=
-zST=OBC?V9w>!&PI5_b-j_TWfDIKl5X&*HoyiK3E8o)H8TMswlwFgnCJ1QRzP(akI0;Xfgn~4g#n5DS
-~LK~7u|H(5o;aYuX*$u`*RYCUa(!FV<JTWWMV)b<}s;lm((ZYAwu%sj1{BLpu=t>)6&JDy|<(*k8JtW
-dns=3j8C;ZY@1^l@C}YdALLdK*{$I){I~A;l+QuN2L+M^{V$Is53omGGgd-&hFXI~tYmU%X9_5@pnF&
-mlFmC6GYgVgkWn**q~=W=xVza5Q1vK=li6Fak3A?&3Tvj5Lm4zqbN(At<S&@x1eB9Nx*FBB9WWM|P+S
-)e;u48P0lUrnND&M+b0sUb3l#i9XN8do3RAQT+(5#dR29hJU>EpgVYK@DAG-icp#TnZ%}xobW%l&o(1
-cTsQyXbq@q7vs7doz+xt#kg83YxSZ<wS41){_H=VPhwN_LC|zO^326U~>{lx*JUr^o<ApKAoK*R2Q!A
-VByEqtaIJ6tZ+20Z7z@IL)E2;(Bq9SQf1Y43I@hA$oUVTBraG2X~l-XD?dXcP`ur1ip`}ZD-9wfupyl
-&l-<oxw;RyeomoP2CF7P%;j`Bo>G`sm8u|pSo6DM3}q%fJCH*NQrj@&Oq#PBmWQ&3{G4>y9<RS1emMK
-^A!-YY-nX1SGm43CJ2C1Q1pVY~w~-7#x3J&ax{WmFH-Y~B$EA07j*<d%;0v|n*6u%UV}w@oat69z-~N
-YJCmXh?7W6;2MPPpT&^>xV8}EFL2Q1cAh#HXTaRVRsAF1O<s!tw~7?+Zy<<t$`jZW>PY{$YL`S|gp9V
-DB!m)tSkD810Ii*DL0GjnQ$HO`-6#h9}i!pBhjurpW09pw!x$<a8xaP#BOFUisK!{=nR;FAStLR9(Gh
-ywjJTbAww!*D}Nqnc@IeuK~V_xqs&>UH2J@7lXJC{Ms)e#C*M4cVyU<PZbiXc_)SM$zpi#w5?Jz0Ao`
-jc<^BI!Eq-v0fQIja^R;lVI(ry>`^Lvdh*R(_vF4cNX8UM1ool?@4ew3v7d2OkmbE$vS#;@ZuJAa6fj
-_=eRNYe(+>#EGpcEfxI6C&vw%Ze#bkA36)lo7E`f|Uj!zY_;MMy;$5}k{nPQ`^Uq0WwuhzXu4A-a5mp
-Cwj{_%0()A6E#km{zs<aXO`qYvL(uku5PM0Ks3ji%s<ngE%`f5{P+!I7DETyW<Ih5T&x6d;K$ELCCd*
-P28ervhY3E&*Z?`z<=8Od5W$&S5w{>eQKZIhn895CkxLtf}~ce32on3{jPxz*)0Ea!OS4NbPI{L17xd
-t45cUi{b`s^Brls2Pt(pvk^VJ?`1Ca?g-g-BU#V-c@jfDiVdV!1rV{r+3U$1FzSX2ip#-tw|#(X4QdP
-uDRHs8+)#;Bx;D7O8q7zWGm8EDptES2@4(KuSH0J3~Qr4x&-QYGJ2%EM>gu~xM~u1-o|MnH<7xiMe4z
-TX5B86Y|14JqkhsJkjIbl6o0PTeg7p>Oq2FFVNxNJc!A)_s5G1rV3RWCs%Ek~pLfQU!!>zfb(g61^A)
-{jDj2`L3lbnjw8SedYosA+dSEgaV-N;uqf0;L)c1gwj>zVrXOEoE8a~i;U@Cli3(ehBm}hg1*g$_^j4
-ZS+)$#uR92~3~<K5i8=hi%MXx5q9|L*(mk3#ht@&^axhY@HRr|3#$7|G-Z^6cQ?U(k1m(42?_9Jh?4Z
-ma9<-X6JRD_+>lGvkoy0Gyk%5qOKoB#_g^%q)+^)Lbd8@QSHJh2tHkxjMtUEl1C(r;{^N{~GC~im~fW
-<s8HaDy=y!BBSPb$&Pb)r5If1;t63CwToS3eaKWKOD4_53TH0kXFIk2135bGeVd`4bS;IKxga|;7rUV
-2SURaNm&|fHS0h+F|K;M{<=M-V4`<0Pe(oq@?MgNVPN}NKaRh|zZU;6Gj1I#lz}oC3L;;SNcsGvMo2U
-=T?1hZEh>?8G3*ZC*1>^^CiVg)lFU&!m1TQ-aw(=IYeo#3&3Xj3S^SXZE_;%ms0;Ytv3QEaJV}0*B6H
-(rEU^d@-$B3HxmxG3cd8Dg#J}G{|nC)@e6go;YYxkV*8ry9;$64!e45fMyz#pwa2|t-MI%uqsVx$@Qf
-@Ir4Nf#Us3-3}|mIy7^0KCmchHY<Cj>+V`?alT))y`2n&W<5F*XN7jk*7I+4Dx?ll+8z(NjvASAdk}<
-C@tWOc!%xU7<J7{<Dww_jx4%uXu9`!f2;XrZED%Jv+ho$ThAAz&7Yd(d9Yh{J7J|JCmIUqxYEqrO?6Z
-LxxE&hV4y>8Z=a+?zlm3=CVZ#17W>>UX5IM5c2zR`&kpqfZ|VRwwPa}iD}g;uA7Ej@nFWzLWZHGdRhy
-cw*`_~=<~mXYdmSx0L@w4c%)^dmF#zTeBj7=Jc^B8MaOCFqrnO1F8OgU+$+v~iz47yZcE|QlP)h>@6a
-WAK2mnzTaZClF+Vu-M0s!zL1OOiZ003}la4%nWWo~3|axZdaadl;LbaO9bVPj=-bS`jZZOpw{lbg)CC
-VJ1WaCG174)tDQ9u%=Jn1v*eK#aOM!7L^rF^J*UpF~w<m;IHO*SB_`IPLIIPBN1OK|aI#W(xYB-;}oP
-<7V@X*ZxZ`>%cG1S$g|s)OGibXTKdk7v7%#+4|p()_=Vph5qNab06e!*!{cB4}K7rn{WT)uTB5Q(s|r
-uJ~)ii7(u}pO3^sMP%uT33=9(}jDtF=Kzx(3TN*d_CcA-wVDSbgHUzpshz-na2xP;cn;6*y)P{&Q7`0
-)NO@M4@YJ)Nx+FwqyWs#rz0LO!H!;l*~*hKgy!8c5_A<+%$Z+v>g_!}D8ByVRxmQ(ro28lK_x?#e%{!
-oJaxySg`5dv>;coXBBAlQI$hSUZ}HzBi$v8Bfd+aU4M@6w&W!RbvvZb*7VyoM4}n-CnuHX*2)Y{+ow5
-CcuXQ3m?Y<rgQ)iuR2c4O5X6o;Af+DWocj5ScvBmT1Zj3dg3(fn#64ILYe#fzSs*_jddGqFkS$#_FQP
->Fi+7;z4B#8DbGj<gO~O7uG17tjndE&9Sv9icuS&yK5k6_X~=r!OiPJR2)TtJ-*dxO%B;Tp#alU9TrD
-<W-o6CR8uT|ZfsS|GvYZxH`!PkVB#pSger)mnzI9>3Y-rLCr}6q(pTY9rb^++&+P84Q_p0JounGYAPt
-^i>-t_Cxosdb8RR*m={r%c$OL+DwX15dgOI)|9mF9z2Pgw8qQ<F4JIMO09GrXiYP__CUX7*Q^ZinWG!
--+Ig=PNykk3kh3A)I!y2Y}%!U+Sr9N)7wxY@ek3%!4V@{r7Nc(qTS&oRT*(qG+`?OJ@ahsqZ9GegTK1
-FxcL9_MHtJ7vEjwag>^W~$hW|GY!v1fM6e4b3gPtxb5Zs<53~YaENts>N9$g$Vt~Q`q`gp6R>9;4)@w
-CVzAbZKjLu9YUNYZ|j1z^8ybBkIv*W*cX^|N6vVl+|+7a&{OX+Sz?_}yB%J3K^V!TX~<h62R}jW%{pH
-D^pbUU7icyv-JOgK)BW-IoOYac3X!uZ;ua}WL#!Q~1LsXdg!dyl(rMwhJIF#weZI9=bSMXd5HrhBo!B
-SGrVuM$O)q;!k{?CxT=>RKXLEhv8!q5V;he@2!DuwZWKvD7n#sB|>w*wYY^s7MS<dwwJW?z!gC{i-29
-aA2y0|>*T+W`BXJc!CdI>E;oXHBTzFn&v{8l;D9gZ{781;NZN8PC|^#cZrvw5!9>zO&vtj49q<62}gG
-r$}KK4Xbxk34uuSmbuPB_e~u3c98akL;P7(q7mj$!TnF{Lno0Dz+%5aUZpDJ_IGdKhDsUBUdxhWIj+=
-11aPlVg+>5JR9?N)u{rnSKc$rJc=SY-G1I={t4rAs2@T}wn`!uA&l0NQnT#IFu0p)M3JN0Lc-YUagy^
-jtx?lNcyNF|o^$e)Z_MGkQ!cwEEfc<?rs@Q-foOO75Zx2vevpeI=E(Uzj-%I8`)L=q5`ylB=XHCn@W&
-{5V;OO`%(I%6GgYqTN06|8@Wie(Fqg+r#ACeJc;NQzFi)Jpiml3#L~b>VX|45!3=^h%#=MKWXWhtyG*
-Crot6Irj;hxf2*kS3U@K?;aly0^b^WFY@x#R4A{ny)+CThZ8Cp74HsPz-v0HFB-k^b|Wf&L!1{`C%ik
-6f=BzlAT7MroQL2^v9(ui%RTb3eYJs0|e_5J7+`A0SJz!Qf30ZEyfg@Fq+aG>BkO_$7Q%#3qI}ez4#N
-0-%N1AOO3l1u9^GW&lx=O%!b+a0dE?MgR-(4GK;b{|3H7e?h9~H2?~KwFl#&7rY9X4UBFua)XAOgxN#
-@wUP~mEQskN%b1bi1#1AN@C})4h+u;+khP#HXabHh@gL!<&jEZr_J4sd0rx5*g};O^QxL)IfWN^PKdP
->Qj!&<WS_>_2LB@Tb^A#RWty~$!nKeG3jsJvB5P+vo2i2brf@8z>8fvQG0aOwZRY(Ccv4gXe<>IRh`d
-*lGs(NOJ?FaIV(RYOT1z^&{nLC5VrV4J$+a+Ap{ZE(hesDPkQ1O>z;C`Kz@An0IzcC!RF#>?56DxoUd
-d-8MId&hMb}YF%RCHZgHb3s$m13U*p3&CVtw4&+=>R?PC>d`n8K#uM)dHqTBnmsaxVQ6m#Z^FH=@hT9
-ZWZELYt>ik{0R1E{}Mm;vFco98j9;f^Q`B4OHR&CkKOaVcyQAS-rnMMmaY)?HUwppOTAgQPt7~`ad%1
-LgU;2L#4XAP)R|?R31<7;rYgV7#9*ImXX>0L`bd}wj~~MJI(2sIVA!?hE3r;)W+~ndJ9%#?hdF|H#=X
-p^+haG>O-O9zo6)zE`mFK203QhcU?%;bU7x7zJ|qC1lV=<icehT9;ck@p-G}DKszH+Y!Tb008O;}$VW
-x+}nr_N+lhu$X(tL1(dSz>ppVAXw;WW<<BFp+m?k4aYRGDwYXsgpNI06q7_!PWBSm=rYn+q~=tOe);f
-Uud3-s<9_l<HQsQnrwdhT*p59$ZIUx?SC2%y7A8_@Je)4ib*1hl9yB;QG@Y?v?)5fJ32v9#Cxxc;W`V
-KW+2!v>hs<jCf{R-h+dyOos|o64>N**0U<g0_&vUHNn%!y^KRV$h8b%Wd&CmmS9{ZAM&5U@iR77o@8F
-fu`Y4nppM+W7xlvfms@BDubm-CLmkUzVb{=PHqb#O2By{CnF}p#&jHsTD}j}FQuip7f~xK++<H}ez_0
-lA2%!uzYFxwF+Fd@a1atrBI-5Tr$LgRd@`~JhHy68Xdl;Fr(?bgM#7zjt5DxLpKKjoyRCg;ZV+1zkiq
-HtzE<fh@!8c&LxJg`KpQMQBjcrO?$?K|LYlOU$DMnsJL&B??H%1VfJcS^*Jq;Nlj9gmrPx79&+ciaYy
-`mcWWUnIg(z-c2muy%8igBN<^`o>7M!(b76l8KaytWUQysAc$6Hi#3d#e%IF=P{$A)UtRE)~1B)RpnE
--V*##<O=Z_$7w8^hxBh?qYWVFg-v|vx9vCV+o=!AEc|wAvI;QEZ+zTzS(1f*m({m#Y~Nk$ChH~uVKN5
-5@T2+v{-)f*e=LCby+gC<+wPkdci?3z*8dUyuWty$FyDS@@t@zMy7}h6^*hJWx4w<P)wgo`1%m%?9_I
-(rFHPEibBv$q01A^Njgt(CQVdR^7y_dNj#3m&!3YgABnirJ<V$i8MvEQ<sP0pXcntAH62755(4RN}SD
-+{X%Dyx&%zQ}>03kr54II5xGPc2k4asa6&{?zz0K^lU5ZhotlA;@e*ib-#!W$-7G-ycvUfTj%0Z0iTD
-?m8|i3${Q;xCQSWP=7vAqp?T7RcBz*!aZqUm#-vb)cf<C;>z@u_1{Ur3jaDKpm)HL!sbu{zMK$c>%jY
-;YFPflJv5xXCmt(w=cx&xQ`k4SDD5EnWie+y{fkZ#J`C>SsZq@HH)swS@JvD9_`AWeEWs*ts<7aH{s*
-<eOg|$tyEr0D6GnN>^7#z)c~Uav+6c_hE+Qra~A)ote&s={>+X?vmg}dQhv094m`IDDz#r|h*2?<B1=
-dl1Hi6I^5W=V^3_U3X8K@TjE2bxA1vhb-pQLZ6}8rLwOJ9=)Y{rvAeXr!ag*;L*YH-PI%-dmTvooLUB
-SOkz<;>NHR=G{-Jxh(EOcY5&hOIO6aifkUzFutdCywTVyfv)>TD63S^6J0aJhfbf9D4NxP*W61}^sx`
-tRJp*QfB`xq-|5gWhi7&$R2GvM#kJZ_<H|IojV=bO34Cky)u_Q*z2+u36MryLzEFh(u?l7mAK9VpLYi
-I^lZhV2E-8W})B_AfhE7R~gzt`%1dp<*+g}fcVlb2zgd?G>M#i<Nj1s_p*njjGA>vCAIwIHnh0g@dWD
-b&~OTRxrd6;3d6&YnrGU>?t6ulC&?Z~pLD5wca^NVa2(q^?N#MgV_KF2lE<DfhPc?_N;-2D#Pch=pjH
-oKTGhrq8N~ju8q&J4;tNVNk=(5m?cPrH0FM{jyH%v5h1=sJqGiS5$z%t)!#rT^4xJxs%zqw8-S;zfG<
-Sr1&tZbdG{%uG7yL++Y7uc=yft>FLx(MaYrEs<^iWo1giVBRw9EWGJrRwwGx+_PKZWZ9T}|uW@NcLYL
-+B)(uJ;0t@{5Z_tbL%JE*Y&vLwED3GjA@9yDZZptLzyx6}xjsBFRyb;%DsPT-6v7WbWC8JfciW&kfJR
-!!-{E)kZ@Ump(l_;o`uYBlMPqjM;ZJ>txwF?bdjIRU=FBd1&q7Lq3&q%i)X`)wp-{yz>LAx>9Pf2a}P
-*R^MjkDz53XeBIUksjDhOw+wsgfv~(o5-v7Qp6uMLfyaJ-b)|D~FLica3*!*Rp32pfb`63Wr5<Y^orb
-P?vPEcStuVH;+(G6zUrl0q3d0mJSgN5X9kFY{?@-vy2{=w2^SW+rsed3%uir_tU=G(KaiGB+6ZOAAPs
-Cfd!1F(DarayJ{0|hy>Hh^l{&Qu3@WU|tBmPme=1=GUXQ}!vyM=Xg|Hrpr`qsqBKfe7(2_A~B{Z?jv@
-Q?rXg93c+@32&fqhDCb|AoW*AS0iTo|?GI`s&-O`*R%jO}vneXWabaqcb=OlMIT(UvY~#UJP;U<$Po4
-Vm|;BkI7982nVrAsKrSS@C}B)#QoRC1F={V8<<>-cR)x0t61D~V&lgPr2u^Z^pB~9oB-ShzX9R{E&{s
-5kl%0%GFn&;I3u6}3(E<Y;RW#GF_7rO8vv1^nZ=L*gaxn%KU{_#y<83o+tBdhJ;34OyaQGd(n|m!LSM
-cG=#%;*x7aV-V*GAAh({U7T;Yp(1<1Qj5G|EcKG5#~84dx5H+znFqQAKMs0-}s9nCBai?C=S%HZ~fdh
-cRPup})}a~3}G+#R5r_6%=qugE(>+3w0qhNpXZya!GRhZEQOj+7m;V%(W*{sEI){s&9~RI~eNyF)@u?
-}N$)*!tEOz~Ttde*A#Keer8OtqgC*9lBIy?zzT2K=D*}ZP=HY$#)Gx;nPVKbbN1qrwo&t>!UVXgJw!^
-X1&Q`(5p}o5!KuQ&LG1;9t~pp?#>UL^waeV5~~XM+YKD`<ql!cq564f2UycBgnpe}kpZVbnJMJ))B_+
-LR(5sB*cyO$2Szz7;9fzVqx5@IELC28?^zA^vU*np5e&OXfBBSB^R01t5yTm=pf~e{9o5IL75_vD_JT
-5KLV8~wBu@E@Ru<pEh-R1Le7b)DQ)3~Ahq0I2{*fzeXiJs;fcEgycn;m(^r$Y~`sIa+a9!nQy}j0h)|
-q<-iTkbZX_w<cz9Y0a*T*f=W7~FJ?l?V$T2H>`E{cQM{lKn8UeKoIZm|WsW#DozM?7E68T&-8SRC0QR
-ty;B`qjC)8fUq*dlynm?s*C`@{-Q^`heo+P(m}SxU56IetK1Ynbz`+8b{gT@k3m+(}hDXx8A}Z431Q`
-3AyI%+zyA+UOy2B($L$^Q0CN{Y_DP3%20*=>~WYIB+QE7B|E*E?0w~S%3ZEx9H?h#TVJC1R@={*X7j6
-+*<8pLyl*~PV(0JV^-4_4+r{PwozO6pu4Y>G6lYiInBX8GyM=IF5m=q&YFHU`;qMzU(1#Oa$7c>UWcJ
-x*yI#+7HL0#Uws3lv{mO_GUTjb311LxQKs`og<&I?RM_S2*7x0)-+;zQIu~GK$m2=5VQs>(1j&7>(cA
-CsJK2`|^9@epjEZS$&>(N^^0E<hQp+ll)u9i_Mib~}xyBXz1V8SPMrG*>`+ihD>)%7lxaqF3+mq4?Nx
-FWv_IJWe!2fIf(n8YJLhMkdcZ$&7nZVro+c|<LmifHEf2+GoEgwD7LPn!s!eof~TnqH=HZ|;ymI5;$T
-m`PNA%(3%KjK?Fr-Jb-Jh6VwMsM}xn!z1SSV0YTv9kqf2Pe1TVx60$jt@y1>uR=OLGx1H6RLR4x6t7_
-O?k?~|5~e#|Ytc9e;8c<9;PhOJ4U|ZvANA#>P;EM$E#qQ~|2pB|{Ibic8UQ3e1#$Cc4!nH(<ELW)zJD
-D4g%kXHJ$%6SZ(DzcX$&I>oJ6RvP#WMHkpB$6h-e1D8nvKe1R(Vlhh|<{8^A7rU>`s?{v}ESbd2Iff=
-BQo*-3IS=Lu|+#7o#2U^q=L&OAkLqF{s4OUI$V#0e<;Hz<vO)4j|GAD}$B2>;*}e?ZWeeE<l6|1t;s<
-;2M=jvine1lb_WCL$NhV!>@<@gVSE!(hva6KttTf)fXSj&3iyt6Y6YX*Olq{wwysgpA)s>$_&%L53-w
-RgV3D?VVmpEtt+bFpZb0p$?+{5hlJ1v9l|~@(r<6AoLXWP5pwmv*bNzgn?WHy3<N^tjsR%&U(X(w^)P
-9;jUmVlG<9r0=Oo4gDTZ7B$x{FR;bLHSuBNvlfMPuKVt7^%NoU;)xQTQtlc%(0$_HS3A&g+LID8Y_CK
-9n5Hm2jeS`@vpDz!<JmCS24%u%2`xb;3{)UL%t71Rx8>kWxm*g)~)z}2W-!eST?DQZHIMN^YQ{`W@)z
-ytraOdp~ozi};_L=u2;Y_Q~<eWE<a=}>r+;Y~fS0Y9Yb2=t_FGKwFb_-Xjq3;u8R_|GU#>#x?D@)tgm
-a5j|(`j~Iyoaj07e1UAKMk|Ztjn`Ft$CTThw#Lo2JW!u+TO>b8<=SC81l^9K9Ooe+$kb+V28)Khulh7
-bq`NkAIykD3LcRPuaZy5-8rQNJ2Gyd$no<ik^R$RNg}=qM6w>;&JSk5BQ6sZg$!mD*gRd>wl}eII&0=
->q>GA|LXIfz&(I^OW7J>sdsAXYu2M)X3)>-95cIj8Vkj@+$Mq3ug*M#eym*ftfQeC5f#!Q5(~;vmQ93
-%2WAeO#<Z5%O6<hG-czz%dCt|}p1C7MDFu0<!-U4ypBU9fp9t`;O25$faQ&IlxjzJ&x*pkJ->bxXK=#
-h{a!xt5))=<iv!t%-<83r|(Llh1;sq50}>F>`K8k-CXG1tOWs8r{lrFYkiYj}V~&#BMZHL>{ylb!-cB
-YmOnJXF@jbvy61)lu~@(OP$yla5ec%;$EHV5%VyH;oke#tiH65?)n~xCW`Tc2}#5A?E_k^4;lr*5*P)
-{9=r+*}CQ%7!vO{tcC#%na7y9pm7&wal%u|eMbOJZ5)CG83L#EJqjs^>k6Bn!gQNRN~V&@Qm!*pw1*5
-IeXYtB{(<8j78kl06D!T{^=8J0a@*+YjNUH#8d)o3?6u6+;0MkP+Nd)RXUJd_{Ll%jG#V!V3MTS=w%5
-m)+X4{XiHC<bSNDGzvDhejLkV&0;^yX;ON99yZ@wR6xdn0lTGcd9AJ+FTF!q12+YfB}YrS8A4fzVufK
-J4S4S_EnGEFR~1F!>2mU#2>J6fb3z$zf-U>}r!iD)po_{{(@fCvOgh+|8CB)xzS=nvo$$t*nqB??fC2
-$n-jP#jdCf2TWvd`y-^ETDQZ0Eg((QIc#DcoC5RWRYY;N6VR_H<$bsT_@wkLk9{q_7|;;00;{<G^oQY
-QWwB2kh3W01pTA#)Ly!i{6IABOD{{{p1+`(3Bb&PK8sM@F^Z4bUAL5Rm$Supsc1>X<-6-@<B@Dn0e}Z
-ckqpb?x#Pt(Fn|-y2h_bI9e0t94`h?#tx<**csG~at@9hwL7$**(NK#FnvVeL0Mh+hHU#s}NN2&;2uT
-8a{tk8U=V3~`diI7L`w>A$z8nn%hGW?ho0>o}MnEF^^Di*?>Ao256$WtGd(Q9*y)P&T{Vf<gB$%9^Dm
-rDwgLzBM^4URKYHS4>MON7nojWoR&7*tgOEtM1lc)8dixn)${qZ!f?9P%Jr<^LwsrljTHo@WUGElER*
-4mtQ+Z^a69~ta68O(WIt9JsP+Dx~PH`yH+{C2ssCzfnI{~k-qD!!7^!_sCKstWSS1;;A9oWn5CbdPPe
-A_3zZ?(vUfRr_bpEB2k*igf;%@29JlC-Z%M^_>-kzy}xdVY3)XtPd<H3CsJ)3o)SiPT}~xrL9BuFkpO
-fJNU40ozU@I8=(>HZz$Gjfk-`O4HDrqHl3f5J^*@F$%OCRJ!O=!`+PjvH~Yeb@Ew7DjL*8V>oh(XovG
-hGDQZ<l7GuGXlZD?y=$OEBsQGhLya`Y*&d>1fnUEuYv8dt5;JkUTxq9G-g`5Gn`vG<IXK0jE_LUVjq?
-gyz7b(M;D@>ltYxaA`&|iCgTtm_rRhj-d^{@m${j<68dNQH+N0ZZYu~K>cgQP{jdjf6A&_BmOASGwh5
-2Hr@%`5xLV|itdoEID6r>7SBNr)c!09UMX=)4?HR}OdINBSiTQO_XKsED0W-zxK^%qhW(sJ_*maSM5h
-X0)ebI>iaiWS%+VtaA?-f2|~^cw6n1OOu&wxWDEOO?QMbYI~<+#+BI<!`c`Kh#UsqGW0HQU<X&XiE(p
-pyFJ!2;vT+Uv_X_(@}_&p`I?)1tWhm%e~qh?K{Wk!JU@9zYj9JDeZ~XYC?><5VDXCvK4t9*W$MA#Q`<
-m97rBv9rZ}msh$>yh5&b-y-s2*=P>82%``V62E`vjT<<DVyyw!LwuVl4SPKWKh9Sw1oxvjQ~D)uz4Ge
-*L>=Fs0%lO=qpx)mpdt$XA`<hv_j7kAT3uRuF9JU!yf@tW#?+xUJ@8T*a3{M}Rj5!U{~RsNQ>@1AlE?
-noTH8_RJM-@^E1C!;V-e*3AbuYK<SA4l_xt^H3&@)M&#NSq{L8vWAJ2GY`h#k1pR$^DL^C8G|0g`Tl!
-$pB~21;-Z#lKf6A2iUt=98j;^ZEVTBrtu}`Edp{jd>P94JG%fs03v`hi)2oi-%tzcmBI};10WB0vLwK
-T<iaBSXi13!>;#UNqcOFl>;d^rg$vV&Uo-;<ZP0dc<;f*Y5Xf~jShPBz92B^sc!P(3q!z`J3XWCZ#j@
-day8RnVyA^)MX2`bHQOa5C1DgfwyF2?m!n^ps--EW>pKWgFhtI91z6<_1L=Gs%0RCLTWLA8)x`8acfM
-Y<~Chy6*%dF`@Z`SQXBfL-6?U0^9<wGuZD&Ky9eDUM>_iVosT72!_+1l^C1yxOP(q?dyT!q#0#aq6YL
-7Mq09MXXO1p#bRHM~J$KM(-<VQ;?&`BfnAA#HdkFEfWlSlC~FHkO|{!kLO(&fo2AFgkB>q<Joj&m7SE
-&Jww{!9nZiczX8o{wGyn(NEU@_fKX?4SQLc3zY1BRQR5J4=@P!oy*-rCGaoP1G@DQN{3_f2O)y~%!qu
-uD>Q!9Ub=n7C>UX=M>~|LRwG19sv)h%+V#EWa#F<irx_E)OLZvVSZ+k$Yy)H1IZCVE)~eUeEYo8t)~*
-!Ah^b)b?Dq){;fIn9%|x2u@K{cF0QY;_ySjnF+z^<5uG8YVYfLIOwO&spcFlVakv#$&%3*I#o(!}vD_
-<cj_aHj)7A1t(fmL^xug?2KQs5|bpGZ%PB+OJ-3HE%!A@}<{*yejrSnXU{ftrA%b8<YFMgOootPp4ML
-W+cTWBRs58~Z7gRv6yN__oq97miY`;(Da0hU<1k+)o+A;6iapT38$Kd%EScX3pfpomkuCDwas9*{UrN
-_bYU(<+nQ3vsHBRQMLU}h@cj{qRrpSDQw=-;aPDfuo;xH^y^{y`FVeE!s};mR80j_a~4r&eRA?&Qv;0
-}DvrkOzQ35M8q1f5IWjO1zWA95e&K2U4qPgEt}I;GUMs(#ljxwYdl7m%@ZxQ}la&j@!6M6X>>ylQ#m+
-<U!qo5~X90gZ>t7}EK<`$Ci3t3F3~IXX1j1WohQM0s!=^9Ot((m5JfaNmtPsPO&x6XJ;_0b4_045E=!
-op+efPW}%31Z+-f5aVuCTe5k!TCQYw*AwV^z58IAx@xF%L>{)<P?8C$8C%m)?hfs4&+Uw{k~GI~)Bh*
-*j{oP5()tc7yglx})xNYzTR*7>4jzHxw%9H|?B}59&VMP7vehAzxs|bN^^>Q=_jjW{uvkM;pV#E|f(y
-H_r~133fk)TB}z0b&Fo$A}Suex>`NgP~4N!`4Q>qiNCqx!#b3-RGH&hj|HuhPbbzok~ifP<|s?i$OG=
-SeUGNSe%!jx)Icf-enxI6`15lOL_H>!SGzUWS7PlnI{mLF;>Y!y0q~X+|Gxg~qwovf@h>&_o@oD<%0C
-eS9LK3INkBp^8FGHGM7Mz&2YMcl7ci%&S8{!_fr$<FN=OIrnGjz)=J5i=0G)k&X#ub}U=|_o11KjpFc
-A32@-qN_pIVaO8FI0>X}~Vf-;e;%3r#HUHX3bEVxb^mwD|53w)pV``Jw{w%RmP-g<i7jz$N%E10B#1i
-do!$3SFAV_!7|$h{ZI=Ua5hY|3}B%Ugqk2`XB)Un;XuTd2*ui7mR~`0lDqPVLk--8_4~#i0aevkJVT&
-q5YmXuMC>0jH;l2N}T_tEa&*oP6za!Z04w({^4|J25LV)^wc{U2vn~4AOq*m$Dxm8`PZ7SzY(5A+rjf
-@fq@t<%;oa3au}KpguDoY2rr^DT}M}SwZ95odb*ouamy>Y@9<1@JXZ|oW`~=Z*IW=ipyVbOL~Eq?MtG
-*j^KQ?s;$0MU>H65+@7ryqmb@%j*3Adf?5^}C-HcbDWu?3A9&F(WWoML)%ebR^BJml8&4a>Pak{NVH`
-aJ)RM=+5lP>K&jp^kKG*e}&7)=VYyWN{W(nE;b-{laou{Lkv634BT9h&&itxGo7o?}I{{qYW_ZT1k`Y
-+f1sK&_5EWo&iFX9{=)1p~d^`gFUkne-SRNUc=OV`Rj;>=~T=)OwnSMrPI8N{x~5+xZlWct3>bRo;hj
-Tsx3@GLnIR)}iw(Rv+P6L>(;i=Ve=8ui7$MD866o+`Cba!7c<&Vjef7?A1m!|AJK}`&C`&z4CAK#I#t
-w`@Qva?elSO^VW?heCc>T#r!=h_sR{r5R^WT_t;q7xb|V5FiZ3~iww>yVjm#(xt-2eZD^Xy)_WYXd0v
-|xQXJM~80FiOnVg|ccWkezDy%LT?bhNEoVm^3OY@1WCVl4HdnvJMaujVbQ+mE68_zzoWkHt2DLRD`bZ
-X<hmCk__0NA}e%dwFxe}BvU3y)S0>(n2LwX#L~bK~H*qaJmSXI1W9Zp4ory0&i6b-=|ybJv*9MU)qvy
-Q#I=2Tt6pJ4{B6NKm7uapc_<;n^jW-2uN=t{c1Kh@c{Qvmqi89o`TT#GixRRvHewD|qA!x6`({bp|Rh
-&TUv5PudaVImc(~@L8$D-&x}IG51@y>=`%h-vXCEwD}9Ze6IgT_Zlcjl34PPXfQjYiy*^Zxk^Cfy{+6
-0UZGmb-@rf^(qEzr&~oT2Z5ksMO$g?807;DhO3kL1genF=gTLSng)dGtLM+-f2J`>#B&H89+1*UAtaT
-=_#ghgYLoka(P5ea)<KbdO18tkU(y|s$8d>75IJ%%2_OjuVm+2n7^f3^r_$zlC;2!cv_geB7bV2w(x!
-2M!?)7U*hyF09$0|2`%<1;$<F-TGqa~ObqVMzio0x-DK^-&!kk}=i`OSnTekmIa^M}xd7Nz@Fp&OL}@
-?pHar!wbk_+iXRpN>O{WcR)cG}=vj^TikGl>N?2R^F6Tx+o`bulAk|**>3-J)7h^_-bhh_sqJW^UrY|
-m6LOTSs9+zURYRL%i$li2c(6^kRu-+A56D9Wi%A(a?Cw#+8rrQDBXQZ+%M`Lzf3cylrfxXI0m2Z_vw<
-8T^S0glnOw#(T%E8ZYh~2r02&}<KWnEgUF<7Pg_lr<klDdG}|LF5A>tx#eH=qa>P6Nh2smuGdhc2GF`
-EIEL|aqiYqcn<0|Ur;HmHHOlqm_@wi@gRkOa3K7R1~Oi?s_ebS#IvZ|Us$=Y%jYJ-r`ClpdUbn654db
-{4_hfZuI@o+(WVQpR`A*3Su&^G0D9mn(Tyf#p()BS6kN%1}MZGXESpz1<}hMuknM%f9bV__b5w1~v*^
-iou0-I0J0FeO#<HOhY6c3Od=ywLUGGhD$mGDeWSz2Esu;GpA{%U!4LRGOGnoPP2KO;m?H9w5w}Lfnh~
-EY_LZbycBbeCitw%xxpyg}PYwjx>v1z{gV_@dKV%b(40^6O#|hRC0M8NM~e6p<B7x;<bIxd%@`<kF~e
-5DQ+)N!d$rvw$Jt&lcr=9PunMLVcO&*ju~GgRA?!Tu;&YpSaAKg2c2`bi1D<ySCbngMhtNoBV|Z#DWi
-WTxJ$p6wTr4TI(r%O%y=Z|7+dL$#fIq|S4HAD?fv+Wt6g|q8G+WVpxd?Y#*vw^^LUaSmq`eX6?y7RA7
-T2I;q|F1DwVdWkCoWo4BnnkK0EZ;X#XjQtv#s2<1q+_OxcwZ?8>kJ(}I^{4WM=OyCJW8U_S8Ke_HvAb
->G)dkPiKX>8Z%7ZeER)oAf(_o!qVX5Zu<dV*E8xYe(@1emx!AygC_@(_9oIgna*|S9waWdMnXlTf}jW
-DCMl^>2m@&4LqBioFRHs`tFmNSC{JvMu?Uk$8LN)$;5?}A-`4<B{=C7efa(}npT*1Kt!Wzp5>aE%TPX
-&yA!oGWsH(SL$sVgJ&ArM+&FWdZV;=v+x5QdQhqnw^*MEQ{mwq0hkCa)5-kvtQm}7!w$jbK>0OJKqAH
-lIhu{EFXRYBG>SxcZaO)&RSby+Gw4iPm)<c#ASBfz+nU321*q~xPX&lyFumE?ht1;^Mo-nfJp+Toxko
-94Gqsvu7p~OYd18+aZ1$-Nu9-%F{$WC%G-&!~f^J0|tlhB{F^$pXjqrA_3NLSGF?kbs{t3@P*-9{0<Y
-v{IVgrd7lxPv?`HpQLmyk)@qh7}#$Rn(wKo?M}Vw0EGQHsbr^h};FdLBrXT;rKxprf;qbfdmqFn%8s6
-Q2Jn-dACaU8jKzksSs4Ix*pVwfkb1SG;O&b6ZLkfe7TV`W6j(uYaC7)GTtwGT}>Pg4+vt!Onkqw{#EN
-RJG-1|G}b#vknml=W^S@qnPhibpGeWV(<{V{p8-0~V$`jaK0qYyVg=1}l>K6Qo{y(vldjK6|E!>3H=a
-`GPG0sCb?V&Pgn9kwgU8&Sbb)><r*#A5ldQ?;svv60Tb)ZKYl(TC4gX!Tg#KG}>8n=%lrVim|45lIe9
-1Qp=+^>va#5{JyqMX5jfCiu^94%i#gAXo+(PP0%Cv0b;xE}_RIn^b2T~gF9Y9;)aLIcE6ozD8geqKCw
-fo5irxvSyNhA0tlnH(L@mR1#_z86J-2rnW(Zv@4WQ#@?haPYz(DjmW9=(pf641j}wmb5=C~zh!S@vaF
-642>|FD;J#A5++*;6<6vf1*s=e}^)?mchSMCikCGro~u)6Xig7&kJ?3K8f<;=d%3AXg;q1`;#dDax~E
-A;d~wqphUmhXN7;;XGK}|S>Yj8=Vx0waFa<*Xf%x$c%k=kJPxo`6H#JNp(~w9`4Me9w}I<wt>uXOh<Z
-8dU_qo2$eEP`8=nFayJK4XcsTuH`ATki;`JIcoKn;Wb|gYG>!sc8%*W}7)-tmsAaylo$&e(i09!$*9J
-yXKZFumfq8|piQVKl;@{=dZ=Mfg~G^eSTa7u>9{klFpm?MdY@opPEAU6nV2X;tIJzhD7aq^nhcMp3vO
-q8p8VTOw<d8&AXd`S7g%C5Mr7*-h0!MU|te>^~KjC;LBI+!-1>$zXe2rUe!fg%rtEU(wTuI|pvn#zyQ
-=n>7Xj@DS?Uat=|4C6i@0%)&Y8e8=r4ijewuD#5Ag=g;F<!MIEwXwUjX*{wmo#(zlofEv0lT#<~{=Jx
-U+ytltDQTdWD^NGQ*tjA#dqpKzPlHlyk$sj5KDS5}`#GH2K?W=8&OoHVlA99>r@m`a7&NUfC4<gmnWX
-%2-Z^Prk`4twGoxSEfmyGym6mI?Ks(&g0Sba7)wRg?LX}E0dNDfa%Cfi1V;(}0-RbvzXA-LB>7}vLvN
-NLhmKW@|ZI7+1++AO7b5B`@&~Pm+Rh@E9>kt4{niMT~7Fc&pw<&n=&W}epUCR6LbdDT@2PDNYW5R8Bp
-=z1}CD9!&AVt9+Dmb2S=+GgTrmL<R#aLQ2&T6qzISyQUTLPTDhLdFLlan!zLyhtut_P|P-n;7o{d3#H
-KxxFit{ytNTJwo3??%d;VPj79{ru*7K%Xr7e^&XgaRbl$OL*r!a{$apa=?w*X+~qV56X2tljP9ywzgl
-Vl(XyDoe=pG**fQBHA9hG%=MY+LN0`hgt#U3x~*1roIXl>JFP=R61U=$Y^5A;weXU!wLvEbG=Fp)J!@
-MX0_><CIm5^L^n#m|Jn!{8F_GdU^@ezRvBD|y95YW@7Rg|E$0(Ooe=;8`lH4)DNE=8>iA3wS^uDo%ow
-^3iM#|xuRTbQMv5^gCJJxuc*UdCPCYS8{sb&Pj4Yi$v%G+}d`RRJwopf_N8Udv@=ld>F_dWa!xc%;wh
-_`Tmf3S#hy}^8aL4=7$>I7rxoasi~?0pY15sS1|rzib9CnGj{&Yr$2_ZY_ysBvgGbYXh)ioP4C)BWn+
-Q*UKNDqgs#DL>FIm?2rPrx_2M1FGg%2^DjJacd=~tBY9gs_KF$E7v%XN5sm;JD=WZ!-4VGiLoR*-7C6
-+kfETD*TE1TmsVTHouP#7UQN76+0U@d>}{$=_UAawR_XPQM}<~mD$4ooNGUgcx3i%mpJ|puMUotu!Bz
-@)wV_4!15GN<d01$-BHFlIs~Q^ZU3;7OCu5J{9QEW`zg>CG79#ya*kHIP)+ffkM%<yZ?&%G^Fv1oM{o
-ColinqJ&5RYc3m|63@5!%_hShRIJ9_?aqAzfv6`{ViG7grNq&6;hy<M_<)bvCN^POMyvd^*MKZ^>ZV^
-5d#W6$dT@{eVQKvC7W>`c?^9>wk;+x~k$Pj6ZTAZRO0q_7hl+Dz{f+<C2a5$j-9FE(0~$wyneLRr>3$
-2LETe{JsIfU%UHhUjc$4P=tmlibQFG#z+{aVHBqs@E1bB1VIuM^W~O#fQ})^i;)33LoYtivWo95Tk&N
-PQGfvjuRZnR4UB%h=McOsMqmJSBR6!ov|eH*{wx3gwKf4omn;h=S#mHiblDgvh8LrY{9TA-p>Y1ftw2
-?RSYkJ@zwCNIN6TV`AlSt5Vz4F1l03n@q9n{~Un1Xsg?r$|kRy=Sy2WUzMq$gjmz|RkFq%JxNa`g8vw
-nOqGF`+y#5CYF_dIYb$C8i>8+u<^#{$<tU(hs7W!n#4B-%x3>ZbTq`R}O>m0gvycjk7%%~-Y-Al??0E
-kO!tS&g?u<*ihAwK+hw`+N4nxD{Cc`<8mh<sPD9da<-86gWs3R$BSKr_hgBORk{c-|;A@==WGlt^iuc
-j#@5GfYvo%?TqlZhW|>z{O=5Z89nrQ`2YHTd;HU82xnW7R|u{6vE-A3#I)NJ&Pyhpg<U7W0lYp{QGP|
-~o#G0Q_Gq5ATl8_*<#3}Vw$fg<99!TbRNf`36;4BI7)Q}rA^M&U4By^U7>PEgeY!=`wOCxzlY(CHEq1
-bJeBM60E$!EKIYc&ec{s@7OnIqPP4@xCjDEO!YZ`fw7C%o7Y@WbNc`>4^h}Lw)pU?p>PdjD~!<B`>%>
-zOiW;!bKTsGJ!QS-UaJIQJN8`FAjHptPMtLlBN0<wBn)&;(*_pL0)rAgzg$*tfHdd~FzBw6Y4JhZG_!
-lm_~mBaoX$Cj5}<Qn5fjiS1hHgwTCugXl?tE@b?@^<8&iGKi49+Tb<6^S+8{k-4a*V&Z6E;4{#sh2-d
-7~MW9>ghBM>rhbR*$P%1KBTyo2;KbG7Yh0a#<**VOWZN!4@HA(&e>SsZ|>eQhe5qoQ>SKDaB?hcw|>}
-cSDiG>73<Oo4QS@iEesoN=;NFsw?bXhUN;qF5?hWZY4}OypOSaNazvST2SDYBq|eq#An&hT7@RQZz$J
-Rb+jnM7G^gEpWm+AVi&PdeLSFE@S*Nj?THWWlaQ5x~vRlI=b8}^7+<H+VwGl);F_l?SjJJ2j_<9*(Bh
-V90p#!;cQIbfGm-}!SELyfau{yITEOWi5`;=7d)$kM!&}t<Fmxs!-0ahKfhvAZ(oWaQBCcq4)+w%J6u
-WPoZ30A0fRI<MESlnmIt-Nw0IUPC(P?PzluJgtRgh8Py6Oo_N{gApRZ!7$rU<}K$pHlPU5724>v;l0Y
-qk6FczFtuOH=BL{-}|wp_4gLdzp}OfXI{}1d|6Te0F0&<%fJs8k-n@Uf5G0eL2R%@R-&)hv;(jJO#u!
-9JOh9TKrSK|e<EU*pbCk<ObcZBO}-!ylmHlwmu!IF09!;YL3$s4r6WWOxT4e&HUi}oI2p6-{JP{Qgs;
-_d)Z#4=$zp9R*^B;?$AG`Q1@z@qERY5-3l5fTd_es_@0X*#))qYeWHnH~VAxjA#Q^$<sPpV_Hn3f}<f
-Vlfr+Gl!`?5VR3CW)}R|WHXWO~k61=y}oje3CO_rw8#lY{_8o)?*ZCEb5oc71*Ke?@i}JTMsUV>$Ygw
-g)X|`~fNU{3FaG4(e;o!S^r^uA0ic{L#z;IokCQ&*B04oX}{%%BNjvQ&lXY>EcN6#Z^+%k$MlkmLUc%
-F&FiBqgjNwVc1%z)LtrP0>kxHE`7Tv>0sz6(*>yUeEAojR@*D)n>GXUrV7c6syhFiZg)9zCip+<JK)m
-(u#XJ%bE+M|-V&q7<2!mCN6oO#$7c~J>EK7hxmn5F>PWB$k|w*zQff!ldmrLDK?3urc0MDPM^9)_U1c
-6QJtlZ4hQm0SeKSfv1>3v&%(oiZ=30t(kDZ;UnR7bD5T>r5Deh<a&N$uBe5!VweC3mE)U5Mau-Xj4w-
-?#r2QeESyDi~e7*vt?x(K7Hi#r_hQq7^2+80;#SdU~{B{0rBy_;HIpWNDR`crG|$rbi!XU9XBIoE2b@
->Bewwr(t345&F)F|$p{Jfu&k1!fI)Y7PW_WFrd5h;m1tv834=noMMfLA&KX+7bnqZ@v4pO6jnI;+fp<
-!i2>xSfx3suI$hgs!`_wKZk-%)d#xxo@zG;Joo%1rwyt(aj(pzL+eS4Kj=G!@5_W?hx<YQ%~HFc5fl1
-=%y@X;zHh4!Vb0>U;HR46O}}j4m%qI)OzxeRpW!F8yc|DoLty`Sh$bQrt6|U{EL;nFS(UGFv}MV|#4P
-1YW@!g4kLr6$E(bdM`H8fDykzft1O6VHc`2aTCm)cfRk7+W)L5L^xmb&1;<1i8Rb4Y!XD1b-KCh?}Yu
-S`Zks8s#yFgcFy3L7(FR5llN0Pxk*BC7}`PM`lICEGjL3xa`nwfcS`6qoQBE?4!F4D}}VTOzjevUo&7
--$t{r;#Z;#2-@f#@}xo=k<-iuV+_iPJs~Fyaym3=33{trn^U12C0cc;9_W8s_pSkU1+;hR9-4sbZ*JB
-G*dgk7Gf4_eAbqgHQA?!<9(X$BB!><(NcDgHiJr3zzd0hk^SDcC~SH-d0JN#kD$|753BgO>S_WBrsjF
-b_j5|}o{ado>pnBAJB<$vYO7PmI7*v##)B0loi;1sM!0wF?t8)C+3!#9Yuk^q_D`w&-|M}D?T=mAzi#
-pij{kpnnh(tX<rF{fV?z@#N|Fro73KphT{gBQm*wmfx@7tREed1H-^?q+K6&j4L%#OHMSrtGK7Or0d~
-LZ)z^?`A*uoM(BLMOVxupIBc!sGZJOCq0-!!x2=ZC)yFW^hI;nHugNLMfhCR~y_Vr0><%jP!8CWMzCN
-O~a{;FL=`$ty3BOcsT^jG0;%;)Am;JL$s9#=zt&X^_JH7+!z@U~q@*$38aAMbEzA+5q?0zu-O(nWlJA
-x$r~%>6U9h?Mf<^{QXa`{nHLBpEJs#-=~y|y~=-2=O{mS{4aL!+J0uieSq`DB5G%K)?VAsyp@HoGH5A
-OxAd=@#cRK87H>oj<9Lp74<}Cb9pt_&Nl?$$04X0i`{Ve1DZxKoNpQx8!^e`z$u^)*J^yPR{F0Rj{j;
->hCn_VQeI)JmOwv_&I9{7X^thr7Oyj8{<h=IoP?_O{EwaV&6#Ca_^h~uccJSVXcPk-lPs_5<fZf~1_Q
-s0Q@xUR%qd`cR;>J|UpQr#3_g<k!8u&_s*yF?NpKcfB2#rRh<>%c&qPKQVA>~nc*sy@uT0teT9gh1e<
-vEVMgB%`Az>h9T?&~{JU~P(>?;|>UR95b<=USFdrA2fn|DwkSZw}80BeVmkrd#Kn3i}k2R?>J0@#vCo
-u_zTU(-sz-gKwV=v=XzR9@7!Uk6JaY?$JF9dLkT?rxV}Ub9k)Vy9JGbM3x3JZj1V!rQk*sE_dh3IG6)
-%AooMJCc@)!cYdC(qQ3I=et7riafP=4Z-&?cA5OZb><4d2kllj2FM=oS<%ICd(vt;}XO_EWQXOrLA)F
-WZ28fHXeFz?JD0)5L+VfIf=H;`#ykYro^7R4DGwQco2=)wq76%A$KJE3{FXV6;1uL%{mgQ7sOMyQYm!
-=JuE(|l|*_`Lb@xhJKt_<Yz8dO>dEqfs<TcZYy)A++vS-zIz$WkAlxxoW(BKY?Tg_wo}jy;0|IUol^B
-rinSN(0nO!JApWI(P8YbGc#JN6~Y3EjZb{)Vs*i1YLM;S?<_@vw|V%DWD?YK>2#TLD}<?aY%?-ts?*R
-9SOI)E97Cu8!h4AI(VH`l8^woTrbPYnO`qM;-1S$V(?Zfsi#2SKfY9Sr0P2{dM(FUKBl)%N$tG~{yA$
-!=?+1Rnb1BcWH}y)qkkJp+;~i@b)qVA|B-c?`reTGNA{z^ul1p&LG8)nU6HweXJ&#vrlx;)W`aJZroT
-HgrKwJKCBF!%FTZi&x5>0wr(0b@!PR|#lcRG1B{#*(nX*nKrNEr%d2}1`QQ{0<W`pVS-c{b#@=CkQEO
-lJLkzR|`n&$Q7861wxIiVqnXUxY<qu3dNgWhv)eP15h^V-fLeUI+RXVHcy$qsb`E}pfL8VCmFH-eO^J
-V`9XfWqz7-I{8=*7uhiJ8OJupGK-b-nTA!uFx@6@SWXMp<D?oH{7~$HyE)dIBqCoh!0OtrK@Dtj@AyK
-PwKX&Qp%)JP1l~FNKPJiyW9B$-%iae@EOtHFG`)@<=Q%~<3=qWx&w`p;*r_**e2WRs%*>tQOWz$P5`>
-`eDjAG_4AUi9=C+#xBGBCWfo>ps+$qFM%S|A9y;H2boF<3UHp|=y|O%hrE342@%^^V@95hvc_AqMC3h
-oU`vg+KvQ#snm;Hj4#0zxsMEr2!TA&0DUz<h18#MTmy8(uT`HQs@Cd={({FP*a2g@cy0lF-pL|+>m(e
-UD;fU_aYLbj-IlTg3mZZxr&HPLIw!iahW7NUh$zO5Yr<HVw6Na!o(061p&I)oFiH6t&(h@xI!IfN}N5
-ztbfSeB54_~O^l<R7_Px1a#=eRm_C(~B>^@ZfU}>)Y4$z$5h2_x1cVL;mn4e)?LT@>3n@$9MOnYW_yG
-wAYs!=zvx!*vIC;pxH;+i+-u1^?g2r{ub5xdF9Bf4)n|1^taMNSe^GFS-l@h7G@7VE$qE!5b&+i6vO3
-ez{-tm?}p;e2VCydE2$gJD!*o)zkL#`Etit+ZUnSrs>w(J)N+elZEky@{AWsZ`z(3dO)zE{pSImPE>_
-gg$n7ZHF?A<P>ua?3O@B=gfcV_!N?mzH`3%>6**4p4jSSu8wtjS#rF7k1W*dr$(t(c6rvjrzqODh2Yl
-!qYjIe-%nkMA^S|T5oBjBl9_4e|;IPvMcm2#yYT)>#@tav6leewC;8E}M&{be_}QzenGd52c4G1L8R<
-?b?-agR@*GFEeBgkVxukFh+J7pv3j#6^Omu2WGfuD3Ck1ma35*0Ad$P|+R@#Cs_4PG~V1i?eW7h8O=J
-=qKiOU;^neozYdZiruLr$u%am&tN`V4PmUQ>b}k(D;!8`7!@KVnJF+(t~^wtag@ReJVr-W)Uq~}^+O%
-)!=!6V=knx`T{PYXow#~RHbbXQuGjmMzYPSVJ!=*Q8)y(C9IDEb(p=1~MkCv3x<*qy5<G?wu^UWBVNG
-~~%cI8>TF=L;K-H~exQ~)Lo$JO~(e>nPuaDE#nF`O0iR(?BK}+YBX-xVs)HL2-;oyFA32O`0Q)p0EPm
-iflIv3N#X?yUoxr`ufkCt33YEl_!I-M>OpmX!%pa@K#|G&h&S(BUC)-C$Zuc&w8UePx@;yloaP9TXM-
-st;A5(2@mzaZOLwkut(+TZ!&?ucEHCKu9@Qd(m+V~*j*^m&ZH%z4Vd;*jJjN^!aBC<I*>{o0hQBD>p*
-PZcO5&x=%n=SSjxgq`BNMHS<>$`SB$vxWN-HU24a@nfGQEJT$ug?Ux3mQ9X40x;AyFh<c1SN0=T30Ah
-rKUw^-mN+Vd5Wf!?;O7(O-ySf)&nL{s0n`8TX#2uH;W71CBN@Op&;H&WlhbTZ0q9$Xe-ZTU!!~oi#z&
-4698qkPPKt4}d67$;(ktlXd2@A{@nn7Nfc#ME2PVakhSpDQx)c{QFfK3DmZdg3Sqgt07yD2k?3}O$?r
-R{(amt`O)def1?Q;uc$3v&wFQ_(fzO7%;*zu6MJYqEN;NX;xN}se&#iB!%U>Yo6T@^d{KDmT<X%Zz|1
-zh){R-xj;VLVMoKU>$1#ioaPW9`Qlmk>S`JR0aqLG6Jzi&zB}-gF2#utR%nASnb`2pnwvcC7+K#4K`d
-F3|QiRqz=s7%VcLPSNM9Nc&X^Jq`ch5`lKWN#TL6cUSJ$7${DUGNO45*L<9~n({?E69nuKk<SIn#d$E
-<gf%2*yWm7`yLcr?uIui#x}OTCzg`T$vgH816tL@r6&Myunw1lOuZ><>(C`UC(8+K8Di4c!#fS^^gmC
-u2;=)Zz0??CP9%v&5<M_kiO*PDdmg2X#ml4Ue$x>obrnb7t>?;Y{32h2$ontI&Iq!(%GuZj&2?~I|5N
-y#UmZBK@OP!-)U!q<Rq@9*c3L?wcAOxO%ddUew93ho!P?5D)ap(>K?ceDIz{0a7#fz#my>iz1Gdv^A@
-or#)b(1U^QHR74n}hriPA%ndCx&s@;fj;c<4KR;c?|(7J-<jAG%EOd;}(xqicYW#<`^U{C!Ft`7DLbf
-J}g83i?Hk$_xv&}Lw_8iC8<vtyKjaq`i{V8Z0B0+Lq+sXw8-A_%h;P_OJsW|D*jxe3(ofOSQvXpMAY7
-Iqu*n%TUZtDq>{b*6}`=_(DzX67WI+%-khWGUx`jq@4j2S^KG}l3x9`<;rkKOXur7gOUV77IJx)ZwjH
-A6fADaxykW^sBO$-&ghlVFAiPIrd$SMTe}&?|3(LgL;y6}z{|w7w|NoD$Z2c)Ldxv8Bk71d`AUbdSuZ
-LyYzX;2C4R9dYb(FPj^^0YtBuK_-c3m4ah%WuH&mm-ngW9t$^*tA^D#V$qc%Nj%2=zSYi=G9rVj!&|N
-wEHgUhq0x)3LZwN;4E7I+6%l9acJ)sZ%eeAQLLVib^fNG{}KGx~Xm70SU(m=Ui5*<@5t{yzs>Jse@EB
-f#-{$7RwDTJRCN~MeA0V?jJ~loTF-~F5{idpI!n`%@zb$`cziY8DjPGfuvQQH?-lQ6_djVPWpU3ag;O
-+ygnwl!}v3o+`Ut8(OekK6EL|2e{4cUt&*b7koI1a%<?jthEGm)9!;#y%bi?B9QtJMq(G|=qd9jaLXH
-dbNKO{e1~WmnV;GWWecS@OPE$8zcudE;n1=jAj0l|W4pmBO^Dy9LrP$g;9*&vv6lE(bQXm?$;3#5&hP
-2%oGnJY$EXOz(wpTFVsZ#nalYKS{m*bdCULDhI8h5}ms<S9nO{y5MaN#VFYubcXR^lyqR~~D52H`xUw
-%Ay)mP;g&Lu@}Zhf0qpnbPoQf^fp{tZzxlkATYvo~B#|v7ho7xdh>$+NMoFcl&mHsamOBW`%U~GA2Tq
-KiY+>dBu64ZfJZj>N6hzF)=>!Q`K{bY4ysYi5a*;`TD5MP%7`|67#sriMcnc3-@+9g_qeml<O9K!ms<
-Gp&0-xPx5#&YKsnu%+A4^SZgr(6yvyApFBl&rgK6jnj!wI2C~gQ(-#Qux*hOI;f}?=l#Oy$mI6(d-0l
-Aso7a17PGBP3XPE8#65DegXd>`YI-F&03;0B_7x}A;<Fe$ef%&e8LE&eGEpdx{IvoN+&w#hD>aS~Z$6
-rKU%TFct?b)so@)~@!&QHrHk}yYh@m(F-Ta5BihxT1WuJZ&E4x3NkS4MNemEB*J*7WX+71@_Q<O$JdA
-YPf%S4Q%OipdYPx1BAzg<{v0B*~KQw84ix{fRBx(`w=uqrXI+jZPC?=I<8wc3T_kU&c@Waiil0S%L4@
-03Rl{CbMp5-SPFSYFI8X7J=j^VI}5^GSNuj+!hT2$Y(qt4?P<19FHXYbqhF23gNml4CnTemhHip<?`N
-51iRqDT!)qTs-?a|u&Ys;X$vH9kHIAPD5mx4`DcoKL`H%<E|GbiOmuh*bLuY7v(OQUT)vR|v4^9e*p7
-h7JmvZ+0l<@j%!e5hh+ac$Wl#}vy_}znLQn8eU-b?i9QQgoyramk?dw97AoEK5#pZ3ZS;*~F&JHgbD~
-z*pSb`=%@R>Fm!ZCRPR_wq=E)iIo^L&;3FtF778W*C4pYKRZ-+C`hbYR3W?%rw4qW2X8Rya{Kke_q*v
-dH-~n4KHBTzDsf)VmE--PiV%K!<2J<F`CvTH*!pJ}b;2X~}DnJu!z;arsF|L{n~WGZs-@w7|)&drF7=
-o|uQ_Oq)?1bu1TEmxmVMBv4aQy|{IFiP^hVDkFIteJhTx*I2j{HDwksc{h^cK?gYp5xnpCz1SLU*-M$
-BDZ~R<CGVLZ+}W?XOLWXiOIHnU#$lCxhSLEGuLns@4iB<IL@YFO_nI4N%=NLHlou?5D!^S}=&GCo|5f
-WT4G)v3NYj~xRPuDsBAgXTk1-x@AwR~<dI)_zV*YcqZ|dn`l&^Hd1*OTG<6Nz9-!(9H+R{5qe_>>3Mf
-Y2P7t+r9=(p^oyMpOl*GPUu4eCm+mZ`OwrvjMi6dI`nBB(s!HSxwA8HBO_hh@g||1kybtbMUx`{s%A_
-9odo!#juh*?nvO?y)Gxz~6_q|K081qTIh(_){nObH$jq2g(-W65$>nZee7E?-Z@<El{44`;`CA?@D&P
-SL|~Kag=zwo<)1mo6-C57@h9L!`=GyP3=Od|3KNU{D!~TWcxT-ycZ~cS%pmBdNq5eIN5p5+ilQ$E^XJ
-G#rAS0^q$ubvAuO2qkAL_zpI;D#Ea59{hE6Bs>!$4+7`oO;oe-{B5z`EZ2y)H?e46xTK$tX_NinXd;R
-H9Rc&6_XL$W@hw8<K9NvPU-1*MbLo?%9`KGh}!mYs7;dg)6WOtI-2qZ549Rls}W$;()n}UospDk_H`0
-MTpf`4H(|9A~>tIxOgPj?3VYHPpR+0TS!;BOeq>*IhQAOv}luYht0TZ_C<JweYya2YkSzt7atPyn4Bp
-6Zhyh-iocP7T|ZdYsE(u&-{QjH@Gw!|OE+v^1beCaz*7CY@Q4SR65dLevVttD!SNPmR9}PRma|!KsCb
-3RoI0Ufs59>5;cBp%GiwbPHN3^!sa6;4pPSl9`VY4QLOrMtqW!=~Ta6F21teh)WDcpL}9eAhKBkz9&S
-=behHDw7Hm%K3x-_Bo=OPJLtgGLFESo-5fi-OLU)NHA5p5Og{sa>G&++m7wmDc{`}h6N*UbF)++y$kO
-(sIo&u(0bX}$T&T0->%xUn#~IWQC(9!r@N~N)5qxkiYD0J%xFrFiaK-wKuzXn=dasQEe-_8gJcimJ)R
-&`+cvZXPlY@h_M$VGS|1}W#)}94^(o_3ovnv$1;dYv83x@H>?7~M<&joN2fx1C+DA8|+=?S(7a(K<o=
-x*pJT{sl!4WDT*gvmyeMc5}Ay7^QErXm4LA#yo$LUsr2ipDyX*6&m0SQHqxTz|b<jrr2ipq<I7p2g>*
-B-K!m>ubBrkF^Kav<pq`>MUS~1MCc%w$Q4mC3+s!4LZ@2uIqXYe^MSe1)f{Qf7$Km=lE-|)Z2*)m88}
-g;iY$%P_Y5U;7^owUy$q`nNCO!6VY8QkH_SqSo}&tSN|#xML^tH6@+~^Mu>-%#bs}UqvZ7?V3=8>X~&
-crduv%7&JLXIWAu8+@e8^>Ve7D-Pt{Cs80Swb5j_`=DUT<Vp4$1u{2Q{e*>~wZ{9@UOd=Y^8a_Of+%H
-OT~fR*po{DFK1C&;H=tq^^Swcz`KkECyvuWTP}!KnQ_#?t>lZ-340pTu_k^R5<3?u8Q~*@ZtLa&K4B(
-5^kUfef1N4Xh25c7;;-?R16hW7PWqb-3ZyuVhH+eb#4N3ZZ*hCVuOjZ#P44jWjCRp9aNuU?KNi?S+=z
-IUL?uOVHcY14VbfGKBA4x$WK!MqqsJh3(Af-#TmY@>}!dgOS8apR$k{{HH@(G%eu*><8=DQ(Lrm@_?r
-l-xV@=;l)}Jf;Vw1<X7ZX#HhA>CkgWc_5tU&rDat^U&+F+pRR5A@nhk}sOuO1{>Hz{C%wfsTk_R9i~n
-8Pu%!goZ#(+tDXEoTC1C!sBe%kMX5}W!#OTc<5x~Mn4?;;#9>|<5o5WnO2Lhr!Ft3+hiPU1y4jZahi`
-4{}S8l@f@QS4jR32dNi5g;fho^#pw}aKdl(<Az;&mf{_g3YA?x@BVbS|rI@ScLc!N9@6ktx*1HaTCdQ
-tLCLs3_-3Dg%tTc)~p<@JR{e13<0TvHCsTPL!)w9hpe6-PTVo*@_d^taiPK#TSMx!E5D6t9+lztCVwY
-JR0_j2o*4$?__sX9ViO%*ct|or!M39$i1)%zTjm)kbR6v#}^3~Uhc4jCytPj6Wgbv;;UQn1gOqmqB7;
-@?y{n6)sM>Mme|If6`4GCQmM<%V6QOM#qVn@=?jF?zEXO%w+21%3zbac8_$=^ud;dLZmw)uUN!%v-vW
-Fln)gMLk`32B!;hWpIM5?Of~o6Ee<l^ZLur46Ds!UOvH{lH!+nO2DdWA<U1u(%Fy9X{KZV$0cx!;r^m
-7$o-HkrU#=$+lj1$#wCwelGI!`Fz0YG^{jw3Fq5+5>F_4;b<nkHB^V~n+0o9T$XmN9})i*(0Q?82)85
-p(I#T}Y*4*@*{^`W?fex~>x@38$err}Q0Pjxd{NzHq-5vcz(+FNGJSN2Xg4@$T?w3(!ap9Zo_j0a!JW
-u3Ng+=xbmEuap$Fh>0K}FE(GoxT<F&e|CluvYv~QdQxHc9v-(hwoa?C3swXO?zVqtZmq-lkVebVoEQh
-Ox}7<qU!rlMti{a`>m)VJFyD1r`^U$>XN2wWp&0o~p6ZunA8EtKkcr&I-*m2D_if4J>x%z3?%SUL<bU
-^>zCqBB&%*rGVFMyzh@v5if=~j7afl{pgr*=E!4MQBw?8wC(fH@iQt*ECV_$SQ!W{|rX;5g-FX&{4uH
->Du?8egJe-ij}vFtaZQN(|~49)Bm*S7@s21{QYqETqis4{fVgYY*wH+`$8{nA@HPWPNEdBfe##HIIb?
-84jGSM*DEqwD>F&@b+i$c|)GydxI!wtbADH&Nrw2Z54(^ptuVUTuIG{@#Z}+fU`!2TEOS#dwfxb%TSK
-4hPwk_+Wnj6uCGS$ba&1+BL=g)C_xANAE3;jm7P8j3vGCQRhvtI<*_FSV9eG+=r1z<Q|nG@|fI4oGS6
-YI1Ji5^}lVZz|-F98kz~s>Nf~n3?H!fNB*k1`4-*$d&|Oa+8-}%!^oXG3+Oxpz4NKnp5GUFd(~F~-?B
-mWpS(Qa?_S?Od3nI!y}p0)@__GO-@lk5^%a(&kC90LD3xl1nIdOq94In4-?;fH8*pssRN;A8m0a*NyB
-q3Agrh`|Ia@?!3r|6S8h6j<E`S;!qDZ$f9~5I!Fui*=nukQIt<+|iroFPBxsU$3LCV7@M*h_IKH{sEq
-shvMxa1Y!U)v`UPcjQRhSb@@>u~BM>q!yX0SXrg%Fc@H8_StOj>0N}xp`~thk%ASQA24bW57+2w2N{z
-vUHM%enE@Jq-yIFT&(m2qCHrYYZue8>JYEGeRX%5p#)C8J(yP<1Q#O&6jRl8ZdvFyPlOh=$^x^Ihj|&
-Ea#bV_!AI~7J9pc6BPFlJ*xgERG<>Z%Xp)lYP6=G5`|>hT>yQ}Dx1=l&cJGaO7UmBoE2qD%9LxAA%dk
-8n2p@n8d_i3CmnI%RREo9W(pQk^V^^iq@DgXt2T(Z+OhkU9@$Za3k>=~p+MQK`8G0@i75B&am{i(7k?
-i^{;Rn*MQ#Y=V@K^K8aE-uxzjd4ak}e9Lk{Ez5p`GBIuNo^N8EF<P&b4gRCxhM~CtNvd9gHcpH89T^s
-v{M@#|O2*g4KIT8=M1El*rhNNBD#~K#vx=HEwO5dJduS;8Zx#8He1=&O99)GRyN#{r<>cLS$LN&->*y
-0=EETvx*wloU_mas?^<CDP1$gm#LN%;Q`&da~9*17IYSVCrxSKXU;Hik2~M3<P-w3LF=v8CRj{$-HVG
-PIoBWZP+u((<J;w`sAl9z;^lcCL5ZEBuxBoEv<?UnqSuSL0434B@G}^SBSVKl_q=gsg;~o=ZQ)I)(bV
--EB{-zh{g@MD*y>beZb$9)id`d`^RHLn43dI%u^tNg;^xkv^1fG==*lb6Kh?-O{~xPJ{}B5>_%KP9Kg
-4_g9R4)5__+Qp&-(`>G5^;d@k3kdFSq=@Y)QlWd<jJCW2s@ZgJkxGJDA)#lTq~6nI_-D)Voc^rvQ$Sy
-LNT-HhxC4-63nk^9@tU?LJ~x0S(`7liNQ@XfGX7@78;oez<4+6~NK=(?xqmioK=2=y!ZUV0%e*3j?5Z
-uYzs~Exi2@?={Ztaj|TN=rG>lJ$V~%!1P<+E8R<}S^DnV@1B&u1@L!T^(=o^wyZu8Y$$+lbEq3Y`Oe-
-%6Ou_5j3N*XeEWHcP-p(r*+H03->BG2Aw>%->^<`OT__ZfYrHVaZ@JkYv#kEIrJpFU|L`S0)jlqMy*B
-&nU-9?PG1J}>kH(fIn(TWkUw0zKEe*$i+GV^nj`}vU(;Ent8{)AJHthYHHRr&dy#C%6;xEp(-||}h>#
-S=2C9&0s1O^9B6xzZCC(naQk+_q|0ko#zwL*bgt_~{ZUYC+&Fe-${F~G&~eSa<{WIAaOPal}(S~@K6K
-YGcYC7U+UgOpGjn5vJEA?-X|=$lGP$5JAN=ZlzuIVp|`0^W4ELW?Ex5DrCdMv6+Pj953{yCAM#kB?i_
-AmyR2a*oCixDPp4I-Sm=R|3LKwoXZTzQdGx2^pEamWZc1&6zQdtwB`2$U-k$Y~ogq{D+-IFcn_!7-zf
-g_RZFOAe>$pLo|AZ@jQ4N!-INc2CWZ{6R|93I*n)anUF|Gcdb921Sue7hfk2))dC@%dl2x;B74??WW&
-`(@GvaVJnTR^LoI_sa=v*Yu{%7Tt32L<nCPdO1^pxd4_!52VK(AOFP0T44kOZsqg83LsDI2X`1YLpDz
-o44^LpUh4ZWMzf%W+p=I_2Qz(4uI{N48j_<R;YU^Hg_8WDUaLh(!d<&_gfp47`AQNklESZp~b1hcY*5
-!Wo{({tHgu6+RdDI>V}fGfVIT_~t_^#wSeNln@U7b&>*11}-z!?58))M!r5Z%O&tAD_12o#6@c6y@YO
-d9IE!+6+}xB34XZ088sv8O-BSy(J}dd>$Wlj{9x8T2mNb60kM>{CK=JHw0gcG>qf`QX^SD-!2u$U-~N
-`wTnw)vHoJ{q9o8~zC0aJCd@*Tabn?bIf(FUkUY85dbi3Di8o+}4uN(kgBR8c29OB%gY&vcJnG1&2W^
-B#nlpt`G+UT_J;_(=ObU0F<%gS_a--|`L$9w`$-OLD!?|Y$7^$y!OBp|+`sOz2sL$Xed535UsDIuY9K
-(B7rcLsPmBvNaH+^2Fk3SLf&)@$m5dOdUupdR=zuxnEDBe&Pd+T>cZ;1xttw*_=GpBFjTljW-N_P4iM
-*M09HGC^W!0|ps5J5X$rrD0S#Cw``L&Obu_qr{*OCF`@p8sy>7~%h+!e0^QuwAP>3*T%xbZ-G}`8rAL
-S3+VRNe$_}tV^Z4+|rhBr`Wqi`6k$f;f~2$njItWSM)a3*j3A;U7I2zwj}<yP|WXh3{(0$DDFQwSsLJ
-DwzSY<8#Ri!4Tivd)$-A3e580r$ZHCariqsiY}=h}zG2${{BYCP!mP~8|1>3@0lkv(Ehk<#2>v3RwC?
-5N@2*v!Z~fcOf&X^v-|hka?bf&RF8_54^7>A9<*(^3sy!-@@Whst-H~UHHA>++N#(pK$A><g$cq|g0H
-vJ^WVHOK9Ig8Ds0W@9D241jaBURGf>qT&q%@hU6EELkZR#HVkqNZ4Lj3r=b34H8Xp84-6Ff&W1C!uY-
-vY%jY+{Kd3Z(+rV&{qgXQR9y?&)J7lQg^Krqt6GUWPUVc=X8EzKm>;O+BI#&nF~4SJ-vor-^NyHXR;;
-$fJkY5h#trv#Em7m{bzBU3nP}LqNsswl0>AxnJtbj7*%=a!=l;iD9+$=uCz29bOf*Ke(oT#F#Z|aMcS
-sMe0+iGwuukyO^b$dWzy>c1aH|jYb?%5oF3h@wH9vtX^U8I85b15qd_vGr7R`m~_-+iTk+)dGN^0SVt
-%;CL?mfHHKe2$KP5RUpcn^A|X++vZ!t_E#+U=1E1bN93O+&&msTUpir@x>RV7K9d&3!Qf2$lIFEp1?J
-d3Sqn3U|NHPST_Td$#Rm}XYlA}61&+FqJ9{8v6?62S%_?+aweL5L8xnN}i#dYX};v>v1tDD>+#*ae_P
-KVyB6?L3Y;6%#lswL@ma`OctdL&fCmo65sPEk%6?mwBKyMW7zn#We68XN3R+Qoh`h%8PCPVhi_f0nO<
-4IMEu5NsYgaP!SFoWp=9$*J@#hI!;-0r#MhV)O|)ZP|K&+K^kmQhqrp4e(lEVhC@PjRhm>r1di8`Sm*
-X)Wsr`6YhH6fYVu>6sa~g5edh^ZmR`lZO*9M=WhTUQ}G$@a>HH<uR5c|>4<i9hlagXjT{c_sMtjlH8f
-<IcYzMaNngv0)#;Ok!?7y(fP1|t^4+|2x|6D7+Kl5>jj|HGvPZEkXq<1=1CM79jH9w6{!i^G&s)MerT
-4B)yT3PL{1JTr`Ay%T)e6fw?EVmq9}yKpAOwX-Xjd|XC~_Asq-h$4vA2XFLP7*VeQx!%LEx?gjqT{RL
-omL(J8odNL0g9I(3Zk`5*%Z1>&5g_*v+ur%43&9%=UCTe1kTPy$AfDw>}fGm$SED5$|77ZylyxD&m)Z
-kHmXgk=|3=4Z>4uSA^arud{tL5W#l6>wV4JGiui^On0je>fLC?-`-B-J5f%sH%I=>l;8G;zNzZb@1-B
-&owx)4sbeVNaNv&dH0OaZ_>3H;dP;w)W5^tS)-kl5RhTsn`zCkP83>K+#<e>G^m~`ZzYW^IX1R-I?KV
-%ss#V&m!S5vZ=W8=?`8mry#;*+>pI;9&O@WeW7mbcuxQV*IS{VYrOj`e;AqT)Hee*o8THm>SddSW$+^
-QSyib7u4q_QqJ6d~nBr-;zYEFne)_Q6ULl{(l>pDE7(<n$6MJT0q-XLh=YHonYpO^XL{79|_+&cnf0W
-iLPvM2o(<vu!~UDhM?S-ip9<;2V%%6PN1mI6Lxa%qjYKO4z5RVvme_&G>wXFR+FB;tdgXj2;Usx@{+C
-f34%j6knsd0825SQ(tmNk1aVycv>}eh7EDLg@>lSAL3O`M&)TK4sjxzsnalvwkq+ZWy5H3%=iF~hp}5
-Ub$rAKGb&k}>~r&JbAt)1NQLZNj2@|F7eb3L=vG!_EX;`+Z~3zVkHIZOfXX$%(PVF(^<>AMW*BihW&I
-FaMGrhWmx0wJ*L%SNJol4=4`LPydJ@8RQFyUwO)sE%V3(HQA3ZuG(`erk`_!Z~(Tum-q^irKR%dLaon
-AKs0=>i}b%2j8Es|Gsi?9wy4sgVqPcg{YfQ{)rJ16W;X*k7^&sxxsnn>)XHwnC#R(#~H7rfhoF6;!wh
-d5ZCxGAZCZ^9!>ltRX#PuuifKF+0w^yro1G?k@3KGKlB5U6np{8Qnhdbp(IIJ*&fdK$NDF9AZXdREC@
-sSBk`PlY|xI&*%ex|a+s&ZsjBtG>q&XKh3OVem-DXr7i#Jk1%TXRFWwuLlLmjr5nxx#Lj@S-(9u-p!u
-_fojb276Tdhs5R7V_r<p&d$@<CU#9|ruf|#0dOm2X%hhL6G{<Tsv{t>`Iomm}8$f?C-uhF0ny*DxjBo
-7B2*6jV3y#^M$L(A=Zf`oz6#af!NNnzO>K1S^dx(iovs_#bjhQ15y`(dLA~ox#0=8@adcsfO7<1~|CB
-{=thcCr;yto(l`M|U_RShCx;{dRpjX6eL&UHq4Yb!NXS*`7{hrEzZSjhE68$E>GuZXf_BTH#$Re;V~Q
-B|s3ynM-k+d7#C)b$p^s)D&X;4$NlcFtyLhjSAZ;qEX@XkOejwUdcfyrF?hFqlRcmqcwt6$pgw%UhIE
-&6wG>QBjMUKm$4=dU`l8l8+dc8olc9=%sS~V9Cl<Lf?T>+wuC#H987_a=EaFVz^IOMbBXr)(D&C_AQW
-=mmCx=%t(#RllkKWJ*k@mN4^AV1>tQ+n|7PVoCFG+aSjE61lHkb(gQepJ*<Y>GaZUtzFnZqOwOnD1||
-HuMd;U+e=)|yYApP;&kza1fN(n%hIwIDrg-{Ms@$+krLbh{U9(PF7;r_hEux&~$V^V5h@aGE<~ZJpKq
-;z&?b8BuJXmTEMSb~#uNka+>#gZ@y&s+|jY4;@aaFd&_2g80u3q|_pS9@8hVb-$2$u$PJ>Z!P4tuX_a
-?Hdti*JXGOg8D!zh6#Sp*vY?Qo7?z?OA_3FX(A7W$*M{YO8u-m=kp?@OWJ3*3{2lrpUb^YbdK;xq!9n
-t40~1=Pa(5kI+byLS{YY2Y3(2Yr-&Rf`pBG%%{Lf<M}PGnNa50fpwJm`ZFGy=9-xL5aZ_s%w`VS!nHW
-YuFMnbD%m>R1zQ*3h1Z@;0}Q_Z$S&7^E-}rQdAWy0yT0@Do+f|D{Kp{P`On{e#|22XYw>pN6T-p&_`$
-w~VSn>LKTr!u7{^GMq)`k;Ae<s80)YvVq%nF6%}5wSaESU;g_9!x6TeArWVDAkP`Z<%w~%PpzM}S!ij
-MZ`Mfg^pCO?;#-i4yky<V~X7fSX)#N<88_ocwHMQL!l*ISZouYl~2MDLLjmTZyUFT%2&HuokJY&Ssg9
--L9xn}hcjua4qfQj<>hNDF?8M(@Rr@J)5Y_a~<4ea$XDo$bXPoY<G4$zIvnLQnkneCoHV!|<W%aOKZg
-jvJY8OvD9uc}hGm^Z9dS&gL_DX-8u}DkPdAHeG1%Vb~YjjqkW|C*j4Sz}t3uU*x_Qy@zl#^SX=Ud?nD
-0Lg*&LyTrh;>@N8ew@$rfhr;*shhNJhyHl|6MS1g^TgWQ>c&%ca&n!Iu)waLiHSphT``fN}9>8CyTfZ
-OzjC|ppapBB(CsCrvBnLgg96~Y%l<icyP1cz<8C*RUIe#e`<W@V4r4*Nw`%-07-BO;6%NPEL-Y&Jes5
-shK9xn>&<X?c6myzVLrl_^_{gb|di?rCSlywX5Nuc^dGRzNj*>vFp?y@;N37Oto5gwuk`@!cRFdGwJ@
-s|MMDF0CAmj{vZ@I!wZ8e8ar?{3juT%y4UAH>p}q5EMT7i7S5NG7g&9AJRs$9W$gn&^6$O>cg+y#A1%
-tpxE(*x!3AFQoBoq)BTHOP@x>pm)x3J;L|iq2(KP02q6V>dOLOPEv>;WA7zlF@NWv`WCnk5?LA$xeW&
-neTDg<F{0~%5M5#}GEqt{dx!%3X&Uyajn{8|KmnFDjs&4jv~oJ-l`z`=vl|vMp%7H&*S~mH|79)k-Qr
-)ex%-@;Q1CQTXMKs$p>9qGG;Skbdm0>&xazY2rv*;B)VZItRl{ucRO=1G#zMWtiMmGTP;+#Z7!HkFZ-
-9gQ>e{<77G3UJ8Ia92)tp02Dd&8$kX4mC)H_fmHl%_CHVuhoIZ7QnGupkgWJP^GTGA`Q%%biT8MlD$!
-dZD05z~2Q%+-x<E7Z*Kf@IX`6=9JGwnk52!q}WgZamyHX@tuy(zym?@|d#A3y_e9rsuJnt;rU0jAJ?p
-rqOadyu`v(Pv?dt`Cu7(ApseDp4Z?`S-fF9DU{0m7n1^D4@HU#KPtjS{j2zbZd+7lu&*ve%lXjpts|o
-99LsA-w)RQwz<fBKh|^5{8+pqQsQSu)`=5j7fAc_p0nQ&E<VQXpjcuSw<1|I%2!uf>iP1Prp$JW&8+2
-kghGN8Lph?nu{XL}j?m6_99zw&tH^0H&mj7ef-j&DRJh}~ukk4xwI}TF&Xwh~n@zxyrB0Chl(K8`-J~
-;+`ZAKv3PN$>a>PqOZ=y>}xQacG?SE<JKXD6whc83t}#y$QvXGq_Y0NBngPpEyX+qQ|f;{)=x`$F)&q
-p+<(--g=TW5(nT!36wU(7eAv^P`1u<@hOg29`7KVv)Fa#SJ9M{M?hF_}>CeW|ltCC;1+IK4@v*N)o`;
-`fgbNn^g7p8cN??(?sDj=WTmuOMP|TetrLJdr$Q{F_woVNN;vwy|3}#Yw!w)5a=cIO!{G43K>IyH1BG
-OEF_NzQFh1DkD>m5r9z2SQz3X;;-Okr52rU<RWBTxUYAg9$l`Qvng<JTCa*EUxw9$`wGRpZ5^Ki6(Xu
-j6NihcuBMZv<z@nTyWUDp4jOWP>9`W&k`rWaoNuVnTCrb&`R5ckH!zs;YoNb+h*+ALEX4s7+pQ@ff89
-HFC(;m0{CEjKICx~Q-<1hjk${msyw<l{zk?f}w>ua|L7In|)@3@4O$&FU}6%=aOmnYjJuS9VIi(5Ttn
-YDLuVfv9YL~gFB(T#J7x9IuE-p=7;0@p~h12&V~rA@W_VIilx#X%?gMkcH__8NRXU_hR@WaZ?C(U^ME
-EX!E$U#yOzk0M$uW;nA%HJTNijviRm+IdpuA6%l&z^BGdpHta?kgR5C{Hi;V0a&N8rPNC)z9zmQWg2q
-qS(?B08`yk4_RPoP&({9BfUiAcofu@{C9B{F3!OllkBgPva|=$rTJD#te-IvbU<3T|nRwD+vRDbOPEQ
-eu)6VKzZUe^1t74TaR(p}#;H=diU*2Xao`&;qKrRl>Bsl;P=R@Z_6e@Ag7<_@M_Cj2UEE>fvmun*za&
-flG<PFOP)EvNVm3((&mXSedRAuD|T)M`t%h2CKKKaIH6Qu{Z&qnF}oS#>hco^(n0O~@_wn6n?BQ`}5H
-WQ(zXC*jL^8kEP@ZqaDru_Uk_w0QDpVQH>21M@Ir&T<#;rJ*gx_)|b<E%U*E@p)#>wrQDHAdGO;I=;#
-$ssgH(#Hwr@LP7dw~S!k<5GSNIpkrGdeNc*4qPWnu>S%mr7|zRBz9pJr+)~}{{_taA3o+^;PaP{_dSx
-LIF4cv1d#*=Lt7$B!!(ItBnpuzhLRM#{fhdO*PdW+bBA<Sfx+W_6n2L{^i593cTK(+-w}1g$1N+RKA+
-~r->vWT&8|by9eQzkN3t;4sdf8I@0&5VJ?fT2!W-DaJESG?26ew`3SjR7KE6xO#OTgh-%@0Z*i%yS?N
-zy@%iE)*Z@xVCRxCuLJsb$%>eb16PAeqdL_cyL(jwCR={E$2sa=BScR>2u3*a~814x<MD^}Y6bXA_)k
-=-r#+HaE2^`RgCTR{4l)o&Uzi}F3R$=lDpEF9Mub(Y;|VrR7-o$@=F`qEKA-XO|<?*XB`e!4bC{7))o
-Z>w*Mu|BN6h3_%3dHU;jst_;jy1^<6oZ9!IYG3q~&wkgq4_S!vhxcIr`6C<sqRRmoj{gxD{5%}?x3gh
-dq~YGB1wh&)aT6M~Ta@9xa9CofF{9w6J}yqf8(qI8c8?=H3^n(9ozkVEIe$<a*0t^ys#q>?(MRa48tN
-)QO+F>+;ArOgOs-qH`Kmp<8gI|mqt114DK35^f}rL-khL_iIchjX(0~_Luue9e+`e|QPU`iD*5kaUr>
-e*7<A`d;Q-4r#Z3MUOE<()l*b5`sTLdhq?FJcuT;q-Jr|i|?+SFMTv}ja^wx4(d#rE<7TMY`?BCJE{a
-^2n#%Ttdp2p%XW8Pnh_pg^&*E_=3(k=u^V>4=~GvSf-Qr660{aY``i(W^JUymPI^O-PV5zQy*Yofa?@
-+RP&dgvX10BG}2cO3b7lUx&l=YKy);v2ge+`yBX`etr_b8L4^jL`zI!`byEu%#*GHZsNbUw%(nsfxlh
-+%i%I67W2?U^)v>$b&-SImz_n5WIMyuHoZ-+d`W8N>QJIeq4z*=-LszE(u3f_-PmZF{lx0D;7>BK0;x
-tu7_8%Q5;bygWs$~}+R~`$erQ*nh;<6-_0w@^my6tWd8wi-kHL<lxk5m~)e$I6`m9~TTr>P?IcH^H`0
-GMap-3<^s10ekiYK2bmD6<=y`zf0F16a~g5%+oIdwAv_-jcUs&T+M|IR&3FTA2dbv`k|F~t_iH*3dRO
-tJGPuIJpD7GREfAqSI)xge=UE(Ipx;c+GiEiar8wOUdr$@DJSO^%vg7-p(Ff$2eJ;}*H-q>$beGwFIh
-TNzoQ9X%ZY@LWFyLPrUfR{t@|eq)4P?qwU^moEsoL)y?hA3vez@78{J9eus@$6s&wu^PMm4?-Xc!f<*
-6Mr=3v!w8DpUH`W9lEi5ode=VxT8^dm$tdc}02Z~|450DeAJ53WnhK$N;WJF%Hc80tT>Poq-<NJUwzt
-AbWXIAigQSu7oHPCQGNN|NBpBKg!Wen$Um!bfM$s<-aUU(C_nqvf2-%yQ7VeU5yF3QD6WyTn?en+Kp6
-yB&aJ1)_+k$PM+1vAP`xQ>@)!c0v8SXeueMkZS)_<9=_bz$&(Iqz+*`>|H#Ydj{Ko6F;9fXa+X`d>*0
-hgaAg&X-Le06i(5rzBG5uYQ;S%1<}dsAJ3H<#wfE};t-aaVs-R?k*F>nnq5Ry^z0*UIXbYlv2D$%JL&
-ZpF|)L$YXBg7NjN+96qfBdNqb5>NY4SFZj-Cj)jqnJp<p<Q|uuf%~r@Nq=2|W@Jo|_e@SIh_O-TgL`<
-cWNj=kjAH3JWVxxskJl7Ky63C&%GK6`fvGs>Oal)~18@qJqe13Q>(8fe5{e+h_vmz6nLFy}4@cIQOGz
-Dj)UGs7c%BSjK)@3u7}&x0l<RT=>X?aI?-@8bGLfT78E{smc0=lN-6^t_KDJ%B0ts3p9Zt14-kItsGU
-Nm`muIAN2_WQxRV54KPpNaWP1)>@XaDG?$f5<Q<4ZhGR~)>|*c}It*<x#O!JZ{cz<lt8F5v@^NcVIm6
-W(>7v!VuLEl)!H91;yL(S^p-6a;O`c!0~JF6P+vncJ<Tn-Ogf4%jp{1V~~s%$FmFLFwbb<#Ev19~MLv
-&#|TTQ4kflog%nF6O#+-S8v7y;Qy3i{~__iP;Er1$60086phaH(zRH1pL$KMXJPvj`*I*NeuM$n?eF;
-^Cd<d)CZ%@L$9z(mThEoE@{?e`|L2G63B2XJAl<Y$x_Z;ZR{80p%H!8q#&wPc$_Cq=P}(>Ej83~6qQW
-#Ru=RQ3FSIBd=eqXNLw7tu`H1%vbHT@seqK>MgZwc(#YeQmuZDbc3kq1WBS#^x!^;~e$r0t}C~w(olA
-tAQSfgeIVppG@7YoN9N*hLb6HI4uOb%1Ep6$D40LNIk94Ux@;&XG1Ze`MU6gvq%r06HUTey+%Ai6n#q
-|LRRzkz<##Zqs(NLfcksWHG3J(a8_n3Bb&<LSyPYQ9ACIW(4eo|;G;AeoEV>2}pig1zc9OPKEA0L$8Z
-FHqHGfm#`L)Z1PYdD1<txHVbX&^;=6UM^4FLxk(@B3i*!UN9LSu%l(iK5Rt8BMA{fcS)cj!Lqs=_CL=
-UP3t3#^U$xE+_-zvmU$PB&wKhsjOh=q|9^i@4FBD&ANk)8xBcMn10ys|ZW$kmqbN;p|3UFB-`g#J2%L
-gYa?AH{{8Pg}cn7cz*tXnjLzE5DaA=1L_|0$L2bR(uSBSSfdyIc>{_{4S{W64vze||A;ZOEfK1JVb=e
-LzCLhPa!`y^BN9*K(o1OKYk2)!|EyJ6eghK(V)v%a>U6MCOr&fXdtTlz?UH=~@sO>2?&Q)X|Ss9ja#Z
-OIG2<*B}?%I_K-^l!1v+_A0tkZ!sfDmdqQSSjR9(fC$8O$8Hvn(XZius_>t>bLe<BEDT+w*&|;63JP%
-bj*%BXWes|Xu)2`m2p1wp849aobO7C@-hGB*|+6n^}3tUYL@&uJKtnD_G`lK=l9Z`FAT6BMup$0m1pd
-AN^9HA)Ax)mt+Kz#Hsx1@dTK^IAHSk3Ak4U6!+%o4t|seizp>c+9^bYj37m)^xpK1ZjoPaWvhbQeS80
-nk@0vD5q~7saoG`PI+a<{N8X73-Q#;6ZYuyFx4BS^-UJ&nj(6xd`JX0O(rNY*RM$=j7o^TU$N>8)|xt
-*YCK8sp^F0;P3H4QTQvv32>rv~RLiMCG&6C@yNyJvnmtFoUCC*PMIcKgKpr*aa@GBee4%Im#SRhV}w$
-VArZ2zZq@^|lantfEKm)i<?dEH7`o-B!!h<nDmGxs}4#)1rq@@_38u0;7Y|S$mD(VX==hK(fICo6+NZ
-wDBv=QwO7nuNToHXg6#zD0z;3^Nb@Or38nmZg-?5Uzd`EJ*JE=ddLG|dcC%<`Zku0hk-WT;)j`Opl>M
-`r)|LXiyG$ni>v+j1<#+gAvLpmga&z%Bmx1Cr&{t3FV@KmzrKD$9^ez`sl;-Ljx!tI4DzXpK6<``{A;
-C8^W5f*$tD=x1cokyyhYGJSwHiHJ)8wujT5#{vLO%A_+go(mK$f&AmWwELN5xR9*9q9ZjA`a@HaRX+K
-GC4cYv8BgXtf^f?o-*t^|?AebJ#(rn%4jMSSfQFxL-H(X%yZKT^Sa(`v*JxD;6quV4iX>TzF{cGjWlg
-2BOwj;RYT$xA^+vvC@&xP^Jz4CJ;^x)Cn#hc-cCuZs9kagVHq0}3x5`&-Vr6)Ry0d}Ya*;{t{u5To*y
-hdarYB0M8A3&ay>K}+Sj5aBH^2aRs8$nSx3L^*-6%5;~yVSdw-dD`CNhfw8Nq(;6<4hW}P_Vu4jG|lD
-Xu|vflV!w~sFn|0%e~7!i$e+Jp#GmDw{^30zQ#_xp{~@75v0aG_#|fB%2zrAc>Qj#Kb|i1-?sgdO%{6
-#WM$l*{hU{6@JJs1v>x|k(E4BoLMn6XwYA-r&=s~?jo6s*16}@YC*q*!W9AkX%lc8^{qTfYDgxou1zw
-k;&_5=)y_P$(1?@EPGxPu;=zI|q?oxp;}JI<hQs>}vkyC`<JPx|cRJk)!#2-{I?{~6w=b$4%BeCO=Yz
-tzG%K6iv6J`hG>P9q};7uc)8`Ln?96D4Y0{;9cTB}lWz@QyOr7Qx0Z>1#9N-M4CVG~DtQ8)-TqDp@H)
--m@{R%t86~>HL$I!ppG6Z-~Qd@E2anPuD8;_;dEeoBWRjO&d*y7}eisBMV1KGrksl-Z@-g0pD-cK<M|
-7#MNX*S%{bI{o&-l^d!G_(DHW&jRW2-v|M2Bp!Ll9N6i<?b9b>m)>pC~lz6!pNuem5u-vG?Nx3VJdx{
-2M%f-Hp$bkY#;&h!^ic^H%YI>>?K)-hxt}>`t9I$Jpl25uR$Ac3ur`d@!zEv8YhG?fBR^*0*Kos3rN!
-mb$V_?MA_2P095LkXtGu9>Zc%NRv6nABI8gmdYa?~w{1x$vrR#ayxz!)GRjZ&#;WsLK|eH_^FI^<J=z
-^!XoPnB~Y$e~oa)TqvEDKKiLGhht|@@gjpSVcDhNLz;5!o^Glw;UxG4pEIZwj7;C^)MO&e_WcIhK%w(
-Q>*86iyH3MpNE7x+V{kHElL7t?agZt%|fUyO09q_tU-M_ssfr;*Lmr-9omsp=M|ch!IakWSRy;5d%;O
-PmU|>4pz-NdeVXZ!*VALMJ*xABm(^72NlcU;ELhqSA6;=p<}DvW=Tjv}-ZSlzO0LizLKZ-Ktp1U{>m!
-A?U1HJR1k%ll4N01S1ETo%#fAo3k}lD#+gi^vGbOtP=)`DIP6WLGN3lK+sm=3Uc~;7TqnP;Qm&`R-8x
-g$K{K{Ohw2dZNKEstTxYZyq2N{p^k&t`sQUalf(^X1QsOv#q_%g`FWbU`YZIA<g_t4O{KtEZRrjGo$;
--WAJWhIKG(m9{;rG9BZE^k2z!iCZZB2=BH{Czk(BI09bu@r9#YHJ6<$4?LA)oy>d;J!YDj}-O3tKQtK
-FL?bkT>q2)q`Np<?s794+as`Zc41O6ND2PlQD^Kg{mFgtXKR6dv5|jO-{z_LVlgC}H+kV*S@$Zu1v*X
-@^Z3Cj&+zkacDuj{Rhn3&*DcE2KJ)c6{__1__wWC^*l&J5Vf-dBb14B}xIs}N$)H8n;z{MujydNClUy
-C_m_lHdxZ!j;7j8DamXyzV#2ia;=5X-b<Xgsk25kQ>+5GW|*#jtY^x#H59mv8R!_ER;s#4XVIhm`0AL
-S{1%I_t+eU3EwRj;M1g&_`{VeK$4rsXu_P(Rn>96d1Re0dy+7DKg!V*GQa)hS_@G9+0F!8u`<aW-<Z;
-1lxTI3SvDr0^&ubBPVmz{VG@9lCMMly)=`lTazc5)B!0Zc%!e5~3BK#PgJma`MW+C%8<2c(HGG#^8mL
-I+2J)^D+s^7Vsz$qbl?v^F|q8A&0)!Q}$Tq^c4rm(%3|=yoR<vgaApZ^F;xrh?Vbw$2fK+go;K_nyFt
-U>~*P@3!ezbN;<mzQHMb6c)YF$A<~ZixxQ~Np-4)8S+;L4hhR$L*!?{hi5p@LoSDyl2%Cj|+x|{Z4h|
-hho6hYx-bOWC5J-@VGC=_vx#ib(-ojwgOB`mYAE!)RnbOp^qu<IKFSG_PIEanpU5yNy8|Zwg)rb1Rg4
-Gv>0XQW@lj^aEw71k;ar9g=mYhr12`N(_Veh&PowkFwxWt@=NmTWK-7((2i^kNM$0s-gfhMrsvr~KV=
-JSt(?_cD}jH>$j6foV0phd(lG<I}})2*7y^K_r!i2)hzys`*bj3aQ3DfW@J*y2Xp0Tr$1n*mXEUAt5}
-L&uEW^|i4eQ~rx^%`BTKz5m;Q?RR(mHDvqoj_-puoP;2hLLnT5VG^flocOfjy&HiL{|VteuP2i|$=-g
-*;yu-lp}oRP;%{mdwbPW~&ttYNIS<3VVf#gUIZby$a2)OIrJaVH?$O%r6P)eoeFp74+buSPlfCx*dCV
-5QO^C5%ufRvq9=1i{-dB!@_q5u3Kzj?uP;#%sW5l~n4DBJ@UMJ7q)Ua$XQ$X)Q@-*2uv4xLYOu5Bx$?
-s#fX|M1SAO0n>^_uJxY?3GF@wt!5cY|2K+sFjUf9#tc|BT7@QDoygMF{4l`QJxTz+OIxq@an*?;@p-E
--tg^7K3T44C&3gi~IAn88CjD3;Vab0e%STKHJT2;<o)w<i5piuZt*Uw2o<6j4fHkxAvKO9a2gMlXDym
-r;2b^$$33n72_QO!*ocSfa3~fi-z}tcEs*Q&8sh-I7ux}KTAA3H4c><!mxJufiX|gB$k$$;lB4IM$jz
-<GP(o4MP4IaYQe*hk_G~GHwJbI(OeGfcIpvFF1JB^tWQ`ClBi;%2SpmR$}S;;BCIk!0$s#74Sx##D=b
-+q%iRY>B4j<ZkJV82PuvTo7!4X#T7&KhRdr7KC;{cfeWttW6-xlYSSpG1uY$Iiacb?@8@u3CBDFnmDP
-li0vDfH;e>Q2ftp4eNgh!RUgo_C}$07|zAXPNsG%Q?Xg~N+K))E%-+;WHX>wqnecezHaL|9zbMtE^!L
-g8r^gtu0KNYvOv)(=2TN&FegZ+T7?Em>(d-s21Q$v;*C9293@tee6}xq!qS)Ee#G>F}t;eEb-QwZP2^
-p!ID2z%Pt?_k9kB!OHFyK^P8T;)thLYxY|xr`#5@;@6hHza*A^t#)>t1CElx$dCZZVjsr2A9Tz$LouZ
-CwF1+%enK!mONTM_PvJ03eRs{oNR&<s?HiE!Xu8+Ye43(_0hNAyK3KG1F-n$(HjdLqLsSnnUUHV`N2B
-Ybb-u~fl^ItAdbT*KiIpbiM0^bHLPP*~dB9dwjExq-U#zR2rJ6VFYI+?}k2@36*;K_x4qaT~g2rJZpC
-<GM7t}}G2JC^`|0He$js&mIslkrb5dDA5y;qZ?=-MrK&#&mqnb3Skc(Wts0uPb^;RSbigq1-8@#_ySS
-y?74tE+nNJ#nU^x+`14r}VDJtY<BQ9;7aYlkrlKWmEhVw|%xP^uF=m#BIXg#cdD>-2Rie4Pup}Tx4tq
-pW!3Eb4UDg;c|q%pAhC8M6DdPbs#9#4rx%4tR-8Pnc(JezAE43r(Iqkf2Sn1B_da+PoLbi33gPVV2o7
-zU6|hnJh_Xq@VXfl?k&;BtC-CPZrF`q3Ol2`-5F@&Zy_=<FX~BHy}je^Cy@`PD}R^ww^NhY3bQ?6Cx3
-a02vMtJj7vg`Rm!GShVexDCWP)WoV|rl7!^`;3En0L9gOap%jHF>Pxbuh4~f>+Let{8z2&CuL+_F+KR
-uDxfjC}6NWEv`!+PjTMzN*rQ!%4H#rUE~F>rQoE}Yt2%MO9>r1adyQLPEe`5I`UUyV{E$Y&agtY-NHG
-Mi@fw^LTvu1C3uJ2+HYSAG=;VRYnJ65+I?F3Y%Y-cTPwVx^Xv0Z%RTv?PH@c(t#`jG=@Qug%tN=1eP?
-rzavQfAi=QagkqF%AnxpvAaaa)2^)LNTG_^cT&@WQg*m*i@UJh>z;>q8~grv_){Xij(c65CCAX!A*wd
-~BY@TDnP%q6dW@5_;mGk4?8Gf(XqS`7qKw9Gl}i?Ky?%XgK^FCUtBFB%KyAr~ZV=<n*lWkDPK1}6WJ*
-Rz-lCuhHc-iyEqpi8JW4j=@ulLr%@QWhT%WqZU3D^gHs|D_?VQac77DSV!wr?|a}sm%X%`<}&>(9rTm
-;t;e+f)NT{-3)MJ077*ekWK=Ns>{#C*S;QJ(m7dpSAl-?}hg2?f6tsr|Ys5YG7!$o&V0`6_Prhlluq{
-)bWwjiMw$AWI;{kQj#I7=qC-iDM)~Bg>o1-=774ON4~3!PDE27fgeC8wjc}5JIK!mxyqAB_sb8e{Nof
-tsDsi0qr9sUYQc~Dtd#i1|ci60Z6B(pe?hUkXg^LM1jn&i1f?bDY5QDf?6PguB?j~1fW0}4*^}FY-MR
-Mt7`|g>fPov7@*4-a2?qyz@Eh*G(;G1LFwuQvfR-hxOwEDz0ulVTSD^wg+x!}GL$YEpsy$Tyovqi(`U
-hF{6Amg%=dDcZlT`uy&3aSXKo3-dg%KNz9$|0z0TY>?mVPb$q(fDRkqy;UfS#uy3<6ORQyDq*Q{Wa*t
-hZ`B#wv@`pkRR>Z2f;00hatd*58HU<gh-;$7PS`lW*32g3ZX`0@}S%s+31mu<Iht{~kl(CdsYdH03oO
-mC{HtoTcCcI`yqNz9<z(A&(dI6kl?!Ws7r#QO1`Dt$dB#j!h}Wf_vL@znh@%T6;>J)%p%qZuqz#{r46
-{Q8hwpR=NfF}Um=R4f##ULv`uI#C&kE2qoNbeS&6cDBJ&d#w;~hj&7Wut%vG)yg}a)!WpVR{^2MDH%l
-=qB2HKGVaD+3nXbDrxuNi*EA6)rii!&ORe$HcD``dFA0ayI8qOrO-QFhiqup^U_MlHzWWqaSky#f6N}
-xkqx^GslJ3`y50i(i-Ppmi!%8xchoRll$Vf%FV2^@z!HA8fLao6Bo6Aca=IA*Nn>+k8O|Ii6-TXqBht
-<&(elbMGez6SuU|;`3U~|xyPeYh^=PiHKTPe1m!wn6)okqO14xvvu@X}?>UvoOl){zN9>uN_En>t_Vl
-c-~|qVz@&E8PVXMiYTZK0C%cep_2XZB@kHx#Kr!a1U;Y(F&TK+1i~PnwmF-(PbgxL_-$^^9?Wb+-Wnp
-f$*4ey^|d1&UI67u8*6$f7SA~*z%ID``UbVJHLgg{j{VayeVMlJ%6_TK1`{|QyX#*_4_CMP|m@tD#A8
-tUR_t|Hu-wW5jTrxj2>&5EJ7ucntmF#Et~|bZSR^_f?PtEmMX|yK4KTTvkh}MZXWz(w!!6k87#`-T(z
-`vG`go_X1nyULiXGI`szv<xt*<T6zKb@cOljxSz6o|jhSX~f@wBsNmX>W$-^=8AAXS=#ZfJhi1g||=f
-DqTG!EHUkom?@e|zJbEZmRq^Hq{vI6u$#<(2LKmHgj-p)gGT^}~+;^Ow}${)*nfYR=NX9{238zH43|0
-Q3LgWxNCK=a=w3ypjxoGROj>3<_i5UxFl2FtdhHG({mOgToB`DZDNSl|(DuA_g8)Nd}rv@oH2B7=#Gu
-TrI#E(V)D7d_LUGAS=OPt*T%ds9?N_=FvDnIh+P<HHKLwbXFe~G65wHD*hM!t9}?TcSXTS+p^t)^2u@
-;YxRU;K&@oKR*VE?7iJxSi&1byX6>0V6xbkM6>FD^U(TB2Yo81UojN)OY(nO@^m=hMHyOXl#_J;Gc`w
-1EvT4WgTSI5=xA<4G@mJ?(39lb28;aEjrxXtDuX=I4#s}~G^c?y`7tUFr6<z7}FHVe3;Uz(r*DDeKqJ
-|B2eC}oKq6+E=RA+%{WSL@C^Dfu9Hr86^rOID1nGAiiNKbmB%FJU4;=gw2ptVKUy<g^c@cG>g_IH!x*
-pHLr!3gQI_#MF!B&YxEnLr;O%0GQ3(8q`JPoD|&@uB?5Gx=Vh9{SB(`n^92R3UY4r)Bj_prwD(cB1HN
-f;~N=qjZOSxa@7O#<uKzmXjTp)1!F^U05;Vn`5?}qVMrnn4s(}+abJ_b9X_rcD7rYyK}r5A_%i&eZRX
-T<&HJ80%cM;ct+K^zz5H@jC;xvwDM@T4>Cs#{?#GJeu*e^Iaw00B=6fABKJy=_^#d~5=Gr+TWwkW;XP
-7}y3ww8Kir7(i?pc=XO!oX!EY};HAZ);l>u0bpGnBBxBG}q(j{2jPlNlclZj4FYBD8UN6rW474DKoze
-?lov2`){#^<)yg<{^I7yHHFJ4nA;7^*xJS9H8%i(jJrPS|#k@sZDFFguW&qAQbb6XeK-=w2r!_0xCh9
-JAtB=vR94KTijU^7nJ;9A{BJd^$omnmS}pc&f|Gb$IGBiKMFgne^qCQS;1FSer7e;W>|_pSzIY6VkIe
-^)+)a*m*mkXMa?@{Ge19v=`^QtHgb%sM=-UO%L_yBmI)Z&xgib4wN$O3<W#vCNn21t}XEz1so-LXXTX
-PCzVj`(<?EM#JcT~S;z5bCcVr^%)>wy+AW(f>X|)3(=qYM#0ipTrzY5(OJ~}<IusL~Gqlf!=y54>B-8
-bfy`~~vmXD`PC~8JN4hW@oTNK(}CpOFcyC~C4H4Q}CKSiC=N?COpy%27}iw_@Jx6wwMGLz-8KO1p*Eh
-`d&hnZjt9hBG!h$+N^O^cgkai|sSaPgFxni*|-M0r%&<QMT)xH-R@g~w&$QXOX!!+zG>k)xo>i?oRS2
-eanh0*!0?;f;uo{dIiAOWyw5y!U_pl8FV~-*^9p?_Ur2mi+43F!s0l8?1lW<4@y@|36>ndjRsET;mT_
-01U<`62}peB1jr0Xoi9j5)9bm%L^2Vzz9x!O4~_dpnadMQ+Ff<qKs@cj>$8?v>~XKXNiFbAYbB@<kK(
-(&p^%(rVD5=E6Bt^oj1t=C6u56t0qc8YbaiIV3v26^WZqJzsY_z1qhUYbCC8^**XTl21zu$=J4xK{gU
-l7>+s?#vA@P8YyXF4z6k#=u~)td=tL`j2M|f|FJ5rz@52-rkRYkYw<>^sv$}K0kcVNfdX+xQck1(T`X
-x+xePaLejrh4hauYTS#;yI8ubSWAh%*OBoI-zr;LDc|&3mqGgeMD&vE5B``q5y&j1A6WAH3=UsFLbuZ
-ru-h+wn^fbOv3U@R^*s@?8Tr1IjO747B5RA~e?>&G!U<o_y%Lv%gD@&#J^BK|5W7*Uwr1$D|*6&-&k3
-NA7nq4U2z_X+DND;Q9SLhxiX3Ab5VzfARpokf;9r2l(A@;op0J;Q2w{Kfr%r(DU3aAKCq>N1(1{wd*5
-27%-LOhmp3d7q#CAo4t7;yzyLxs_X5xr|Fgy)7gX1B!9hL>it}8&x99e6Ewh&dD}A^4$1Ene2l|Z^@4
-;cgvbf7XH|@-svbSlA>nTCd$zQDxVLJ0<mA>b>qMO)J1vD^2{~+Le<T&oa#DF0ot{c^jAo46!6-JQHW
-E9{jrLMf9+|z`&{sOC+aw@zQ-(NWV?HvIC3Kh^tZvKRZt&5diu2}<oj3Ec%FQq4$uc(vL25?}6>DN&m
-|4rV?4Xvjfo}Z8p75>5iCta!x^fn#O96!GDEOAwTd9d~qe~sjq`5BHXfCf%&5>Z{hoJ3e1l~frn)&Ak
-;gG!ReKqKb)v<`^zoq5Aw~L_neo_3r2fR6ofy3p!hZg?Kg_@L%o)zrCoKuLpK=!)T_$3#ZSq0(>_a+n
-?FBhg;ZBCBdNB1fqZX>;6qrp;TexhU>A9q$zy;F4#t9Ca101BYX2We&Cy*bKb;T+3M7r%%u@;{J;m8}
-y-Ige#8iWb-%4Qs@v*gqj{7U#d2Q*m};Kc3LT5#_GIVaBf5t{$GJ9KD?Cvti64bRjuhydr0z_Qp^<bq
-yK}E!%8P%O_>#%Z4uGE6-gN?Aa0dZWr-#T?lEtiG7?Fd@6v5BC<^GOl-6z1ZD>A`rv(4>-3Ow@giwm>
-be*A=G}>LDi(COVTVV3o*EIZC6e=-J>-i_@#;uED(?LC?4FGH6z7{v4DG9TzM(SKket+OgQ(5fHaheB
-7Vec1K1{}`lg~j2;kjwW6OT0c4AfL#C{3oWhxfyUlwjofyqplpRQAR&63cHZrnK2pllYwO@TVAhv<{V
-Blvv6QZM+#hIjX9WmOGTiHj?I-SzjeXvV{|)^oQgAE~ZgW`TF(G*(bmkFZ(i1vbwZ>|3ZJe^tUyL_((
-tb^WA<h5&yc&2PHg)p(uO_KM<5aDT<<Lj6^A72}W>~Bxw?bG4xX{f&|QV0CVou%N1QCk7T8JEU^faf=
-UCLu4De_uRQi>3XDG{Z!HZRP;{|%ZX{jH84L=3AQ%wgP$`H%(p6_C&;Nz|s#vlF5DBu%;H?CgXr+_@w
-?Aw(=V8G7OPqjVl;y<0-xUL)O-y{ben45lS6lQ|vLH`DgCbuI`H1vi)Ncifg$F2>T={QGct_qiv4ww$
-5I)}ux7}2R@aJ9u>Sw)(W%0t_dl9EEesayX;SlDPEU5DZg(m3xSrwsqGpP$b>$T+YAEgBVgcCs6&UkZ
--B{XMQ`<FKeU0@L~t73nmzWz;ar*|aerxQG(q~o4R`_}RJer`n^-`&Q&uhTW3jb%c=oXgxl>LT;KIX|
-J2O7RYTbMfx%`MZh3O*Axl^JIkL426$&g9pYlXkI%wA8Q|#XPgr)(;CzG$>Wc0m0fU|ywsK4O(^s1$;
-*O<cw@j9d9V!#F0_>0FoWPHiN_@JExD;ojvF^LXl&N@c?7K<Wi0UG*0P?3dpaJ}Qz3_Oj;ga7_0Z_kl
-i5!8v8@jDR4-xvLy@J3-Q67%)3_(bki~cr{a!XL8@6fX8F!oZn1$B~y(n@8Q9|TK$_2X|lukHrxa_e<
-l0JU+?c+eR+Zaab?W5b%7H=mwX3Px9oDQ(sc2NUA3eJY;`l-9vr0{bj32k)YcZsh{ITt=N7T+MFr)3V
-#<Gtjy%Hwwb%AM#Oo@*=CS>US%tOSt_R7_&k<@b+^tf;Z3^TAF07g{~gM^c4Z?NRC3i`$$?ZR{p&^He
-iABr-{Q)Y<g_IR^~v=GDNifOf(6z^K1sp7`Qk=fQ6upf>|M7qLDyu!Fui*!|?^^sTue2!jLPN?*9xN%
-KH1SG|$<5#>4q29Y6lg$X9XMX$+5Z0~P&qkGu9oMk`kB-2eZu@l1D2)tHq<I&7f*7Umr(z4{8Iy74dJ
-6)cqR7;rSMqTiXznb3kI%N0Vqj(JJblqY~@;E4Y8&9<AnKwc@pC3qaxn0OhKh-TH5cPvU2+ytG9b2p4
-RhiLsujfv$ENXYqacAeAE^N>$x3G4rFc0KB>@-(O*=HBNjyA*}Un&`qhkPTBjF4`&N$^6?Xl5;;d~Dz
-fHmLAcKWxoocwppE<{G=DD|H{df-xeV7KEvT@_5Ju;vdZZD!}3B;d@_;;?eOpTB!BJb<!zYC+zZ|g!p
-~DmHpFzd8!isfv@?BPTx7f{xc-}!ySLb!f!kMFsw-dJv$Oe!D0wZAOwM<7>X<@IlUy~Bty{z^Qkb;f?
-4@$0te6r2L#3i9+&hMAwhP%z$1W~2<Y&GxtPxt?yv|z9JO*V7w7^q1Mn*Pj{}$21&#1GUDnl$Ho-xvp
-086i$gfzLK=S}z2WW7x-I9_o_y&x1V$khhAQgpycz=q3$x>|9^<M=Bz%3vNAejOnB|-CkxwQpamn%zG
-ERL4D`~9rua|Oe1jrk>)I$w;+J@<{ya7UFsR@cktjrsk54u;?K;}%qtzF?L8ox$o4b$ifruVJlH@ioV
--YS5Smf;%;`q?y1FXa7&H2>N(Qe{x0tq-y@uZ7R6QlNXucL|A&iEDA?d8%t|jO@VOUL1*)Ld1jZ)YP2
-0D&4~Y~Fw5?Fa+XTuRnLw_DLLC?d9fk2OI0di_N?eUc{yjFX6_NRm6RdUVl%#4^iG!_=Kbuuvi87_1h
-T!HyAxbLnoJ`!)Hal>mDl>NJ01?<ww4JmN_J4ysglw^Q%m)EbKrI(hZM9fo({Xyjk%t<`g)YcYoZ1$Q
-g9saXCdzEMsyjTePcPD3MuW0sJH%=_6|uK7R)6GB0+HH&2nOn4Ln7VS&Hm~h~6!+?9JFXT7l#~6II$!
-m<|QqrP=NF$McE9s;j$0PTkW@H#FfLZacm#V)4@K4tRN3^35}RI(8Ly5x%*)!Xs3K{U6!7{xe;jJtK1
-3j?3$_fWkPzKIVI=+}iox)|z0xYZVL{e;=WJ#CARJ%PRV#t!wh-6PLby;@*-)L|2v%(wj~JxLo@#FHx
-1r6;<Lbe}m#a`!`PSm0Xl;9$A??A{eS%A0VTGTq_W$sia?q@r;_YBgwpV@15i<k{cuFNqQ6UXAkCd%D
-C<JrYBrf#IG;nsU}XF?qom;Tp8ihq)k4uTX~GBvn2~$HoMnTd<kW1o^vPOBpokY4B4W|3sNQ$%@9ZYS
-zj2fg;WA=1*E)e#dLEYc>PQm+r7&O(aAzX_<7{;xn-Xjg2$FHxc5QYZ3&DI^d}iADH{jSSr^H@!;ABv
-5{0bBS1mo+@pSb(sgvC6MmO^sIr)K()uW`}FP%S2Q8FoBq>c<dB~VTugqE9bP8qQzcELl}KeOERxx~v
-}C|K%aw<qY>GWYrJs7~7`-jBIuD5;8-mQN@CpKI|Lnjsi}!$y1Gfc@)mZqGxOeiZ2WcMkAXwdZel{!t
-MY$A|?cF%qXyoLQif!IyNBCSZE`4~^kCi4)YPV+=$Bdf^L5=IclRwaV=fB&ZMrS%74<YC}LqNW=f4J{
-LD2Nl*b_Fm=JOd=;8w)~fcB<)s7=lmk|=tENG`f*hc_r9hB}`lWDB0_22J62Nu-CPkP3E5bmPdV%z8&
-1?|_)U!dZ7y}L)wHC1RRdf%b|CKXfFM2hLhY65&B5SK1l(fm;*02?j5shER7)+-Zm#4pLaQ420R5-%c
-adZ5oL;FYJ9$5WO9%p&CPG6xf!Qn|Q93LpRl}&<KO;U;GJAX*zCQWfs=^nPsD-^^?<BE5DvrL%L9oRa
-qqp9L_iTwr+eRJB)Z1c5KuGIR`aT(Eh{V@gZr3r7^>d+So9B_txExGA83Y;o)AJA7ZD>2r%x7+18&9<
-;z0~~t5+=C8;^&)x65@heCS?pVb(=-)vOr5}=+8Eo_n$?do`z{6{2@Z@LAxoqI3>S{v49m*WEYG0Rc=
-w&|mwopP{=SO-r`$QvC51))aK;W*Z9Or_O~lw^?Eog*?U+UTlk-qE)I*&MtUAoJ+&ua7-s8jDaHo1N8
-&gS|<_zI$7vZ+o1u#+hDyOhb`F?bAB@#yXX|%L$q!S(=Ipa7f^6Wm@(utJdQ8l!(BdgsGdlgd@T+5J#
-OychORQAw!$_A0uRu-e^xOsA$TsFPU<DM1h0malYYGV%<qbkv-9?fadRvQevoi5M@O$Re;X(NVTsIT&
-LEcZtr$2voO;)8MC^-uXBdBWKctK;=#?}X-Rk#`o^%k$MfZ6LwfbV_`4mS=Ie=-0bpFrLesQs_pGF49
-94VKTytA>31Y&X*<*(-k7<L-7WSPC^(^xA)ZB;odUuVzanxEFYr7k4<g!;2Zv7sz*;JE%xg07d0jny}
-9_%$BOXZ4-jy>H&Pxgf;PJ*kOg$yvt(J7eX3Zaai*UDj#t{g&(txhmv0n)X8qJzBJ<OC1^S+dxorH3|
-EA4;yqvRk8^mOq5Ce98C?_?5?9@;Q(O6==?e6;Y`ypezoR{n{?>r%s?u<ZcHD*|c;vhOjI>j`9G-Oe|
-awNy!*(ap(40k4!#1?&;PU7s*g*S~Z*u#SUj)8SuvQe8OJ&#h{@6@1u=ml=*^fh8&d)AUIWKF5o-&MI
-OIv?HQ+oKqA7*d_Rf~E~xOzQa*8q)qw-K+bd;*3V{;T^{uGP#TBLdBtZ=h^j^TVm}tQRQ5up6$Uy6}a
-v~=7`(67w0_@%^sb*p?3|V4Z$Wi;&>yh*$s&_T~;J=!{bIP;Rc~``(ko5kBe)4Lnl)DI0kl)(K?q^(^
->4F6(?yHrDO*p2%PiXSh98~H2*=H{Y!iKFS~CZ05$L5foS#v{{Fn>;eQ?e7ypr<{$DxZJFfrX!F~XEg
-j|wd23ay;lmT+@%bx}FDS{v|nxqjFr>W(IPs_t=4|)ONB?V4k(1~796G_(!D*_6`3<>51muz$a)L&@6
-Q#e4_1%DH4b(>r88v{x4l9J*vkh=xk^aL=>NgQ~|0{eCXj4dYFuWVxp0M$!Su;j(dahEifiq`8)fanE
-qaHoI;9<sX9MXP@85;9P$PCY|`93Ng!7Ng+GfVEu&HdrnN;QjBZ>IBf1xRYN2-lOkxOz#ru5h_xdSG6
-GZ_~+%}^Jf|H4=&YC>%r-gaz-!CiO~sJsbQT~I6R>pYV83Gug1f>zWXcv+FMnnWi3*?b=^rm;P#TAe)
-VC6zIn(7z*BSjp)I_m%xlK{wJpq@KVC8PPcQl76+{2@lD}BT{%J}r)K7)9H5rpp6~FP+5<orJt{JFol
-lL|}k291|ns}h5sWSY0IPZ#M!=!W3ZHr=z+eR|wbF{-!uRK{@A{O+(Uw6XE%1wQz7G!rkLIyv|yP_eJ
-XHL4p0Us|%CyLZ+uH|Vq98Z~J>s;ONN<N+?sku-l=H%$Jf3U~KL2nJz%KF7-{mtP?&%>iV`F@9oQ~Rh
-<*|)fplib+tQ@${iSZ=GtxLrH(=AsSf&NgyCbP~iBH}Ni>5Ys~*XV;^S&b_Uc*po;PRvxPsavTEfypI
-a4OSa~G$q`&=Xq;j>TiIbO4qXG{aet*~D=7t+Y2|ggd8Mt=``C}9yU$*aHWkhM@c;*We-kzJAvoVs>I
-9_J=8xGhFOIK#i2z_SK>O^vANcNYlUOZEwa?5{AnsRgDw6sob+!(gSdSLy5Q>Iu`afpQPz>tGD05FR{
-r&}uzkVOw<@Iz8>WKMAuBG?Gcj0$hfYhyib_0^%a<U(WB}OUz8%ONjlrRz+B6BMYPZ^Rek!EGPD6U*j
-hpJ*dlowhy5<03uvz9RN!&N;TCu!!+V;g#w@EFsFT5X{cVUuD3PF&ctPm(=YbR}rnCJg62>r6?RnbYN
-@6Pdop`N58_uFh;_*}cE=U4=)r0&Tl#QqcRnllzRz6KRR|ui^q{r&c-K&Xtqj_i%U-+tWNgcGC9Xv)k
-L=cs<21o-t*3LgPMD=|;!yD3{%?c#l@@J)SKIe#IsBm}2LZ-lXouSWD<s+>BjjC1&CvWM75`V=6jyk*
-6lwOS`n0gjaf|^)|g<LK{J}7qNsah<8>pR6E`_^rH^M*XTuju{^QYKTV}Yp8wC&>3@EZ4=MHE9N-7jS
-cITxlwJ^)g6Rc-(FJV5pcsm*Br%G?Xqfqw83rVeR@Elp%$|bmn83iG7)b*U_cyjz6oD%8k~O2h5C>TI
-#xo!e0Nh|x0GHV+LAV@mNskG59Ty`(C7RAwC|?o!mpxfzWu!4Ez}f}6k=1~9LDMB~j#9v~M^`g=(Aix
-F&El2G4$c<=Gx%urN?Wc2UB}242v1{hO-sHHcBg&^y8Ibr)x|e=G6l|_*H&c{iE|xR&RWz6_Z7S6ied
-rX$~b}|+01jL^MTa#Pc!N_b%B2)qXu2DubPAEw~SgcVeJo1-iuKKy1H*!^*eEEdC?K^?}=OG9~2Fs-`
-(TyZV~$3J^t<%p^x{NR;<Yt$(LW3$^p7fVVbO3=x26;aSOXY)1>94;6$aFZ9&pt--1hr92@n(-3g9WH
-YeQd>mvtqoUuf;J-lnixkxjI++f*$|8#{wyrbtSsH7{rgOc3ZGkj?dM^aT}d>ixhllPkV;@uA#(VfQ`
--EI8-PEiMkd$cRx`lGcMl0?Z8oV0WoVpr46^G37Ol<1u7560D@@5o9&epE-j2S$2qC9>40$JzCTW$fi
-O;8nh*JXvDv{pKpPP;OT8veGm1zMP+Sybst{I$zp+M#iIN$Qwyeu587+%ub{2D4DYhCtH+W<(3gUxAY
-0gLdLpVDpd^@X{*?pMwuXnIi<IBdJuZwV_MrtgFjE04ApkTzkJos_Sx$P>nWLi>*u|{2WE=;%j<S7%H
-gjs^j%{6w!hRry7X;56}z;*-G5rZ|GzxX`x^h7b9}$RFAF<D(-cKh2!de<!7R%;Ov400FbG1U7=hCm@
-@ZBTCt$pXK)|?cL;-RNAh3{Nz-U=hm!*+f)x^<NqWl+%eM{DYqM*5#tqr~GO<a#y2X$AIEsOy*Q=9~U
-Vi+_fmqWrprR7(B##N05U6UYCZN=9yDiRQP0gZSqq|&QFCYr4(FBDk*m)tN}T`re}96%Ngpa3LwBuMj
-sr4|LmX!GByzX&u~;D`3>0&hCVYuZ{j1($?8SM0sy<n6Dhzvt>_?G;gY`#u7i3x}jT7xfO|ss3(dyaT
-oIXQDJO2pD>#Jo}B2>MZF7&%RIVgbv&|p6G(%8YFJ5_cdEuetssM-ayNe`E|T!$*J=99lYi5&>fo0{>
-gqzF;`jhw-PF(gL0`OPI|@8x?sIc5zk*=BXmasCDe}%Odt*Tt@67p*2>p2I^We+C(SldX3S2zONf@R%
-9qvNW?u`cAeya?DjNvU8-=$y+Me!OHYdlJ_Xy?psxSDNc_pY<Yj!d2zB-IC@7tfC<%h;bJ>qBIu9W-C
-yX#{)75cuO`hqtzySp>`fDy3UT%(EGDVsUiQwMn??76*bc+Rd5)tBg5DOJ6=$$~uZ@u)WiwtWpZGIg%
-c^DVtf;tfG#A@HVxy;sQG?I>f}-f3O6y`yzhb{rcI^JU0UXk;+`xwj8P*pv@eKKG2JBg<-9M;Jb^<rM
-Cjk+!B={)~l`fa?T%)`B{hs1uiMaF?Lgd=8c)?p}A5MYrjz-$mCZSXS+Oh6X21PuobtxCb1N`#dK!M?
-1>pj(LXL*W{gdaslBYt=#!?$-IlWfo<cQVugfK-TtvT8fHJ0>LD;WYj@}_OB#}IaMaO8ubJ%ESYD8Uf
-p8A94!s<YOxZIO>dWLb-mSppnW1>tfCl@eoQjB}GyhBlg8oEb<v!}0TNTlFrL(Y|*$$<=QRCgEyqF{O
-J%#6w7(C*m+>Q?=z8#6tH73YDYW>K;kC)kSn~TXRd%M2E&9R!{i~^j`_*FAcwbiuRe3huW!OT#>J?R;
-9cQ>z5C?B4PBdDb5GO<N(d;W!@6W6Ax<|$J(Tm^D;(Rqdw;&tItn#B|g-#iN>kZN9>N*a0|2mQ`-gGm
-jArd&D=nWZ*W@PpIX$@ZaLFG+J!4k6ExH>aAb!jW^9jH&U6U(V7gf=b;pSt>r4d!yB_y=4?iDT`0vlF
-#!oZ=6)MXX_%#O~GTua(Q^BnfUNH6R-1;4Z|}eRXB@JuSW01psy!8y|Y%2Qtk4TD*uL~F70m8U?WF%6
-S$P0JkU*k(%gX3;U^weJ7{~La=w879LU$KrsyIdm|mXSS3jJ8G7b5BlkdGkz}r8RA8F88gi(gVQJBF<
-6rny<N{`ll+=3@Wyb?vx)l_43Lr&=xcF2FBG)RQ<bb*>rQ4tg+GcZ}ZKq*cDB#Us+{R8tSC@3zz$(Ip
-t(zy6))se0`>eMe#aY<d`but&&L}shmWd@p_G!7D;B^Ls^xhR;-O(+1Bpg4+y><C{cbAg#90{A~z4&H
-)ea9=qAre`8hK>aN$UIF{&!hh4TJyHoiipQ5*Z9mnq70i!1wxPWQsDM_tHpv9G5hJ-7GM|B?llGk}h^
-F!H{V<d$0m~E;0Ha0-Kr0Vfma0*IQ$+vx+NcYk*o`dFJ@f^CHQu%Q$VZ46vo6W}%?X4ZNA*jd(8aCz)
-3gQjH&s40Ix0J4h-O`J+oGiI!-2Y<46&swNeMFfoO2-#nY>a5J0g0?$8tKze*L6_*sm+x9?lGdo%Qp^
-;;2TQN9vx%!JU|`L&6qKKfe@t>RwP`CP!n(hVZ0p%A50oJv>t`v0litVa&2KJog2>Z#}U?oAy54UaIA
-vE8{}ERL`B_5t_OD?jhStUt9xz0jd)*Ju$JWO7rgd*NE)MNyW$Z#ca(N*5L57obZ#oi{}DAS1@Wq2nN
-68gLXK`*KJkNt{BvX&?WBRpf0cG*v_K7d&{zvOkelB_t;l>5KKvPoC#6oVielli{@5%`@u-7!_m;BM&
-F!{cS|lR&T99$daI_fM=sd0Cw(@~zfD_=V-eSXh6wTl+n7#k4!jjU3+3ewp2RdgfpOvph3pr_EeRfdo
-c)`P<<i)j==UFE@F|A=-H&lm)a-VcD~L6>JNx*nDOpkGeO|U%S>A}?!?hMDS#JKxXY^aUt~9l*?iAF#
-Zp$8(Gje-mh3&pU^s7e<(IyfCCU5cFQEyM!q)RCF$i{7thWM<W`{D8=XTaz@D6jdxQQKz}*u)l5R0eZ
-|QmH3a4#p$0d>o6Jqgts;pgf5Pfp4_lG0r5KkYV6B&EqhnwKrCjds{-03aOjNk+YHMLL*8em}9_P6Vc
->@`{MyAe#u?P%ZZeXE61oZGq^5SJS-M-@3FE+g3w>C`auX;j$nwRV~;pMidt>ZV>8<12o12=j(p7C5O
-?gVr>CF$kULt5^4uN|hkOekQN`pGPqYon*4XkInf)P$z0H9$_S+>g@Lvioh9dl|m1jnvr!?Q3nuPa#e
-tUhu@#(Q~!oxo@V9p-HJt?!loUF;}zWpj^0fan%dXtqwZs`0E_<uV~-d#YlZpdyQJw*PS2mb0X^2>w%
-FjPu^S{7W}R(J$N-WQyM>6JdZ=36)g<lS=^NUkGmxe%s5AJrfLAc9?Cz&}OSsSF|ox#)5vpgXk+MlAq
-}!2lWQ1W-j6#C(^b`dKq{)p}a+l~{*FlT{>?%2#^nI+3~@F?y5Fh(N{)UeAEEC`kdL5Aa!z*Ww_&GJe
-*qmRiR@sO5maAJyo<z-a%~f0^5T?zKF9$eNZzi3y}}{d<Yav1AWP6}^h&C1;bpd*~0(*j`mS^DiYJkV
-W|(kGP>fHGn4ysnXY}i6-vWdRnzCKkrFk^oxUjbshmGSKr%ef%%QqbNM@4E#j@xx4c&Ud>atBkN@O0A
-aEc5$!$PuNpQK1e=sO{<4Fy{)%!&{h%Qt{G%Xq?5zk&~Un!v6tT%24$EaP&E!ST54XgG}i0n^Iw$qG=
-m4}CmB*vX`9{ZAqOnrOosq3<eTy2>glXmFU{mbn(3(Q+vr66Au*=}8j9k`9I%zRgktRFoQw3rdC8gI}
-|5+dY&%nHKUU)fiv6}W0kVH`c55$=@%>o$2(i?n10T-Bh%^>%g!4b4b0@1rwfL%Mz^DP%(2^cK^zLQt
-I?Xm`t%TvOYGgGWVJF0<#N$D_TS5e^s7p`)KNUuk2w?GwnnJ|!f|j}g1^2}3GdB`jY%iAF#YaFNV%Bd
-7c$8X87Tr|QDIs5xS1$E%t<$N0Sh4O4{1^=13LQp5+I%rs(k{CIi}GUdhj)DIFm?(eThs?F>X`ozRb`
-mAZkef9-gAaRusYh)|DIZaKxx|_Hqq7lD49$kpLBL}B6SKw$)kwM!Q)W$Em>49h(LlGn!-|iP^*p=kn
-8C-I%PZowpRq>>iSqe4Ne$8b*AGGwWH>a~YoOfPq2loC_Z-yYzhf>U>O9ZL&<<x9FQWH0i4!vmh>tXc
-lu{u8Z3!?8R_-6EYr_#5O+7?n*x3CX0)nlBUI&6hQ1CeK`tPOKg1025R$y0Z)lBnOhbCs0Orm67bUOE
-esgGi=Zo;ZTxaXEdZ$YI*x=V!NpruY`<4_ly&v>7O-@}IhV!(~@zEUwan3Mr{0;}@|d8)yG^?R2j#i4
-!ZeBVKt#>q2~sl7_GK<>fHTsuOG&<;Z#A0`UI;6Zu!X<Y6lUeP6*ezI$VpO8A)D{rPTR^Sw`Z`JoL)V
-*~|bC`IE0L((WsQ8<lb<ma6)6o>^Z5Jyv>XGAiq(eO&($RaTDx4f9Iqk{|9WuH$Y5;+hq$OwRu@#=g+
-(E!JmR1XkRDNxnKS8v9I1Ym>4fTfDz%m4mL6M+PCh-nV!CQDwKF>9fA)#wIPQwESmf!9d{fOUbjGy<5
-mz-yd>L6PO+sTH@g)%g*{z%a>@>|zWcs7AksxE>Tn`>%!3!}9$G|8N5CUk`5asWi4Ri-E=kUyFiA6Kl
-?ZUhy_{HGXkH{=qav$ow6Mo4-K8TL}+(ui<^0I#eh9T}(jwVvzOYYhTa4w$A>OvxAdE>)HPS5p$!R>8
-E9xVR_urx=uh8e|!zoO{x0RBz8tCN4<#>ujPuYD4hu__hJ;|4HPku+&_qzlX^R$rI4u4eYl@(Xh+BA?
-HuK;>=z<T$@|uhk&w0L$&?x4St0y+L$VZpg$cEhQKNB0^JJjsLyUPwi@qS`FchO09@yO5-8w=(4;)-Y
-qQ>5-$JWS>4|!;5j1k!b)9x(uhFR?LY%>42d~+h|e1rz<u3en!hShnDcrdY5&mGMq*Yv3L{#B(qga_k
-hlAi3$Fgzszet2T>l1hZr`Q_^~Bn|9EfZL0G<mc-xy-!gx8ZMXK?#}sShYqdbi8_|$b=m(>SZC81b3@
-@Uu?VNj%m&cOcDsxDm5AABs(k(hK77jQfPO?H8|9U|p50$}ReZ@_waaF5c$79WdNaFyCt?}`=ziLTc4
-bGXJQH7un85K`I}>B-@9vSW4L{6Itb>M3m4bhjRmy7Rct9VWj-^AOW+Ot*`>}A;(AOI3ctuI+aN<s%)
-mES{!xcU?_Ej%gMib_{joL*^0_651+b|sMT&b)oz49_v{D5-){*WDab09?<MXMnHx}acwWYp?zz-BC>
-bEqYwZ4fbgCbZLhxSm3FW8hBR7Z()gcRTtV$SHN6kQbl06Lc~fqQg1m7@;LUChpPAw=7ym0y~HVsx=p
-E^LoW4S{iW0bg*(=axa+K%+F1`AMR)m^=)!<2OkS_mT+XFs86lq7L1Dp2Gue0aRJJCq@P>Om}u@$1s1
-n)PMEk;Z|URsSRxe`CR6#$l^a~dD2bx^+P@*2<m9D%LAHE+dB#;G-7jMi7SawL8u)doCqE4mlRLqc5B
-Ueg*Q}i(CPj%KG^_Sc@vx6nLnFLDgSZ8e%12j}W3=W`$&yF${r~!Z{#r8ORWB$z?$s}u)#p5o?}6{Xa
-j<td{Oz{iBO^*P1PRmh0*VwyAT&b~1dPGNvf2^L3n(y7raqlhMAlLyylU+L4@YvPP^O?wmuG9alK_QI
-&{T~76@T78TyScEEqIk4q%uGOS^i7Jpys+@?vf-fI7_Sy%_IlPM9bk9I8K0T<u71zNhu=|>;{G=F;Fr
-ECD2vM7)TQ5KstzAF>?7~0m}vKL2kLuhF~jwBqsp06D!3eTdTgyHt=e7`3LS1cTg!Mz9}3^$(ae=G`U
-gdCBmX=ZrIb^=W~kLM^>im&EGO0z8E7DEs?lQ`xF(wWI%vywt7o03)lohA&*b{itWEN7B$uPOdGDhIz
-0YviUL~4C<O5ZnvZV`%=E1V_~A88!aoQJTPMxdMo2ZkRK~cA5GmdxL`y8Nxi!lJ%OaTUKb)79PO<7kC
-0;fD3%_F=%h2Nvko_$&{iQU{m!XJHZ787c{lngEC~(_7Qau)*1sw@#bWkvubXqipU$jf3I{X^NGOF@x
-DX|J<zrvVz^}8Ap*O%@JjL%&vdLGq>nG@Ues#Y>~;7%|6h_g|B+?MD`9;_R8fu}+3*b+Kd%B#Wb9dD_
-vvZMB>wLdq`9Fcyu<@a2TGa)~~r)RTuP$ta~yL5S9K?7eLil>I1AR+7>4LMpt-jGO|;&-B-nUR<0644
-vs{Ja_y?w<JliQ@&=Rxr_l;j*C`TSHGppdygNb@wn2Z<FblRGm1;O)GbVY4Sr|8`O1Uak{Jto6}LRP6
-&E?7;{za8T%yM>Ue>(9hA?>b#qGb8F2<5j?x}yjoLkONHgTp;hJB1xVB&}d}1noufn^&-Gs0Q8@_qHM
-S0Fb_rj90#$<0d!eMTw4$lj^pB4L><E7g=(xuJE)J)`tvpFvbI)ast5-nYmG~3wQhYR@%vJo9)GN0)=
-<|=<4oBr4_ccvtd!4+)+=Dxd3^x3S%EGF9hama}y%#m5lH*9#Yq0WI-DRNELMrW;y`o=`(>~f>HiNi&
-ITUK;N3NJTG`CFsxO0G@mvfP|KuI=}C^rAp%dqR!-<`|Son2miuTQ|Fy@N#;+w$CS1Mu)VMsR4Ha%m_
-E9dJITRMdNc9a!a0fzCil<v0q{xqRVFOd{gjU&?NpXcvc)UWVYS8Z6%b#=^XY*C7eASvDz2W)!5~=Pd
-!0glG!&4(5ogFKT=#de92hDj(*7Yu4trDa)|@r*Vfl18XCV$jD9yQYM6l-zIugaO`teF9?WHR62RB@U
-0TRxH8znsKUrd&C93Bv>8>3Vh;KrgY6e``od{Vva+h)r#9vL1EMGJ}HUt-`x#Pv#J#v|Y9?u3<c>~#@
-9E`}<P?v~1D;>jbyKnEdsaSG<ovyx-afjYwnn0ek>#1wwZtSli88pyw3@=`H6wd7ule}8a!%X>gnXh}
-Jz{6K?qf;L_qQ0{c!nEp9-Q;;i&Th{g%`$^fAEDi8=v~F~I(7<kuV>8AY}}$Mtk>viR_8s()SGU1dkA
-y*gd5VMQ#jOrapEc1^EZAA6_*?%D~#Mc#^Gw8T?2_zxDkQa1;cZ`mLe+L3{ia3wX|x*qkekCx2n1D=&
-mq%7KJKuOX&}M;Ke?D95(R@%&J?DA|c~oBU6PoT6whZyK;ktW5_2|j8)N+wFk`RChIK;5szk1HvC>dW
-k-3agPf^jBlz~oBvFo}!$M`0T9OWj8cWOUVDpW-mxvoJ-<B-w;c`%qYMAOy;<OvA))I|`8088vAD35|
-SwgFLXBc}1p4b?oX1`v^NbDtDRt^Gnj_q2vp>1W7d0bug>4aXBV%%`nRA@n_*CnjhQnJKQy{yOwGiXE
-tBLbg1<CS&1T+mstHs}n=7vy~F(Ir2yGt8^ak;GEG#wsm6DU?yY?nlyA%3v=)=aAkO-EeO=N^IT39k*
-o+M}&MP!EUu`V38Tc*h}>^*N-0(8SxZu+-UtGymkh5?wr;TI9^mk9D5aYXZl-on$3*>mAbi6)e~k{@U
-1(-SH5U;vR8019RIMWVf??z5>VNytb>s3>(7>9IDhf%kKx>JwtSD(KECxs0iHk+7)2=*XAt633Kz0+t
-d@`mXhbuB<C-U6Y&3pTYIvK7jn{%b{x5|3Gz806QAD6HO@gBN63GGDZwy+~%VCxv38)<9VEQy)$5yEX
-9CC@1m|so40>=gh93{cQtPZ}8>qI&5WXM)x8S*A$L9C^a6imy|>FO%J&iMe-*wyM4bh&ZBNL!AEXP|G
-614ppmRw@h-f}OuMt7Vl9B&lQh&l}bE4;{W{choHLjV`$wu9g*unq0V1oJtHeE_ttBn*nGUOZv`&@xr
-Z{qqjs@kok2O6*R5QNuPm6@*9zAm4^84wU1{9Cx`x%vjZ6<=uhpt*+VivPL#THuf~u*;63-adW6tJuz
-hgC!_BETm3vde(v&ZShn8+BqIA@lJeP0tmgujy23D3YldxB|&&}&eX1Su=a@K_0mu;TWcz0FLw;OV;S
-fkxM>iFSfI(6VOzVL|iVK4GwY%r63XY;#5v$K8@GVHv$6Dee+0X{oEdcP}Xr%L<l!+x>em{!OpoDTA^
-#DXPBuxil@v$od-;=(T|?)G+u#0XiNkik-$3ZCK?j<06!kG$dtuv*MRH=j~{o0PgF2%Ssxw#V*`3;r7
-M`=M&nN*x|jIX<CXubTKnZyL52M~T8t-V+y%gZbz#hYf>c>;laGtE%A3G#{(I((aX=Yj023b)4@o{S~
-`^Yv26?PdE7{$Oo-JZ}3{n+#5SSPPrQU_j<4J40r4GuKx9~2)lvH*A6;VCwiltQlev;^U-=aT75_6ok
-25jn7J8KRYP2ljA`4Z6HTU^Jm?)v$|Vl-;wwu6Nb5}6mhoc;KV4>`oEi^nZ<kg{BY0l2CDonA_m`)j6
-1pKZ9@;A$5hrk|(Dd^Vk0FHP#k7&?s91i94H?1{Du_NkovPao*;;p=PlqtZ_D+;1lbJ5b_hF;lZ?K=`
-?Ugu?Dzr<Ha`)1b!4VZsh+z4`GreL>uG$Pw&Zz`EdeG5*Gm-3W-s>uy32|s-_K<9zNv)62dD|@^*63V
-2(r%H|skfJLyoiRDw{eJIm!>MS6Q$2iUw9!yW@*Wt)dS&0p(n6HqeIMt9Q~TuS&|i;;JxtQ_Z9k|zhv
-yAD-b}9FN|UOuOHv}Q~l%r6X*Y@PDbmwf2>B(FoVDZMKTOZ6D065VrU$u2^3}+ilAwNU_SL*hzS5r7!
-F`8VZhWSzV@YY8nkeMsNhNnPH`{*0)H+7v0xmNt&WlO>KRUfu}uuf69H%fEaDi<g{J5#9*6?G#gi2x(
-_i(aaZvY<fx`n(1q6kTwG#kJ_v@a3c%6WD^a6`S271&BZZ1D8_kuEjOr4<sBA1_W4Cpp3SV<<U00mH1
-`YjZ0!Hno5`c{pIrbolIugo1d=A2!|sW>Y0$8i4s#%69m5$%&I*8Qr(>!wYNyqC(GNASWYV?nrgRx_l
-1qxa&f_|wM4VP*HKMesGPzceAwAqnahF-qK_%n{Kq0ydxnJp5CCBxtQ`y!lqnUs?zFa=>vdWqfTNXqe
-_Kfb6KV?$n6k^`L6F0yFe0qomJ$lIl?(-(`j0NZb%OlfiR8ZTu&;5laXGL+^7fhwq=Z#Jzx2Y|_=g8{
-sLS<tZ!L{IfjbFT(<TKA+lMpg8);078zN$MaC)uMQD!Dc4umP{pTq@8UH_2J?%k_FGPViuUUqDeRt|b
-_p+g9qO=`i)OQ}+d}0%YR<VpBDh^7d*&!#k}X#|-YXkkqJq_$T~Ug>Kq#Av389{&C=t%`D-Gz<MlVGN
-5o4((0tvsY12_4ZaB_|_J1O^Q;2eCANxkLW;xLo}I>i!3<>t=Jt|P{)b~&DpTOZoB(>-9##%a7wo^7^
-`SY^Y6rHKklC;Z&B+XGKMZk8!ZLr@i|SHuzvr<TffbT+XENND$uwDA{w&o;-p=G++#cBYQ*q&^+=$By
-i}X1Hn8k-BJmQQC4#Qd=#-3sbmho`pPAK8yx&6aL={3(R1Ie#rkdi+J^9=@eS3=+h0IrMMCBt)|e!$F
-P7O-@*cDi3^6wIv%~Aqq6SIbR>Rnv;2t;8~0Q+m&+!7MCyx4ZiI3*$&+|1_q6XgMoKrj?r_lTk{r#_;
->6ptzKi9{wI4CGEE6Uts@~sGBat<Bx!<3&qp0GKC14TR3l#}U+6c9&L-iA5?o)tnN>NvW(ctjry7yu%
-c{-^SPMGe8r|YCUs7i6Bb~=eu7$x^?$@mm8yU7B?`Xy7ja@lYdxASJ2K9U04r?g;V$3syjcFpR?$BPT
-HphoFiA)I05UJ*W~Vu%^I3S{r@8cz?qBZl3FEq18<Y$soz!($>Vc3B{$*OfmBQVOc)OKcIRdLwNZi@l
-$&*N8`D=zgiscp}~=V#aA?(--C8CR^h0pSmx7@qGU1ee?x`ssF0Q(tqt-fA6F8lPfiaEC7z7FiD{_O5
-g|#FF%tAxn#KuzAs?EWV$f<3)0z}2rv+4z}LJo1zqz6m9cDXoWB+FS1%;|b5iyKtzgzOS-b5R7!plZD
-jOg`Q$WTLqe1^X#{oln*%GE#EhzY_Inz(z9<8nk3#Jn=NN<;9JR(=wMdXXo;ezjg`<;V7bPSx7kbI?M
-W8fT1G(zQIewH8stS_Mg!GL|Uw_xB8W>LYSU7+90l=87X>8<F{HM6UbQ%h1O@3UD{;WL5#zc*6)$qxy
-7^ZrTxEkC54z@EPXn~eRf_fN6nSM?>Sp2bNM+#eL4W<ywF1E=_2;Ys{N-@?;4?VX^efvbkTzwG4zqh5
-Rg?-%`T0_(*sv5ADGvU~p+w?MxNT$Z?{)_C<jZi(NY(f7CwS~AcoUHtB=y)20$8z=yu=L!a^zO=_hk>
-yn(C|I!{{G{j}UYARDrskV-8Eqjhi}QZm9R)L&SxH`&!<~Jw_qADd;<n#jUx~ayL~Pq(*9^Z&bbCd+v
-S{X#QM&e_lh7r)JT}yIPBgAN?^OiZ8__*Shw(vAo9mgNw|8~ADAwlHdY`!lLf_j4{?0Y99ST-sg)YK2
-l5CKN;ZE)$;aFIBy!^U~K>c#>B8bi+lO4lComd^iaVb@NGH?02!7u^8Z)R7Q@tXG35QFyG72HlXWC4C
-Za!sO6Tefld=XM+P4i(PhauChdo8z3g%pvJcg|AHRtRlLNBmD%OLTrD#!Os4FQ}<@gs-n-A@I9ZRF5e
-ELTjrr6`hs~7P(VP8zF|fNMUe5+H;-pNwNFjIj(_)C5w(vS5rM5wuFPDymTQ?BGCT<M7K>vNoEBnX>$
-EIM(fvns;9oC@*uOWpqyJ9_f&ZFw`RgF@Lk5VT)P@rgf`SPWr~)y}dzf_#4nRqsVYaw|Q`Cnk;I^_N5
-#SMT>nr^>h>71y?=ks1MgE?lU^^ZGn(~&}VIT9hG6byDAlpm8!BPekKEdb>XgR-I(HQ7YBNSMpf!oYm
-@`sGJ!~bfaHG0=h-^nQa9%9|{(d<21o4q9h!}LuxX5RJHxAqXw4kE$NPp#<f?YA%zed<O>AV&nFtZ%(
-}{4ZsK!~;kH=fl@15wP;*1&4RCbKvH6)%AU9?S7R4b{~1!{1;p9<^MXwd=(P>TOnrs6k@h$0vqqx_Q^
-&U`Z@tC{2(GY{GAX3&Kmj}V!jQm>f-!InKo4d9dGcvx2mGuCQZG*<=cK0o3_02m$B*l&;<RP*z{d!TA
-_bJeCs><uAjyTmBu7h`sjX78YqwZ-KZ=BO$PU-bjnbW=A&TVh?6;A@6G)5{jv>4uSD6`3D%8g(=QW$(
-sfZu2y;(E!F9dGlzOXeNsy(z_$ru7#6BdS*HyEc$n0>jS3DeVheTux6OJ#&!Ky2M$MtRq>lqXwJ2J!%
-x4Spqoeoafiyk@H`EkUUeP+|*iw`4Qx5G}1880d?J%4o$tT<b86rhg7K+LTRC|=So+K8q@z4y-EuHIs
-3MHu&mI8fwsW+!dW?^NM*$?Om_2)K9#yNG?AmkxEHwW#EH2#kwRwDWZKM|nN^`v?oQHP&oTy&aVHnca
-f>QCN|)_y}yNzY?K&yx#Sxax3WgH{E-G6^5ZNak%rBXD#zFm7e#z5<evTt7P{n>PPg?B?A5HbS&4h5U
-P1~$2QI_4hV)5>Ze6CE`s3L_^7IAyxWqJ%|!t71M}P-KMzxSV6jdhSNfn!st-N*moPZKb;9`8SiG0L#
-ew6Jou0kXTE&<h;gvO3JF<e?K3raPx0GW)UW8{89aAJ4pch^0S6b2T+#}dPo8VZdIbaEEbt8$!5`v)u
-4;RX4-o7UfcG@S)6-FJ`K}#i+3o3>Vu57F2+_qHD)7>@JrlZEN(X-jvOFkS6K2}<myPr=ldkU#`Zl7(
-?jSfZn3rgXc0X5XPKc-hdNQ^^E+wocEDDDzBX}1qJMD2qynF6LFMwyPM`#nx>&A9e%e`W3TCS13#b7H
-e{qrzrMBWy_a0m=S-Xz@=<tLUGUb*cY?vhx3__y0F#<sULn8U~zia?3q2j7DG*Xd)pSihyZ~Kqv+$5e
-CIS)E3?nL?Q(oFu-9;0ILm408MSn8nL&=1#qZ`K^K<VU_kisxKr{L?!|#<(v}qhJ3S1Pd_mzC23$GfE
-$d4lfDR7ifk{xl-eP?8E0P;HrRY8Oi@%kVP*A8Q--LA%0kvcB;uJ8vDF(D%H@HE*=YO|%-JW71&?H9Q
-RCJ&}{8rikIv?-J;=k4w<~x8X%5U1j+d2(9?1RNes?&rGhYOSt{wyuCWuDE4ndd(!DT9hK^tq&r{hN|
-9s3=4KNl6)0l%e!X%J!+GjJ-W@&OeltH#8$|5$=yA<!>X=|FWbEB0sdHrT@C5{1q1c+mbSXOOR1=DA0
-uGmZ$6(I0GhFIcMNFmc6m4%5t1PlP6e^+*92h2gRJF8^s(1v(^~fi*?9(Ae1NcWK`20+jCai)3uIa2S
-+azS2p6qO;j`OfuiiVgPln71#vp?m-XVI<)DW(^wRWK#4j1iAi^zFX$QX9%63HUwf6&_WYoVXvqB%$S
-%0Kid70@YwwLvF|Ad7wo475f-ihADGuVd=@%*Q22Rgkh8ncFM@rLa9ei%LYgw%(z4R2~WDTH#ipXK6I
-6Cdnf{bem9y^_z+)1sPtGR=y9$lE!O(^OH+T%C?}I5u~?XU0Lmh0~drcE#P$qB|V<uYRz(=6K_V4VZ1
-A^^x1UwNRZ^<pX+e!zah?4*%TF)xF=wwClgj+x%Lb?w>lN(*Lo8>;D_4_6O6}zjs<c#39heBq*H1aG1
-sk8ez65L}C<yk~j`y2!)dL$7E~z?V<`SR1lB=;t3Ez+OkDDewQoX0!#=F*w~=T$b4)HLxOOyWvmzhST
-$R)pinSjyB%!%84{p0xoyNg2{ci_NIrVI(7ee<AH^Z`EoZ;Q59D1$-43y3vM2!<)!T^yncWZs9$;jX0
-m=|i!KJ}f#5BlosSNOX=(ofM0|S;(M1%Zy3t(H;jQw?PJAj!aQvN2^#C778m$zh16ohW9#G;dwKaj0I
-=eFZV*6IHhKCN5Y_Ah-}zvY2jF3S91a_U7*jc&iM-zhu&J-YYL3GXlRUFL&)_W~K5`z7H$dX2Y)-rH*
-OOFH_U$$Nj6zPq7cW_=-5B<e&-wo~foW69!QBfaxo?^ycdU*b!!gZ?bqfx(@x{Zr)oclU<yvi*KHzm1
-mt4Z`_{IWY855<H_KcIiaUG+#Gl_M<&gge7m3NW&kiB()mVB#An|9@SNXn8B-xXiKWH@ij*GaCKq!W#
-q4zyeQ#C_LQ}v`^r-8$Nadfki*O?*}<1j#!V~o-d7+6C5=p?eN~b~_`;pMT~{i{laZ!GfU*?d!~S{V*
-LzdMT{^K?T8V3V6jyvSEcw1uAYG?WCQEpH@b?9J&@L0FWAr5<6i+lNkyP%|5XQZpxPc1CopT^A*18`E
-OMX?Ql$g+-Gwd`tzb^F|H8omgGsDuX;NrZxS-G@LNEG??dA?GNI^?4=QPcft8<iIhst}c@Gt_B}#~K;
-R%TIUk_VE_==0X+-e~InaY4Yjr<%bWpF24<bE!(GZ{9=#;{VgAQ8J2mzmjPp$n?!@#KFAkRN*+=_LH?
-P$7?SJre*Fskq}I`-y_PJ{n4Y*PkPZ_ru*E}^)O`)lPq|akV@RJ)x!k!9m-kRQSA)U3{&&tgeS{{Xet
-&=R*7wKvlRPjQfA(j68@+xWNrS%3q$T^db;LAtXWg5Ihhp3V1-{0L{LxbOSqH=!OC0LiQ=`iXMQAn_(
-DQIU)r^p1@uFAAuzfCq{iE77i%^PbazsySGuEil`gVUw=}vp@pgy%`H4eGjyM{ui@Q5xqez?v7J>X{!
-xmMz~s&c_YL7szn8aP+TjmTK%Q+z^#-EoERMbR|j-tKL$u}3Qs6V8lDld;E&p~4~yUg!C=FY`o-J6S`
-ymtj57*15D7q3bww2XV79A<38!!8#%5!<6r?7yPl?k5BnIu5j{7ES!9$(?w`cVYxd^@^wp~yA};CpHU
-SXs%`6-#i(bRcc;X-HNOmT)}cX=6jDLltT`QI!w8UZFYG78S95qAxvMJ2*#U2~BL-0h$_JT<6V>k0@N
-HQB6WRX%z|kH57XXI(kFnMNgXj4Np!F}#@q5%oVhE0bac`VP2#kP9k|Zz$VQ7MYkqw2BI1CfWN2m)6!
-5r8It<rbFo%|vrygkU?KR5J)ypw4Zh;My}y0&MM_Y_(3Rwjl~P&n8C8~wHgViJI{;tVt_&;-~4#0*gB
-B0*347pRM5K%+W&Poo3a^j0j3-y$jq2KpcITb~THEMoB9_?ykP;VM8`V?Y@re#<6r&r$@aJfQCZzU?G
-{V#;4z@fD!&JUzdnE*%$kDn1?6oKdf{`ly1m??1@?|1TQ5FaM7kyIY?XmSZ5dg8X2C@PWYc^0^xW{U<
-l@`%Cy&HxS%E=s&rEpZ^N~{sw~k2YtDLe=gtb+`W5CyRWutCj50Vi?q{JW}hn!B)bnrVoiP5uy@sLgq
-wdSJtGWdiSQ21IpxOCbjsl+3UhtB@*DWO=Y}k=T@7<BHl|RfA3#^UVAXIy9}ESn&FgF<*QS!^QA}A(B
-W}~a`K4Pt^k;mpzvC7UePkE^Pu$|6kL=?Awp+Yz_)wK$L)%c*%OSK9Pw)+N^+Y5ipgi(pbtGpE+2sv6
-C<HEV0_lOL$d!liLq?kq+pZk8Pbx$>#a2@AC#y5Bv}r}h)o+-J#iB?oc*P>07GMNu6XOWm-`mSWNV2t
-S*is|nHH+e@eREOFdAVou(iSPE*w}bt2@58j=i}8fH~H{_2a)|}PCWV}u6|>?@V@-^|9uKZ@}o}v+i%
-kU8eoJ#Ug7<J%~{z0uQ^R#<MtD|fA-ONzwnT~-XZe*!EV(pOty_!wH^4w*86|^qm9r1<+J(D1L$9z$&
-Y1u0>@FH#Db8>hs3X#css{ZZ&7FL9roUHL4fCt0>;%ARJSmO#h^Muf2=kJlYq;$#Z=-QS&{c4Vf<Y(X
-Wq)35tuN7F`yg<zm=vL>g_xKD-(h(IFkqvSc%^Q=E<8ThP|C{w_~L+;GieyI{>F(jvZkD838c1k+&Nl
-10r<t9&Osr378qYIc@mc9hag1vg{#&vd8$9_$528*b^*keMJ4-a-{qBnfsO}X{vYrrhUl)?aRAY1sAT
-4G3)#Gz9E3*T%5-M?Q;jc!g?uUkRiBVCbkDpmWGLH*NH^nq(2tXz3xI^swT?pRKEDI#SMMwaUXzmr(k
-?h;Ov2c&sk>5aN)SPk%rV^9~L?nF=pg8%Jf&h%I)5_q2v$m`qimmHcD}erS5bT)cKQ@5ZDF;V?J-&;w
-aRvKbC$R$^A~cG2WI^4Y|tFbiJ6cVY|Sw^|RdL3__&=Md)^Y;;Y#*=Gk0X<jcIhUfV^~AIX?Lz7i!89
-zH>YXkA>5;~FmDaz0hop^y0x70|C)zX(X`-`#!dqJhiI52D!z7juPFF&QJ-YE?0ks>>hW^&g2`&%B++
-6ro4<S$JgUvL?6zsAMYTI$W8$!nx<ROh2aOaVk|qDH)+VL$ySQne=*%D|agR486~cHX7lTZ-qtJdwUD
-FumF+u^yy7|r481AjHuX@Bh{WRNw-4ml`Z!oK0Pl~p`oWc<y-VaFEs-_?W9)N_j<`7<c2;pTi~h4^TR
-OpUTmdc9MLg70eLJ^CrRa5SBvWqs%IY9yeE-rf8#?0S-br+$avW)Z`jrAY@9mC>`*M1$MZ>Nb7RYpsw
-Y#nuBl@VzDvbKva>?GkNrXkFaENlWZRc^aw9R<=Kjo7xFs93%};cM2aKo8D8y;6Zs&3dE1VU*t&w}`t
-1Q`?JND#Q_lT8&XW-$cKi~}pt*rBX#~w(WL7z3w#J|IyTTku1+VkjO^7X_~tGh=H$Ypi{LIl5V+aF$g
-s+j!eb)sF1&nHe)xiGyF4b9yoyMUrmCgcNh=rWSC_@k@uUr5H&4+mANJWzGUS7t>f@!(u`dDh+@=T{i
-Kj_x%+7es^d(2l3;SXT?JmloIF8M<*4E5i&+syi`<q;At8fU{oet1BWo<}<>*(ols7x#HQuUU?|mPS*
-EO%U_3wa28G@hV0i-PI3y<>;})<u`b-`QRvvPYi+N5B#u|?<#fo78oi<tH0WhCc0O^)?xDG@dCt`m3h
-{g&VPjq~U)K@^ZksbwjbX>7Jwt}BZZ>+jve(Rf3@CIdW&AL{Qs%B?HXo+*F)*vh8j`Eex_+x0hj0p>@
-|nJl!P?tpa%QeJ^-pZ+Ut#$AElImAG2VXG;XO(3KNGS)-05eV`v2rWUv2CE@*qDt^Me20Ea;C+f<gkc
-3xI=N1p3!h@}BL50j+JzF^PA+jH4h<(jT|Sw-5;U(I{w6FbJT!0S#;XEo?>sTZi~PeZ1wkAV5YSbSLk
-u8Tpk|8fb3BZ~F)Qt@Qb}7oy%uFk67#()lgkZjb?c+w!F(IMprmCvOX)4RJ)+oBD^n9s45Cu>f|!2;k
-vS$d>j0r3TCb+T+w$%ALq+H^2OYXaZ<MaN$o?^&@l^#MI!XFPbl&i`hkRvGS|zEudHq{@oI%Vf%M5oP
-Iid7B3Tc?YsrX0&t3}x5Lhsify5#4}7A!`uNYJuI1Z2l(CrasF}|u@&Iz%pc$}jJOi?|F#|0%|0g2gx
-teCBWaBSLLGnyE@FiH4?JdCHwv5uZw^Vd4qQ<VHQtS-A`V#1Ge|AZLmIwVv{RY$AzZzXqKaDQsV03A_
-*@kx|&<(deOG3ZvKHh1#PMq%7<@riV$|XcqzjTO_A9o__$lVDYMA@3<>$9+G@d@8ZmU~&W(?Y}1&2H}
-NKKhbM?J)<Jd6kH&AmB?OS%z0Hq)(F}D&J{kZ)fX6mSdUeq698*ukqwUS7Pu<gSyOldxqtgR*%P$pFG
-St#Wiu^dxNubEj9Ov*VWFcIHr@KaHl691j#@PqX@M|W-%9Q*KRp4e>y~3qN5#aHK*DogWIi6DRt`hIX
-1my5-CfDIWn3dq*v`GsbFFoBJAjnX`F{m`^V8hujV41E}46a&`uJIYc3&|<?4q`yYlwY5OF04#6o|B+
-NDVE;eHD(vfzt&;!wVkMZU*Og&QPBS7eRVmWm!og~{-6eW0B!!&U5VK4VFLXjT3U58G9nklb9Z2mBT`
-(G+Cue#rbQed<tmP?h6)&8O6m#w)|`E<5f)CDg5ttKPrdoac+~0{OH+ghvuM-H{o>%crLb%NrI5`P^2
-H=VI`tolQNK(_9)penx2Y1<#5G<LOa<h)<^UgApR1+ro7d&No#nXimMoy46C$bKfD3syP<jqUapos{N
-@>n+)+cI2Os<c^Z~9+qNnmpwuJ|Ywhoq<Z^u>(MT)Np2r%bqcG~}H@4j-kDRkmB{KKJ(gfzy&36wi56
-WXjnIQ>rWHQV#?Y7(1SLHd#vkR?w=<~u+=mUnS;S>|!+Zh5k!(Ui6ai8FW!-~$zX@(ffoa81d%TA}2W
-w<==xE$y%#yo2W^Ow{f(y;_f7Gm0P==jd>Wv{*R#1Qe!6ruA5#p?}vG7IQ|=@)K8m35gq2$;Dzer65+
-2}MGa9>yc~l;D1QWpZ!ca=5f!bnqy<Klo&R9!1*@!appxy&u{Gm)G2YCt1+16-7^~$9tSjEhwWYgIbg
-$@zNIu;;$jW^n9nHteggueXbQJ4cK)@AnG{G+y;=ctV&qr=#jkfeBLnsB^hU)lmj}?x7bJAQr@4-MnI
-{nE071P$lJNI{k;@e57xbm)>LMD=S*Fv(2c0XcIAELIIx1R?S*D2NWC^$eWi(G6~xi$Zl=Uyt<J5T$=
-Vyp`DV&0BEr3UtbJh!LbG~CGQ-BTXH32~YX>O5ms|2vUGiJ-x;Si>hSUyGSYK*=0To<gk7!9^PyTG1-
-U??%;(LzsqNe_kReT%h(2m4-{N{`O3#-NpagDTbqRsNYj2rM=i`^}vjNMvYf-|$A>(fSMmy>Pu<sR${
-f1h<|)aE%}TFJE=X;mr4CKI@}w+~^+93@I>wf^u-r6ihN^iEuHNg~dNzTV}IeKXBt)j*M$r_bi*aH-7
-4$TPy&B;sX++0cWjCU;um`R7z!vePbR`&y}{F_(r*6_&zzz1L#}naHbiUUcu_E$f#diCw%61t)yG{Ut
-F8FCK^EVbb_GG+T?PT+7C8=y_W@m)O9toy0={#cdgx`%3X=JWiMA)pJ*7t*qI}pX%ii-FmCqooR2;9-
-eygyr7L<(bcrZqw`D;*cDo)wl2tPGsO<~z+%$paGiP_^}9_u?(=LY{%&ey)HR|D9$Q^JWHVzlLPL_f1
-N%?<K+5BuSKI%;ogV$`E3`s3aQ4G9KcTz7|Ee!g?ia848NYq#bV37S2Iy%pZ&t>q5%af0@rKv72Mi71
-TO5ONx%gx32C6aP@7s}37&J6s2Gl(e;_a}A1EL3-0R)HPK!P?x!3;zMfZ+Dv7uYR(^B*_VhGC!W$>6s
-NO$-A#8Iz#y1EcR=2?=oEhAY#zOfQh*Mcxv*@S6nrwyaEOfZ#STiNF9xM(AHQHw*wLim&>8JiGf?+Sd
-NLgdp}a^dptA7^5cXB9yqR5;ua{%9aeKU-$?T{D<dr=sS!yf5vC4A-JF{09;OH^OMx=mu;|lRu@1n{B
-kzX_owr3&IbDabbdISzc~T$7U1qqH2xauhOO@9qdOPXsb)*;PT(Cv?DGRd-5f`8bQFDT;V7dnr|IruR
-~cd3)q+Z|E4<jWimuw$B)vpKVGb?hvAuz$-VncCUvBLMH{YhWe4oxwK6*1dynN`=@QTDcbXw~(pFX>A
-DB!-=>WfP5GsDCS15KrIMf8f!5BV)i_9sc{ozQK9)RCxCWW$r%mIZVT@aW>0&5^p*My;sD^I1Hv#6D@
-yeA_ITl?mR$1~~Du416@Gvy51!;RqTno(rjBp!?l}U$30Mlus+|Io`bMeOO^JMO!R38-a(=O=^@rf3L
-A|pN=mqBwA|_B?Pv}W?w*0!nH3bOh1s>%#m^F=jM>By<SY8*$+!FX~G}t37^Xe0`yTmVg7|?I{1qTRp
-gxx)U9CZG!J?nYD7^j#brZP<Dkt0PoS+taiM<3{hX$>Y4o1{(6>XB67miBg55~JpR1Lmob0Kq7(}(VM
-@<F8tBLQ(;i~QJ<$S$_sdd}OYO{pry%tL6W{#7%bJOCbXeEm}9sCG13W;kDdfW^y5en}%?FhX|Zz^kH
-Xglff92dB{yQF7(EX17OzOxZg+Txv%CPwAbLOk(@MC&23IB$R*?M01G3yG&_?K;}m-GQdt{=9$K$HMj
-O{$wh+8R@R*P#$-;Y=cq5!M#1(Ba|8PydyLJ<-}u6z6PAbZm>P|3Vgopb<%!ZR|>h+=NJz&mnj6H#{2
--+W+mX@Wy6vX+l*KLp9~H<X*_i4yXg(qa-K!N;;)5mc>nF=iu|X3`p;E@e}9;-HG)4L;)kH}p#}@}mQ
-BThXbFRYWtWD5U2lehWIn|~ECHiyDCk_H<i{k%2$aH^40NqC8noFd45aD6CnN>E>ra)22m!@+k^r@WZ
-IMTiuL`q&)L_X#fg(*o0iH=g2Y-t~$lJmg1RLf}rGF3efq+MWD44wY@-PiVTJU!u!7~ski3F4pK*1se
-F%lucaQI(Eln7Mo>#t;aj{R8uHTbC#aBu~&gTAEAd|}+2Mw)^xk^l3Vy03$HZ$l2~Gtd1D3^tOBR)6m
-Nz8P;@iVgbCpT^$KfCZROrr@Hc@D_btz&7anjfRx}s8?3C)^|0CgScpi;KCK4x%;K`4}CP=_N_TRP4Z
-U{NArC3O(br-&m=uCpl1U`HSuqUAF!6~FX^+j7mGWO`dRB&=!QI8J3QYjF0wHsb5xtJq&=2(=9ZT3&Q
-W&CdW^~iw6%l1hb);o?JtvbPdMMlCzXZ@W*C-9K2D?A%nwguSY1AL-mQP`$-BO*h?m0}TDb~QcrMAii
-we=wpO(XNTMFrX^dKYYSb47xLEFf|y4zz{<C&8MI@m_`+Oi7k;h)qY9^~=h@sTRMT>F@iVm^lV<(#(+
-<Q_1Dvk>VFU+2A(@7#SaqC9rF+Q>oPcc&x8&Q0kJi`vWZ#M^XhsaJQIO*UZD$NdJ;MlAU8c6Gz;Zgi)
-n5qWuz;k)=4jg%%a@jTxGHZD)M7aO$>%ljzWqYM_UuIiq)fKbrx?)KvV+7H!fe_xnq>QEOii-bq1Y@Y
-m%&#spjgTJ|W&>zTnpP74qAnyIbo)KaXd~xKijs8r0WszfUd?Zv<-R5)NpdxXi4(2{h2w4qfCBbQh*P
-csj_@l5M0v?+i=n#cb=4^SDd+g3U-bMFz>gM2xPg=i&^+whZ36(auAdCsIQ(!&sV^f-YU+kz-EiC9lx
-be6{JGJxb9{0(6zQeoJBW1j`js?mH(M)*~s}JsB^g=esL!@rf-Hy<f{jB;OWJQ`AF;l&!2#!B+qqJ%b
-^G(Wc8lSz%kI~bv<ON0+x^R~Jj@!TL4&KLGc5=yf$Bcm5Q@hl-eHOxtWfX;-)Rh~t`;L-!Y^iucP9LS
-_#2EJ*Y!XT;R4|Fud8!|{V^ngD30Y2}Sw|`*Zl-ulmO_1nB)eDteuy$|arfxc__y@GJL?u69^c%fV3^
-s$%-0=&cKJ_%=^wxNOE~)T7yb~La2UZU1f?hvVF-%Gaq7d#t}Tw>44BIX1Ku&16Gz{g9MRiYkz_y)0$
-erTJgMkoZr2twlDEY@7~+cG2g}~ZA@Do2U|`&fdRs9jZ^Nt<0sQ?foY3hnf)%!<JQ?8jZ$|`-{18y$(
-HNY@7RSPO<V<5wFpuAAoax(^WIIEe1UXpvHWo?Wb7sJaIeGKc-qT_rlKypTnFrO@@$k*)(a?6*WFPI7
-zW$=U%zp`7(C5hY=k4WhNy(PPAZ>tYV+_onzQ~trD_ei*fGX8@JIL<K#adveH-106{btmkKiNt_-<_V
-u+JP1NL=(YWtzS$M#FS_u9?7?ehZ^T#2JVr@xp+rB=m_kOSN7}1@2~IgTpsji*Y|fW5Bjs~`#YBhCFg
-&j^>w`C<=!m2<SC<vEVst-1XT&yXyfhL`sUPKx5!tTZ04hW^c0Wwkt#$2b*=gkju&4__~juK==oLLuy
-T96?q4w!NB59AQIG7guk;yRo{F!adRh?Y@zl7j46DX9i}^w<7B6x;7&X%Rd^U#ST(ijqccDyWH?Sipm
-Y?Del`Fi%wLcg8{BGe288@V{%XX9GK6LiLw(}jizh=*!j+b;w)ID*hAQOL7vvfCHjw{ROvz0qulphgs
-p@!L&$qKeQ1Gz}M?Py!{_s-Ex%a&zq5M@rfSHweGCR1~ka;3a2A~`0pKXt069zB}!p01@>2@|#AQz7K
-XiOP$C=(P+^@?f>#Cf`p30_{5Yv)0#<%LQ)t%V_tZ5hVNuZl6s`&bmNHnN^*PQ#>FJe=OwtvpIA<913
-jqsU~cQvcUTJcl$yg>>Pc{7e!Ipa>v}}+NimX*7nJZKYy|Gra*pGwgqRW!4{F~uZz)R({9;M%zlC&_0
-<p;eIKru2Db=dYISO)2fBb7eRUBDmYIRzDS_)BhiAKt@^~8`dmb~Nr{OVJ3Z8YfU8HG0@IrP`_ebMS;
-Ypv$6_g}Hj@OpkN00arS^-lW$VXwh_$nfcDC}Q5R!ZuOQ>6Q{)AtqSc(;psp0Ych^%O-wuSK-i?M{1l
-{w`{2Dz6TwJkeP04e@k@`5*~WZZxywBU=u8Nh)?O)0v9m;SLj$R1Be~29;55;#U}5TzxTK2^pl3gRa<
-y@9tW|tdTFCFVT7%Gpsy6NH|Qkvz^XYx}1p@q!=b*KXHT$BlIG`1yx7W5~w%*(z;Jf5Hd%r^E>bV{Q>
-Z|!__-6JO1#C`~7d<nz=Ui^91+5Il$Ku?2q^OrPmfkFgQvA@y?GGtYZR1(C8hDx5xz(Zwm9<nHUIAha
-gdl-zr}~jQV4OS3-h`=1)^-AZvudT=Nzcw`1c3C~d|Fs7#`73lCr}LcGH}`Fr>)+0Hn6*Dlfb95n^%i
-s)Op1sI1Q;0)=vKlFCE?VXZ$brDTLq=%{BKee-gz-I`wvNucs>_ZYj(B3uzpXR?-u)YAf#wz`T*OuxP
-Xa4Yqr5%txrn9ic3J(A5wKW?T8=c3Xk^1j5zPC#v59e-a%;L)0U&@1g_1Wo4GC>5wzkAa7;mPf}&s3{
-wGFA~c&fig%%TL>&uNzCwFdTMLzKWhCN+dJ4z@NX%@V>Tso$bYEV1oO_F6{8bC6u3@{G8DK^xTgj5Bk
-%XXH0d{as+qJZ_;>Sb1D><+b!K&9xBHE>!#>5WapYNQ-{OdvNO%-2WKbcc@-7zvo~@#nIaRZ;B-XvgK
-^4B*f@~n1)&1BC^%wR`!kd)slgv54Q|?-J~QdAy*@C!y4UAh#=YX*68DX7AuHAiD(M8re7?vOGU#w_=
-S$UW$;#>49`}*H@Hd;dqKCkXu}-mEOgZPrfmrl~jCTxAjeD12k6X~#-S`7ZoZIr@$M~8+mWAiXo`+jf
-Y5Qtt>7|yFUZxM0<AicqANgyZM29Td?`-L~8&vU5cP{HWrpOz<c!e(A?XrPr?1egE+A-N=pT-8&DZyW
-JPp<r@bqb@Q5h_eV=cbYJ;zxN)=)>6di#Yg0Q&HVd4z_zhdgWGKg;=}h7~UA_hS>xCD}77W;&jU#S@+
-QG7IqyO;_5=S+fa4RYF4;xAIwlbu<^PyW0U9&$@1vXvfY`<lv%)^`xs3QIh}|pR^}Z_^wDIrP+1y;9U
-qT`USFa^M~iLLyL9j(c)K62cDZA=kFuQjr^gXrSGSnx`myh+aH@~bRpSp3nQ@8zSUl{~1_$mjDhXw>L
-c*0hM2wQ;e9)2|jmDx<TrRgZ+>#l>&`8^mF>_5u>jE{gnx#2a>elVW7gN7qm(H{BQ+3%ER@%Hc5mo3n
-gbvhEusrds64;ShwXSC6N0Y`qWXv>qTrN&g3CH8I$f;2m`s|R@>*YnvPNZ^IJ4f&XRrDi_YSz`Jx~fe
-DBWc!G+$xYSFxlS@Pwen|bhji-eoNACwZ<6K8l_v;gl+f8QXnN3*1z$p^czc}B!<Hz{Zo|sPmc2?SpD
-l`{4hNP;}lBaC_|w@fefSR4+pd<>@7lxzg?qZ&~*y2-<h{?Sp4>r1VYaA+lm<Y6MrmG`KBLb5uhn=`=
-)Q}$QTFt9RB7&f$;J+jodOn7=DK)3eb|WUyTaEIG{_>AasIbAsKkE<&s;>qBC%y?Lk6=o*MI3&ITGHC
-{Ux^qUjcexAVXvFjtPj;4uS($JDzHio?IBf60WBC9v-9moI@#b$1g*jl<$dAJ%y$_q&;F2=uXR&zOOU
-?3a}3=z?iqW(j?}xB{Znk5V1wrzz)a8#hP+#fmmw8}BWm1;(N+xRzB>M2#|7O@T#^!q-d?d8b)|u>~~
-mlU0KtF3=W`zHT%m@u%9ScQ#ygve?i3E1?D=8DI{%3Vc9ra`PYL&jR#as+Gfw_S(|LB|@+DTl#DZVq0
-9+>>J0KrHUG>HJN2T<+*x;eqm+If3h-GftB$V*n~sf3`cS-DLPaUTwx4!5Cr#?Fwm<IRJJBpYw5%@`d
-pS`P7Yd&i+0=kUOK)UjwjUqM7*|)CO<m*-n9u?zZiEBM=i^M;;?7j3x47lrsTY}9SM7!oQ9wDbLd6_c
-hZNK3AgbwO1hcj)sxx_g_1E(Nr3w_lOdf^Uw(j)d`0@9r}ED-45-seN~&R)^IogUWRKwDi-;Wp7jSsr
-WbmnpY<O?8D?;2LlVv8Z#B*8djtr(on!lVA&N)A@<19R%ipZPS%fd>so4vv<n2LRy?9HI-Ta{LgeF0r
-aIv<}Lnqg5*aZfoo8#@9U;1kK7%IARyn;lUsTPEZ$YFi6T*cdu<HGFw)PW^yJP(wEsV~GYfSB$XYxJp
--JIjuH3;*pnJkFW~U9lWdPJvkm;hIGGF>LcFLq{xXEjbEVa-U_7FAopSxz?YkE*gNtt&DrJJyaK!qHJ
-(FJbI&|svQeMU<T3>J+Z}lv!qffMl_4ZX{YAeviMZG@Ltk#FwmW8YdP-y@?1y4u!gbI%{-tl>XuqJLe
-V3H6(z9VwB1YMtp@T}#zBis1>(IO;{SdVoWznvxHM;|&kIa3!J%z-R=-D8Zq-0Z-;jZhH*0M9C(<nit
-S#dX^3TymYS&2&((>(0*y*#?PJFc~fXax6q?0m&P`W4f78@!rB4ac~0U~jHhKu71K$gopNsT=P!bsE0
-(GI3=zRHZjK^?PKX8f*ZN0VwJJqJaE^m8V^=>Cl-r&Ytd+ml$mPQcOiC+Dcz}uKj#~e0!7BP~~X*Kj3
-m3(5XNX>tyisccbAdC*8~+Y(Dko+CpGe`Ds!4;`KSjD;NL3!74dRsc_b1xq?*;_G)n>#PTeAWw{#s8-
-XXbf32JwSs7;oiyK&(W|REWc9UhX&(CiMP}yMOYKWC5Hk!bWA`6&b8@y!=mYrE4{zc(@TX?yId7K&;i
-!a-skwkP&_Y3wpCT&n0`ke8c<#j2Au{IKHHw*eqAg`(}gGD|rwQ<ibIP9PkCq8q%VxX`g=!QAI_QuJ7
-?5@?}vfB7LPxITj*HC}l&4D-b#9SPGWWRq_HicA1H=<hL+%#B6AXOK5ac1r9>*Ed8!8*J&5x)ivxk{=
-y!cVlX<Q22hr#pJZQWELeaZWcvBv0Y#jME5oTKx5x%;llwI#t?>ZlN9PWqNiRdcmr4d7x1=y$(VhUYn
-M{YhhRE1|ija-3h2?IS>}^g>#N)T8*2Sel#i5=VFs`wl9Z7qw|q*XKh34_MTC7%?0!RvN%_VF=x*wSR
-pFNNzV&L>V5C7?4iK!FI}o1y+hO25`NxUC7>J}Enmj2VsD1j+wI6oLLcxfeCvvKkRU7>6Y{B{xneTRb
-rNUMHwmhWZv^#3u!|jcN}9OmyLHEI9{OT1t)WkW@gN`kxr{vny2jF!M>)P1jkzBK!4%V_JM}lN?^Dc9
-6h&g1Au+<o>tXkyL#y<?8XwtyxH{-gf^*1u*%?70j}*Nul1(|sXZ0eJqSFq`#TRX*^QwS$q<XtAM^ok
->)=61UhqG|tkH-EMuaE`vxwNhwSq@YD49mf7^-FP88T~*n>f+2-H0u-<9R-Iq<)OV1Iy-RLi&Cy<#<4
-i4)QuY{zGyEFlikyB2h^9MhB%3L{BY9Hzv;rdK}B^<?``@&fM@FQf2vo}Jc++K|AYOx_wXmXeF2Q$cK
-IFwG6+SG7)%m417kFU;t0VI1V)lH$uI~GZ@BQocK8PUBKU1^^>!CcLeL{1V8Djjup!0(JcVWeXOYzJ)
-W?u;d!C{}9Umn?ZyjiiQ*TEt;!WE^-gSx?GzOR$R6Bs@Y6hCxUo?RJsM$jRG#AH!?9RNQ-}V|91+|uh
-dC#;*04IXdOZ1+Cdskx6_XE(~c+Zn>@RoTu#j!WH9ypNUKs6WnYjQjd%G1nOA90J-dCcEFHy3JOEPG!
-^=6jQUsM*8fKO3Y<?kc*U;|3th>yFn-=bDpL$=K4|AIca8U)3aZ^@-`~5M_kI-$t)XaRv4MqoCrSMz2
-3_6Y|AeRm3k@{O2CWKYr&gZw!HV2GH(rB0CMnx`Qy2eTzpAsqvmrAFGjl*5*37??h=dx?NhQmVCO!rv
-qJkGlQkOggCG9)9P*WmR4==9-qox)7S%Fhev2m@}@p2SLZ0cPOrxyexYS!U&1^*D2(zNw0o-g2h1m@W
-w9>p8Z}sy-V2VjZmM`E6-aLaJ3wc5w=PNC^Rzzh`4<D5$zYJkK7~V_yfNvKi+V|p5Y)s)O!g#SlS^af
-JLv)q;qlNIr~bH}rP`I+?0(@-ydVWpYuhB7SK6_t#Bn{}x3$T0LfCQ}E8>x}4X<Nw3DClO^mGxT<KEJ
-A&$>H@X~bivKlP<vRrC3Hj!VikxLwL>wuqQlLns9Asi@uZlF8E!(mL0p$&4<zdrKW;^|j&QLOrdwM1r
-~J-Qbys$8M?Q^3g$}N-cdPzRo>3rCD|&30qL7yA^Z3*^lI^qoYj0FG6``GM#7FYq$jhch{Iw{5mXTJ=
-#Y%vf_PFJhKBVKeJI>Oo%JZ@bS3RmEh+=J^ANRC?DfPkUOi7BQwyqfWR|-DD1{mwP`t-0--nVW0S4y;
-L<u&+{zu?-Jdw~tS2~W#X*R+AaT9z5Gpof9vM(Y=JTH8Z6n#)>aFPHBhk46-H}P6a*!oG%{1ESD?FZ_
-Ma0#q^E#`KokS>Z@9T9w_$+s@gzSOt(fjTu5Xng}4Rgn2HgVB*kYW_r9vMP`N(au3YC6n)N=z&18?r+
-;WVdekYWmW7$ipqO34KmL>jAnp3=0$*qdQl>m2pCctIj-EmXczK?w2pu?x!yoC>9Ei8|1)jZ#Gr~+cL
-UI_p~h!&`Q0&wx3c&@nxgZn#f+8-Z&R1ESL@_Z#h=(uK8@O9QWCTpfZk?gkEJ4jHGPI7*b#58r}}J1U
-^wm3nzgC23ux#^~KycTiY41({{iaGI-7pKc#(z?j}Wy*>!k%{B3U+=#Qd<aD27M2YvIXm!_NuU7m>!@
-e+BGKB|2|pBVKV-sY3<w2W~RI(C`JTDqgz;1-#z(q^zNc&lA^-C^{YR${vQ7R@Q+n5upR)uDA)-Gq1U
-vw9poDbo$3tR=kD+%wikOcv!~B`#f+pA^bfxi#MhefGRngOo=hK|<lwJm=ee2*vttsBD#%qJQ*WJKCN
-G%%8L_Q|BqrjzcsOV@E%W^PaU12I*(>)mf(pq?rROUHm}^Zlr!cv7>iW2v=W7gc_8Ry)|)<!Le0DTbe
-L7a6=SpW!?DHruaTb>Iu??i{GsQ{4!u_CmbHs&ctuoVA{?a-t}T<adSbe<gL2RI^APrqX+GNe_B$q%J
-e6HhP-7=3+qIL=S;ufizgSICF63_DCK!CQkh8CH606rC=4=-S>igC?ojcM8BJ{|t>g;Qi(_Q6M3cfzc
-hxe>?oHx;(X4<Bw=5xK92pCafjN=FW#SU~IUY~Z!s^fLgz{*wMUY$iLnAz2L+PJYGR_<mM(p;sh;muA
-XNBjt@1q=u*5Yx<{@8|6kK4$O8eKJi1sT1Eth*uA;>jz^`N*Ch*Vbm_^F6aJsn4l5S=nzJ3iEdElIz2
-QZwtD6t=ciQGsLN04|WILLxVmm`nI$>Ibuw>MpGWwk~hb^w|AQ4V<9{@<(SnsrSzlNKwA-`Psr8pj@L
-!5d&pV>&h*XP3o7AwzXU_oUA@zOz#c-NCnAn`_=_hB=G3gwo)5PV#Xq1%@<rH0Y1jYu$bRD=O_O$U`l
-$!?-#<w?9{(rH|Hg;g6B#J(eFOpj?J>UK!@qj{4?Gm)tvZb2G)}`CVx$oKLx}?-eX}G}AP`K1zr!iOc
-JSL`U_)iuyBmhQ-RdzQ&-)=t1dej=;$s-U`&!ZGI^Bi|x9uC;+fe5Q=(aZr>EEdokV}~G_c#R_i@zuw
-lHlz&pqafzhBvU6WWaC$d!G{gE@W=77DoZr#7S_r2@SZOfZv&dY9gM3w%CSNw~gCd0!nBC3ZmPuG5l9
-3Q8}+X&z;k6Je0#}TcyaV52^4&AJ^{$`M+W`?<@(1_^D;Y%?5e)r3#eiRK8fRzMBV_x5SM%Bs^DKWqY
-|^Hn=BCFr+H)k*PB9kveWZRTDoew|(95a26e)fBQbTZD`gRphasn${d3XyPxDQq{vz0tc4T4KiC(Pcs
-R57FKsqeG#}eOHz48&sWQ`S8^-AUBD4O|D$_qpB7Pg*e9HtaMp+@>l!t+0|F?}>yv2VmU3!LVOxC9}R
-K&G41K-{vrj;KQv%Wf92_;+f+dwP4-H__4Xf;q_07ILfiXmnZ`QCDE>Lv2U&oz**`?ZFxPLTMiFe-^t
-&27*cGX-NgZg5*(+3T0SqgYA8cA4KFEO!@z(@U}4LTmh`+m~BtvF)@S{chwD8f?EaFYuxObw7_Ou&+;
-!MEO^A4gEE|=110eP3AJNe)S+D<>qFgxtEJQY9>Adp>%KBin`OfgXMN@d0dJhBK<YGIt|Srl^|VEX2=
-%xc3>}qbep@N#RI9QyM3LVwI}2q*hTj4I|UyvC!d!K#~$(R4kRm{*QHy8l%b**cDSBWv8qqL(DByo(U
-k=b%P@snkT4vs4||Y>*E8h1UJpE0c1JnQu&7_Ay`|*XsX4QZV%U->-FoD8dLX;YbGAe!VXihr<mP@0d
--d5bkRfg8dxc-)%v~H}eg#~m@8~5-l4Y;;=&8bTBE6WYW>JUB@r8+brbAazQsVa5xyGsEFW1U6RpNyO
-Hg6%Q9XoATBF~QUn5(mMH(1wSlx56@11g($tAU9Sa*|zp%}3*8fPw!sR?^e4tdBb`A#wp7Yx&jh@ts&
-K&Yh#vUb#zZ#JaY9Qu-R9&o$)McA{C?LAvpHm)ab4f2jMm9&<9Z*^cYY+ItchhSWoJ$dm9wUmbx=(W&
-=)C$z~P+97B=U(5C-y@IsEnMY-j0djZw<&w(qjv*{LT@$rMuJlE=+Hsr~3!dr>O^*jNo(agW;Hya-u-
-TAb-QFfN?YXelFn7q}(>S~Akcnwda(;rlbbRhy{Z)HSkqm)`l#yPP&=Qi|h076K<EgQnPv&wUvSB>k?
-{U$VFrH^G6)i>Pusdo@!Xx8_%3Z^9Zjn(o#RfCCgALJ+#*Mi^#jg^WDi?tUi=R(o{yp5xH@FRos46E2
-KUqKQ9H$qk1F}=@?5^QenLc07)*+SVYRc2M7)zo~4u`HhhpOz?{h>d;pegdmsq#qtTMG>I^9u7%7Z~X
-073QBVFwoB{%s*XVK6{?sc;4bmw9<C1E)Qt=v4Gd<6Q<9%g?};yb^*m^=v{5*AJc*TPTeaPeMSB%8Tx
-4^7pt~wmR?&dXx{yz&m{}!mo;9Eb-G1Grl&#BJe88srA?Jt9ZQC>uUbkb&sokUA3A9}*hj-O95P|>P?
-cmi7`PZG?B<e}em=FajOgK1!F8@+PyG}Ic5du)OR$fv%J33I1O(N#I1?A<V(k5A7GFzcD&c)D?KOk$b
-ji}NLG7ZeE+1XmC(C)4R*`G_t^7Q`5Gb$1`;+A8kTX`Mg(q63??=Zf53Rsde1*{MDKifjnc0_P$uc+R
-z6|i*b9X9=Hg%{#(nBQ;@)fFiiRE4Q)Q2rC?;OMq4e7|-W4-d&<F1RdT~3jV(rd3AX$3(#KIhB5Gf}8
-@IBI7T2hLZy_EsQ)mO6ru@6P8$5U#4Xh2-1n$=3&8g(qouFiJBrj8xO%G!RHbfaWopJCj~$v*F~yiN`
-EtrITRmdLuE(t?c7lt)^})ZeMbt!?HtoA5F=O;GO*xaZ83?rOMCJVNhRs+}|W#ezh#k-!+PT7#H9&-p
-?w$#)p+t54U@>eVELB=#H?-b4<UUpHNx7D&|Zv{bJrF3l@hH`<krUKIvL7WqhqNsgNAcwcg*iFKxol&
-r!a2g5|Hbx<P~#%8Fa?a$SnKH!yjM!*mLT9mDHrH!7oj>v)-_bNR)d=IS~${(;!m_={<v$c|y%o1H^P
-ITnp{InlT-V_oghYd=?B7r(6B>n=gf=Ln@gvYT)S<dF}o=$s~$iQuKOuyZC{p#(0if5>|K?F#_^%0K)
-2*#F-h;YZ%vuU`El|D3=P0zoJWL$;qZjWZuI-<UV<&))T282KHJ0fj6^Kt&ZyIi+u`3<L5u491{7#Qh
-sS-}X(@w{F<mUK%3+=%*Q=X%fH3v4Fp24A^QY^Ls`D{j_k)GJb{o5e%@@wxi$}K<c1WO#!ytcB%*o=C
-HOL0L6ji8HEBa!G`kTw~8qhfj2|na-?(yPK$bbUjqy46p-q-{38zk68Af2fcxd|_~&;M-rc>-IURq2`
-}_YN;{NYg;AiCvy^iMuD3mvh(rl;qJ!y}JKe51tuMTBzcM+pBX7if|CT6VS41L-7{f+r2_XYas#{84}
-0)2F2{>goTKDse~eqVl6h=KlGB1Xu(*Qq+TFVv2#GrHe%ucFaSSPW`UQ^+|@phIvwn*JmkH$n+UQ{(h
-4iVEQz#|z`<^@=2oWS@4nw_LJI86IO(ieuME(4-qLrcOaJ1(UCMcs=M@Y$tS3ZFfIh+Nio;f|gV9o82
-5<xZvQWHhS%1BahtTDHFbG8XTNXD74PSDbUptHezaRB)tjtykK%{-<Giu7RLuw9lD0kJJ)jps%=KU%y
-$tUK2@1gDhY>@<izcB&g<30CHd4cZNxB0^s?9Dp;4W^ZZze{$iem{d<FaR(5OWq5%-sE9WPnA$dK~58
-RK}c3zex&GiT2Vy8RiG@Njt?WZs${Yl@`Lip!kH-&y3*&lE;pkI3QNUyiVhLTZA!ld%202s*P6K^v&K
-Pun!0del(%L+pm69_#S^jwx(N&P*jo4+McpAridlfqBrPp~>W97OXQiaXjJEnxowdh*gDSA(}}=s79D
-)>2XE_^%eHh`4T-yw%%h0Bq^{IiqfjT-e#vTIjQRLm`L4KNhZZbobvflsiura%tZ6+@!nt&I_zafQqI
-eLv7)p%F&#w8eRwkbTMz5hZK`&csc>dg7ZKK*N7}B4)2+yN`A%$yhw`$}v%}2H1AZ`%V=FRR0Zmt#a<
-+A=gk{5l*C@30y{kE~s+!k$htQ8qpZ5udIf*Iw8y*Sh2XjhY#H;VE&_8l$<zITWRHv^JF}d^vvyRvDm
-&4!2_q+&*;~avIpRw{9&ymn}-GI2XH=McB9WEu$;h$h?$*IcKP!&J_X@BU47d&OIe>z;ZB?q1GqX2^K
-x$lztXAQ;ku|kRst+&vXXCE=@)v9bF@m;H<yOnRbz_#*uYrJs9w%BZlKmG{sj$l9N(~i|FzLkE#(cLr
-e0%_zJHdYlkS1~fUuXD1F<pMbW?O;&gaA&;|2g8Xc&H6HJN_^%bPv2qxH^KR*g2Ii5cuUaM<kTV;xLp
-4M-v0vkp?{0_e_qnQ;eC}?GfYUUTY2TKw!9~}%QF*4Y<`&GzNLj?)-<KMqhk1smih|0k75#sE;(g><R
-bQn`~2<6HUxEiT{9y<=wu4WOu7@{j<i!&!}?YfX!Ro8Q`^2gR_KE4d|kfjlbfCzt!Jj=sxyhtR}Tw;B
-OE<S*TwK&iXJ{Lt!&!l^x(S7zE7?j47B$%l+A~ENbM>^Ghbagco6EOIp#&XlbMsNhKbfr9a{9RglOx2
-PYE^F=wf!s&+V1fy%h>kBWFrU;)UwSDBR9cxbVbqo%O8$H+65;<R+SR3*YlA`kwDJ^VAXV1qcu`LQE2
-O%m^Wn7{u`F58$C}SGw%#?l(?+5mo85QVdec&)RE0Yp(^L?EK9>5F~!OO6eBm)Ll!DP@PM8;mYi;GV`
-1O*J452%aS}xA?;g9${P0pzRs_HeMC2;_kBs{;KndqmeoBxTr2*<qE7Q119WzIJpt@j6+XK=Pk|Urki
-~Fo&zHg+?k9#HUayzrqo?K$D(%a#@whJ9BM1|OxUyODB_S?j0_=$j!Y57Z7TvJ9$UMwj-KomGu4~*r$
-=)ko9<$)ID;*2yx}Q$vGCkBxJaRHbv|R(}u=YG#PddufV`@WUUR2ECTG3r~MsF&Wj@e1aeJawE&}pBK
-oSN5j5;w(PnnA$x6nN7IyW*_~pHu8M5pU}a)ufX~E(iC``+lIh{_6A3>3uBAS9g3%hdgWgu?!rLBVS|
-yz)U_alWsWEMJcqowhtJt9}El?0xk71v@~HdL)mkBa-I*8^1O99$_+uYo)Gu@<$m)IK1`DN$7H4SgMh
-(if959I_|OaCKRne}0`Qxs`IZWNXuGpk(pdO8hkh;hQ*w`8O16eN7HxATYf+Ew@xaVBZSry5zsLK9(K
-b|qewqoTx1EEv-rm$A_`gVW@4WAFjTqg{{*&!ebo8^7Vq%YvindE{0m;!uBVu~DL&Ud{nr#whSB@~qC
-OXD;hlgz+Al)bm5pJ|0-OV4EJ()O+H&bPV*<>ckFYA7O+EgJg^beDS5A6~UT)zA{v<VRSPfPN8q{G4D
-7W(&&9>O;ojMzC;Mj2seI7ZJ!baba<$zH!Si2%V(-simyb^p}M{u;k0jM^9X`niyznG-fhO6~6>gMiO
-2_0@L)OW*q}68p%^_aT9pzIpkq{{vrB0<Ze_owPk9ko`0!Xj!r_Cft^E6rn_+pY>7r++hQR@#(C$zM_
-h8zxq?9pPTXcC0TG1r3gN6r8@DcZ2xK!F>SiXU2V-ydUHnU{PX+pVTM#-|2YUy|2%v1V{7W;*&B_Su6
-a3u)g5N0w{lcZST0mo(pGsuAR|#0bk4+`iD*2fp0gLzSdsHOz$kXOPK(TSmJ4z)H87{=Nki_Vysj8WF
-KF?Gl>lh1)sibqxR-YYIzE~R<g>iW4xwG4mu2$cO9gL*_sSSt8>wp`vKN)?%!X4e>RgXAz-Kxe+}5(&
-uX>{y&qpnDx?;+Ez9iXZF<}NdatyAXhCa#kf(9wJbxGU4KB}`~c?EF1+gy2=pB8Z~F>)mHpfT0hjbCY
-%NNt$bC99e-HQi*MvJp(zhgrPd^~zusUm1^Qpy&HhEt#Q9Z}E*4nVNA36fyd%f<l^^Twhd?o!^T&aUF
-kR>(+L}ICR4W7e3A20PHV94}X<;2#EYEEUefH<{L^uA;Y=iAnQjL&7t(?vp0tTMGykX9v8s(WB!_npg
-CTr#6}BQCQiXMg&8u8-$wb=7(Vg`>XgXS((}au%{>Za6=XP}RhOg#!1P%v(7hu_q<Zd;7qE>7bvm|pj
-ji)j-PB0?GzhRI45sUF_fk7ppa=|ccP{>AbXp*n&GwPYeShX*RN*B~GFa*&SB?6}D1~f8P7ORdJPBo^
-JT*jstgC0x$B5w7l5)xhK#$I%Nw^EK+N-89h(q%WI;)m>K*%x?UD~h9%W_iF5}^*mNzD+NAky_EbRK%
--PbQ$9*ter%SeIs|Lzcn=e!5)eL0RI;JSfLdjbGN+lrp{LcXwUk1q^+n1N^w2tGRy306r+fyIL@^Sdh
-QtGTdgj^`rJ1Sog<soir}$rfTxr&)kImd#C-zf%x}M`AaxW$V~`IBbzncW<Ip{%}8dmL|Ffe!_6ixO}
-4?(Y=x|kJ%?6cL*hM<Fy04Gqpcf<eX<%NHkd_|4ehes=V85Cf^VL4aJEA3&qS8H&2SuTh??!Dc$*&tv
-hC<IdkVn{-zc)V+pYH;W1A^nl5AI9FP5ZxE-$^?I3W8*JGP<j<|45tGG@dt;S}58wDW%nr{#YOP8EkO
-zrv{`8t`>vGQQUZ2hI(Aqlq4S7}_(q=wHJDx8}{4W{>Lqam<!i|4}60Z^J9_BfkCtuk>%hEAS(}{s~@
-fca+C3@H%bI%iCsE6&<bIJ9;G$9*OssoU*>2KirNsV`cVBIZ=Ig(2sBn{0eV>1-HN_yv6#_I?+r6(QG
-TeeS(qE03q;~im|BZA6MGb_nCTf+~MY)u*QExSkr{iS<iu5J1fZ|KfO0fQ1X(<@8^silA;1B)Nh<FDj
-vkmUgAQ0d&#M9FSM^b&zya81CP-P1dz-CB1C(zp~8!+_;AefOYGIHbjzh=g=$+Py8dL}yOVJ@u!lXG)
-A3S6MdTU!^#vJ#H1_4Nyb=(a2v#YIM5iD5ohxZdnZx34JmS{n>x*tcgLaF>V7&q8LK#`$@c5HT3?QkR
-G^ucSG;hB5e5f77K~EiJFkYTAMLOXkeFl%i%l4M@BXG{mV3ht?p}iN}aJPp6DTrL9w`5MNtp|&nL{HH
-pIA-^g@ZGHIzn?KIjk;cdHR^ECBq2?Ms!bD<Er)dVpF|9Q;4ORhv!-%J<6S9t>QR7)!l~UP_ub1NG<O
-uaU99@hsHF>Zl8e*M`BkTOc5AK=H@$XneC?yBo7+#BqqLhEVBLg2;-OSrUbzu`?KTsWlL)U37=V`vB)
-1LQj0EMr`*v8~0*qB>r$a5~7)!@Er_Xg`uoq19&7>z9cNB@{K5=}`ow6LDYsh`&Eo2oiMg>k4h<96-V
-jNy%(3C}_s!wDngVRjo*_1A1Em5bel_qXR*Qy6nfu{yp)##~jv$?9QYQ4QPez3&}W<*9x?tZ6M#VKJ`
-_Mp)d_SO#mSv)K~n`a4=@frd=^yjs#;TQGff*5rOqduofC?P@a4%u?|UUo~l@?aKz4gVW(`^81?e+zg
-2d*}Z%0RQf}e~H8hwe1^iBD8GV4cY?d<2`&H-@p%xH+q=vc{uA|L-a!=UQu?Xl61Ba;?4Ca*~V8>cu&
-gN1ANGE+cMjn8R(sH(%WFf=3$%t1c?c9JJ(tetQA1GkKoeO##=*t^Z8%#c*S4_-b#cx+rCD~mj1I%Si
-sxG5Ns<fRwPE54e;YVEHB-~ammW!e~rY{X64YQzeM5(|Njz+&4netAo0pZzC+?~yaoS0Dg%GTdcUG_k
-pC2wfxlwCzk|xax3K&%DtDv#r7OHB-=i|>%|Nog&h^du+l=`4+$aoJH#_SEy3~z{@Ss9K^Cp^;v_RTI
-(7AxZPr&T*Q|2sKh+Xk3b4Rc0ExJ@An``phzd&dK-75=^>hRp#k0)Qm>FKIjh#5hVY$p#Cpr@zb-Uc+
-`oOXe_2R^+>DYy<{*<UNUlDs!vHHtC1_$e$T%N@})<&HUt;RNd!hzd9z!{42E?e$kS)_a?(d!{Yh`pr
-wkIg1WgopyXnZgYKv&kRUlPp*nA?W8Hk$8*S1pg0#wb_~pBdG@d9G8hMv<Si4|8Ac*0u`TUO@SsT!cD
-<wi490@N5B$C2izw(~s=ou|L*!b$c0B`>G&;U@w@9y%$_*8We&3q+B)W0pa=D1R2hVwE+35b@M)7YlV
-o{kg)&O4so5Z8K+~lS$di%M|LU82&%8kN!g+hYXi8(#8VAf?I8i``gPyrL6tI<dX%JrNUFgX^-VYot4
-)I`PYa5}AAmR~>_?nXP2=GuEhMLHW74tS@e9W4q>KaU5ELJwB`>eV*RGZ&@P%C*Ph@_J{<tFnnMQJ|B
-gIrC&4%Oc_C(+gRE*EmFpHTCBxH7j-AoCkAQroHn>m85)1N(g&fmWVBf^m%REg)U>6!lY9&M(NDm6W}
-KBr_8-3&_qdiOhGd9K7tM6Ij{SHfaCMIq+lpQDAf+BmoMIo`G#tCiwbgZpD%|RfL|!4UO0j*m+(6K8R
-XwE-JC`c^VJ?j@_>@lS*xF@TD;k&uXz`Kc$gH*r-ietg8_8*jr@H#ifmJJe2S#~EZANFY!iF@@q-_YC
-w}jcuO1U0KK;9tI})Zbf?z0$A#r5$kN8jrPJi;u4L7Mqy4(BF;f8GCZsSMnX0<f_S;7&0tOH-4vU1sI
-H%Z5d4KkT{qnc^F8QX5gg7CkRc#~|C>4vXc&<?trzf(Wcfn#3;<-3hx{OLB}9nSIX;1$&2PdPg2F7w{
-8pV(a~Fml7^aL0aT?{RO&itz4)lx=qtQon>xXIm;u`>TOOg2l(R_J4Ml@k1A+Gyj8u#2%6Q*(rPT<U7
-FPW7h$Cp91K=iAUvmF5rSsiiABGb&JyBBNW-T<;u_(yHBVljGH-x=?JjC?e$eVsEwaM?dxOvo%}iN_H
-W(^@a0zibSHnuj-4s`Q!vJDbG{(lP1B_DIOCWha`&^MX}zMH9e?Re>@`oP>Ao^kF(ZXn67hq20;GvN9
->et2+bD4vQFVNQqH(#;TGYkYGMhWES5I+k#2)mtTGA!;G6ii#4)myc(bpD;LRh3vt#_cokjOaeDR<PF
-bW0z5k|3``g9!!|sOMvHZEi8>f>b3^slkeq<R&L}eG^l;RUWU%5!0bPu;6g_NG>y(2YUC~8ZqVLNiZ%
-~k{dO}fH3I{QVo5%Ch>HcE7C@QS$YzvtFD}viJ=aEIHd8&9shmSo~~4kqyF#{qMV&e#hK|g!+50h<NH
-m(WjZK_R||Nfep6XQNiHC!8c*bnQzga{g#H(PxOH$kx_F<?FB$^s2|p3R!+Rebw37cE1^ZW6w0+Eh52
-M}0TgR}Lxx}mijV*&{jenUROp4wDU#RV#gE8kq*Xw$H1TOCBSln<hrsPNFg3c?71oio9<sf#ugw$bjP
-{eKi+i)iFMO~lb;%3Ovq|Q0l1x5+HqXoZS58+DRO{?Z_uM2!sE^yss#GBIeR54ZzN8FI*JEZ5|0fN9I
-bQPRiwia5qcMk-#ZO*PaUyhx3vsC)}o=m!RmshL2;qi5I%@b;Z`Eb^?C@61F9SLOGha(+_jgn__z#uS
-Zejwmx*j{4_dYgtUej~QwiX!{Gz9mf!WB6WlZY7=F6y5@Mgt#&u-4yi9^#Ih>(+nctZHsrNMyyXqG+X
-B}DWW#QX>Pe<lv+8%B{S*YpG*1{06wRluM6mJL(E?s@)5-R@$~N?h9M}7Mro8nw=s2!B0lse+G0J3tt
-Yxd!n$ZPyOj{WZ`9H8zi?zX;Y;>u?v==89}lE6+q#bKt;{Vte5X#^pc1i>w9VcQ-C|CYz3aLXt5187T
-ZYHa7#bXI?b{8a!VLje_C@WMd+TBA@!JRzwqXa6Y*S3@>DJ4vAh+2m5gSunZ#dc;rSP6*4yW5J(t1b+
-@3|kpHrx9VVlsgi%=6+tZ205kkN-Brd`;gDeWLy|#N_j*)Q@i=W`FFz4>8~0$=`vPUUqbSiieOmcOfd
-;jX9JH_HZ53cXOrIJpU{NSEdfu)fz`e%+9Xw2W|_}4V!_h0*_8N3q>k-%S5J78MZnWBWEK=s-j_xp&<
-Fb^v<OC3a{?~(mJxOs}RW?KaPeFxF3x6(WY`D$GTL3M18}^7oxYA)}yDVv96;xU3$r-WSn2Et&$H*7$
-X0oy>I7-XP-5|671>7WX0HASgc^7Q;Oni`8>(UDSo5=C1PsAl8#0ep&p`>U?bwS%uvj;XCHjdJ^^x>j
-x>+t?}f48etcNoF%|jsEme)tBlD;L;U28tL&>(~%MX=f+;d=p2*yJ?;dOFcF$zN&Mdge)78xgT&fdB%
-wkRzA1;lU@WD~>^jt}w%SeiYi6>GVYBg`87A3@Al&vjO=E?p6jFI{7h{t-PE=TK|bEDC7-G@$PNN<mO
-KMRzANfu5HKS9C+eB~S|!a*8l8r|?Ft$@uY%^q4*%3S+GWgJ`?UQ-JG}JaL^Ec+cDYxeS1Hg(nn@VY0
-dxh$WH;YU2T48*_@jDYxToHO(K^k;RUFX}pNacZ*Ygf6GB8UZm6u04;Bz$SBWD>MH$lTB%r@i!Lf9K8
-pED5Mn-Nvnmfi;2StD>3t}pJd;zgni{X^@d0S6foZ3bxQo0Ii#4vGD*>a^oLim@Y)?tV-N~T!7$^|md
-3yv8$|(|sY--9(ItMrnOj!C3)SH7r!86B|oW8G|#Y93@v_*-#qW64?!B^P7neN|%m{XfRZo}iZ@#SaF
-{|H<@KlfW?p=bu9HcWvj495s`MfDGDT=8vvhIi}qwek<+O&gBEyF7dsyKEi6T?|gIJmh2YlF&QX!8T%
-&!kgXQ$`T@E8#7%=4~cDdBh)7kR&v8Jbf-D%b<m%Y7iynB#j<S_7NfRo?v;JOd%V?ppBuOkn^<PO27+
-(CcPr{`VIk=*cuzNvlob$H=vlE1B{o#rx|#dLE4Ha~era`b-WowO`4w5B>*$`_<Kr;kKO&31A&d2+``
-xeC^FQJ<c+U6}vRLuM>%)uJ{|QwbcKJkHtUplY(_>%n0{DGY`S>n?&#3apUC8p`r-+j8h;rCNJaU1ZI
-4uKS9t2tmmM{UR;!xP(&V)bO<w{Eo+3@-cli}Pa@je1m2X%rme3YlMI+lgk*PO~)fO2FKRo1u)$*%U{
-?)1YEyt`OdSd(*9np9DhQwbezh4t2$Lj}RF^Od><#vHzylxPD0EX(vP#vYN~^x3FnJcoT{g40<xMI}n
-fSLJaFtKaMyJ(nw_-9qLufi<Lpce*uN8|dg$5h}9+N)7Av6zm0F2U5>F=BpYuZfjzHTMl9PpoZ7AG4!
-4dNL|mLZxB8@K}rCUZcQrVWp7cpMPd%Txq2k1Q0P`XDDERUp0t6U`>E7?(zFsKftI)SR4wib_ZpT^00
-o<nv7#h;s+Q-x%&?dZs(?Q(IB13J{XLw@m>cfHqa@BxMz~Gvt2TwA>!2FS!r=&bph+T)hbPpNC+`Ks^
-fypO;q=W2Xe1Ufos##XXN8P)vXdbyN)4tv#*l4LlR*izftM5<YeA__FDo6bnD_73eo(TdXZ+c-rT5TJ
-I;&)qsJOLGL5&3`M>xL);)A6gHDv?D0ORB^a#A_T-u=G*0!EBgNSW`r1^1Z;c~K;t$1TF@_&InU*yAE
-r5>ZTYn`O8h0tciPd`H1LYRW_JN<fiyOy|W9_$YY0WnXX%__WoN+7<^!Rxw00tyIAK;~V87*tr1aD8k
-iU%UM$%La-I7TI~i30?F5_0gVOi>WA7tzW2ZVURI-E>u>g|%l-YqxPJRw3lCwfg3jSo{*E_1@P~o!_Z
->%`{Tiydcra{T?>I@Q%WL4~w|+ax9bAQOFrk1dBgCspjv{kG+;@nb&0Icf^tCW#E!Qzoc*Cq`c|`$Ba
-c|q{Nq4UEsUPbbgIA5d@~@ttdGzkwR1Yzpx%}*+tktQ~H$v>xlOzpxuw~qCdFJ7#8S<Xl5;Xle<yidE
-W&{V&ra#B;r;wM%fjl5r1_||R36fTOh<R}WwTJt-h{nqK6+C;bwULb)1BaSTXOEE2TY#>v6p}sPUa`{
-~2|-pMY?>lzYlJaA!$%yE2_sAhIOT=hc|=Vjf~=(VL-BiC4URDYm(_9*v-Dwwuus4iH%JFoz2TD391g
-|07`l=Q;v*to(1UqWpPnKFMqs*;-;h(JS-^llj(6}D%@$2Qu@~NC9DaVcv@t`~t#K9%!UZ%Go8~~@@%
--U&z3<I~aIc1*W}dnT3?Q<QHg-;&`a;Z3gbGAv;b01L7V$>B(N?P6Hj=u(t}JmKC6ql<MOQ+Nn9I{s0
-<Mi;E!-W>kKodBZCOJcWviISCRN?Ps`(B!ebD;zU|P&c)86aq{vyW|dM*C?$q#AZsD{W(B;g#L+R){l
-npvh1t=b_K`$OhTuZlwt^^-}9wD5x9@NfhL^VxH0xnnkjCUEYLiD<Nv2wGy*EP|rB(K1<5cjxhjAh@C
-(1^77l^WnuBClsQ_u*AGlEF2gtAu<Kj^nea*)f~^`)%rUgARiSr!r}0@i=mH>`HO;Rd;WKH8;21T#Tl
-5QNo4&4B|j{Rw#*iIvrr?5J$w?`3JiwXsOw6=5o~L#t`*N(IHfBMPd=6=(OdfFTDj~Ddh5b&H59pdt*
-s1xvyO{5+xrmT3Y;zaCEE5!H$~CUl)l?!9<s@Svpu_WrQ2IDTeeAtSKdzU2FA(mH@C9#_5RnAi()qO`
-;6W#=hBT<Zw|-d)?6lb-x8YM%BQu6La|>JMI5vhMOXiij;<0{w=Ra#${G*(Ro;rCrG(e@Qy<UH_nV@?
-FH4a>+~(I(B>Ao&+A0y?ODQ4?9&auCJl&-8?4+0X$=Jp{%JVi)2XBSaHc$8EF<o%?ElS|~Jxc4-;Jsz
-3JllVNwa<3^pEJ)dmLGf?M)4#C*~2v@rHcFtiEK`^V0}#X>6Umcj7sxl$sCuvZEjhtoEtZmwG3UvBQb
-z^09Hl9h+^`jDCAtY@#1SseF$Q1!7A_cDv@rq$+zWRz?*ptySH{PA1zn#sk&GOZ8AXD!5wkWZpR@g2O
-b_YtP~vP4fEu=aYSzp2{&<y;!s^m-B{)`{_HDtew3RJ^AFJ^cG%7pIdTGG*uhz6c|Lp-ED}=wiDysW4
-k&RB%WpWg1yce)CR1`Ht8#h%`L(Y&HySm|b9c66FNe&OZXy@9^!f(1jC6s#4hWklpAHF3@P&hn9&}us
-a=L-boZo4Kz%B$;9O(=#@LE`*SP2UF<hlt+!sC7RJ5mO+DrRbtIfRfaY0+iOpC`ii!67(3uf(-WanuC
-+t7Jr@s;7S^_;(XftSiR8ex%8le%+RnVg8R>-<Gs*zEfuGgT`C-#^(dSk7xWU!T8b0=zr}hU#*UQc7<
-;jLX=`C{KM(yb)`#pStbr|eL95xtjWa5jo#7BmbkdCIB>R2BU2yedaO)s<$){5Tfd^a+xdFv%H|MeTM
-AbaxN^U6k7LBb?ZNPqCX@UZ^D|lI=D$gA_dtKzQ6n~*hwqCTh3`62bkk}^d&3feH!8cWiF=$D9&W27j
-cu1nb_dTbpoH3lnk)NVUnZUYveh_jVvv{lW$oiR!C^m~YL<TR)2KKd&~15?zbg7GFM3pDa5=wMo>^Vd
-Vu;Y`9qd`|f0}mFgo)sRO}CKv@JIQP-)b19m7?We#2`m^*LrNL)Mq|-^zO1iREd<l<43n;cYHR|%-4l
-fo;Qu7vFO<6K#+Y%`O9N~Uvl6NL&=uI3pf41ewp42JfC=`4-by!Kgm^c;Inf_tsg#{15WF|&h6z$+mi
-mBEae%Ycy3)hINZDdFK1$V{{Z=m{Bo-JFYm{v75Q8R-!wqCpp=gqpuo>UCvm7}8cZd}H?N3thJ>SN;y
-%H0)U#I*1Y(e`?~qmkTn}uYy!yCaQ#8uKBV4j8@hmT)mlj99O2WsPm~t^_`Ejz#f`)U)w&${uMVjJBO
-$VIIDWXZ@G$E1azf%8}waW`FT^SDog{BpSn!Bi0d5Py{3_RS(L@N@>4c_)EO()L<IPQJ1mPhZ|rHB_V
-iqZLdTNa8=PiPU)#5qy#^;=$lD&d)F^%>-M7qIhdO6cLJ)q%UKV9w#9-1*{-Lc9**cv>NM5b-&a$lZo
-=D?)$=(l)v`c+ng)Zb6C3;rQ*t)_N6yjZYm`2)&5F*&y=gOYx|~1ef%=R9)plJP}9p<iI+IHDQ0>06l
-$jv-uHKzOw?i<fOwi4x;Z&cQL4Fu->LB7;u0vpBtdSM;*`)8=z{~w6<ol4*F;y<^~J5<c1J4&`E`WGh
-^J2H6z0%`L<hO@LZukAIj3s(gUuPut}vnpAeSU-MaP=THgGKP2Pp2Oao+QgTl$zK=H|2Snz7;BKP=!d
--)ASxEQRqAl{ykhmDAZ+*VdzUlLY+GkAS{qz@WUn6p$yjd3m}Y?<u4q&@C>Y{#l(@y3Z>j&@j)76SJR
-d70{{QHZb%daP*Q3g^?WE8sQ85}Wq%*vpd@HShNgcKkYcJ40dS77qENerq@t466KWcO5@z)=Ryiz6i2
-}r%f^dW7oP~DIWKV6pF9y7c*p!ysO#LeRl4_BcQseMPELy{Hb3YB<pbE(cf{}lQ3r<e;-sGe?_(*^oi
-dA*9v<MEBmbRe>Mno|L1cy)eoroADre3EdKHozYIy<+&AcL<7%zHGiFmuM0+IiN)J|KLDEesu?_U?)*
-ck|Au_H&wAqJHn?N$b_M$)Dx|%4t)$=Pftq8V$T`Tzz-t`;I4wu-!aQf#V$;p0KDY5|{vTp~5>85kst
-Uscy`d>*4L2epPINiW~GmJ(y0uwRYt!}dn>836rcHQQdvqkOHWXsn4B{HTPGCs^-g(PP`poi-%f(?AJ
-<2dA_;t8VS!J?_T>jM6VvR~ub<ZA+!Zto6EpIE{{bO8@GxUXSUe~pe`z;1Vo*7<lgczppr*+#RU(auF
-o$0b&<`|x%@x?AAy-0nwr3;gVM*G24SR@2-kFFaxM!rOrDFlM!iKUvcyUh4wp+|G6(vIUvYzHhlH<(>
-rt1K-Sr9gyf&*caHi$R|)-EA~_r)<s=~C0(DaB9ID4za_1#Mk7=y9(O9PA^0ZpK{&?gyAZ@8_pM2+tx
-U?TPUhkslq5jKE?TC5L!TTIc}dDAGaZ^6YI9s~jh6vG6>r7MZB0Yes0}Nhj3sFO^I9wiG|$otaL&fST
-e>y^&l00lB2-`#sHEkMgE2{*Pq=ig9u<!_q63{34wV^so;tJTT8IWIXaU*_YF~3DQWG6%2s5<MbAE|5
-Qh%@5t1^alY>5dxy=4e#XV5*}mfWE7mWFchTCcx;0P`n1$R1iA;Wzv|U0LdNKH_)ji+#gRp;-L*0Rj3
-QU^~A|v3ryWsrhf^lvXx>JeTEx_aDROItBRdAIx5-2<*x5uv5}zx9BDDY~hAC&bqhcXgMgMJZ%1OgBn
-XeT+~B)0Cb^M?hx}L$Sa%S)#1@!&xCg}HF}xR{31YuVom((n8iz&6|7<sGNM-I3=Lh&B~=Gp(#WD1;}
-tw{PnA8Alx4Q%$ok+{zSSFzd%l65@`BF7k+dT`A0AaqwFS1sL?@9b4^&0L@U82bS7%bqd*2WQCDqT_Z
-_Fk2p?7~;ti#K@I&hSMC_?y|D#(>O@bp4u{JRFi?kQbkg9Ht8{qTUeEIWl!S^fm`sfj-q%z%yucgZND
-g%Hs=G;uv&3;32V^JU8J0dQR@Q($Wscv+6bm7HCAQkHfcp}I45f~TlNcJF6eYJa<VW&V#X98CQapZbS
-AucYeH{o`Q%^Z(NverINO8V@@LZ7RZ{{sJr;)*M*$TO|80oa^ftz+XP`my&-n-djS+)_+<-VWm_n8H>
-=3q$T8rAlud&y6HBOm1lkIVMXj2Q*^vx;0iJu>%#V?6TLN>;$6Im?33j2`uJ{1wE|8|t&HtwEDzZy>E
-pdiwV!e2Yg=40u{E~nJvjjhH$&Ta59eARB;gJIK4CFNe&&Ga9w)i-zHo1f!MlxBM*b4Zk`2o$@E4MQF
-8Ki*RF@YjKtJeTs8H;}9`C?k2#S@vShex5er0&PGvl2jo`oOT5a6QTX05oZ(RUNWi#L1&4m+x>r0tuz
-Id|Rzuy}Scz2*Y&j{M_;<K>4&oL#Zs4H`(IAzCnFtXy;kwnm&R8pOt_qLsB-Fg>gc)IEO}f804zWmKE
-x)JD!ed)*={sV#vo>}?m^Zvgn4BX6Jd^sEP%o;ta$NlxD5Fo}rWmQOyoa@qu`{@du#iU}WqJU5p&Uml
-7D!-$x%NeaEBW6`_E7FePROr9VJIyh>mEH!4=NmzmRz95%ezYw>eR*A5GA=)Lh0@fOn$hVsM@P;g0cz
-QbEu@}r3&SH*rZjeMVFJNb^#`V|o7Q_fAy;l%MSnzaT6*<IZ8$O?j+q3=Q(IH}fw}8UnUMuT6vV0;D5
-^-@BP$SV4zp1VGt_*Ko;)E=EjK%qWOb=9aJ-1|$dFnlsYO(iCpegID(uz@<bLa+5?B!wdCs}_TpH;gs
-L=cv5I+~)31R<(m_GVsO$@UQIE_Cb>+a7^%G_28vX|YEH;}C~Q*8OyQOJrZ->ylJlP|%hv;XDy{fO!&
-BieFBD1$cjM5B^cA06z%ob@OEityYO$oH|*TYlpj*1!fadRn;A|mvTW{)qeVE+R)OJJVhXGl!-4}dpU
-x2uL|V=UGFvBU7%)uES+Yf^lU(qM6+|vMIyYc@Q()0phQ!Frl(5`H1|9^I-q$6-xFA5!{SmU$0;5%T<
-%!bf!t-eNgj24QuD<@bCOB#!{KhCEt167M?nKUgqF9)&fB93s^dd4PTY%)hDi0UYt_JF%WQPCOTPO0d
-=wt@nJOKRQeI~Qw!u3u&H&=x4@|CA3<tHD@$kK{hA6ou9&QF1UUPWmj&`dCDYhTycWA?Djxvw8cacX{
-lFu;&*kyg@+`IOqu2>#=NvSr=r4gD;O&A62*tUVO-zH*GT2<)^6aQe>&qMlHzX|K)ALq17!!|DdA=h1
-h>xT_Py3Zi;4-`g_6|(-$ksG!8=TCc||F7=h3ugYC*Z(D$uGqGTC0Du>Z8*0QD2my5Ru=AIJn^QjC(~
-^NEg}9De@qOsbknqu#6}|5qv8ED4855^l6zLrij8Qxak4Fqh~74*R)|B<uiH<5CWi3_pm?^W1g$toNB
-ihIvk|>;_kUkW>&h9E9hFx|C9_S4x!wdy?WQ!lJI%^J(PXO)2z(`j``%Kx&C*lIufSB$w@LQt@fTp~?
-(=ii4+wQe<Ow+Q+~EsEnQ&1>$En&7Mi#{K>Yum$mr_28!!~aoTvjyN)b-m~SZ%;7Dj~oQnzjCkW*vU$
-C%Wu-%D>EwC34_TUEmYX>%6Xrn^m!oJc0EuMfBLlyS*jw#rcZnoAt^H;}x9jFh?w(xZIhyc5ioK`YhJ
-j+opg~3X8$t5&hGc!TzA`e0^-p1NR5(<;2!qYqUP^O98^te|T%Zb!UQ60dZ{&-;MY=BCGTG7w2TmK6+
-hr+=`6#eOe2RV69NL@2@^_UtijK0@N$whtX`qhHFi*RwnD4=rhBYdBQFJSufX9IUmD3@FC8tmBX6)@O
-+0R_~5Tv;DX>`e0c(84A*l}iN&d0P>m2y3y@qNhMPLP!Kms@KnSUgZOk=ryLs6}pU8*>-pyMj7*Q@Uk
-38{W7<aRSuJA{(#ZL;5r4`nKaF`PC1&qwZ6xq|WdJ^~R;cbxQ170Mmx35a=Od*9xqRN2&CGBP@*TPt+
-J0Qvz`BA0@0}1F==pLG^rm$2lyv3AHQ5f;;-YSzUq2`M@9@T3nuJ{sB13hzRt9tPOMVMrGzD(CAnmwG
-yp@|Y$Yu@f;^^^wj@}X~-)Ov;YX|7aBS?;bGJ{i#{t~T+y*e5^~cnLGe&hpP)&pjgcVf4z;KAknWB0C
-~U*s0X3*(ks-b8{wla}HebQ)<d~pJDwgq<^PQeLlqlbT$h6W~K+#dICg}JKW(kShhQ!KdDnwZawt$Vr
-iZA5A00Tamk8#t`EV*9l7-rqdmNP;;_d&w+0}>lzM$4_w|X^mnRB;Jkhd-PtW`FwhHihc0Qx9YW+9X4
-<}01i!wRbcRV&G(g@lW@Z;(v<a9Bz=B2oK{Uy<FYFKnlj&3qv__%(o$%$V0M|p-`BeinNr2q#fUMv)R
-&(8MoXvZ9rxhG+kzR)}$Ekk6%jVy8+a9*5KM>1KPLsct+-`~*#&W@t3Rvi;B_)H*5e_{{M3>jGvRprn
-h1Uyj2#aP~Jr2`~#cRAaEE<TSu^hlV+Malqb7j{zpbS=#~KkLg91Z$W+Fp;ikkf9e0{hA4nX5+a7jQR
-yNwLvmC#Pz|e5H<Cr6SP6iS{&4a@OIq`SHkq%R+u3}D%sJH?oj2;G+Eoe$UsH;$>UiW9lzjqeux4C%}
-n=wR+tq3eI-ZSht;jy0XD7sZ;9upUCb{}u>bk|C;LwbUTbukKw*ZYe$;pTM`!w~`uNMUe3u7}QV5OX6
-oumG`V}T%`a^2WZ0>GwvL`q1Jy|5$7;N^biMkKAN4s_-+d`s0M)RHUu5@@CStqyo2$bIC7U52ov3*Z6
--S<PIjm55{cnkGgk@;u#&MQM_(2ecVyM}`yx2;oh$L?(+@XKV#dQv#rvSP^nr&+Y!cC^n6hT+~^&bC*
-#o^9jm*=7#6jm!U%8jJe|DEYO`D|=&eu3$~T>5s?x!sQ1=tnFEAMbGM=r{8tXMV`@$;JU4k@@Io#o_l
-gvY@3F!md#i=J`kLCqennrbi`blt<K+3WBG$Ov*Vbq$OT{h>A8Z^-ap-v34Wx_z}}7hg3kPX);9ySas
-}isGl1Ve_TBC8`j!9W_P4tS{*&9^?jHC%8r&xx2~YcR*G#B7>i+1e#v5>*Av;v9GTw9i(8+Pb70^BMr
-NLz(?2I(hc;k_khul;iFOl#R1^2`K$@+*#%aL4P06d&&Syv}qHqN)lW_`9&;TdAj5?S(teO|nBz)o*T
-x_c64r^JChX3v|DFs{&R@WKG9isiQ#eCx%aDx1J934>P?oH*CFQa_mFl5vcHWb7qT`4BGjNgc9Wd`4!
-ADbHDkfcy|I{zziCd`h?_mS=Ra(|de7^A~Z^$D!=u7ZoK;kR#dE6K>x5U7m+ic}iI1`fMYhogCRGCH;
-1OufNrZZj>&|!$gusr)`#p%{{>YrXYvBGgi&jVAaIw>3Bh#DPP~Us|65i#qr{ws3L%z9A8R))bKlTmS
-pV>A}r;ETAfVNOUMVq@uWIgYcZS7(@1MW`ZS;-5T$e_Wa{O3R|*DxT}XMD1U4gs>v3M0|A|=^=y-Y`Y
-44@^seEXq!G;Cgb&yJA@+k#W5gbXL5f>VKKTwD&3<L9@-n&(7p&m$j6kaF$dBV>J>8870;R?8gnmUpR
-W6&G82)s%CSkpITNv#Z-;v;`~d5P#6A=j=oLVpVsq{kIM9|=qHM%X1<SOlqCM)aVDcTo*wYl-R7K5K|
-<<DXdDm4u6~wU6{@(u}6|k9nA(K_E(zBoFh!#p;0{PEhGJC?=$L3MfzNG<s<AWP4p@9`o_!BQ^ZBNm1
-%Y;rk|qs9kS-E7w@@psw`-q)RbY`u)I`k@YhTt~7r3N9OWTY*^RrZ?f6lvh*1Bz%4T<Q#!b_B_E8Q{Z
-6p^GrjKThQ?aRvKo+Lsx%%C58It(-@GQbQ|t!9?SYE9%HL_nNN7Y#oSrKsId_N`lEBol)P_3`pWzz?1
-7&BF+Rb=$#}tgHh!vJ9f4yW_2@J&T$+`|<v%o7m_Sg5AyC*qx3sv6-86FJLj9&o1iHrEk88gV@j|HT_
-fgPO~Ji@4J9na;t8r4a~ltZY_`P(Hzw75YbapT|<8on#s18f~Wi&4$0-VBp+iJi)D=uwT49$Fepxg`l
-jgtqhD)Sflvx!|SBGK4i)M?T)+J5vJBu{s>i4$Z3dA(xDk)^RL)7Af0&l5EF2<eYO#RlsA+tu-|2R2f
-WUQTM{3@PN<r1-QU#^&B`Pbel_5x`u;*&ZYoHV1dY2>HfgqC+3wLLQ*=M>`Utt5v=lk*V8x(k)U}8vi
-L1k7pXyC20g_Zo+z?##KZ1+P#jAOJLo>43pBWT$09X$g`&Z?qSxV}yi{D%s57AA7v_nU@{kK{=TEQ{6
--$+7Lr=#Q&2l=cDPW%unshp`u7X!X%F0+7JfJ15;HY<j;IJqP<!Sets31n~@u)K25_q@lqh(#vhq;!T
-^<ZZ3F?e(7{7PyP3a2n9sfz?DiVJ9ScUEQ>ONHqiw*0b)MIxTWm(5+EF;CI%3ZKeqvd*o}yvO6!p_IT
-AV$hJ*Yk8pqX!Yq8+zNa-!|t0roV1z5wT7BSxz)+Yqd{~|c=b|L`R{Le>>CtoQKj7;w@pN5x?dj>Pxe
-1P*rfj($9&z9|MO43E!Qv-CNL6*F^a$#2F7p<#@Et~p=pL92oj?Zm>{r^DmZL+DoFP|c{18ee-M1zYA
-1<piv!tR22psMJSC~0$#*|xBV+XLtc&gS-&XByPJcAHwNy}a56#<KCmFG|el{yZc&!e9Qo*fdSF{f+G
-0d(XCboN^_sC}w+lH;;eII5sKBTwZ|4&9mYw5W89L1Yb7e+tlc&zuam6z%6x3nKcCBNL<2(}9D{&jQ1
-I!<8U-*`eXbTouAiN4Oc|MBL%_+xytWR=2I=dNEiJWijLSX&jNhd%P$#Ae@27ioYn8K2a(TWur+mivb
-#(dWX9-JFFs>F%sM)@O4D`IDU2+2S#lE3%Ky{@5;p<>|<;-12j`h(|sNio=VZJIAUIFXt-Yg&5Ge=F4
-7-^UduZUGWctAnPZMjIECW{Hc+ldsa%|l#%e+Brit!eD@8_qL1u+AYU<<%lhg0N`iuZSZCJ&0oHsSQ@
-i2c4vamn)uRV})oVhhJ{DTY+WMW)52up1jitF=ulKlc38rNHce-5A>{dv?&5>fhuI>_1+dkET8G3-)^
-j)9${2AV$>TdNO1Ws??aQitS^q@YTcq10jJbOq*SpskSet4al821JuCkxKj#xTBO^>uLjZg^*z4n;4d
-RrO5N<+m;hP<j9_2El98#hw-xfX^;{hs8UbhM+vfH&(7v2_35TNY*yK^bMvxTGTK!{9=o|A8L0}CrkC
-Z(&6H6RUBZpPJu%jN$YpDxl73_)%gj}J#$*z<I}m+=s6G`@Rw4+S?}Syfmq<1iP&s!TG+a<{r+>#Cc#
->$(rbUQY_}-#ej+L5&Np2VEPpgOfUUzZyq}YDd1xLiRPyzz#py5yEUC$U{BuE>L|h>VMu4>(jE@4Cc8
-7s3o6&{lIY;kFG=d<fg|tZ4XW55z(8)6?iv8tI(>KGL(G%v@m+|2P%N7lNXY~uGc%Wh)=3D)|tiNav?
-{MRth{yZbECIm{CgMA?eYf-*-l=XIURWXQPB?&Y@(fxO-zDQ*2v!%-{gDTs56fasw0EnXIc)H#ls*F@
-$$Y;!aasKmJ(D7NiHZXO$Pfo<z{81_CQokYXWtx4+(%4}8`uDxds(6N>qGKZNaHCR<IoCzs*MY^$IDR
-Uv<Q>|mti28F&Z>T*>EK!&{FX;F0e#rd#AVP_0{?QOj@d?%vw&C>{{J8^0FL`v1$nh5TyP3p*Aj6+sn
-&U_<cngH_Xql>;7@5wy)?n?Sd~qVeS9J&=^8u82V$&;cp-O1*?8?;CGVh4~-khU3HB9>r;P!<>TZY7P
-~TZg4tabqHVt%$G30LkGBSJW<v*Rcj!xY@!0xTd{1j7=*_)nMW%Qkl3g(_Cie(hbkj96%uk?*3Agse`
-V5rVdJxo}G8Hk~KnsKKCV9KcI!?AQsckoc-mVvsn*e(g3B()dZ3?knKd@pFoNmJ_$o>Lx`j^cFe_LkZ
-;~!fCf1<VfKD+q?>X^<VB<nifeNkb#R_zh-QQXo<ICq8#lh>z}J}i0}PcqM@pT*F+2rEc>;fgJ(5U|i
-`|3<(42tmSTcsCm*i|b21>d2Qd+wUG50jK;Pf}A@&Ne&x*nQak;KdxqZdT%=Uifz|LUu0~Xa{;~?bU7
-rKYP@b~O@h(wfAaG8aCG}=U;T%CBqNh9?~LP^GX}zX!JHf<Or1f`rKrKL86n<{VMvf1(OQ5krb2XYlw
-@UUsgfh6gbCRh`Mn7bs$|Aq9zizhjQpX&?C4T0<3v+$Q5`US46>64Xt;@H!>MKhvb~;ahYnCXk=whZg
-q@G`&pxxJf;7&Mo`8)Hnl6^P6)k!?A%n*Qg8+z%9_@JWTEsd=Mt&4<B!WQUarA0d(Oz79Sy5Bu8bvv0
-gQlNpyW*~)!OgRdBC)g<1QlyJH3S#WQ&$+K`4$G~!ipxhV6iB_+{4Rx#ZafYY3^`SN%C)@g+0s5oTXq
-WD*&uVa=X-7-c*;a@2jWCxMT}Ez1{gKAvJYodI&<cnv!N&IJOZFqmJ{s<;$fT=<3b^VH+F6`XS4j4nH
-pC<4~o+Da8v?Js~_7B{y({%jfu#Sk@D9q{$g&tfyRF&SHbaRSUQsCY&26?z7X?!}OF4EP~S@2P@087f
-)Syo^M%ap9roW+f2QI*&7od=SLVYiW_P-Ks*;UcYi{NKO;`0FZfYvFA?>8u=I>fh;}*<A?vB<L#Ab9g
-I&2hSH24A4s|+K7iSwdLC$SCDaD<Um;ilW+}BD^)Sk6S?qYZbPKzh}>TU@`(Ip~!-DHunJ*sb`8E)~|
-7yx5$gW6AntYzL#-qK}4ZdW>Eut4f`kV2y9Jm|+VosH|Gle{#gEJ;>wMN+D`<4-5xdx70gsQkCR0R6!
-xAa}br8ghOv3oyJBePl?yS^2_G1Pgy&T=t%sz`6)s08I26%}ORTMI9rSS120KsWF<XC-r<vXDBUJe1&
-`zoZRR{4v$e%5<wFus+~?aiFN>s!b5D6@5wa#hJtk=OkoIq&FQpOEM#)AB8_d|R_7;yB*^6=d%{!KpL
-y|Oj;{&p0kay$${++B7UZUrIw^@5hl>0&!@38$eax*#B^bd;2+2=WsGC7Jo`{gMd?sJ%c>{o1cZ-vX=
-@#Vprfi`l*qFy@JA6TJsvyWVSJYb(x5=CAJo$dt1RCmFwRW1hxd#~qsBu7D4k$6BA=;BgBvePSw<_>j
-7bEnlURUj!@bz7X;`XJ;+&mI7MAvC+&9XXy0}Al6eb8jCwXTgknnM*bU?6mZig@JumP)yj=cuh;NRtx
-~X!dz6Q^+^dGUc1BX4vfjiMC~zBrv{zgh}VGr3hLM{iV}i6#IHD7<^ejWQ--@_Y#vEa(pVxYiY>2d+=
-~GYZf4bgX`DNCuV_=C8k}7R2CYV0q#>^X^Dg~>mK%0lXQKn{UOn8o(qrWRgKc{gc~Xa5IsXjx8q^-bH
-a)2tA7k`i}128-HB92drHq9{D^0;wfR(eurY}Q=jZG6B2*oELQDZ*Coy#VahBoJ(5mG?-5dMhOi3K8V
-4Agu0?m^Hgv4Py9%1Flc*^}XJNNJyGMainEx;8)Lf@3%_=MeGNn{=RL;7Y??vP2!G+&KY$$js|{=3Bz
-_Ma3>zj5%##S-@0#nM`Jth5{1qiHq|;k{By=}k4UvfpiMBi-#ts7?Eq#vgl;?7{aLwS6VY&$}fsxiMt
-~-}H>pzT2{%V5RFT2ak3Wt?g1j^CC%;?R0BtwLKNx^n_@*H3slx`$|Qd<PqP8&eqy%%Pc^5H)4Fd_R8
-V$cyl0L{~D&d6=SrgbD~?7747Pc|DO~~f8y)k6ia1}nBot`(x=D%*NY|n-z=8YOL%y?zH6EuU6Dyr3P
--(uMf90N2lf#5o{TQ`S?Uz}3Iy65GVj()lbdzDk2j6M@lz7zFY_L2Mvn{W!wf~ii@R*m@$BA+uy!%I3
-pY0-6Jr8kU~%J|Z)c)~Jok-E+JyxPIudTfX;j%aoIG#E4NttTY#d07L1jrzc`zGiZr@j}V}O3Cc|I4V
-hX>mZ)AL}J7F6~~-i0VBRp&g^J`tPOXiU?kb}!IPxuS3Ct#VlZF3{5jfO+MGR7l64j!RV5w{Q^#(_(A
-U!12)>gP^(Eq=L+1Vcgv=eHzok<R#x1T%Is05d#p$I;=TNjAM{C6L=u&8#ekFnMiMpYIG-2TpYjCXvd
-P!DJBqRY*O@%)Q~=mE`0&if?pQBZAb`dUo#ojGkS<}$940gqdDjik|-JjnS&GtEk)h)>76o-ntD)}J#
-Myh1r~XPBU3Il=58NvN5Tul_kj?Jqc!)IoNKYEkZ?|2L*Yi{g-!@!`9u$mG!<Ip8*dvh5!X78t{0#Rc
-s!bqb4e?FWzCnCHm-G3Q#jwCOr>#EgZa0Mb>I{XIns)&#LUcLJb>YosEg4NM(s9upV-TDUCC+ZJz`UP
-Tb@Kl8OpL?w_5<_x-f`CFuRKMIA#9uJp1_xP#Jzgi)CFWOV#$3em1!B+9NrS++HPlq`A<0G#wo!ttte
-XsGFX~>RLONLU-u25c~VZl91v{22~MA;oUI40Vk&jB|4a=<D37x#S(j9OTcnm;jSy}^})aK($kRz?C{
-dI2333~@5UEjXW5vS=Uvz4(<xVL=Ef0GAE7t5Tfx@@V%wUTF4yRGdVz}Bb$NEU5Ky$}H}%yLuLu+sK_
-4dsKTrc*UYne_d*JKF#OhN&Uu-}=wjFekIaLRbgUqI{csxIyWfogQs<Xw;50Wr5oD>VkVs7-{aF}|!L
-a<tHT!FDrKvJ}ku&x-UMvuF)-aRt4M>srMu#%l}L2{9E5?nCsR-476I)~C+@!}yn6c&iwq%H(Z!p0>3
-Q1`)7tA2IypM#U$_3=2KF4yk=lJ{Osk78S};5)zKyesY%-kdkQ5g@#adBKA~2w?=`*AJ*nSJkOL-97i
-t#KcT=S4cvbEq!QbuC>?7tmytZkkQq;K$zgraaq<Po(7=3lPi|duj>l{5hS*S^Drqasm4vp;!6s}%0r
-fE9(ujk+xtY=H(s|NVTzw*_+lpzJl%M*^QsNOXCS-lm%L%x1}#wO!D`j)i_n9-o&{|TucaSa&)R5oVs
-qNk69<TVG<VvsIr}1SxYqDMlgO6N@F#p?IME`x2BWnz#8ckcVv<=>A1X1teM3*utvPY=GgkJQ#DjyBH
-}$DRApp7ZT9C}88#!uGB?E7tZcP)&jwD4d?H;*pCaMr;yd1BmIMCb5xK(NLL_I{jRbL!16I7e)7cnm=
-<+?sO&fxO=y2)e%Y2t*lm*U3w(=ZWp*adU7gA$m!arJnD&JC2OCxD(yVy0Fdf}OXU5clVEig8DpnPJ^
-tt6sDHS(>BtAM`5z4<~PPJ5T@h#WVa1ZTZS!uKU~H8aDWD`mlpB|HFepyeHCU$>aN8UzMfvW9MJn8UJ
-s+()ab1|8kYTY<5iJPc8>MGF9luJBfmi@)hXga8Bk&BY%p1YDIUB_It(A!-5Gv?8cE#@#`VLmVRVPk)
-xyWa2W@W^b?hRtzUtlf9J@-%QEOsxLA=L3m-ej%aD)N5_%Nr6rY6^<RiWfelBpRqu_^F3ixqD%&3oeU
-4E>s5c#q0vtO9_$dew6FWJZceCKz6y@s-UWB}&>((L%v?C=-TWAW|^TsFG@#(Lz|oPKBu5t7bo(~fz^
-f!@l((GGvO6nHz)$)<1zLusS4uL>rkCj5NxcbVy<bR-JoANo5qO%lw>6TLC=^!BJ}{c4@Nej{_=Xw(l
-<07pG1{k}Rb{G~Zk`>L~Y6tR4|BY*$-{?5k({@dsKJ0B1DZ=dhKeY|hol)zuLQ_?0&Ws$LjwenIfM45
-N-SR_cK=sr4~Hyt2(wZxHH_F6o-w`S&;?+Y~<Mrv60l+_M%)y1k47`uKgmwNSRDw3BIja{$EJK&ZxV5
-x7%@WsIyLH+fjO9d*gmPGR6BX1!rboHJy?S0D2iZPCn>w41gp0&5PO9h<3+bB>y1Gs*V82r>WPw()w8
-W6d1(^?UR0#4cme$pfBYzP_&wE;#2;!DzcTE(T`6k*1ID5pnHt4a_K1LGuV9;a`ODdT-d5!vltOIQqF
-FF5p8bWn<LY`S`7XH!0yb3@Qh8o+n7mhfizT&0j=IvDI%TR#=}G|KB099%)UPwP5Bfp^9kq9Qr#?3XL
-Ped8~{e<Luzt;P7Mo6?2=`kcX6SY+es@)QMQpx>hVIuqCTpAndy-*`9Vwa5Mx++E**ui|rafkOo=PIM
-wJZporfZYFYICdJ6j!M%AZF_l6U5`$f*kXYKIax5XG6>(=F0wB>AZ0!D0Of!GGao<unJ66-uVH-Rk{E
-7sl(A%3cr@cgt!<(A(X?Dx=i;0oNM?e5C?=Ql*LfGQxeT83KNb(z0(lW(>=j?e`Ob^Vx{$z4EYrjKF6
-N$<ICCOT72r2>xpdj;9Iy;r{pYeDiO(Rc+gpy>rDb!6P87)#H@v7CYvdP687LT(vaDs&wu6~{6dkf@L
-UK>#?Zial<S?JmHa4b&rg0|3=QJJECGpCH?sWwzCtA7xNRHF$lnVfIeIfM3q(;Hkbn6Cd%w7_`&mlpg
-3xrY45!cY4Er(=(4%y*Q!*JG29%{=~sqyKAX`i7H#ah9K;5`qyJC1DaLa2Nz(3L*)Jf^igqNRmXU{Xd
-Mvf9n!~A|J^u@@TjqvZIX={h-kfX(W2IcI+UOCr1tEz61VyKuxIwj+0Mq!w#+_c%1TB140g2F@iYOnq
-cfWP5hA(BR;mo>5hPZmfS!-Dqu-`EcBr8u^>faM}@?Gfn&i5IVu{cFRDG%u@aPiG!S+|a7giBN2LPv0
-bmL{F0-F!rwB)7L~=YK{<5r;rw>4#zXPi2$sG2OjLBFS?fvLN6p`-sfBd9BMG4TaMG1oC{2)kEE|KYJ
-A0MEPC_rFsk?*~a;)E2Q+Wj8{q#OUx*zj8|W?}8o=x<a6KFE{a-5*j7U#cH|1QUg}LM0Wa-jwt~y?d?
-3$|1KMJs&%Ga@zMtzbXywMsG)D1E4wSTiaYrciLE!er*Wxgde4YIHqOX_s7-g<6@LaJEZR~`owRycn8
-xM@ixsa7v+1#gc2<KXWOHredA~j*%A32*^CW*PwH6ZB9uR-P8voi+a-ouI)%qM^4;G`5&*vkQBIaMZb
-UUteJ&Z=7CKM7MwK%t@OBr8(N~``RSyr}eFOPCUj^{w!*owHv2shaTyt0qd*O|67TdH9q58C=8j<Q&k
-+BYT-v*6;RWAuXyZ!45B;C}Kw|ZSJ@|%D!@A%48F3H1faUNUs0T2C>_M2>A!5duf6nGBC5WlPeVTPr>
-|Ahcwcu`w?yFZF`dC9n)QghHFOEugOhH`5uVRNc`dtmAL3xx!*5nD}6MFvJ<^kAMdK%1^)T`A68yDO)
-a&YZ)`u%dj<7M7|A%W^%#b4BvEQ;*bKz@Jb3^$||G0c(k+={x|j9{e719a^zVba(VX^V9Mqv8-Ij1dr
-cH2TfJI9i>=Mzkz5O9=4e2r#u4qzvPd^sBiy9JiY3D1~xMu$%1d+dz=O_cBJv28s%(<x0A*#BFm2A@y
-lZtZRdaGz?4U6M9S?al`l(pq}g1FUbG)~<bT|erN8X>WxwV>>MVdi3N2nRrqTMdYNZK;g2x%3W<q%GX
-qUq$>$Zk?<qEOW4kfz({_AL19YGX5;6-uLr4KO!0UzVa(6T@91HstYdaK&0@`K#S^cKx}h;bj9`@}9!
-t(AMDbAogBG(~{N#C`q;X^W#g5S2-B@{*SjX>yH;Ci-Yh7TNfrBvR(tv_lgQXvT>5N649xv2NH5%yz4
-D?p@)-^zEM_mC<fZaE-tevofJCowgtdm=Ji(>6d}a25iu_w7w}Ll$TT~`#?>H>hz3MnZ3El4ORyy6<o
-wQCF7ek*K7@5ov<;_KFkRuE4M9uS??jG-t;Y$Eb{yUM2}TMZR-`qHI{MA$U6l$TA^jB=&up@_feYrAC
-BeP&cA+&O^=Sqf9=3W?a;dK@QFK*c=Q)s{-?)&L*oB_+|Run2oC<X`0tPl_!Kta9|drfIC>_jk8&OI@
-ufJ{20o%UNcP>@;@7~H{P-Uwhl(chsrEyVBOE3_NAKVUB}do@Q%4+Hd^``a;!vI|z(2uR^n=+k`suq&
-4~vUEY{ubFF~>)<4nse}1=y#j13wlja`Z4@r1ImC{15;-lo{gB(!(LH_vtV_?3$o|r+=dv^T65lJI-=
-!Xl%c$Z`OG57YwolK(pM1U%shjuDtqHv-4Z<_J=gU9*-S0XoBLo&>zmYK=N62ppUdYbJRB+_Q6-@qv5
-$f9vvC(a^*BgcdA3f^Zn~K;CI9NC!+#>H>}@}>YsEn>eshDQn+=Zp!?gvul3n?d0)|;L5!)_30|1T^G
-b8Pwcn~PT^EkqKU&V;TuO99JT1NFId_BGc)1~)%~z&T4u#eFssbY%&x3m7DI6>pW#FPPFxk>2*jkzqs
-69Y=-`0BWO@@f{hvVDE)s}9SD6<aJ3*yzThL_7xePFd`D>WoKq%7cV8;|sfgD)Xeid9u5ReW6{`ttSy
-jiauhI75=|^%o*qH-?qW=KyLv;nMFq8dq`DfL3^Vt=^mWmvrv!>8{0&a=mbcWSvmfCbs@mb?$Taq!S|
-=Q{60NAFqx`<9r==nAHR4s>@(WC(HEdBM)L4H(7{66U63(@>UiKkoc?;J9$XIcQUfH^*CsSe?*JGU*@
-|FB;Gkwq3LM#vM}~qyod0uE2tszf1+Q?GT@i;!h(?{Rg)!IlSTR=;bkF5cp_R=$~|5xZ1w5gy8)R<y>
-lCD)ZokArrxnOV=2zLLB}0vd!Ftpj=X%i$=tX0H3xBQ)80GV**7qs7xmE(Bp;neqq9NZZ{OoR3x;Z&T
-{*+G1Oxurv-1$bg%kKIIlZraikORuGt7fKiH2W+nMC92n?f=qog)?kzobvFISR~Ih$thV!se8HDS$1~
-W0(SU`}`Ilatrno2b)rSehW5sOYi^L-t_}ep8|N}WMpSdg)QKv#9akO>1)RJLf&KsRqZwYl(?F5hb3I
-sRBzGpt_I??*iwBgg)lL>f;|ni096`x>OlBB!8Fks#zo4NJl5-57Zt53a<*PeCs4Iff$Blvft+20U_<
-)3zG8SB72A40{9snRp~Y@$M^2}~E{3fUn;X115eBW{Sq$8kAha`!UVx2tpStOwp~8Ea12N~fR)}de;;
-7;<m!xr6MZbk_d~2tT5cjx1M66B-h&a{Y1$~o%A^Z1udEB|2b?zcN7h~A8XkP`Gc#V2lskTI~50mUyW
-I+Pw?h!Lpo>lE4O-^-3LO^*`3v_x~n}cKTku{Tc5QENYA!s{2PV)Z_pys{*C9M9_!~YttzaIJ@i2Yl|
-*&WkT{0Kndk192seR9O;p%=7ApV$`-gO6?1{v`Q*!zG0uCI34t9~ocl;~xbc@(DY37V*Eck4VrSm+ld
-4kslq8hcpBAQRGJcY}r3Q<ZpM}#y>g?<i~uG#1DwxkKD($2gLA4;|Tr~NGADlnVm2c$Z_67od`Vw=%Z
-l(J<xuSlJ~c=50aCAjo9Xa*zcbZ8~iO|3-mun?8}XQe8WcB{TqmFdEuX+w!7$D^b2ac3vg`w-O&E-$b
-df^+Mkc?pLq8w-CA+hGS??WyRg?+u<#p!)i0%^%D%AkvhRTQRw`7*Tw7b&?%@tBHqtT05~c48a_dX_#
-Vyou5ylf0VTwCXq_#HjqdZ-b(qJ<U1Q5r7!bz$&tLurXG900v(TeanVf6f|#AnS6BZjzX#09E@?8>R<
-s1--2g-Lr4dLrOyI+~ELWy~cLE6oU%oE*Xr*Am^t)UhR}DxL#6TQ_U<%^0n92t~*Wi9j3FRk*c)p1|(
-?<AGlWL=p$75)Afqtzc|}<~4rd;OK_s<2B}2gnKnuMct&UPmaN>3fSplCnO-1=1ID6AxBPj2`eP=n4C
-6Zdk<Hip&5iH7vYt2KMy&AL6C&R_z%c!o6FHOQU0x!YW?cg&06#CN2HGLSNiBFead4%(%0_yE7dH6nB
-S4x+mYMekz0DmBESD*s*V~XQCNU$O}-+reMi0yCWwNm_iylL&dJ>aRZzbgf81!TcKcH4ascsB{Q{(j)
-*cC)&jye`p1(gR?S-G`8b@O)Pf`~9O|Jfc{m<<@nme)smP6fsvYrl<HoH?_wT`hdKJ@STxU?<|TQ$rh
-ldR<!b+%*pF<RiK;llbmVX5x~BtSkIBt`fs)X@tK+E46}?*R7TVEgck88~qN&kc`hkO-#OxY%xeC1XB
-tC6zEvhVjT<I~l5T*aOJSt&kQrY~C>&<R%lxMO!tTm{z<Cu{jZhqQ2hrLveSia*GiCS~UoCS@|^E@)5
-*<ZoEu4iLc1E9|npfoz{Pi533dAJC>2-Q%eZr0V75N)~?n>FANd2$0g=PCzZ%j7Xa3t#Vpv00B!?XpJ
-w<Hz2#;yA;}ND>4b;|#hDO0=Z!^>Qfon=M)lN{0neP`5M2zceJ+Bs%3-`Rod>Rtc=W2w8LhK1#L8X3i
-u&!!W{`9<p2_o;by#a;Jj~P~qax8W050D0dOZYY4!1MjK_$}@I<z5<`qaGF<#tzQ@3l~GlzvOkZcSEI
-u%W-NK2QIPtH-+h0;U#xpzh~&{6EM4`KyNfU+nu`3I3P;e#&Hn7y%;~h=VXfAqYak&~Mj)Vf;u*@3HR
-zpq~UYM10IAu_I(XoWVZ1WALNg2mW3ta1U&8=*UXvA4R?_KVn<>(=&&E1pN-3BkTxf(NAUG0sO?VYD@
-gtI&cmj(K{M{yvDLm5gzzaT*5x+4}Bzc!2|9OK|tzg1k85skQ~|SBf9?h9^=TdFdct#)>QU!NG1=(2k
-<YgFogI38|ZsYo<b{^efFJ~dK7NI2Wj~`5&~az;dNEBw1xkYzLxl<XVbd??o+`YE=1K2?_Kuy_<egHy
-_rhww0TGOW)YTea_9_a+RV2dzN~u+@>h{SexIDu^?HZ}I_{=@snOeGke@d$?k~%^E;z3IMq6LS4ji^o
--p6E>?sH6b=U3p5Hy`_(#~W?8&%1N_Mpx0HgKr}A`~lMZ*Z02)-?}&XfCc%_#BJFxiDdamBp=>L^@B8
-NHj9P8h9<#C*af-ffSxL=7vRhZpG5b{F$LeE*mJ^sZi~;zl6F)b&|P_oL7vB5k$RQdxKEO=NVkU|)+N
-C3?F9GhcpaC-AfBi3F@kiBho04uH}Uigs9xI|kdtF01aG$E^@-}x3oYE%LL3npSmF15$h5U5wg;9AcW
-Bx}SHfbVv@wSg6+$wm<9oB5Gj(pRq^?k>q74iXwSzcek{mFd62u=b63k0p5c$ar@Nq@5>l+f>6NK9$G
-xGlZCcaY#pVn)6S5xak6uw8UWLFh?K>rR-Rf9Ha8)`WZ=d^XXU+|QPe2fe$n6LEnbJ?T%-hO%|sXM&6
-Zjw2_t)8>Y+i(R;5%-4TEVdVDZc+PM_@}&n(7NqI8`{mbG#cAd7=v1RFW7n+Iui14)rv7D@7@#y0}@3
-?*<6lHV)z~BgzdCe6~+q~Z^{}e#j{zp&;@_%B{Iyn8t1Nl(#^9TO>nePu>zPy$TyEifAOK=T5VkxfNW
-|K+j7mR_u6Hh&%T#?R89lW6JvL;hI<?}>;qe+sdQZqsLxU7=QoC_L<&hyG~H0GDOITjaq|5X7G>~itV
-@+t(NH7p;H~Edx5P-rIK?fl)(CW}b~UWL9&e@%b@=<q-w7~yJWLg@h3Z^jTw3sfK{RyVnz*bNMk&&sy
-A=to&xQj5!_#9uWP$l`C4$l9x^Tt1-$>v8&QIkaHNY?RcRxunO;Lvq1nW|{Rzl@-+8WI7_h8<f!T(^o
-U+ty$8Ho+|P?GB+$B@fA5p_(8i%5STO9{@osSoP&^9&N$MZ1QVyPyFRYua@OP5V@bbZT(HhIg)@m?ox
-m{|W{g+QMrRdhZ<;#m60iPn~`%h;`1*GVQ`=0f>*@>8F~29nTvrNqCyqLkt9~6s-<Af}twKu1}9KBDR
-y>?CeuJTO)Y4uawqveUkv~E30Pi#b1aBO;q!ioH+_4lsvOeQ5)AIH4WA32*imJ#F4s?5n<Jy`cNqNx-
-|GD22OcvtB<MVpD&W~8J}30v?k4+n!Gt5Hm`5OC!yxd6x=%BEPW>ouR+tf)QQgml*BFI2-Et`%k?#vD
-AUxHIIB-^+J6*Y8J|)5T6V#GA{!~8iPw3%t#?V{CxpBT8QsP^YXLg@H8DjbTKG0C2IpQ+>PYla(lGi}
-YC{|+xK}&OzPyS!*<8g;w7oZ5LC6Y1^CTlcxmC`U3yBTh`jbCiL1W}`o<bnlWpa7{iQmvFd<o|e;k9=
-}@i1O?kIp|O5B>y^+yIDJX{383Ha-Szk=+pAadSLp@x#o|PxoSzFkQDN)7@VuPM6TP4xxHBkgOAOmXP
-ZRY}&QOee!bar*>&sVT!M%yQ-QOW)+EwGtWoW%QdT6lc`LjP6`*`5}jV}8(6<*as^cMJ@NzcGT9q>@$
-+J=bR()A-d($1svD0uMbjveQ*=hQgqa}gX|#4#^u3;{e_w%$Wj%|QqeB?-czzVa85j9@`m4g!f8F!Dg
-4DOYeo9x6Fo}UXFG2~F#3`Hve=GgChx|K}INB8QBay#z3y?Z`C}HSOZX~i#aT<K22uS$fApHB>1#%op
-#7A)egne=$#nJ7szl4h;Q$ayTMgjX+rXJ$T>9N|6qdOD(^Zw35ZxTHEK=Y3~LH40INq%rEh&p-~cB-}
-Wo{adIhJU&)VEEv9I{|_|!-l`O0DbhOGU!mfI+`B#q5LI1lE95+ndE!!LJr0&(l`3KztX=o<~DDCi0c
-FNvM8pjb6%@3w)a?n5!W|uuw_h8_caq-*zcJH>+8000e&nAaKAZ)eI$|H<?3jNwq-}YV*Bb8_I;bi%P
-W7QP2gK*gmr~Iq=;<OZR4HGm|tgXo?RBn<)<&Byz%;1J-wsmfIqeY-mm3x-cf+|w;4|YJmdKsy3b&Ep
-Mt3G!GPkT_JtUGtbZp~vamLTwJt_+pU`6RoJ<JTUblqTOqSa1{s;kSstwqRNuDp^z+i48#>4?@A`ou)
-@1<Smf@ji)y%gD`ml{HX@L4(OPndhCwiWshK!oduk>5Z|d{d89RcQj(j7p;`ox0c>cazKEfjfC8^6!;
-3!JF5SypuIS#nkOv?`fcwjA1LWz@V?pwFfT`FXQ5P4U*t)=2st@xL5e%-}>bub`Lzq=>}~<`#BRa%E?
-1D05VN37s2+56E|;VfA2DZR(-S{Ffd+BHv;cxn(WVLPH3$8n#`vKPR&Bzo@Bysn0f}li|kRJrli((wy
-Z0U)lq)Bva&=Eq%g#fbcs<?yz=yu6a9JT9y+xQ&nu_ogTG?A1T=Ud){n>5!ZgBjcwpSoUdZB#qeNL{E
-=7Vro3&8~Ggfb{YdG{Ch~9>gAm19io>2loFMP{@_3#c`@VwMUsh;Wf9&E(Cs<8@ZwWh5j$gQ|`hOg?J
-V!CjKu3mUYHXJgvD{x1A3sZYrt=bb<1iD{!<Xk533A#LNtl^R3hE4KhK0vIl3szE$CufeLbei1hV)rq
-S27MDxJ4lO~zE5Zh6@o=0H*euwZ6<NE{r)P3SyE-@@XY-Pu6b(37qf-RKF)ii1!i{)O!~A=LkA(vIYr
-g$cwP7CL$)p^j7PFY_o+G1(Kp7k-_GwNbvdR>VTLmBeaYYC`P5-v8vjEr!AAck;UU~YB%Gr_dqwwl1R
-`H(62F~Q@Q^yK`s_|^>W_;ezV%Aq)I0QBJoNQjcH`#|Q9z9$KNkYNUWutH{ri;?Sl?0>t3p_Z)w{R-T
-wmze72({FE$td8fB|oQGMJNSHwHbwoIhc6%$FS3&i6u%iD^N<NYm9Q^mpz6UJ?2DLu&Q$tx2~Nb=Xg(
-Usjz;W`7<ZGU<M}&jCWsl$Iyi^v9yg=RP@25%{B~LS~OQ1O{hmi>6JJfoRF3lZAQHVnav!r=&%bmT9J
-;MfZ5*jz=IZ8St}1$@H|S(V@9B&HXjGFf+~4v|H{6UO_r9>GC*1WFC*pzTf`H^E6;C`<aArKO_A(Hbe
-{4(jrQS%W*>f$1A$WV|bicB<X}^UbL9f0AcP|*sqj-&ZzBI*oV9iJvN#9F_Qg&>KIvUa@%p@{Y1hsg6
-J6OzTf^4zPu5ChR)L}{pCcq$%vniVA3GXg|tS~E6wq=ZqhK#yY$7RKOgb<2qrCP$C=x&S9ly}&S++#x
-d*K-^oy2KI$IcoX3?+Tkw$0beuB@JxY5fG6)pQ;AZ%jE0zV6c`>mV3|G1%4cx@xN-4ao_9W_@0ya(?4
-&XXp5sjHC|>$?9I7W>J_4?Y$x@#m$x&#hcz?S5<DV}EV;+k66IAAOmJ)UnvY38KBiABxo?asOQ)N)-q
-FXB3)8HBlhXUvhuHk2QiXw=&Q3+|F>#^>d&pe*XpjS&_~T>q@%P{kc24dS~ybhp~5waF<6kv4)=YdYE
-LF7K9-f<4VRxuWQ$tWS{i_M}WLV-A^##_Hh4-hUYzkGL6&}1KK~=<4ni8WjGh1_ehOe>l!bS6I+C=4J
-HIxx`6U#`-peW>J&lG`>Kcg&1k#28&X5Psr?;uDL!vsQT*TsQ$Kvj`8|r<WWuejf;-&-T08TXK-+@=T
-ofHVBdYsFr2K^lQL1AHn#)Qmnl+M35U&-s8hxgaxR^9`qvBiMbHK|xDN@`q<4(iT2Bg_(P!#CZ@fee0
-hPyplZ$hrL;@GEEX~!-zX=N1^<YHDu*WO29>hP(9%tbB@M(Tv-{Ay6P4@1P1-GMb!rdsk|f^{xKJ2S5
-*xbl&aHL?qSbKu&S03xqEi-+Z%7Mv=jM+YOldQEeMZdwaHEYrL%C0~J0D8WgxW0_uJ%2(+_cMRn%6{`
-Rl-}>IRH9llr|9Porx3iaQv-%Ub^7cCy<77s?pjxhj!G%sE5P4l(g50xRkr+1`sGyaG$G2xdL8+%XTB
-$e~q!3;%!kc&$_h5zRDGWqqI^UOQ=%rGTy7%+wLrJ#NDgYUB3Ki_}4(#DpT?yeXhOf4!_g~SCQ>c776
-+~2|h}of}DhQR;y-(`0l@l`82K0a>pf^0<T;oVJ?8X~Ra29#woho6;%w>y9q#q(ZUnCX>PM*$(&l(Mh
-f96~ErETViYU01^RQ7id{K=c_=YxJyLWA+&_DdHZop>TY>@D-dJo8XyA&{>v$`p8T`NO=kIJ#S?KUp|
-UkF+RC9wEh{aE5-|g^?rL*q`U*(W<;ZKm3Zp!}++tKB_Opzj5r(lxnHNxa`Z-i;v4DmL2w<X?CpTlEe
-|zP{om_&9I}$_)s`YjuE1VjM))$6v#)REjhBr;3qqbe~tq4e?!S%=4L;A!0+$6^DL*Lzg4Jpe-RS%gm
-eY?kC*S)#HMHM0Z7I;HFQ+`{z3m&P5Pk{IQ=FpcJ$2vo{$~+*spyk%MT^PUjvaF4Qsb_(Qh)UZTgRa$
-f`Ro27D@k1^yQoQEQ*C<c0rcBD%Eh9+U*8i%urUugC2D&6@>apsxmF`x_ER$KP|YkQE$)?H0Vg!n-hj
-HzEW1pMn$MFQSu$$zC#!ZhZ21R0N9Yoy1=xNLdIUW;>-200>;KmfNW&e}VX$HHxVM_MA{u<|QDGQnc2
-vJNbQ`hzf(>FE4&wuF>esmxY&_$=(2vRtwjNya5ic?-L`1EIDYm26AtYM|rLYVGP4rRDJ91Tic6{_y(
-TBbKn?=S6m9V0yJiMK9u?{B*=WW8koFZEE7HB?<q7Du+<0(VaU*1?&R=%3O#ogVKG6BUI+btpZ6tTlP
-gFXrjdD_l6XS{LKL5Au!&NvB6i+*le75`UxN4|6_OR9_=MQ+kAl4<`?OytDS+aaN8>+=r5A)+*xI{Vt
--a+&?_h=abX_u@obD@ZSq9`^F5GEGqvzY`Qx>|VYcs*X`!d#Wpc#E(#q^^&I~ZD*GhSzc_B1@Li!Erp
--Q+Q%>3azCu=CW#X``s|4Ub90)<7Gp*Nu9z*ph-`l=L$zJ}&`&zpD84;y$XVYl@M)Lablp&}2&1OMAj
-|SnDvSmPu#;5Bl7{74Q6le2WPN!>|H6p-^QfPaL$F$;PuSsn$tE`C;SCT_x3?^0Z>sD2Ghl85_fG#mv
-}OTtD?Uf9;x^mMv;w6N)Oo%KKSm8zEVgp_@<S>-{8sk}+?fu%u!Bc9N6_o}qoyo~N0(k3mgb*7JR<8u
-=|hl}z5oN`Id<af9~H*j!er!Vne3ORSf#%xe+kNxlQ9BUpu_rrh#1I(ci0?EJnm`bU+yZ&lR5dHeHz=
-wP#%Y(Du?7PM2=upw&tON^JPAa)eEN_twV0Q4@YI*_90O=s}ROcHkIUgFA%0ba!3SenzR2B(29luW%P
-++)Ab=iYDlyZN;H=hy*i)$3();vtF72e&w#-Djqqxc8h|0?YCj_}=y@BI~c4b86*zT2>T-@C!$rTy({
-K0g&*Qp<kEt#XvRE%SC5wJ!;)t_~KDa*T0~QG!ay|%D%r&GauxUCom&cZ2BtJzWx9#8FnbqS{@vnUFd
-+j1}qwOV|mV<1UKtyR#1vfGvoB$&<2SZq*Y7QE9}m^k{L#vfUa(HiWIDnIp=UWztzA;Ot5yabA+uAD=
-USzY>gGY%Ou%A(qt;MguvEK(WYx^`V|0SW?XaXDtBf*JpDV&D7_=HH+n_~Lbq;BIpwdKf@Ay&E5qBMs
-q#YZp}94HSUCGWfN$1~-|wZi5GUevPD`PZad$@XyFcQ^o1T(Dwu<|>MCWME`?{71o^)r9e<Jr9b$p;3
-)uCMLA|A#>5$P?}wsEK1TcEdCk)QTZnNVa>YlzCXM+df?cPzgAXj2&D*<Y|5u*48m(HhB1wJ0LpZ8eN
-HqqyZzU)fdFa9X^av0K=nUXHITZf2QR7?@XGNS@eoe*<DsGOar9Wl!nVe4N+Qglx|cpG<9Yki^2E)ul
-Z|%?(H4)U&}q&_K2IM|;hO^Yi}R1M$RUw0}?m?&NJ9+m9|E;_p=Eb)-^%c;i?0^Y;$<&U=2l`%lZ%6a
-}IXh2sPYffNXV1cjsfCYU5(h#*Lu1R)Ijt&acU{Qb#aLZ9p=h9Aq;F#eUnr0}8D^0mbo`#1V~H5n8+I
-8So0rz0hL2+`n2{dWo-Jy3XjG({ikdmm3&1pU;U6Gy5S`LopQVOd8VMdd|)B#8_1s0Am8<BTwJ<c#Bw
-eckaA{x^&s3=00xufyLiKlt9!<As0B(veS<I()37A9n1>ze(yZ+0pe#DZJTl?8u@O|0Fy)L~W8a-|lS
-sda7IWTU+G?&^O-I82MYWQ#~4QV_$F*c#l)>{108cnkKYXn}}`Y!qgr~D%C+ZfUkU`%x>Sj$J2FZKj_
-CBhjW)N4af4&+io<XS?0o*N1Mwh**m$BzxJW0zmmK64jsPun!h=^xcpy6^#=vB85q$1L?!08A~D+Kgu
-jbLj*Tt0Bd_QY0r0HY3Jl~WCzMl4j|uEWE!?DqV4Y>b13T>&Gbv1DItBMa>Yg{%XKNgjr{_W=q6Yy4+
-v@=-N|epC7gT&$8?MNhy9hmV#)VX}uW2+4ln@a-A}-<cJQ3I+!Q2VL_tTsLAR;jJ_JA4&N>R^mK>Y?f
-_LVZwNxw@^#}J1s*KdY9(J>{`5|yErN%H}86Oe~YtS8`n3o626h^NEqVx}p#d({OANw#a{%<r~d(>_l
-}Nopr2QDYXA;D#fvL+u*8W*F=UkdQW!%mxwuf?b0vEsT}D$EP~V5h>!V(nB4gdcK6QJfE<HdJ~h1_c>
-@2#XA%)%^k?5<zcUMDe3xI=+cSsPc#MIiT$rl1pZBev<eb#C&hof5CJS)$B^tgXikm;hfh(;fonzBCj
-sS9O;RLzb8ar;v`)O~NA(jnZh}Ei%6)PQ`L1cBG7}tF(OjoI{9EnH+6;_4)RJ3V4(z!}V2O3j1~VR$G
-bd9APpdNrQKa_}huK`Y&!}Z(E7nA&+f0F;id!hqml;vIA<W20mOFve+6ysWv_Q|jO(Lw+&(ASlF>Q_v
-W`UiyiG3hfgjMg*j9rLg1jd%PTS)8u$yxY{OP%FH@V)#BC-WS;I>}`T=}RtCD^MsjuYBHVs<ns;b06S
-<xR^jZXl!3z<QJh!MLk4N(LZv|)4%nH85>RgS?L}7wP(!ueS@{L+@J=fRRg+VPoL9+;ndAf;Z!>O56z
-gsPj<CCBYMqNx<gn)?X%1I%sHHRYZ|br4bbcoVw#YLe&3!qjVm_jUM4M&t+s_@5R+s38Lz?l%t}m9aE
-%1zNEY9#V3F@<s*os<$er^Ik@$qp_tUGa43W%z1we7?RF!?8`^VC^0Iq~JMRAJF4ZM4skcpQtpS>cBK
-y_#BhBMbjiu#~%sNC)f<lF$q?9247>Wx|WeR7uX{%cy9?*0Ui{G9jFa%HyD@|->BJN*uOluKZ$W*l_Q
-7M;m6AcV_2K5d*6#wfqhufPrU{d@I9ypOn{O>br-4}mQOWI<|sM9H62NjC8uWl$YW83Hg--(15!T<`8
-B7mD{<YX+S)rA?v63A+fH-KQxEP5B<|yk|@p%1EVm%pbkhgl|t7xV~G?YVqI#Iae1x>Gquar-53z=As
-q`_;~1y{N5>M>As0acXgEUHgI})uhl(R(M|;L@?Jw0AU!MNqV`^~Y-#&G?8p&e%?gPP@O>f75vS5+ER
-}jN?;Es8wKZ;G20yLb2PTr#o7a35FZa;S#Qc0`__P)=F-KU+k=CnQ%MEKm9urU7%RytyYOck6o7H|Xw
-X_2y^~`&%froHllIwC6Ufxi(l`iT|!-aU;d9#H`VdL(R+U50%ChQGCb7I1I8P%(|0`>()@TrPw-8Nrq
-yutZ>^nJm7GjIGoN*6R~N=GK~2EDfr?R^H%5!6e*pLpRvXk7mv&Rp(P<<C9nk3Ig68HAu>-;HO)e=&7
-i9~-cuzW>X~o9@v*ZaW<w>VLiRe@XRr&!^8T`hR|Q%Rer_-!AmEb-jtl_kJNQADVotf9-+)f6Ji0x6}
-Xk0sYACh=bRm1PtN?h`<<%VA$`NT=KC&JWBnLqrg7N4u(X0R9wjT@Gaaq8WJBgji7eI_xqMU=vY`k91
-zKa6Ylg0&yPeC^{Lax(vOO9b`%rtJnCr7`!vvFJCpk}5#?hf#X$+-PoH4+saV{{wx4m|j%CLpd-~}zj
-6Vb}1wRcA=#k0VxhaVpegt{^X-uR(c2d}<ogX`da**_|n4D-Ii|pJVj!f~rJavMYyrKU{+kf(1W%3_2
-h?cFH<gxRo29cv9Cb>`5!Q^&OIDHdy(Ls0eq=4^`oyGAUYrPp3h<5_EMpU2J%udFpIf2(#d~e62A6=H
-BR_3cdze8;%t~&{9O4BBUu0~hoMmJwaFlv%}oZ0I>EbaSJ#y$e%(|51$CmW)m?|*G-S3L^?qR()CYL5
-DN5C7!!_@xSRJNoYRPc>u%eo-ovH{jEhzkT2M(--u2z8~PfeL;Wc`vLyj7xZ_&AK<@zL4W7_`A4Qw=*
-vAfi)Tp>ul58CXU}d3Fz9tIo)k$@_9e!>o4MUF`&@AA-BygqoIRPbuTCS`;47=l46excS;ahUli<!sR
-tey+YB|YoLF(*la|aVs7b7m2pk%E37#rw{6JPJfQ1@vZ#CQ4|FJc0j*oD3HNz>T^U{Y6lc#5)*;~U-*
-s?hg{rPUSHT90kQjrKj`K1j2iXa<YwJ6kTTJe*uPse6GD{{WuQspMOEN!R=JcG{T`u5vRtEO<qF&nwz
-)7fU=bV@(j+)g&IHqTU2m*j&k|vPeZZpn=dwzmXjoqB;2PO(xboIDK_j&!F!Lu6g1`RR#_zLWsn)IFA
-~|E1RMl+gguasRR@(y2mPXYEToWX#TlsGHgVel!6A3Kds}5JJ-H-@`y%0%`yDY9-h*I$;sYC!yo4f$o
-RCtBN0K~B`-fYmxGWxchAp6_Qh9R-?!Ppmy@^+6H2-{q4LPW6sUO(JkjkcO#`MHZylq-QZ9P6<74J{%
-Uja{56sIAp`zv{JU7~W_LJF5!ukAaT>5!?3gY!9hL|Ohz@|=$w^QmlW2*a|YLjciy*CW93*6{W7iIN}
-pmRgVxe4&~ZEsyAwAFJu6D#7L)U5*sp--nBlLH~RdWl)5-juLs&Ok0q6<wb_1ecc(FG|iil>>Esf*tX
-4WA5(Slh;&k0J!9gL?w22j2o7@ZxdUUWd+?oH<e<E8%!t)sI2bJ*>OO552uYMY@Em3ziTR`&PFmeo!J
-Tdk0~%7-Q`7S&ZIt^*8HcYQo<fz51^A|0@`?xBA?(4QXi6DnhhLmWZQ^6hvt`j&A^NuiYt9-_zERlJf
-yMibP-t#kQ_RjMV)+JLue`nCk&E1RA%b?evik8g=d&92>YKx(b<q+)$@$g^V!9;>U_HfmuCowOHk5$b
-lD@|Rzt@<WC2l-I=9B$ola1fg`s7Dt?lzL?--909VfVB5iVp>N<42+3J`?OS|mt#mL`sLmz;eAzCOy!
--KS1yiY6}H^E*qkSZOAG=u)4}5V`V9bpxONtk4K>5)&y`Xj-swb?|t|UGhf^*Yn9mN#>pCEbT2D*POE
-fZb3M`(_wsfDW$w3D_21N1$ZfLyx1k?Fcb&&5}3C4%j_kjLD(7Gv1!&mH520I+l_fU+4*c2h4}P~D2W
-%A&t)7CYQOX8o0>p6)A1#0!Q}>Kg><7VP|h5Vi5UD$;(o32-o*oNPl_oYmSP|;GuRxp1>SocVd4m-K8
-STVso>ps*wUK|mrJTusc%x;IJI@Wsw#G5w^#5nC@@kw+=?ol4;uijkSsh(xP<gLn_3s_Q9fJjq||2+2
-_O>RZdFt@^D8xH5H^&>!N@m%x-LCbwD8n(z#BC|vcB>79RV-%nTe4kJ|Q?!Ih*a0ivH@P%E}~4hEttK
-0%C)`PVV7(|BG2{L1uuio=-BCBH*pV4RgO`2`9PY*CBzHZ0hz&5S2l~j8cXE2f|PPMUW8we@tNUf5Vm
-jhQK2Hmja8&l5BFU+2-iczk;VnZwd$=a*0rUh$-#dksv-TEXBX^`1hoiIyftweb!CMqipo>^vI8OQzA
-byi93-+;G<(_r<!STJjuw9#mApIgFuIV_0B{I@}p`&9(}Zjo)mG2JMAxz<>l-sD#bo-rsPLdG0lz!AQ
-U^6YLoP1K=RSP2GLLQ^`mhC@9Y--|F6KJ{Hws?;cNx|e@0+Y{zn3f&wzR)!KvDsJct9suCb<QNx1St+
-RXs^X>WI^+oZ?yrC$(|OV!9`x;YNdifk;^vrHo*VbVbiq~HXyg*1_>_44Q8PA^r>0>Z<=qk)#!*1VOu
-qt9-0rW$J2!SZpX&%$fY9;pFhEr{4FR$K06;4M|V6;3PRo>Bu)b#a0rUE4+$PDtEIPXk(BTc3~K_zVO
-CA1CxBvagjQb_kkJ#qHWAz0HxFgUj*j3Ea9%Y2Z$-39nbxK+o2jIO|fHg0;1@R|t1Qx-)fcJ!?*wAno
-qD*EhS0o`02S4oM<lks-1y^mnRYuXFXh!X62&gYwd)_sQmWHhAj-Sb@;4KZ!=E=VCbVk13G;cL^+>0p
-F%!TDtE<KpAd&@D8&Js%kU)pK5G>2rO#mwGPd($gb5J(8p*xxp01}FAp>n{EdW(?(`fQt3e06Cj}STr
-sq}f3;RkncHf`Ms*S-Dy;J$xpjlvkt(ANVxBJH6@fOuN4)QW;g;B017j)<pPea01FJAhC3F~{^*V&5Q
-9(6GaFDddCK;|Dug86w~eHu%KAfKuv3l<@-Td8Q+hi2)>=F-F@2vT0777C^o(nEJpetDjl;6Mol&q9;
-?+IsZ~VO-JD=ifGY%4M%k#<p03>Xr#N+Ga}a?sP-1E%6kz@y+s6m@##L>K>9urggcvlc9{Qas$H=Z@E
-Id$xqlexaalUF>|KruNY*S`FY#c({|lSoTCp`YXFR$UwK@Zm%nY^c(grCkFS`OXCF+0LFm&0v2XviL*
-l>h`n^Tscf0-6E`g&6Nf0PSkPw1EI12u@Vkyp#Zp=g5;j?NLr-uhMmK{rRJL2tdw_{V19MwzvbL{sOO
-GmoplPp0#$r3O<`W24m&5v^8VXHtKD|0A*T;bRO{}?Bx|AzlmRTw!|2b27>mWCe3$Dfwb1UbfrAqT`!
-pI!+P|LWYm!yWmNsz5$vOvf_bM@jg=YVuG$F3<zU;~m@4zXZMP0KN9~N4o@PsA0Vp<MtoxRG&<a!ST7
-qEZ^HDJTo{-pubM!qSt&`@j5!w`SsT}iA<!nAB7VEeo^*8eQ%RMjx{-*b5U($eymRVL#B{hR_R8k-?f
-zlR{#@4E5Dj5w$azZBJFkn-7oDC$4Gzm*51MGx6*=tf*xMw%t7*g5bEt^^e?Rk^!>*vUY65y>QE=9Ph
-yi}FJ&mmJs2~Z;*s|WtH>xsT^j8yt5lK-@377({Qep+bkG2g!%bH^(U1}lxazYI;|S9}Yb#!nj2;J%B
-GdRm-*3wmNf!9@zG1ISQlHNo{Y>G@39uuf+QIR}mD-bnA0<M|9_OK6{Mv5iC_-xlHLU->`B5n;WSX?~
-RArJdnr8{o!^Q+qg&4h<N95;4VrX}?5Ezuyw!Zk`<2@8rbM~8-zD9Gv3R51*_yaP}dY5k^DRC310%;H
-L(|ahj4*B3-h>*FI19f&hvF3a$FV==6!hOZOOj%JmkruV!)s9rXwkiu!Fl!)xEZ^aya2VnjMCf{Rk61
-3D5?%?bJ+;d)EQIK9iTt%99{9_W_)Fe013&g<TN0BP-~l_oxG_rfvC^3Gi#U@^o7Rq7$9=DUS_f!xQB
-95C@BQE4miSXV4g4Z&aL+a;Y57{bG-9T5sMv@cf4eNIr<TPWyc}lhn$ry<#v61cBJu{jqGF4o?M1vGx
-}Q!}gY%c_xxHka!RQ1+skIB0owx0yy3ds#FYh9SdD7VS0QQVE2Eg^gkXcD37h9-|nKa>v;Y-R|3`6Ba
-o^&PeuOt@1C4Vc_U>a97s3U!8H#|vjtWSY^ED5YmP}nqhP}>WfW+Thsx&&cb=LPkqB7k5rrf}%lkwRE
-MowfC}(0i(|*o`m;wD$^6Ls3D^SA|!664N&=j)<{q#N6WKdp=(zw&N-MWW~L%CTog_$elUQg>G1i`T{
-OP8XC_ug3XB<os2OD77rQZeJ&eoG*~Ie^XzX!kvTuSIIG9+<sHz!#6#l#`}VJH!N0)LKRE0gME&-VpF
-8>p5Iw3#a2UsN3dTSJ!C?Xd5dsHs3`21k1qqUXK@i!eir=n8?DKi@F-t^>qkseXNFf|fL+D4+?;|#}$
-2v%M#6WTKTm0H1q8&Q&_|Q9`@T1M{i1$8=0Q<&-JW5_k=-7C~T3-}+KQ4^;pVgEcaTtEAgJhp(Ljpgf
-1or@NzrcPa3jRptV@Fxaq0XBe_C$xmA$2S??EfFm!q`zOgM6^>&?!QXC5(Mc2Ppp~ehJ}GGXd7$@XO7
-Gs!*TcD7vqkzNC=OXpbpM+$j3bm5HOFV6nNM5y5Q0A7lg`4lf8$0!3ByF%Mo3!CNr$%?}KH>(+Aw?}w
-fKsBJAZn~}8bd-d%ON%FdfEQroo2fl&8uNyVK{6)4%(SML!xbQ1uWj^JH{ujSv;19!Nbe}@M=`wgf?)
-2R|N#^*{+O&UEaa+Dx+Pux(JK<T7QQpGrNEd`f8a{4#gPA;F$+LZm1)E7TUR8!`>Q!Ql?8IWtX|m94B
-!o#>+`*gC^H|~Qx$K`J!GYY}lNs>l=fI#3i%Yh5L$^n|l;Zsp6Hi(Z2i#22bG7+Wj8G+Ra!Igk<c6Qp
-NW;?WKK(v*VgI=RI2jc4f~SiNODI~Rm0#e-m=7p(O&O~WH_U*>=mMTu!`Y~SSHQ09ZtsM>>{Foqr~uS
-huxD$;MX+Oe**Y%)6d3JP*^iT&J!Jh+-0XF=5Fevq1{D*dOmMfwZfhLU=V#CZZZ+9cBx7l*Dd7O`*b&
-YB1hz}5-;qM&L6@tY$1GCfxh-+Js|1u^3g3J=G__t&4<Jq!^p4w2I|(&>?`S%T=Qn9t`t_kbUu1RLza
-G2YnlO5H;M_cO8L|xL;So<Ix;@(zK*j)T*d4TaZ$%<8N~C9DIB-}91pKO^$3wtp_HB@Ud3wrSIK5-ul
-yb+h*sED9XA!u}NkB!<&1cY;CO5JO+4U5aH-fGZN%699=Nxsk7LVp>-Dk3THjU3-YAUqL^&Qv~P!&nE
-CZY=FuBkOpQNL;2;G052y@<<RDjRs*9&i&eB2c7$<{b$UA8$f#gHBEH%N1}MusK0Q!>HI>#KTT?+xQ*
-~K|nX<gq+;jJ+GX#<~1)Td{T5xHs^_9JrQ&f@AP#7Hum=F-C}c>zpsGsV^b3Fs{+CUD|`~dYyK(@Rz#
-8lY?4GNES>hB%7kBSy7yU#x#2z%kVZF10a8fs>1+g~X0JSxLEPmzi$efeu4nb-t<PiAU+c)ZUMKT;Wd
-Y5J<t^`sm9~9b9+?#dnGG5@rr-ajotZf&gqemr$oY~MB1E8exz<+8Q--Ud@-i4mIn6oGg3;GHA{vkQc
-CD!>?F{4WC<3(&E3wfGi%wQe_0gy$w=*#slW}QP3TA6p2cE&mN|(;OLZrILJZ|_-^}^H186bVt%YLop
-5Y+rJEibHrKk&yM^|qUov7*6cmW=@+TTVWFD}`r!FKgYR^2vcYG09JNq;p?G%_PRj1JSx^mfHzg@wEf
-9^|6XP)Oq6n$=rKwJBlt_gZDhex!34lcvE*+VFU;(;12H*0wm1S|Ddd_U6qwt_U!InV~u5y_y7q-%!r
-sVV}1h>>|yYRj8eL!)XloCEz`J~umm?7>z_KKZvGZ$Y@G^}KKN>ZRHj^|MKH+7nluj>Ad4F~oM?H0`D
-b*?@-D=QqJBK0m3U2Jr`6nz8<7a7GG^?Ii*f34gX))c1G8{m&NZM}j7>K7j)N~;pI=Ma-q*LK$?J5(X
-&`n{QOY`r*u^&zD3pzj7k7wcbMGXQ?@z4)f?T2BhJ)*18WS|#+PAypM5l*@kUm4uSHd6L$KAGlXBa&B
-oQ^ov(S({IcPI((MGrh76eq-Gk1%4QaPU-!T2OG#T;ugVL^dOSUomoRDsM1Gk_9Qk?Hg2SB14s>))yw
-AE69sd&DJE1w-%RbQVBJv8*+;X>ZaA*LY0-xoL{mOZ@%tv{~T4p{|r_Ac()&-D)<{zg-{@b;UIAgKA^
-B2RS_tPe^LO{4zu>{JKO?coP<#V#(p585Ps(NkRM7$^d*O#9EpJ)L+vp>1b@ahhQ}WVu=;*h0HluQC;
-ZbqL`KJV5+9jr3_D_S0z1SDK=@~|<rF&7(HZtrO#X!6KSEX6M}j#z@YpeRGCT+!2StQ9^b)|&wC(6K+
-vpfbNgSE({n-1u`+;|mm?Q^%7fcUg3Hs@n+A&vz9=Hr5_iOyysLB*#P!?WH8H^A);;6DsQNKoWV&(r|
-psMoss7mJ?Ox@()qN=YO|I4UK`rD|g7|Q!fn^o+h`PqEEvEg(bBt$IRNhpF+$bjdQ?3~nnU6#nXdXO;
-+8uIpX+}GuL4-d(rf8Q?;d^#_rn^AXHEUs6quy{rlGi^}sK!*<1n!NlSO!?{(Kg{>qtr=%cnyay%ET1
-w(MDZ@nLV*ei375lWa%yWlU9s1RT3aB-E`}faoWOD`hNe}iz|%w8&V4>MPU&?*F1jm`L%Fe5`k5=xYz
-e&>r{g<<TH$yCbmECZD9xO3Z@3dT!E5QK8nSQgl;?VXdZ^{Rzl(JOVz}-_i`wdhaA^yI5cC!|4G4HpX
-Dyd^*LfRb>UKF>Lxn^BvRGrB4H?F?gU)%G!n?0i<AOI`31RgK-OtNyis%Ha04Y4W#&@uJdDw(`tN8Lo
-BbTggqN^sB@=JLa40O9H0-b7Q<5)}EK`$wITp=wTHRTCN@x{j~t_mPeY+-!7goWGJ&IM#u96n9Wjvh@
-uqY0brCyKNAIJM8TFu<OIR=(tJ0GS%bXx(2>pb$LCt0>on({9D5aNL7vsnAgs!ZtBWOX2n6Bq=k&wKi
-R4M?W_dNekeuIpzh~@#I|PhVka`Wxra*2;fi|hLhAejX%(j$0)Ei_68;Py++dVIOkDSP|k`p01=d1bK
-fECxrQk1BrSIusz-(l&829}$iOM|I&3J<^KNq&XmkLp^&a_mvYNG;zFvTsMVY~#UFd%cRS{|OPMYW0*
-BALthD}0DtI%Ddg#-TpRmozOa}>vV*fPJfVMNOt>R#422SF#RNY?8bw8)e^U;Ars3<!R`+8qUTs)yqM
-9S-6it`N0mNZwV>!=9Vh{k`zt?Ul%;mom*4+n#$4t?y-1s1|*G6c_P%6O}eOnJh3o%F2KWEPE14@2c9
-<hUT|L2YzUd`fcIVm&lmsGfLceQ>v7Er(WSZ+}_ibRt@kH0{3$eT>L6^{Ty+O3H9hl`T(!gg256;a%)
-OUwJYoI(odz;dD3D!7*T~4*D5451MPt34Ye9K6+4t$gk}+$#*}HX_xXWV2-Ks-DBqI%(-xWQ?*Fm3=$
-&P8y<LmTB@-Vq51ic7<Tp;;Hi}QUV)yWHPk;GuaS=lYrN<(`2hHRnsiB^Wi+j#lTIsx=A5gWwE20a;W
-4L6OhM3O|Y{p9wHJI9{ZaTbj-Fv*w6p7?SxI^Xb_Hvo(#1X_hdzgc9(&kp15+I2r?QW!kV5u1N7PF`2
--=Mk@N8B$dTSe~uep<*2zcB9mO!-bAX)>7ios^6>?XKm3!d|N}xO1C-ZxM^UVQ^wa!}u<|4YImhx7Y;
-zw)h>qoylp|WV(4vavGH`S3#+ts(|R~>k%|DRV7|;6*`KFCZ{gqybVs|%hnN2lEg7D@*#824fYCs2i&
-X3*fUwSj}Qg!)&QFu7?dpXDAG$xNRAW^!l<crLh$*ZBh?g)mY&{Q4(U$nKSx!_KSNbN-tC8|3i$?A?S
-KiSKmvy#0^H%$k($C0YR6X?3}FNU6EF%x2mz85j8GW)U4p>@dy=Ev5++Bn9{*CAfDSlBekMnN$WIh;h
-<AS2tKaW`A`jH{h19yktC0NEZa(zcl=uk&KT|M1X{_|qJ054Bwxx7G@{dpzd5md1W;~{cLg)U}{pbfE
-!j8Z9lgY><n?}F~C-+E_Wyj&6>?5fCk@EyUbEyuUPU<N8B;=7Z!>OYM3jNc8Q@=x1*Y`c5%d&%!;S7a
-(PYfXUP)RE+es2i>UqDss?@-k-Bmn*vRsFK@zl^HXzm2N4bw-T<C7yzuc53-h+$uPS{3ebtiA#%R0_U
-YU_wjQi1`Y1Kp)Z%$5N=|0$|u`a&O&eY*iGuyGrnbVg6Xg?tt@D#>-16wMSB6lLnZpwysD3m5DFj7UK
-58-8fcAj$#$xOIPK<A%FI6QNo;TFgM8EKTV-^M;VzqJ0uG@s#CW$uUpfhc^Dv)cia%<ZaCDS$LZx`SN
-5@DM&3wUMJL;K8kF}sNHh$RJc#44`gy=-92f8A`^ZAj79%2)%2)%||r)o4Jp~31qPHzd#BSO;l`na4J
-5PA<J!JDRT0)j|is^yfOq@*7W;yt5vfS(?*pDlPK4Kb9f*RBk4enK3VYX|wMZg_WR;1ba|aF32@N_-1
-J9EBJs&^>Dhxm1kK4q>of$*+xD5%=;+a(5NZ!fdp<i8gs0%m}P0F>2msAYEU}egpI~$dp%mlEP%JZhS
-SQbAvtaNciMfe?ys-M$7gNhOfA5NS0QMAjA>WTpM7to~4>#EpyB0L@yTP&|QqzyId&OB5=LSa~cw3;%
-_GZxQSCSos?Suo*RN&R9|9xz}@ncc3+yCRw6=jYO<=J<+&u)=O(@)DdF%hfp*yJ#GNF4gs|l@N+ago5
-<*rlpaIaRr;*u76$XzPD_n{$%(>=IE_L>&!Qe4ww(-Pgs5jUcM0%DNagK46Il)9^Am;4^tce~&gyKE_
-hFa$zqN=6HjJHxf>H4-_<}mQAmmyudBW3XisERWS*bO26k+^mOSDGzcUbrE~!;<;;>!Z)ctF{BzX}IA
-^0G;Xgy<Wr8o{)Y4luLVyPl8ozgZr+AW<r9e`=AR1LR#E@rkG8@kG2z){5fCvES5xua-Qnx?rqF#>?A
-;Nm}2d&_gLAi=}gC%<oBdXyu-`Qm@HNi?w2rog#M&<Z1R4quZq5JidHP0VPp6A8+a_<lRl$%3EMSDiW
-V-}gq84y?KLfq4-_SVi`dc5kZftNXuCymi}y7PYA;zXzK{d2Gvn`8GG@=|O=_HO=0_&7UjdgGNegS;m
-EvAp+_!Jpy!B6HI_p?92=O_vyxaH)ZvaSF=a=X^(L^-zX&ut5Yri7@jI$gDKFiboh*F>{PoBHwaVaCI
-z!`b}*fFxO%(R~Yh{D+~H|$U>pE6WW5Of|oPSMrgo@sk7m7e0}lHgjd7IpDWdO5@Hcf=}pEmz#41|U_
-z<VX4{=0?Q{R%5f2yf}k7wOG#G-(-ls1o>hirGXE!lSDU_I$04S;>K`+-^mH!idX`{(gVedMbad8t9F
-|tB0gCvuNT~bDq*#j;F;W!q1IQJUE!{<J?-pvQb&mzaBCjDcCD#G#g`y4gE|oIi6t@#Mquen$h$<J7^
-VU<eM)PTvaM3;Pdiw;)$nByrZceax9k1R`S;7+tsL8=5b7lFkYjjo5Cg98tzQ;bu6gSW`KO=)|N3~6G
-B1x-p#P!wZ9|&;kHmd}J(n-K<v%|vb@9Quoag!fB>T2_-}ZmvNBixtl7G9{FQZF-ywGo$n;1f32ueaY
-NTT2lxhRChQ3ON~9NxhfN`V*(QQt#f2VnY)>OAlaa-@Pt_$b01EkMLEPAvVjfbT$v%zmPh@1n0Atf3!
-mo*nq?$moz54Udcx3Lf%0Xm&ud6#U>W@DK^5kVDxVOMXJKAE2)t5Q3lipb`G*Qb!IY9x^^?H~XH)0jQ
-&~eSgA!ZdrI#9kEYWI)olo!w5b~gDCa+#*Rj&FgifyF$;XZ5bRHxF3lly*Wtg6`(!aS)+ZkePJ4(!oV
-fuTK<j&w8ywSoJMPnUHr`bk^$WM8P*wBNbfI%lAC26)W7V&4&~?W_2=JMRbUf+)dD6>=sY$gC8LqE5X
-yU_r(tk#PvJ4X=8Wgu~E%6QiOZ&RH{Y>Sw)mi^gIgd7V`sdd5d_IJBe%V$r&9_{ezkS-jK5O8goc7nV
-J}5T8U*p(t0k-CEry}9FZl!v&x6|d3s;)%?9S%80<cbIuJ|N{pU!z*t5RWQDmy&NoCFS$*mK~4X^z+4
-m7^bJ`x3Osa4Hc&}j)AC@UG;wV-ihjg1y+*O`xyzWdP5Dh8BfSM-}1GE3xS`bGC?N#%2=6lGNUVx@|4
-&Ed|uJ?m5!A?YEBRuZgE0S{VdKqu4O%QcJJ-`0higEg5fl}t(`~rZe|T<%q>W=p@C>Y%y+Nvp;i8TVe
-mO_`g?4TXXth_**E$i@Y@Rx+BZ$<H~*Tg_49H_CduN)X*2G>0Kd|An<^uwFm$=`AbZewrBQxnu1oxov
-f_eMW;G(?^){gA7Mb;K-Tjc+HTLDxoedluo4?1<y!?it2{4SU&)^elU2lD9Q~t)A(|ZRI%@%ghA22l6
-r|VYwO#+NN*2{PT@hM3bRqzIT<dSlE5(Z&exAjZEtWjpzP8r_!TRc@(OH`lmrj^SYLIWiMU?sP+KhWe
-#;sm)z_wwZe?omEXO<Mv}itgSfq>RMLgWn2x-2;qkWtAhlK+F}rbS2QVvu<8|!<0@FlfKb3T-(bjM>H
-9-*Zbx9Xq30r(f4AM@b${uF&FvUi2&KkcJJUu0Sva5uc>C@X4~voOt^uMx!A1UPXrWhFPTtehO0Mq6_
-Wj?N4e(+s@0<n+WR)&IQ9+b8uflF`bn|q?upoEew9(APb}BOxydzh`h>q`p1LDdrq0Oe$*?H_A}Q)mq
-nF9^1CR=Bi&V0u{6~-doe|hSc0b7frc?Zji~YG%M1JcOQS4A9r$`6{Nen{>1fpOPAyEq3aVLhtI6-}P
-1~&2Gd+uHkfj$+VFUg4HDDEKXF=smcg#BUiY0mvVeI~<>hJx@j4D6UgLLPm+@yE~Z8$s|8N7<cP5`Pi
-`<l%64Cxw8AILZ&4;+G1}r)Y%6hcNc;1;H=7;YR@pihgEv?yfaDYBxtFWncZMN#P$A80@H6MbM{z13I
-n|{b+h4N7~}goFZ!;PBDi6;}mfrJQYaxxVo~boHbctMuMXiCeQcJ^#1AHZ9cty@hrf<afpX!0sf6cJU
-k0<WC;GLLp;tJ_%{ymIBVdaIYf0%K4O3I6ZrC~N(_@bLv9$flxrnT8v#bFqj~YBZMW_B+e;hWv^QB$5
-VGr=J(ETvpCG@HGa%^D3`^$7^y=%T1~%KnnrB@1SgcFwW`G;(p;vaHly!G`t3IdGN#-W~iM<nL1`!5e
-TJ-Ji`3AJdjwFku+FKqKyZy^f0{EVn*qy``yuv*i<bo3lnuaS}8snO14R!I&4F%A%*6lE>rYpMXB|)I
-u(XtR1w8^|e5pGSqYnn;jykWxX2UyC>a^Mavw=7(z>x~b{RX{<h0Txxws^SbgXL`o&a;5iOIXzXP-E3
-T(9!A{>X>IBq5}L1ioLA`W6u}t30lW{YuyuvHcbMt#^p*W$w|*_5`LDu@f3nc;tmtnS`LzW_VG1G8-B
-N-eic`dHK|fIjL17>QgD{Nk4}CYMo1%v$BEzF_jiCpr9fOZqM=1WOQYS~=^vKzMDD)`$T?3kY;)X+7i
-uwo`;0ODjz&|_T$B1JBInY0dA9TVv{tQvhj%Xo7e_%j&)48v>|2&xY;9=ZT><COC<Opu|{S)M)y@ecy
-Owz-`W?$qLJ{jNm6JDU7bT3RCB>vr`V&P}9ar6_G{b^KDeWHr+7XwOf!-73y^BJ;)a<LZC=y2@2jbu#
-m--;^eS^UKsCBL>t-ztNOM^5)k!gr(54`aWgcVqd5eE-FuI=^gFFW)MIy7q6TJ@WJN>!Zn0tNtoIJ=(
-nZ(W$PF=X}(oS*!vg7+fTdPJc;HgJvJV4R;K!llWweV7Z9cuZiJ!JtWAb-wOf#EE`~aWCNIwY`_jVUt
-6YW+Cqe6yM{75S)F$_heyHYrAC>Jvt};|fY17ite$dhFF5ubFPHXx8(8Gw<#lad`?Bqb`vWgds9-`8e
-IK1`8v9E>s@fKcOS=HjLZs&;%U8_eG@KYkP}31_9Kiv6_13w5M&+bWR?uJl1`noz-lHJ@M%^T*_9-|u
-fG5mfI_bQ=UM+|R(i#%p=AMe=Lc*#TzFbCjWpZ<-=B3F|0wL&mk}bj-T_f!)?7jgLs}uGG63AQFkG(T
-bH%N8;xwD$s$s{G&Jlz79V7I!f>S&jnn71bZ7h5SFsQly@z+2KAb~HQX7Hk4zP-Yi##bU{lZEC|z37i
-thkLXEs>JG_KwJ*L&TLOPIZ&`ekwzNyxk(km2u$T72@-u!KYKt&@uiEPG<}E)XG%rl2$mW}?iwfVw1a
-D&>*u5cjQ}0)+JNNHt90ck#dx(Z8m1OI_&>0V-B5SwP(p7q&%iDP2RZX#862I<F`;7uxD!_1ZYK`G7n
-sj-|wg8lcA&h9yx!ZS&th;0?&hj`zqEf-Zm6+le;W?6i2|P%<075c7+B3JQnsZW9MJr^YDyJcADiq>z
-HzRM&?1+qLn1Xk42)e@2%OX3ru#%CyJ1~G8E_xdZZ=MjCIKw4nEN(o@xX@X3%+$-xoBb>>XRT-A<bV-
-=m63C~DwsvpvKiVb&|mkMNdu$IRkEsSxKg^*T^YF%jwD>{BUuXWui3jvcF;^ztF{Qx{f=LQpv5=M&Kf
-`+{)Q&e_r1-(i6Z{VLVxW0eiJ=>ik2w4`#lf=cRvVI5P|P;1ab@^BvAxMA@sY!!y%889LX;1qu7{5pK
-&<p(Wtd!aWFZ26@?$!HEa(EzTYrSe0q|17erErli7og-S^?ihZBY$(v7>PLOwHh66zRec<5gz2QQvVf
-8hIeXBU3@*LJs?eY&L&B0YH!!uFqsz)*UeGXj4`BqB%g^k9sIN6m9TVem5>=!kZxpZ4eo{&WJQ*+DYf
-S5E$vCC1*4-m&=pi|=Dx_x`@gY0o*(j2ky7oP@agUGPx+w}OYi?)Q#5C-86l-r@Fuf8+NKw+H+UzqhH
-Pe`s)vhdtaX@Q@7_00rfFnw2;|r+FmIf*1Nk+4FeKR?#A__$fZCn`b^rO&`*wf03Z<!KAtwEYTNtNVo
-u5k51hQ*Zq0+2s)Xm_{3jpc8AsZ*|>wmkm$7_)Nm?;oN+=89$r@DiAy~$43l%yfq<H;^Q^{?lXUvKHL
-SxI0KawyBQ;6=tu2<Md}+0)@^`KG%a*iAe`a%E`uW=V<9!KfdJYU}0cZs#$#y>T^<ZA@j$`xIi_ey%J
-yuC3-fbyCMiC~}DL_}G4Q=i$s-w}~ko!8E+UX2DXld5(K{U6P_L4DU_ZY4fUZ;iHOv@uZI;y1NLFvcb
-p{M-p%h5CGD}uVZ5@PN|0^=Hcf8S{S+|v59okIVG)%-^*{myKDv&wJmCW=8A2x1sX5d=bj1VK>9Za0t
-VWFUm&5DFvTPr8twKA-rQbb4s`XGgj|LXRZ>(RK7i*a7*FHn1P5rzOc@Z;!F&$&vftP1C;X9w!_bmya
-OCk?A0R=E&~<9^JcNN)11X8L&_JfcVgKv(JdKFgt7|9v_yN_?XKhkCGh(lrTDUaF5sqJPa$De&Utz;D
-qdl-@}xjnIWIJh@yTX$v@?R)CUg)DgR?PgE4Y3T$k)?sT(QPBMIbj-^L8{5i^wkt(bxTA}{o@oyD)M*
-)NT~ze>6oe<$fu{<o4YfBlq?GyXe7k~7vbTew4cOn{UdN0;iQ-UwCccGSH?Vq^u%sR-s5-}f8jKanup
-LX5behPH6K(OX`%&P0PdhF)aC!`OA}T8I`VobQaiSR5o}z|x~`@8PEoZ#<!C-1td7YJ_9Qp@-Ugzp1@
-#^8Ee+OedC{Qy%LKBJ#xYYRnN)axSo1bmFh|w7r(p9!vYg3Prow0}}@+A&lW$f6E&Qj~dTpqt~}Ymr0
-gVv@Vopu2AX#$G#97k7wA8UTZfcD2~WBL^N6&FDv!5y=m1elnbZ+;u|u9%}6CqgUC<!hp*GB0aQulXt
-?oWJXoT9>BP&z{DkhTVP8FXHaDfkP1>6aTeHZa7`eoS&|s=@)v-bqWX}MrC7~7CEcR^kfP!n8SPOe=A
->PeBYBgi?LDdu~^raa3Nd*O-Bf|ySdZE`#q|TNAUrcS=*$PsRDK=x(@QNG)Q!KqlDTL-~)4I!3-}4u1
-I?b{Lf~_#&+bviU>dMfZ3S{Q$&gdDDB4y>Hl*rCkw-V{mxU<jkuKK3zgh?x(s0TZrPDR~UH?uUd;vHq
-Jfg3*XQUZid`CCKJg&4_>vL7+h9o=aJF}b4ca1EFw!SF#iX*aSZL6A53=H2iDH>k0v0CC}$Y(kN?=$!
-r2TzI6BJNM~5hObKro>{1Nv(Dnkhe-&tblQCns>po@VVC;dGT;PIN!yPF(p>&2J@?y)jL@<wpX9~6n<
-}zm-R+d(t%AlJNPZiTssAC8T&Du|;6A#d-XinSj9*GxLaN}B-`tTxhK|F|L9et?C#S-08iaF=6-MvoB
-MewB#QP_9>SW&!im~Es2*dBt05vuWRvTl0>`Qbx$a$}ZPQ3i~-V6(Q>7JLemZ>!XPFDI-r8`EoiKbUa
-%TirBpgpVt$gMBPNIR&Mj3>Q{S__7>;0xzRA6eaiS4d>vV;~cr3iOoFHq+4ZY-(V+JNVpwRq`a}o}|r
-;u@V~-T%SZ9XYw7pJiQ2$jVK7UP<)2KSouzxN2`3TW!~jH_Ig1}@5xKBz$)pz+CnKelFaNbc7T^*Q7*
-P;Gwtf|!g8}I4TxF&!tq0#Cs$SNEuJ%SxmlLmtYd>D8Z-E!F^ypb$#fW2FI;uP7AvVA0>o(8fN22e-A
-7Oz2qP-EJ{;_Mc6oc9;r4XJ(fW=`kTx<c)wv#ZnVk6?l|`6Zk<}|j*-%mnpf5-%i8(quiNYmR7j*b~2
-Sr0a*`R(l_IIdz&y7JlA*(23r>E-X;*XfWTyOdSwh}O$b*qiS4Qu%u_;6?pqC<>%xt-Y-uV7tTf~UpT
-+2BBmjnrCs>lk;c`lXKxO@2BMaQ2(zExDy=U#$l_IYiKVbMnS{l?*0yQZ6XTOl9girxGsjQ1rf3&i;|
-OI-z_&Wo!%N3U?O=o#bZ9POSEc7aD?TxSCs+iCGwt4`K0UWM&d=Hxdp`e;Kr~x~g;f|Ckp22U@p3KZ&
-J(K-T@oi+qJ@f4;zPN@XBKfz%GtFoeKJ7^D#7pp8HXj$klK9)&Xm`iyb?9c+W517<~^g3=CqkdH#jA*
-+QSRF7kV!AD{%OMXiC?d10fB-xRPO+Kn7A$b6$WA-b2RKv3DNW)Uur)ix$h`>>Fpu1xXZM?(7AHg>G)
-94NzN8gt|<i9>G?C@vI!k6Ul(YZw&De3*pqtEoGLyU|(LUimiUlt}lvl5U4cB0V{8}D#*kA#swZ#9Px
-*hc;`zQC}R0b8f3icWM!fy5qP>X+_!sowdc83q*JOnfpyX}N54@Fo1qZN5&{;4T~zU%7o3c2rh0hoDJ
-ZeHs1)e0DshKf%HnwA31Ke0V5V{0yQ@1Ee$?G;bgB?60`LUzNLnBgm9$?PfdFZWtKL0r}kc)eOJ=_aW
-@cB%b+*5V=pp`e&F&ACL|M4m|e_&O;C3u&=sde|Cw$pIzghT_W&j*Z60b2z>7v|Hg1!6Tk(_0`vYphO
-;JXh_HcXm&o;?;Tk0&G#y8ajgU636w1v)NW&fAEEW~S_s+64lOE7-NHx-CLA*(`Av3V3P~}u%@hP~qn
-m7c)<=u5xU3f?`o;<0g*0S+zAb5A#aD-r4fMU$kDI)m3q;473oTqH*_K=n0XzpI7({R;pQ-$TRpiCz$
-)m~?<d|<Lv!?iZ}L*WAFbYR|>6)w-JUIjzl!b{&~1!{4O0EI}w*^A)c=Cx_~?tRI)wZ!4@)L#}d&L3A
-k1A+vT*z2>lpWT{+K2qrK$F_f33^>u_@)>zoNWHA3;;}L@Df_#e9>WT59P0#nWa9yF>Kza6=FJ6pvU0
-_VC4zWZm+CT6-pZXw+(q~nr-U|Ds(WdHuV-_=#nk)xrsVsTn1Sc*489bk*Um5ebu+H|yL%X*l$J@!ug
-h(Lqjyo>S+rt{`@k4UM-N?`zHi(FQqLeP0PDJ&Li_}AmaNXqg&_o=peDUUn-?<XM(Ol-x`w+)RWA)0@
-Z8m7K>GE(28+{&uEYW_D$ATp@0!CYf2>83?YGU0E6*!?d732p=;%O5h7)^XQxFPqaD})wJez9K@iQJq
-86Z5O9KKOBlD!S%QJf!}ieH;KHOvd+lc*ox$AM5nW!i*TZ+j6{HSC`F`Q>?D!@hh1@vwN-BwxE|G|pE
->HBxU9Z75Y_INq+O%}Jh}dAjr8G{gS_^?(EGy>RM8R|wv}d9sl3iKt4S(CSs4exxA#pK>tpn|knffZ+
-!h(!&BdAwS`m`GVKgc6f)DHMLXU4KNG#?ZMu4`rT2ZB59Px`Zq?M1|cj*EjaPPwZ9I}^xF697=eL#Sq
-d#w!in*%(0!@^n#8A`86Ma91`aKs@XYw^r3qg$ROny3OB$<F_rz}s@u1qQ^5ePj%@%LFo9)Sz?gDU?a
-&fWQ@rf->tmbq9aV@W=6>}2_dCWyRu0uCL$EqXshm}vkLRJy^s$r>{wk`yOrF^~ZSq^U}zTGw#%0~``
-(p0!*CJvsZw;xv%5y%G83f^@X>iktKuj29K=lf_r1Au)M_Ep|b(5U^ySemE!zDh(K&Sfdg%liznQ%T?
-^!3GyUKxc=Jp$F6UmE<|xZnzX6dWe@IQ~I7oI!bYBo=>@TM8L{x{Lu&_Y<WE40AwJ{qzFS();Aa7O3m
-Ef?!Arc6sYQ&dYv5kl`=OgkSO6H)0?^k%ge_JQ+kE=GB%M&Jqw7)(C{SY=xV;-1dmcs2Ci4Y0)y(D)1
-V=8%uKWe5(YDxTgQ~PK9|L3ATKy-N!)W^GMcf*hF5W4Ym1&7mW1~RF!W-NVAI4JIyzY|+8NDOWLQ;V$
-+8KouV5y>RC)}#8iNT_B&oEyj~#qoU{I;iwE;ktg~bTP?cORO7#mqqQL@`3CrP`;Vo-akFS8y5vPf4*
-*nI)_xOQ7iNY^khvsGjO&D8~_?voCOiOUX~{xUFhto`wiLhB#HI=e{!=kr|CvF!iR(rJDS^*8wN->&r
-)CjO;$e%tYdVmmw}aFie+5F-haz$l0$pnW@zV+6VX`6HZ|rAPnMj_!6~7!e1?Ly%*P0RewtSN4%>#SX
-j{VLy`8BeMg*eW51rKy3$uA^cMU9(WLs4{~ru9Mt3Vqd1#{Klhc9KPro)#KA_6sRO{m+0mpGh6f)Y{f
-H4EpXpZQN9J~a0{OwEIC@lE2=pf^KFTxXXG;VfTkzz7lQD8|1L9~0w10{dk%JOI{)!TiL6dr0tF^g2F
-2quEmBU?sgcHkeTD)9WUHFYQzk(>X#+qbhl)#g>z^fO5I}{*~$6}iW`-7#cHL1mLpAiKAX|z)K#dX4q
-le?}aIE`uTza5F+7Za0r+>Xn&qQ_rwqU^f1>B?W#S^pMR{L&}(Cs^^1E))1G*ZD`63H+7o{G-bR{^&a
-Y3SI<$28=Y{I-Zsj96XmBs4O1mMbl<wwyi)$4vXcpWHi=-YBt&QGB~TZup6oI%mBzuw8tbMv^6&sFbn
-lKB=w>NJv^kc0Iqycfs?n=>+8!r>GB)Y=es1+^6hnfBx>yglPo%ZYeyNbUPwRp!=5g0*X_igSy2$*Fv
-gs8NH@);5IQq2%oX(=cL!hU89PPtb_RqV^xy79*TS$1#$pYqu?PmyX_1`UZ&n;vw;8#vseQxWOyENzl
-!Vjyte<Qcxn3g}a5Y52774dQOf82bZU+mII7G=-2^>0<2roWk>M>*2f!%IePGQ!`*-|40Z<{)5Hb79X
-=eaZWFiwW*!rI7ai=1{Y)F+|V+hnG)+m$Dja^I*5Uh3OrK5w!W3@VHuQJvwyzEYFrcoPhKpK%KBLw9+
-h5vGQW`C{rLh=53cni9R8Ay1naXt{<@r@kUoNtbzR1O5Ytf{|=W73N=8{@io*4K|b%Uu3oMwk@3Ry;p
-?Xb}c&emD^psMERtt;|Yq+6tRCA@ww7hkbZBjo6wC6^NoM$PL}ox%sMAFxdUU{OvyD}IC)~vhD*^;$K
-)xw>s&NV0f(VHSIJLj&#bP5U<5|j-g)U|EWJA2=*EOPoMCVq+5v*qu*^8&r}UbU!QvIGoAQ8|Qx)`T%
-GVTRu0=dO)qm`_W}`>BuHfBj%W=$Xq~^T6iC9l8_YGeBO@Yoq+VlPS7_5<Ua$WRWl1<1#;(~GfAzlQ&
-%OCs^UKBPbqmdgm3zQKw4JY0N!0FG|lX?o6j*Q@1bvq2*4MutwZi01VQ?X&IN!%WchRg6-(2QBKqNSb
-m*JCd1Ls`nbD<%ooE__`jl(e4g8F@eT=IUCHi*$k9l&u4zA!m;tYu?>MHMxIz<zpcB_p(FI2teDVBgp
-QKZ#u$Px|gVoR;93^_e}k;X{K@`r4w11W=Q(N-7@%`+7y-$(9+b;LNx;9%@oe1vf=AV2d75x4UcKy(<
-AAWTZzu_K#&>}V@s8WZM0Bh-wEZCR7Q?SDtV7hpfuK)2bWdTP9)@s*|QT9G-}3*n=S9|g>N^urai<vp
-S;w*`=+x;l*4QGrX6qA{+0q(MkJbdDFrKaM3pMgH6$Wj>tstvunA1q6?<H^7dxC*E<in}6$EgM+8~#@
-bB5#r;E9dmv$$m_n5wOhagCF5rLlzCf@pp1_qK5X5%VE-VocvCE{4*Xf^JXZMy>+XQfJ_4A=%5=KU_f
-?PPP}$a5@*@vsYxas@_yA!|!6`&l__>>FZ<$1vyzp;5{im^N7}D0M}c!yP>$qT}kGld)><dER=gRVVu
-a(Sw{IaoN(8>qF&~ae&-#(aiSKHDBMCO7&5>WSJ)?|Ri?=CRYp!K@ti8;1;tYNx)t5cU@QNumc|Q$1L
-^HrSW^iinlHu)m&7Ey09CbcVF7m+4Wn*mwD|8%sg;WQ2Y8WZ+5a`X_|Mk*Jzo5Sb$*jsgb@%zNEjht5
-TYoQgm#>W;ne;wiXs$6U<3>y=y!=U;lW=&B#NkyP-J!>xhy%*8g%F@9iyq>4?6|k;TH7$g7Al%8HXQA
-Jp7r06@Iw=AKDB~9ChFwZ)V^@<UCf550X5w9|!yaVnnlpVUL5yT4?kEf%pe#X2+>!pSC#&K4_)rXHwS
-}9ZTf%DEgtOM#%v(_r3P#;NekNPT)hyIXtqOe@djO4kAtQA0mw>y@JJkI!hui?nG#%&#Ch7h%{eN6!3
-4*;(?-oe}fhe6a{<(qXYv~|9WO|2aA82S^P6l4E!6kcw8p%576RoE))3Cb$;df|A6Kn4uTmzv*rOvrv
-!&A^X-s9xPy&hneH%{23s5wNvHX$pCQphs<{{KIE0YtL<64D^0IC3%qhDr2Og+)x(1oy$M(`Db5q~-A
-=?hu$dwDuZ{1BlUz^1q-P4xY^0}<+D)oM*`7_`bKmCQeZ{VoWULchW=01QEzJU>)hL%>V+Umyx%z<ww
-n4h<AZrNFT9Nm<3MZ*Ek-&t*|o0(xm2S1^Al>xTx^)w2he#o$+8<Ls23n6BG{YufhG3e)Vl;lO<>d^s
-N)!=%i6~s!A6$?cD_!iv(Qwv^{uj7$hQnJ?EEq!<|ihRla;;Gk>`3xp)y^A5}LS9(pf1T?1g;QvidAA
-$XU;pF$`oF_|ew9`EfBwfrzcJYVc#*G``VXG<8~cnRI02y~OraDEQ#gu}Ac;{R3_~9sJc=Mlia?3)T4
-)$NEGJAHb~^bo%LV+2N<INN{vip5N9PpwB~VVkYoT{bynkc(M^*(qc>TM1-3@vO9nvj(yiH|CIVlPcl
-46=3>U3dr*v%;V(ZIv>a1rQdR$&Yu_8j{(4kVxHHDLG=+owKen>Z+qyCXP;Dq^4hg7~OG!SPXO!awz%
-?9(nlARi$Z_$TsD2Ocu$F}m4Le;Hk^RAnv7zQSl2JC<d`o^r6IrEgej((G`24XEtTW2+Z6GU210Qy3k
-%>2_Q3F(UsN5=~G0kwMi|XWsbAE$l_$=eZ|#cu!uxdXPIF{LN!uMh>pK{XCeBADgNQ4-epM^+R*iZF*
-B}W7eR@=hXh{nE^jKwZD31fGX5SpTMu_i(g-;J=};nBd7V78ekwwjk1Af*QyRgTCevTpwW$3286M%c0
-77HNxe6_nQpxM?U5yo@g~#RVArTq^)ne4m|51(sabA#<-B5C6+?|x_xA$$vwZe%My>sNR-0hWDGmw1O
-PA^FJSx%qbyCTie4w_g(vJ(vJ};JvQXg9g=CsN?tYmO;{k-Hn9^GhyYZvz70rl<SxGTsJ`u>503FUcN
-;J0#3U$d0Ucqz!+J#xpeBJ0eWU^Jq0+IzNXD+FSC>g^Fo=QrA+#(&vtVgDOu3;RoE3;T_nCrpqSLBSx
-ke}NcCz%Y)JAWo4Wbm)9iC~>rYqTe-J)CWoKAA9ISY=+V!#dkDG5=RmbA&*4g(N_t7hD3e8WPQ*R(W9
-u0fJZqxL=U2LnjKnEyE)4~N7%7mk{rrVDE?tmN5?~9_ye;AeahU?r+B`f50V^dO)&eE#nZzaBIsfKcD
-Q>;VPyvuF~dIi6FRz{lFz8t5IeG$8Gf)Pk9s@!>0hPxbNy3bDITfF(E7z}`9dS3tp9pJ9>#X55@(G9U
-*>Pgwg1R$LI3|XTfaNCzizg^!@B-8>DmMxy?IZR7oB@O;fs?@UZ=?=#9qQJp^gFaA}!aL!Ic{t_RzXb
-<LY6c=iG0DnZOYD7+Eo}4MjwT1mEWE5#JL#G~Y(xpcz@GK%u|Qu5PUYvqX-23RW9to!i=WkQB@#P=3z
-S{4G@W8@|^q^?OTxKN<2-nEazfS|SA>H=~2<&wT-Wk9AG!ZqJX+3nu;Ll{X9;Wa#M(hiC^{YYLHpcDp
-jx{pwC_4qy<L*!hd=gb7wcT9!-U>F3fMCkj+S+fzRY`%QU&B!NV%!bVv-sU@uPV0HPmIGqkG^Gf!x(3
-4qApw@6bS??|AY2+{4L2C-b>3@=R*u&rbXA^cw+WpE9eR@s4`=oDd;lEnwt3CYlMSjcU0YL-=zuS`uM
-u#2RLtgMB3=Dk=9y`7w<6}4w27Y2%=nxFv0T}XqoxOxS3=19|%_A6esO@3Y5yl?SY_~rj(c&09Y}X;&
-@}cV-eIn@|7yqa)CH{oO;8Cc-K4T>!<X8pyNVpu78}g6@#E`>|rqEF<`bfAO#xYBdHkBR6?Pl@ljL#0
-z(Qby1Ou?rQ9{zKFb#f4Op!KWO<7v4p_3!s!hTo8rb-@1BfFm}aT?a7>-!t;y;;u(zc>Ino!fXHiQmt
-`Tel{H(E8EFMD1hDY)E|aR>+Zkh(Z6GLa7TY@E{}$euk)dItEYWhP;yXhK2}dcznDU4``HxE_itwM+4
-ZjnAw5*V)j<C)fYQZmfVgDz;BGc?yA)AtHc`b7D*I(;dY;Qax};yUW)4Zf>t}q${$iHD8wSPvoUy&p$
-BUgm*e@(lbbU0&4Tx{!=n35rsaEZzrJxKq)vD}u6wVtr#_`Qn(~>S8@P(v?SV=cY?wB<dLy^Zj<bDUF
-+80J0o)+kpDia=`x#7};86?25kFAu<(o4LZB308N^aQaBav4`rxt^wKs|n%h0n0|FF`ds3Z4*WqdV`X
-@^5NUc??sRoDU!-^ej2y*hT21A=UYwpt8{)q8yhTYBCLQSUxWLqO~K$!40s*->ZaGzo2J^ON>xO$D;U
-CDB_bn~z#20jFMi5~qj+vCnRl)xK&=+;i+R}IGMUf7`)oU*D|&B(x-~;h=os?mmKrM@=QXsodwrM`^L
-7eb@PwL0!wtYJ{IordXtrAZF?d&&)nH?lYH^8q=z_<~dpRqx9}?2gKqIA5cU7Ji2ZOrTh@UhPz#W22o
-U25*rOVL)`{*|W6WI+x<oCTw=rSpVUdtAi!njLfDtC5O%c@P^s3nr7PXJoJ^&nv@5z{bE-WFoSJm2W`
-9SeM+PP33awkrkOH4U-vN*1~&>8(Ul`N%*Z*e2e9NUe!D7TxmdHgA=C2um#TgByd-F|P@`%^%vVjh^;
-E;i){W)$HgZR^LkPio50JO#riX;gf;zZVOX>pw+-s4B^fNa?S846y&|hIbpR?Ml$R7I)w==DH7)#oX2
-z(6MF(Yr`?|S;Tk*)8*<ki(WuuUmJoZM<ie*nha}P0$y47GJOKXs;6l?GvO%ny^tD#^_*z^E?Aj-Qq^
-*woJzc5Km~)<1<u+mLtK{V<(b7C#KJAV<C-_NELj>AEjDy9`Tl^qREPtV<OOU~J^OL6`n?W<nl;asFr
-$ZC6-@*Kp!@jrKi4Nb`c`cc_pL^h1cIB$73|ZZt%5ygbMui0T?6M_idn#YuJKjvLW3m@}GgnN|*|#mF
-FE8-7h=H^-2}pg0_yY1&EXp4T$bb9r-CmgeQ&kW*_aZ**1(e1s$si{h*^T149hjJ7XWYknv|M^14-EM
-=AtyU#xk@&7Oy%bTHfQuZhg_$Ao0CnG3VWw>a$7uc>q?Dkt{J6Is+`Y$0i5qNHB?s`eBoOE=DJCeNp{
-?Ef!ETf8>Uj*oxk{x<unfggq$K$QNoZ^1?vSdK4Z)P7(Ps+C2VPyc$N$rB!R4idNLuQJWe@}zJlnfv`
-g2Zt<w!#;c8wTcGcS&z@e=m8py_oP7?Wbg7cZs*K3zGvKBnTtJZFf-MM0aMfO;=xt<&<vU|y<s~BT*O
-Sxi{=59{_Wr7pGOiySdyzV_uNpxid%{fGiqG%pZDNAZdrE9{FNEoVzxj_-LqiMTy@pQg70myC3(zET3
-KvRp#E>V<9@`cLl&|(XBx*O4En9B6z3BtSzCBj#lKUPVFFgK`Sz%yV7B4nQ(oQNv{C#6(0LpL3hlhIx
-5s2<&E<Fe--8Wc`BiuWPW?_G_04f-BY;b36{6v`0NJ?{2k{;$WN-$y&V`wQUtH^}QRE%V2?>px3;i@J
-8ug?zV&5g(O`@Y6z;l1DRG1|1?3M`Ig##CF7|)olk&doUOMpc@!J_$WkrAfF?qjE;D3|9jtQ$2r77mp
-Rf`QF;I`nEI@p98ddUiVXb>eW0KN$D#2-%%QMPH3UDR#zW%b1EF?AwPUXxa-|;@%pO_7AB8{okODlmP
-#@w={9(HsP0z`3TG*c!F@*Soy2@Xpu6y-;)aCz6)K$;&{1tUEe~h|J*Z&Xl`Z{Uym@0WpL$-NLt(v3h
-cLmhymyNSp6`?A8t8R>`zb+kcjQctA*8>CJ9C=Y}y8Ak(QWE|H&whu__Mp`*84LI-eS8G&((iQCeipd
-MKLQu*N8n<29w?cd%B-%fZLoknSca~bZbay|Mxo0?wkGUF=M*Ym@Ivw~MQAJ7Sic<HmSu*Z+<UNi)+Y
-FuoS&$U1)S1HOU1tHAluF(c;1529wEcI%Yh5I+^KlNwU1D7aSnB?Os!x^t=)N!h!(VojwC>EJ~O@#Rr
-Y*}b{{+M=5hcF(s<lDAzOkzH#Ctju}9@8g&j%lGW4SdBlm&2EIf+$z>sNaxclr2hcU`3oQcPjFmsp~q
-|vkGn^Y?NvTiG<zdM;rhJzwZraZqTugm!gAq~*Wg~2gig5I8SwiOTXs<i1dGt~$>l}+9mgpRA2X!ls|
-dh*bMGX=rf!nAUHdX`=URG9P{#ZmRnLiMyWtVP`3X7g4~2A3@4*>t@ML9|pmJ4Gb3y5<ftxZVbkWKXH
-Guz(^IZSMqAOkX|z)?D4&k`(n*+>o<khO>DeoZRujcgd%o9&@+X$gs4-1{TX-Lp-y9a}c>;gk3tP%UL
-|kr5Z&+l_%BfGFR&YZ5k(30#DrbKs;cBB8xgM@JXj*MdSGfJs{5Y+dFuvScBQ!&?W?`5NNcOaV<nrVB
-4mhI$%P|x{GuY{tU&qpPuydQut5yT}vVWy(Kj7Zeanvo13Pm`)f&bZ-X1p-IAFaNWV|SBlU1vtmD27m
-{M4B7x!OmY~kl%xB>k_(KGQ@?|JW9+lVI31@+Mv-!M_@zEzf<d7Az?F?%E_zRghp=k5C$jo&0@Z}>pV
-tlyP3`HbhVe2?AhO3u+UCw`|j`SWPbeG%@Ktjo(CFnuJ#-AY-5N!A+JMPkvD2}A8s$90r|RH1q>pJb%
-E34?;LB`s6T5JU7R<ZE>1aoJ8GP4D^D4bLrJ4jm{UBC<s{=F~rs7XT-jerK}B(`sKaSc(|-R-&>k0)Y
-(pbNXTm?(D>2WV=pdV|u{Tf}Lc%y^U#WIHCo-(Xz=vj~uRLGuf(|k2b-agC}O)d2f!C+4r$y!usaL#8
-s754#Gq9%nrAfj~v!!f%#@Hmy9-*C~PjY5<#%0#?m4_W{vZ%O=3Q2Ejm*{H4sUMT)F%D&MM)pW5#lcW
-Mu`|r>45R<O`<czmtJ{b>{0#Uf{>Y_Ma~04m}lzU3iB@tt-xxmO<MqjQfqhy_9DLr@-6xQOjvXibfq$
-Z^ajP>TIMBtFCkElSPDr!Vj0NC$VC7J!w7J)}Vkbv{_7vaXk(Mus$@?G7Wt;o@EMlANea7sc0J8dema
-!_2RoLrW11cENg;}NEAPb4qLtK@OFDhA#iDM32!*`o+_MK)>jlXV>GzKVZesM<>U<y@fPZ*pdD}sI|=
-90?O~fspl%mXGW7Hcq!-G_Yty*F{-u0QTp<Jsx6)IQ6A(DPt@P1fx6pgoZy}XShq+sNo=sOcD+Lc)Qx
-Xu|MD6*AK_xZa!+cEy$;&0ZV$Yj_=g-TUIvNH&p?6xQ294WKS&GkagamjdXAWP-0P)(q>))BdE$y)83
-!#I3v~4=X<ySeB&uCKpKTr4uWBsiizoM!?-sv}(3V|t-gdq??DHKOg7@<H6KGIv{p(ucp2!+Dm)e(r0
-qu-49)a-U_lzxhm3G!2l91senj)t!NCq{ib$$pUM%0Bvt=|R*$KO!sWr>KZwKauFsxsQKle;ty?>1Xs
-qd=x^F@Fy7iQA1jCR3Z1{QqeK4EBP=)$moDrN0Ai#r2NyP_&|KdhhgCHjYP)*h)+#nKiIzG4!!o1I2z
-c%BYBr%2L&cf|L!~qgUtmtr}r<%saD>Cjz8(|39@pG@;w~^YmaolHe1Qo4pE}UToX?NRcm+UUsL1@CL
-bsa_%d?a$PIW8VD9ef!_BV*OFq*^e`a|Y2cZL2?HycI()NYqv4>>8*;p~k-#sJX+f({0XY_Yu06K^1(
-i>J&5T{+pJ7xO5vOb;DEkK*3&>9;+jQO$K`T30Fu7N1QDRPrc8W`inFOF!NxdD+|FcwenRt^f37A>){
-{v*3r3iWus9N?4|G5gxit){%=NCzE^(u>o{dS8*z-lVzYN6%|A-XX6r-KQFSmxlLhWc~xmW+Lwa3vAG
-vtmP$pCEMfyuc}f)?BdXu7>YXmOgGisYe+LHQk#xLu05SVcze`zI=yZn2LX}$;LkA%uB9C(tQvXt{=P
-H_Pg@?WY9Q+c=NxiUYSPE(5lym{l>e8y_gZ=s+qwnsd5XI14)yu*Zb$S59)v)`n>aUkj|?Ep(>Ewhxy
-)TvJI>#yJ0deuxjxJi`n2X)bIvhF?#-92nvABoniXI}Ap63GYszMK$XAu9zq3}dLT2AfA}L25i^*R8f
-R(^)(UA4F_w;&rT)Lc5+<9>q;2q?6y$&^3>BtpKHY{lv3h8l+xD@tlIW=1+uwW`AGI?U*S35+TDQVlP
-XYScDY87yYhCa<ykOu=fn>Wr5z_UGLC}EyTzI)|CMP76xG&5^c&UOu*nyIhcHGw8gzXqWSr1Iu^LC)P
-EO!LJHbjwq#c+1Z_vC)=oMCwgvEB<biQ=Nf$lltWALa^jIxok1>vJE6B|NVaQqc)E_uw#lvN(YK5_^k
-Dq915@PGl%4wEa|a0W47L?$j#SUB0nW8$)n{PXvx*?-d!R*SS-79vY4jp(fpOl)iO=ulrR=y6FVBzbQ
-0X;IoTk(<(>-%3D^4#*MUlMUzvS{{@~K})3VTy5ZCWz030Kn_1nze-_t{$PR5jUu2x<3KKM6&5)3jm`
-~`V5BW21#7?@bEYH;RWsrG%<l;+kvU;@8$SIJ?-`hBVJlLM>T*v>LQ+$*9BMx)g;uF&a{GdTNY>|cq2
-WT`rHvJ0E{mur=f)r}1`Yzv^%aH+{zJ1x{SkHE!zYoz*&2I5f^<uG2Ut8jBOwJnJxjq4pk!3C#W4G6;
->%7MFCgdqmvYVz)$=8{H%o{8^slmx!3x@6L)=MW!H&wjjbcL)+&5}9Cw+B}fV2FJE#Ik?#o6=Vt4)YU
-RLC~%qs<J7xhSc|fnK9H{59>tS<cdyo@v7+v}&JF6Vbpr;0VS@uf3E$D1qaa{l2Br#li2tsPEfv+ISe
-L3j$A*3~<oP~cAVw>p`YAju1#gk%CSaB0=h<{B;lWo#(`=xJ4KVY2@RR#SdKcPElD9`M!Chf?@cHt=Q
-ga^D{);0#xKy|K6mGXIprv=~U?ljuH}>TTv~VFPBZke?O2tXDUAwy)*{5Q?KGqsr>ax1hvAufz!!Imn
-ecoTqQ^IGY@au6tl@fqeVQ9)uhWOsuNg$&<!)2h2=_yPqJ0Jpl(m}eN$k%|X)?Ix0#d~uy5mHa>=}hD
-y&^hh(q<RdpIyYI;t7>Sr5E&>zxk;~-xNl~3t#d}!Q7NaMZ_3DhwmQv>4nt?$AsB!JpNr2I(!(58ES<
-57y(Q1(WJsf{_E*wOq)j8=rhj59qLc{vKLA#@DQ>G|M>ffLfBi#j_4m&GGraoAd4G+tV4B>)EkR)@ji
-Lli{Rm;9<R_<vA7#7z(_TP-w6TxA*!ZX?!XKykBt3d$f0EPM4?l8A@Bw9ZtVUBGJv;1ENz4x+s6%=iK
-L8N&F`+-GRq0{okpIlFYX?LJjQW%j55etE7X?Bb9T_zIVe#Wf16K+knYMiphK{@$MSL<?(Z_2w`4{<V
-;-K+^XO?205+rrBWgvg4?ka{y{{%$*5MgalNc|gxrT;^Ob)VI5mRPI!dxYi4ZWT*yt%!OXpyoTN{vFC
-nU~SXZ17!gR%=+D6&FcSTR=|&@^>=4=Ag!NSKKv1BA<Dz19zyjdg!IMj`}lOS*Bf>xfvmX?n)TG`n0w
-5d_<G7IQgRXUQbdk7>X++QWcIG8&_~z1gj}9N{s{UY6EbX{n6v^W8$-m%6LLjo2sLg-L{Q9yRaJ;vUs
-r*&C}r$3tL#p5bS=r5yW9+%Ghh}!C8O3_K%5TpdOyJ)$ng{e%9qGjUdiMts<EhI8hDeXOZfBE7m!93_
-wBl`&)g%KC|E})#}olDurGSW?K?vxiV;|`Bw4j}+J++9dJ9(mT<KSVUfyZIM{K<#u%wOxD%7`V>9hnj
-0kkG$fse~6G6@o4jbV7Jk2WrJ;`Gv44L@fE9!^$}J?~a`Uc&GmoL;#!@9VY1qwg6IoB_QH=9p2_y_RJ
-Njy+Q!wpmPq7upK`5T=^LBTMVH6zfByk~++L7W;dPlaF>=0eZbG4TIPS@emv@)^b1K3FLWK>mqE?K##
-CTd5SlL>|;9N-l=MD7+2!4QLY!aqFq2**7EZ5WpRqJXT4f`Bt)1*g3AYT=H~%xMf*;SYj(3d%30$Pjt
-2ZWxQs1Yui<5f0Fu{!G7iaGLg>&1-xcpX!wQ_}m)=tRRnN~Q8#%$vSeD1>F~N`|KDXp?L7dev_bUNjB
-+4$=OvPH}@(z-psNyqBbTzZ}g4G(G)A!Ka@oX~Oa%G5DceGO<cURJba~djmzyncHeey`MUIl?2So|L%
-E#PMjI2bAy{aE$J*vCmIzS{HcH4`^eRJGqBE#OxP+<i3?asoA;vk(f{%Yjq+<Xl_W2#cnYU1fcS=RWY
->gu*0l@Cds_fsGm%k$b9$dCPcbR;0Bvg8G-ZwTv{!q8<~}c|?7B?hOxBT%5(uQ4MX>Dn)qdo?fo(0=&
-tOxpQIa6UlT%?HXyA@Rj(8?`+AJJ~L^cXqjhgyI{no8`G8XGd+j$n5>xST+o0W@v0&DR)TJDMK@||gT
-ZapM`;wEXSNT^So2A=oStrND)dbjPVjp6>2&b*8ImapXy;B)1Gbd&M+TzT;eNfICw5uHB+fLSve2tIb
-_CcHXBy6g^<~ymw7n=%5@B7mXAkJg)?m-iwd?4%g3tL)ECiMFnXnU<eE$-saT7fi*-Of7TMTW{O%cn~
-OF`J2mScPlcsfN*Rpw!L28y$503k;I63UY*r^!;e<vFiJUh;{BSKg1X5b;}a375cI?kc90Jr11W7Dri
-7C-$!|KSD7A`As$@9QJTiQ0ixA-?p~Ci*qpU;&qX<Y8z@esU*IM=dg4J#(hIM@w^h%H6K67QeWaH>zy
-@kIm={}K?7WR3)FA<a=vr6xKI*`*-cKucYj*kk^!X1NFQK(F}6I3#K&zry}3}fvyt^fS~MN0q7oQS7x
-&Cv5sOQmbp)RnSP?ZxIeh*GC?|t+e;(NDa_?jFY_dF*G(!?za|-V!1NB-u$|1&mdg$vCjU#nGG1)2k+
-el03$1e=_56bxowdsF+(Z~OK?EiI$UH;e6m1<?#FNfk~_T>lv)n_BvW<}Kgk1>071NeU=|K~3V1ku0z
-{>=aJOTOc(=*#7|Ed6B~vS03fyZ!;m{eNw4-;m<pp4acWT-c5XX%t6(gbK0vC=(|1$Ki`O+*6?B08mi
-&L1gIBEq3(TM@P9aMt+D2sm~b*`LPK2n46%{f!GM*!}m%*CDiPoSnVh+j*qMEkdE9@-Oq%eF!aMf_;m
-K}aP`Ox=EuoLHyL*Dv-V5uaFzV9v~u{k=ngoK4madTAnp^wvIBhXFmMN}@Ta$JpVQHNdx#|e6)F^N2P
-#~@6Z{3My=v;8^g4$Rq5u7d#x3CBE{QeceDiGO9d}B<K&n9z+9_DEWxrVWO*~kJ^)|G=ieP#;1bm?%;
-Zx`v?^ts8Wquyhqde+sN24tI?L>_$Yt>>_jc0I0`1K~h*Sj3uU0sYS#lGEzB8grj|IvmV3nz$E#0WlQ
-M@ugM1sO7n_AvLmA2&a0t>2JdoAl-$UfMeF%}0!2h4KAjCa!SMua;$eGwU0J?of0EblZWxqyd>jW%(F
-{KV$WuAJ~tc7w}IW*pHqU@J}AtkDeFsPafEho)_@%9@ycQ_E%<Uz!$ePjwmnTir|<Qoz#%98TNt3Pwi
-E?hWR=pop|-+%ME--To%(?U<B&J%7Xz0ZNPM}BpJi2_CBvw0iwmy8_}I(7{SQ~E$_P*Ww~pT+>zqV-7
-`AshO6KCn=I!ptayiJp#%-vrLTyKdpNHQac!9t*{n`4T!}n8!6xmJ<V;B9es_i7V83$Cg{PHzazRTEm
-=o0*z;lFiS=6t#zf7CatsaL_8@C9)Sf5jZ?S`iio*rC>D^~=JVO9u@cXne*5C$Chl-%Bif4PQ_mw>Id
-bVi9+e#hehdb8c-^;k@tOi!bGU9|Pm#tA*&*cX94#(uotAfS%CchD?4CRRguv}S@8Qio=JR?X%2ZDD^
-_&SdMK`5yefE$o?8Apx=EJI@j_a%Cr0ki22f-E(7f;Ad`WSxBYr5FwdORdtZt<*W&T^mug@9#+0)zJ!
-}en>P@s?dCP#RN6*4?P-BekuomsnRFyP3bbv#zdW^K<mlyj?ZlSwX}PpQ9ae8)G)rW@hk)7S8v&;E>@
-cFC`ql_qa92m*GboXYF<q9Mk`kpNeOpeK$cYf$I{U+ue(~^tNXQ$2a~;{YMr6eoRqw5KHyHFAQ{vD*b
-v%qb!K=55$rFAh5p_#Bfw<nK<i+Y&`;5Ie%mjL7YWnbAQXm&|8;c>7oRrY*^p>vCI{2Kd^>Uq4q|g=$
-{t9SPz7O_$;@bh!Zc-=jJLPMWP^t~Wg7IQqhe>OSjivM5-=RDHIK%XE&9H|OW1~p_lTzB>jHv<#|L4I
-TM*e$&$p3qj`-ezmpV)7q2oB@ehu=fNGzt+I4Z|1=6EJ!tt$tV)Bt9Mt>4)k~9fs^jCGbNXN8=-?@8O
-@OJ|v#>Uvctd`61{K2-<-N1|6V+-k}11B$Hs|cyTa%;3HL)lSgrpijG$KgSoihiu?&Wfso^N(1C|Oc{
-A)_l4JOxV2&q8!H^&iI7NP#<iyAPG$jv8;{K!kjl>_xarnb!qCO7w`;i%bkQ(>-<$vjO%AF3X;{Cf!r
-Ov3)C9|4Os>;zh^JM>-NdDfw1YO|YMcuy>bb)^tb^m?P71kr@{xP)w9h9=|Cw~jNPvGB0-Jb?sM_azJ
-kO0kAmMbs7TJ3Cld*25&^xN2uQjW2?h^ZfVLIktO9E_U}%Lo?Z{!1F|^2HNk(yU@W7vFTvX*=|sBHeM
-yrThMHr?}g}#RXZ~5D|xqf3%6gn`ZCe>6;+>#@vIoDLyJo75k@~9B&6W)H9WR%bQB&JLy^?^o(LZs8u
-9-isj~DSuNja?P~M=?!OYJ4i}2Z3m*X@?*G!0B7DCXlzj*cF0a`va%2wK^$Y*;=!j;miQR){1u%%hu!
->=?DM!SPNMhY)5U`tvg%X`_W?Xr#jFB~$=km%7UVguYF&qq%6ofZtVMl;njs70-80;ir;4Jj|(0ZabG
-!i*^T#nbI%%=Ji?o)z1_x|FV{Id#RA*VCFg4I?A*p1W_^=psOf580&K0QX4w8ocLT4#;&Xg&UMWuJ~9
-wt{m$|AG6-Gf2W{lEG<`h$B~*15BDqUhOp$$?z@9X!%|w2Qsconpt`kS!xQ!S?tMg=IxVX3Tj|Og5b0
-79<wrgc<%$Hok*iUC}1}974&pYnM^z|tmCdF)pX^U(B=F5oJ;0ah2t8s-s%>wkyWG#lm5Q8vB)u>CfM
-uMJ_Lx%s*jEpE$Tm=96wpU|EO*JpI+p<w()N+@H@LYh{SOmp?+*HfgLISJq+v%F7iqGlb<313VrOQv5
-!S`eC$0bcpv;>0LVUcq@!*Te{BVcK5VEXpdcTwYvPD0QS#CIpg!!R{5Xt4f7TX~eB|OjUJ=+QJ{?|j_
-+gs2PY=Sr+Wi~`Kp!K#V@v(<y56^>aPrYU$qrp)=)=L<=XCVq;-BsF!H@dOqD6fK0Q9?>h#(0s?T5a+
-JnQ|T8o&c~EzBB+eQU(+4WxX;oluzFz8rh_j+e#Z->s;?7m1DUrf@vZEWFtqdcCfvi07LPe{+ve4)+L
-5<F#XBxP115b+Z6ky|2aJ2J1gh@vmkG{M8iyYKFiu#lNo#%=^Cg)&-u*S+{pt2SS0tAcu~duA+$&4K(
-;gB`*6?;ya!>i^JKC9ONo`NdBJZc%HaAqyz1xQPt~7qb~Qj0Jie5o&Lp>6`2jF(9T(#-m-nGN8C`g-p
-<MbKcCC~#zA=_)qT0rD0f4Zx9nYg;@sl^7+xD!VKrwot>=oLQJmK&@pQV;M7cIl0dxMn<XU?qB}E270
-(o#b_iRSPJ}s14JOHu`!wYYorDq|*M5RE5zGn5MBDzwKtJMqrx9a7u6&uk><2G^=qG6G4uNb8ebu%|W
-c$gqc&0YT%SKnn@FQ6X-mS$Q9@{;m|+u$^3b)I>RLoQofl1Oe|)2r{HdL=o<2$ah#olq;-fxt#Fz9o@
-TaVL{F(XUDrw-H>|P%zGIg;wC{TAn6xJGTy<Kla_QBE4@wM58dDTim{%S;Go5)LZ0x{p5*vij^#Qh<g
-h6n6N2ki7zN!Z$@Zc?pdRs8gF~vM<7xuweTDw(WLn0z@w|(pBHBmCGyJPJuC9wnCUqSUdbxK8FQ{orE
-TcD+F9o!>huDz`#|ahf-VRs^^|*CrWZLhv9TWFd>rC3$L@k+I*;_mocc4D@*KHTH6A^8oFEUm3*6M(*
-iu@i-|pDSD6SaArYd$b-R^ZBpQYoh`^LXZ=%S|~==Lth!YwABkL%)%3vl@c5^w*dEjfI4gfodMdANxf
-hzDZ*&A$)P<{iD{pKYwA2@=nE1#8z}h0?0dT!1ltBKN@p+2?)Vj^D`3_V=wN*gyI^VIa1D7`4HX9x*;
-I!h4RMY_Qs=^-qd$-wPc8!}-$Gy<a8u&WgJ8ZaFJFkV#19Th?3SZK_!CEm!M?XS0NF8;mv+?NkW#9{l
-PW+dx)>qqE!$tfHS;GBC<ocXGYMp`a7yKD_CCG=|jeY8a8S<oSfKPYf<b(7B!L=l+oa^>rJaj$0p0{I
-sVx6fHeXfKG&Q&a)dg*|1}Dl?}1vJNKFfmn&iPr($1sSQ2A*NCXI0ac4mA?H~d3aPE-Ug%oIX&Fg{pQ
-b)5KGDre`NRSEQ$er}c3pUjcovxIzGx%JA8!i`H0manDM6Z~teDiI;S4Xrn$&&h0*l&x_P%p<2+M!T#
-pXFb?)+#XH#@Hi;X<$(XT`*~TU5IsuBli@36|nYJSb~JF6>-(c++duMSN%-8hS{xXUzn45=Q~^XkxZu
-mSCQl$O0KsksIwtp7YtPV7d;kYbgC+g&`!@BvlX*{%a)Dthy-!(>lrg0x!r{Fq62uhrWd7LZ#>7c51}
-I3ZbZsvQU+Dufxe7M5tXcZu6Sl$2sM1?=inCFiX{lCad~6__{P0!Br6+CWRhn}f`0d#I1vkVy>#K3#)
-(V7&I58jrAp>;>P#oLe=Ao*r`44@g#g3c8E%nWqzy#|E7Tsz4cPCNrvfvvfpS^H6Z_V)G4adAAv@Ab@
-Ee#it~1L4dU}Td-p6l<yOLL;#RuBq)C4)-@!)3Fes4DyCQTrDI|T!Q4%6R;U-ti8(!^B1h_eZ8){L)v
-Uo{5+Iv`UM{UTRemyN$z(f^zv7|z>hJzk)2^5vi5%Rj%!_@VXo+pDovTU5V%ehjtQSRJqMyy|{=XUET
-e{lD}-mpplA{g)v)ufE>1-9gwd%zu53%l_*RknjIj6aNM?{})dB_qOx|a%3rJm_#t@hgAJEI^f$52@i
-E8<dbVa573$uN8RFZjYt0l<3}dquvPxCu2S+*B-zivKBC0w$HN}_)GrQSi;wH^;Z%km(sMBK5li}z$?
-~6)#^^&R0FDo!i(&_M{=&rHL1>yB`HDkS??Wt0sRN4cBQf$Xh&rsBBkD+Q?6-u-<FNfLVA1jJ2=pWIw
-8PcEr0NUjgIzwKzF}3FQ7|8@jH37<ag1Y!-*`*_pG1YIEc}OE`%!z-*hZWpL|g+~)HPxFiV_#W)vk%t
-jE=K!)Lo9{B5&z|$l~`ymNu1ou}9ibk;8VM(<A=&e<A1J`&is9kL6516rp@%9lRgE?ECVj01S&1`wCl
-*6!AB%*VVQ8UOZo1@$5RVQJCJ+MyR>Q2>ysx*8aA&ju4>$EU6`8&xI6GFZVkPf!_;*cM}GG|7)>|Zh!
-Y@h7M_z9WkRCFMcR%$JmaRi|>P)A}xPF%Z^hEw*$w15<BxO86N%${Bx-}&}_|LlNG$M!(n`}EclxO-t
-i35hoV_?EbXW{@$$%ninMbIqict6|2L^C1*Dxj?GH@ok*4_ecJ`Cj$YR;c;ANLuJoez<)CcfCd=etCA
-N)$?^E>X^*U?P$6}P{F{ryM&V+?(xa1eRF!BS?4wFH#4B>P`Q*h84IBZQxl<^JFX{otGs^Sq3JiqaA8
-3U11?_qulgi0R?h7|#nxmRra0paSua3<V>iA~xQTdbok<X&xpVC2RNm!0>sG)VJ-yT*L?1n1Ix^a6D*
-fMN2^)UgZZW`Mf2|UEW$dsH}b0qX?E_txH>g%~_>~ig^uimpyQ?>Pi&An)2Qgmx#(_Ryc#N8`rUqldy
-8SRj{$7oiN1P_a3KnO50_nkl@XtskuF+r&S_mY6EabztN%z$5t2a;V?32@ZxJP1-I)ZuLrm{KxlEF<#
-yAGg0pS+G`mypwB4y}EK-Aj@=6KQEk4KUox8n47poQ22bcYgfjaykW#vNa%X0=(mr6)mO>(JWqEN1tr
-L>71O#(kMnK(e7`)Fi&ybiq7HY2kbCXMr#3s%gx-)jZ~f0dZ|sT=ee7t?<50gJz^S7ms-Gs3ePf|V|!
-X|B8uN!G#-eaNKEc^j$_m5NrN&4ha1?(7X;xg@zfOQ;20pYXaiL#M$pv$F3VC`OkC37;(NaXIC9EEb*
-%Gc8?X)9v{hQ&f6BADw3w&#9i~C*YXT><{QOoQ=fec{os>^y3BVco;#Tpq?4;jU-xWT#b2zy*ONTb<<
-u+EP3cf1N$6!WPw}q`8>bRZTnD-6y!$w%s&Lb_8Y8cZpK8Yxqa_Kc&#TSy_^UukK_e}5kf;a5eVLx%s
-eH*ZK6|KJR^ZlO8b&hEKXnT`edfJq3=yuL$hdEdr=pb1V0bXL$M}X^`0JZdX6mSOo(p0nQn3ZeyQY><
-LU2RH5|%b-$~iO8NNFIHv~b*FBpo_G(|(`ACpM`(G|XDkbZFX?_%^19SpEf^Fn&`A?)!Cp^nr(N_{*H
-J{fs3`xo(X41f-I<{w67`jeQ6<HI&I!VlT72s+~Q9(|8Q4*8KJgAXwr6gd((dz?Llb*TM@KZ(jnbnuZ
-5@_2Gw<!E!*!+Ubv15OVO!#w~~*ugeB3=KYRSV!V0K9W-;b<`X7;J>2^C_D0C$Vaw^`Us328b5!-p!8
-^PK%d{DGRyou@f>LnHa4KK!nbBp^{YJU6eI8>*#uu>oo~Wj*N?PKb%ZqyzuE<^@!BHWObmQ?ME;t?i9
-33XeC?<Nd~Y!QRXm4T_rJJiC(Bj*<mxxz4}*Ua&oNu&H}bJ}n`?e|qXiH*#{E{H;6E<VN}==GcC{Pqq
-eW&yv-I72)a1W}bo?EA?e@vP|H?T32jV%pt#QVExZxKB$QLW)@HL7`n9(GgevZ^tF2cBnIguC;{R!zk
-`r?WF&UyXa#G0n|u&tlA$qc=7-U62@3y8<{p5miQU1_M`(3i%ZU?j<yUQ+rdsAucmr>IhQ;;na?6$IO
-KqWjZ4oJzw5ywFjXCZ!^?!XNX#O7_uXqtf>%Vj?(^tn)g<+C3jgtL?6!u8Q}|{vp5O<WWD+H!lMFa`G
-CpJB!`tDU|6Z29f$4UN5VvT&)0tC>9(%!I^aRDL5CjADX*8U6|XeF4IA6;(fbyJ9|$#3>)tGbdXMG)U
-lL_RiR{39m1aGEo3;mPYt3M^Wu%O+-%jA1Ig%Gh!-mXxR_Bfggc#XWmjo%O!<k3UED1mMB3apz1Es_o
-9(Dz=IVKLf8N(#_PRnKuD;h0W(CZH-_ZgnokA+AgY#JmUaIG41i?V-oST|3>+kp(fQ^5<tiApgD(*rK
-9GB_)7IHYBfq6kk@f|cYm&Cr9EU4&DPj>%BQMbxW7T?7lu)Fld=vJX+2g{Au*w_r!EiRq~W=TK?wgpt
-uV`JRxK#kp7_)1fpq4mhhd6<Nq#(Yc(N1z%_qv#ec>MAL<N@d7olIRNqM5LOrR(AsqdEW+=NAw+jfIJ
-iGlU(7l)?|YK`VrKIuTErw7`Bc5Gp@muUF<UK3&3;FYLFpH-;L+W2~Udn3UTPwMiXg;rpSNmk_ZlC_a
-FI-9&HkT-6dha8)w@W32i1gN+CvlQJ$6+$t46Jf6h<+^kC!%D;4lfX(z8?2dU2cf>fNYu+dMim$qKDD
-4Oo4lX-c$Ek!#TSrARpod+6sd%~2@4G2K0WXjxpv+>IH-2L0cU4lwP5*^&gP!o5kG(`c^KjHjd`ZNoL
-S!ygXHBH8FdBxrgh(uu3x>;q{hZjw=3N<``W1RWcAkK)>>i&V!XJ|se#=h==Y?C^qF-AGvv|53e&;km
-Gg4>H`xjx!r&E<ukSDQ;%&6~5=f<We7Wc-%9-bdqU@#LA9J!ZISbM$E6AXRKN@GPkWy;McB=2>vkK_#
-RJJR}K>)t_lLdA_9X%Oc)8WOP2U%6Ua-%bWGJY&mxap*m1vfh*%qgQ(`a8;GV4#}Rs+5%#|0_o5bwxs
-UWgi9JX<1=g!ht`YWlSBN)Qw36o_@N7?IEC+Zv#!p-HONPJ30$$du2O5mUoOSrp^8$6+;tlrkpnt3k*
-JjK_>~NAbDHn*xXvW#T;AholxO82Dx9PHUY7IKmqPY9$H&&YshcV%^A~hE&yrywmR5ZkBW--@50BShY
-(})x0(5lJ{F9($Zg_dfe)g2OKx9b9^aL#Y(SO;Xi#>7H&5C#qTDo;!UpzbpnH!pdaB1YX-_RUI+STa2
-f^7;+!wPbzqd3!bCj>PEvCPSjA*Ui*=ryvx!w+9qPpD5!t)vsQt;aeG!!!{{}YYyNT**=&WutZV#f+g
-;&Y!qp7guf5Ku8L&~zj%t3soDC=7tz(PZtm<CB=zlQJB<2ruy~*P^h;4r=+paa_>*br|FVmIgK2+p!Q
-W?9NRps%8Yf@^rzi}@Fa&{d8X+l~AV?e{aS|tfNN0*Z9`ifoI=~xs;IJJ*9TGRxr(+a9KoJccC<}*oO
-!Y%t2jxdy4ud|1@6?f>Ikcstk3#@;BszA$xL=9RJ{7!A3MTrL@3NoKnTU_Kzz*Ir>geY<s8;0B4w8JN
-WeNPCR~<7X{)NCtFH836Xu+c6nEX?l#IuiYJ^X1gfj=xJ@*}6X4-$Wc>-h12BM;;|ohf|@h11(}8Klw
-x7Pa(_x%r2UtnBzlIumd4zq)qrSWkAL)()Mq&1|94IOZG93+;W}6`TSvI~tBV^P5b*xW9fM!u%mG+%+
-!v*1?f~JK_5UE%qbI3IyK#twTXJs$cbd^pBp8u;_=Mz;-^8BRf?4HYV(2Vx&pX0{mXjM^`lSYiq!#VI
-%b|S8pxE#WhQr73N!`Mtj@G9n)eZAV%FOl)kk@9Ixp$LEPpyogMo<>2D`|zn~(dLyVkD;8!|&%6--PV
-gGLW0%0>0kcE4r?kIIgUX}bF>Ff0r(6NGd0@hEgm}a!nwo1i`R``@QiF}GfsaWrThlt#JOAFvlCJxs-
-MmUM~c5X#q9&fLB1xx6DvG6o{-a>_xVUkavk{wT(n8R$<RH$;Z%B&oH02W~bBp*G(T|=2FK#V5A7#`8
-V8>dNY8~P-xh7(*>Up6M|My-LE+wb&^k|*Ki>kTlGDOYzr0?R>~KahSBGu83Z6{fBGbaov>)_8h)K?I
-21_w^F&EiE2i0bQ_$Y;*VxplL@H3xp0E4b3Z^&vsB<zFkdCpVw|j#t*}iE0z$kQ)|QFTd8Kf&aUr5av
-syP(l0<m%%CCQ#~Y(!5<4r)H!2S-%=X4yzEXL<(0GDB6Q+S5(Rg$NRP;{Iu;*<!*<&Xrxamw+v#X&)L
-inuC0n0KHr!Ni*d?5%iKhJ3htaie(wF@L8f1u)UVY)3SNp(~8_*IlZ;#PhhVW_B5CmhTotVfX~tU^|O
-@TpwY7}S=x{;JubU7UPb7|Y=5phXTpRrxY2I8ay(^;*0@vH6pFW|&%+%N2ZN>kY*OAt3L4$u(vQxyCD
-Vq*M<_sRuzcoG;$}j=iox_;zjvh4d<%k^vMxpA~K)H+#f9WK=^Ivo5bvA)a-Wt?(0%nNgT3In1)`eVz
-<i&VlGAwswM3Y)ac<)V0(_@>!X2&Egusx(d1%tMFvlis^@U?k*0ZPiM`e5{kQU5TYc2p1@jUx{mbV0(
-2TOpL(DRHC=Cx{^-w-0OAZ1T}GzuG58h8vfWEW#cKaRx-Miy#r)FL!Z8P*Lw!Z{eU5%nwm90O*49?Zm
-i5&!Wc?TO#}dhZa{hO*y5FDsJE3%(gfJ9BF_Iu*ilAW(fk}iUQ4GT=5~T<dLs62%aSEXcg#ID31BO3z
-Uicu_9zKa5yTikM8$QzcWcFbIXCFb}Y!8z^Yn?efxub(yi{@YT>5z|+PMjVAZjZb<dW5_^DDE+C4_=3
-mOa8C)XV#5}B074M4$zMc5F8!S#W-;ULY(|WVDvEGfs-SHvIl4Mlc3q>Ph-a|@sEP~;Rci)N-NO*20v
-;pd)!VAippOG$mB?TwBHjS&h7q4+0)`e^~D`eSHz#?*CpK=cryO<)dlwN?(F=*1KSbi-}Fh|H5nS$z<
-az?L?|r(Q3Xd%1APpUrxQTv;g1+iOGVTs!@`zhv-7R0z{7fEIN{l;Sj&cJ=My~Yukr7QadtBU`etm}#
-(o0ex4~~?nkf9CW0BQ<6Sh>Ir7u9ziO<grgq8?8;fS`x!ST&HciLkfx=+`>G{SV?X|ed$K117HBTAO5
-6oAvvH}{kH_<JmduOtTa&Ev*Xc<X?1@vlLadF#t6kz%ff+Y`>vfJw3WvZ2Vm9Oll+jN%qJ8r;@34jND
-Cj7Cs|b>uYK0D7|wxYSkt%uq9EN6;P9oBEXuu?${ylAkI#FD?!DcAlv;pP-q#u;F}5QFcmh@pT5!g2|
-q|DNp$81r~$zwj%*4pyCZa;+1GTMTPL-ioMe~?pu7rZ*TZyd$fKzofO`C5dfMCbX;-momC;*=kRSz*D
-Kc94~!FJE<Gnr2ZP(>_Jgdgj64twp>mJ7ABafC(-;TXeMi$m?0maChtz#0`>r)*ikD^KV`o8uEF#|6B
-dfybb5&)08R};L=0!ZPS8{D+9q^?)v+^@mx7GXKiQE26+ZOn<xUDgX&sLQ#{$;zl`^vA?K3JwWvCZob
-03+~?#W4CejG>p%TVRBUv}cAh_n|=<4LUu$m%PVEqX&u3>k?eTB$%>Q1$!{zd>H1jLN<dY27$>v$FCs
-L#Or7?S022^?US9!muzmxy;qGDQ)nSjFVJhs)hAWr-Bkj5zX?e&BYEC4X6!ZEGYD_&C4BG%dB4p?>(a
-M#MVShwUsEHwz45m>vgku#?9<wDH{jl^*ee0ch5_|g@sfRiLLL3$1o_Jq)3@Jasp(#)7CXJqWyG`!pO
-f`~X}V&UH$_^36vFvOQ08TqmA5Q{d`UuX<NGwOwRkVGX-r;fZQU&r&&Rpun$>y`Cs5awWeT;;DuBz|d
-vF`*_?dhw&tN4b=e!z&LZ0+(oc{rf;Yf{7-7g;*i7fqQ0e5WQj+o^1)s~I-U+gR?`+IvYs%-c~qhm|=
-_0+%F1^VB3pWmkWe{zrC^^NYZl%@{}*Ta<#rBH}I6fsBw+oLBABREaaKV}ttG5p=5UP>Pnfc?Mwh7Cd
-gg~y-W7j`(w!P&9z+M`|mW6t9dsXkI-Xm-S_Bk`Ub(ii)_FUk+b;l7*O<L17xL_UhF$MMNgz^9R)86b
-V^j`9z;AdQX-k>pX0-_ImIM#edDR0xiifKLEMKU?1%JKhL^9DB<+I(CeQo>_hrGxjLIUo(Y{-6QmuP9
-h?7L`L#^WHgjCHg*Kr@>H|x;QI7SRVV(Ge1pE28W;SZqvF2nDZVA(C3g=m{-aGLs&FN@jwJlO@A&%2b
-GIWH0!K7FZ+po4MmPA9v4>-e<^OG~y8Xp01o*nQj6Vel*&P+}OV|9-7;kqjlp^#Rtsimzbw45CH)Z~4
-@be6!@x=yQZ3pqnVqf<dNIyDI`Cz{C8m{lqRZ}G954&T-=6|ybF0~MF_u#&VQ7B$nC-n4t+|m1%Fnxr
-+RyZrpUTUG=pUk&ybM}3vU#lR%Pg_|nV^+TJJ;%@UNIj_dqSIj>WQl9&o9MoIJ-@z)b146yy_KU+evR
-Ry#{j%!rDZvJp_G71ea})u-1mNC5@OqV6PMRBl)K5fw2Cmr$YUg@uuYM0Vk|ln3~uNF=u{EfWjJx>v$
-u{8Qiy5hM=n23M10Opcdp?4(tSSrbbhRv0<))aww;$Z$GSJEA`4v4Z}YT?V0~h9EEYf>!#vC5efACor
-|8}Z>hOeU-V8A)Hea}`>CTjlvKY{>K0sRm$eXb~E1h(y4N!F!t6HD^d{s?V>F`;6<8s>fX95MgLiOh)
-G@8f2T`tIDvdxftodm#ogE{!R<^<hk*tw`lHGHK@@I<I}ye?}~(u<V9SQvDr=$<U2XjIY|<2lH9_P)U
-#aEDPyx)RD7K)z{pq1HQ`mSK<cP`;Qcf`i5d^~H@8q&mYqnb}n~Qv##C1;}3^qymP8G}!i)(vRECMZJ
-*DpOVz2*g&2<u(p$TmRj!QZMg4}FeI65x};Hdb$RECgUZzduAxiD3LDvrzAj@*tNufnTD4I}mo<x~04
-uc^+hMNb^~~$OpWG_hd7}|YEas)iHo$(92A4i&60Zq&3P*%=eT&}O3+K4&8JjYJ#E|_1EUQg*K`p|Q%
-Bq$p*Y+>|Eix7mrNz~2qRVv}x>I#Kk1vjWHwyE()%#muriDIB^yFRB99_3dZ<O#`V@tM}Fby7Iya&)G
-A3CRA9;)DiPecpu816b0F21@Yz)^7gy*9_6>JPx53lJ7^cMY5wuEh-_)c5V>oY=L4?E4k8|19nSeAGR
-DzXQ;}Yjem_%MWBj#MBNsy|XtMT#%32VjBJ>7;g?T7=Q>aZK)-O74jKEC0&CR-TpoFm=?qDx9s-BBlu
-zJNnx5Jf0y<}c~b2myggF5k{de*IJbv9G`Z-f?xJWh#x>aFvD-_d`CHlXXXHIG7aZ3D#l&uw*ud|Rm6
-zg%Q!Sjt2o3l;29+Dm4h)G*X#jHO)e|`|>q<D9-1w^7&)G*=-Ji4vWoh@M?T{y>YGD;5={k2nT6-5&O
-&|ALL(<kQEln0$Lxy)Ba{nS9GR&&JU|s5a(>d`q+rNJkaf$3m!$$4V*dXB5n<RU7FzyTbqh5%om|Tz(
-TuQ@x*?Juf2uqHk#k}fq<5O8a-i0TwxJu@h*%ho~fVrRh+3w>RH7_?i$WB&gS5g^21tU~)t|#{O?sBb
-c{biuT@SLSJB)ZDUyT_C1o8bxEz^U%u_@?zT*AL-}1&{j~lpCJ31zUB?2CRI6NuC<#J*K2wrYn8lIQT
-?o?1{(JI}no*5i2^MQi$4=S=qNECf2Zs)%uENVz)kedrh1UG~hccMAJBSaecwU_e++jvabQ3xu_Std|
-O2xuC^Z;vcE2B62>^r3Fi{VAKoRnY~%jj^Q(b$J8|*a;wF-PBI!AJ1Mn*b3Wz)*^nEOIUVlB1RbpCk#
-?>+@bIK&6f?Ky`(Q!Uv%BR1*=d`<#8xstVA+7-a<>Bwjy8Uf9DQ9h)^;Pl<lSFCO?JuG}{l(0NEP5s7
-FG@d*)i@mpZun&O4{Qd(N0;Y6Ir9K||MgR-`M+xp-(cu}c>mu*ROm<O^T<==hv>!*E_al+W6&f%Dh?T
-a_{K%)Q3N=cK=DzMNPgTV3Vp2ZAmYf&M8t;zOCPP8`-S6=N=8C_+?hTHWFOJC?9(qA5kJeze4LMI<Pc
-$lko~>~T`9(nddH#fh8&kpzT7D}G&l|(ZhkbL;vb=nL*gwvQaMO;bk^*MI7yGx(f$WL44(c9eM;QXCJ
-J7EZAkfv+Q#FLogT2V0KaJuwb^C|iIO`dn<!|4@(rGmmgEkxbR;>nJsRj`D7oYD`VjL66!F|9h+8I|e
-m`ibJF0r@(CmXYll2P%z5L$yciE%P>AOL)4wY>zEp5C*xE-F>!J)C{?XM3<1CHIHklqIVxsDDFXRkv$
-tb;#QlKzXA9gu#7ZJO<TB~LkD)iiccYbzh}lz#Z@*4q4itp4?R0Ka`8|H<<Je)~ZFlji~a_JRB-&ja}
-F1NrUq_`6Vc57|6-QX5dhdg{i{f^Q>+{@SBn-%w%uddGIdTILfPDH^mb-5&A%8jJQ+)nK7QfdR0!9$u
-BmZY3CjK4f{b#Peh~`*>ecrOFoqB;Cf-@H*|#M;ewF$Xy_|*d~1xquPe{aK$wHTsSdwv$VSFoqcyaFu
-tttl@cI`t@zA2n<Mw;E<ydgdVc*1wQ)ERH^vAv7y>Zs)aNSI>zCn?hZC~Ry@IEj3MyqA`i6?iTH<RkG
-nkt*-Yv}*`CFtAcP}EjGemH}z4lY_X5=7wM&TfNKRcX0b9uiELx)fPDV)<95gZ-0A7N;>LH1C?q(+ib
-BormCU4Z5`3h`OXMl0-X&#wyi0y@5#kwz7wjBCCK_SMOU^*{)9Ix)FR+Pz0z-R`>2@Gl-H^1@$n1@Tj
-<Mr0?(f}tn+hhpTgC>has#@p-cvoaccdEsgn9!r`fLW{BFb*+U25a8iOwb^Sa;FaWJ)b_}XhflEtjut
-0nI-`~s+(H$}CorU3(abHVTctJ(GH!@o#S_p=LC9K;*6!BnLN6<vCaKuujfn)s4Ya%^I$at6+4AV4p$
-#Y~>29iYpC~nfn5E_pTyjN^MCpkUF1kD|gMSKWwF$LJ31{v)PBdD@Fm|CzjtecbLxd(;PLS)0&#n%mH
-38Ted`9$~Uy5)gm1y5D86yHy;^kz|46SwADP!gV=I&+!aX)~vz~5zG{kA@pm~Ovn_4)0)DUgi&8PYSQ
-P@!>|;iv2?M)t_qH80PS4b0kJgE8^+7E%Czbca>R=#j%Es+O_*`ryV;^W1bTc~&iuPCW5&86=3gE~iq
-g$Mr!~0l4&?Hn^GsXqYs+<@JQOVuG9p)rO|TZ8eT?K!o@Br|q0wLY`yAl5J^6wJE4#%}u;7U>kw&`v}
-k%@Ju^Syw!!F)|r|`R|uQip$sA$#5(VcR&0&rwb`3aJvMrjomE<ZAqG6H=?QUx5YL+-@m_D_UK6_IV2
-yDP2J?cw`2efhm(;VTvn1IWMDbeX=%!`7+LtLsFIwGUas<?rG)RNnQwRk?@5dHk+gp5b_lFQXPuIaBW
-fda9;+5YQYgQ(~y*2OKq`Oaj>4vl~0iUk6T5KRMvR*c_lJZi=Y4i?O{GzvfS@K09$<QbXH^F`15z*&I
-RmDV{C(TC>wFb~aD9X2CI-lL=zF*@dq(0NuD>3osX&6ZHoYe$F_R+}<rzWsrnX46$i#2#z4fmPmK)l_
-Bw+3UCF<trfR6m<jB`pdq7A3=jqGapYGn;Fcd%NSA#<-e#@uT%tiR`T?u7&}RWF`?gK{fS!Lp;!=8g4
-ZFyT7ENss|lvr0x!LY1a;P_2Fy9%s=1FO^VJ68P>h50vTCJ$V<I-HkJxAWC<DRJVE{;`T>Vu`TSWinT
-JSXC~%MFoait2W_cwd@1WKXJrx4p9sPWO&R|T?`ig_He-YGw3zYrlUHrcr&i=2S$A1E8|1gKYgtZiW)
-bMu12$M%+PJ$d6&<sA1EtDQz$vdDuj1-UqC}uzDv(67OHxfR2wf6&4{6M2QdgNnC?64)>FCQld@Z2#n
-K^=HAjt-Pd{0!D&UzA+%!xG{U7RC>1J{}z+aXSu&@gpgF2-hV?q4Dr+P7Zt<)1QK8bRcX3KQgT`d>ni
-jHYZ2Y_joVVzfklqrCR0#);7=I!rI?Uv+NM=`2$GHe-V!Q&mrxB;DCP$;Y^<8z9G2lj^Kd*6w;cG&VT
-h8HNRwB54Dvq9o?|TCp)w~ns$;!`>3xNN3!+Mc=<Lq7t#Gw%LIOH=1DEh_)tWSJg6+pA)87&$n3S>O#
-A+s_HSnm{F7;aGP2z7ldpj07_;#$`?`%v=q<xh#|>7N4G^&jJ@|NC#@(T=;%=cQt^raMmWOZqg&`pQq
-;&D^P*gG2FWo_h_v)eVqW>F(m5;#6SuFq~D=)>46tH)(2w^9M0(L%Ir_``0^;NsK^z5yUXTECh-Q7^m
-r5IN*iEzD&EYce1J&ZlEd;e}m`_aEILix5i=RxS=;?Yz(`wlwlIgz0cu9xnr+dinsnD$@Urio>eHJ>^
-M{LIDaZ<#n<j0)f|H9RxIwZFU@{*8bqJSiHydHz9Rh5J=uCBKTDg594>Wk%TpXf2zOsw~m!_r3}8h-a
-2#tf1RvhFeNXq_pMnw+9|rE9i%dc2x{zW-}3HQv6O@_Z-;w5oeA;2aA9kajp9_!Nt&5N|72W!yq&PFR
--pP$Buec`Ss3uoNE4~^4p`GhVPsf3I0lJIYxg_L;JS}|F#hJhXa4tJc-dT4Z}ErlO#>i6p9lhM3X2Cl
-LSrR1dQXvQ4k}4>~Tou|AOeFbt5N_B*fw5{2_zxe{kYhd(n@A3H;I9#C}`_Ly#j?ag>-o;-AsS^nO1)
-N{+Q2Ne-UO{`&AcjE}}jI6n-1j+V%uE!g`ii$q5%0*Q}RIn9r&?33A-TL?c`v4?Ufesr1aGbcYbJo_X
-Q=!gy!bZ}#iN*Qz{J;+a22?2jR5y^uyi~hCaPIN5T@b^4~C0MLmoQ(0-nqFxkyiO(qDg@>q_oMv29|b
-fX`-7ukXlbVK<*RdaU@+xp-A$wgPBtOY*!wrqq<ySCKq|9C>TADol4fP?dk-W7YjrSxST+2Y7LY4{WC
-EP;WB*+<`1>3efYBdDNygEnHmBaR3AesRZVh?3adn5<NV*QL*whZ{Q+5u|CjvpNOLz@&wUhN1Mn^yui
-tXgq)X3<0V^gER`b9pRC{U*Pkf=t#4r=6FZFa8nece*(dmAd<Q^=m9OEVY&qM6P&RbPxZmVl|2Tucrt
-Tl;B{b-dj3=&2ISIiZPji9DN_RbqmG(FYm8;GF@J=mtQdL<T+548gjBD`QTzTeCqZ2ZFXWw@|(p`mJq
-{)TZPo@mMRcHYW6ys}dSDBZ1@q5!Ft{(-`<xFwPEAs0_IEIzJ;7gzJa>zL+{8H)mBgo#j=`f(tHX0&0
-tU50*mZ1winyIi0Q!B~rqou5xnkf+a*XcdjCu*{IyVi`Vx<F8B`FFvCs}swdtjFI*BO&KeznE8Wm8jG
-MCB3AaFy-+yU2=#f%-!Dvw15rh!rVl&;W3J-kwvf~C~y1o*uXWyLkN`MkcpnX-DlM&rko2tRhFW;5$P
-<W2T*{)TtO}p-~H|4q$)?8eQRJw3T@1WUj_{!Npmz60d5;6|O_j5R_s%1NyTS-pCG($h!I#wypx5$Wv
-T;by(P&hIK^Yubi{j)?Z7r=zGktv2?c+yOBLS3)uMdjo*>NZGv#^N4V(9k)#V8AOU`O==fw-8)JG7fO
-H>Tg%T%f~tEHA$d*JLQwcFz#lI=Lvo?Pxlydsn=8HH~3zaf&3$m3-CuN(7)!mSob;M;wCD2ao-;SY?V
-Q3D+ld7vBRG@F26tc566CzpTO_x>|Z%9y%@e3pETdj23JEopG&a8_#)W&3$NPKjtUwmNMfI2xDp@;bF
-Fd1f3w<<#->je4~p|&37kAjh&Sw$oW1&!e?nLss_u?lqo9`gFSQ*|9dtkv04+^#Za(CXH!1LuOvo6HE
-E)kZ^7L_kqP(It6Q&!@8!u8*I3Z_b-akPYJ0tOmvld{HoUM+=Nvv;eKZLDl<IQz8KxAHTK0K$9d3sZ)
-rmSzbcMC?*xO7M<Tge@^;6%V{01?yFS*6%GpZU`mqOPsqLft1JZh6)n)IO$@NH7<{*$BM9XVk_!5&D!
-LRd+q4cuYVY$2!Fm=l!@lohhyJm6&a?a1{H@+xY2qAErA`+)1|eC8274PB%~(OZu17h7VkN0jB)OYM+
-l=3Rj$qxHVur7YL7Uxm;>F9Otr728-c5pP-07^iy<^2j!_g8`;Z7M_&P=v+7cK)4W=A5i0p)8~#7cz1
-h;ESeGn#&r{?*eM-zjne_!AMlpz4aK|hV2!xoQzCn=@e@6UYp3JPO)7@qfVG0DBLDJg3*7oIIh2x#`u
-1`ryPi6&A`Fduj@`~xpSxa1^tWIuWQlq(lqPz#}0b&f#XU?;vgm^u5ySCpKU*|WdV_H3Iee1n}8AX)z
-yLb!>cULL)h2;!va~wiNI8b07cVp<Yfpm(V`T@=QC$JIOGxI1!T{VSyQ*DMdiCe@~qH{A|jN~PArX}a
-e=&c$6LE~gLV|L!p5#d#W=#yF!P71?MC>~Jo^)@Vs!#S4Pa|iFLE2^OR3vSW+se4TAKVvfe40@1%0;Q
-0@3#E`>pcDd8J9^q@0vJaL3d0bH#t9UMXau2X9HvN|+7T7?C7~!H55vL)JKzVB9%38&fA<$Vrb6grE#
-=VCAP;?Y^svbJ5=vqDk!n)e2P4r(=9zxFl@GB|`cRg`$RmqRKCkyY7EcePmK?S{f7XkV9JmOFj>Gn>7
-sGyMHxVBR)x$tKK88DV=<;JwH2!!e9tPCM&U>!CU-_}fv*)|Xf!=8P$jy_FogqyAW$r5-upqkp0ZN_2
-M?#D(SPA&))G@EqH6a)8SCz#B!vOys5OZJ{;NL(@_4i@a|EVkZi(F5Gu09-b=!q4?AsPT0ea=$Syz3#
-#oNmqsUbfaYI>q@YwA8H@z3oQ6f>Y$@L1tW<HF09~_84(&)R~4_0Qmul7{abr2pQ%x%eMEa&M`k04Ts
-t|e1(?Cao(>mfY&=~cW?HkSNnYVgDndD6E)3GuBX4w!K~ob&}mCGSAd|G*Lmgoi^zr=`)vSuHUo`~m|
-u7PY2V+!6TrWuH+SG7x|}AR!8bF7G-lk$>pq>PPV$}u<5U^JGkD_<adhPjL0}m59X+`N9hjYDlj^rTd
-7-i^JxzIG<iHiiTk;lf+$>}6lcXL(Q`OV8#-nr{EPFzSO4v3gssR@_EU`1jMC_j9kY%{fN4I~%%{032
-{$4*Nd_Ok-+K>0wyZ`94`(oFB3v1|+A5t((V<ZIc*&u{L5R8xzicts-lhhvTND}`tLnIFAp*_S<@F$L
-?AAO+g&>A2<LY&{k5B8)CrT;Vi+A)m$I7?*IA!4xan;}PNOh1fE8b9cY__z3me*!1=c}*P&ANgk;1o$
-VLBR^e#d)|5oFn?a`Q5XAk>E$11SL9<NyPx}5W5<r1agVLhM|$~KV@Ey#?W4bm;YWcHBR-1Gf6bGOKN
-({7hp@(N55dLr8->Ka!*w{_2N?eR%Afiuq<oQ|$w&Lp?}4ShCjYYF`p6}GZx9f8dOkV`++VbhS(#71Y
-a2t_*<JOD!Su5WYv1G&upgasdw2u(jk9_FLN1|V%<nx6oJ-F?PITr|jeUO)Z!X}V><{~}qsA8>eyk8*
-SR4PhR%(IYMK!U^jidVQ&bPK(m=&Hob(|NoO13P3XPJBOHk#sXHr^b>g4*=0lX(<$L=4QObE{5L+`Z!
-5YG|u_O6v9gUP44gdG8G=w1+$G8v80#@(i3P^OkCc-$F2SHze~0oJK7l9uyg^Xq@{@UP-XVCTh=Ef!D
-CM0fj6oSEu(}HCX2Kvu!(N9ZE^y*mfmY5I~XwT`^K=NGN+lx?E8&MsUxD%;tvIf}ogc`!-KE=E8_VdE
-6_PRPRu9Ff3{^@d}Iqw#DKz^Djtoex(nO6*@}{uMT^8R^>u3x)m=b18JHRHaWI#MaB<2sdE#BIKH|79
-ircGeRy>Qak`LC1@Gl&nR#GyU-U?eSy9Kf3oMBCvKsUTX<*Pog65Fg=2ld)Ex_fS)g#H3+k`t21hXO%
-wC^q^Is&^m{R7t^J4rRsk*-zoEX~?HiLs1bUg$a(Z+%7pr!cmhQC<A`j$UozOdD}e)iFMg67#@Mw@!>
-N<MJl4?F?yfbJ-v1*~`)`DzqhTKpzl6qkIyey?`ie_DSuW-wvx$N&TV{`E@m4v%fm5T)D$Wi{AVBWHB
-<EU{0prRl#0oU=n!GQ|u<)NHY~g+O<sCaB@}J>`qf)`_AFsLlp@Wb{USo`)VvG_U*#FeDyY8g8<-7Yo
-9_bazlhU%PmqBmgF&Q^(ef0M=`wC&c`k$uZgX5V>ck`&zhPB@OQmef9)i!q2TVVJPaUJ=q;z~qNC@Uy
-GG6>4rb}w02Rv?v(Pd>cK&K#;7^xzSu|xDmcq{d6YuUM@o<a~Vy{%EkKthAr5(K?2;zaOI!dxbp|r%;
-$YUg4c*GT<h>&TsbfSO58v5Z!wof+ai?m)zEACI#>dfowvE=9@2MSdiw7z?U2se%1Q%CVmfryfO=S@(
-{y@sh%!Lnnx=jLLV&T`u;;`3q4#GWa6OKbzeP07{A*ux53jfO7cIl-%Sad|>odg_zl(S~PxCK9a;-of
-?O*~ZHwZ%jv}?sRf|2=J&=e0R%mO!jCbpY%-e-yv7gUVlEvlmYsldcR@zwYaL#*@=d<H>x2M9%<DDs0
-3euTOGb}&kH@`mQz93X!7Q|jf|zF4PNy8qQC8!&Ci&SPBE2H(9?o3yS@7%f)^+3Bm*TV8k2kJw7Cn-y
-KG;k*Yb1?gAK<JX)c4eMVk}{dS)a3XiV#we`{Unh}tD-L>nCdhY3yXD$)KK!R;l@#n^h?1sgJW3U3R<
-k2I~Vujrs!^d*7}U+ox{zrL}q<yA<fVF03Se4F?^GsP0AO83mGlv3+)a@9KPco*v9^93JWCoQN&xHN_
-uIzAkDda`&|`*c}>>j=N695SAMxV_JN_Cta##)^;Sg2SBKRSaJg-8)LTdA}dy+-wyoUCRI?>?!Mty8<
-w?ZI)wmoxl<qxK|}(P$H=^{&<yFrd}B1c5@Sm=Te%~G2W2i(I)J-{^p-2@G=G!0JqEX-vL#~KLb_2?*
-6|4RsWtVeoQPNY==?%lOkw}*z-f0A_<b9Q5+{x48}3+OFb%_{Ip^chuZ}5v0ja`qlq!kJ}OelVRD)yN
-9KlQ|Cz;q2CDG<1H+(0ZtBoLPYw}B8aWcZBt9s6hwT=8V4EGb9S#@yu`~2%Dv=2JQA+s8r0-X9z&rd{
-@l4=@P`JZ4j5@k8j}(_U6sltQW5a=b?&8x$Lw?Q*eM5F1#vq*?`U!`_Eb?CgRrkmmPgC5`ZWmo;@Gej
-5pOxMJ4}q%n7f|&rKm30gRQ<h9j_;sK8|tjqaMLUt#X%7PJfi`=!5inIZff6NzM&&!g7iyF<5^q3@Wd
-8DeQ55$N!`Zya;J2*Tg0)55P>o*CLTKQyg?1GV&_X)4?IR`YQ$JMg<qB{VGxS+w0no7GJuN%B&y>L%L
-u>pg9kf0x><D>G~=STW^-121=nau@<Y95Nv8820s5DJT`zOZH75dqT|a;-SD_32Twlp>S~)KZxS$*wM
-UMwdBuq5V*U%uQ(?raA1sO|od;7eEr7@KAfDll8T@>Pe^VnSv(n%2;v&R+Kf5}&J9^6#Ss*JTaAy0M3
-3lP%2DsuHG=~EKHjtvy{xNe=IN-QmccQkms2P7n2r7@p%&nB*SJB!x~>vKEwK}9)4sS?(t6MW@Dn2*s
-LAd-f(|Ei|&Ce^J*Mcw=`rO;5qdTOttybiHT#N#2uG-f8YJd^bv`ruTd+@^JQxB|ib0^!|ywyvSo87h
-;N)@?0_`ntVf1Don}#Am!yGohYaA5TIBSHY}P+^y5_{TCwvlW1&od{pq*aiGsH(3jVecgSf?+M(jSn<
-cm7e$EQk0z8rfVO0E1mEZi;O?6^Ve}+?R`rfM0l<Ezk1wrWz6v=qThak&nnOcdeqOEF^EqdG&%9ee;h
-ntU|%P3~Rh&utroxHjz2odWR-}3O4yUc^VT@-^6ofVZh!-GUV52x%}pl7GymHB@NR7KU3FiRB$@b<wt
-9!_i64sJvoy}zh`16AL5{%YS}LDj$7K9ov*K@5dE8dsy#a3`WGEZ~=(EHa!N77$|}O4MwCSmEu>PMVH
-vUs%rGin)6@3s$D=)IEgL+-s+kgWL(@Vwy37EDK?w1zRF*dFRtt0s+sP$g5NrLXS*tT)tc#E(m;#eq9
-P7PWgNmcI^A4p1P@~x30LD<9nVk<leyI%K%>vU^R}wNY706C&VK-5uU@9lvvTmh7FCFd+LyhlyFxFqB
-lvtg{LQ7u8KDegHBdz=Kym9#umTe5DU+5I?I{KURm-i;dwd8GtqeON5?-?8L?^c<V^EPvgXGgUks+m!
-!w5f12mEPYc{JFYio#+GMncwenT&%9x1qkbgYW0jz+a!RNv?zBr=%dR2bdt^sy;U1UQc!OMz#6_6$bq
-#{q;=yIdx^ou1jbyr5S{4`bcQ=+G6l0=7g~NUje`q{&BLaQmdw?#WEf#CMa@9K)9*y+?}+N4U&rc51_
-V{ez+3l5O86rU;ebbc4LKRF9PGQuvVP0%%pxT*9?><B7twz9!f*9B%{--as$fOVx-rQsTD0agWJ|y0J
-3a;mP#~dy9({&lsT8;U|w!X~fy8L#9xX-Jn3B2`^1Roo@YT!_oeN1&QLynf*AI6UiE+b`lHlVZc}p_?
-JUx_dO+0Z>l~K`6lg&QZZZwv8l1C8A)Y+J!T7?XzH@%ZZ-(0E}x#DtD;w#*8m&dCx`zAs6zi4sQPvH{
-|%@@e+5-AgwYU%kT6E!1dc)^jKDOF!4!ePBn*=fh99JcuRs+7A8dth<TIE!aL~awAdjLB2^~_|G;v5o
-9D3I1j=H`CRfn1d@iA;c4+6vvdr<7COYJXG_>l5O^8;o<@JDarGgA5?mHlZ?MNA$xF~m{wKQ3cG0rk<
-|pgwG~eXN)|E)4$o&A{2QIB@80e{dW@9}J59HTCg9h3G?d6#mFb;qfsh{g<GMlaF=#DEeaoz5)4-QdA
-CPUG9yvTC9uA>E8<QJD&QY{QdU<)d6#WF96l{cLCLbr-1(spgQmr@HL>)=JYd2@;eDn-lqh&FHDn>3%
-z6*>q6G$=p<bOphZBmi$q~;HOKdrP#s1q)2B~%!&VTFN(ko354s4ooY&KP^d^~z<oSY(BhC&HoC0ld(
-}+9dhA;h@KjN~!UY|o9-370?J6m=eZ8@7Psi##rzr8iL8E;{YH$Rr4fv+4X|Arx@lv0{oA~Ft~wR*xl
-R)<(NKowt(|7{uiUps%X?*;gYtvKr)b7mW+;+cx5l4sm%ESnQT_Mp}E!PX?m3YE@0kc|Sf!~Pw70Tn&
-+b34I$(u$~PO%WU4D_q2nK@fhdS4uTGaqGnE5TP!dE6g}E9AA?d_++_o0kG%N;T{r!Jf9m|<2-QKI}}
-o>d}9B0Xp?PA{1$s|M>So34q5*^TmZ6U{FoK~V8M!gJ9fWBx_^H3_rUkZBYz5bBtlUHjZg$ZlQe{p1V
-muOo=##Y4q-4sLj(*XUovg?95F?XY%GI5Lcrv~X3gkBH-P#W2SoV6vN}u!$v^cOhz>QKLq}&1ET5pXr
-+j;u+S9f@yE}Xli9`7=`Lw9f=|P^_)4XHgKT|Z`16iE>XZGnz+vDgSybd)3^t0dy9a08#bm$-;9~Z~y
-qlkBCC7?&98%0O13P(q<%afyS58=o5{SpuRgZ+@dY#{rUxMeZ2Y;NS)HVr+r#A`7k23O8s>T%70v;Dg
-z@x@`D-&v&xf%fBV*nEWi>j3q>ISc;YCk1?C*`{lZdh;Khr}%kMTv(C5hai97@}s@0Vj#`oXZ@^Uz&E
-qxpEvpyd;LXqz;idg)41e22l!x_Lg7srfo~f6UX|WHT;89ks1~YB>5W+ghjG61d(V9BxR2!f3S|KN6P
-6cqL0d(-Lc%%U8XW7rwMc+FNhSkLVGns3uSR%lr3y`xOL>~SS3CubvsN+Mlw!==&d>|h$ujMTq;hC%m
-u3|}0NT;u_^4p?_RQa8b>b)f-aIC@Y{MmTyC!VbYhEq$L_nQf#2c=io8m&2HU^^2jc@@5KRFhjQjJ?w
-E?8jwgSy0+HbQQFt7H}$hIWF^rJl|DEL#IiRSX5T;E1MO^#b2M;7}KXcL#8rr}jj8sJesR4C)JqmFu&
-_>CD;`n5R8R_8OA+=ESS|r8<L3iwG9_S|xzR9VkGhw>m15kC!YK)QK+D?{uWdhp6EAFg}`+YL=8SF_X
-*?i!+32L}{Wz7trPQ0m`dhlpYSsXk9=^8j|Gsd0C`zq?l8!uxZJnrVm|)kR_s-O*{8;rmGx|AzRwq3A
-nK78|o_d#ng`!!6lvSjb5m;NP$nu5GjipvKI#ruLIQ3wxjS-8nw{ENKkZdV*d#kwJ_eRG0Sh4CtrA&p
-FyB|D?DyCu2srRY%GHr)Fw8%&-K$L5+iH!=yHCb_O?EqCs5rfc7IeeEDVd@o6`8^_X&NG2TUfLOGpRu
-t8CYX+te3b%x2uS+S!aGpUwGr?&BGFNvmi;QEPKA8I__a?WsI^xwIIZdgH1;(09?F&9*(A@))~&9L%Y
-v0;BgV#{wMXWT1D+1_|E8GC)t)Cr^{;z#61q|Bm1D*WFh?Pp|kOJe!P+Yn&0bV*k;sY!}dD6UWuR5x3
-qyh+CdT2d{WtU&7fut5P5~k3v}=axV(-P3}feR_n+<d2}7Bz!={*UU)ikn1VR8EFh`c!3Dx!%=8jg!N
-2E%d9I)RHnJfR_ll5#;xhpG;u=4QP&5IQ&Enub2$UFk&~usQu_ejnbY1CaR8C^|*2?j8gTZEMOV*f9$
-nErc*zfXfB}R3+TmW4d0^~Zgt7qdQ7i(o(Y^6I7_w&l3AmMwnPpImIE^010)yPeiB+E~Idkhk{C!{!F
-Sj;A4igr~%@m>3Y6l2}Joy!I%%V-;JMyt$DIx7qIRJkJ6W8<Dy@8`6=CTS$yeop{zzCAF_W_asb++SU
-ItAt2GI|Efz0j$9j_`WdmI1MQ|g8Gu-j1SFeX4N{S&nX8~`jxM{&1+)!g(+@S@H?<OKcwxwNS$!;F60
-XX3DnkLoyIL#k5m8tPEsxgLq^%W1ZdY1Wij+wIfjX^Mh?PUlKG1W$ENqj!!h3<V_m&4w}eh`J>9{%;_
-g@M@wyla@>*U1W)-h@bUz2)<Vf^PR=0Rnvr<n}>ZTzx?Vbj5g@pV>uO%e%7#2oYFCeN;r!eeX8KAMm@
-##uz^7Q$sP*}63p9){PP`E#-B025flWTFaEbR6|$q=fro-AOy;Q4J{7@SOjY!8}Ckp#>0lvx;dx+oaW
-zQNi%?@42}Dh>F!nKT_E@CmH$_^o}z%=3nq^3Z1@m;6ndgYkb0`<(W_EKWP5o*3@8ef|x9`@ZduXzDN
-b{EnP{ed{OfCkm%X0^PI49W`MT1s&W59LI<~eI%g$1&M!2)XI<}lY&0vrWF0)3;5&Z@M*c<0m#t;L>^
-`CJ?Hup(cm58;2(kELthE`6v?rJ%dqEUdnUJ^Vb3ymtg~ln7;+TVkq_4jISTuK0-cU_sgL~OQT?Zn40
-F#AcO17TurYjqBlwfg9=cM<kpM!U&U^wsa>m0yf;{N=I}(gPgP@=K`@WHmkE}J1{t`MB2XsQl@6hRb3
-k_Wp6J%u$)!@{<ix255HiLG4|C%Qr9?3t^q(tWdyQ-(09fuD!_IKbi&!*{Wh5HZ`z%SW9?DQdN&BoCR
-R6X{5(EaEy9V9L7AZZ=je~`4^zqSbd^Rpi(2mZCwKR`fgw-i#R-5dM_tgJrFT1ZO_cdOP}lgYQ)Jh)E
-mGpW3mvDfq@{v3@GzZl)>rM@M_dP$(JmE<q8$N`p39{#08?R%Bu&eQcy=xw%FiwULuhiIN>p`ubKe^(
-n0ndIxO%dl=p;j`+`a=bAc;7dX>T)jRXOx9HkCvTQZ3q38FeU6jHbfV}#(TSW;^JU6e5{0;OXpiL1#!
-=V%A^-z>zC}E<BiA#5qsc8B1GPfD_^LONJB;uY;^MZU{lj#*S&7zk|8RIEARp5!$!9PGP!g+j*UgxE1
-Ba-L8~YaBCas*eCyaCL2vI@4i0f;ymKS4s7nN3pIVvEfhMO*xIY7=I!7#_L)78`KGH7mAU0t>kQmVi?
-dr=<MC48yxn}9a6|GqUXWrd-ezy(Zn#MxDWCY~OfeHI(26^+<yPuztdYhSxS<clJu>ZC?tGk6^M6m(7
-lC8_C_JbyZa(bP#Gkih)FrTTS4($=po@~JCCf^`XRxRG}mOjKNd1*4sVSpB|eENR5${;3elJ3&i$#=6
-V~w2P=<<l?=!+_yo*?1PC2Rxebe0!EY9O(VB@OR^Now&_;jmj@Fx0fFF%;|?s@AwX!aZx5qsn#o)k<G
-H#<Di(Tr*}&dFYkKZsAAa>LZoY>$F{>_6Av{V*sHb$_)Up9^U$TOWplD%jPOQcA7HCC3J4!4>Q3=KHc
-LY=f+FS(x-qZ#B?XIqCN-sIe6G|JWi2bB3q}WtY0s^HQwDUJ?B{L?fo!wcR1AafS*uhk<aSxH>-XdeV
-0=ows;SRT{WX(oNO@~!Fpf-mbnmL9IKBOF8CoBC(M151YFBCz3hgK}kUeJ?PIn((JJO!a{@VRVvV0q8
-=?cxvmsgTN-xl~L{@gd=-jc}qF>q?MHR}w)C4vlKZkJSY!76z=_QlGEos#D<mOo4iQdW1A~dP|csKd1
-9$G(hx(254GONZeLikI1XsX}Zz83_%PuK=pLUL);9G)l|lKvh#yVK@z0`1@!f}>Y>NWq$dQYF~GrOkn
-R`Lqizw|8N|b&tQ;Uod8_YyFi`c5Dyn-+I0<;KaEP3pW~&KZ?Hx0p2(4{j!#au_(wq&I)XNf6lMA8)N
-~ey}<g%B!58*D0<B@AcYbNC2tw|4VV8A>LpCmlmjLv|i4+e?=pPxm`uqljJ4UmWUGog&=GVN0?!4rZ(
-L6aaGWmrZm&+*a?7ot$VZR2Es0!ul|GP1l8gK0p@OVt5HOInT_>69})qW6mcR|9QMuaL3p$QRlHJ3Za
-l#F{=4MqQm(keLOr@hfC|qs6Lr06Z+Kc7ju?<mj}TE2ON@{WsA2zT=?+z2@ba+JXjth^Zbt+mrKx(mm
-LK*<`lDK(he-DEGTbuI{aQ^Owmb8NI=q*F09DZ9dr7RP|0W3NIb@sh&l=0jclQ!?03g4@-0V0IU};_j
-DXtR^!8hmim~5Q`#A|Kv1nHSL{1j3p(^<6%Gbb4Z?FCljfNJde@gg4kln6sW}BL7wb#D@k-`(H&oZ@u
-J$!jhyEYPR5MMqwa*{5^P>j!ZPPDxs{h@7KXBDA`}|ynN0Fl-MbR)p;5da76iFR2)G&g=B!WT^j^QYE
-_+Zl5R{#q`Khi__L2B56Ql1@T%Y!a{)NnqG1?mvN%#(xikP%-3ti!15qy0?a#~66_Y0oA<T+aL;Nf6m
-VJJ<nR0w3&DB09FD*?+=+R*0vvg9VX&E&$69rUdnYR)>dHeAJ+J<d>kwY4(li$LtFxjuFXE@qItX;S!
-%8MXDq|It}-G*>CWh>=N<UqSN0@qMGjj%VC=}-|*&CF)fZwELJ|QO<jfY`h|x(um?^2iz?6$&qwaAiK
-Y+VvxXiu>oE&IY^zu{_5}hs<Rt&aLuZzM^<n=>5q|qu5#Dfk75KF>_Ahy%_UKI?f?GGm)xQANehTyZ7
-5&}?{;l}_DKXi92C(>V0Lwf8);{N`3RXzcCDU&ekVLdp2rQKQWB_A#gjVX7hKqY}t)V-^Pdy_K_rWO4
-JvV&698>RGc52bs)(T13LJgn|LYAonB(@wLtS4ss<%|v)o>oN~gv8_2%1D=a7jLu#EPv7i8xyJiN}A2
-Z)zfPRWPuT5sW%Jt(ty$FZ7t2!Jr@#sxk!drVdLO;pnHF6N<7xmJ&UoXaua60H__elBLeV@v6^uSxAp
-A=WyP%CpdsDA`!H5KXq@DIpCA(~xlxrOUex;;?348MenC`6J<cVp0yHWlx8`{wI+t6w^3vA~7Sj`{`f
-|J^N#+>>iix>=##c$EgOkazr~SLf7yJwwtJwfmv4;w!mtO_M?bAHNL^}6R8oPnRDB&jzAe+G^yAY|)T
-CJEPCp5`I%BEAa@|W!ALl>MexqzzD$PBr=_}*tpyD0QhGx{-TN215-3odtO_9UL>N9B&tdJ%7QA1~SS
-ECVin)i|!I8t!(L2?s|@$;o9`>0Kg9ou1>6my$^#Z!PyamSMK4hEwyNpdm_4cy`}_4i;ydK)WDfxOlp
-)l;*FbH=^kE<=&($;|cHNz7UU^O2?oH^(IUgzgFVlLb)_FO+b4Zb5rpK&2uPoxJuTYs`~VCwIwb>ZXT
-AT!fI|79M@?$7fPZuOt-CCD71uZ5;qsXwYLnenq`9b^W~<LZB(bXqH-S>0z)*+od?#V+89|B{hT7<eO
-8~XnP#_4WX|!UTY>&{v+}q#pKbUSu@~+;*FEpG&1n+x|LTN-{LKjk`5O}o^2LNgArytv1d8J@1yd-tP
-cIOGQ#67@&_3PluTcd3GGjlc3H%_lB_B4~o>K1_HW?kO14wjqtdq$>G($d<4)OJbf=5R}o#h7`?pOu>
-$k^eZ1q$->7WHX(I#w|7quVLTKh0M0pSM=Q@v#=NXaCXX_<f?npwIdRa*VPk@P~=>N1tS$z>dx?<e2s
-Ll%7J58#!onAED-b`ba*V?9eBfkFY~a?{D-Vd?u9j=LrSs0{Grhmow;#+4a8v(#MPbZ<u-hpPx|HKc7
-$zVUM4-{ZCIQ)jwIYK>X*5B=%#u0L87gnrywS$WXYJK{-Aoo>WGzQYhrbUQ&t~Ml^Pk<vkr$#rSSs&p
-tg|2(7{%QXB$4bgCSq5cLPD?U<52D@^|w%stQM-a2IA_dw)&uSGEi)t*tPxzG4z;t0y>f=So60)W#?W
-A8VrgU?I;!jsyC<)#An`|E~MxrMrVx5bBHzE%3o#to9G`3o{k;>s#cFwqx)dXAuO`W;_66@^$(P|h^N
-*U{yQt=5kIQQv(sPo6{`Ju1<?POpOZ;HfKlAvi3gdjN57&Uj+;I|xzgxe<}-l#!C+5ooiAv?<M1j*v8
-xLLU^IzNsrH6?s&JmQ|*AA8ayUJ8`9VgDEBGCY5xA4Kv5f3DRAQeS<I+PwW6L5k@u)zdR;N^-gy5?&}
-*7P1E@nTL5K{(AGvzOeDKOZ0;!XL^LYw)Gl$JFJF2KiCH+g;*tiLpCTIyH&eXYc09b!4iQ#B<E}Lbla
-uUQge=hSP<Fj_%e!EoUoZDKVQg$gDqN*QjG*r+QyXCRFiR2a@#-bC8$fCUWa2kG7HeC7CtZA6JO-X~5
-C>@soSwFuc^pJ2a#1VT)w@g6{xxa4HE!AP1SbRl-rTi?@SHTDHW+F>IjLG<r3IOwJ*tn-J)Z}e9$h`=
-?w(?E;OzP4@vi{#oV)8MG60S6m^ai3DiPMV>t@9nyteo(<#G_s#=mrT0KT$!U<&aUcL#euUs+ANnu5<
-L^2xc@?u%CMhTZ_~zoE|gM`HbYmCO!XuomP>SVJ2+yb}i4G7QPx&YeN|uL=QFd0Fp7vz#P)JNf#OU3|
-$;s2MXM^L^K&I8fnejF>0E2pm#9EM$_R0Ypx>WKBjl0Kno2wTkw>r57y?JR}VFTSXgGv-PUKm1iyp+q
->4Ez=Ud=PT3O^SY5L8-YvOG5f2-9;CkPI#k7MpJ`l=zV-!miMxpYRFd(C0(1{3KW0c`?=H|I*syr1}I
-#s@n^VmAq068w2_ROH?(swot6-(OFlAQR<<J!XNyJ;TYe0x1q9ln;<^Zh(!tVp#Dy73oeU5f^Yho)Yg
-UN$YgpkYoEB4UlL))VU#!#nwf_`X?G^qYBsBVV=8x(axBLCQijy5=O+z}Q=qpt8mq^LZ*z7+p)R=G4C
-1yX3xX=qWz@r6(05F;T|nV?Q!u)uqPm)C}zA3LucX^EH<gJgcAj?a>;&GIoum<GJcUo7!OPyskSq!4?
-FR+mL(GmmZ&xgrM2h3+@C8JV}gx+szabyiL`GDSFyjV@FJEpU6{1ZVX0LT&|_%DlLP4dPusMho&qN_2
-%=W!2=|5sc-UvUZS*}#c?$COFJ07PRX!pD0A4{->s*X%ELHa(tro0NqHz*67&#xvT#fS=*p`*UAuVG2
-^J9RO%g?^xQ#Om6eG}Gkk{zASmO+(LM~fp3Cs;*5ARQwx-IZKcL41ARswPUFDKUM-^4-a-@rlWS2$?@
-OG7k75(IMeV?sM5La9BuhUh)XruMgS8vT;=5kW^6<Bnl=Op%iZP)Vtep4vw*=Sa0b>k#>;S(75aRt-)
-Mm~(K-lEX>j=$wp>KR9);{R!+i^qUGXk{zQSjg;uIBtraIFXl&~_~-=4Kdyy2d^9Z_=1|DNK*2u7h3S
-XrvFH7Vdo_HB1sz_E@d1C*=n!9n@q_KQUq6H%Jd^kv2ts!>^jA2D9gg|m8-Kz<@XfyIO>i>iF+#F3ON
-;AjSHH@xG5D``hyMrz9S{ik0|wguDF*sUv-iJ(fer`+d@#^<v{q|BwUvKo^X;je#6U8`a?P!yLN=!uy
-#WhWgkzDaFMHG}k(D1STOD#@O>V)ff${{~f6e&4H*WLRC7y9__qdJROUp}XODNL!me=82_2EENz&|k^
-`eIh<fnk_#Y=@!!nG;!Dm=}EG#aO`RUzPF-U183w$dvq^M*4QUWN4K?dVqcTPS3uANEB9Z6z|aWon#`
-{nD|o|HItJ~E@8&gQY-6LPtSfSdu%8-(C8Rf7%~kAR!f$2YR*%yHU3Fs_b)$q>~97S>~91Q?5p5GlQ;
-!Yd+<PM5`!TeIpW9hUy3C62?L=piu}?m^>Bdu=p3f_q0I=BM?!UI8-B#P_l<daxWQo`3T^WBvS&^l^i
-v8umOWGA$Zp~f#dc4npyZHy-1D+Mx*RV)Eluzz<0AIo^PdHeJwo8=K?uV>7Ia5ofDY=};g$OFZbhl1Y
-<J{N^zkqD$piPiEBVNp=kZaYI|yXRAr^MT#rQaUzY!Ap8}wL~I)cZo{5g0~BFXb}XM*1T{d&Jwwr9`3
-29NE3ICwz+-vtl-{1=)O`lT<cbO%A2etL_S3>w=E3e|vQOMot+7@6;joXQL#8gx_UBz3OGTh`KD(y*_
-W9?QyIxLI+0$_g{ij07_b`i5C0g|ZJoBhISA(ev1r_sffgL0KGwBIfrPgU4kvOH(`EE`MI70=`_S`n5
-`>U*F5t)$x0~BhM)ErZJ(gaPUB%1%9PI|B#tDzf?IF>HIDZkU<A^dGZMy1|KriZ%F9P>sDPZ^$c*2#G
-uY;$WPSJgl6lM-Bov?%`fDIF*=yxF>*P-T)vYOpN~@6($@|vlXA2)dl-EHzN~753<_UsTc75SsdT8p>
-=5|kQ#|tzqLDf--x&6PbX-0PHb36@!oTuwAM`y=eSN?mqZLlmd%!{|1o`wqe%21?BV17^N$eO0h9PwS
-4}xG6jU!+7NFMM3{xCJ5kA7c%K%O03(D0#0v%{Q2!67|X1`f@d<jZ&kXNR5x{-M`H(ZTbeKH=eTUq%i
-J2==i{Ac%v)4}Bv{eA+6}{Lh3Zup<QRdywDcFpwkWz}WAE5%|*}Nq_nesQhT{Oz`8y{x5_a*SQ0n^g|
-2DJ|U9G4yNr6;^+?`O7Xue`h2uxi63Cc<(@=?LIeLCx|bsR8QvEjw1lUT<iEDAw0;qqbp&@2D#razs6
-V?4oC)7K^WPjQrQe&ZfDgC-@rNCLH$48~cYKzAFk7{afi*{4_t)rmVk_{|#)=hxiJ+S2@V>^H-y&!+>
-yG4Mzc(0s?6Uy1;`86(!@=?Q|G0yNEK|@3@9)9wtHKcQr<EZ+6KayO8sj+!t*%|=9Cwix<xcW-e{IC{
-++1Q*0Lr*miVa1{cNZ@WtR$qPST8NsS?x3jwcwqc@SVSr(49!mP~^mt<hUBMX9_BzlQqCS4@iqGk)=x
-J;9=V}QqyL|Jn(%EDE*;A-?uvo5uG3|4kk(leNQIIS!ujfG%38o0I%8ibX;EO+k2yU1bGjZo5hQ*UHC
-x=?E)$pk@N9aoZb3?Bwgytd$~L{PTx8k|9%3u?m-DKaxHGuc6CqAb(!9`^J%{F3mi|E1`g3kHPecDhb
-s}<l*2ckgWc^_pV}x;F<?7eu{?2Nhc&d#bVJw*!>ZjM;Qr~;hLj;8nIiDf4F6~Z>zz4@+!Y<^JzCK=Z
-%hc#gi}ADkxG$dL9LC}Zj3JA4-GVDT(sNU;INCAy4Sw0?pK?F8VbzmXDQ5`P9zoH02My_yw6>qZ9Rn~
-Sy*sOo|W!dQna|dFswaYo|6&#cmKU95>wjLTW-in1{t}N;(h8p^U*27viQArjahkOe0dRl-UJy~o1SG
-Z6DdV%hA_QfJV2!B5s7y+BYeKGlsN@82vCo!#i!I1+Vo?qDR+#;lNKXVCUjvKl&_QUSZz7>9re-K_{~
-Wt9aVgolg{PY$&m`U;loLd7F?WhP7BkjyN-L(?C$T{rp6I_*31q=XTK+TFktjdElz2K-0ki-jk&!W3A
-hXQ<p-A|D&`_`|70EKn>4ayGrY0m7VVtubN$Eym-%QSZfEt(ymoNYvjs1(X2LO6kVTROC6Y#{E4_v{c
-1n;MictkuoBii6ef#+X$AA8WL;FjEiE|RUI|90epkBn0vfuHAR2%^02kQMx3+HJm+H|UA)?V-Z#P{Ml
-uI}ls=BoB(Nc+~6DYl_tz+;y1?>lYkiA3J$XQgnnWh|;>JkT@v792*~f0#QkyG`?{#;Pj~uv^F^1r`l
-W7sAE4j<|EGK4o1(x`$?SeC{@lU*)}(Gy<JE(*7-#@NV#MW@}%uV*r&f!o0U#%L3Ek*Mb%~wmvyKOWw
-Fk(d^XLu}^9ms)}AP)d?d`G7OFbsd?yraWW0mtti*+ll8rYz@PN28`&A_r8^ei1Cq8qT;vi;iEc@|^>
-;=d!vK5?v~mh*REBUo0bZ}>(Q>ZKcGKHIv4KOWG|l-9F;HWayy04pc*8==*^2{nrshX1^AQdEQ|B|Dp
-Me0PA!o#@MzsJ%HN0dAdwrv|q?l;IbuKD{-id#BcTsqzQF`f^iOF(p|Lo~SzM<Lm1SmX{W=(H7OL2L1
-OiDmZh7x>cDYDs27adCl)#}LBaxXXH;fEBsM@~~Es8@JVE`0`U{qq7kpc9{(Y8+qnwQGh`PLoaU)#Sv
-67csv*6#v0vc6ZmLc6;OS1JR=CyuD!G%mLMIZ6k@#ex(i;&im(n#%AxFRaE<WoXv!Mi0)IsLUp<ec34
-A?nBikk<NaRjFRuv%7Mk;ip}*UWDaH+}Pp)E|&?-{2HXiiMH~e*^Oybp{uw1UJwjqu`DyjJ9N$XMv1k
-fr5-DAuHV>%G0dT$*|!Aoc4GKy}bT&3`-@Mny<Yt39QtHBg=-~Vk~=eVrwFqhvhQ8WH#YromH`rD;_9
-C+(6Qhh}4^0)uBgSvifK7<cv>>uTt{l=Dc*}Sv*w<-J0$sUIvYgImeWBTYllzkKZb~z3i_hY}G!EpcY
-ZzuUN^17#_TGl_Z?KsEpSMUpj{Qu+ieMhVR=-Pftxxa#?X>tHk3O-B#4wI|=WB!^Siqi+aBM#~a9vvu
-^%Kj7k+EE>aj~W+&9qimJIjU!STE4%?(xV`Te(HNWYJ}3mWGkbN!P4}jF8OC`kr;6td^DPVuq5_PyE{
-6tD*7ql?P)s}eN14}LoPe}tXCdjm^eyxS#%&)<kM?<n8FiBOV~cnQ4T!7>|eoBJ~&`0H2%xt;NLuAzd
-3h7zo1V~kQd-z2Iz@%hSEBCcD2kwg^kcv;Ct`L5svKdds>ZqlD9@kjfXbNMgGzO@lCIH2#V|*+|VD!c
-n5+}Q};42tikP&_g99%X4Ukj!12v3)O|nCRTPgGRLzFweIoooP?cXTHSl5hXzx1QSi^mgeE|GO)*b&i
-t4BmOGsygKKL&CkXgQj-fbR`es%LrTqjpXAy<fgCq&Dj~`(GEDkK5^g8Mr%c(?t)-Z67MWi+pPvzi5>
-^8)q5T9q%AML)zh$@P}=hyw9zF0MEdVo?W-%1C0&7J>5mST8LL>&F6mA7}4+H{;)Jxp3UD|c=@e%_h-
-^ax4H&oUg=`79umZR%Tid&f>lSz$D#KX`R~HKDfh!aB5C0Je*bXt^!D3h4v*c>Ed%>KFRH`z-`#ta?+
-@wF!W8Q!@`rtZdWuU{5BIZ%x32s4F@JkbfaCCpb~e8kD+W*SINP&!9Ke46RP_C?<8a6Aynh}Tc@+C3z
-&fAL_#imRGAsYvq89&cQOl&5<9)8UeC*46bWc}^7YRhP5vr_=-t|V$@Qi^F@_E7svvvrx_CgL`YD#Hs
-{V}zy<g{0;F|h$#DMGIBa<zLveO+N4w3zB%)LEdz(l(vqOC>CIj12~Iu`Wg*^BX0l=Y&K`dIRm(HnAQ
-}$Pg^+J)om=GEW4|fXi*`S7=CX1H;gczIHmzQ(AEv#f_T4iYMs%sd<*GaC=I9&LEkhD##58qQo49eM+
-3MLD}vQx&vqAf!P=Yd2*r3m~p1g1ag6?+I6*=JX5V-$d2iH@wuwQ6Hwanrh<{c^+^3<-v~Nf6IF!BWi
-e>q*53H&KWMs8$?RpCyuHJl(ScKr(bZ7Q7%T@EMHjJ*?7(cf3P0Og{e<&E=OmSFEM9ep@`M=%&;8&Qi
-v)O7@kQDA&&5ao1QhPrmTON~&ac&ryf?z4-rjUCHLU`bmyUm@nTNug*VxQmdO0}L;Jk+9momQtjFf@4
-R=_V=%yG4NuQ$qg>x!zw=xa<}^;X$5Eot2hLX8kEASW0XUq(%Pt@1g(=D?ma;uxqAD77ZFem5LS?*%e
-Pld&Aa%77Km=&|cvdxa=X6$sJy&+zpQdoVP}{xxDiz0GH_@6JmX;nq#Y-b8k<E5yoBl94@KyMyS;!M5
-jyS5JPqdO3;Cxx(FZe-2icOaQ9lS8wbdVD^HaR@j(Nb<1gE(cCN5$=HqZq3VTO4R}Gx^L!tb5<UrYqP
-*LUbTuyDVJUhYCWv`@t=sezXI*dX+)?H2C12a@AMjSiGsk>0a%Wse`pv?Bvkb%8L4fEoy7=4K*#G&%5
-WgLJ8J6q>zj4NY{9meb{<U89KQiEVbnx|He}n-v1kn^t6F5X-5R5=DMSN)}j~*P+ls*6eiXFW{_{XIP
-N00h+_K|fUp+iFp&JTLemy2`xr{|hFDn!($8Tu%NqX$kvKg(*=$FeA+k24S-U5ovkB=%#xf0v)gj{?^
-YCQ|4qcA@CUxhOrV{vXwfqizp>yg|Paq3HamX~pq@XYlNxT0!}Do)Y@;L_&_@I-Gu5jQ-O5NGOjI3(9
->526ApTx6{N*#Iyaf3p@A&KmZPeU_#hF88Y+t`qafuJ=4V{nYXUaBPmSCvpv2RZC7VK-Yrbeb8Vis_l
-YCi=QRDQmW$@`=BQb}%M_dD`OJorb;wctUdQ?z#Id$+v$g}#?stg_Ky&z`@P5>+7Tx>381Km2zI~sDA
-F$!IKV9;#R}B2qOaAqWfxmspht|gz^BwSw#qpW&xX*-F@C*`ZKBe8ERLWv<({y7FK`&q7K&FxVUEy*s
-Y_4s|kvF9R&K;qmj`?P4!J3yR?Rz%A=0g95)_IRg;?1eV_LYphml4I?FP}0!yp{UGO=@4>*a~o-&mAv
-}bXy|}_29V+fpo^}`p(S$y-#x0DFd171%jI8)t6jIdanz2zn^+NXwLbbD+3o7qlbok_it%d@NvXW&YL
-9g6O9FQ^6dLAA42Dq_jNFr#_f4m&GNdbt2OcxDrkHKyb@z*9v=TD)tjoJ;w4i|{(>hfb}@vdK=LqeO6
-4^>j;YYxiu+CQdb3&lyyM8z?HWLHrTluD1a_q2;fY076{Df3k=XVKWH5cEmgA*fX6qyZM)!B)US&inB
-6GPhY$(DA5RRgSAec0ZBBS>5sA9|9(L8xo4GR|uWH}Er)vR_sKXnU*g86EY&*J2l1SSo2dj+=Qtyx4~
-U;C2IlPuOF_Fiutn_9Vc!9(=Y$#-dJytHJWkw)oLdh(^Yel?@2C8+oSR1~rcHFY#T%xu^W&q%IxNwvz
-F$dL+Up_I&lOG`o-R5T-9hkNdRw)+x&o)=NfIG_@xY*aT(#W(UyGd*by$e5Y9mseP8A=s;B7)Ms0?<b
-{<>O8j`rPJOetES9;&n>fmm07o*<Kk`R;WE=nc!Q|et8ci0)Kyk9E>3wi!7lW@y<>DYv!xISaweo`^D
-3SX4)`Ns`KQ$#Lsj+<PT$5dYH!>1T+#JnH*$2Ztv`YW;4c@ZzaT6h3VZw8mhI&Q&{0e4t1Ww8-{BS@b
-Kv@KK7%V)d}0y`f<k+upV?b|Rf?1j%2P2AIzMY`z4j6tgbi@EQd(f$7&aza!h7V_rQNW!b;rE6hePN3
-YgI`hYp-L*miPP32s}u9s1o75of~$-0nTXbR7PQozVrqilbIMA`V+;8Q0-Wqq;3C7#rfM!Lj9>i>1Eg
-vtW<Ve!UyvN_v`*WXlg8gcBs>=!Io({;tPq`CH`EmV+2=MRZ79@yiQvt;_7HLTndhN%ExYuMHM@?QG9
-t-)*#SYJ3q|~!IQ7Z$*t?iTC?0smkWM2E{QPH9GK>(izy9Zgp#RvG9nRtPX(}N7sU9ARr<DN!OLGtkj
-#oEx;RxkOB=|n1oRw>C4*^h@!lPp#1}Y?1oP#xXMvJi07+=OgeN(mE$;eaw(Jp%^xPI!ZGq8)TBtw(&
-8LZlH|<HjLu!=CTj%t*<{~B)%X$Dr4=TxXCiR9#k5<a_bGbc8@fjybT9EG-4*H0J3PGQvmK872Bf}lR
-KRK3J!*TyIft!W#+m`3j>)yPBt&zokI`MZSRqkBB)|1-w5{RN!Sn=g12Ta~X=QFQDlVjWS(!T(Q>cHd
-ysfoNcwmLSg<scw@=Nro&U&ZJ|5z{H|t6tYBEt^0Ro`vV3d`w<F>3%h`eP&7t_(nbY%%)B`s>SWKJzq
--H^k)f;A?n^G6IA?zrNa*f;@bY3;bYbx6omivsnvXc!(QJ**1UhS|Kqnb`_1|f^*@ek%#XLZZ}pTU8n
-Qn%!2CaUk{`vMFHi7ORR<?=1j8_h#*bx4h`_$~^Ei~c@MFO-{U9U=I-13ik0E7@d}!avA>4|RA5Sv;Y
-raH&w3i=kN8~{ZPpG5rbF5f?kRd`Gm6jbP?vO5`elOST$ZrRH(4Q50QtVjKq?6;w<Rc80eOxdT_>k8*
-Y}@EVg7uJHB@bYjM~AD&zBBdFn@zBT@{yxQapw>igO8o}8{FY3PVSfTmxUhfz;nwFzJ$W)ub7mijUk!
-v%l2?te0;A{0Kc#DnWpmxo&+<Ct|*Lqf`8X6bLPLfEJ|l)FasaI$39<}NDXBU{{S>j{=PIAe_Qpl&M_
-(%E?RG?=ncurI%>&2!W|T;k9pMWWIx@v+RmB%u1Ch}Q&N62zl{8_3lIU?5BSLh^ZSbDXTkG#1u+w$SK
-!;)qV+lW5HwSr?^-^=tbJsAc5qnn$Y;f~dh9?@TQnzGwQb*4aV*gNB53CF{2!Pbg~ry0i=;3F4!^_DZ
-@0_Nv-<rR9hmlWiOQKNzk^~C{?{eSf{yRcrH&8hkrgXK(JkB(*VKxC?x*|48R6zR`{M&Nf0R=6d%7R+
-NAt^Hfb&le@tcq3$1(F@u|R*T>;inRyG$5?)|tvFccs^sr(_Dn<pnpd%H*n(e3o2kG+>Tt#!9vkPIqn
-FHRY~M0c%j%HN*{Z#op(t+QiaprArvGS&)@bd1{mpx;D=X5qnr?Migwa8E5vZf_C<aLp|V~y`a+P_qn
-2V5aM}tM@UoD7ycX<kdYkXLBQ`zcp2T;CLuUGy-!A4g&U;s?-$%P89*x}I7>KZjEP!%*JwZr<H2uaat
-5z<xw_OErvcJ*wO*Lc+mkqj3&kbXM}HYfg!2GC!0v_W)2(z3AXPyZ{`UHRs{4{=H??HzIltn~iTFe#x
-|-1l1OkaxG&B0X69^E${sWzBm+gC8*RETyBHq9!!W^^(9BHqWnJZV?c|drLhk&%3xHhETLz^2H#tu{W
-+$Fa~NEP0r@yKo;Hjp)RAYBRYBDN1m=;y<^&rw;zxOS|#@9k8-OS=&DD5>Z60C4ebVT1Vcx(r@}Dywx
-1|KyPR<>b%K1%7!LsOx?@c^vr2(O51l3F-;N)pG{v7S)bATY4>nJrobSZqdi6-WMjotcP^rv6^d-*Xc
-=k9VP+?jMa!0wVu)w%24YdO4BVI!0aCKSMMTvOn*8n+n47OI}6@F3qrOok;I)7M}EQZD*?(F)N>*U3E
-R)tBUaytS8_|`RH7ieR@ggC_a!C@e&lIzBQZ(Ng~H=r-`NMJdz9h<ueNEFszuHm&h~t7PD7x1l7OsKj
-R?viNJgn@@!(Ws;W8&97>$#e#aDM|B0MU_0gz!j#Hb1J&@!Ri%e_wHhQEO77Bgqw+!$~P`)8&M_hF?o
-rj@EGJq(nvV#(m9BDw-=bvU2PBY70dwbBN)Gi6)lJ4|NEzX|@xe*^sg6L0b_!T&p55<<W*P8~5Af+=e
-Ifm5GqCH=SdC?R)2&&Pb}y=x46PY{K7RdnzMe(bGB#6QpF1mr)0cvmrp!LC5sh{WzAO6_XM4a8w&NBw
-<JD!%7(wuPzV+ev1h*Yy+Zhlo9y6jOVj8Txh*g@d=66W#Md8(%@GT}<i6Z+&F2AKZ8V_AUo)Z@)2-jX
-LbA%<VLIS6J>=qVfLT;ofKcSJ*GeE6Xy>SATX<^3Ta@ix+I|Pt8~FT+SZ<esP8Y-sUV7!+bNpdE2ABF
-Bre@9Buqj1X5V|4-7OI?u|f(HUnb%hocKKTHhd$8E?4f+3>oHl|(_Ww#$B+>~WFS?d?8F5z2XkaNsLI
-p1#&#3fI|QaN^-e*e<+&vyAWLMc-oNhg$Rf;&<cO_;s3CvCp>FcC3FX#r17ebLCDu<}cS(M3lAicOLY
-kUi7zl5b%Wv{kuE}_(FvKT^{t$hxjKR^jjYFY$FN;d+DWIl58y+(qqzcMo$WXr`Z;zoGz!U#XfFGQj+
-ocCDY9X5*1ZzK|s6raTFof*OLthA$@g1ZTR9Wry6Fr+|fskx#C4}s;FzJPrB7dGk#~G<$~2LIhH*DgV
-aLH>C(v<F3}06<=iVDjqT3I>Rv7btUeL<-kn9lbp60UZzBV#^a8i;a*O(N2OzJ$x*Z<3L8U-HFDPkQ#
-UU;`@*X`s+0<tJK5~!alPd$!nRNZ|ByaB85@GOA1Gu>W-0c=PR(&*Yk~4VuMXTa4dLE`J;@kczLu@dj
-*Wg&CX>sE7<s|Zcr!zcCzzB5qyBP3STvjIcEW_cc93JqYLs>k|*Nt$>baD1DZV}TwK?PAl46a)S{kFx
-X)^jmU_H18x0G(CPOpHm5sL(#5cz6@4Bu~y+j`hVN3mK1b)}0LnZ#-htiV#)=#w%PC8=1{{k_1{?B|!
-gmzIul>?eJ2a`%tlKx%LgwXtAePq7y%8YHXyLOCvnrpw68uma+<{(Yz`^O0CXGqU1vu9JL36CufB{su
-Z=}rwqO<Sqvw4qZtEOyt@*N96)wV9~ZiQWLhSX9tzaOjaGR~P!9<=_%}fzgVsqA>}tGveGquMvFY|Ul
-;C3bm=GO;COlBIagou5I4)5JkXK0R4NjcWx`fWyX(q(kDDu9KXLmzk_Ch_64U><^lM#4)Rh{n#|3tvI
-tO`kvnI_;?^LPcSw@@`pdzd@V?nC?&srqs*@Y%_~L#lp0_(#I{CY_1#dB|=<MnW1*t)Sd95Bqg{41$4
-VIK<u@Ai9JDNf&N>e>iq)ToC56(f*2ZPVl_=4%UNqk-JSqCyxP5ny&1UU^sa!NnP{4b3j0`L(9MC8r!
-!rQG~?;Gy2BYz~*@+D9}{2LL3ckl@Cy<)XNb%*x0jbJB%j037H!i*sTtEF3E1Hv%0$HV)FLo(T0<-Qk
-v|5>w>mE-!dsEwh68e{W8@!t#{o-N$vvc4#0}rJ=zRv;ER_ry+}r=Y@&sOfu~hY)~A-V=^zs_wHp`S&
-RV8{1Ys;|529e%xIW;Wsem&TiCM1%Q;>ScFS9B-^a|dzUc92<IMs{0wBEur-CZ0>#qbIgJV5r8k5*y>
-NW}8Bg;@1W$whpm?J|r`+HKJEe9DMu;<#RY4Tq2>g`5qG>fkc*OJG=9AAAe$3E+zR=p^?iT*n4s)JtU
-4xkGo8jl;ID=&lA!ikypJhKR1UUEaBVr6mDJhFL9ab9tbE5zh^NqT>PgC9%1Llm@LMpBD-@MX=CWC2{
-o4<YrcCLT2=E$XI6kz+6vD)Q=PWU;ug`W6U!>@`we<X`P#R$#`P0luA?Ryf)9>MWC9)gkd7jRZUcD=~
-JHikmhA`vE2^9Hj1rZwA)2Inb*)k0>rGf(7em!4C#iWY8q>+R{NYg-!&oZ(nv9iETEwb#eswQCjdWZ>
-G$dC>3=gv^`Bb&PxSQkV@`^~jwEtKsN=>*NgTl_@>64-eLxTL4+P!IZ;-!>$u}lQgm2$xd{0JEZ!!6H
-JSP5ue=dpN2P?vRKOTj>4GW3=b@<zXIf3@<6Z|$4+-(Yicc)LVr>%&M%tk+x#QVFY4)&f0^x<N#4`M`
-i(K~_d?t>)x{u%BX{*5^AZq9GFosI5pOqhHRXpG~%1#r7K>ccXTc;Dl0i}05zDRECp&EKS?M1z%iGIY
-niEA7*iRQP`|CB?7w{R<W2zDr4+?jNa_kD?`_aN_(yKgCsn_nM`M{ZX?-l_H(5a66~o{C|*|I|^fcq2
-{;msJU)^q~g-_^fL;|d{EHSWn-Xwy+<uTS|2^IjhZ0X2oYrw=(V`Gmr*DE!r#!rS=FNkpF5$r>53kwk
-z!iie6EL11pN*jxv7Hc6KAUPjRu%jqH+10cd*c$U8VN%DF(AxzfgtnVDP2MN(T1g8cz{);jKhMSA)IY
-k@Ks(XAq46sG0F6$I<FOgpTsz`r^gtxzR2z$cZIgkq{1TyTQ0pr|!4G8+F>~n@b&b&`aWvw<plfdTh0
-<e9pw`q&E(ChAG9;8GL+B1G7$PL=TJCX7!4WS}|(UBoAxDXG|?-_Y-yiW)A|B7ptVo&?8cmzeHs%9b|
-5+c0=@(SXHqawx=V5%XQh%igzB(SZ$GX;)zD#@qjlPc+D5g7g73qg2DH$$)~0);8lP{_`=A^0rMml<S
-MN8vw}{5ABGbAtCK&SfB<|ZM$bMm)cQzAo@mBA!VYtvYqB|q2tNT~K3Q{ncxf=iu7hDcJxx!MC_2{B5
-IO$gIlubr;Ey_XEl>sn;qmx9JWFr;VsXi0A^?3>20J)q%=1h<nEcLN)I;qB=;aj$uwg3a2xV?h*41V1
-gmD-;IJeGYSL96dqzc14kcBLdy==9LW`|r~iBRM7>#0PSXQjA@wsdXTMj9MB3oA@#sC60PdwCoBlNFM
-3g+aj3ih1Y2<{5H^jR#WLOSEx?X|H1;kk<C0=Va^{o%OT-i2KVkWG>(+(pXuakjf_+5wIn%Go$%j@Pg
-TnV8X44?8*jP_^oKx+lNgpW$4MJDnG@}`P4|ETyM`^KJn_t|LhzXrGtb0PVLDs<o_48^&g$DUtu(Fn|
-}i7|L6w2f$^^1-7vIkAMfA)fZcy<p)WZ7tBZV#;3P?4_z^;=-7yb^A?WkLe<Z%wXyEr~KLXmbGI6*Ul
-Kgk~>|R<5_vFoPNVoTweV$k%_F;c0`koU5@7mqtaWDP^{@#d2LT^Vqe=jfv(LVMDeGg)Q!VP<WW{rpK
-Vj|q%^HfN@kCX`Fy)G5Mhx&!^PAbTE2i-mi9^Z>qM7$rzqn#)a(cTb;Q2V72$G4wRvbXWV@0K^5`b&`
-zx;q(>_SeKx{CWk@;?qi3ewtWHxF1A9@AlV%R=yTd?s^pq{Ho~mN1gwT-q8jK8#oDjL+%!d{Q+74M^k
-To?hZhqK)p8L=>p`qMY{C#1#mBK*(p{82=vwU=nGf_J6iiT_52R4Hn_K-Z)-yvAe-TOGZk#F4PD>n#v
-jLk_rZc8Kj|mFDH|F2gOu=h;eK=-WjS#l@!$@~43tf8{M;}3pGxXh;o!GYcEd+$-u`8gQ0?u&i^7s$F
-toMct0LFe2?&g@GkU%S;Qcv#R|^t($<#h^Nd9?Som#4>uRM})(k>G*ct^X&UdQ0sB-!y`Pu*?BjSA6$
-g^$kulA%5tybj*>D(%4X-BI?2t6fP)Cp|j1`}6SPCx~_@D`)R!>*>)=3!2n~d<W>WNqh=e?$q_-P(x2
-Q1Q{rgRf~!dx)r2~@FEe=9M3=+S8f*~k2gZ}s>2$rP93rUiy^|@K2z~-821!CT8^gn&g7A!k*)d=CGP
-?SO`9)=G;ZVD3-wM*{~97j1uG-fPyl!BQh80(arExj^Xzq}u3d;r3lYiooNgjc3eF_1*f}cmjMbrK)+
-oO(yOLZVPkzdPLq%47p}Q~TRNN&fsF^c&lNL~Qy`j@6I%{T@;%C-;74oAIwvG8ADu<&knNEL@A3Wf4s
-FyIsedrrAa#AkL<;!hQ65_R1a^K)h{z5D(pdPbo<2BRbtz}>9Cy(m{Jy7TgkghNK((+8;Y2fR|N$K`E
-X)64Xkd|0qL{~mZTliQ_H#U;ZmV;E6KOe=6#IyA_I`<H;jAM8~Nk7bshL#;YQUV8)z>&djh_zbqflJE
-y;6?o7n1vK>uv4D8NKaOs)T>iY0^Z#Y(8;>yhI=}&mfz*~?nO%Dt66jV4myw9wDFdlgqP7%*-0U@Ml6
-w`ahFCt+{zjNm2Rm~&^#1+lbvu6KfKnMF4s`*>aGb!0aYJDZ(SEwG(}0b+4499Cww`CV8{l24k+LT#y
-@2+X2j6txt;EKa+l0gcexWqPD>h6+vZOPM|?<-#94C{#;5r!bYitQr<{(mD#a)}=Xn$9it|11(}7PvW
-iaW97MWD9*oKfgC_HD_>?Xn;2)pYdUEsEa^PAF>!GO}-_AnojXltsI^^{!8ofi_Lp6kyAZ$OI)%A~s2
-J{g}PCIrrYR38b!V&?gE^MhU>7z|;MFg%$>KB6bkvy!~XICU2I&Wan=@?X=<%6&B=nrk`$YT9Nm7Fr+
-jfls}1i4-0VLmM0ty3i9N@(;7;Vn{L3rXbKm^@MK{N8D)Zit$9LAAlaykDgSRR9-|GmCc@G65OLSaXe
-IAzkF508b3j}Fqxd_Ee>sY{V9ss66r-BKQsskpL8LiQ8;#7pXGPD2g#KqpGo?_b5Wg;(SUqxxbTCcsU
-VqEbiYBml|&o*GZR%j03TmK^tlwuVx!`mt4j)AwfiF~1{*8DJFlWe@EpZJlh0siL5HI#<j)F+2*ydvZ
-7T)ND3RU0QWhiJY|;mT^;c=yu;B2F(4lAGim=AiO&!nRP^6>jhOCU0lP_0ig}3d`1uj$qOZ6%-g<<p0
-ZnpLI6+5Low%LJ$B~cBi0l7#gdE{>+D!I_HG^+$V^@qaAm+=WS@;tQsboWzsa@Hh+lU8G~Jj|Y9U68~
-~2>9hbKj|Zczvc^5xE_n&?G%lK9x2CX0<`WvdDUvT=L=~dDaC|@9ixt6Nz=@cQ!uG*QW}$^(^34)>j4
-R!j)1SC{e04-k-2~vA~RDtgtSs-d1gC?!5oSBjmqRNk+BoY{%5G+&ldVEYPc=(9W^{s7=fT9j3N|)!1
-xjQJh>C^)&TKwui_EOTjG=KWxnV=H;{VEg<xW@+@bzI$e&E~LU;DH&w+l=m5%XU{IidY2;PPX!OqGkY
-}a|m$XjL<@2YMH*|^_Ns3H0`MF@huPPyAGLvQOBe_wH*S{UvLsl8jxf4j!Sd$-x{%Yf`lAN^hVzWsKe
-`t@-I`z*4zB<el1;;(CtY_XG#%=k(Tqc})jB;VS2I<u)O?gV5lpnaSCju!5$5coT^aA$?U-=T#&D+E5
-Fg}eqSKhVN-xpMUSJuUn=2K*gb_-@huJG5|Tg}^V-!aW7Ge(oXze6^7|-JkuPJ9W8&G!@xyI3QQKRI1
-d17a6Ls@+}Vy124)NW0>(=Rry2q91$SAqj(L|20zw{1s4yueSjoCsQ$_uE_5RD5FH5FzY388G1QA#Qt
-vRA_MK41L(i%yz{WKLPS-PpUkhb>gx~uY%X;Q0GqzeM=y+tyX{x&G`6R~0^^0~G__5>Y$BIrm3VgV7%
-~dnaBE1+OXqQl^Ww-*pKWM<8g~s1m&agBR(u$z5ig0LfxYRp=Q{8~IV-Vs&gEWCMT1PBdG=Jd*{h@@S
-#^g_e;4rYbGFXFg+8Bieaq3fXJ`*pT1;trXM>24kJKL2YkkZhK*?uwLH=>JdxtPnLt6=ar(Pvi3MyOf
-3pgJU&-BrK6IiK!-9dYZ(FK^L*W4RwU>R(&x+wB@hjwFH*N9u@T$o2!pKK0^@-)6liyyvW8f0tEkTP^
-n9Oq2IUy@k^-yc^<e5i<3;Jah||x4nE%yCZwvJA(G<uRgSEGPk{R@AZlH4EYw=Z(%&KyWH&I`95jrXW
-KRM#exriClodeAm4))gSX?%Zd8o#`!?|&T!h1WmyiF}jRbES9VFRf{^;FRw8!@G?zyu;00r+!`M;Kj^
-7!5dOnn`|DBd4#x0(hStDj21=4}W6F%Nw=6>T?u`;v#gTb`3;;d;{kNbc=&$g?3(d-iwVy1ur&0&F^~
-``#t)`R9h&cHED^d<(MY>lXzhi|x_=(?zIp+qUelb77Ia3-_x8^4+HTZT>yAs=fI}{9<&x&otRn>PN-
-Y*6TaXuDyWwLGJ6p@9ytcZV&iZ_xCHe2mGu1`<2@Re%46zSszicdX;uN+h)i)<E;{qdg=iMO0K3_QAv
-PPvWd<JT4Y)8c+a$Q{2T13J*TlJfx})IBQb{}%p8r@AB5A;#kRF1z%5qQ#Ug~VhU%qx5(CvXjn)gedq
-SCnm_z40%*)!jxajZ_ItfT(W_OFFM^Ac%iw_)wGa9Uy<P~W|eiGV7M&+Iw$9OK2wp?E2wSBPas;azs^
-JcJJVZ;`+>2yTp$0On?;A|vQ`5d$fo*p;+pr%)pfjakOqaD~?O7eF0OSi?-+nwkml8R`)R=s=%8T?W(
-hN}a<m-JZ>s#QA5uM?M9a{J7O3FWXh$57C}F6xymA=7`I^;wy7vgZYA+x8o!%dT2T0|Dh_EOYLkj{?D
-iYl>M2Mo6UP4V7bGr)!2Z$Gmk78j25Ic10fNh`O={pOUE4cP|YPIx>^b)Nw?NBXY}Y>YT6l@Ogp?`4n
-I9qCn2knr7xBeu)RhDeDxiHwZx2@})i*?GC8+CCrLcpas{!_zJNrm8QEqKe1!0pP#olJg!FL_xAB*3x
-s_^t~4FPSU%E?oz=<>=u-P`1Z|rib8{%P5V`30;1Pz<75DDj5sH;l(5PzZIj7b+35@iqPEU(<&kW;?#
-uKo(GUwSq9*S{|`1_ebYv$&s^9eF5M(m$erc_!AVisux2L&z9*CPq`lg*TE;^DpvD9jqk+jm8f?v6JE
-2S*%j$_c*=K6rD1pXe=;k4XNX{xz5@Pu7vLAnH-TOiNcCss?&pw@vZAz817u0=}vDtLh&CO7m&Sk5&Z
-ox?Vc|X44U41H+M!*$$S92UsqWKzLcmTV4i(;C+ib`<T>Cyr*s#bprK^OBFelL;YRb_#JL$`2hor8a+
-GH-2uaHdx95GpGjnisD7kIcrL>#A)3WKWUYMP_)l`V4i{6MxFtTLMbr6o3WPF!T7m=(`y>`qgi>C2p%
-4s1dMcn?-)y9NDr%CtY!q_q84=PacVXyAx30;d94!SPs9tEW#=(hr@^2z0bq4Os@gb$uKCVN`t>dQ@-
-(UDmE{V(0pvvK)N{4PZaqEpYR^Sjs?d$pw3iw10(^E&8wW%>Q8)x`cfR}Q)R7Wr#tcT)pOej@1BX#NF
-#tt3CPqi}wRYg@1w-T&rJ!5P(5Bi`wVKk;@XLICC9DS0NUzb52IzheAp?URABY%84%)MsgQw>}aLa=H
-99~|{C&#w@(m%idi>s8Wr<(jMQ*MkEsS&5+fjeO;mHs@U(H9Cu9NOZXXT5zpd_(3Gbts=92K2Ug&V%i
-fj4@vom^~Y=xUKpo=e7?Gw%$3YkNZ}Eh1PYBFCk>bnAukM^{Xq5HU?Q}vYt7ZyxN;fjE|Tt9QCFH`58
-desXO-f{Y5QdL8ELRHm2Tfbz@Sbyi*=&ctSCHLb2OdZt`>61L3E}&y_Qe<;e}aEmBk}#vcuS%oS+>XD
-w`#kg$SU&+!qMeOvL6^${K6)@K}hPHj2O)?gY=fxG+S0!-Bu#p8Bga?RNtFe|N3lrH(&@`6#^G8E$`X
-oWPD4h9M;O8E?d>oh2g3+kXXpH(0|vbqt|BDBk`XP<!=eqk73k3ZYMV<1yTgS}=GIuOoQZdmwM>2p@M
-s7vj700(}cbb_E6emM!D^+W5~j9NYEy$X?OeZKb2#OJ;9X5BDQ6v0q_;?W}a4!u|G=A<4ZjeB+APdtO
-HLwu(N!D^a@vVz}GJpzrSWeabiamtlUjmkhH0D{qw9I<%KyWIXH7VgCBx2=lk-`}H-<hyNMo>v#8;D?
-p!z`lk4&P#<_7ESST8qXGmeocJZwe|%d3;_vw{R)IbV_klmT#$H-O$5>Z5Ow$a}=k&$gNRwsTG|<WJB
-Djf+h<0(I74wXj3Ju)FAUx=YgqAbLt=2GP+!vaG9;~c9L#E;xIoS++qLTZ3wm=2GiEFZY2TxAn%b1l<
-z-}0yc_JWr5$4xOOBer>aG#$p&eMsZR_Iqh9X(z^5a$w9pr-;qGZ^_X+_%Xt#v;N<{l~Ru;nE5MFYKN
-UfR#V%EB-Ou|HENcV=q|AN>^~|U|scq*Qh@v^){<+B-qSj7$Rx{VIL2L>3mbxc5oM!J0y#Ty0>&65b2
-Vv!l8)xN^4W`QXs>Wx+X;U{CL>Zy6R_zz$Nol3+)yQ92A2?)~Dw_qzo@G24wQOT|(num+JpNP)h>@6a
-WAK2mnzTaZG};qR%b?007Ye0012T003}la4%nWWo~3|axZdaadl;LbaO9bWpZ?LE^v8Okg-n0Fc3t0f
-5mVVcc8mmi;%8BR7g~a-txuk%Zg+j);5p^@ezC>UqX@#1zW90n(@57yx5nd`y<Pq<PH6hn<(ZIyXzh5
-=vhv;C^_tICdHW5YGssO3#FW@nlvZ#`EQJQZaATfzO)3TTvQTrL+F(Psgj4M;7Xfue}^f81J^DSjzxS
-+6`mVX0w)ut9T0`^^YuMPOncDS&5y;3-qkPeM3pfQ0YfZsqx&q5?eVm<-GZu9wMB>uheww30naHbA4}
-#anDx%dnB~oQ3)UzdN#4$(wG-5hlM~IKj|eP$_6598jW<`waUmX)67^0;tadO<Lq7p8kn<sDl%D&_zL
-EH-)gKafebju8HHHJM71xoqI2^FHwsS1ju5S&->6ImKmI_zq7f?$B1QY-O00;n48F5T^$ze@Y0ssJ71
-^@sa0001RX>c!Jc4cm4Z*nhkWpQ<7b98erV{dJ6VRSBVd8JgrZrd;nz3VH4_L2;VF(j8EK(WKNLk~j-
-WVc~36q|OKDv~P7U3}TMkCNlqY10nfbP@UZNKxjKujTyRTo$%OQ?Fzbs`-bA2yu0FB|JPdK!LKt?wtz
-a_xTdy`xZ&=ZP{p$TV+ZOBysPo53)<a4QdRnL?W&vHxPaS82POYTWjP(a*jAU%PgHKDsT7Fq090|Fs1
-dUf?MTF2tpivYDtJ|Iqw!*T^$->Y_3}q)Im~HE1wB2>E%sK&DbKeCP!0QCaz9BWrvRfDR=FHnUk3D<N
-Z&0b0ZhiF>iU|EuZj~ktc(1SG>j5H_W?+9dWWE8F!Aup#T@;ZK8bf-uhL4!NeGDlkT{7P+)}xo#6s2*
-|oe9@xb&68?QBP`okwF5Z6Ov1I%P&jz-#YryDwfz2`L;mIjk*2+rFB0?kf^BGBfW)+u80*vr8@qPJ!b
-CX92(`1Gt(r#wO5YwxEH8Z+2CizXT5SXId?q4KJJdh11BD&^+e5L~X2f*6gXu=XB-$wTs|1oeckmUHz
-GT?fyP<o2$Q_r4e?BiUwMC(F#K;$GE2nPvHUDDx7F(AT)@u+I#2Wi}1!fF`Gqgc^K@wt-*I;CIo+V4P
-0JP{c1aHpGF!Nioyx!DEq!)}<;FjAPN()H7LWtB$i^6l(AnXe?;{P)Cg|pJ^=n=jrwGdXpwEk32j6tX
-`P>nS}pSy2H`2{JEZX%E#AzL0plWbvV5wF|^Obb&3^MYbXN$v*?ZLxvZtMKiAHLtyveGzM`JL>1Hba0
-8mQ<1QY-O00;n48F5S#L&-CD6951pM*sjH0001RX>c!Jc4cm4Z*nhkWpQ<7b98erV{dP3X=QURaCzNa
-ZI9!|k^Zh<(Km|$sXYyy<i6Y~7~I)Ta^5>{Y;0!FFg6Q`L-x#Yha#13a<xK`{PxsKzmw9;#tv|Zfb~f
-1?&_}UdU>k4=@;Va<&~)Vy6NuMVjS+S{vDqz78e&63nl+FN<HYJ>ifq=>cwA^&tma)zuT8XbKA7da6~
-#%486FOqP%VC>!_vJ^7yv7Exx92|5K{1I5fk9a8oS&Y~#?hS~R<TuLdpdRKF7sQpuIjM7b)Jyc=5{Z+
-aE9-Ua`HW$cgk`_Sy9dtSD(t4rnkwXLj%rtkD(LGu)wrW>T{%61d30vOqJz~)D}(Srg}ncfv~FC00;<
-w}gI-Iq#B`Zjjv`|BS5w2Q@{j_ZYhkEQ;gWQjYlke@2KAH*wq{#&Jb6?Lq~-R`(?-9@Q`v5Q63mRiFs
-)#DqMW!~R@00x&#1Vr?MD)(BHV(Wx$dTw#AcFnG-uoV^!Z2ZbK!tNk}n+M5T+;k`QRDRmSe7LFxWQU@
->D=X^Xt6D0Yr0SJ|KJAf6?#iybmqv7A-?vQ#inbC>A&Zr$B~aKkofL-$Ie-$t;!M}7>`)oB99H5UHl~
-9)C6TQAUD<S6^mq8kYM3ayntt>6fTLbD_YLg0>&ZeBzyXT(s_)uk!MwMP>`a5+gVr>t<afPtngrW`WO
-1HO9zbnN;98514G8sK4jXv5F%R?Qmexd4+AE2Jao|pr`@QP-swoGFGym9+L=+z0f>j;Gp@c;cIp)Ps+
-@iehKv*>hrtJ@f-E?LZ+QbIbyBRi{9Mte`Wf?Z=fggNcY?QdRZAnY8e(3Y(zr@YMaWCPqRsP&iE8xMh
-&=v3|{aSGSIDmQuO8`lXs`CWn5f43R_56tWX*)TzeH9bo9p3<p=jag`H|H`Y0S*XUglf~VFT{7CE|vu
-AAE}DWw0QgGThXvqf?HJLp{%=XKpm!M-}HgJUl`?a4`5)|4|azNvkSPuJj0P$u!@um7Dhn(6|LeZ>ZY
-dYn*p@}T$}s|*2=~LRtoDL)L8NI*tS8t*uWe$6c6lr>LT-GrSEu^?^i;09B-~OiZ|KPk)r*pPpMF_{x
-`|mP_p0*4|bKn!;E?uN1VTl1jUmY{ag_{EBg?<`$O<Ul{@Wzf_<ptYL3*MD(`pTDO}t8Kzka!8M}{CH
-Fpih$P>zUqsBn<A4+Y^&RA|&?&Ne3K1E-fNFF>~(iE6+VqWPa<WtJA9j<@hcQaGYsUwe@%oMa4n#({e
-WnIU!Kg#1ud@S2wPVi+e>Yz-(AVe$g8;J4XD+y|#Gp69PgLu)`zec*K(6?pvh$eLGM*%*v7Qjt`zR~e
-hHZc76{Q$AImAHGdrU0B@aC~#lTtD<<TNB2qYtUB0A-MdpQ?hOp8Hwd(d6Doq*C`Y?a6HP1M-IgJ4*R
-_a8=;=@_J!f)j8mKL|9@e`k!m<Pa?j9FqLr%i@)W_(bh>HxlXO4FgGUI7-STOO^e_y2gg4*Z+<gC9Y7
-IDL4kZ<^t4(*;!!L`IilR6?l*50DuS(qj=xjlg!7ufoVCbxjmqWTvsR&PEBg6%eri&U5P8`Z(fVl#s)
-x!{?yL&p|o7rNMdR;z(Dn~*gGYV&eSr7{u{_wLVZ)hp5fxwKs(DMMmYy10t)Ck<w(V!eVFkDEY^B!kR
-Touautb)%ux6m*q9yA(O1ih&rXbuvQp9WP{7Ix_kguD->%Hf~GQY*J}UZZ}?!vgdf?6>WXIIssPIxuZ
-yZR8Adti=rE7CC}~PF5&z)d2J;g+cAwby|j$%tF@!G*<M7PNb=T!N2hsUgTP^&i@;2veTAefZaxeR&w
-yt<uIt+Qdo&>V*&TZL8B!Cjs(4MQ!(v5*>n2&f}}a^4c=aYw{A3B5g7L#Y%kQ+gbj}9AQVu%FqN`k+0
-3>F00<&9$SqKL3I~CP6PDVK2uUyiW6KW6uFW*sO=JAg8P1EHzUTQt9g0L7aUiLo)z(RZ5GkrxPx|}4>
-gy3QHOQ)h^g~3UPcX1E3BJZuh?up>BqShU?}!tu?kWWEYaAC%rp}2LS;IgXFWu;{F>+N*k|_qlyxz=;
-K*?PXfYgw>J#NsNbN)%fFmQwbEg>94cf&&nc3{zOLH2|8x##WC41_NR%7`AlHn@71e$uuBEp3FsamAZ
-=)k^Rk%N45TcX_ugA`ww522|9Kckk&LCz`YZP$b8NHwQ2}lid>B`<H84W}FrPZiY;Al;I#=GA;yd7I~
--Do5w)LP~`_t(?hl=)aaq7g+HI5<YiEx)pm8BM+;env{oVO7FeRhY+vqVaj>WD7vUso_GUWLLkQl-ul
-w$<Z7QzR<Zs3ft4;L7E6)wqu0#p{hC}cC{{Z*^FsjM?D%A`Cp-Q14r~{IcwRII{zj0AS@GbZ$RCN+*q
-0N`3tJ<-acE_B!OLecK;>#^MA6SZ+rwSm0VQdmS@|mc!3QK3j>v2FyzJ^T#_ux5CYJ*7r*QgfdTp$Bu
-0w2jJ3A@ydi72j$<VrSJT4HzZ!{7mhDA8pFHi_GBqZ<hYNNZd&iQg29C<7;P90fT54blV&^*dYefn)-
-}mq{$0FSa{rBbTA=o+B_D_guCEUIfC{k_E<$SV_YgB-_ep03!7dt7lx2Y>yzmA=Bc+sEIlD6p@t4Awy
-)K0k&X;HM>H5*|uI9RK_!z%%NA0L<+;1shZvPpJG~oEFdg=Y--X?J(M6Ms<CaizWxUhKo<9`RNL*hKY
-SlF(FSa{ziV0<JT<a-+qDg$P$loj7WOmH3rgo$IpNE`sUE>PLEjwM25hW4tY5E5av<VT9Rqo@v7rTaz
-1k5g-{rqt(yoF*#LhQFj3@KpCqjmy^&42s74e0%mS!2Pc8US=+tYH}Q<m$<ISU5;>)VeK7lpAH?XY2;
-CP+DIe2PBTdk%_Cj?xa8XduP4fhxfCktm(~Y=Bykj-up>S=8>T+V&G6a!k56UB9VE0A3Xss?NjU%R=-
-e9#aVaUwI6w;0a-~BYw+tvSpMZuf)rjj|Y_Jsol~4uXkro)GwTC2`rpB7#XWrF9hBY45zv8u%dzHT5?
-1t(L~6Bp5R_%dn)fa7!?@@n*+<4p%_2Pmc~57CVY@Bmot012v-D>Gma)VJIMzqNujd>gtVguOvreVJR
-ne~R;M@!MsdWjL*{iR&JeZ3)OqEbj6MccW(?<#@;Ir&M0)2s8RcU#7*VLH93Xtbj^Vn<)7n!wOU&hvA
-6&MGAFyIAC2BHQF%lw{a2A3J2s8${L&!X<TQSPS?kN-aIZ{>?KrYYwlYGzeEWl8PId&bJj@TJ?Q&vy2
-Y4!|f<s!4+jb*%#hUQZ{>83unm)z;6Y^D+3KWZzJqT(}nKf$-#&k4()wV^S)pShiOX~~8%p{MrKO!uT
-|Ua{jGAg=xN?X)ZYSxs|wVsoD*hZz|}rW&z7zqN=w`-3*I>dIacz``g1LWFGjv}9!fBc(cy+Q+hM+O`
-z?<M05$gmE=_9236wWux>nbm_dDXO+pwBG4sl-<UW(BgVG_LvlWeK#oan$Tfj{QztNq9ttX4gKc)%|M
-L~VmjMiJLEHv^49U22Fqh4;qrsCXXF4Zhpi0N*3xS565&<{<BmodwGwc(&Df3*TiCK@as9~HsdbTZ6J
-EH+_jK$z#o;mn6rGOOXg(7ei?C{@#{z}o~=tHArScEqPw%fjMXEpif)S|SYleC`EukcLs@76n(0@ryJ
-0ad)1L15Z10pu5-h>>?;r23qc?WTOhl%5<tz`v1DGkiat3D7~gb&UHqJQ(l64Syeds=#BCs|v$nR1yl
-f|I^qgI*`;eJMYRQlb!dOaCA}Q*_)qFwlVjLKuX{!Ssl2(Hu9O)^J%=T3nruKF^r9^4nNBoU*-6E7lb
-%G4~>FcqC9?7cs7O=M^r#}K9(E`oy=%Q$c?8li_g55MMRj(hL(UyYiFv5vlGR)05%)YXbeNA)*Hp{u=
-mnz`=nA76^L#g6olzytyBPrTo=|4L07vlk0oNbnnJwlSd*(#OMg4UmbPfL{Dd`tW-xUT6B{tui_aK;T
-0P=9<%eY`T|Fb+>4AJAWH;z%5;4|CTRdw$`tt^=$$?01@!CcTD{DuOWPU={dREqRg0q=!m=Q;Us%86>
-8p>7<GB`5fD|)5T5k3pq&fX#1W?nwq?R@EBiG{=YJwIQmSVqMno62)L|A5pV^ZwbYQA0Oz=sYuYHY<_
-op;Uv${pPdG$Qc#BHP0^QIzaUE&FQI#@0U2aLP-cXmCUn0{_!G%Rb-Q(`Gltm%NZxQ_W~RDHQ0?27NL
-;@>QTG7`-z1uR{t>RD?1t&)a~(r##&Rjk#YHlM%f*T)FqKt9NlQxG=xklIsN`v;D3w|mgnk5Pe{}ViN
-zDx4EmqBirHB-;!X%gZRP6h*Hz^KQe%>2xaPzr@S(3l-(8uA!?j7;m=&)Lns1vy@fCvVp{G+AI?1(!{
-vf58aijK96<tb&px|BFfW9sc9^O$+7c#wDLWh^&Gt9BG399&&9HE0w={R#tDRPV2mNO&_WI0KM&L_{4
-Alx!TfNgI*4@f>gpHEJ8ujfv6O}}RYwCQL=;TaHZek^`$9duG{phmi2XAAmyhD=;vDrX7!mF(bBW#Ur
-Ioerc1l?3$9HLtIFyu7d_ptRwD=8mc05qz&WPX&40jU6G#HJ`wBGA!DUc%2Jf#eqY3=g#*2iIf_*Px}
-KIua-73yz9pR^xFY*Q1?VGoR&oK!%0y&R17a^ckJ@PQzhxx-(iD8&uKQqR@9JxTH8dCTULWievKLR+3
-g7O(tW8lUrn$V7EVrwAGY|pn-ba0>FHc5u@ZqNNKT8wPq2d#SOUfln3;eHgSB?UNE+jA<~Nk*w>`f`)
-7h&TE;L0)QFe~mEX_9lqg);OCjdf&G=MvSUH0gl54WFnavq_5qztm-Jc$Y>n+?OE@WwqOYkqg3^Q6R^
-Z~N*oyaDKF7W;mmXYR6O3;kvQD)vm0u#ndk_xPDvj##z0mgWgJJz2Z0BSxbWa7azzD10%(zM)l+tim@
-*NXn<`hLk+*kDUEAGdFW0p71hU^#P`vUf@|Kor(a-Pd0?RnEP`ZT!77{%vD#jRFDs1{K<K-Aw#~@cC<
-+oUAfDUW|-x?5I@KaJV7nX79$Yfr|;Y?6BNLNsdPTNwdHkoo+be04!l+s<R5mDg%uAnbuD~K@WEc6HI
-4S(9zBbLM06L=c7Hn02n0{%OOpI^j;7s3D|3U}tb}hGba*Y&-6o^(k1x|%MDmrpCABhz_=Zljwm6jmK
-{Vf%Jt)6wXI`&x71t~yVtlm<?-z9FYSq!bN|z7jwiaHe!pm`*Fcqw*6c?0A@uDx1>yJumyufu$$)T@A
-0&Toaas3NlSR&s_^6|ZJ-PbHF_YiMOFdR&Z<JVah^g^$keGxp-vKp1Vrs}hQDnIQTSYt}C(N(GHYb@L
-Or&Yhh>TS~3JjHj&k`|ylT>m-yW*GMPE?KrFWBN<b;ja4CFMshLW=+PO+?F-nO1Y*&kI@iuMZZ{@OKX
-m%tJhVjQ0KE)=a%9gucUSEwXa8cJoKt|b#c8GmpV&=-pz5(7a(&addX*KW<nd(csbS!h4(DD<z0rGwQ
-<^;VRaXeIP$PPdmoSC-8?tS+(?-phwn)=WxJ{Sfkvi-q9RU_CF=#XIlErG@bccVA7n|sn32DHY4?d;z
-~oNLF1-Ch_bc(mn}Oclz!vx7YWOBWi0#pG5j#G9@sSL^a2MW;K8GN<u`76&?aEJA<-N?_pDB%d3NU?+
-re5HGK#l&Do=j*hCspzPLyMg&h9{b3X`ucAegrpj%a<hYCE=;*RLo-=uw<4Su>{NAKo+=f84zWcB|y;
-n>hkvL@<(y`&HD27`tlFrzhB>EsUN_IVcsn#uJ3p8=?RGga;-gyWU_`;JhvB26d+>roVXWD)%*skv%Z
-G(a?*D>bz+IfGtSbEv}Q4NiRN$Op?O?^FZIRF))HhBIqR>dj?oUr*E#SsFnfQ}O{NY#k^?`B#K1wsEI
-WxMHVoO}<~P_qghvybtQEUU<r|F4d>&~46@Fj&4yIUv*8vZhUQrnF*8awwGJ5pFMOF07UvSRj&$;5)h
-k_Z`;y3=<#24mv4mb=zLg-A$d3cC9B|>i^1to+p{c|LP?^}j1It_h9!*LhUcy-6eyDJ782((RYdr}mz
-ha>(N#AJ-}fWA$~IHCzQV2V|J(>!dBNo@F9c91(qDz15hnOb-@dFs85_(0yhm=Nq#T552@Lp>u<XmgT
-y0W-&@Zq^8p&VbBdety$*ITyA(P~Ay&FWoyxuGJC>Q0kX;9cV=${P+x=2-c_Gg9~&pI7HyM_q6tz$7}
--jp17K&WMA){=o3lYA5Ba+K6O07QOw7<Jo~X9>3?HE_ZW!n#QHL?f|D8bii~|Zug!B_C(;Q=#Jit>6Y
-qn_EQ9ztw~q6CPmqFFMS}pXrlfe_OUN0U+i{q~1m30qxslO1+nKq5GOzvN@KZ|uH&9Ch1QY-O00;n48
-F5Vc&gsx91ONal3;+Nk0001RX>c!Jc4cm4Z*nhkWpQ<7b98erWq4y{aCB*JZgVbhd6ia8bK5o$z4KS>
-I0s7}nU`ETp6MZRoQY@RHe;*pQG$r2h?oRe0JN+g^4qfu5)>)PQlpC`a`E2V4?N%<Twh&7W~9>V8)$r
-f{Tn|?l8cLr#NxjVI`2|^&9L^$XqWsr{3OY|P!1|1n-U32d!e)gUm!U2U~+iufG%N&lm?32nhI)Fr;8
-WV(%7`IWvN#02b7?y+E@=?=JRiN)*1`K!AIe+e~=_eRto1L&s|(Qx&Jc+Om7mP4-w7_v<MqQ5E?|aQt
-QSvZYPUW3zD2=jkPFYQz%NQ5L%X0AlRD52BfYsX@pI}4~aP}7D_9>SWFz2`3$avT|4@^dfxD_PDr=vo
-+6bf)qi-P95%`qu<Ur2q*n4jS5rZ731;;jGinS|N5J?NeutJUtxY|-jE^s8@Q2Yj?c-TsI#?8c?gs<~
-2cY5U0jA1f(nHcrXyZdf(9eHHnDnq;89#+^!h74J%%CTm4yt!V-zcB>e3wj9qn+%Rc@|bp)4pr_{pv@
-nAGQOG-Ee)-Aq+4~X&j=^qzH3sw5HC{va?`=*i(q#ta;tGV0++0teT@v!8|>EJqMyW=oH3WRcIQ2A}Q
-K_aqobqXbBXbw!7z6_^jYv=GjeJnvE(;$oK`Uj4wjm4Q<w&<&Pugly=%X9m{^ePAqvuA^Z41>IS=d+_
-jkBUWsNg@iTdLZsP4WWNFwc8Ha!Ru%I%YJ=4CR?TQkev-KtFqHHok8<a?ppE;2uqgW*HL-~UoCr72Wl
-ps~yq_kUw-hvcffYL#oC`;o#af`|{I@mgAHX4Ax9>20+MT2p2vR}ybBuBGH*lq<UP>E+^>g{zjT*f?*
-rbm<%Ox|~D$_yisej9^FNDs<6>cCT0U?q-N!r!87@bKISdR<rq6HM1B6yDcBE#PlA<y@*3dPH}xL%P3
-2_k_r&iD*jFUT+~MmbPfE0C$Xm^!;KsG*2%|@;OHbqB9j1W<&iBXvY}7&>$Uk(YHv7uz;mE`2X2%i$*
-`AywmNy<eXCuCm0EVXDMqT06Pp=HDRv#(21OF(7ru;3i^bnm}leL$4<y+LHj$*v19<;9m!dXJ2G5vQB
-*|e8uEv?nC9F1SY123Fc-lKdZuu-DG6F`IVymUy?`v@Tt#mi=jmR?cB0ThY1S%(JY+Z8?%Lu;X(?7Ee
-l+qdY;R`V74i_|PKkKBZ3@%_b8Ml>3|533Sl_`v!fJZ$_Ah*{dok(0ca+>Is!4bnsufrCSErhAdc4n+
-;sbRq;_czj;1kwlD1!4k;Q9bL`#X2Q)Tk*pwoZKYd^M(v43A)60*RD<r9u?_T`4W>7E07>UmVvKmy!h
-XXDZ?L4V9xKyS+RUi|m(yH0bmt$qEN6n>)VNWRny{o5=Bn!wS8|v5ucmO9KQH0000808trnOoSa^;&K
-E408<VC02}}S0B~t=FJE?LZe(wAFLGsZb!BsOb1!IRY;Z1cd9_zrZ{s!)e%G&<dJ)J5Ts@>{3k2{>7w
-IBF*EW*fz7&N(OSH{IB2|(~A}svhJG^Ad7gDq}k~kt~zPS&LMx)Q7Y%2<d;F>Vb_y$((1|)5S)Uc&hL
-*-aave9Uitfi<S&)2PPCCzhSwIymK;~GzSp_$-G;*XycJ_M4A=(Uh_cvhY2|5a7ukQ>%y`3vQxkO7*N
-oSeOEWmU1&4`=U-Es-VF9z6@kIg&|*nxX|np{0MdRB07XlSIqzCIS37zJ?UfWJ6Wv<z>cIlC664JJC>
-X%%E=tZ8Y53^IIu}bT~Z)%wR4!wTBBldVKsXJ}P9_Xt9x`*>>TaR*E_lFV6GDM=@WLBqd!#j#m|}DF)
-R9Wjt{h7{v#Q(c?g%WQB%TrnjKC6qcRd3JyayAiM<cmn^XeODSGhNns^CBPTVrbmqa+f>@sib*8pb;z
-8AcY`Mw041UGP(Kljfr+{1^J@<9?bM_-Jqia=RxQzN1<6CNEr#Fy#(sT-`*T9@w#&qWu|FUHYLXyI(k
-k1NM82DI}F=N>+yBlB}8X`3-+KR}jk={tLBCD#iV5Ojnr`o~*CN|tV0Q~Px3hv<0BwHy6_JV@g#`#oj
-MO&398&Q1VwQxwH)z)u?K<{95)Rr_fII|Gwb|VY1741t(Wg)U5CE@_idb+H!N*yJJ^A1}danAOBb;)x
-KA8O`=7=MHKhK*LI1sG?)2R*$~nf*!O3dYzyP)yVHh0OR`WHosba@u3P^K%A^@&6F3kYcj8aeanP(ux
-v=e_m(>-=WQG#z_@<=dy>=>`5>_{^LmL(=5|>Xfc5L^KvBb|9z$ae1MO_uxSdPuqmsH68DAn|40pe_p
-;l+@@FnydFsl@b*Fu28uAU=(`m?^@82dCQPciJIh90HdoF9|1k(#hG_AAH1Ns4GKEZGsUex&8AgU>5f
-u=R;(>utWj3>kNPkmy<l>R6t-8tv^LAZ#9;6Kr&_v%?4PEhQU6Ads(I&OQ0)=%_aohUqE*hkxfv(0Z6
-r+EC;kY~6799tgon}NT#Ck-soNb~0ILeKWgK;+@`f)0dv)>zpCZ=aBV^=2AyU^Tys<?S55^WSeD9`6?
-OeE#+GFSiee2@!877hSNS7$7ajF$0!Oq@)@0>15ysToT^}Y6vfZ*{=_9+N6Hw(>I1&11<>BhI5_$WEN
-Sd?K15qvdiY&t$jfSd_s|@C7?1U111OD7ftgKiDbF?(myHSLR(zh($L)4*wC-`(4j=5I=2c$c{wbl<5
-qS+zSjmx56p_lT7_F+-si88->=P)6%j|%`9zFqk6>LL?<@L{z!&Yle2)mCR5VnFsT_L-6U_J{BxH0IU
-Ni9eY)KxzibPe^r>LC{HNL4u(_x8W)ZO>?J<MjMnF;Zvz}KAn$HlxK5SDUmUeL0#ts6CV;|6yE93%NN
-?bPgxY;g@|yu`51t|z!ACYV`yZU!5^IGF*Q=SB}KBBzK`D)}2wO9KQH0000808trnOnKU)%6b6+0RI9
-20384T0B~t=FJE?LZe(wAFLGsZb!BsOb1!IbZ)<ZdaCvP}!D@p*5WVkL49P(aiRU8ZP{^TBsL<vXg4y
-V(OU$m_T~l)Dw|92cn6w?x)i=I3Z=Q2lEmn}LLdYtC&X%huhcGsq&6vi|4vjT&t<=e|?}uV+TMGkcRd
-fwPtJOsmXu#G8IdAz<G{Oo3N~JycK8S%A19LSN&oN`q7cLrpBn{t47&{y^npR1JheN`EYD@ePg9;^TZ
-n1z;t26LXIrg4k()9HM*02jkLa=9y6<7jYylZUc=Y&x&t<iQ`LLqV+hIm0~m$2JM-nM@QA;F7AjLl)2
-Zqj7(BKn1uY_4>}agZ=Aw|VU+g(ti&``!8@E4bxLSS(IoTvulBLEbk5jY8x8OYcf3$+c4_uoC15T7fy
-uq&XxMyQQ5#AM1KJ$-Q4G`rC^uw9ZuD66KgX4CN4RxV1VQTnAZ}^QOtNAeuhA*WLMt{jKN1^9xXRztm
-l2w-^Rb;eWY2P{`CBi(;3`!W%{Ys63h)#V5}F&z`^^P)h>@6aWAK2mnzTaZF`>M|2J*000Ap0015U00
-3}la4%nWWo~3|axZdaadl;LbaO9lZ)9a`b1ras?LGZ-+qjj#`>(*+lN062j1%u}Q|&5knvbsA-6Rt`w
-=>OUBwB=Qt|?L_DLd}Y-rs)j3m^cJ{<!PR^=9gs-AE+x0KE6`z5(s2gZ%@wEYqwwpQ>%MI(UXpc6N4m
-cXulNx2>+5I$oEl&g-53^8a>rPA{@r!OLx~0Y=dzSy8LzLaR-ct&{3Tm1jTeWrNR>Ms3P#U8xTSC=Ic
-btv6-WK<_+<mRVWU=24n7y2;kse6Mfnot-^(%-?julU7A}JyA`mlB+UH6|~K>W!5O^lmn0|=5F4L>#V
-uR3Yb`>lN1(_+^A);t+o20EHAg4*Hu+k>iR+#s&0}ZO{!Go*;$2)f;B_WME&*n{RAM_+vSBy=-KP_nN
-Cxks`od|MOnn^L~C`?G@E+*`0+W6xIK%P<@&KfZ2KXrYxwZ^=<DA;i_L<~66-iii)3eKRh4VC$u{x)N
-*8Ha#oH=}IUU8TOy{r$=_Uw%gAZ@(lj}`cTYS)9dcNM~O}0s@X1*$`HIN_~2C;3j+;oR7wVuP9;pY0w
-Qg4XDrc<<|;O~{jkqO}wn0%6+0@2HDBTwE}Wm5us$k!jrWr9H7<AC&RESSkk1NUQ5Z#Vc!r|&kpqW0V
--z5wdl@l(A@V7+sCC=KeS+Af=IrERO1Nv)5IS{HTJWLNrCwrpg?IN3HArrGzWr|<um)Y<X{Je2oK0Gz
-du`0LL}HOJTU6d+C1xo+nCVtxUO*RV$TzPT|Ep}9aCLLiPT*!dCo2sq|sd7;<IL>(7bNuH%2Km0IJFE
-6&mrA}W9Q*j6C{}OhtE*hePeS=R6-jVX)q=BunhR5}G4R9FsJhOQQ5UL`{=g1RwdQCYm62#dYunLeTY
-FlK)W?4N?>SdNmf3FuW>Ku5uo+FnQ$yzg-5Z#PA;Hini%~LkWbr~<DrWwvtVyHQga08Qt_dF;{iTS0z
-nFCJdc~%4NnQIyC@Tj<~8BhkRnb#mMbUl%o{9Km>tZp@d{l3B0x|k?H^YYU4Csb$6&Dauuy-6B>RZLU
-Z4uFa(-xf3h`dou}YUmU1#0jouqRws_Z6;OEH#bjlP!L8M+MaDQ*sR5z8v>Uymix!Y`J<G=r@8)uUoF
-Qc&9<K7pbn?P7m&77bqdnF){QDx#Ak|Ia|0IZSpkd;Vpb(Ez_uyZK=Ngh=Qr4WQ<Z?kIynOkQRy_RfT
-iM{53gSxe|Y`!bbfOB;`CU}EOr1WD4Q#tPL%(*r;ZMvIE_~2w&-p2)M-?LDysS#9XX8}jY|f(J~#85a
-HHQkjez3oq<~ElHhQ)L;^)=tH!nW^a5}fk`r-J;<5O7H(c#X^cW+N$zdfD5{Ql$HzsygL|N0u9KRHzU
-@V}>D?Hr%J{@}m+`pMIsot<T#)U^@iX3zeZeaVW5b?SIZ)B6J;7$(=;&^Hihz|*ivfQ_PB=PPN2f1qv
-u2n>_5euhR0!~!Z#P<k<`V$%{j!#qBHZl7%6yWvrSi$Z<uyhm^|wTbbAeVVO6IXCpOorcqV^mybA8Yi
-0#sEi0-JHP=2pmY&BeR9Fm10S{nXY~8gc<3GVbOxz3$oxW$M)A)j;J97hACTd*<ywP6Pc4$?qAp?oCh
-IyvJ?W#GNQQWZ_Zp;$m<*dtFE#EZ>=C!a|CHr98WOlyR$JIRqK{nwWQ=TpEx^8jjhrad9}29LM4>bTs
-21GQgJui6ypGj75ET_#EU-YZ&Y)|?gX1&X(RKit(x{|5%NpDfE~=f0B$Y-X2+ZKlBzBj-<95wJC7}_u
-)P$&sidxY&9{c1II*{REo`Jkvsf(menx+y6BedE^|HHoXIm!2Vw|@=R0JFaP94sMqIZ;<c!$60Gr0-w
-$RqY9ABpU7vGcSBSI4ko9!^6z3>d&3GIKL~L+g07)6()0q^u{sYmWA$b)uO;`lEG&97hT58qtS@mhS4
-}!^d+gVF^~YP>dVQkz|_?pz^+_iSL1OX;jQkBco`FwmbL!d?6lhIvBMFy9_E{S?0K|F>WKb7QQe*23f
-Z$Vy&>Wx%9_=W(X2k84Jfw%eWU;l_7DN^!0rDJ-27-S2sreq&U7nVqSl(jPoT%f6LmEFc0xWSDBYWlL
-qAyWSNH1!pSLyGBVwS{V_!r$>x*z_5RyZYkYvDb|B>Wd_BEp2H$;jx0LHa}_Pxr$;fr_2zR2mwJZJmg
-HN-2V4~>A+f>9F1J#iG<x6s#far``qWuNs)D#YF|zmA>8xSDQTelCsM*6@J9gD^~TlsG(?zo1~_Ci(5
-M58vM^{BS6gd`aFF%PjViyjK9<L+0(NS7k8*dpE(I2h)N16|9+Py7d$Xcz<&QE`h=}=Ou2$ssv&TiCP
-@dmt3srhNbQmtPcmja&YbbwWPjNGDp-dW*2Bkm<kPfS}aoe(XfnuuzdEI26e&Jm>C8b%g4l?5^tTF>M
-s(fF<aZGIjUzQr~mY#?`da(5lM{+NxjhSkPa{;P(jUR>S;f@R^aum&>X(%yrzBM0yw%2z=T)Q2PD)^-
-HsDpu;01A<Ens$zAKH>LxZN<mX~!44sm$LcH@7Ns!DG9(77UkGXuEynW$|XqiGifJE2;^J2$Wu;ZkOo
-tbk`Lma%4uGsKk${n_dwFcwzvI=OTrU6E*vIqHnrs_~n5_g=MfCWkuS>KuXq6CI4DMJ=?h@6iPn`hnk
-LoT|qOMC+u|=fKt=Lot{|KH5a-D}V%;fG56<@}8VVurEw6P%+pl4o!E0z!I%c<oHpn><$e!asqGyqTc
-9b1}g`#gOOJQ7>K2IAJw}f^+-kZ%oQCz_u<GBH&7hE1c{81g@F0md43|0pAF>*5&f<K10U2wU6A@qLm
-)|LT_Ae!bvWgL`N|rRZos1tq1-F&kZe=wtE}AC4j}>IL`d7`12I>v&<Muap<zlh)nBj!(Bn;lGMg3Gf
-D_k*UUnBBmBzSDfMSQcar_qb6v=d0rq>{+iG_P0>g)wU5KQ<5#xkmdB}fqDyeV~@E~JP0PCh(eNM1rr
-?~iCuHzlHTgXV2wd%ou<sf7?cc)kF3zQ~prXlc~Q(Ez5Qh*@=oc?W_&CG%OaJ2B-j8h<h27q=OBF;f$
-o0g$QpQiR%+jBem5%CW4><K8Z;af1%O7*RPjhBKh!S1|_xiWOZ7RA!m@5K)p%TMq|wFHMsG5@hklu~E
-k>aSvo*K$0<-CyE>)o5i_C*QWuwtTuVF^f7|5$|(mhakJeyu!?}0tp#hm9TZ|#3XQ!1IEoYE2x;IrJ~
-$eQ5i=UR_n=^Oda5w`4^pK_bJ(J2`XEbA$ZZ?5W8`&`41qs(rC!qGKPMGV#AFeI^^#X7E~LvMB%p(}p
-nZFmEHC*jAzzu8J#b)huI*lc&(o>d`p=&~Hz8q@s&d}IBhYp>OK5iJ=ufXtM<7fw@il$?82>rTiny%K
-AD`>S#^eM-EZZ(J&%;foJ^{SX&&?)pMJEXBB5USzmYJRe;q5g;n~-Aa^2yi){Eb*dK9d<iAA?9Ga)z`
-)0?S7si2;j9mCwkg^l?0G<tMlqoN7{fy=iWUI5iQ0TzDR(mAzsMefsQr>j;z0YcIfMJUDL5-@MlJ$Tl
-~UVg{Zab}-+)F7j~4$Aax6U%f8;tR05ZY<3V%x_LuT%FVWK^$B$H(sGgGta_dV`Ki<-2A#czhJ8BQSF
-WV1&}zhQGuPds#v+tw%8C5gmmC$x45vS7i_j2j^xBZervkkaDtpwV7bNLs#7X`OONRj4^pbLsGh$Nzg
-%KY!!?o@Xf~{7`4sy_EqT%1!E%>PZ{G5z52T_g{WA<=2=YaV_N~zWl(yJ`#tE8ycn9{`D6-eGnjG3&7
--3SgkE&&9GZ8lcI^oa;(J^t25sbL83zcEt8rN7^TB}>Zy{#%kYmIeHGBt9$`^a>+~75w)kpDZu<?~K5
-5IU-mU39)t~wr|HFUu>*V7Gk|GVKwQxFRjUj;X)2|uD1<k2_L{CY_{-3rTheK2~^JdO9FzG+*Hm|l7V
-rihpn_f=>kgyz!apksLn8X=<w{I6^Z(KofKP4dHx@1QSN_lP3m;5-Jwr3ZMDdSUB@*!y%y#NNvo?*PY
-)08RLhPq*b~ziP=01C)sPaVtuKzf(2fD)n8=>-*OUPm7Th5W-##LUvXz7Gt$_DIP^5cd4YdUt^0XdyK
-WI+;Rsgpw*p%d_fw$&>OIGOA2?^)6a-=5PO$W+o-U{__VFnMzM7|Tv)bK6@-N%6R(RPP2-<wkZb69h#
-!8XT@3tn?YA2ub{+JMk6(SyK%5Qzqqr3ZO-$@YIR;2fXLZBJQHuZH?(v=t2$iq6nfxsndVRaUj!O~Dg
-<ex6-XHpuuVe&~jEgzyqCFfvNJw+$8yP*Dx9VxX1aBr*w={#LT!Nd6sYh2)CbxLwWY7-)>>j7X~~zw%
-%Y$V{6J>kFO6HbVo#o8&!syU0TL4pGWQWU9tODaSBttNGrMBL^L?%jy!70*UA;871w>-=R!^4g2HAlT
-&qG20I!@j>$cg@yiO!XtsH(k~Eb7+yL5X@6i9p4=~<3(*F)44y(>WV0W2TRz^D@o!2aTjTm-bv{Ka-v
-N278atog9b@DjuK6t`v<BG$ub}sVdr8{+zdsYUzvlHRfN-}q_P|);<pB{_JU^&>89Pbla42uEY?oQ~)
-Gk|aPUJNqj{a{Ya2NKrqxjYkZHyd3=<J(JQuwoAjS0!(r0vnUZRyWQ%#Vq0iSM#tFZp2P7Cv0W%Q1}R
-hK~sPA4JY`+oL3lZq|V2$-oEGyI8p@rBi9Mi`;dS*T$hHX%!;Ivm7VvZB1Vr~5`sQ_v80K5HPaW#m6q
-(U!tJineoZ)>?DqXhk3dUoS;&FZI?J;n&2KodDFu*^0S*YULdvY2-bu~zB(hMlVwrDKHelLJs44S9AN
-*`I@)SAjf(;cstE2dfH?4csK5sy-K7RW2=$Xs1P86MR+m}PNF1bs4kMx~flXPK(P?;AGhNYD(S}+kC>
-X;7{+*Ub=BMMetWH6acvIMe{v*60Mc2YTFZWDQsINh9rawu*%!btqV+Gs_&@#26BEm<`wvUe8iB+Hv}
-F>ydGP<bwtZkAR}B^8!MDyLAGrni9E%&FAW#H$@J9ILF=hc_?P(eIvp1JukN+X}EVnvO8wf(t_@9Hj>
->56k(ZaZFZQjfP1?&Ps3Yq#HeHH<yc_6DJicR03?l>I+I1)ieVv5OmnTo1Gxku@N>=EGZD`gnCZ6Y!J
-+jDmh=HJ2-30*O~N|e^_*MYtC`UgjGZ&L)wb#XkW)kbzb}VEQ&(Y^!(nMpw3jZD-eh|emVTN>engAYV
-MQR%9~id*VRR`snt!n1%aQyD#TIz<?z?v?~Z$c)4wqW-jgQk2zc6NvV+3(E3M5dE|0X--Uo|AY~O(xZ
-;6j8S|3Sxv$|cdQNk^FT&Q#M&|#9-T3sjN#)Er;LcKi?!U?Xrq1>V*yhMbVBPtG9+-@&UULGG)S#`1`
-Q<}{<keuapO(`Xgy}Px|SdUJimt}?Jz%&U5?wJP3ot4`vR&N0JQcdDUDR7&qaA;avq1lm4^14KCIa}R
-0kTVn?x<)ZVJC9w01Z8)+#A7Pa{usoi1~O}2gTczS5KV0H6Nl6b>+?f(-MiiJPc$@}LbqsspD%fPxq7
-z?xx+pqWSa{tJu5&gF(>88na<-;nB0XCUGcOX?RRQE9|YYY!%I-=><|F?O^lP!T<C^`aV}EBc7hl1Ok
-%VcH5!dP{L^cHdeY@LGd23dC<Fvg$t-bTpp+Yg0Al<%q~5TVx0pX-+LOgBRrn!u*)3Xkxa58n-Bz#OR
-vu<VH5LzbY0qzwujoTqgLDgAUiJ`NO9}q)0Jy9``k|UCc=+c55JegFgEY18^zQ?J8r3!g*HL}uV+Z<x
-H71eg+lshto}!~;Omv~$r^Rw^o3r%rOY6gU1Qw;(J{`{LIS}BYarCJE_eV9kz=HM`Rv?;stCS3!wpVy
-+!a0)^wI_U{PlnG8UoszY7$`7DK97SSNNYQF91s(bVJF0dW$xvG7?-;nH)?(Jo}+J(M+#Gq;9-g?VmR
-c9Wic|2B<Z?H1@oGOu(evzpD?0V;9Oy)NVnp$_xzPar^ek~Pldt+%BJhOBFDkNrw;!ji1BBvlS3$7dQ
-eb{iO~sd-4*F`XhWe1IwImx2eb|@*d%%}3Of<2sKFC@Si6Lu92X30FhFEaRJEnUuI2Xp0v><`n47a%a
-S%;wvSNfJ0L!uk)E6WUs@~dot1t(u3QBUK%}z<p!Pvu|l2f9zfigr%!m`DQ_sXeS^>kDdxH#ReH+29<
-3QWYIW$NWO6RK^O{zrsr96>A(Q(o<X3RX8t&^Bd_{uoCed94LM&gnXyUE~Kf9n3f)l`H>-s)PkJp<q}
->*K<Doh~`C}N1y!o$<P59KY|@hOAhO_#oJsuJ5f?c>z20t2<XA`?slo4$F~G@a$TI0vb2XO`5;Z`c}1
-syeK~*n0#=X#8O`^;Q@-PYVLH5N@ipxuV|x_D=>k?QA(5#yYIL5DScH#nFEq#a0k{dArdn>nUnsb|xy
-^Hkxn6OAp)2SlvP|(AvgyGsK^LLYVBKTzn849_cFo0uJs>2RVh&-34SMZ*{OeDz5I-UkqOPPh)H{ABw
-0d{K=Y@x=@M(2vwpwXKPL?z#vLe|O<Hqo+VHY|f3?CApA^}{aYQb|`@D%`jcm|e8&X7f%sU>^Bx;Z=-
-7ATwAn<4)N<SO1kpi#lg;pu3^C#qqtFh(Y^4K5f#dwjiZD5s3r%(pd&EYAgzQJKYiOlMb*jpT^;!4K4
-Wgc{5_JsdHR`&d9e*i$Uf0Gb_`gg-$ZE%~T<D<QkE_SBD9Vt7C`hQz#FXjsShL~GP7mmY^EWcQ@jJys
-|sSN)vo<_!AIfcAE}<2Vp{g7-Mx=>GL--oAFjrwMwXcpC1@!S(g^0o7>QV|D4s=e{86$H17Ch&lnY?x
-`1PY6d-^K@l^Jx=tvXVNQNfj!lkLh0Neh8MjL`asiI~QuU5G?9IHhIZ)RS1N$}jUMEKxcdfqw2W$rtC
-i<*C<!?%3>LO>PXn&cMucTyfwFoOXx<(TkR6jj>mMIh9bx4Yk{U|`FU>r6Q-Ug60v3iFEGS?a2UvRBK
->T-cV4+s#q9YHZwA|$$c=zk@-DDLBCvV<XQInDR4U%VQP37cN#5wv?04mLJ5i=pf~0Tcw(gGC;a=fmS
-l`evCFoWe=EYG#jY(v%Vc!tg+L9jhpd;r}>sm@`TTob$N5^=`w_=y25KPs*Y*SK3_qY&5!`PeMVfKA(
-g<46b_yboK0F@Up)&7~sUsPFh{cr$M$?b>oGX5&_f2I_5B>#<6o3h;t`_+eMn&o(R9ViOl!0lS>Zga9
-hlZaYsflGZJnq2H1aaY>x}ill))_n;Um{wrr8wX)e?DE|iJ(X@HJIC0j6&QUyHM1URlSpj@2mK$lh$d
-E^v-2<hVn?^`0qV*6-?wmngb!1sb=JxCYX%;)izKtz>&(isHp;PnPf_+a<kTdi0b+^s#eWhczwCgFcC
--sZ;Pr3_@0ntUl+)mw@EbEzP@kP9gRTP%zKHym!^@Ia<SVOw)5LN0=d)vGOKZ0!^9Zoz-e&Wj1>GW<9
-Nxd3u5xYFmgXpvQElB4NxV`VjFhB*B1ETwhelY-L_0E?^4;OkP`Qx+gg>9PuUF%K@!jMa<c2K3KajV}
-s5YukG5u=2$sAR*wAmPwKmWDAH6K)ll69^l0*+X4(arr|ClztxB)?u2I}=pq?$tuV_uc>LSh+om+uA&
-@Qc>&t7-yVcd^eb@Nv@8R7C)fP=TVHW3dD3N~NGrz=TqIiEh>+>PpUI5}K73?JTkkh{>2ubBh5`v^6r
-MosAm+gDy4{}HVSrX6H+glE(=10mG%>gaPB9fCZ4jd^_QKxjEi;fv`T#S-#SAYQaDQmnc?grC)nCjtk
-85rJhK)FX3=rGzrtHDi)5dRAs#yx_M=a_k9S?m2yCJ6fENZr^u`o<-<{;5x?o^I=tr7qW2=(ZKoa!Ac
-y(Z>f4xEgeXTSdBJ(osaBceKcA{P`T+lzKkL6DM{}BO|8Kz;dpWqVi?tC;SL{m!4!;0DCiPV^1TKydA
-OcgV8nkBn*uob)Ia1A^1H_jGfERcb6TT%|R1{Y4fSV-naNKU2ZnetN=Tv6HMBhs$(f+eTlKeawYi0L@
-S~4gfIeDP<$S%uMWRLZh3lm7}T#ic<UPjL-7Y$8;e)3y!u>A{qMsfX6XBd&ebPtirOs}c8eR=$)f+Wk
--Sp%<O+U(!=ZBuBP|xz>a@N;bheztV+@v3_a_#-Ion!asj~O0pIS7-U=dxil3t+%Pq`X->>=P|P19a1
-s^pqxDKTcU(H9Gj1X39pygic(&kFA_qazkh&Cxr6K}j^s$CFG&51OxhL9t@$qjRdmZtuPH#Xxf1NA5Q
-n7FMH;Y|_Xsm4_?bT^O%zNkpl*K#FSxC=`~^Ei+VB7B|4x0Z3a;(F6B|y*K6_vWMe%Zg(<jSO$o3VQ|
-Byf{9RC`bykW7pV(oyP*pDnCkFpLU;z3&zxH)qs&u26F}eASfl`;k!BsbGKb2%{Oix~8azM|+8`{Q?%
-L$LZ-E)!U@g`zZuZ@Gf7uPm&Tx9M>mB}lX%2td@_jzSg1&YD^LE3+yU9f^_Dj|<N4^0lTVrW0Nm<wd&
-9%mxPXXnoctr5!LP#Wlnp9PWm$V2m+igkL10m#8=S|{oN!mo_@;Y-cmrHBFXsx%#V4#WN!QdjCR>)K2
-Oi~u5oeA5f99J!}`hpG@Bvow-g+yAaV{c^{ja_k2ep@7Dcp_qM6sw39E3#IjU)XZ)6`I)I$Qlqcm-^-
-!lLAR~zNP$oumOb@GkXtiY%v)fc1ihQyPS#!$t>^<s3~6!RrQM+gVOML#e9x|?cr*4eCoCS(w^K^`&1
-_vsO)84);jX)-NEujEvb9X7Ad)x6z#6+2Cw!#|JIRlT&cw*N=zP!{AIuPztUb)tOGhjmNS(;N!lrf>9
--(y3_fYnx%Y#1r`J5fDNby{Ng_7%jM7bhl!KHXytHvoYoys`9u{jKixaxi(@jiM8LE>j&kAnRpTe)bS
-vvi^3ZqT7yd?ipltNm{El^;|pbp&W2RG^<7ED0@KDVF)z%p662c2^@huZuz5{^;kfjcY9ybBJ@<nX$U
-Db8)WaNsO(e~AMN#`afe2>Kz1mO-h$p>C@f?bWLtS)0{HJX%-)nIzvg@GqSMGv$yKmQUgyU*;KdIhTj
-hJ#wO9xKLCbI~U6N<4>Fc(UzrwV8Dq}NA6tw!4;M5&Z*V@K9GNZA16U24c-J@v6|A_77HBY-Cq`qekb
-0MGI4q7QmQD6zw4^}7qR|75G(6dA$YS3*WzNaGhdnFXecGcnx^<=Xea_M;v{<V^qD!m(z!ubZsGYCul
-y76O8?D6lvBrBwdOqas8cv%??k`lW})CA-B2{Z5?O68e(vFo_HL!D4c4$3b*=N9(x}Eyu-*;lhv@ttY
-C#K+><uZ+!Vs8Obsm8QI>iXrbRmbe!6K{6{7T#T)r*09E@hd~$as{aFjLxQ#oS;7H1hB39^5!s?%TO2
-``-A%K%a2Gg@WbpH63Ijk4s8d{z0pXocqSxiRV;R(0}RocyQ?$8oEVlB;g@S8)K)KlCi4kj%dpv%Zmh
-WPq2F%kcIidA^Aq(siFBL8yp>$VjTNEvY;;~?d*AqiB037_d~`p-#>4D4x?{A(j<oe3<ntVcl@c1_Bq
-izPdG~k2NT5eI{UkxJ()-V!`$URqaEx||G1H)3<Y^TX+wz}rGDa{^RU4lzO~DQdYnZNHALjm?~2r>G%
-N5VIA4+#n0(V~j2x_-vx7PKHSH|G%Op>Y)}?S=;%BO2yFSz8?em2d8F&>JC>fk7C8;}1EE+{(`GuxS_
-Ny#s5=q7$0BXE03hnlQL>ydC<tHB~?C##aWm~sIuqUc<k5cglySr~GXZ@n}b17nvilTKWOb*Rfc)>hV
-y^-*OMA|F><0Ct+r$aMQL4XggEhThO2tv~Z-Pa&jHHArV(k@+TEnHiLK_KXm(j8?2omgsO?^|;4WFde
-ag$d_ELkCUAtAIff0#4UfDB0T|xLqoFKq^3U<0{EjlF=oB?TIE^5#sXnz)gL)mrPPH^wjp$38$eIrJ*
-TIDZkC)wR5gTG$Bfg>m!!>s*(l^2XO@Eb|aDjRLp>)mb2{U7F6+h-r>5X8@xc10e9Mn`uBb`rsuGp`Q
-zfezMn>k^k7+|^Mf^agYNllm0LiEKYw!{`0lT?grNHi!1gd&$-il|3c~E&a-8c6tj<G{^v{C{JZtGo_
-qVpx9ju8%!9~r6DSZa8x-`Z=mj}A`VP8V0HSc8nftF}3xCfNnR#?qd=DkPAdVU=z3d)ikS?XSBV9wOK
-S!ic(fSBza&{jrAyFEghPOmk1B!GXes%}tXChAcg<LOEi;4Y1v<J_1S-D1tGReALq50Q)X6bsD+v+SH
-SUVk%}Ml<&pbV3xmtPx1~wtp+bc0&0*3kDk|r8&>tLiQNIm)Jgz?O3<}rV!)M=G?n>P&=r#a`LQbt5j
-MWC-^0pj>RK)&j2T_5lqi%k~<8b30c@UIvOq<m=~j{SJ8UL(Va$7OQqY5qmEJ3A}yw(H$9c)fPY^_1#
-S`E2M4B6vKrEU#-a$*DqTh7*_#d(dbE-ufdAFK-ck6;jDG8303$9<<KOfNF=9?3bQc6M5N3JE2;m>)v
-CZ!z|9b#1Q}&dXQ&TE(!%v?Mo_wZnybSL-y_*SC{L*tm($a@|#hY>y-Dko>bj3g7DP(H86SC;56=!9E
-FTMSLC%w3zG#m1)T&JaT^&#hk{MZMIbT;%m*KPZ?3a08LwBpc6aD{NUX8t}o3H)PC@?l$`EMR5Qt8GW
-8j@QGUYvz=VP|!&#&upB&%S+udhnYG=7s4jOdka7DFD&BdRJ`AETEXc?SdYg18&6$1(EY8hF;(YFx1b
-b!(8y>h#l^kmJb$HgjfS_7PVBaCDH1f2L=)e}LB6)w=ALFofqIQcB`=aK-rh~HxNOnV)C~!EIj1h~Hv
-LhH+Zb2GpYQwFx&-U92qh=27i0V%`ZWUM|5zZ4g~SXn5a>ir9XBY9j5^x{;|$fBe&2?jrMk>D_?RUZG
-g)}%vQFS(bD{{ZJ$d@glW$CoK&~77#ZX)oMw_i;Oywm_a<1K<*|C?kTo&auknLRCGTa2CsCe**){EM(
-aTYTn;DM8m+IF$1ED{$B495V?Dm)NHWtx1cgOk>DlIR0EaSxdCh9WWupDH8VBNH9H9c(VA5X37C>E3G
-M1bKRcu2`-=@-I<%V{R3c>opEIV1%Zd3=?<6W5{B`Ju1O;J8>`nQf3lE#$_kmaDifX_>Pm?;;S}}vNd
-sAGE>04o{cI^k(KVXRFU(0vy;}S@3`(SydS1T>5H;EHG%bZn<cEx=m!#Q-Ji>546pswMuj)*ZZrrR++
--LxS!ZCR;bY`{U%Bjcre&vWYB$@7g`~O_(n*Pu4exU?cUN_Za3|h7*zQ>5u0TW)i05-n8N&YMbx?^=I
-Wb&BGqyf3x2P;zF`2kRl1>>oQcNyp|IhvZlmVvd9UXK}a$EgjYtiWFFr9>h?T`3(wEL7$Tf4uTfO5){
-ihOk36r@STr(EViu=}NiyNNB?Y~bA5^m5q23+Srn;cwmGG4hu9Aa-K)=aYADN!EV#&C}n)BaR0iabZD
-?lxJax=SSdW0Pf@In}cT)bpT=-`0U{5X$*T8C514!)ChxD_^m+*OA@M^s{&{?>WL>sQ5m3nYsAok)`p
-64fp_;)a8v@`BH9CJ3B~VN%#Y(CVdVdatdGFZPI9-+up==Tb+eq_9z`d98vfBJcQ)oKH8Y8EyDxhC4~
-DYjY`qgK8#?^^6aJhQ(wOotOJ$V6w?I%naB-&jx4AR4lMp4u5Ch=wR8?KBK~d8U&d(0cGX6o^r4uy=Q
-H9)im6bVVjrxE3YR}fVN&Ym=QncvK7&Mv;8t>PuDe5fK-v<%AKL8Hn7X3dQh86E!VHJ|lGN&W0hKxJ<
-J>y$)Qv5rxRjutU8`Pu6>SKZC$qRcLp?io9q4;VZt5fN?Z*YM~PQMV~2_c3Q9AeBk6x02+W_#5~pGSB
-p9${F0kAIi?hMmw$o->%{BQo{dM_8@iW$yeFbp0%SJKDv$p{0|e?jZzAbGZ)M6!6*1^@1=@S<xlk8ju
-DgXqwHOG~Rq&qm1#dlL}*)Tyffe%>?X03<}{-AvaF7Fx@g?>MCUm($3=D5MI5pyeLaPM1Z;2T+%ODWr
-}9y613QeX#O7BC3F^;Mz-flt#Hoj^5EICuYY&&gsa}*745_ThLK$`RCJ=XdjCP~9esWD%qM5B0JU|w4
-$cN|7RA2@NV{8Mw@bVA{>nZW-Uh<rknd()U;8`t_2FS~t7^zV+tH(1z2w>vF)tp~CQpQ)dkf<x%CJ^@
-3eyjKe?2&-Z|*mz6PCXJpgEzK@rLOOuiI@H`E4gwFwUHqF9m|AV6{))lG|Sge!pdElEY=0$Lbxr_l*<
-#H1(&glg6j?_%^>3f5Hvz1aq!I3VXeu4qci$l5?;F9iwy~@6Dd76Slf2iA=WwfwndAiuP1sd#E?wcbC
->{KHjGm7V|`2fiLqmAqx8ye9kS*LAot$m8UZY55l1J<hFwG{~J(C0|XQR000O8Q5kVe4c_mrN&x@>Oa
-cG^AOHXWaA|NaUv_0~WN&gWa%FLKWpi|MFK}UFYhh<)b1rasWl~LV!Y~ZI_g7f#kTOs%yCI>Sw_SHbQ
-xzIREke`TDXjl~PARAozC`|b&wfv#a~C;*3{n&?@ZFF=9X$g6ktBgbWZ1j<bam`==iIqOdkT~WV002&
-v5NZuA6t_k&<TMOAf*P`!e=j9jPV4TL(E0Ey1~L`SrnPOQ*L)uObeyyIRx6jnKc;lt;=uS=weJ}xhX&
-+#M%WZm%9n~16!yn8Z}f^x#*~~)dgE0*)Cvpr(cfXNnT=iK^7N46W4W)u}xus7Hbr7Jb?6dqX)Y*UQJ
-&6ln8a2aboHi1^I#=O2*$F)hjzK6Fcd!uX)2GxgC*3pQF!$gF0NQ@mBLbpiCNb&|w_fZXX8SU{;djBv
--Y!ymwY$teIhR%vg73Zp!nqMhSE@J2^)^S(#_@7x|*rJN*eUtks^_ADcBW9h>xC`~y%+0|XQR000O8Q
-5kVeU!P`~MIHbEnri?6AOHXWaA|NaUv_0~WN&gWa%FLKWpi|MFLPycb7^mGb1ras?LGZ-+cuWJ`>((?
-(~*>u>7>c*W;JzY9LH^amo_=u*}a`?MxrUmVoeb&LE6!FdVl-94*&!}%68hj-p%Z4I*mjE55Rj5?+fq
-2kHr4teUYhUUS7>a+pP9q;FG<*FTVI<ua-ZxQa3u$QtMomd;b-E_VzB;xfUC>Yzrx>THWMJsYNQzxr0
-!bKgz5TjS`!*Os}L!%cZDft#jQ7Et>|0h4xvkw06UZai-LDF7;HTZL^*t;7{;#lF+R3O{MBaC~d!0Mc
-S-Xy|KTWd?WW(wc5bCiUP)mnP_2NexFtq49f49X(O?<@Omy~(WHC)KEd(r%lT!h^K6cf=DMj(i%e~*w
-6Se?;zfQr6}g^Q+h<epwqD9wE??(aGZk%J{HXGhzEo+grGr8XwqVA40zUlk$F!bfqxq5`$WKk3X3gC6
-m^W$;EvDkkAn%x-{~JEq$ofj!h7&Uq&`K6=Ak%9q-qjN3BbV;M>yvMe-oLq+pPjruJv%wRn7=vw{`A5
-CSp!T5V<}f@TQqZeI2FrW146Pj{Wk6AdD+OiOpAHj<lX2n_cCqr8;SUIL`mW{*K#|*fxbnK6LZ7K6cD
-RTANeVhRX}LQ;e}G)r{(rcF7p~V0p@pF0<3&_o~`93or>diTVBiMNy&TQq^=d9?pVQu%jUK8o=z-Nz+
-~I3Y3q(&$ElX5rIw}6aXCn9%RtMtf~C8b-(6h1JK|@1L(An^<4#bGoVRs86<4yE%kn0#RXI01fghH#s
-hJ<ALa$X@Ea#WoD%ILGBVgE+n3lK*7;g&jZ}SpbtL1jjTUOe%8u(?|EsTEb?L88>zhqr(5&d~7mtqY}
-jez8*N@?>OTZzjwyS`29rQn^BU*<*LY=^ne^49sq(Zwka18lgGHSnRx3YA??0U81aNpic+vo(Byy@~<
-{21~Q7tziS>+f-Zu-b<mkx{;e?FJC#SknpqdL>wN9(O+QQ>Q;|tgqo(_&V+zrx6K-$JWHPaD?P_gWv4
-Qysfa_84haaa72v2vhNia6dE%%67QSp7NxVW(Ptv-`Wi6U@T6RO+Hvs+E11w3N<Bnz|<o5P}9A=*zX*
-xDi)cyw6U|HNfKtTe)fKd)T;WXjlK*GM3u(l0Q86<NBtW?!GqS^E(B3pddR$MgcHNJy=u8=T@AI9)n0
-*0z0&vGa5kzjz6rt6Jb0bAMzd1-#q%oB0C5-EXm4N%G8I^cC$Z>QLND{k|m5SNk>0uU9jKJcYzHTGF_
->t5KU?$H<EmIz5Wzz@J|Ge@mj!j5+fw(VU1==sk6(Ky`yk$6S>76Fy236>_tGPz2`jjZ$4c4CLaR$~X
-79>N-72bY-~_Xuuu-URWyt5c6{Y$xh4c^D!X@eT=x9;=NbK_1U?G8ur7v=yr8Uf*bN=xgwJCO7Iv3TU
-jE#XzSa)1U={^hm@B>rZa7%4<#U(i@d8MOpyk<6;;XvY<zZWm^+vp-qa<cqf+tbxyzz#fNL!9Al7MHx
-p#yXf@Dvqd^b>0dFjad?YB?4S--D2e3mq$jk`T2WaqdZ_lGg_&$&fq?jGfjGDIScUt>yneYz80Lgy>s
-l}xN!^jzIxPJ{mK>!n;8(D|&Unw(qi%7hbS=wp|;=Gd{JO>odKaW7ER-nY?XeK^<{Dt;)#~0$VmMOG6
-_lFXor$M(D+r(|^Xipn!h4C!_)4_`bgv7WTm(;|Ek30FD`t-JaZ;0T<1BVEv)hBLG!rw<p*cE&9#Ujj
-FLEq<}@^Z|!Igogdd2B_NLT%d2o3zGhYgw#N&+E#Q0f6K)AStK-l*4CcVF`T0>EbgBM!Y{eMSLt4h?&
-L0l81NL>sI3K!;J=pAXrpFt$?bx9cO|1LDqqBEJWPcXaay}S4$H49zYQOSqe5k?BzxjGKJl(K)Q*xQm
-j%`onPf(hzd&$;$7Fcxy>`_!Gm5h1-nDHml~&3Hr>h`gfTDz*qD>V>xddlWUX$%>e(Q=kvUpTT1kLCu
-mpdJ)={XdJOgi`0S^hche($<Y1x3Uq+0C(gl-wkMA9nU9Ka$VSp*X`cyzNeu2+iG01bWva?}HtT63kF
-G_kX;5^!8B{8^wa++c^?&{*IfM)t+%W6=JQIBvmkDH{+QIJLH1q6k4Dx^9}vx{Ux393@~tG&Y4b>q9_
-*KQQO=@+nw^Z6oBS%Ih2`EhKuJNMYSxT@lBS*yqNGb5NYy2w0t>xL|7B<{-yF<nAAxAD^CzY@MQZAcM
-UmW8F?DiGZ9o&JZo~YlH^`fDI$wUwrezbb^t{{vZR8rxb%B2}vRmN6b`BWF-b6OKHXMB)TUsT}Of)v$
-{}1tKx=vYbtJ$ANIL3k-+uOhbII)z<z5;`H1@VYr>GnBL+2^1f7iRik-Z%?L8HvwpqRKdYK+5DLSD9t
-cELcJgGgAg#Z5uBwz!2VRQIR3P$sk%wyFyhX`icTSoU`lj`uIZlO~qYtzF<8_cgQxbw@ol}C1r$B&I;
-H%DLRN`IDYypkoF5FizSytaWxDQTVf#F?h}S!1vSH3m}nTFOeG33E-d5?(1_aMu>xJ7|g+N`|C4$#K^
-hd@9&~&?TgHWnuw#)wJJ#N-|Y#$CJH?<KB~nW+y_@G@PQNTg<C0LrlL7h)R)PmAIcGIn8q*mw@D@ssc
-a=Apu)emdj{)%u?PUht&AP)7i&x73c=`7=?Of90wp-22^S{AZWk|gKe%A%Ipj__9bpIR39=lu8m_jet
-3joD$c-f0`}#2!;U%C>1_i1z8tf}oSQi^Yew{e{ana$>|<dfUK$43q@TK7H85D3gBpngDC5xytV^OW`
-qER%$w+)T0Cnp0(IL|&;(;?p9FZK>QF5@3VhHR@;)_bDBI#2V++i*I4EY@^S33m+he94Cg3uWA0e!8d
-oQbn<j>Xd#PhNm=#I2rBV${LTz^F*wXoN5x9UP1Xh(d8Z*etyDY+#RZ4!<V74%~3`rJjAM5pCn1i1a`
-vJn0FA410^cKrfkB#StLn#zNhK(#Zg?NfP3X;rg@eO^_$Y4N-)^?>>&dNi&S<;Km2mr>Tq13b4v)O2$
-Wl(}8(y3FCkK>RC?*vWGi5s6bmDH0l5)ep_d9B+xqrSSUtDXfn(W4wh<@=4H|p%YOSw1o&8Osv-w#iq
-$-f|LjjM{y=IGoS6(awx=5r*)a#8pKWka$_7^0C%+>*26i3Qr+y5NupCaVi|_Pd#Xa}#l+Fov>hVy&C
-vDGKUbZ=CG`63|F*IZ9#{@^@Yry^$;IX~Lp!b1QiQSi6Yxr{T^vR3oF&+smUVxDh3nG0?0mcOU;!1&8
-wsn$Y%ArRLw{6lADCOP^?7+{P-?Qg`deYy-ExFHza{-^@k&)2*Z)ADZtVdw3*e4g;O5*Q}IxY1|*85h
-rkNTS(J$qvf!g|AD`YRbEu(kCnRgL-klx(E_V7;yw;f2L?7M1;U3*9x`{TdR(63z$UbBD+SFe>oh<(8
-wO1F}==nAdEC2DFZ_=OP;Ss&V0*hhx-(J0|J-4CGi!=T0W#l?^}05s0i!iy{ofOAF#sRXKdM*y!0RW_
-PqkS*c=4!D#X}K%T7A8(EGTv87m33nF=$M5q`#x9RP_WbV$s$h5T@KcsbVvU3*<+VbuM=uTEK5AKILp
-u|a}&|w`P@PP%5u`CR~d!e#!Xfm*^ooXeLc|0JJ?D^krX@)~TRF)lyRhnanppgaWHVhAHv7p0{d8P0K
-N0kd?t_8c$<H;gnKMnmv+Dak7o3v;pXcA3FLJK}zNiPeza1m*CGDsJqTi0rY&jwan#ujziL3jm|GNz%
-Y3&B0SLNKA#6q`sE1`4zLB}KS?3fh5)rf^mqHO5a*JmPk<LIp(LfNb<ygp}-4s6mB5fmvP#t`d#!rC0
-&w_R--s@r|Cw?$$kIKD%SD9<%f&@fQ5UI$sXEBQdUj8W5yCOFVQX`_rTM2yDPo7<2{f4$|oR4C)e;A%
-icB%gp}_H?e-S`FFUHaiaO3;U?r-<Nt<VTX#D+vy4Bqb2_)exZ#6MW7oXbXwpaK4&m%e&uNdozHlBeN
-es*`R!3GLhYF`;7O-~u)bxE?{Ct)tZ$FlWbma$7JQ>Ncli{VHQVjzcf59mIr9@d{$H$nNq*&!G8rHBy
-(cY{`_+upA1c~Ul*9PzLWBqt{*aD6p9T{c-89M?+jhHo|UCbFMiu{TLh&7$;bksyW1H4;-fscWfaP(U
-`jRs++a}<DX%x)~ex%MIwepvc5Oe5ng4OrwIM*zh~M=(7QA%8diQ6~szk<d9^A$Bp0=;0fuPiD+oA*p
-Viug922&lY$pf)rt7FkWb-+Pv=<T7F2pHN}w?!;m|i%2@i1qtOyvO__q{`Y(quF!yf2*bl7E5V2lZ=a
-EP#Jwj~qt93)>naLVJBL#OK=wOVSgXw2c+aU*@&~|}Eg^3olG(KB`ec9BlrrZn?(jqVo(0Q~_JY{-!q
-|F&&G?wk};gTby{k?5%r(N6IT2R66_BR`biP4S$dsuVOg={#`yQ}=F<pWRj;ZYHTQml>n;lP;$l?~eI
-H))-t0@jJ)XFP<B`T70X8vu5LCyfBt!TI6s{N35x|NJYnIq~<7*(BmE2G?(MjK|*cDenecJbQl2_{DB
-~)Jp;v7K{UrVFzX=?gWAig$0dOai9VZOyo`OAHX>8GwF!o;}4`48Y@+iW(I-paP0knL9HW5;>lw+b2#
-dOp4AQbm@_)e8x&HV4Q;<+%8UK#8E?dyKmYPSEZuAq6MKsGzKK}{+o?BU8&7tP)SSuHwV-2D`+VeW12
-4@9+Ycr`jY;3y-iP+f#NVOOE=HY#i1WdR8#c<rGV&pMx^v{77lf0KI@6*Vf78KtBd~==lfHZ%m~Di6u
-oD}TJ?BP<XNKBpfOB{2tUw$O_4I^tFNy%(bd6$uN`Zh|RWA)jgM78Iw}uZq@sAxD?~E}F4!{RHVN3+0
-y{0X@u%>wk?(T&G=qN{Y+#kOu%zX;=1-l8;{V$kp8G4cI-541Lo+Zau*nP18T?!uB@G0<tu4G0|-es+
-BVSz9d=+|7;!}gScJ|Ic>jjyy#khf6^tifD1t3=gT2kT~29Mr1}gU63Fd%OF8NS-Ipefl|*#g8){9-2
-U+mU6D>G#1Hg<^-0<=)04n*Q1ckZpNc;PcBCO{9Y>%-f2U4GOO2OsW2;5S2-rhH2^-Xm)Z}#KN8<yqR
-~_ky`Me#O7r0cK-azV_uWfasTOk;e#7+7C8*FPdm-Z8+w%)l6+GyY6*C3OQ<&pZGuyl|Nqsn5e@UeME
-`j-L(4K|^z?g!EnD3WTk|;3CDF$7|(?33W{uwJpQ$JWKrf%YVAGp#ToCXao%Y}(C<DmqZF8S%m9n89v
-L>}v%&3I=g(Pp+|Lc-LG%<SU{7A4iC9Lw;m7zXqT#fEsV(<?c1&i>1nFKwo*4H|fFv^goD^J2S>iQj<
-Lh1pX0&t+cHeuC#NQvJ0(fEFLVdh+DsOCJ1f&50v)w)m+r+52@kH{zB46tJgL64(wuzj88$06gk^j#(
->uKF7mwN9&Oh${3J0zB+zI5sd#D$%<boL5iNGb-JN%9Jd&Ck%SQnIqoM{vdIXBP2$Gy95KOf&TjC#2d
-AIr#m7#p&*yoWH}g3O^obYNc{CG8WRmXZT^_lgeTZQ{W4gg^yp%2^j`>MGm>F^QY++ayaY|oaF1U;F%
-yT`|$!6AlZN9u*bi0;}rOtee^6>pbLIC)h--@Hq4Q<-0p!~S5Fa&6d8CH#Y*dn6&7%weU<~V+bxeX_>
-qN&rUOcgl1`;HqDeLs7cfZl=8gJc@{F!`MFXJX>fOpI1aC6{SEd-n9J7sOwNxzUwGrSG?S{^aRbqhBV
-`GJ%Y(QLdC`_TXiA_9vM3KE#t7jLEwEA(M<5l9014!@7-_d;#OZ9O^9}D`Lq^8j$TX7%-vpYLBTYa;|
-OW8>aS>qvk^cNe;RKSqKK-z<hJ+wB$(%+RB)(9<P%3cppLMw12xpB%9%3un|Gw-40MF;1~ire<S{k;=
-}UxFa(w`00EBxdH}K_$H7tPFd%8ckdi(poTKsB5URB<Ocx&z_NKtN7$=q7OvvrNz@0V~V<*tS3m#1XQ
-eH<hr0xS-===0jzG*k2Y&Vy(4pMpSsXmS5*^Fe2%cbtgmm=TfnCI`9BTg$>2v@;FHVGb$cqeE8g6s{0
-96mm=num)@lHrP_si_<Z=kx4IgoHqD12%S)KLry)`5y#6TtVB4MNAyBaK%eLm?%(3snme2B8}<P`Kbf
-UbR=Bi7qK+hU$|j_P9k$jn5u2aKBcg$J6Sact0971>BXz9oiv$(+7x08@Aa<wOnmLgV@67PZC)-Yo70
-D9b6`uDEE(&Ig)6B`T*t-26&Dr#gCIX@FAj&Q=*B<)G6}4Dvp_Ec$*TNV-Pm%jL%*)ii()V{VfhOiJD
-8LJyU#288c%k&9&GFx4-%`6I_trLarxuLDro)5nHp2^I7(AwEcq!^*vZBp4e?y6B_ELmPA2BVQ6Zf6w
-sllSD87y!fDz)$_XZCMDQIUnzcxvddBeJ52i%2Nr`l~d&(oy3AA9z2mnmfHUQFqc($c8?E(8~vL<>JU
-N6N*brMC+_=pd#HO4(Wtwi%OwppUxMbR1`cfNm#6SQzxSJI1%Zk9`6%DbR)Dl~N!N>a^-)N8qDTj!su
-0<PO3Hc4QQ%zkB!f^9UY^@2S3naAXTfOtXl(^A2{H1ra%h{;Qtk8Be0r2)n3oQs**|??5C9@5Cb8pvs
-oHfuIFic9=9KswD^hd_WA+B~#!JXX=J%9zLQ7PHZ}t7#c?W<B6@xo;<{8L~r>p^rDlts!%e8$FDHjp*
-M2)5{(n>Uem9z0a}&rJ^lz^|EN{zUgMAOwQ)fX2g_s<myPH<FhRxBK>2R8I<_Wv48Sj^zTFvhN4i9vP
-1&v`Y}CPU<6+42(W=pIKO89WN?c)(we~&ey=?p7q}Z4GOl`_L9Yh9)QHgT=)slgK*(LBV=74@mK4FHN
-1bO?t6MxR233BrXu)%#zas&S`846}nU7A1f6s6JKuh#ks#06tfSDE^^a!HEIL9-eE9TekpxG)DOB5S?
-G%7w8%vmvf7U*NW{Zek0_fWX9la%g`|XC^W@y^4(Tw3q}=VJ$AVbX3^IB22y=`DLMwW6#mfBA!8SXk@
-7!15bI_DNZ0x1tJGY#uctSDawO1e*L}UBWDET;{ywQ0AeuUz0mC`$}Y^Vxa{b=F4#lE8uQ^Z2Q!<nHy
-Gltv(-cV{mP+ehu^WP#bSg_Okl(jZ=VO(i$$n0V1nfB18|e2O^I_=q0(h<Y*LN>&=_{=f=yTwn3_Zom
-;ihW#-iZs!Rs9B#}1CUW{+rqP<mq-F%=B=ow^l;!Xt4dZc`8lme;kcZ?FJtfHNtOaw%7slyH^b@ai~a
-UaVl14KX>$pjxhGi?Q)d#9%fSmV?+g6Y;hAra`<A4!kv>McFNZ#=&8zSr4nB2o6?!&NbC2mGQ*97yIC
-WdJry^DteNJW%@4Gxi5SdX#tZ{vLl?=qb940VC>s9-x>fQ^34Y3o;FzCw^X+!GGCB`94T!IB_-CMq|L
-inQ0QpU-!QD0f}u}xKA|E!$+X0*PZPhObcLLJ)TUO2cGJ9-22wDWj`_f9y?Ar(hnNgwX%k%P4MDY7=!
-H|<DFllLLB~hnwsQrm!uVypU}TDc_2LYI)!rH4>PNMLi99sI)$^gwV#<XT$;ZGB4WEjh#i^d0=4p-RA
-w&5-1G#5PS(C|Hr2|&;E^C?O2l;dZwsPM_Hb$EXiw^W7ON^}2K}+-w6O_%(0SgmNB%8w+M;72;-#h80
-vqavi3$5AOH8OiW=gb<`kt2x1ay^c_I>+R^nq9*-p*Q)!|0|b%c+(FCl}nRfiXrA;$dM7RpydXI^(c~
-x&@Ot?wf|*kM0+cSU9oS{M@hlBe5_XWdiN6$!gSHD=%3K`_;IhowT3NoPS!3R3U}2NyA0mlR_<>yQUC
-V%Z)S2c@zzKc0Y6*h2U7^XSeV%@7I;UEyeqsiC>q=kgL^NBrboyr>BF9fWhxbz@9CsE#%+gvmX7)}DD
-d{(#p&B0&i_e;&!U3C+8vZYk^C8Cz&wn9(x9V(sYbq&2$Z|Bn*x>6fhh7q4bFMLmoAj$@_$8_-{{HyF
-5c_?5Px6p8srqp{qfm=VuYTpGsr*fF7~;PXWsu~vCRJm0>2-k?+{V(ZpmLs)}xE#@BT^H-<hz8^oNml
-DGNzv?L&3$>ytMp7bpK9T6Yk;jDb6JD0u<FDefRv4N~2`j?qccKxM*19cl~|by*uWcb0RI@b(nE{WSl
-(3C&>zE!SkE#cjIPRJY>+<APVdBdN>$;bai-@0M*QO{|B@H~Nm-fbHTk`n-&v$z2_6(x9K<b7uz=pm5
-nXcQ)=47X3`Gz%M<;qsXqh4UyVXCNdX0rCElTVl`ltZCQ4tHfqsh<wxS%7B6c}uTnhdWnh@#jj<vslt
-z-!T_UazT@n>v9O-T#j*f!4$obEhvqky&<I!JLOO#ioonFLkIvMqjVcV)JD}qf*_s^{8p1tUHC_0O=c
-MzK^wD>|j3ox=(!Cy91!21>M^(I_KnCV1mt%ilVRyM~jIFa+$^sVHL;9sz6l1offt(&iT>=lEWN8{+w
-HN+ZTTtg8EF{V*I<r|7*PIe{w(^WT|r|;i5JH9g}(#a?2Y39YThrYb=;asQ&uWu{TiY~>&X@=8^XYKm
-hJ_8dK`@D#5Qc2g^UG5F?5YyoGp?Md~%N^2f(lW2w!W3==98}ZIrrtHz-sO%{VNPG`9SeVFZa<IH8!#
-!}-q94*dq1*ic1CP+jMCm}g}DeA1?IvIN@cM*5{*&;AhTmCG$y>kMD%%3IW!kP-%$$vKqwYK)Eg<$U9
-<>$9QU%jIjs{$@Tj{;BEBiE9@2UdwduONP8wiogh_7fcC))b>;qxXM<a~?(RK2q3f0|x2r5#~*X?S>_
-de3C_chgX<V4z9f=D;x1d?`;NWc)lYc-1yzQop**G}99GP*Y05#D-|oPdm<0G8sbldOCy@K#I<aFZ^>
-6OY<lsfNH%dPWt((Zy@QMRml}p46`C`V=l&S}CRg#%k?_aNWI@r5~LqTDVL0u$q263Ghd`G|@3sFw5b
-~-;z01<{wgl{`djx72Ola=?aeLqRXGSWbM3B)v3Kr_`bVw%u>vGRfK1A^3;#)c81^`0dvpbzB5Q3+Kc
-Y{@mglre9^a;3(LhjnADY<>$kMpxEsFp=hV6aH}XB28D)#R^ggf_X$v9CctZ!|53{S{UDQwTvZazi!~
-089@2tM<T^R#I{>lncA4+)Dv<K7PGd;jk{X$Rz5UZOvAfAnsGj&fsX~Uv$Bs5;T>k@J!SVa2_e5~G8E
-haS{@I}YSFkJVfUn`FvmrOraIx$mXQk<Rq$NQ7>i}U&M(frl>A6~yX0ivk72ci4K5RPGre(!<wM9ii}
-#xtg$d*9JA%<<}WQ((#4ZqAepd)ciw=#DrHgnjHb9rQ>{f`8b9E@bgtl2~^9Z2g>>69UdRnRSA~+P*W
-f>n<5~f4EHHm+-P_YsWeXv_r&L$3C{0`w835k!L@a*lxG)>ax6FfrDfJEXU9UXs@BUnSYwvp=jF$S>f
-Hri&-7-7Nlz#K|6UjN;1U3i#~}4sr^eK9Vh;v$b0}@48|w$+-(1#qa68K!5=sofANDF%4_FK54fTf7d
-QG+kG>FJdY4QhjW|C%$~MO&Iebo4ARR!uM_YqX&er}PZ-}vY)5jWD0mbs_rk|b8newg{Iv_@L0q+%-V
-b-REG3F7<VqgFscO1Eu;B^qHZn%JTDRm}U$tX<u$8;C&i&v{&`58j~T7xBi;0_-<7paQ?$Ss-1^mhx~
-pAfk2VaZ<QdOZ<e(-*@#o`vcC5dj}+h}Ljk_-6#H`RwR{mK?kYDi2_{Vx_L^7a!1L^QRuhW314mzfOZ
-+45|1TrCLt-uZO?`w?J3b**`2o$o?dBIEg8@@aAHHPtBcdxdAe)5%s_<so%u>`2=lCT3sbD{oCE-9M=
-fY1We8BKG)2$MMC|o_%W>=%sp?-T_Nv(15ir?1QY-O00;n48F5TOIM?F;1ONd03;+Nm0001RX>c!Jc4
-cm4Z*nhkWpQ<7b98erb97;Jb#q^1Z)9b2E^v8$SIurCHw?b}DFp1nc9CQg|75cP_SE)Jpr^LS0D>|@+
-d^ifSxJ+`E&3Ea^wOu>Cn-g0B-u%uOGe};isH{l`GdIp?ou?i)n<P$#<07*i;~%F=WH*od~jnEMh9N#
-ey}cxpRIiwhaYqkW;2QVQ1eCnF`Ehe`yhTYJL`HCv^A=`BH_*T^}Sfk8*73#Bg`+B7fF5-<^Dy7=76W
-m!P#IN+xZHziV##Z;5}k0&6<oJpm`dsHlb)%v}bf$25V(!<1R6G@O1<q<cU0OS+R%qDFW@2I>!I1>m*
-C~t4R0Ow(<Mn!G4VYzy0%9u|#)j9H;<o_G!iUP)!5Fshn<MtdVLA2kUge&^?3H7{+M&eN75*IdsETWQ
-;LXu~=PiqXx4Fp(q6l%Jy3dvT{MIu7)L10e*_We(Zvl9{m}8MA3Ta;9Nv&{RW|nxjPC<hrw!((m^b*I
-yfuxOZRg0Nt}x87ihJECdPnEY|RPG=QIbav0}2RHK(Pw&(O*NFn$KF*ilAFn9_MU&l@OVJ3E@TvO?MN
-0Mdp7II0%<$bgiHAbV`6orZcdr2?-K>-_atDQ-&}ywOp_1H{%-E(VEj9*-{4e1$A39#M?*l`8|J=f7A
-FV;^g)u|38wKq?XxMqgsge>-5!h?NLdJc4jQX9{h^`s#Yh%lDneGsKV1S;vXlaAF=+D^mkT%eb5z+;C
-<_ldAmpDrB3~{p#4W>t9Foz2(XzS+TO_bh$^}wqPm~IU^~TVt!fDyy2wufM>TdqOia13!hOhGyZlm$G
-xl`JE#u(l-TO^NL`B_>V{hN)cFiJT@`pa?~ePIxhv=%?8wPapBeZ$aqO<sO(B5I4aI+NP37hdg}ei^4
-~NRJtWKN@Xsy-c{Z8p_^1X=j;Wz8r%Xp1&WRg{GUmv`wahZwFK-?$Bj{_5e?6GE*499`W@{NX?xInU<
-+v+gHI%W1iIrbQ1ztfyMaSkETyVz`*(hRQy_K`Y?Pe$A&=0cx94L0@b^rfY$RMVyvbCmYnp-{C<hVW=
-JX&^?gQn)!XmAsgx<aD-qsy$p$D%fw?!T<)_rXe%cDx*_QtZM;l1!qLpG5_+pNnY?2`*GMi)xt^bCs{
-$>y(zZSR(Yq~R#fY;bdc1JQ<P}%Ou~#^Q&0~$VZccw<gWE~(TVvR*|c*r4OQg9!5R-~9#@FZTwwtz7}
-@*4#S{wrZnn&R9DMm0VWzb&UgBiMyrpUD=*dIl_Dq=VOeFb?38Snd)yWR_2*&B@(Y<KkR4{G+%+x^KE
-St{yv&u^3{VTX<a5Z^vnY{6F1rA?x(i1{LM8xCH*B|Y}1HXs<o(|tKy~j?{ak50xuF7!B3?IkC9v@6E
->R74LuyxNk%4KzTF1fPI8z^DPPT|U|rW!tkFi7;;$4a9HpU5Pdt+mB274x%lTA4Tzyp;y_7GFl8dSYy
-u{57)EZl@axwhuUrD{k8|OFt^pzUUUox6{2w!hCH2TJ|98^6|{z(N%a2u`#RgF_RkzFV;Q%-^i&U=j+
-q4^XF_fJ?hI#e_>P)U*`P4<46B|i9Zpni@zM;LLdco@h5^2ti96s6!DAYJ^2}Ngopr!-sk5BzC=|BZb
-AE!r3*5<%ox2B7y#DcPZE5V#^=&uv6yqkeVi|s#o~Wiy~0$3TP!E*{{m1;0|XQR000O8Q5kVe<{-)sd
-;|ah#0vlbA^-pYaA|NaUv_0~WN&gWa%FLKWpi|MFLQKqbz^jOa%FQaaCwzhZExE)5dN-TK_n<72eyWN
-8-is(kak#swi|{N{g4J0EuC#Pw5X6&JY(2?`|gf<p`19|^dXMOdwuS?JDrQg#X^*(QuXFiw0^z#fliX
--?CdPD@YsU$E_dFxrEe{`<nQNClDw5(icv`Tt@NTXd$8j7-UeGt)UGksqeHEs^vcvON!HfvL|&R*gIb
--yueJgU)mv5iBuPpwof9|G!TZ`l?UYwfKzCVWDF4`cxzg}aHVtMoyG#T===EBZsJT$1swj#IwToh*)d
-L8#`i3_0gcaWJ8Vx(By%SPvu>-#~75-mW!Zctd`x0i&!bNd9fT9r6i9MhZ{3U;>V}<5W6uG$8&ajQfn
-kQ8O-D!essXXi)iiCKsQU3uB7=Z-=e>CU}D&dV-0YQ$ATrO_6Fyb#P#=l#Er9uE3ApkIDdKZYLCyTue
-@N>?tDA2LZ5GF6{5@tm)?{Xyf8NCOYUHoFl%hAXn#0K^XQz%XCrK&?I#zK&GE`GthpTN!qa>X7nCAQV
-6I5y&uM0BBCNG7W0<z+yM6IGSCdXXu!SmrLhE=y>9dXLg6)=R6BEBoCyXX<n+DsOJy{dP;DFUbmVE^c
-iLgN{}Xd8w)y$w!WQITrlcSS+R_t`U%1kjQs;mr~Biy#>^vC)0bR5d&xeYg-Q$eUiH6l1fxhZ#uPiy&
-7s^BR0rN5W)By4>r<P8eBjWb+=~Eln4@{mOBu8B&)G%qiUr80a<0R5BuH-48kA-*^H&&^R}s^2ciIF_
-1H?S{6TO-TZI?}cVqJqlQ&qGIuM(u#a1F4SeGnvBM^bye8_kOD5KB=QlPCXSgV=>>zX_Sh^Jz?RJHQU
-W#&My=K@2MSD#FcIA2^m?4{kfZZyzCGWn8|L?%R2C*q4*vk~%3c1C6PNH<sF&%dT710)&UMt<WUvG1r
-&hBy(5d8ld>-nsaU1>~+JM2Ptn_wE{T(8fHp4I;E^eW(*lN*n@GM<z&KYJ-CU#|(?GoBSmZ?ohZ#pL!
-#U!iuBcJdZvKyW{F9yLaE;$F?fauh_!dlZGZm$GOv)cpgc{$o0VWFLSZOc7`hSl9~jZ^C1qgN!l9flR
-oe+iws11(O5s$Mdp5>6%<X)P|v;cTV6mz;lr#XsvjpeA!No1oE`qbED-J4M1mlACN&i~!lH|85Sd^Ck
-3;1QlFLTfVdp5<FO-aL=VG!kC%d|TSn$Lc4=x6A(C(-qJ5W9uKWuWSqHeh1u{2pA`fv;>ZR=3XxOOuh
->D3U%(PaRIJTwOy7WDa~Z0DS?qSb$bJTImCuWYo?oTfZZ=xj`*k8w79O?}|$!H!65{9K|VERM8?Zo>5
-6N3Ts;S{*!Pk7q0Ilq<d;FIwCM*%-i_MQ8b7^S@`A{@BI%HGSj0raz_PjmQSa|6^pGi!VU^h8uB>KMT
-LLrrm6DHCo&p&V(80$d+uir;jH}H+cp-7i~$9E|)p_3=@>08Ka@|XzX`Jj{$t$WT!Ms{sB-+0|XQR00
-0O8Q5kVeN5R=wogx4L1Z)5R9RL6TaA|NaUv_0~WN&gWa%FLKWpi|MFLiWjY;!JfdDT5@ciT3y-~B7Fa
-<imTnSLbAP1Pu^>o^;4^XU4~?p`}(C=rqvQ>4m=ZMC=k?ROpk36PYW?%uuUtj=yDk-%Uu7|aaj0dI?)
-hdW}DhEXybin5sQJjEwlTfJUyE0aH$GB0wkETTBy`rZ0$ZJp1fTrASCjHOs+=}i>MTwv3vScz$wOo}K
-?a#75KLIjx<WiCT;8x`{?5vL0DR`oWB^Awv*%UDd)Ovt-JW=RkOa!Fn;mI%xvw6>zfGR+DxnMKvtG?b
-IP{uRfPN3S0x1wf3Wv3?Sz`deDHTE;;EV=wgYOzLlWI=Plb^{dFrN%iYC$Pyr5zO^;Y(uMGR|3+pxjP
-CnFH8CEkM*7V}W<Z5)QKWtn6w!_J0XRStK-)4QlFel%2Vz_ns*id^R2m19YZyPwVTOw(02mYbH6~HQM
-D%F|^_b1ERBMKy8!dw@m;SscmVO-NutvG?`5FH7=Q0Ro*4fkD67c!CObbA}%wp;V6Ic~8A0X`p;#~%v
-W%weR6woA5ZD+CoKDvvb8G*nbD}TIN26;}9%0$Boa>=+41kQ0LGrw3Z5q^~W%hjVc0AD6IQI;kPnH1(
-w=JS3vpY$4DRck~)KL(kPul*3PRt=dE%B*gC1el#9xlHm1Dg2^tEAJ+9$y>rA)Jbv^#8G&0`g)+hzar
-ue#LFm_Z-BLbWDXmMizJh`Q4$8@Sbm#^tK%$7v;NlB+vD@oBmd>e>*F&q60YMVvdAXRKsY{sgElXYUm
-jk(KKG9f{ckVczIc7?e}8!X3YrrOdbh|^F0|W<rqxF9@>O2Qh1(aSk#K&5k<;7U84}*xdee)*BD7GfF
-5rKv2krV482H88GZ6zd%O&g<1QN=ry-Jy!0efXDcb?`&pGU$EAjK<NKcdHK3r0YgS@lN7x$JD`b3<h2
-Mi&^e(Sx>*EY4(6;O+)OaTo91QYPQYm8*Wf`tJB2{?Wzh>G9ih|KjZUbYQ{3Pv)GZ(*pLXym}K&vNVT
-ZSBf@QM`e})@BP43yE;+h3Oz8aoe7Jmb(|mv)F}O}l-cTsATH(co!i8`jnC$f^L;&p)4$w%-yZ)RtZ{
-}*|L?&-<DiGJvEYp)-klNm+pCsI*o}#J3ED)OypyDbML7_i)gwL121wPLZLtWhk>e+GIk^@$IAKBZkv
-4fTmqK%}fJFtSg5R*4CKBHnV4P=hItk+Ej!^P`yrSOp6nUS!iy#T<`6LA{$(Lz@n%aOf36eC4pbxkAs
-#nc*vVME{64Zq2d}T1#Hc;eN%?l`YD`Bd|WDeUH$ThX6M)S_=!B7=}bO#lXY@#WErB*0R^!$e{-hft)
-=g|59IHX0pjj=-KSt+geJOusYDdM|5uQw1`@5<}-t98t;MVNx}y|?c}>gzqM`cCFSGLvE!r(=<$C6i1
-(0fny_jDpet1K+bItupD+61WIwK$IBZ!;^lSAYH_0vv5<~Dk;m0|8r3F1T*Wj1~{OFgY_rA%t4aJp%_
-cSFl6Y}`{M}NC+9JMG)i>Nf&#TmSZ@+b83XiuDJRi1l3^_>kfjWs^GxK-t=+B4-G1kGUS|<7AvP$GuK
-u>J0?mo!MeD!^3rq8b8!AjHn&z;ng|^Hp{-KVb00P)v<uVKk>5;LkW;qY?peQmo1f3p%N(Qx1BNzg&g
-&sXd4Q}8YDy;Hy2_{l36E{`;inIW`5T4A6Idp#u+nk<HSRMJx6fGFg;Ulrv!Xib>0z3P@iAMt_567Kl
-+~^K3H*`%s_`0U&6s)2owK_MIH#Z?T{M9wqmeog;dKYl8Sh7V8Iz0<;x;7kK<_%2IL^}7Tc@Y#YkJ$(
-F(9fe^4E2GZZSg9&L5WYsJ#_#;ur+}p7EwZqf+ips@Bl?|BB5=OHUPn?W*TJ+K4KMk9HV}>VBVx)q(G
-N)i86E?5nI7oO?pis<BTg&n|j!yEnD;f$HOnK+bN8D`b39IRZm7MFW~m1*in=sZGqVKx<RRPClCn9ga
-Fh8keFH*;Y^1hk#6M;n#%ZS4LG6+Vl|dB(S(8N;(?H8BHYN6US*^rD5T0daB(oB?$8W-_dUTU;a~+T7
-T_}R1}Bw0Db~TUiQ<9nU!97@BX4gY6mtSzag5?NlZ*5QP+x}^P!*?|TXO?-(`|h<&K9jU{mxBa$T;4(
-^E$*w>S3?;4s?|T2gjawe2^J7_?zeo77n1Wgk{5t<>>+#Tt-<4+)$LXXYo{7f~A61{ahv$do-W{tN;#
-cK^%iw#Tp0XFL6gG^GOyh3m{<}fqj=3U}n*hAfGnjB(P^eV$;S9)5IynHJVPhybJZdh4BEd6t$p;Xp8
-?MGh~gh0WX&5X;3RanU~2mw#QL`n_BzTk~uIX+`A~e+uOEdDa_8BPD}Qp=TcrfeKtiKqj!(IEzZcOJ$
-Xl+zQvP2e4ht5Kw1Ds&WwcIJ!FluyljDKF;@+rpa4lFfCqulT5bJFJ#6X1ZaV09HfZS`#jBgfMW+i6t
-_UnD0>d-4Y1edL23Zji17;{G5bYgexODsxL`A-74z1+`X5DK~>JvBDn)%nNe)CFqcT+~kBDh0}TWxk)
-?5GVUu;188;Rj_gcgrjWBR7b0=}W{rACdjqHllE+RRXgpm%v8|fV4{>X3-5u0szJ~Ck;>=R2FB|4YZq
-pehkE0{O5c0I1vSFo?vvBL2Wr%C!r|{D#InyFdDkJ8V*BjKp;?0-YsF@!0yOg=l9)T_kMFc^v0lN(YI
-Gzt@d|v)o~cc&vpk;5~<T5idkHK_Uhf6WA-<~dXUm?3Mqz!miBEKh156q#F+%WS`^FS?(Vn*^I*9G1)
-6wiHrtKzyp#uf`%fN=KX*XFUO9A|fyyn%=s(=m60rV4F!J5~r;nekIqqyVrB*#xFwAoosM^8y*6Kl%R
-)aBY&TI3`e>g_2kU<6;mybf31cIUDhsCc&G&&k;;GN>JiFg(P652_M%-=T$Mlre+%#-C}EVI1gRzO@C
-9;^*NL{rc6;3NS${lf<lqJ|QN?%G!NCh+I?v`%1T9DoX&N1!>wRMKp;$x$W|!U1Inb{uTKdWz&YfI|;
-pJ$8nU?Vr<{kvB24YEa+ktiO7p#F1Pl$R|-`xFhJSIRg54YO?II(EZ3GwB8J1i30uUU$<VBzK22r<WM
-vTK;7q!gP)oTckkLw>R61nBJj=(Hu^4|5^mG1y=AC@k1Oo%)nEa0(z#;4ExnZlbyZ6R;Qc^%J$T<XqZ
-(pry*YKFSr-oo0eSe*z$P&(NNO(8YR_|aQsed`J*BO1R9Axr%v<Szb^5VH$G|o4D$|_=ahZTIngg1!W
-Rs{st1G{zV+_l89yo7VIHvILaCG2XUU}G<%jI!0!$Z>?bTa&#D{z`NCnV4nT@JyZiNN%bP4dt&PiZ3%
-Ik`^;NwAPE=;d1ToM#vm0Q9L*MG|bNPbI8&Setv=Q9%txC_dSw8h-?%3LiQHk`R5Zb6skQCX=z3@R=F
-$U_%U_A|w3?U1?5BVAJcJeSZJkwAdAgX-SE2X{Puet&%CsaV=N=4JvRDr7k)A3`&p_R8N#GLp-se0R&
-0`g+W1DhK?=EOu`@-w?e*SM^xqP@Wci4iRyv&Y`YiQ_XCZ4kPr+jh$Ow4H(<6H4r{^i{Q2{a*<88~{K
-oJIJaYQRo-$x=Xw?nX;q@_O82iIXG4lz2k!E<lhiUFB-!V`Oqgs>edw~B+xC|MW-#!&#rbmXMv7y;iu
-cKx>#-*jO6uoN;$CmQcYam<->8bGEI89@U$@NX1qwQW(!*yV#aiLjVY3sKR72~^u9Wv@L{$U!I=7gCm
-71I{!{~ybq7_Doz<UjyQ0z!NvQ#P?(&uq;%8^Nq&lRpGxGb8_jrSohCMBx94oYy(Fk!0Y#36@Kg%=Nf
-Dtr7p*>6tZn6c~70yhOWh0k%y!kFL|*TbW(|BFmX@tF#G2JNG?e`Bpr>$@F9u&``M`w;Z}T#sF`;5~n
-YZ#KGQ^r(nj@G{k{gu9Jk%sgp7efV?yarWY)Nom|4N0JjChq@Xc7^ka#B^c>iqPgrvm7elvLluY6hs7
--PHaEI9o4iMtdegvbGF)K3kjs+2JDjJ#ECTX(6?S<K%{R;FVSB^OXv53MjmeBKW{0f&>`_RBZN#Q(&f
-itvAreNl3dq`8EK%J`^fOU7BvukLGnJvQ)O!{1E%70)Ri1>(>n^Aztqw6Zj#G;Ig2oI@6v_ND){!Bpk
-3Y{u|Niz{fPC)QvH&syOoI)VPG1XQH1hQfnfYm>o#9+G&KOm_;C=r8Oy3H9*kzUJWAbN^|1g)p`_$9w
-Z`Cz_wl!<+wiU}Bk1qMDDTph`=Fc85E7Hxn>jcOSb!NPK}tZ1dPgS3D^u3GSzLz*6~E-}55s@&64@`M
-O7w8!2oYJjY;0I(x3S@z*M2-gW2rk&Sf?ISG$p!MYtOsdg{zwhi1>4(#61ThKjNawXEkUoKQsptL>Ot
-Zcr><~APe4HV*=$n#)U;m3jg2Gbw3kgtOpb7?x*Ooz)eTv|y%um?0H!>qHC{h+Z;ex#aq&^J>#gJ7SG
-iREnqaLyNG|J~aw0pBr4;{NQjy1QE&Vprj!#-|@P#ZK=@Dm&46xVU9u$W?W*8zyg=L)9N2Q`Aj;<IXC
-)Q~I%>eD_tESW6qVFEg#5um;EA5d4dx1cpU)Uqnd!0ezV^lQhPAt}G#K79k?NdKM<h>$mLKpNZHfML_
-htTy1Uzx|UN&>2;cD(u+wt04GGeDU54XX+2?lPEEQ<9w{rdK&xbq=*r)f^jt0MvC71{A2Cr*AP2*Klk
-n2{+Ec*du=lOAMXG4h)}YeKEYaU)(lqdB2g-}VmUTugm6zW=9ULBiVMYE?J+*|J*B~LkEW7C6^b#@uM
-jKLDEp->IDRtD(%T&UT$B^4!Ziekqk+gas#7QLQksH+E+4Q6JI`WJVDWBS6g4xi)1I~7?d9I)D5eU+v
-}eUho73oy9VpN)Pj#%;%mqS$iUCBaq>0)p7`QEGoIF>hqmerWPLY{)<fmM`aWDo`g#u(L3N3?{EbCzD
-PL5S_ZLmOF#P$yYV0QL!7?H;99SyHQI$nX)^oqNphp;rubX&X3-li9mT&7H@p!S&P%qFm9GU5SDfq@l
-AgfT~u%q;^-ATHh>33OUev^QacOYIQ^#8~JkE;BDo`9epL4OluSt4h8Y%Q(HojKz8s3K^4WJDuW*k<N
-8?taMw2`<QBBT4FFO2a!0}$`8k`o~aopMt|6TcYY*mhf}}u#iGqAR17(WGbg#*w;zA;)b=-{K&*E$y7
-82>I$-C|6?~j7AGF%eIz5RS4zPpMH=p+Kp;o<SS2N*-92QlctULMGk@SKZbC(y%$aNt-7KkJ2`&ZyHY
-gbP`4(nI??2d82y8?Md=uBONV()KD0V(4I+mc3RHB{*#euEnh#;ZtWw7=x<o|e(-ry_$v7^9COPY{N_
-&IvLJG%(wCQLCP|B2gFlHc<=61cz3c)l@>J^sEjw3PXV|6=eYOIJp6W_}N$_lhoB?o8A^ltn6vm7#Ha
-9(F_IB!5oi=nx`mB!d3sa301XcGO+_zwN`dagGl^t$bJJhbPSHN;dz#hSeFRnoFsJwpK>?W&!m~o;fa
-^Pfps9oAs=CsaKH~%8BX9JVd$jDsxyr8Ntx>uYj)Fb9~?Y+;t3a(tpQ78tdsWAB(4smDabvq?-=PJFV
-O8Zp+Qwvh;mt=WX7XzhC)7*l<yA$$IYB)ptJ(-;n%9g=(2a^ynpC=pMTxQug~9u@W6zbd_;MR1Z|lGv
-qi887*k3C`>F!I8SLF6?tuBzv#YP+4M5e)(Sf7wnQ`msdQ(ickK>B{#OIbIt)_BcLq@LEs*CZNTiAxl
-UG?uL^8Ksx^X~;$572hDIbXpVn&P*E^E-s8X)IOl84Tv*YaqFT?7=)-M<+JnJHv&Bn#%09!P#dvBL`H
-l!2J8kEb>%Y3Lg^8cJ)AxT0e)fk*RZQEPi}hHGPkz9MRJ4Iaj@&0Sfb|2+l^#os+Y7J5Qf}@#W6GqZ2
-L*umwTdQFPPi)NMdq1y)^(s}>lP%Ic*(qdtQBpbF5ftW40%s}`!|HZ>1by0fkOSCIrcfNdI+&<Vmgc1
-9`=OR8{1qXf>L=-dlp_1dj*=({RQ!%-%KG89OyaxPOBD%lODtTHqm0;cBHxhuQrLO#3MS_fk6pkRoSA
-ReJJpbD&+fGQxoP>7qK$I(RQt}ZE}pDJ^uUY--01(;ZH_~9nxFVUyvD%`hBb4rO(W1GPAilLciJ%0ur
-Y80(koJXr-f2@Y)n6rk%JTu=lr^t^lq1_PMer|!SBLMVnWW6+`l44jEN}7$`tUDb?=|DJ&YGp^MQosQ
-Uj4h9{p*U3#4bu)rt?~~v7?w!N$rH&?xmor-t(sT}nv#ba9C%_Hpt?mg(EQehKR&Dmsm>jCxT1MN{A1
-d`lW_lu%D+H@*TxLHQ0dJ!EXL}d6{uv@XoHf=Jgw#`DW@B5NHtZ$7nTVCsDTGn$5x)i1usZPo>XIo+7
-VkrQnP)jSxIHkn+R=2W+1wyq(bc+sMWwr`+hVma{pj3piFdxKwO-jn1^N;{Roe~eEOunb@BG}`0V)fh
-vOIi+3`8h9?1QR1O_aaZF`5`9=$kz`IlEGfBo+Do44=2|J&)=`Na=E{{0{S9gHWi_h<9y<8{19(&f)t
-UX(YtcdK7|AVPY3`v;F6fAQqMo_@LG`M>wH0i&HvHFj>9MYWW;NOojC36^;5U!jj`f?T2==~FmGZvvW
-DT{K()tSnKUu1bD_-Eo7ulHDfMa3Ell$ypF{qC}eP9G)GWoUpyG0)L^md9PytET_z@NV^3e7@93YOf#
-(BarXx#gQ<fVd7QI@yT~u2_m_Kc8aEXi_Lx&qCHc<9+>7!cPRd2IY^5_<5c8TQ^9;-E-1$K4Kj}^iG=
-jD*5F8h+OHbXN`o3;$hQfJ}J3aA0%p1wEFr5jK!{)j6keV2XJaAG)n}eZUVAxJaZuEwgF#2z;@3*;+w
-%r`>V;boNRP2o6oY*;wY(74f9Dy{FeSlr7SRGbiD9<`270KLg2*0wloS`d7Z<$?&H(5<EHkc}*nU|a>
-LaE~fmEx2MY1TZ-Q6#_v4%Xen%Xu)B6kPDt+5$a#f7<@+!Ji$s|M2s{?(nP8*WX;e|Gm*1V-a?b?hY1
-@ZVTl%W_45863bAvb%%3w<{5qT?lnbQn9})yTU8s~bY3R)_D7Za!09(-DRp+&NU8zNd(@(pC8z8CVov
-x+$#H0O+9~Mvs#6(245y47X{FuQu(ISJw!Mj&q@eLwYEU80MaQ*?*>FHr55(1|idp0ew2J|4nWZp^ic
-8q}ELTF&auT2~o|9~8^H4C~TSK)hYEsBxkACgz$}oK{N-$j!9hh#k9AHkMk%wb#5|G<iAHGUUN~qVxr
-?5Rvz9*+FS{&p_RRCeKWBAG(f6Q*|p~5w%2q493m%y?6Umke-Po8@F-acyrSy)f^b`Kugaz=xpP{^mk
-+1q1C)*i%U6l)VkOC$~^zS5Ne9w&Xd&giu>P`68X5kU6goRk37`c=s@JjAZRD-o$A_^nmau3~a{MCGi
-X2t7;-;0IszA~k}r`+aLrqV^|3R5((9@n?;X<y27ws9uuxbM-j&W9?P8aimuj4;^usIp-o?GCX(h?gU
-%S$S!wxcb@V82DiY%Qb%CKgU2;5>eWB^;tNmze{ZvBRZFsWH&q|;lW_ONvuEPbf!Gl|&mFOEQo<x&Ql
-x>aD9rSIe&X;-SH7VL_S5p_v9C6lI_<%;njV{3&yvrrrK`c2l1?>~oknS0U2j$$SJ;w_^e0i6Y2a#=8
-wmd(sicnrQM~h25-oPsiy2`?sL%DpH$fI*y^wd`UYiPgU@)S~g!c<_-TsC{h1y5BCmJy7J$Jd^&ca@2
-Y;|8FpgHiF*hg(e-=71|d`jOI%IlW21M$5!;@vCVx!Sgcbq_OqQ(w8`sjrJ531%{5{}>$xss0)cS~tE
-CjyD`)vS?O|S4<!r-Oa%r?{L-xlj#f-!r(Z26QyM?RIHnvB7-UjhgL+9s_Zqpt)LfJBg*^dehhTZ*i_
-@89X$i3ZRfBcnmwt7&&B_tj+&aKe42@^hBe{SIP`VIHO)PR8u?x|LiH-w4KDRdJITOeC!!Iba?ptu8?
-V;mqu$nNt*r|TW!#C-C)odM=1~o*-LB;7&;|PHUH~pf(PE?_g|z<)tRD)R-^%KS1HR5i0Z~_m+$Vd`$
--&ZUB;sH(4g+yLY%UWh1+2JeJoL&X*i)FPr2P#MoV}H3)aX^h5R)pnT1%%RW4$Ri);R`XF1}W<ZY3Cp
-h#i}r6k%32Wd#!RZ`l6RkNhA*&yD`68Pi0<Ug_%1sHTML=%=;0!u4)e-IJ>G*=i2bFtxSiYm=qAt%Ph
-?vz<!r)(vcHTi1^g8EAOSBQEAD^C=0fqHruF@w%pJm&8-$5_$>fi=n{ksJg(Iy3^O9c>sC|Yi`rLJ`E
-VBY_dYFDkx`YUx^d7&4kK6&>zHz7d2X%San{&Vyki8ZA}enwAS*!rz3vW-Qt2Dy7~cUKdK<DD+oR@xp
-GMrPP&*8qd+m{62p-Kb}+d(b$K-|KA9WUi*~sp4?x_b&hr3BF-??&@~*Q-*Sy-It&2@M7ep;T@N14N$
-z^LKlREgK(QF;f&RIfmau#nN%pM|TWg<l9*Q(b2Hb~Z$H{(HVxm3sgN^WuyJ&xqvOR24DH7PZSZXavj
-CId9b;yr0xdx5iP-%B%4&=_ytf?M^}txL<QQvl{EVZbYlFq>*z&Soo|!n-r^cccjyfvPLcas>^TLDf_
-qcu$C0bgpIGFoPT^gGIBRc!wU23DKHn$oJk%6d>b{I1t!eEuUbz6FQBC20R3&R*7@HZi5wHl>nBE3}O
-W@mb0jc7Dy~i5R2tP)yI*1Gi|V1Mh`6Mzv-?AMY@rFr4Tb@yG*fia#!caSrEyNLd6QKVfexh;Kwcdvt
-}FHTsGqBG{bIVU_|wIT^51Pdrha7@u#3P%z#$5YxGH`$f#kH7_(4WvYjS(edCd<4~e<NVicusX$;lEG
-^S%Jd{WzKs_s{!#wfv;Sf*(nuQ*5t?}r?C$S`uHb1;o?pV?ZCIuwUyk^#^#2jRJ3D@uPQ$9GEA`>8?-
-_Hk~}Q45igX@)7<u=Swa^kxCIS^)jt!$BxHZe5v?UQ{&0s$Pudz<TKfm@%$YGjsj5Tv1G{g4qBdJ{Qh
-#cNg8yErbT^I@K?5#QVDwUi|ZYjhmSVU2A{JTTcw^EgQep23OPCo*J}zd0F+a&3L1T-n=_YyLaR?DC5
-G%>j-=}6vA<vl8}2`EwH2Gsl9c3QzdRym3q2HSpgPw&jA6x$2+dW01xur2e~622vu-vT-n-hAg#leYa
-B4uwYl}}pkCLtpdDCrG;@EgSNQ@awR4D*a)w<bG{U*g;RMC*&asL>Voe~}oE+<Lo!KwZ5`P1b7_<ZMb
-gL`&c)0t}F<u;{Ny0TB`0`rH<qjB$H&V6vO%uvY((yr0UFXf3la`F7E?8EUT<dJ2hODJKnqI^Ep?Jo(
-PI#WTI|ad9cpsN?_WUcLVmzV;Ur~L?s0XTVCU@~|Z=gC+FAU<Eo$&Wptu7m?7wHSl%!r38^WLY3I0l`
->mD6+TG*h4f#SN?L7YE|uGspIN;HRZ%S)l7QC}>{a-)NO8+~bRCfx$yaeas-*kHoJIw1f49|Ei=Y=h<
-_bN&h$do)Z@NRg#r)spKaFF^w{#5d)~}FaB^ivvFgGp3Nl;qUK<&O}}!1biTDoQso2Sk7f-gyr#(f+Y
-(a)Fu?p3)(PpuXC_tI4u~d9azXnMEI(}$@?`@ba}Y9RG2QYLgn~KScYAw|y33=w8H4OYolOCqIjC*k=
-fMCD00KjLC=U41BjeE{>!Jfawi^aTutuIWCFZvH>)E@vVB(U^N$LBlSO5-w3avVJN9Hiz2UnTbfi|0E
-kmH>Yg1oa@fFqi08|VtBD5G0ZIbK8&&{Ca1wi~zRY4UjDFs?=gA@l9KHv?8~q$}72&bb6)Byj4N!^iI
-{!%fvjU?wOh!9joj;{4^K1ON5$K(royd)&6)9K1{Y(SaivPiU;GU_*PH%i$xcEU}?J?FRUCCy!=M6W~
-C+IfHdr0n#q!2c=~OGA!&j2ReA)F{%A09g~8GYbUk;WbLGI?Pzr{ZbXAB&pR<+g^$t9N_(?r>U6d~u#
-6QwF`U^*vG~D|aNEzh#{W?ka$PsPvgCt3rJb>KIw0@2KyQnKgziTYkI_T)36Nt0^0s&ph2-Z|ym=rv>
-jG#FZ3S)h9ZD=|#>$(Nc+^RWM>V#Mo3d@bTsz-S?Z0tWfibH`2i>zW<tS(VvgrV#7=*3QcCa5!eUzmX
-q{oAkyj5>%S@jnRvj^k@AddjX&nc*~BAlo?JP@@xPXibcdVa$~;f1bKs}cpZ&``~kpqop&7g^na&bLG
-W64|U=+;4JfRJ6yDYnoVz4#dxRllB0lUocy6>V<i_v1p*(CAxvGuu7uIHRccmcwsQ|D!Fy2?i_YG{hb
-EwBCam73KT5moYkUI9OgO9N#~+CxjF-4670?-C<_dms6l`<pxl%jm!aWvz6@(xW63y##$`mLGRcos@p
-@XQM}~9RpcfepNH)`Jtk|jkO98I?hiGl(<KrDhoTdoy=wR7mIXn`xr?|dT3bhoL9{_tK1>OOovg^%~X
-uhpZ-IRd#I~_UnHBt@kp-V3C#w+_^%=U8U-C>r!MOQJ6gwA_$xud5??N@()LBG*x^sRufYhRu;sB;$k
-?XetoZ(ECk@5oeoLl-clWs&2><al|bcD*5OZqf*|bX5U|z(Ug%*-Kmg(d*;GxBjc+!xzV={^{{wj{oj
-|`;YTuyW(T){B(77b_xH<uC9{z4?p{#pFRUjx;meopSG$+sB30)WPYGvgHhcYg;B9mwHY;A{2(*D!&+
-@Fs|r=!+Q3!S)|G4Oq6<Dys7gX;0hZ(v<qrrlT}RbSeZ-(8UAa*vSRI;ZEvyEPl8>^Z#+%;`nFj|t2B
-f0xt{H~4YoF|TY4ztn^loimk3zPvb;TA+vUO|N;p<x80oJX}=K7BRpip<FHxE_Bie}a$m&w$Lk4-Wo>
-Ggu}THtN;ih2)nOogmNts4?~yT<&Xx<^1Q)~^q81p1p;U{ULs?-Rq?8oVtJnswj#t3N$;1rAbxF*6r(
-z?UU3K`Idk;sX8w!KZKCY*_!MjN@!|W)!WKbop*W^r469->Cj7m4{(HbrZ`Pi{Zn+q)Mt7rP528I-Gt
-(C+^Ft!ug+7IgZn>lTGnYy7=QXT)8+IFe*b|Ig#o`L9xk~6)#gN2CuH6#T+D*m{~{{<EUzCea$M9Jhg
-7O3PQdoLQvLI7-5OAz1tBPpDw$t@2zX%=3yg!J#gbDySl%T*U-G#t_6^2P+bt)_|rZcBN2MI`(U=i66
-&(Vf&P0Uog$<2@9wz0!$e=6IHB8ZL%vXz+p>F-Z!+J!eeJCb;7Kx63)Aa&h{uh1UGN_{AqND$uJGst{
-=ZO50|XQR000O8Q5kVel0Nl^bp!waB?|xm9{>OVaA|NaUv_0~WN&gWb#iQMX<{=kUtei%X>?y-E^v93
-R$Fh|HWYr>uQ+fJ$nG2g%N_;<2(YZ{mH<s)G%ofi(9)63g(6j6;;O%Xhoor9iPNHb2*Pvu&h6u&XR}%
-6v=Dsr8(hG8r;*hchBXM4k`gP+m4r?y!Q~d1tU=?2Gju4j8M$VSRxOle<E+zImcZLiX$x#)lyDZyc+L
-j#o@q(GX7DS<7(PUDo@YSc?Rvd>f6%W;zdXnvPbo&Q(xaDDR<=ly5;lIVu=6%%P&8a%r;I%q$V$~%wo
-X{yF>T96>9%H;4fa0KmPxinom_kh_ffQjl~!N-!>RM9F`WpZ(R7pmCVyYir$IKDILigueQ`Ku*0Luoc
-QhZ=W@<*j$z+SR+)*)8wdE};cR*Rk<8d6T`=tNm4_TI-!6RCzv0>B+5Nf;i4A>C`1XXSouxG_<m_4Y2
-uu)Fdv%`>!H1)wbBj785Gg$R@N36Ome*Yy5E~Jto3_cG|h}(#p#hJlf(0tHZ>8m(!!Hk(&&IgcUI4`1
-||ELhamfN{O(JYC@mD2S@@4t@VvaBqbqx>|H`5N*YS!?WJMO{(PFlXUdbm91i*|BeGUr4lzocsi@kVY
-6C@9)-L_DsX_j1010i_6PAL=YlKBGdENRL_^A=JB*@!n%WK!o4X%B3F`y8K=WQh;(FiT^dUq)1~j`2z
-26lB~{H0+XyVv<dgi(yOazPU(<O?@gzIGLL{X-o#ssbA48J!vXrc))-MVwAkkq;jRm=7o&~Q8oC|zLa
-h)*#`taxHe+Fjw6&H36iY^db!xzV^C((PDuoB_X(#~ve$BSWi2obq}&juSOykizwxN$K`7S1#Xr=<xl
-=@zlZ`o9sL+u|sZGg{HyK#RoC8YE(Ee8>&$5=kheDoZZ8Ez6?oy@omz&{KbCOKKv&9nh$93A};y1P}m
-8YNfG;Jtsg(OJ5OyrrS|H5wT)Eu|8t(cP0@GQ&pqoQNQL#R)s<PH&KLHJGsoGBtM@sQ~8CqFmN8{=7W
-V(i^foX3zIJvlN_gf7{VN>Ddb0w6VZ-TVOsP2rmm?Q3?gYxt-@%31?NOsIIdrZ2`A&QSBs*6_X3#&*A
-+xbakT8b#f=bYivqn*RJwt8tuywWpET<_8WE-Bq@bFiS1#8`k!Y**P@%Rgkb#BC_k?G5%86R$mfWu(j
-C0QoE{R^bA2@CQ9n*E-w=+H(6-EC*>mSCrt_h~ait6B|4SGWlr>xM&Xp8V%R8Di-{~Hr0U?%pgH?UQp
-ng%v~dQFP#@I)9|_X1;$^E^6G564%!cmcZ{%D-M~hYKIpZT=%Z-w69aZ6AZjnp1G)Gxb+EypC^#AJTg
-f{}leKEbeH#Ql7XH%=#ra=20u(_h&{u-k{wh-M8UgH%l-I_6Sdi9gX6L?Kzp>8<CesFWdON?B2uOJva
-XM+~D`Ral|R#y`RhK74D0U#Z~<B-I!O*;#TSYdIIGiumR-9TR9?z#Y}f7ZME?i$<+OgdiYk-`lE7EGK
-=hgP)h>@6aWAK2mnzTaZCUi)0A2a007)4001KZ003}la4%nWWo~3|axZmqY;0*_GcR9bZ)|L3V{~b6Z
-gVbhd97MoZ`?K(e)q2+Y!uR@GeVL+1TZkcW^>sFZQ3A79}3qPb0m(<TDOQC&rBEl-}gHtC6SUmcDkz<
-Yb5gU+|PH8ylJX}tyY_@-Zo;jVzQ{KMl-%vRle0?Wq+S+Xjxk2xk$CFO4Y9W!0TF;*K_t^tNA(??)Qm
-q4(BHfm)WRq8o@I>Z?}E=xk_(O#6A_ZX7A0jw@p(u=Zu}Pk2%+yswoz#7OC9G^ql=tIU0)bJ1%oN%8*
-ZUu9PKb&!a078;B%IEt=ITRwCcb`j>Ro*mN>nzL(mqo-=T^(uZ2uyE~q5ajP4iiZxGfC#e~c4f_XuQ<
-dy_^5Xkm0~4zIwaG*yvNtl-Q<~`aCN<9F*Fq(g-LlHCXNt^Vxsv;Km4q&C#X-%@oe>E4AAkP=jIUNa&
-tdu{yNEuC6ne`KzbTQuu1d{iDVk``q94C}`S>FYAR0O;x}<%-Z1Wtus`Z}`EuP_#GshH>IP?&w!_(7K
-^Y>#@-N{VAyw1=I#W#YHpo?7I3MkOgVY?fd-mn5c=z(I}n(4|Axw<O&Udg}2)fFRQX=yHqV6`LX<2!!
-9FTrxbm0mQC&BYdc+6`-QsLE_eEU~_FUh{?*%suXX-~->wVq36sTdcufwPBVr6S*kxSAjn~B5p%UnN)
-S91cI+jdvb5@L<2TuAs8>oTm_Sgi94tQY`S>z6f*C2US0VVV`JqRbb;+DOf0g5vDdgEA9iZoNtp0jXt
-$uViMi=)_c~Xwv+rpqec;H_3mm7M<+G>rK)mHIRVlo<q1DOCtp;s(7ryriV2%ItWI(BRkEMO$^A6VxR
-_DkTSZA^Zxos~CG(igQ#DP<IOrOEC7jQX&fFcvnQiu%CrOc+u%=B24899NuC95ImSq@f`j?hl(o1T?0
-n;3&HhhimlRma3luy(NM0t+s&mq-Nb;C$Q0`jRiL8cRE8)@yp6oa5Of2;wH{A0-J=VWpH@=Lbu~YGf~
-!CVg3Y&{KqCqhRCk$e}J^rP%OlczKjc45^a=d+#@FM>!@dBkfp3#DyHrX-OfkZ#28%cY<u(2{RyPvI=
-Xn3Nu;7ShI`SwYZjLNwl4R^fHA$umQ0$9>_9dFT=PA)lJvRsO2I3!Iy}y7|B{M-|<|DS+5$LJq|t&mk
-y~Sr<9ep7C0YUAV@^P&LG}0kspb-W6pI%HXA2L1$v0%F{iM{7)u;u(8b)89fRyS2~rv^l>q9|Km@jkh
-|Iu(IC_r_+~kxBg#ung+1->~+-yrKmT*3}=~}dy36(U7yi-$nYV$3!oS_ud2Ub^-FqNriC>N}S5%A;^
-`)gr*x^NJ1WG$*8IbtjBA;?HIM}s-BjDM4D0VJKT$kMSf4x5J^fY8C;v3@IVw?7oNMNA>OIu4Z_c(^g
-kJz-v%1mDm`N-rBJ@@!#6ueoeg0*sFQL{aNlV8u4q5)Nh;vyvA=_2Q9L)2hI6NMtEjw)T}uYIz4A3$e
-`YjyKmnH(4ghOL;!#g#4#A9$V5a!Io4f+dAXAM_aGlbKsW&03?$tT{V<PNpZ|-PPvWmdRZ7)H%lP^rL
-ZH?5HIvPm%L1cv8|!@>D_Dg;`t9x6V?Y_-GWte_YDNnmS9JY+y$Ni{SmK%r<T_6RHF^Y^>2#Axw`VIG
-9*_A2)#FvzH9JQS!L46T({yd@pa4d$rG$xrfncix1hOGZ3Gq7GGXt)rbpS*@~NY5D3ykuS&EdR0Zmyc
-cAyh_E?6c#qx9ib!n5q^%Fx1*oaI$jJ84mQL*H`}b>~e<LNCc}U_Xnr9GhUQ*`}~E1f^qJN1D5ui@Gi
-G#-vBYGJME-gQ^N)0r1+A$}6QEgD+pcY$FU=YY?8Z;S!QGjy?;$cwJSuQc%ORsjB6gH_<(dVdX{IEnf
-4#mS4B~{do07M2?RFus|ib);AHMndn6{UibO!mzLtCdE2ruXC3+RuGfzG&yKp?>F9Tzzy#8F6b!JRvn
-Nk%0`MXJwno<%s%~!b<t*uF4Ul<&<Gp^vTZfe28pdG|;$VQGH+V-5OR*fg<@13VXZO?r@K7ICgxT7iV
-NnvmOZRLQd+0J7Zv#KW{5ag>)b|*8K5C-^w2NZ2gWhN4Cl~FO%N|+S!gOro;~OGS9z(E@*5F)n_T*3C
-2&%9b&(1Hu0S@Brqxp6#)IFpeH{NbaQ3K*WJ@K`pR3WQ09xWJ`ywGzvvtr)P#%3nj(2^UjxYkYko*Ew
-&%_f0^LFEr0K{F}~O9o`jd)TI5V7JVMDu}5N#PMyb2e`}3RIOXwbxI*%QHbVRWbtgqmdla*KSaeG9+C
-+xUy6J6>lh^kSOZyOIB`xq{e1lWhhPHN>(3!DC?tedN&6;P+M(5n#rB;&c7;X^yPIGJ*2^^6GW<_%!5
-RCtL?Lwe!<09`AoP?#;|EhRhak?uUp3+0iG$z+&p8<QM0+ltdLc!9m6wL_h@*fnTNQXjq9}S}+pvpyb
-~$5<m+Wp1xeK5e=0>`9-ev;BDa3ZeO(Oup%dBg^{l56Uf#Ge|-&CmPV1#~K8q{uY*fqdH>AYx1UDQwF
-U|J`$kou}D@p<)>YcUvc5*nUSOJI;+CehwgbHCvdO3k*S9s1Obydzv>)sc*-0)xR!&A~(psfX>VEfg*
-G)O6T!5;a!@m@S^!LKi-r&lS8zM<lH*?`XbAn}E_q-Y@Is?(OCG$z~YR4|eR#xmC}of;tnE+FaaO*~Y
-ccXmu)!ITHPmqte;t^pG`=gg3Y$H$;<`@+O;1>Lb~wi651_|1v<Q5mLLi_5vKC$)SmLOflC^&J3uBUs
-giVSgC{V##*iu-O#j<=hU1ZJigE@woMFOM=>a2yQs&PgY_0;zN;z+E~i&r5JHT4%|tC&jC>)xd+1<g@
-;kWkDrff|4Z+Ifnn~bs291l_#d%R6m?&Q{ev3|`vU9Q;9#4MF(dN)74S#DpLF~QD9Wcygz)H^9;*QOE
-$5DX9IyPM*q5DzHK!bHnxQuMxJA?yk)+e42Vw;4%(AvKQ*pg}c{iVwwl#qFOFol`gbZZLxjl&j^KA2x
-+yr!8yTu7OL&t_PWY^xLWcy2yT3iW#VZd3us=vujI(?)g&H75=4#*s!y_L4mtAQm&L`T}|EgzD5OX~s
-0ar5;?f0*w`WM#gMs0;i)S;$NpYYHL58#Q%Q!ADh!>rwM%(<T~z{@y10h;GyRzTmzn$IGvIY8w`)ei0
-WvMU=WS->=4x$bq`A^U9HmNE`xa4aFT;?>N7aHJN2QH%p#Nc1_us6=qaI}(+3Vq%=qd->88&drhH$Cb
-}aWOf&7WwG#ML)$)qXnr$u3nF2_vj9tUs`8lOyYqTEmWD3E9#+GTiUxTBv`88SQKNLaV4?A24$`e2Dj
-`$>TG-WCs25)wZYr|SDeKAi5s{*M*k7Uzq}lKpVi?`ylF9?%-%jQx|RWJA<cGkel<Ezu7ij52Suu5-C
-ID`Bp_E;`$_FJK3xi1Y>#G`&XB*UtXYBacq(WaUrZv<J~g^C2CJ-5XI)jr6U|r{AggJ2g9H-?6xF&Y)
-`Yl+|i(JE?Kg<#z}DfMU91I-V<R({AIsb^Otn#V|A7(EyMZPNaY{_NF3VErp%S!3Xcm2hwewdyPnVx;
-ZpRhIBn*nsLd#ClcPb4CrF0>NKxP5jMZG@MSX4;ixS(tNK&=6hAl$v1#YR!hVh+r?7r!KKauBTa;<OH
-4RM$jmXq2#hW0kJ&Vx+e?P=qVy-~75jHkk(B{oUoqCS<XmKGaZ5hi6pD^*-e3QW6B5x;(k>uEfY0`xL
-r<yMAToG}5|6#t;6cD4zI%4EJE0>nyG&c%RieHP_^bo?74WO<zEt#*vyj$01xRy$b27RravD&PDp1d$
-M!r)ieL2?=k)Ue5`kMHeghdm)rGKd+qyJJ0CVzZH{G#{%I_JzJ9b||$G3;W+z4c}Qu?muEX{yajKQ~Q
-y4PyZ#Q?WYm{T*n=KHflHa`T629tm||lxrRF`8GY-bix3|DR|RrZqZJ|CIF5|@|IpEJ9!8gk7M5KLw0
-L$oTIjvQN)Iw1`9yy-f0Pk!%-IcEby>%Q&z5wN-^z0MKL-H|mV4M-$I&_Xeil;cS~=T@cx)u?sU95a@
-|Nny&;JEbO9KQH0000808trnOkjkrrz;Qu0LwA}03iSX0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RZe?S1
-X>V>WaCyyJ|8Lv2693(Q1z&@~a_1^((zTs2;~_6`w_;h6*SIT&u25u&wzbHjCQ5PqhW+pF?np|cB=-v
-*hBu>FB#OK{9*>{<LT*`z4GV&0RaONL0+wuYQIsrPNRd`057hfWH^*Vg%VfjNdn#6|BwLwRA<dKAHIE
-{?<K<w9jMTGX!iz!_ER^hqnrHYrW=LODWz#-a4Tjz}EHdCJ6-7S}qq}g$r6DSlht?M#n*5Epho^N}=0
-TJuJgbHHVLrb;6IsTiG7%Ya4cw+LrZ#(scuvIF0n5bi;e@?<cJy>GD2v?$+s?!$Pf{MUZBnk;&CSI>2
-Mm5@0y3r7e}$66H_{55VzX~v2b@?i?==n4iaRaKB3Zzq(ff#4U8iBW6vgI=%z2b7lW4*&1+w&s2M`6)
-mm=c>dXLgjN{6$DFZGN@6Y7S)9C{9#IbH9{HO%-#bvOW;u!1oACn6uSEgu$~g>ek)#>#afSt;NzXIZ%
-65;V)fGFVcwD9qS`YfbQ23E3=#(M7ApsN)i-QG+ef@x+>0YoPa$iK$iRrbBIC9(BCr+ZL^{Evq(J>%&
-d8_zgasrX@=GPT8>jw38*@;E=j`)G<1l2Ai;q*1=lH64hqpaa+gij29&?bg1pX%%m!ll*qUfDL8EOdm
-cnEEGYQza_ltYfO}p@n5Fsv%E6vX5R(^qkz}Q6j|vVPgQ`f=WN{KiA}jfW{)R-hMVJQ~3PuB4C?ikQ>
-^S`usHCZClJ*Asfrl|K&XcGd3;=<^AT$p7D_&l}BQLxlKy?HG@WOGyVi(A0%|UNd_6JEd#O*tru$M>U
-=3PR=vu7vc!JmV{0eiRR8LM(YJv7`mv$NUdJUBm{&&CW904=r@&=2=<lCg3t*p7#VWMWC?9aTkv;DE3
->W?>e?hJfzS1wf;KE@1A@fmBwmB@0)=A6Ps<Py@F<K6uARPoIz3Q}~ApR0e%sZ8p2c5<NjyrmgwWqep
-Kgzzl4*n3vEFJ8~Hk@-#!vQlncR`VXufpg6c-=(WIc%-S4l?1~xeKGZ1~gx^A0Kq;0N;y#H1xIqbEDn
-*DEAj_hPO0Zg_vH<G`w2$SJ2oMt%VUeUsxnpU#1MMw%x#h4vA_Zem%H>;lQu|)|3eiphbdY73vOB)pi
-Xw*T6<``ASTzd)mMX0x;J!>&6#|t3(q<uR(G?_}MhFYsp_OD&TE%=a&`9!x-QL1<z)Ej#C+voEq7;j$
-+JH@jqzCvnAvI5K_0I7dR=E&qOL5oGbZgTWRT1$3kQFwpRD4R}qrNcxg@F%nEYhA(jeNcj_F3}Dgv}A
-7@!u*F1xyo%8$9)&`|NdzUqzPgSeU~C>n_Ls3tEU1|H07$ZTmndAT?4NkHmC4Dg#BVGFZ=ahdWLU1a?
-al%#7gi7&~UQ+%aE<Ra&a$Oa*`gh=T}nd+Vyt*FA%_L~OfGqP1B<$>KzYixeXp!{ahsrF;l1(v>J+yK
-k5$Ik23cT?dy}=d+8`U(kr2jzIntHSU@Xs%yakBx2ZuVEGR_OYg5hb^IaR<SC#;vSd3^0i?(^666^O!
-jTR8k@K9LrU?R1M&6VtYgcNNFs{iWnN6}<m$acLlZGMwK1(y~Yxdq5g+EU(%gxnAaC3F`<7_@=byM);
-Y<7Km@%rZ(;?&p~{GpNHs!-yEJBa79k|2t7&Yj7y#g2qWV?dbL<hcD43EqqQD}M|t{Qkr3?Z~guXJ8p
-bKptbtTnF%80lyaJV8YHd<L(jzcTLJSoq?g5|Lg1PH&^qk0M@2ffMpIie~`@)sHNR0`yyhs#Nd}eON9
-!hEF%L?jr&6xABF@lo2ZEg)Fcua=zcK>@G49tueAo5K$0b85P)%~%Q1T#7ApyV9^Y-P2nkFSgW&65PM
-pxsS?jy4pNrfZDg+#kDaaf(1^~kf{zM`UI2eYe9f9|Nn31hRF!j(Nyk?Uocbq_|CWWH<Eh<wK0HOg9!
-1*w=M8Ik6q_4vpnD|n#@0fQyW-mrg1nEC_rgqTI5D>YVzOZ%E6ns~D2aZH7k?}mB%`y7E7CFQ=<-4>j
-(r52D1;esLV&I}M*4Sb=LV*_ThZYsf4nUM@wMIKaHNraJ=*Qs_{M6%Gu@e3h<A+eTDD^1R?_XS3x7|f
-XPr^;sXRKa3{us9x0X{^O8sqCefaEq6GXzr!(uM^RW=zK*T3f9V+Wr7SQ}_NI>KN=zmGeRcMX+fEBmD
-0(zQi(z7hgAWwamu<$Y!&4Bv=N9(;4-$b|Ii0o5>RW6u64eXxTCYbj7&CG7)o#neZ7chdgakS`KJZa7
-h2N38pn&I=;=aex{HuxZ7ep{in01x*C}{)?-G#Z`;oYOmn-V2R+p7McPl@S!j#8-QG~gRMsJdDu6+jC
-Uln5w0J$<5qTi^YRf|JGt$qxwt<Um<g`por?F1e0}B$|6{`pn*a1D6W>*+xSdT2I0!RCmq#6sv=M}_O
-o}P@UyG*~5qetwkPtQyDAMKmK%v5)J#qTE2d!>J+QWgw`EOUo#VXe#rW(86+8-0{fQzvUX<pqbJoi|%
-*Og*fPRU3(3dkX>(c7n13t|_J5O{xH4jKr7>AvI%p6DyxE?>-4F8W?>{4iDEWU-j}uu{w;@^I^g7509
-4LyjYwZg-^dZUXBpM)i;UcyrU<_BS<1Fdgwg}&_TG3Z|@cGe<+`x<<J(~V70q62W)<Iel=mQk_V<b>$
-*%VxXgy|m*+gA#I8{itceLN91UuA-l)amr?9x|L@uB_oJYYcip9Fr!m1RoWjSuhqh>iZi8eOsovY-i0
-d(Xpv1<xs1P$SW|6YN)1<|_7?s%+q2&vv$fER*f4IH_McT?2jn60TIA*U^!+IV@Ig7?k9b>m72ogQo;
-_cyF+;wl%BplAx@Y6{3tl?=5|kQ_uJR<UtR`U?@;Ia{Q#FuhV}K|wceA;mKvz-;PAwI(<x#vw`soVPT
-1m*hc6X>d@BF=a#5^u#m`aW`m!?pWGBFo3MFw-<qDRciIP@St_&wBe$-hSMYCw6C#e7>YHmpX%?80x;
-iIB9Ga9m{#1HgP)XqBfZw{G80mrJZJF8-nT>W44GW=!crryM8n{tgokr8d}fBj?$<UmY;6LtGELKSLu
-0Zw%LH010rs*LAaPLca*p<d8G&lmO<#k{fVM@Fg~g8A#x4{9lLRt5z>h5A9`YNv>9#b8Kay+8RDYKsE
-(uK&HHF{1qZ3t0pkCdt_`}L&l2v@)P)lT@GG?t=_Q*_hNwBH<>(jz=Z&;Pfm%~wKK+3ZKQ~}-B{K11a
-#cMQre?0ln>nDB03r~-;$v*-5T?WmN#qihS*Q`f|ri<eJIW#P{bc)#q!5k<KqGpKN#|V63x(#<y=XUT
-xVEGLfYtTpc2nieFRz>p0DoMIgwO0RUlmMiu0a!(D=QN}zAy)AZQq#x}sa>#y_(Z=(syJ@myOyBxVcp
-w=Tsq$mzQ4Ho*Xc!YK6`cg_F^8)U;i|_dOPo<0ut*IyC$Vm^t$WEQ;lXCV<VCJ)5ELvGcsGDtP{l2>K
-UzI+NB@e4z-?eN0{f91vGP1$6w~nwz4<i91^ThLWT(0S-B$+_+E$=kUq`x8Gs46uc!XE{*iX90!t@bj
-6owbN@-Ce%QF6$4yjgx=^z}xL9~o@+}Bb9+#j5L^Sm2Th*Cr%CC5f4_7{gL_^Y!bOJM-qJ)qrHYyYuL
-Pbl7Ok!jD_kVk<}*LdnvrD^A!sc%TzjC2s*IzMuy!?r1E#3co0N88XbN4E=#()6jVuoVngJFTt1re_0
-AKkL$3A4uJFQ0k-SC02JjFhLbaUEHS>9b-WnesgnS)%og_-B7P}ZqSVyLt2ZzwjfRlySWD+vAKH`*g;
-PTc{Wniu=Ay0*_e+Wpk?0IUrS^TL-nYxoO}5-^Z!^VPp2a)0%dY7sx($dAq#|*G^Le{fboI@81bHy06
-cQ)uc{ni9jsX|9e+9HFDwg|#g5Ra!qOZLF?BSy0>5fet0X#EuC8u`ix8bK&;XTG8<MQ4zpEnSq`^l#i
-*R$_9g!!Z85!M~1`>4$h?KQHkl1z&&;oXYv%oUcQXlIna!Kjrs?MCd(1ksW!D5uxEL1nzvdw*XHhVJ<
--pu~}_Vt_D`OvKtrF)RGKjdwbZjbb-s=f<05PAIt?$BmkKf7I8<_{fPExp~{{o8G9iP6AD{fOD8kbWM
-PYo9;l@QSABneU@s3L0eWw~y1oE~8Jn(*r#5wGTb?p@_o8PkP-ZQErr27ry?-+KN*+a>_;4(dtQS5C$
-BRFRU542Yq|XS&G3KAeJs;2ME_F9R`Nph|Uk{$-~BIjkK#gYElcHitYcS6x5Ksg5@p%E9)aLRWZRgtY
-fH~NIJs9k_Eyd9TvM{x0m0ZrWJX~0K?!wESK%u8h$C_aOaKKclNyz+k&jYuBDg@ZazME-B@g>E(}p5j
-&KF}6hjF-?Qi}#`g7zfCq+k5;5`<g$sHSZNu`kcBlshj+Z#pQ&6C5CkGIFd(z7Pf6X$iVFzpNL4%j=0
-VoU&2(ZR06w_dG6V4hC+k~k&Uq5@uVfZr9q{H+4vnzU~C!l2lN`u*Xtl^C_=((YorCFuT1mVdhlybk&
-t|I^!t0=Kr4X~pxr0EILmVtsLLZ`7~<_9R?gU+J1z_q$gs6%VI#&I^i;b@d3h+H_u2eVJ72w}*eTdKB
-FBnZQ5PRZ@zJF0U?U?AH!2Q%yEL&ZIk7MC8$3tvqmabbVm7hemHuqT?$X*!Ga`)))fmJ&0#3c;Q1@RU
-<mkL9DCE(e+0}5ybEoIfRk<#SH^$1?YFIT}_x#sa#Q9;FYY5`|O6!%4vdl(2hay9&#6ooIab!n}2tJQ
-Fzy)7RHFzIya|4+&YDHjG$8-%`^b&dkoG6Qc%4&>Zvq-%6H&zXk8JdatSyLwkEgBZe2FFW446&0H=hP
-@#vZyX$XgfJr0HF->QQRB0xPehzgWLS^~=A6+5~Pg=7nkH!0~Zz$W|+`YsBwm2@``ENBmdnCAsY@oC(
-fS7+?_<<pnCIzx3A2$ojhNveepvK-2F_#d%7)P{AKVEslOKKu5?J_aas4A!5d(jN_t4>YSf+Ot1<@A!
-6ly6fD!)$8GckNbBH9yk~YS_y`Gr^j9PUO!-gfJu&+C|XF_pCecal2iYnYH9Cm6cO;*wfM?#odfsJ97
-+B4Idl7}bL+4<6)T^2PnI3?j}rxT#2x77uzsLJ!w!#?{g#o~<MI2jM@&`Qu+(Fon)HOuv+Ms;0FAxi>
-S!FIZv8(MU=g44{UpP?kEKP1iV8?ZT?#V5gUvNnx=d*2_>Fh)1H_#`1Ck>w2?6VgUQVXwKL1bQ9o6ea
-u1c(>ik}s}z0L0X%U=4N(Q2Xo-CldjW&>V(iSC%z-RHr70Z>Z=1QY-O00;n48F5S(8XRwfCIA2)iU0s
-50001RX>c!Jc4cm4Z*nhna%^mAVlyveZ*Fd7V{~b6Zg6jJY%Xwl?LBLA+t!ue^((N_cu2Z5<VTZqwaa
-u|TS+ywW7UslI!T6vh)WV{5MXfu$;{5~Z{PE}Pk@q~Y&)Hu)nptAxcA)GdEavmR!zN4=JQq8c8!|PlV
-ZE8n>NX=bX|6>n)BaB@>n%ZRhvJ`dc7{HwfR%;wfXfXYbto7kB(LdUf0Wys!be>x=AvfyrakG_~$ffi
-><1=);)jE4=i+gcq9;0^=YYgZBbX+fE^zt@bjXqwaPE+x@5TY@Up4fdKo-A-|pId)a;Kc%T;rkH5%sb
-Kd*KBVv|*Cm3vQL)yoVg@RzLYl=u8~_UWx^n|(O`C;#uaFpw<Id;0F(EAOxV`-@7eB^=UQ^|wyx_Iuu
-Ae)pZac~MuDTH=hP&qTIrmn}bLYo$}I%lS5Imz((pR#atMW%llcYT9B|z=C)sQBTuM7oU1Ci%;pczIJ
-V3Zk>`=OFO0Tknq>})qbv*8?{xuf|uQPyLW4loqzxS(tAdKzw;mbMKv&QmB%k^?{kAE)8r4CR&I~Y?l
-iocW`eT0uT{ILb8Xw`9blT>E(H8mo*9Jf+M*m-aG~e!;XH5Z-A?6xmuP&g+WD#|)qGd$0{et*!+B&{!
-@<orgtzk@BW~CM5Ya6S{_x)#l9Ts_;Jg-HQ<}GHm>8nXH2Kh!K!(K%(ILJ3>(evZ?33irc=E7d>7nvu
-1$3^9TqSC?f*sHa?91zS$@fK-*EgEF33ToYv_J2v4hVR@t@93cfu95Ls{UJcmVEQu$4`!qJ~c>-$t<z
-Rm-3^dBVbAJTo_XdbAAQCs%AW&Bf8J$lcS^gOSQ_nvW0f_)qlXW#_;gyBtd2%PxR5UguP81LgC9Xznt
-)TkB^V(|A<uyH^=2>Wtn(bu!DYjn&@u1fz?rmGirRcNJHet5f({S<za(&QH#_LPQNe(!BW1fD@9Le$6
-k~go)IaguZmSo54lIKR>1Cys%Yo)u~y}3n((pWIm{4@ERarT1smT|1NRVrnyi3j_gUch_`8~#CwixrM
-4IXG<jD5L0aJQEOXkJy`b)y8G5#}2%lZb6Y7#b{?~r-Ur4RmZxE-O<j8@?<RJV<+(_0phMb}ix=z*q@
-XAc@#{)1*RN**NRcE3~HDK(fg4c33_k6q-{O>N>&N>!~oJS}`0wEpCs70A6g&W?Y(&PsW7<-wsrmnaC
-mO*%pPNATZdB^+H_!*GxI7_({*%Wq*;MOG$Gvc?mmo^ED5LbL`$7WhN5m?#3t0Qi9;3{9Ax7dpEtVKN
-&<P0~RyJD>)l(Dxf;E;?zmkE%+DO>NqCcXoQZS*N=_aO^6roAv3Ee?LV&diqtCU1eWAeWI?Gk569}SE
-sB<K>L&O=@(Cr=2s;=0B$iS-3I9fc<}fK`YSzu{_XRN@1}|T_5GU<uU`J))teW8`U#l^lYO6#$KjvTN
-UB5}<o%`r2L4EAD;2X2Vktn9jQ70tXTayPZA6o(q9n*TsYi<&h12plSTa`WI!%sYwONUsk0(>wTIf?$
-ZEZmr_Jdnn7FQ9QT7<Je)ONGDL>jzf7RX`n5Mf6OKwm&Q#Kqq|wzF}}2WItovjJi+mfn0`WH1>GEINP
-JW^Jcm6%}Frm0|{#BZEWa)ATwi@%=KZMlCi$dFo9Egj1HljEkHWb^0WIoWLrdq)+_rzh+PICry##s<V
-LIzNyN6a#J@S0sX7wlCV2@nleGq(iJci620rHZfJDV>{+-)BJ&-1R<^DBT_FDfEX-M)sSE@ci0k6I$h
-*uJZ8AFSmIVcSmL;pQ&RX0U*Z>8hcbeR63IGB`rD?CtNQ@$iF+{W=$7E5If)Z81)>ccE)GND(pp(EBK
-4S$%be4q-vMx{)-Pc{Rg>A6FR&X$n)^Ow%GoiLYQGX3vX0$Jvlunc9E8I$)7&HWg>Xt3cWs_-dnZSJ*
-Ii`%{@LyKmWP8Mr1M_3uAv}w1_DL5%D|Z&(b=xZ#92V<yN<dhhT_cx-jfMRt^i@b^Y4RGDi7%?;3C;o
-@uDa5rpkxc0PSFyFfwhB5*^$JCg<h<Z#e$gMVu5|NB1$ACKMnWKpUq7H{2XSm1dyoXUBOYpZteL6Y76
-iZ=bHoLS`u&HkFHg?do=lAFK8leCtz|ipZ84%)2V8j5ifPIke!2x4^53YP}VxirQ=PL?>8_sKw33Qg|
-Y}BXV+O#qBNTF;iK4MfH*S?s{<if0z{8d18(rD8da){j>Sl-Oisktf)VjO*#?H!vMaOZ;7I{$E0`a$&
-AbNe#x1_dm~8^|@T6#eWOsrk?f|byhk{<aMqMM{1yZeZ)RRNOLe_-#WD7sQo<+4RJ6OpLOq2w>&=07%
-T~#U&hBa(nV_?w6B279Tp*{fvTo!G)4@X5yrBL3eWUb&5R>it&Xe-Q$ulA^akPc51F_S=iCwgRE!UxY
-<q$jC}d=q+_e0ci`G__6LmAOG+LZQ59VEfAbl=u)V3H3SEW9o+B-FDOXWc0tzDln6q#qq#w=DnSM4nq
-=vtl9I@c!JXK_DOnF?<V^zCi&x!4<BOd`Ntb?hIvj_DTo3qclelTGH^i57m&vE=9bZ85jefaw#Ek0!p
-aAI$SfM6#2v9`$o6CFD4c-!W!S!U4V;ya@9(yqrlNz)n2q*r1`#wf5e(_e^KYJic=dk%{^Irdn-A}&h
-InUBrp$Q`LK38qVTFG9uYP03IB6TA-=Qw{^gZo9)N9j&dol6I*w=h}J$MSSfyjG^nmGO9-ike1Xmjvm
-+0Uu*UQ9we)hHV?^FBqhVNObl={pJF%SIyi#*K;0UU@lV_GC^kn!X!UehXhaAo5$(ofQ8W|8A`Lv7kj
-{^b&?ZTb5A~7-AhWIqiXW1_5jv`v4T4|NJip?j-pJ1tE$>aw#O;F3~mXBY6!11f4_U33_*m))Sh@y+H
-1iZgAB3=E$bmUt?Dl?y}v5bl0_HFiiZ(yx%A^D;pGj8aN+ol7M756EZ8+RYwk>WY;x2ut9YiF2Cxwb6
-+^llE?i9R;u*g3SGbp`7J;ox5446PLlJAtljUjb*V<EGOp_enEaL&fIR>grpQCH>l&;K^s#~tv}&^T7
-Q{7)z%&B+J=rTr6CbPk#+Wm}i%DfovK(~@BP_)YU$b>T#WTFI{TsC_GuGFlG0FmM&)xya+EdWeWPtIA
-N0`e9qiOQPPrl=$Qa7~kw>b^OOOZtqq-QY=^&LFi-^`LHwnbU5Q$mmNF_?r6p$yE5jSx?#8$ZY=XUPM
-7JmmHn8fNOeJ|41S14GJz{9(V7=O`ixV!cK8aW)xA;<FqhEa!$T-UE&ZERXR{f%p4I?3j)?g7CR_tmq
-oH$7*kKVqc<vP~QR?W`QyJeL>o!oPEz<gqSUk1FNWeR`UhQg~KX6yH$}Joh_JWlEt%FkZfHnNacrd9i
-JlH^M}_mIcvAz&mo%{f8L1|4di^26{xSRYSxAk=YWIaoX`t_E_=UYtp7NFTpC_lEeyGnz(AJ@zDBqqy
-n%J2QMEWgM1r%{p-i~eM9j=bY~s`?0a#ygg2|ymU()iblIJa89GH;oJw8Kr<7A+S-~q>Tbjv4*cYG<m
-$TJx_o@G3CiPJuY3o?v5vO~jR!~N$`@8=fgsWs?M0lWsWS8Tg&LRK2$fiZ87?+LAk=_UHaX~lj!bVcE
-ozS#hyFUu+XJHq=3R?#!!d>)b`5%_}kV&&W$Xh3QZ1ZX$9F4F|o1A-oQ4^Vs!Vk9rLy!JhL?9ia44qk
-|j@lm7&c&r+<aMcp8miFEhm`nTI*9U^_daiJp5}<4b=tpBulTp^SHApU1f!KO7NoFAS`*?8Tnf5HP^K
-b`2C9?j2ZP&7kWIq7MxB};G2i;3hpKy0X7+VidG6wztQW^CsH2nqu!5Wb8$*;Mm6DOX43dp3_+$ZiKu
-8yi7U%OaY?F(?w$9zs7otn=@F1wJ!Cs!Hb3A%Khw?Ag2*gV{G&vVQkH0w58c1?rGNKOshI=K<Gd^+Ct
-GcZ;+zz6Nh7PwgZ)CjRfC{}#_nw99B0e!PWS`rtbCn1>an467d*5n=yT&X2`qfz5RUZis71IPl%7Z;P
-Xg@D2c*j5$T_$054pGUj`fHZ(B4ZENYE`ld15-(bV_3aHTWLQ}A1VgC1GiiBtY>1J9c&Hj*t7Z?(21p
-#{n8V2XDcBa3O7D;uk*?Yk9%+vu4vU0u;7ns+MC!)nqOM7&2JTaZ!U8!3%F`b6k|3CIj|h)FtTuCHoR
-ZzfZHPHs56Y0fdEyfcPZ^mq9K`_rP5GRGx1=$r?hAX%L>)7ryAWV-_v8pKKu7^nHN|>kwV}*9;9(24V
-0=!K%=+I=)Q~p5=G(3Z?W}fS$N>GYMLRsJ6Tl3{HQ0^3CYBNz0G`Dd!ACwJ>P)EbhRaU=sLCBJ1SEo7
-4luf-=(znZ!(Sb$c;;$GCnk2G=an$`#?BBZ0r|(FYvcZI6M+~5Gp`j;a!f2A(B_o8uTJyjO?yg?7UvJ
-gokm0i(g4+XS#Nh>)m{~4(e9@aJbTfB0Umi$0s=HcbG*~9L#IaiTXb%!X{HIBfIUIP=q@r@E?AsO%-X
-W;0E_o>qX1ogFNO=>qx*qfC|qzmtWUCk2sD8p*eyN=0vkt*$@FRF$M}*alP9<f$+$5OQ15=AC&$TyXn
-j7rc&GUGJ-dQk#sfi51O5dI;JfeODlxfm*N-U4Hko&`b3!*&9QLuKZCYZm8R{-5N!m?Q-vl>+w5k5yf
-aXLR8Ewpn?%YSL7s2l-{f*O!uk8QPoA!d1wX3x*(75zFYhGqWVT|uy@e=v64fQ(Txq>LJ*>h`mrUvd<
-R9Ts#W2aK=QO|2u!;J<}uY6V}5fGp!Yd;2}(7IDk9zXr+slUM^yXX<!^zvR$5LZWe!50fim8AmvfOcg
-PG$aGf-ami&58HR5;cfO&8Lynj*r&;soXa6C&kU<X6Q!#@s{EiMoqirZ6ouT35IVjC)mAmY$F`pEs?l
-db_go2cbYH0wz10g^sXOli@Scirpi489imt^0STEr0o*s%@Z~hS-Wqt0dpRV`=AcwB|NtL84T$JP(YH
-G%za}6#*@y8SRvKnC;_HjdZTD`b{TYV>iT%8UE2?W6bvD)JT1@^elHcH@j@1yk`lk3sx%7WN{5XN;9X
-cJa!4RlB~dMl0P?1^I1&3YFO)Ftu-1}=2qGjLcG`K3O!jRdyvE$fZXdfZZnRsBc{Buy*Uu*ZRn3j=W{
-$SHfu#O3}e^ApXik793v_+4o7%rq&;?$ZG}4>+tNB>?!@OcB$V^_75`zps-%pYu19ni{?|p~wMk&HIP
-u&D010VOM~|9t?x9mf|i@Yt*$sL)M4UY{)T}*L2h3C?nL~nb{2}@P@BRi*dj;2ie~(`d+Z+dqDD*O3s
-|YNFZF>I9i<Nq{#C5Frxdf{E?pTcFB3QE+ldS!@5vm0aQZR=r{?qkH{Z{ZAQ~1@?tY&rv^PsY&;?JJl
-1(ccOoAz>!}p?c7sMYu#yNIMmliQEO#~<9r&(B#@e`Wn?0cxsN@A`YQoYYa1sDu$Rmpa;H*O#)j4j75
-l1-h*cW}m%CG4_lLQ9aZRx5FR(k+4yD)G$F*xC%#&Jj?)5*`OsVz2$X$UA!7Mdr9Vh3J`5`+G_14_xD
-67boYia&nOyBJIkSlEFJ|NfMTv=FIMa(arz!brBZcWvgyBpjG1l`ULU4;l_xjGPk(M+p}c(Cktb*Gf)
-9k`PD>Axc%vwP&351O+|_6vwZo9LLkGR;s~M2K<vSK!&Y*^L0!`M(4{{+!6C=Y~jt&9}{g1i=y}Yop;
-sXG+Dyzy37?x7N+dp9C{1;oXPclu`;D|M_oNh=$`=E!L;3W4ekUSg)TRs$oMwfza0Qbfm$~O`G1nKu0
-LY@>PN+XZBU1{MB{At-eg*W;^5fQVd5!1r7T}@Qe!2I^K(>zsh<!wq!)a?6hBO%Jt+>tVpvvO<HZM_4
-#)<#c0BUAc{Ph=$DCj53iA&@h>R#=`1d0>2k&;{fd=~x{&}F2AK{OL{`>Km|8K4~BvooKw_wPo31qTA
-*=Y}3Qx0Dqg3@bRs%qVCJl@cwiNTztaSzZ|ulvX`kbvi~oiJjvWA=7gW-S_FkBq<JY?y3s^}~+7$%>K
-{T?*&5VT)r#Ct&jEc^w__yv}WgBs9hjlPS)Q(=m!_RSOgH6d2M2;+^me+yEj=qg@8O-OCX9fbR(*W&v
-{C5mZ3XW&{#5yZ-T+94E<3X_qaR7%l2~qirML!gF>{_oAWrad>&vLqO1oU;y0wVcCj#UowPuYdvr~fj
-@)(a35Oe7ssEwZko-d>`S_xuxC){Ihx6w4`o%6L+4>`U2*r=@vuOnmm|3|pnelbZq0ALCu4gmupT|f!
-SJcUFaVk@P>oTk<I(A8*kMffAikaX=H;6+3>uZ7qpVDHx1*an$_=zy4bJXrPbsOS7*bTSf#ah$BQ<ke
--YeWCH|AZrW!~gIXl28ZZH$zi8#$+&LZd;<apN3*5{5I|crUtqtk{DVCdJU1yW}*N_e$8uzxt+@#5jg
-v8Nh821_vCx=N<R=ldikRcM2NM8wb0NcjbbqfwZ}*a}#O$IWek@;!x%pNBoN%u{0r%d+xm+97JRz^X<
-SCm`^SWd31+U5Z8byxYGLJL&L5Qy9MKzCa0Yd3!_ssp2I50dU5w7zJC}o7I3*#*Q(@n1Vl?Qi>&XFqW
-Hj~#JCRQwPBgKM}F<tBx>&24V+yILQfB79QnIIi6wX+P*)TH-(tYx4nv8W0)s~+6rUCh1OdkA(t0+a)
-pe1F-ZZdVZC+~_6TGnLvF0*fmNuLg<pW*#2fJYV8|Mo)Br9(k37le4fKr2=JLp=2a)?eoFr*m|7XB^0
-$+1A+%YC}y4jV2);}_^M)HT?U*&hB+_v^4?FB};61yocz(F50Fecv!|a!BqzHknfxn_d0({5=>oZ{Fd
-*7-6p3Wjg7BMT`%DzRcQ;&`DJ}r&d@~oLYmL#K|qhF3~>`yAN<sFGU3N5&FrJz*%&QDo@WRyk#7;_%-
-QoMlXeeChn3b(6Q0!wze(Jf*jJ}#pR>tYxJfBP%c)FkoX_HM#l*68eZctLm-m&vs^eG3*H;#4}rB5vu
-rw;D;B_16L!lvxOHh2TGP0{=3c4{{=ASx8CJn6n@DDY%`vJNgT#z`MIsL)Z@wYX{~icF4C-1eJTKBwc
-;=|yEEc#;pp8(PF}k-nZwj66jrbBWYwf4p>5i$mf(9wgW8p^x4Q2QR;K+%e7w90MlvA)Ow6{NLe+_(t
-jdvPmJMCgTCeIgqe9gbbLqy3F*;1GySJjdlWk)twgESa>z-o!v;8h+)=-7)_HD@c~La11C&<?xxjY|M
-yS1H>ybWv@AF(E52_i6IH)V0lWqHQtg5tcJS->i|-x`*NRmGcpqh@zq3S=<SW%=b9&smV<=cR=kBZSV
-}v;=L24q61a{e2TB9H?UWwn>E;dlE}NPbJ*5rkDpB8pQqtEpFMttPrt%{em6;zbIg#n3t!fN=yG4da~
-G2bH`Anh_~2-RjP+!|U=l#xUtFvb^%iLYd#4N*B^R){Mp8%dgh)NEy@)WEI~UFilV2s=6Mc#dkiDsKI
-UGr>l*2(1_mhJ02PLW<k=)2Eu{cGAJ>M)>kT(_Uism`M`UdYYF;~<So0t-zH$|>=AdthWh5{>*L~+I5
-#mhF^`?<_xcQZQqHTRGG<@l;<e@)6=ftn~W$%$o?RTN^5<HPtVmiu^8A^V{yHC*{(;g1OH*<ARVSoAo
-=nG>#hH$N`q(S_KfZX-$p!be@Vs0V`OeU+`ZX2BsFn<!R>myOG*Dg+{mUJTdVi+1B|WG8euq@P3)=t{
-_<8N~&5s4j}&%J?*}PzGxzNFUnJlZ9+F3$z;pC_UAY$aUiMe^IDl*HNX1G02?cPO)<34>{6iHX&dCD@
->cWO-zGj79q!C(WL&7j3<B=brmiM8d+IRabcgc@t)RHa2N!WCdUCp1Oy{FLyOGYQM6~HDe>~jVt}3oF
-F!5w7os$w2|`+=$#x{{q<hjfS*2G|xEUy*oGhKZF`n~#fRy4ARSuecOh&kxN9<5V>fC~;U~Z*t9)5p`
-u(j4W4cB=o1*2HQRUbKDn{E*wk!PQ#B_zrT;DERyrjj}iu474*qW@LIB{7+s8eQWCoiNp3wbp9#w<B~
-4gWP?zt9M;Vwxd0L_N-7abbqOsfb3yIxZ1;s$P$CthHOhrOLxyMs;8gi%Q1xFpj{mDg&8G&FhSI%RI>
-ks|GX`MRg{7$XO#BcYC*m!O%PDP^|D?Qr#pzuoB7G6agM7a_(O@VUW-|BU!n}6<j6;fg4`cE)?uvEjA
-k1+K|}W^&1z8p@I%b{%N@*kzz7&*RDge^lrPwUfS9OFffy;~AO@4ym6;$=_o-;frw!KS)5IJ;>~cnN*
-w*W;DM&WrsVj7NgGo9K60}Yd7zK=>$diHES4;kfO;dMkbQ*9-Kv&t~D;bu7K-bL5gXT9%cv_TG>ctjX
-#yjXfx$;*kq?BVoqvh$c*lVtlG3BJ5RvU`83cqH@i?ggwJjfV#N+F8L$(LU|Nq%_p6DcUxJ2lh?8~r;
-{C*GH>LEY%CQm~{?^(OndzBv`r=Ez5V3ShtXJfFN!JQj!3Zt*^5yjIOxxf~j6hjSGk6O37~3QK{S<ZD
-9VTJQEzh^OHPSl7Yj+a_4+3FBi4i#ch!l|#mh7JiNqpT5vX%v+V>%|a!5k1lD{&Pn|5_CX+!=gdXtE*
-C;L#H`F35lVDZZC-VR*yDcsctG^8J0R(gO6{U+=_{~{NMd9#F=W`Sa^!(^hS0|7-Qb<Drv$8eEiuU-D
-uRTC=U7Aa@<W<tfX@F!b0J~}j5qX-#{j2~2a46zRPIfe^<~z{JV2^KOG;zcyq3&%2GZ?V&Q>TT-F)aB
-6>o!Sd8N}B+*@^1z>bhiHl-e?%qU12V#r0^<TlO8mV<O4$nQaATLCc;njVzyEEZ11r(n7p9fHf9g(WA
-)_;PBS+;-c0VhTJQaDDSFSg5ytZWttOrk8K(@{Ns`-?wTeN4<`p8y|^3z$Y+Ij4?gPb|t1za2+0svN0
-0umiVy{^r{cNf5B*qANtuW99<b5z-zSfec!BT@1n=_Ly^Pd7>Hfrp@VSiexP-4!gv2f*}!-RzXS~3FE
-NUm`z2E#=NCXT7eVs>-u8m|aHG%^Ti22?G;Dq%?JX9<1<s6*E&>)<RVL2FDAQEIf!SOL+A}#Kc&6M2g
-^HpY?@dqAE;!{^Vp;OK1BUxZnnb|1prC}fVbwk%0M-{*z7fu^h<%5wmtm4~Qydd8x3@NS40xBAKIXo6
-c;t^aKa5NuDZ?541T*1ZduPSPWCf*1+B5c1d%^n{RAp`&Oyg^W90tcVRNz$v3ao=(K+7*dy@W3-XP=Q
-r9{)HbnFWXS3&EKiT4P@PGAQ9~X?#dts^<-gsWsjl{Y%KSebE`l6x<bEaYBKX6t#(Wjsx=Na4LU-#cR
-n|bg+`dP)&hxP^vqwIvo@_A1Flb|3uMn_P4k^_i)hsOHLk*`I1CeYd<`f+?=t#&rsw-3bg*NF&>OceQ
-Lcj9~|SJ9zHVGcKp{-;@dPChimPvaMG8ENR+0>I1cYD`y&K9-!G6p;moo_<$BDBu6Fx)^n$bVO@a!Q(
-u21ti22W*Pk<$dRvVxT4DSvV!~|B@mXQzm49wjYWrbs6Ul^%R7f>^*2ln|~XbuZoeniDu&GcTUChBcG
-`QhnLy)18<hAu%DANTk{sG+-LOP3XZf=z<>LZoAr-{THO{KmLPr)Dv9sH_8;aYakl^~p!n%<+cKQ88Z
-?<!Gwdz*(E5Hvo=oWs}wC5n~1>yD63EN+CjXsp{9({qWio3BL<LO>K6SwWDBA_Ol{h+smH;cwocqM9U
-xzR-CrZS8i)il@gs$wEcPcN&(fbI8<wck)UsZhn!uGs@HJnv@Ux(60gCyZtQJ*uSmlHFgS;zVH40RV5
-Vd*y>zy<Y8`vz5|{(vdbNXuky`%Q-$~K+O>vD#%{Tbl+Y9t!?UQVs6``K#2fZGX;}FLmKR~%b+4bJ!4
-p*ExzG`YrSp+FMdeDrd&Wd$Bn(XPpiVn0O6C&0N4x74ymiJaPoO?6&Al}_KvOA_>h?xJ!edghXlKFo)
-dwFJlxf|LcO$j6Ha*Sq}17XdB`x(<AE_67Qn{Z+ZN>D@q$N+%I7tx~S@@WiL0U3bie4;{Z;pLilHx}N
-qWqlTD9q{;eJeaHTzo%E>&#-Paq)FkAEBe4I|6>>`@O#g*$WP{_d<%i(u0#Xy&9*EQ$-mdyTRHK*=yg
-w!MKSy6*?ac*S%3awa?O&_x99IiM|Y#jy|o5218Z;i`orKk1`#CvkzLJANg%1K`EVGAJC2t~8?wEF#<
-;!bceA8IN(bPvh0kWKIQQwYGQ0`cW>pvZ`23%{=yk9Yr=biS26E9bMZnEA_f|h}9~%&+3HLHL6alC^r
-+iqCn*-Q6sb&XO7?khg)5KkUpp!>mvnUaCictP;d2#^R2VlkG<`CA;Zn;kD_2~sB-z|`SjR5*}0_Tu`
-IdLfjH@1KjYua8-e&IE?*Cx|^=5y8~W-x`i9Q!Pew|YDxiho4K^hcA3$q9cESYvm5VLnnk+<he8KNlP
-0h5SDg`)6fh_hDU>ylVK>uV79C+VB4@cGPRyXHN&&Q4d$VPwPZqz#8`>$fNJ+yu&Oa%qF<yLt9e{$|d
-j;ctSCZasyd#h&Ck$lAVW`c($$cvxU~>BH@pdc^-Z{)Pe8OEhM-rH}>SiWmY}J)KbjTSUTsIAcYr+d+
-2Lm_R}|a4o%;{k!mrEg`md@$VfFiuuR*96yLY+%+~=I{5`V80v}*%nFJcvP0rEKX8v*6w2RdsFz6})e
-wFksL}$jDe=Z&F{RTtMKB_%kOX5|^VzJ~&2Y)u|Z(9D$=J-UrrO1;xkPSBBb>IgOB@GtWMqkw^_x$Ms
-;NRW}i=!Z{AdDSW@@bzqpok(p5k6in%sH`*Lgu>Nx&d-0a1o0$1?~`BR#CkuzoN&1uNmmWpEK}|{oWr
-e=yUYo3kIL_!Gb<0{|g3x_YW2rgfSUj24noc5oHebH%MeY<lvCyP>%@3rDLDM?idk~)FzrCesGeRZ9k
-ARbMR2j2Po{p*#o+tZ&wO8_Z&2G2Ju<k52#yJ;MFo4&fY_FJi`HL?lq9Xi}Sbd=Woyd{Ndv5`Ag5bB}
-r`102-QK!v+>H(0OToA7~<@+25lkX7V$;j==_axULQU6*lwG3@;tsUtzNd)u3tgWU#r1gRY17aG-AH@
-?OO}FS#{ww8g^lG+?VMS5@~`=4fG2eLql@ugXHRsO6H#h$1%Hg1;E$PsPV1@1})KqXWV)G9kDK3c6)s
-U&fYy1ZZ>{hC3D$BG#RKhz*69c55HQnF7qaM-SpGF*e@TFXm`NxOb2KKJPn#j{|kOBT|T{BUTn&+}?f
-bzWNA!?huZV&Clt|8q9gM^%iZV6uI=bK&T`)e!^D1b3#`#7@m424Afo`j&yQyd4>%7P-O&H9OpOo=|I
-V~R_cYD5;N|JZFsn}{^6<_aWTjKKyz;-pY-tZPfmy~0F!^8CF7^l<jZOD+esMR8-DdFEWnfg)|KEnFq
-3ioJ=h>K-LAe@tL%OdrUP?~!iY`8SWpG|SA5gN{~Bbd*$)Bvbssl*_jmZZiC?K8R7Xt}`S2;Q@#rhxL
-*d=_ivRcpeTmb%ZRdr2c>BuICQ1v`n{WMa!ZF)xCTMRsn1gHkn(qwT<;L%&u!2RKfD{Jf1Ecad{b4wU
-AQ<e>fYj1`;uwGY*u-GF`4cnVc%t=taR1ppGZVA;Fa|Qd8~tZ0LasXy0OJ971yjysxK5_W{=cc4r8N#
-&0=b;+j*=1#gg81drpMdr7>1RuwzLiOg>Q@xOcqoTZV{a35aaU(qt}I=UyH&O)#Bk>XieAA<ADlHA1c
-#Ph}$~~ihid9Nt02(D`o&;(w1|c^n40{XLYs4dfoYTK_LO}lsX#%X3`2=eo&UfHs|$Hr$v3Ls#DBd((
-NfgLNzmg)ah)k(oMT92f&?x-tx#Sel+RR$3>;lnW-dt`g?AQ-;}0$O!jc8nwqIFg#=^Ej~MLxma6|`H
-vNSJP37D|k>e})q%Njycwd%wpEl7O;0{a4mlgbw=vS_kWr9@0QZlAe4MCG&9xUu2gl1|)+-rW}_d5ZK
-_Yq2|lSPsMc?pH7VFEs8ADC~Hy6L6-VQTbTNfn|HI3}9;`DGZis_5fs11V<WmtJ}w2bPt3<xwoCL(5F
-D?1ZVEA@y2#8Hh1diO*?)u_5oQb1X{1OF93PVND6YK+4x&f9=QU#0WK#%Hiv}UV|*eOd78~9d>Sv?q{
-OF=`tBuifL$Y@E!%4u$fl{iK^ots%13A&w;Zabd^LYEZWOq5o{lF5_|HFl{=yw>KQ7C9*p~eU<!@vON
-BIf+0<0t?BeqJOGKjv|0oN<pRClOZ_j=R$cBSct|o>dp+ovcS$w`~=zD;a<lzIBf&wSWJFoQqRBrZqo
-zd-0(c<n)L3kY2lkMiSY_gvV%6P(<agCoWBa-@ChlaleDA@+|0eZ&EQ~+I=@6dV$rCmt^dU!40jBo`*
-GB+s$=a2ObHk<}uj|i*eV2p{TZzY@Wx0_Ej2#kkpfIcKXktURXc3b8Ar@#B+*}rmMfq*44D1osWJXZe
-PV)8Rp3Cl4G283EOwdr6dm=M3jcxR3E4Ys0y01LaI%woJ6SYoLgWK{mwTAsgqadBaYfta;li0udYJ_5
-Z^RW6Tz^6RsSu1QTKd~G~>@bn9$<Oib(X=6J8^^;JwDO89G>Hh#wO9KQH0000808trnO!At^1Aqts0L
-vKw03iSX0B~t=FJE?LZe(wAFLiQkY-wUMFJ*XRWpH$9Z*FrgaCyC0-*4MC5PtVxL8J(51Fko$FN3iRX
-kB*=kh+1LY>x^p(KZ)})JV#XF>HVP?v9i!$#Q<YEI`xPB=3&j-F<h*wb2=iqIKa4Bch1OEZ4>{zOp(k
-oQVAA-Ws=!a~?nPjj&@YpT?Qq!CzbF@+eNFP_8^X=rQ=YR<X|VR5-B^JYn22+?vW&)LiKed+*pMZUvh
-?#Ugi7E8FY!;*?v<zTVy4&WzD!P%RE8B>sYqi1J%jSdp;Rfw`@;EYnGmitz>Q%t25?;2+#5sWyY~e?#
-EjfA?B(w_2y(zRJ=w_N}#H0@p2zIZ5A35Uv<!IS2{D6R`$oNF`kq4XjAlBU&A?OjrxZ2jTdGt7BYbSG
-1>Es4N+`BwbwE3A?lx?2-+dQir{ob|aD^7U5J);XC#P?vTs)F-3&(!sOaQ1XLT0fEZHVuqYycqG-ehb
-FIXP;qPGu+(P_S2<tp{6^hSbSM9Oj6YkiS?*s&u)v@Fb(7a#V*q1;o%y}eX4S<B-)z_8AHjYi~{s-tv
-1KS`jmp5mEZ^0#n*j6aq#bRNcT+0}sVrwo_%P{g3#mbV!S}74D)SWSI^wZ%LdfZmjBr&HkwDGLh*d_Y
-2h;<@fA)6OYXWYpcfQBOo;)>%cD4J^JfPLQI9ddDA72Lw<_-wY;m06t$Oif?`C7yD)53Fo?o(lzBAd~
-mT2k#F?*c{lZ#SHHz5Z#Jra0oDH=w+({s5O;jI!5&h2o)$N0a5@;gbS`@D&1k+n^r*jgI7&KsD|ALzH
-X4Fzv(yrv=Gh&m(>%kyzIq^-!lFrvm#@v$X3EIy~c<%Qb3$oN<@)}Wb8wIl5@i|%7O{IYdXCmqKQLq_
-&pP{Yx3|fgfQ^`hw<?MQ6D<vcwbDrhq@vQhM+G@P#4h0oDbO=HdcgT#}z8Dn_I2?$wDQ<qz9BHJc<F1
--Ya;+3%a5VY;lKQ0w4K5dev&+2w1rQuT+?pfKmzY7rV4<Fy&>{ximv!=}Hj()T|gDRn-04O;iomI~GE
-1-E_;<MkMD0rICUP?3UIMfnnL%2xlS1gF7gkIsO)Mqu3V2k6(!^fpYbshH4GBJ6NPd(m5K@P|&~+0jt
-yZTY+hL)O+fxG_S(#PG&+EZs~wZ&v41b1*-#xw1A)ifKu%s`x6LhBw}Jn=jBlpo{&~h_BuTrh%0^+t`
-bQx&U73X#)jOTau*Y`QD5UX>}8rlPXY^Ur2)?ggy-Y|TeG@)OXq)SfBowN+$#xZLJ~KQv0pmA{q<p7r
-QXS<+bRb24<q(soVH=`0KlS5kvw7{cZfj39YhnhwQxe1oiI%n2gU%1nph?pVnXS%`@p7yap!ov1?`A~
-g1olqSgE$cNaqy*!-704SjXlpT($$8#(m#@!;)Ol$-4V)UiDn;TUBPzVa<r0bZ2#2_P*qzDsT#4rP6L
-esS^8oSHbRW!PE4>X4CKU`C|6vemVQxRi$TH?hePM`dQV!ab~7~s!S-XYbvdGhlbwWfT!?Zn(93iu@0
-@%6uPnG)oM$|gQi0mTiU_b@QI2kecZypvl6gBCgELbZ!}~b*!nw9i@+tvKS%7PW()2F0eWm!_D17xq(
-sg(atFIGKBdYF_ni7$ZfsD0YEhSNApVHx7c#=iOs3p~rV^qcM`;8@UHQ2>kOqa_-2VlHdh#c!CCitGU
-Y>ZGJ$l9Nr2x=T$vU!+@9EBP?meQw(diItj!OkTr^=@SMTB0!7CFqiu$LyhMoSia@!M=ZTU<}0*<$g1
-0haWghG^yLPzmye*gkDv-p;1iUpn{yjpd}U5%$vmoSv?x1pzDp&1E_M)<)s-cKER>Tf(e$hJj_nK}O>
-Zl`@}W9YM7$R)0bUeoWmQI^a@OOLdpJHf<g2J8w)cnGDsGEkDk?!unc~y&}|!H<*y|$55vW1(XRIVZ~
-2KA?3UDEf3I(W=NTDP-W>55jZ7rVZ)dKcV7vg%Fo>GHsubYE_(~UfFXpdp9ZyB%S~Z?5=dXt_ztoS2w
-dPy1)LUCbY6LW{mr}Km9bPJ+eDMxi_8u3j_SMTL}>mJq2lL)H}n#9z2HhH&jN}H-ZJ9}HC^QsS9sU)Q
-C7y4rm=yifw6*KSq|%GIu@U7a}6zZp&mstXiRG()<LM@%&}zvzsLSGl7==3mJ^MH0$(^J9a`?3Za?Yd
-0NTI$7q)4bB~#JWG}8ZgfLTC4O;B-onxj#yvMiO4f(?ADqu4q}ERBQ_R$!|UZ%L4Uxv<ReeXwsxgotK
-G;XZ@mGvGB}1CIue&b$}4E^@S1s15iLTQt>o;B0JYtMR>jB)Fknz8(Nqc@v;>s6AtjTQ8SLN7y@nR~*
-}+Bk43=@&W3SlRSN(O*;*(eGC^T7K5q?RZJ5dTFfb!V+Fnn1lV}e3aPF!$%`LV_oz>v1u*oWX{&!K8X
-n8wsetBlRc=lntHN8<px^S$rG(McK?7_^Q@=5s;!huTP`gzr>*EmXA1X^j=u@>}SPKIhjlP0x(NTACe
-BaU<zA5b_P0!r7KU?w*9Y6biwS*Qu6Zh&->Af0!v=&QBXnVWTlMa333c80{+mBTpsRP@as=`|m?G?k+
-@cr}mfqVaRyd6&1(&@Y$1u!OP8fYrVT;KgP{&9S^NAmK!JEZy1D6qu8w)y>`SMncPL34`8N#LBm7ZCW
-^E5b#de?(gy@L?A27<rFHxj!|c=dV4DC{SM=vKrO;RBy)R!#j<}8K&XctbngDr(l3r)E6cZ&T^dq^)G
-ANXyk(?(ok3iDcHpJ0}B1N$QEv=7`%+zy)t4iRf44rN%stN;b{zJidYvoSI|INPUzI}n?q=hyg<Nh1@
-dYE{~u6G0|XQR000O8Q5kVe0XdAaF9!esHx~c^9RL6TaA|NaUv_0~WN&gWb#iQMX<{=kW@%+?WOFWXd
-97G&Z`(Ey{_bBvcnBnKj=CoOP`D7VpiQ>`YghE;!;l0rEl~~|SyV+TjW=w+eRm`!k&>Kr!}KK)#e44U
-;oZ@BEp{YH@<uf^OA^9&m8cb=8!3uLvBbR3>@wR?UPO)Jg>090e8<$jVsbXi5i6=_dP}!VwosDa&t|i
-X<z(A1DU(!`ij^usp)ltKE9s6c32dNEq2hp6Rl!rLxG0~9R55idRn6!wSgd9Qp80&P|Ne|<MBOkle`z
-3(KLX^Oh@4P@z|l-^TvfEDJJPB$DENE?*>;sEVeC7A*hpS($!aIE)w*+e9k~ju2R;5pPD(MvN@+<p%;
-;iS=QrwK+y5<W>nP7BY_Az4tn8y7nc#XsU0nWnO+?+Qm^pIol1WT1>K#?d4Wk*W6YWiCvT{d@h7AJ$3
-o9yCle{TYOcGjd00=EJ@}&`qK>{#d1tSKNXiTP9ZFBOD){3W1LF-}<v1NHvAjoLDBwufMdINrLZxli5
-P+n?;Qk2JMA6{Nu7#ro16#UlYlc4P~g8Xs`s6`>ZO7i~oOLB5@`gBRC)Bv*C0!tOk$YyW8o<4t0J}~3
-dv*?*mpD}ebZGaj`n9krOx~^&@3%joX4Dca9ka1(ID2u(v8g0D~td}N`t6JRg3;?MFEltT&kuj@nM43
-`xKK3C5kCzq_BW&J-`PJ1`eO0!H%1}ch5n~b@$#{Mw=K(n)9uK;$s^0f<y==rvG${<IOgRtw{p>zvl_
-KFMWAnM*c3#&4ys~SrShu$Du`4QNk5ouDRIM3pEO5Pt!V|sw{ZzA(10AKJWy(VB%2Iz-?B3L&#fp&c$
-h*C|fz+S$_$F+z`P+HdsQmc3^{(CFR7Sfmsq+*G*D9P8gHV4TAIa%RThH_goYb^{K#=$B3$R_i=B&s<
-vH1)X8=TKGl2Jw5!-6Lj(q0=evJu(dIbPq+aX3mXMvl7u(gzBCL0oxayhN4W?r}9cD~YJ^+|i=1$o2p
-n)@q7{oQBDGs*ZI@FhN2%D}V=*mt1jLnChb=q;xmvbhOdL`j{lRJxM~zihN0I!vYVNowe~>QNp6tpx+
-!Cqg<3|uVO7e_|o|tcYyv5ozYn9^gpyN#pKVwx-UE*$7VtTLloNAg(1REnq<I@8<BPHV_#2HQx!~xX(
-5*;OydUOhRqOhrQufVzni)!_~tayk}`5hye2tKm8kbx4-rKM4Sx?+Tx%S26`v1Hg|mf3l0*G#pk`xt{
-x)r(r332Fksh~fZz*ePsw8J`U+Gm$iZ&+#r@9xYDx^<`JIiQlyt#ODPIPs#u6(^=HPbxnJ|RR)*{Fkh
-4RmDpbO%DK)yzv_kP8v4NU))GupE4$w+wB7&mnHpBapgR0n{ElbV+p6ehL-?c^I;aP9E?bc~P-4>^Ce
-T_%{m|Lj?3Fb0GfE5F1{05O%FY0Mqymro|_pE4Ce31U(+&X#qVS`Y(oz5Q{!~xL{@gUHjX-NV03N0<y
-MsMw6_C!!zy{I)Q_}1RDX^>{yUECa3;)e1@EGhu^lZctYd;HinrL#Aks1z`X6W=8;0D7-1QkJ)mLq-8
-0XbEc5|1lO=qHA`&_^WKc=RHhS{W4tSpIpxJYHSD|ZC?7l2q1MH08;LQ5+UbE5;zRD}{4;8oH?pR&(j
-BfOhdvGFtWDdq>viaikKMa`;{$S8-75w*Ma~KgD<i{=(({YzJ@V%Il2O|F;?jKIHKlPUlZwp@h5CST6
-D&Xb{motot;ThI?#ddI~IFGhbU!{WfZug2y5aDP~Ky2F?W!Ux2PsACtW}qe%9Ml=!LaY|pAE4vn1&(&
-D4O{lw-P8K+!9mK_w@>5w-P8FCa(e>*oWMU(6s@N-r!9hWd3oJeK_G$VcI=sbph~)1mU^xj*2-zPNJl
-kvPAcZbVGG_>TG>(cwL7Gq_OTR=3#ZXSD`-AhXl5<<u)Dk*my6&938K$}m!Y9!&s>XPnWKRZkoCRZX?
-|5`iDstF>4ADEU%&)!Q_~NAF#04gmgx0K3NCwQ;;#<w`>(?Mwh~->F>f(3;2r)b;_d($Z5dQcyLCxkQ
-)ncMaR#&lZ3f`Fvm*Ao(~G*Om+kWPV!#T^8<R5o(s9Hy%#vzky@Q}BbJ$g1V4`w9>fJ$WUAKH`a~~g(
-P%j%A>irH42c6JV(6$9;Js<4l#OsuLY0@XsxB0@7Wq6-)8Ttl{kQ01{@IrN>q_b~GcjvwcvgXb~glVg
-QIG-T)d^!9%4N87*)sW+J_r~YmB_C+RZji>^(mz(iD{6n!od9fO`2c8lHm89n!|xrQ$zpJg6W5p&*jN
-H=9>+L;1^){0huA5Om;TTm*aPi%_Yu>=Fu=pn?bZ|D5^pYc{Oi7S^Wee*>EEswj~K6$<%R*1`-n_mCm
-p#qhqHeGP)h>@6aWAK2mnzTaZJ};&=*hx000pQ0018V003}la4%nWWo~3|axZmqY;0*_GcRUoY-Mn7b
-963nd6iX7Z{s!)z3W#DQUsO?n?<ojQMkxu(JkP^c7e9HZXr?9C}u;EDnF9=(%;@8Mah=!WU~ScOXQoG
-H#3jJ&gdS>vh&UxEK3mmpp64wTP?lAa{SKHa-&;pY?gJw%6rjH`0)P2xGeOv`2OI~?mi_r8+h};@6k@
-%Ry?2WFj|^+>$KMil<jQuJO1m@x?jU$mOUBa(7;{d#iZ5`e#lqeb(^17#b59K&a$k<4w}8z7Ry?D)pB
-#li){w<+}zy6|4-fk_BA(#TPxJPJZvllln4d~$s6oZIq0;3Ui9d+mX@8lWDAD|shn!8N?x!%J|`l9Zy
-8f6b^Q-E&gNr+XN-1);|@VTQhp<XWpU>ZKZHtHkit699pn#dcr3tq;%kAc7Ft1m*YP!gETN+5wvm+Iw
-))Q-DMkG*)s~$WwMt<oB7!(mNvz|l!NhePBP7NVL@l7!v5+18`Z=kHKxuJ_4Y(N+cS3FB0tf}-1brEP
-y%50(i|`zxkBFPsm+_CNQ#UM#tsHBZe;e(Ki<Z66E5@M3!C*rTYqwkYp8c48p^1O)5qR4QC$tJZd{bw
-j=MU6jw-**VubN;Sz3FgR(IJB!RSG$k$XkSM0Bx&F$yIB3+KXnNWNP0o4oDupQj6^CC6!K4o;(J9gts
-7%t4d2cdc|zkTkI;TFf+>DOD6_yTuIQr<&MvUrjvd5n^t(%@(<A(cw|j&AXrGhsz&3gq6W|$p<W@(A-
-)SCHX#Ol+<p8I$o1T%Qf>*s`$Y0shF=!`(=4Q<js?fV`fa@{mXW6Pj<I$fC{1H|z($Y*QW4Qtl%%0X>
-Z1ib2`QmQxJMNQ-j3PMj*{?RoR!s554CO&G!)Wpkr$Il=6Iy{(1Rn>dFSqOvR|7gUl_U*2^Q~@yv|pf
-&8_`xKC2bnLO%H}CXt0_yn6CrRwTRVlNnSkh1=6HL}T-!m`!5m??zfId}J?-xv;k;;_hs?B?s1-2q^%
-*f%kNEK5;{;XmmetCu$*uJG|~XoFIqKu5^b1&w^Y@ECzdJoSxKfgkG)cDi$<tUY2{adAZ<?R*r7qNH-
-N=b>&$7d_1$aHh7vHErvskeUI*uOOJW6UbxTx2T)4`1QY-O00;n48F5VTt{9Tg5&!_%KL7wC0001RX>
-c!Jc4cm4Z*nhna%^mAVlyvrZ*OdEVQyh(WpXZXd9^!hZ`($;-}Ng74hqS+G}9!--d+JJkj<vsqD@-F>
-0K<c0W~5=*3=ZK%OP#6#s2qu9y6R7lCquMu7NnxJkFf=YsTBA-is{Tc5T<FEE9TvsGC;Ejj7A7RT+Pu
-+2On{OO>~}u8bSnc2(Zib=eP;_0^TGu4c0>f=;twkAwbR<*I7S<1a=Puj{Inx>Ai@pVw8z%MSq6?fCA
-)ho4{fGe5&jLSvWl;Jq;LSGGB3Cf}*OvP;!nt_~4$Ki0X#f&Z0dr`|M8-6Z0zynC<O=4ikE+|+l+O9J
-ytbzRlBm4$YY`L(=KCN=sl-PbqpscXtoZ(yb|${hh?zt-AqYSjOA%Cw$2^!2T3cXeUxny%F)g6e5Oa2
-X7Q^9`ct!N8Z<Y?fuREJ3g<@o|nUdMhiyu$d=fPGkh%5BNPpfCzd133h`pVW$;odZpSQ;iGC6SystC=
-*#(Rc6s?@_QRXM|Lv#uf4PLUi}|$zAi7itGFQO!=nGJ5=!?woJA9sr!Oz^7GP_ZY0VxDavqBS^I13VP
-)m=M>^Ph-UWhqDs0*=0|n?lIus@sE#8PV<}s%=*mVxt65c%utdh_;3q_>StaXAUGnw+5i$m`Oz4(2A}
-qR8t;-df~Ooq~gO)gT@%q8HNUvrfs?$OoyQYD(Ng^UZ}D#$Qq)Q_`^B~)QBen_W6ljZQ6-p6e$nus`b
-OI-mALvGl=!JtR;Q;z>|J8>W5Y)TFq+W@q!h(g||V2>Ss1(onKE)n7V6nmC2%Llra;y2l_Ca3e{tB&T
-7kOu2-JXRIEEEHd<Ah+UqpSGRd^E%9W_M0wz<?_18R)ykpaT$;O9!gLw~hFYk>0O-)E|rz9wsC87Yn`
->Bj<k!Q%(3qd1z=5W=0a101dwOP$Bj#rc#oDC4PDAkQB#R70T2Yo-ZXwvTM4SGNNf|LT6&d){L9ZF?_
-;}N=vfyc*7W02dZ)Ck<Gj|GZxVz_t<gQ_{eTwn-j=Swg;B@j+Qn25ZDEfW?9z>L^h1NK%+c9|j^bQpP
-OTJW5(R<JP|VRqyvbd{G~p=h_YU0uO9uy$N6(Zu(<()(_o&d{a)0HdogHl`lQ#oVp{S^{qX^vnvi6&d
-`JUD?u9RX2NCg03_R(p4lc5jH$H#XMgU$Ii~q=>OM^lC27yjsTNK=}Naz*o`C_z)m*cm}u{-JO^iqt_
-|4t{@d5$<^O#Brv&8F?udBii;z_zP=er9ft}K*3or{+8Qtm|l@cTnOrwC~Dq%iRQh+S)Niqy}L#w>3=
-y2<Z2@+C(qLUTJcSl7kzTb*t-HBUmb|mhd1U=#7HfkqtH29&!d3b^)%T_fNvL}ZaC^w+IxO2TGIaEFu
-Sg$QdmSAg=l!Cdx>|+zE9_t%G0F@KBJ5`P8K(EiS!79@RW#iSMhj*(jlh<p912KBNMpnZYQsP+G2*dV
-xP$Ix^2;7n|&>Bz3t3VGfN_`E!ZSyPWt&5bDjXBF9y&-Y*atN^)9>UhoD<If(O$D|VS}dOdvIVw~-Ab
-TwXrdfC83>-U6vEn2r1?+8rAF6$tHi!*QObz4CoX}&eys@n0dz_?h8>e5Yc)ha#f6LWaM8!P4b-2=zz
-1V#S>J-K4t7ukkJj@@zuICC8U<>EHbs`vBMuRoG@(-L*ML=RBP#=906t;_sRiU{zkvm+mc21b2n`1Wx
-0w5AFdxN-`M_nLd%e(G2f{H3k#ID?)F(`Ls=5{L>Pq>2A?>tk<*{3Y6RB?1-Ym{T28cL55e9pCWUHY#
-<v3wZu|isCq+qNz9;oqRz~pr?AH+iz9grSwnIzK-KZbzxvZD_`^d!EO2X+g$kdYdfb)rGom=eXa3-)G
-sJ`_mCfD#LXI&Pu)r3Q^?-U@JgeT;%kr6E5=u4SIh)1hu4L!C%c^e-Tc2@27-%*B5RD^0iIP#-WX^|b
-wkBNuyAWEMCrdzb;AWenm%)k)w?dXxxhM5^~>sSS;hO7b!khgZyL-J_L=FQURYvJ3JjES^4fL3Bp>MC
-c3IH|^yCJ(7)ls9t^Su+EF(t%<UH%1pG092;)M@I%Dkf=avPhQp`}9I8l=&O#a8sDfa<k@-#pr5gD$;
-~W`;cG8jnb3<x%bms%?t-gYCzCdVKWxW9kjsin8l{LC5G{ne`Mr+nWm*}RmVQd7B{?0ktu5AzVr7!rg
-rfsz>7blXK#JTPB!~-z@DujQ|X2?R8q%!v)IMFMJ&!1=<5d0Yj_<;3`xELSgUXVuCx14FpW~0G1fiP@
-PF_0kW()uePllmPXe|4Z#p^^DDh?2l~V;=-U1`SD1oSjtNKBH-G2=BW61{4K!V*~<IB~U2kQm;arT-v
-M;MoT4aTx5&k#tiE)=gZ;IHj?;*zvBTs#ih;Uen7W+P9#u7gUd1k!W<xJVUQVIK?Yg%z|`HL)VYT9<5
-U0f4>DX!7tx+w-v%j7QE0M-QqTs~I{1BUz*+JZD%4%SZOIAL+Ldu}*C>q@WZj#HvB<r-lY4N*%jK+x_
-{}%pxNZVyWvEBJ%vLYXqvg2JZgGvE#r&^tK47p$eO*3#c2(C`5Zdy3|7`y6Y~D*<em;Ps+|~8e;iak;
-ZZDDMr(eu^JE0F;x`wWqYM%@e+cwJ<MwQ#dtM%&nmx<Go6>dqyl>CFx6<cXK0Bk{d^l&&G1LRmY7>qZ
-uNv)<Em|n=^mexH#V33E}s0_X0s+9Xp0kLH%4ryM(aGx*X&l74+qT7b#$~UmAOQc+hA`AoswzWV7DLe
-&`>KoNGn#){UTSR0|I@;-pc=JR684kHjJ5U8+r)sRo0?FDCj-%1)yFk9`F3+$|;7>QQv_qQ!4vQR|ol
-Do53GW&Fx3V-8?HhH`NR4TEg%P_2tROrI-y|L)Mmqz{Ds@XLU{Pao6Dpq*YCw<bdD8FzQx{zDr!VdSZ
-11jyerY4o$$`HQ4{-;BO7zf>CK<R&n~=l})6{Dl6x{3e09(lMAop->RBV}s-?5w<LG0m$Jy+klvE}lf
-Y&Yzv%Dm+i#X4`;8|JEUl-mKJ$c3&Io1<7FwB<UmX4lkSM;rmKc90c9*<05kz9)j9vQSmg*I(9F3aI!
-oB6I6V|3=pY>7?YWp`fq0$D%&+f1kpPcffGOW?XO$7p+eDw8+v}=U<gTYIn7ZYWy8YP63ri$Sol=@F|
-H8o=$d204r|xAP^X6>qh4`xpb+7ZznlpKxai)OCFl7h`<{<9mT3C6@SB43*@%1e*WIIec)J`qfy$-98
-2lgzk%2qg;y|zmrztE_bvFj?YYmX$$ow>r(G44kWd1?Vhw5C-O6R65g<DI7LN`uOqQcaF?rza=sfFxo
-SrR0<A3^e*faDVihba~%Z8f!W`Ah0iHQAK%oic2WD`Sy6;Py5t4QrB#Y64DC>3}OvgTV2lUTLM?G`ua
->S9~!t6dvjq9kI|wOqOM>o+Q(@Pb=JTP&l{R7-W*;Cy)Q-MpuH;0KUbE;s1eW-|>I;)*4h2x~^Dhxa+
-^zbb6hJ?NoPyF)=COKn6PxLuqlUyD^fWy$1giBF)}kk7za;mhlwi`W_0RmY$8sq{9!4PCEOcW_TIo$o
-!`z~}E(a|IameN2}g&kaBsJEHZvhjb$wO=gSa4>EM>h(NF#IC!d&f&C#u*cA$myU#YQIifltvj_G};e
-C9^yEuDSbC=s3RIaxgK%YhSHtBIQVnY^iZ4rDvKeavTD_Xw+{(-e_NCZkMCW0<_SAz>}YH*!A$8{eQ@
-%5MYphYh5lZAbHS>NNt4<n~Ej74O0cJC0wd(71BU`w682KhG(ad15nSm0FFv+uAO*>b%cwaEk1qw671
-Y8_-fe33@msjF$@&(tM^zixCUa>CcSy!t_D$N2~~!d&C2Zk!Ge5gBDAZnG-@25?S@^dW_Cpcd}KI5mE
-}uJpiISx$reW1M)O@cJfTpgrz%km&R+5VsO3JF=RDuTSt6V-s8v@x2V>Kd*vYAoRYZOw{^~^)KmfkK)
-9?4=3DUomMJx<Uth0>;Bm5Ji!PtPUJw5$R8E8qG+|3ZN7t&2@*j}CF?`b;bAaQ4uJEv!iia)4qP5EdK
-Dsw?#^-gJX)(cWtqyY`lM+#!09dD6;X$1fC#r-mFv+8tTm(E58Gq3oTALcVs@%ij{bz3KFOe<41GiaI
-<m5eww~c19kV}KKQNh$o;Fd)L#%ber$=X2mwK;D*<gyW#6sg_yKbu38)sE<a>L=ZFJ8fOvmz2NgIlMt
-?(}VYFuduai($LW276JO`q{n`25tJh?&DN;=JSMcMNWrfI8hQR?00o*eU9FSB%;Y852BpP*1VjM75zI
-3t0hV7|Asu3ji(ZsOBMd4U^~<z_lj)+|IQy3H7IxQ(jaf|(y-+LU#-qRz6TeoVwAo4zRoz!V^wxtv=i
-F<7PkS%gUcFlCVlITas%%2pQ_&ng_V<-*w=;L9#6J1QJ0yG#tIx!@RE2{9l2F#lb9Z*08?({+XSZG`d
-hwG$hOAzm58ki!pA04oWXD!^7G*qMz8IjffE%r#(c&YD0A!F)$=$a05H3Hs?Fkl+U7Vt!TM2-sG$q*$
-sOEE6hA0_OL`jY0ldR#QkCWeijx=sQ;E8vWepd5MF%^?fNZs!yJFU1L+GRGfAyj1s3jk@;3J=n@5rQa
-ZMYL2ZhTFb+S9#fBNenSweqGm=7NH!Lj@nE>YS9Fk}0DqblKipU385O(%6OyN*m6pGG4DE3$r&;Zq8p
-P`2^lRj0S(x<vVt&5)zmLxWoe_?X73_XWlQl+gqT}_8E2i*{&1Mm@uW!bDco~e|`ILZr|k@eDK>Be%$
-yDmpP$KOoNs6&r;lFet3cBK)5xZ90_(HZnIHFLN`jmOAT%&q`n7thPCwBu$gBL5W$tb>2dnDi1eHkyW
-cjpxCeo_n>3J)cHjaFWG-c;Z9!0aXVsa#HiO6fHXE&u{U8!QS~A3zEZ#v48^M>|f%3~nl@g!wiC^CT$
-ic|L#5dpfVs0O@FCqugFNoUC_`dMJU%Y&th)dhp`BVB;`c>TewxmN9+;#?~`0~q_F+KL4U?u39GD<<|
-<<trkiJ$to*Ulr3Y2)hbg<X^IGw4z4*MX$jl#EDMt>4wVME4<}coZ`{IQuEp6(m`BN3s|=T4uw_eMkg
-3>lLb7pqU&=qCZWDPb8M|QPlRzz!Nx3CyFCn@;KdLb7%H`@&uiB2kwgp0iGM^-`0z>_g>k=7e-us1Ha
-D(F(*)|0dnLGh9)@L)|;Vw;t~Ai!y>pO9X#;(GrlVYk^PF!pWaG3pC0U4b03>yPx$Tuf<uEBEd+`S$g
-Qs2OYVdlwKVbir+4q(y#C;n8%>ZOzoJFPZz1?a9}pZrO@)OnuCZ(6B%agn@&3^}j_4&6^&~1p&b`&3F
-z1@jKxx}w<{>yJPAYmB>{}OGB7mFw^u$piINC`uUEv$2zNFx%GMtL`Fo*-s9BUA~2S<P?<k$FU2?}=G
-WudwU`A3NLuw(~Yt5)as%8n-71CD+bzG`q!6<pAcG{wD%K(#8VxBT+?i?2toGM;06CdPdJi;fo$?Zy8
-#x=QQjYU)J>?;X6ycpjhe^4>Gd{f9JPJ-E9C5kt;&>e0v~iZ2IGMkXGJ^s0aFTaj^g9I5>M4@$yN5rm
-20<Z;$Ih#LJ`j8R`8JK)zBdM>^Y9*(O~{c29j9$mBgeHg-nKCe|@pC0xrM{&@};qkW%yu;xhUL-_k(<
-+EGhf*T*Fw<l#LkvP#E+<@Y(w1=YX3mBIneJ}Je|#6=6`T@eimQP`@Ka7P+>-t~IFaA~>4A;)<)eLH?
-bFrxjMF=^QKB0S2NZM%3{Zg&N@)GLf8!K!$iF~xMsY&b|I?SF(RH|$=44`en!-uMMg}tV=;i)?&L4ER
-7n`l9f&q(;A9x&Q<ns)q{gF0=P1DecohrT+WFAh3`HmEy#2`pW(U$IdlOAYrGw&5Wq@d#CyE=FbYJsH
-UC$6nSxMAOPbL792geq~mUbVaMZ%}`q^J(*?m_L2?bRHO3rCNxqqtZ6z@yL16NUToojF0p0T#0HohC4
-@jPq;Ph4h7Wji_v>Qt1WKbAJHvwEfNeTi_7!rK1kB{A%@+D^xkGbNby4@@e}c_&6YHXGWwG%bRw_;(j
-XQ--_5&+LC#mj!0i2)%i7{B@mrhMLc*u!kV{fNtXowc2T)ua8eciGJn`xkA>k7xzJpDtWEhlx{*PY5P
-C^{9CVLJO78u&z=XjCH{=%qe^u-D4RQyNS3*VApx!E(Lw6qWLtDu4L|4>T<1QY-O00;n48F5U?G33OP
-2LJ#%7XSbr0001RX>c!Jc4cm4Z*nhna%^mAVlyvtWpQ<7b963ndBs@YZ`(K$e)nHN<Q`;aRrTTC3>b$
-X&0PX)nqce2JrspaTU5-AB<d(Cj<?AE?e`5yQIh3!TeR2}f=H%@!}<Bmj54hXwpwM4X|!0am@F!#4da
-_y<&6<5_j@wQh%U)wE-F=<mQ0jem5No-<VIFpn^mTCk#fU5eZ{wr{6W-7EuWJ@J>jX*c`i42qifN!!J
-6YVnM_tIp63u`!9GU6i2pUBHn+m;R9Z)$@Oqo`x@N-{Q?>a`Y|U&wVYtrD&g}hCl~1CSU@TZ6pJmA)9
-JBjH&GtJ*r{|&&CDdi}0=(vHNTMoHu32GO$E<F)JIjvOY;HHt*MB%2{+Vo5S>j-+%1Ws`xn3^sFT>J3
-me!1ysog%>OFIf)!a6!3(p&euP9~QAUaKdWLeP!a@h1t%N&136%JPA2RZ*ytnL`Bvl`%S)X=f8Jc^yt
-p#nv*~@8ou8_t2J>I+G$#ogay_QLL$jm*GQ&t(n}yA&1y4c{3$``^pCZlv*=cTN!InT2`LKni{UQ2SF
-+=EF-ruWpInx3HIwRKeH*>n(X|at7XituP)xj?A_JRSIete^2O6PDm{GP@#n<ioa{osTH7==F$%%Wz<
-s~pzo8g^6GGM*Imk{T+~0kG0{6etzl-JN^(*2Bk-b-Wd0==*d+v#uG;A;PoaIVAvZf;WTsT&hR+X0Ah
-|YT?88_s4@*-2EXjS4HBp)+-6~Y6a#<`AJPiZgeO(~7!x%^#d2HiP!30=><9(IN81W)ZE^VhXoAl9<n
-=1nRfyMb9Cf9sBzHDxZ4!U~7#mIwKTJxJthU?!fcTyCYw4@pRC`_PNIRjbSbZa349kqeh7W)WhDZWKj
-yzq?=F+`a!0eVR>tQe;3q2`yKvX)W?BZbezVhuLPGQuH!u#ask|;kM5&9WRd?o>dDTSdAHlmSs9TA`T
-}6jgP=|vD6JVb>O;DO__3icxC_j`Qv^zXY3#BVpAK<w<eHiE)fs!mAPplPo&ecOOJ)(+4!Ux;wp}IQ1
-4OlY;@${I)g{0W@=xubpX;9Nt3gl<$W-mvX;x!Q}%*>p6QD846?L%PuDFX8el$5;A3dFF=><HR1T>ua
-9gjPG*Dv0YoLX4Xt7>9k+F_6OMS}FwcH`4@y7wtz3OABu@$*VqDc*-6Qf*kNXZNM)ljCQ9yC1fQXoS@
-n}ppMw&f)%fjy2etDqWOOVe<wG)O9ddoEaQ2r8&v5R`kQpi5OmM~Rt2W0sPS2mln)uJ$M&kYT?QB|{N
-ImLk|(2?VqSX5OABN<jR|I}6ZVz#?}9jN?q8_T;G?3;D69l9N96)?BoK)l`+x(^=;PnYA>qluh3gkTD
-;`vKDB6Jn>ks>8S{Hw{aGJ;cCO#-@j?^Ao#lo$!qb|nvfTMlq%n)%aJn2u+X>sHzCBAWccCW(F2FBnF
-zdy0(+8x2*}*5$!)nmZq#y#b4NW-%!JvV&Hw~>TZX`yR3FAbSFQTRt4k2zz2>k32tG&tZ8UGUy^QFPV
-(96`bmTNIj5EYg2GFvf7A*Q##D41f`>7-CZSTixTSN!$K0j~8cs){VWdE>G`R+peH^&`W<Ld+OxLNga
-7dZZxs=<1F(k75$3U_cU&SE;dJT4OLw9^ib$*U9N+6$XfVe->pU#p5Aa>dir)f?5;P=`X(O~US|wcMl
-QIW0{R!m&HE<r;QGV2}RO*4MYsZ%*|6(eTvHVz*&n2u+1;q}uvz>nj<<w(Kwr>NmCQ(nK|U#A{XZO@8
-P)P@V}tn9(?ZqUL&MBMa&yluFn&s_2u@c3dd<fo;I%vGsSyNIsM}GgNe^_1#5dc0KVwprE4dpaIhN4L
-t8hT^I+bV|f&Zw@*B8sQ1v|U9*e#?*c1&OA49>Eo8zjSoq<Zq$&L_!7XMK0x`S2xxKRHoH0iRTj^mO1
-QKG=%9pTzQ&aKGsaKuPCxevqqaVO-l&Mjs6p%04a2<{FILeTjBqB(rL`u(zc{Vgrc<0;s+rNrtCwRaU
-dEkL_dOR%Hbp$gMY@SYMr?`;9X^+kCmd!?%fsJ1aT>h*gN3!4#;_YvhcsMC{smL+@$bq)q8)w=h%e@?
-72mFY<wF9p8f6OZTZKGQuc5F({&7?-63?i(blr|=2eaEv+Lp?Qp5WxuJz++=EP8M?e*nK?#r;S$o8Wo
-@y>zIgy>&sEb)@xrP5acwE)(t^`NG-Cl=+c?s%@VGNd^NGNdEkZw$CR!2S{hK|=a&1NO$B^}81w@~dV
-tF4xHZyV6|5~MK8FH7_r<0Mi%_$oj~Ok>AAPVO&=<!{yX?2j+exAuuW5AdmzQyw>nHtR+L3&IdHK^u1
-IrQFA|hbyYVCX!(QXDN?_FuF^z>wYoV7LbK^bO&&3&TT0CIr`_Wa1AwL3Jn_EaUA(auo^`sxyf-JX!g
-g>Nh%F^t=yva%4jc>N2jZ>8ek=*8G^v%wkTVd2$NM-5y2H3e~~bL-QO&QhPimL6WAX`TMbhQJ`#<^$<
-o#!=JT-L|TJVK$=uVlVqm&FKFDP)h>@6aWAK2mnzTaZEo-f??Pg004Jc0018V003}la4%nWWo~3|axZ
-mqY;0*_GcR&wb8v5Nb7d}YdCfd)bK}O5-}NizsB)29Q?OR+b8?E6#MWwK<?P+9m2#Vu<03(FNR9;p3?
-8DH5BJ-zAM*r;kbLJ$ndS0|z)VkfPfx#xtFqXN>2%f9O(~~Sp|-oCtVKGnima*Sl)s;>aM+^AYxz^1s
-ks@ZpKQ}SUCZ)BKm8|+Fn_DU{FN2!waV8Fswx%_vNm99wUtE!t5)KUUflD8*jQPXMd?P~;MWr#m`oQ%
-mdQn}io7!8zq!AE|BXzSvV5%;8e$@UTF6~6Y;+>v^L4R2ye;Z)>Usw>To>D2TB~^`C*pls)CGX2^(Nx
-ATog;GzkC4j8e@J!us+CY2Mb7mcfD!y2f3Vx+k62qGg(WVgWn(1Of4C|ld;Bbmo6TFpH)(+pA3FgT>|
-r_^<gI~q<)@OlAle)T;*wbpm%`i-(E$)B-`RqT4Faq-*k~FnG?@9Os<{=dzv#3eHPvrj!neZu=L&Cx6
-FB-)6^<UN=>ktrmE=*mnkYF9ln_X)4G^$faH@CkO^^RBqLeN`dj!@mZRx3Pq!eB<CBw<MV3|-FnpDzw
-Pe1RqhkIe;5fcKAyzNt3S?O2s-8|qmCRP~Lg){EO{ObVR`s+l53t;Q*~r%GWm>23#$)7Y+!_Ka!Uz=Y
-WGQhMftm^)!axrPAR(>mQll{uNQQ?@DdCvqLXR3*$a<iI<d)EY5JL};T8X@<>8X3@t$;61+M`>nh)%R
-9c~p*Q@sk+OKE2|l%&QJq2SqM{e?8#+S!xwb3_-?s^-Y>p^2j*7y>E+LMw#U;W#6-k;0-686C&{(1fC
-F_GkW&jSAU&;{QCC(F62Omk?lQdNeB}e!dQVgXITVJmn-I&{pp`-_rE=3M+trTh4@soiT$-6ni#K-oQ
-D%aAMlzkHOsc}f4v|qhTp{1l^CvptHTaKKCd+u`b|sOIW35q*w~ekDw5lGsEqZBgTa9Q#X;8kkcm!JF
-3W_M_!_LjJ}sBk*}|GPQ5VJt48ujl9L#dPk-{qX*=!C*ayA2nPVlk<Y}Znx`BE?!mZHedmU4?v_8Xbg
-^w|t~2D5f$v6E$efaxM#Ea=Q7LfmgOIHnU{W>q0P6!)s$5UBTudIPqps$l`3LjckxXl+3J5*U6tQ^kx
-R!IuUtH{!8Ka{;I<fF2;Wl)&62TD}zMN|!0ZXK5FT@zsuvC|2+_tqI_&1aaFJ<%8zr%};fiid~A2Ygt
-xe1&+yFZqi3pG$n}|iVGT9fU5bM_}tY;>ylvLU}WZ$*3N4uFSjeQS(9KRfL`1P;7gVvReCniwQSHWKo
-Y<~XvmT$!9u)GJ?p?ZliOWgp<M7_QSIbHt<*y3S!ck_VhQUE*%!fG7aQ_pDhqIwsRyaWpY~z6WXT?mE
-#B3G+U>LemFb=ip?%r-8d(87us}#lQK~hnIqO_Faz3)~sg^|V%M=zYQO4F1&IQQ=xiM*cmn=XQ5pZQ{
-AR74aD06b5fJ-W0WDT$hcgUbb^01WiW-WG2xdS(-O2jS9bpT;_xmSQxlOw4iX`l>BB`ZhJJ#9ZdG{?H
-472(X(;*yTe<?O$kG6ND`8K(>^N%8^zKXamtpFPMwE^6e3h3g*;xRoIuG6zByR$iu=%-8kCp>@OWjbs
-RZFBTiQctE#~ylSo5V7d7Llxq11JFsm4?QL2wHWn7R!;QpKcdf<jTL#9GH9@Va&r~Ab8SYI$aFB^)rW
-30R>5uDoZ|`s3-cMiOT)%sL^WhFG)b}iq6DN&7u)}`y`u4-k_5Jkj{;T`H+}+UFSLZJ$;??;D{_hq3?
->G3r-~MpKC{E~5UJU`dJ`7iAUni)p>ZZCnp9rA5f+LB4g7T^0FB;J?(&X|lY8=<n3|D+g!(+@3yHGj@
-L?g5-icJ6MJpN;-XsOfV;{tI-4$#EN&=i#7rdZMx<3rFXUct%3qnv^|9%&{`T4CBa;%w=muqkadBQyW
-lM<#^8&7v(2pLYm-RQe-)sW%PY>c7I*ypiyh|7ZioeI&s6NBA<_L>Lr4XfMNu|H^Dg_&UBXFgpIC<Iu
-Ca(RP&iCE1$jo7FD<yd!uptn;h`YdSyF5<|rl!-exeZU_go6P^I!vxyiT35UlqK{B-9KW!f1seo7bPw
-R~r7GHTMCO~kLR^*~GQbQzS7{!2i7OsCPzAC{uq0KYec)@9dv#LI1q!hv5$g34>kuko12$9qiI>Cs03
-0uFa+xrEsHvlxznLZsDjgN+AMQ84TuHiVziaj}|4*S<dK14@n0j>`szmu@f;O7C_3v{@Us1%$vQ2Drp
-H5%uosutkF;Vb1t-7JN2K7ucFfOexX*;7OmeKbNjslZs*qrqe_9{c++(2N-1Pzx@y5sqP$6!6JGmu?G
-wvoU8tM_g$6JxJ^p>@kvJqFgcy{B{&7#j(HA?aHW3Op|C;Pb@?MNqo9mc7Pb^0(%_ZBko2~Ek`ZG5q|
-aJDU57Nxl|>H`ZOyRDGGc$_A^lje(p9!lPyt*%`~B-fD&VjKRB{4*&V1Zk@5BB;3k-LbjAzG26$_rGI
-fJmDjGlJrQ&LoQL|tY2t82PF<@D>0cZvWaQumMig;!oLx2`dqO5=^zEx2=lI-{x$CEI@IW$-eJ<-vF`
-Ka4X0}%lmMBCZfs~`_Vs;(%#Cr+!yu!^Zl_<vKorF;<W{8^wsIp=^c|7Ze27sW#W&_?`JyusKCL)XHE
-t{fA}w9FLfMD6y9^W<~dSN%NcY)Ryx1i^l&m+h?8?)V%!R*Mu|-oPCjAEVJRqfKdmN!!fe)LLd)-x+*
-2$GCv>N8W7bz!=b6WK<yv$ubPo(D%modyr)TQT8e=6Y*Vo0DZhd>w>|MGY&8?-4;zw!LZRhzBhk~O6_
-ts^J6CB2%j8U+k#7BNz%w1F<LZ6GFeZA%fpT1$0}e?;4OF#xvzNHDQ~IYBiaj#3@}we=%$rEha+frf_
-w^v^ed4*rYghaK^#}>eszzt38Hz3f2aYho(J(M9!)$dB+tIV3MKKB(kBi@ik?@18y^q|Ys0z&`QSAsM
-ZjXuWeXPQH>n;uKcbgQcmd`fK+dv?4kJdsI#)o66fEzAz=G7#TmmO01#9FD<igfrl3-p|tdo6OqBR{2
-J{WvTM;}l%hv2y#B_f*!0VMx3xHrzsjdlrur?sXH{*ynE>}3bs@VQzp!9(eR29p2b&9(T=#jA6Gvk<S
-6SIGqg`0KnN!}arU(`+QyufQxBrp6q}uooTdFZ<w`og0i}O3UeA{KzaSb)k?&6Vj&v3rM*W8%(+gl+L
-!vY6YU#N)J>hei3+>5z-m6RG^r^%xEqkG8c77(i(j!K8M)-^NX?G=L}ssnO6<4mZX!8col($nhGRc`x
-7d!EA6<ZR5Z&96k&!j138*`9DLagp-&C02J3evXNszHD}y`+K4kI`jN<BG(g9{zh^nO?eGj;eU?e-p@
-CP!FhiC_RI2n$A7<a(%u8%advG~1s+1+CNaC#*uR*nX(T`_s)rQ7l2;@SQTnw;`LDE^v9qfe^wKzyPJ
-=^}5nt42TB6}wS5OqX!}3jyAAOE>|PPHm{0RB$ZADPM~7II}{Ko(pr08N<^0j+8a5Y0t==DV3i&fVcq
-6T(O07gQ4xjWG3|q#?-Zj16Fx3{ma|`eEaU>TgUOvakc3Uloro5bu4>=T^7K3Kon;AhzO&rDn23=#R5
-7eq}*uA5wFKe=NykN&OgV*+UH|*Nnf6yi!V(g1~`2I-)RNkic@9fo13p*4?{dH|Ia(FvY+>Go`Naf^a
-VDuK5KS#JZ+i;BYib*YDsRjM17r>hqx<n3c^s!%TDrKI~dF>)P1<wX9~EOSKx>|VxA6`GD_BicW2e@g
-?(z$I~IDM>+wWDZ{1!)F6blcigXq-;Y~Z+8Vg5VnkguqwPE@dLLTE4_1ekLiCAS#wK2es>>}6GXcwu<
-uuG{bjiv^O+7$>%Va1f8@j!+c-`36{({*bvp=UiegIiZ==sIjL>UeovpVHCoJKcTaD%4}NM=hoGOUeX
-(*c5o}FQX1U$2_+7DwpCD&}&#=>>7#zx~~Ai6`)j|pgCyMGZ8ZMo&!Pf%97o3m*xGZhWWwVQ8(0fT@@
-sj;qV^y@dgKKf5U9BNtP5j$Qzw}3eMEZAH`MDx<R3|(B=~Nk?TdV)!Iilq<G$}`h;x`8z1u+aoVS?X+
-(d7O#nj&zODW+%Q+I)=>koDKj*G-2>4oi2$ddXCU#u>b^TitQx=59&rD>YQvnvrBN*2d9JmQayJVdlM
-6VSL-7<83GnqcHUVyEzKsIW<(R0$BN*vYi5Fb@fOzOoHkWIS7L`swu#iU7;(gn=TrwGWVZ;$Jls55?0
-GFzSmkF~N0n(AU+{F~dqes^;zZkLkO-(C)}uKpm~rA=V0sgSpu-tZttAlH=p12H~8be$JWrr4(k1P#g
-u%qYg9RDY#ftrnTC)61Htz3j*(qb7pOQ$vbzv8NDDS5qf`c<nL8Z)1xn&X6&cCIoyK36WZ9DBz3<*^L
-?l+<Gq|YBXT0KXgFC;iS5Nz>E+lIxVI{l0HSL&ygHoavpkxzQAJyJI0Wr8s}_nu(+L*R{asns{jps3f
-xjaf2%4RdN0@Ab}0sl6DDv9u*{u477+bZdytD_k5hp*F0@wNEwbBm^8dbjqgGR**9{sogC4K6JXfux$
-T5Kn8b3$FYwui_#e>Yjij_k!Ofs}Yyx=V+T%C%+b5L)}Vh;%Kt=q>erh`GsYu5tO<i@*H*&#$TP#QsB
-W3=~+5Q2r5ie!Z=94NR1Cp!>Uxn#Rbh>8>iy=cl79H-twgmi}4;T7KoFDbMI_&5bkAhn8;?6SDx^L3$
-fA`Nzy##Bt2AGQT&G6@3elN?ZoIUMM-%5Q096^r?`24D8*Y>(0-b<X%nJu)~Ult<(4iGkP(Ub)VU7Qc
-*JKpB%}wNeYyi$V}1;J|d1U_Qxd0$y=pWs^RlR@)Tlimcj9Vtxi~BMx3&6g_M?R!j)_;mJ{y5k_JOzo
-5CM^gGnJBZtKYw%$8ko#ZBYD9^Ug{X6Y>_uY+E6(ckncNw6I241CR>{oEorH*ydZLNDQS~WY}xDiww$
-Z0qhz^bjv(h`Z(>H1iw6KCz&C+B{<eIe52QX!X8R}ptTZ<pBF7oawq5m#oj0J+)BbC`5r5fB%0<{LP)
-+h(!x1hLjKjff>E3nsC+Wa=sStV|PG=;+Et$~r?V3t6GU+k#(*>BWj18$u9ip^U!`*w{^9HCYybv-{e
-iqc6U&Ep?QWH@R{b)tEA`>!I^qPW*I(Go2yqA`)=C5045DJ!=(R#-TW<Lf%_liOET%y2<LcvUJmcDXN
-xc!!TiEzce`@nH_M4R?0S5Ca%@fd=&Me0mJd69f}5gtGw1-qe;7M6!#4XRCxnFO;J9yOAhG@y)*2=gm
-qy)9j5VY#+&NnF?t93u;es9EIgZmJi4}4^T7(iIC`YKBEO3mElr(7fX<(EyW@lIpGZ$ov=kW!*DlnCv
-2eR9B<TM(59!$RDq)Z|?qoWEUvV_>11`cH74UE0+2cnMg;8n!X^_=U?_6hCo2J0)!B0GK8=Q@!*9D?D
-0LIbWInw`cSK{2ZVNhc^lKwtR>s3*1&rH|srTDs8uMehqjFPt8#~gQ}+4grLNouDChmz1#l|6@X7<~Z
-)O<uwgO<BM0@ziUR@EQJ_=<7jKHlx!cz|ss^bbu{RNPnY`F$u`j5xeuOs0erj+-q=jsb>B1-zVbY{N;
-rhAu^YreKv2_Rl=~6qFjFlflMP`esS?1za7KkN5F9lHfj#=lNK?KV(t$VBIVdoHF2<d6dWj)a*LBJ^A
-IpVpoVK)Aikegpp26f8}y`Pn~%{0NBaG&Q_|^7(&6RkoP({1W8#Q4VxmJujv{MMOoU6(EvThnc?4aC$
-BKI)OBRc{zJ_31{8gsvLn1z+<KF`Yyb;V(am$#{jYZn9qpRPpbjSCSVNrl*`=2Yk7qB(nF-rv&x=ABK
-&{&k%`O^cgUGOcDY0Y{Q$z_<2DXjT8k0Q+tllX>)na}RMmRM8er&KYE-?@rQ&C!yuU7|DP%wMFNa1Ha
-1qvvGwPujTlI6IDX-TD^ZhKnY1dG|fH`{KommtREv?jtVtSLQlFQQA8OSQleI3vHQhph#dSik80RkQE
-SoG~m)Wf7AFP+_pm@+8pyrw1GNR7N{{;h9CsqV-W1>=;)X5!ZCdJNJSzvOR+>2>S6-K#TLwF*E;9LAq
-IxBwlY^$t`mcN@<jsyi<kDs4|))opF}&zeX`!|LR=<sMhJ07Z~I_62@%r(T8;xTel~XWSLEBrB+Q&p)
-3s_9ebwyn#%(p#Z|I~~ZI=y&k=h@W*R^J*pqJB;_Eu-;k(4t5wXeGF*M5U;H`yNVMzB?L5wO0JFfQ2D
-GZ5@1QKD)w#NO$FKhg~vKBQJL;BlL3lQ%Mf@^w~C1jyKn7xqr`!~Td~_>+2+SYfmmbYhYBOqh;#IQ->
-oHZcby^^SANi%}WR05g|;Y<L<%)xnNq%m=HZy^CvTs&p|_XF-A+Q}!kqmK#%Sd<nya*{plXq{N6n#tw
-HYqfEBdx^qeSXI~D1dGG)Biv4c(HD7gh`>CrS323G*9GF)B2#T@?_u|=blR#?heG@zXG-NRE5;Z~?62
-PhDbUvl$%pDTjbKs&-bGgJ^kA*E7^26aooI8SWXJD8o!E{aGs*GIs=@58jwxVyWzT#Bs#**H#<`PtCZ
-r1dU*7u}Jeb43zEa=u0|I<4%BDB5Z!^7ToC-5C_@M+|ZEqS-v{_{oAqc;t8=e_25Uw^Q<2i2YCU8F{x
-xk{U?<GUQ|H4i3@J0yh;yCo%A6vcy*Kc=qAs~|jiHu|SRr(?k3ArHsiZnp3^cIs(qXTuVAfxGGDCo|R
-k8R|$=x3g;@g3n3XgwY;#WSZMVW;z^flT&WrDr&Vwd%5Q)K|T*4kLoe<J{8V(g5l3QGVnA<I4a@>m(d
-_ll|TW;;grcU6=b~*$<5$NiU&M;@C3yg_i-Q1A)fa-!+1t{E`6W8d;b`|b9m6#4~!kbWzm3x=MxNvV^
-OLd*x`X!FW@$eekKQ<<Pj+#7*7d7(C=X?71;mYy{_T+i&L)YAB`&Uo;9coyrHje=eMH&wwef~i95{e!
-d$fdB^N~BJ@7a&e4U54%J3168)N6;d6ZS>J<>A&{?bDD0oKAlVleC=FF1|+_kDdc*p^wDZlYEyJ`m6h
-^me6Fv(8D27$=)J{|JIuuwc&*Kt@Gf>n7A)Iijq$LX{gu*<$mH2z%^lubM5@XG~8k-v1{O@h6Tf7~Kr
-dmra70rT>yhOw4yfzpt>_f%7k?=4Pb5FcRK8!ryqoisBG&Rj4&)nefM|+`Yh*k+%05y~#Wae;`JO&$i
-ixf7PmcJITAIc{K5&^Ze#31$AE5S|_gYv8TWEDEvpah0lk-10V6_`1|u8+(GE{4R`L2VgoTkfvI0SyL
-<T5w2zxRCAh8BSYaz`5L?Va%9F_Qk*p~zUn8ik6dI!EZ}bMXCes`3ay%WsL~7A$_k;HpJIn;j{b`l1<
-kS{%J>JC{>%1lD-?;PQ!Mqrgx+^NKQ(k}g_KnaLJDIy0KEjG|^5`XCvX)5Ym+g@uz1*=Jr?*on>8{y+
-a)xX6^MzLI;(65p_J2k6U&QHW5ve0jB=q-ffc=nuwjlm1X}7_Wk926_t#*G#3&gX#9eTSQ(!96HA=cy
-YE6)`6)~0P&;|IAfv3g&7z7yIos-`G(tohfNm`SGdkyAkpI#*e-R*S%dxmYZAQPDI3wtpBg+C%Q#W$G
-w1HxVPf;+%I8-5)EsG}DF%MmInDSK@q(pO-{s5{~^&WP}j<@f&x+BkEb9_Z6k=*4(4vL=b0#a`3Ud+b
-8>tT5KXNR5Az>PW<}}bNb04b6L{~9(gf%na2GDkjJCG_NU12I*yKvkNy<K@s7BF?XAv+=e8+u?iml?u
-@X_t2aJ~cJDRN%1enhp*!$3V6YA%{BZ+nxm|s(C70YPG6N&KNG?xDfYHYfJEJnM=r8kYvLppW3KD~&a
-Q|zC=)@e@^sP~8W2fsa*t2Cx7)!xjB0J2vrYz+uN{+S^Iycb)w-qbG)C@k|vfPfEKp)KOB>kL~PNEha
-ZeR}9ta@)JqzCzN&%p;v5f9~lE>0vcq#X|uz<vK9aT66!s{Cj?BerpBq(LDQvJTI{DNTb^mDpn_E6z}
-jtW2LaFY5G{vogg%ai03d)cl<<QOimbHi8;^iJC7}HedMaF*A@FauSJBCM1$w{fgaN>$93EP08mQ<1Q
-Y-O00;n48F5Si00002000000000d0001RX>c!Jc4cm4Z*nhna%^mAVlyveZ*FvQX<{#5UukY>bYEXCa
-Crj&P)h>@6aWAK2mnzTaZDJ)t&@Zd0040+001Ze003}la4%nWWo~3|axZmqY;0*_GcRLrZgg^KVlQEE
-aAj_1X>MgMaCxm-ZFAc;68_F#fm5a<sw2}$^UZVWjhiT`=knsSm1J&u9hxE`i8V#21Snf~bNAbC7jFa
-zN_E<5CJ_ZL7K`0y-vEzBqiC@yIoYzJtti<wY+n|XlZ@;btH?I1vo&pq*kppV9A3O-Yz>5$yB(R=>$0
-X}9^HMqdH05jd_!(&voCW>{<;xj$1l#$^NO`avX+yQoNdpu-Hyt6=LO68`R*V#tUhm>YK08Gze|%Snm
-=aS9W2svSp4E5iU@pG4cii+tIFj|Qf_yw5#$<Ve6K_dXkfKkH03g}E1Fp#yAoYbosyELmMZ00T`bw7T
-D4pazKkaq@-=>*1q_v@?C6*itDwv4E3%}UvMxZUl<=I^lv`G)H8KnM#S=+ED^A^Io!zSyGs0PZPsLe9
-_q2N2S`HIfM!s!e7~duh{k5fB#N)T~#du1_#;A@t$1rEHp$#P&{JX2lZ7DKQvYLN22L2Tp6r4Z1mP6@
-3S|&13e_f=KGY5PS!Q^(VO1Z`yP?1sqWDlff0(KrD*%CHD@(n|Z6>G?WwG9CQsxp^yCZrQzY#K@l+bQ
-{xy5(iPjtuHp9l{^b`640zWG%_F8qGj1@+#x};;wJSJMvJ9jg>p;c2G*I<cy0mx?0g(lzRYcjox=4dD
--OcmW!;;(ZrlotX|`{+=+A%U?6$J6xcHIa_o>q-}&-opq^%%RaVgd8IN(Wa7UI0LhEc<fdVwFfEBR5R
-nH`=I3t^E-?KVep#hyYWiAJB%GV-6F9(P~oIBjlfcu%t9r1uGN;xu6%>($t3a$7nLI>kk-Dw=zEtph-
-USbOPAiPD}Gs1T?FINYNt`)0*8SWjFDm8s~2f`+YY+K#knV2NKvfiirtSLcNly~llpSPFu^waG;z5V#
-=@AJiN`r~48{qE`qazVzTY3VqMUMA#fh5RM{B-+Sb2QKoaqK_poj-IT-m7Z}9s+mg8#_lo(0E~*PDI#
-Ng&*X?9)(RqF$LdwNZX2n10<Ivn1E_)hmJO@7v=+qfJBdb+Ng^44({$AeP-&W)fSWBjt6D)*^*hqT6<
-e>-z4TAU&C^5H)bN5Ueo3;+@_UewC%k-2wrmei3bOE~;Wn<r*e|TCBQuRY=2ZK#rii6^&<yjYVa?S3{
-GwJ=1MjoP8!DQELv!6Q!E#nPLyK}tL0Qho?d?1HE1E<@k{cm@I0(wGJ{l4oWX;<f_47RiQxv=-;yc)f
--73m_qsI(QE6OSnN-9IAh4e@o+*`LC{D>m>@1o0~8eJAy@KicVmN7a~+9g+VSngYKFa(f9KCqfbQ3Q5
-|AKKc<nu>Su2<awG>ud`!0d++Zj$Purt}+4fcdP9ZJ2ujpcL(&x=Sg{DYv_}6O!o6Nucsia@%t64Ybs
--ot%)!{1nGe20>Mo&;2jDvve0r9_Fx_>$_7@dz(h3{G%E;O>ByjiJE7Ya_DKtwrNIrRD)(`SWXoS*E(
-SBp)(g&@KyjBtRRoj4Q;-?T;K&a_q($FWet(C#QIh?!iVit^fPlQjZGnTARYjVt#B5ZD3DdLU9n@f5S
-pC+`nljI4`>d=m2qg}Y393TS?M~`LML?JXyBY|vQ`F6>1+i3SaN;;`cM|z9_t;t)F<#8ef6H{dWwM@t
--Mx5Dwsf5>(d!4MX}=EVz5Gti6Ng|PZmm_iYilhYEvyV%iC~Z$lmxr_c)hs#_~BMt;RkwPvLIx@AkP4
-W)1F0ibzq7fibl{9$RLjo1zka$FY8jIY0PQ0nvxAbl{S2aPCq3WWJ+p&?X#*Z0I_LK8&R&%FX(ImDRA
-oLOX9|l)UZH0r`(2$9L;XX{EVx1a3mZAYmJU#iO5n4MxAVzj3$vQ1@r~bE)`C5u-$LD+Zp^Gi2?(-Rh
-b(S`tfTNG6Sfqmj(I!o=b?UK+@kggf_}~hH0TD1B_0p!er|NAN(ziY`+$)JXA~D;Ayt$i!y>;n@Y4-#
-|;KeC$iE$D-+F(k{g%<kq{$TQnGVepJRmO;=G|N2!T+0pZEL9jo4Pn$Vc$81m>vAPczA|7fmcV4kttY
-11WWA*q_*UCYaP8iu@TJp?QKdC#!_y_597{r*{iC0st0hqlI^X4^!KwmJB`WM`x!{KcwQYqv{E^qKB4
-VYki|Qy@75+*60mAGkN1cc1(Z(vM9BsUS9?|vl9Y#&%j-^3@TDiaTGcMRvdJ^@?u%w4t{KFsKTC#XG9
-lZGhKNZrKO9j_w$dR79qE9zcoo9y?>ZEjYVe(X_yoWCu6f%e|M`p0JF86`KVqdHKfQfj67;ZMS<nS5d
-yhvVhR5;BhP=6T0r8jCVo^jd9TA`BL5EsL)!#{yX;W0teBzA!new-Gi}}AwXv@LMu7k4zad#BwFZq^j
-eb?kB$7h1zIJEBj)xUmpEP7vfJo4B(^+S7+dOGx#rk^^&K^v&M+1mIzq5}n?5$m1YnkRSP77Md)P=c(
-4rMyGEi#_&fV0p1s+OWbs6NIPGVNF}Myjk?(=jF}X#Zo{OS7E-PffM>=?VZ-JK2?{ZmNR35@tooKv!S
-fFn~O_!#MTg`F1H~g}M%s1nM9Z)$1zbQ)+t69%=;qDJ3mHba`TA@%034dA+W-myCvx5IL)7e^74Iqk?
-SjP^+i0^YwL`jUz|xW(+h?)tJe~W-q@BY<6^G(CfeIT<P?-%(=ixO=(9^Wx=1Vrh-vb=$T$dg~ki=4I
-hzjY#Mas!vZOF!n6uVPFT}9OR&@<jR)g=*AUpu<>$R_;b-JWh?P(m8W{i0$%twst(fYpWtGz9EMMqEC
-CuKGxC1meP4L>+_cQWpL-Tvt>f413|Gopp#{<93n`pn3)mE&p_sfw8+<fHwsDDl12<U5vLyO-+EifZ5
-pT7+0@uM5b8IczNQ9u(^8l9nfMPyRec|);vh`pN2NHg<fo01f7pJeKq1Pf@-@ia6nhBWXI%@5D`Qw-o
-}0V_~%YoQX2guJ43mjcoxat^UKEnJ{t>!hH|b{&syv>e!9eZ$Gw_vqGE!99S7oGb}UQ1uv|qQ+03Zfp
-I-RM#iaH1*a~Rktm;2aW?e4b6h0cV-@j=b2Jmf1e6D%FO{U571I>SX(KdRd)e+jA)VC9mQ-iu1u9?E9
-inibxQzk9K;~Cw|Fe!basif<4G?HX(!PPt&a?O?6kjd|G?pd?;WX>f2T8g5X4wuan~>Q9fY64^^>6Fi
-X6O@J)8%r*->cy9#}mYQpbH?w!%-yqc-Gpg#G0%PM=5hkD{Jo;a0Tj6#MPv9Dsz07SDuNc-lc|owEX?
-NY)Cr1%J<>2Le?tTOmt`9ycr~09b6V?w0IqrSZh0#zPZ8U}}kG{?-z0CUls1tf|io^?2gPP1tS75Ym+
-1$T$q{1+9h`{3%@QXSbKmYQCb)6XiDKuHc=%zEE>dDG!>BCCA)sX6g`gsAs7d<AuS!zM_1<)A@RgN>>
-+VZ37_Lt6SlG)7JO2AkgJyi3^K?Er6ypc~4V@1fxeVFX6kY6!B=<uQ$x3M1di;%ze5e>JN4HGgchaaU
-#=@<sLehdkGfzuz7`dmW95hDX88#6!{OVxu2pcw=J}LJCFr0G7-Pp2%yX!FR)ix(X*-qLoj*4;$vF|9
-et}8`@7UUd%d~|O@kWoNmb16QL4cdHq~q5z3^b)Oq{?oc%q;}jX78Fj@s>gA}2>qw1Vt|rop2zRNZSl
-J$0|6#xmMuZ6y*vcHy}#{)t0uL+c`t$CoKd@zB;BVapZ4*7jwtZtUFmVOThEc5OZ<x~Mfkw}r0LYKc>
-URT$)wBgX{|-DB6NpeWD9h{UJVNY}ZVO^k*Mo8za<1Ew&%<Z68v(l2`eF{g|Q7vWiBa2ey6&r-{h;Am
-~4PL%PsIW30@lM_kVsB7k)SNm5prs6OdknNi}y2Q%?_xDgg@Ef=o4WBV+i@Kek#mwOOL(bMUUi@h}<*
-5slHh#B>W#}$zGAMj7(F|bX3AYZ~-uBEtLSwss*=C9bO&G&FtobXK0tEAYF|0U#lSE&VO$J2h|8bob#
-g|fQRbg(JbH_N4-{0Z*^7?xI;qBFjd3y8d14c7>UdDK$Z@Pkm?eS~;yE?YRTKc?4{L}b$e)D;Lliq%O
-v-om(Gavu#h%#K5{Q*gWyR#?A6L2}D#-qY}x14$h-Lk3<!asca{C+%Dw=WY}aj3s|`ae)h0|XQR000O
-8Q5kVeE~Rmeqy+!~eh~lwCjbBdaA|NaUv_0~WN&gWb#iQMX<{=kV{dMBa%o~OZggyIaBpvHE^v9xSKn
-{jHV}UIU%{maBz3A{uj`8eVK6c;4VI=w<Dw5vAjs0$<|2z4Nk#33{qMUYB}=m0bV!F`ezATW@4ox)?j
-v<_ax%JJT)km&ske}8p2V8x8&(LB`79B+mV8xeNZIN$1Ih0bNI@zs<9sx_RH_8_Y%=zl0+_O`*2VPfE
-D<RL8zD9s1c}(46=$W)GQN6w#%X~%OF_px`-!LFWIQ@S1ZydFEQ;2pE+s?}<GVsg&El0383vE+{m9y7
-VzVKLwb2Ij6+QuJ-{v~oHLvKpUK9k)!`F+&yPI>7=a6VF@^_eMV^YM)eY^n`DE=wfi3hx*l%gc#NX-`
-<j7B3w#KIPc8%24%!#q5Emt?V0j41BMbdTWhrXz+wVub!LcSQy}jI3Ckvq6<a&K|H7^e@(AQL{`{tDT
-xM?tPjIm2A-`!gVM$<=CewtdW17a~(ylf^6-xQi1eYQTZk)`u5rLSZ);lJ-@H$s)pNzOuyQkafHpVPg
-3Oe!}}|Sa1cCpibU9W8EY~rq|gY~HW=j?>>UvTGNDx;Ir^zogG!23yvjZ^Zhijz_RZ|_`u3LI67_5?<
-Sy2&tD<Tg6<Cf+$dpXX16mUtO+=Li7IRoS>h^5y1$)8{d1*bMUC{6mHq7*2%eXR$h6YJ5`KX8`7T>-J
-RFQG*I=8ou&n5>kkmDG+2s_J`<GY|ND1!srPPE!`a@V&&wnC(=(;7Kc5w(@+jZWR4v3DSeY)h``(Jhu
--ZR2~eHCB+|P}}!yX9jFRy&#f%&>e5PQfamVb`OPSqJW%LTb==v@H+|z4T8iH+K`Y2eb{-qi`oc^eIK
-&P-U4SdNMTiOT<1n()}$Z?u9?H`%;X|qr>Rvlg>rVPPL<>D9kst>L2YjYTcNbyE5A3|d)Puu8j2kM`P
-bpYrPKDBb4O$PD?ssLmhlI0_Qps@WEYUd3?m51|1g@+HBv>#s;a6N9r*yK1w{DK<Uo;JN+Rr}L+WSm>
-8g{^Gj;=c%5vBU&8;%+Kq-{cL3%B6O3v-E>X>>U+3eIvcaTUxpb<TeuICqT7nifeJbE*~xtU$e-R|^w
--myZzw_Vc&pOSCCx$}DI2X%+J&c%G;^h@WnYmvi|h1AxeU5?^Ud}9ZI+cVgv#D2;X?cyET)o$D`VYXh
-F(y=ZLW(%8E+h_I~xltm2+($ogi{|kaX{=)ta~TA|owE;>x|8wP>(%@{&=zUtTEZG6<O$vhEAnQrkw#
-Gqy=F;Fqh+Q$$%Hb3-|=SM)F{O2H|#;?R=}zlcV6^*k7LkrZN#BRbg(XvXsT4dG0kqHwxZ0^IzY-QuD
-7^3CEGa5Am6~CU8(YQpGFUHR+>Uv{+6A&x@$z)XO8#f#SN~;fVLh*d)F|`v^Noa&D3)G3P&ZZr^A^Jg
-y>i}wR|;gMIGG?jc`9CP<?+g=1BkiQ-b<S65xEu;ZtGvXKV`DZ>*^u)+5r`{@e~-{xJ%@p^zM$at@1Q
-YkJ-k5680>9{44TH&m(H9wehBxYMaxO3q);uCC_S7p;^G*f}WXPSF8xph>e2i`Vn(#pQWdmJZQ9%Fd&
-|{cioOKJ4k>TfN{>@aZ1<CGx(qFLZZ;rU3s-f&XuW`}pqhR3Z14Q`GW1uPYBNM)qCEei)AjI@Ga1G5T
->l84A%rJZkZk@S9bTx&%{JNrA^N=d11H><{#)n9a$(qqIk(el*Ti6Wj99l;a<$)v;oAG^)SV94SG2f?
-}8~ex`7>g)V9d_?erVwrY>q*oL&F)gNCwEVM{{W}0&)($8V9L+d+qBsr+?<!~@1q+BA3a3M>yMCw55N
-YQ7hIo8qR&N&_n+?+~}?hF6Mk<}#qwQs71h5-Rj)}9*Wo~<W4YAAiOgTo?tqrU-AO9KQH0000808trn
-O!F$XaTgN+0Qx%s04M+e0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FK~HpaAj_Db8IefdF4B6bKAz
-X-|;JU<jD|pC|I)7PA*$^s>oE$sVwP=bllYA0YP9Xq5`q#0uaq)(%;^5&h7$>2PHXkzueZ-#sqNo?0L
-U-eROo>%;%SE7Z)2gznb~Sd6{KG7HlmfyV(~Tk+RnwyAVktcC6U&oU=I13t5ImEYh6CYql39+lexXoF
-u;ItPt#h%XqzKh&kl4h}Ur#6dZt43+I(6_y|$5h_8b(DOeJ(WFTVzjD+(t6~#;VVPjz7hKKiYdiMv~H
-03<P?Eol<q8JGZ5+Ft16A?iYN3h6gkO1ps&Xcw0IEzi36ONpySQC$coMl0HAKVeWc@ZQDkH(Jkl4bkr
-jHk$y3z!Pno5Xhdd+)?M83I5k_gNwCWRPw4%-zOmye+rv)O+K7H)3lkwtzwaiabvcJdV<!27B$DXdoN
-S&~e_09S4Dq>ct>1_yJ^tAZ_3g+il`-V}HgyMl2WjCE;wxof0$%JORs+gXm+)!y?(U4VU<t!9rGMY!f
-`7BqUFQB7Wciu;#m3Fp~eXgq0CU@h4D37^Fs4D9Wu8OjD?#*lvRqCCT7V7H8Fpny-cck#tZJ=oU=vfw
-bRa2_x7%Nu2SzOvCZ=U!_dIir#pkNDCRSyb8A$r~d#>{WvXzuc4Mo-e?lWE<+J<XT`z#Ihojs-+|F?1
-Kf(eTP$vfb<lq9F|r?IeFbt9DLMuV*m9Z21rN)-5Zm}?zFaz65tRv;I(Sr2upr$t0iuzth_{^8d%@Q%
-OOQLTW3_S4${aUdE)B)Yk#;iJd#q(y$o-gp;GcL)?t4%U72sD%${o@={w3sD!Dh6_R7xT1jk6%n9p?(
-7#9mtjTG|+xA6L|~AXknn<QBBHS7BoWGKpARfYpFCm;eOP$k}apN@is2jVW2?ERekRPO!o=Wg{po6pe
--hLkH8}1j@lP0h$40W_cWep|97#B@=7#fjn3xxD<T*)#7sQfURbd=Q%3EidoFf!DW``x3l+CP-Ow$u=
-Izp`%DMHAT2QRfJoQzT`74hy5+Q;W)PSO;|%Q}FTr5)k&&B|^MV#uTJO=(+v&yGhs%Wz6#M71n|IS&|
-8h28ESC`WWDM+ZAj|WZpQrJdZHgkx$FE-T)Z4}PamJ%K@Pxd3g-@^MTta;DuYxW2XKAD@kXDBhZB()P
-6dDqX4<ZUn85et>f5{RN7enU=k_<VT@2|@O#NzwLOoLS}lCt2wdUhQBUI$ta{_k{RqFMaqcPIbT{pxL
-kpSMBbt$<{Vf}RO3dX;{Url`O8`qlGsdAPMf=%3eN$x%3R0q}(ZKtC5{F=8A&1~;D5cXA-LAQlGrhdt
-QB?AmeAs~LO2ZXg0fh}a(I84q!rab=I>dp#TaYl!t?g<kCRxa{Lt-w;*{1)D&sPI<kV=b1b}f<eT&2O
-*N<8e7cx!#5u)-6rA=Lff5r#F*4VYjEW8mkMg1I|i(ZaYdXsj_*SZ0E?QiPlKMwH5jo0|58XuB0jFK-
-hXzS7Z_w9M(l!pPGv*xIq%NqKE9o>g)BM3ybm(Pw_b@Jep8hK7%ISDz~LYQN^qfq%VQ`#AV+wPZ!8S_
-E2na4!hRt^q7mKPUN5fCuP@PwA6~y1+g9(XcmDh7;@$PzQFjf5sfW|%5_(mw_!R`c#@GkmD_vL%f@rS
-xPX|K^y#~la2EZCdBODA>sPC}!sY{lB`WYDQl4fu{P1);bQ1<$_Q1-f?vey-5RWj|M^U4g%N%xnI?s`
-;bH23S!c;H!qAsk|zl{Zz+^z$MD!}7sstv#`TwyouSdb{wiuCJ!e&3>HT&MtnU52GgR_03{-eRX!(3x
-6}6-nQUxr~mt5b~}Arr}P8s*tdOOF3x6`{_FxMAs`=dq7_y=0ehO!iaW?Pg-hGH4<mLzq^{$B#2zr~9
-u$iQ>2jMxNiszDG>%BcgGjNcfb_$mEdMK&TNHk=$?-ql&K6Vuhs*2pzs_fWpThp9zkl=nca9@ueCJ~{
-@oVqLM^8Um0D$Klk}*US1A}yV^=rp*Ai%*#9p=0{UR=UYE?wVGF~#~owgW{0>#eht^at-nde8UA5L%#
-~H-U$$>MHacQ&x(wXfa)zH&7L!Z+ahJwE{d1p{w#CIDym%qK|YSx<YQasbFi#7@;)LJo0@u_iui>zL{
-R3nsi)kF7AU+GU^N6m5@H9(D`jGNns7Q+B4k@^i}*uLI?QoQ*@sUIu>(K8jnD>xW0g5^$Ec!5G9$%bg
-blqbr=5qBYF*X)x`!JqEhi7H~rjk0u83=Dit1V0I@lN`WrBMglDmlVwba}RZA?f|A$(2PX#%2>@~F69
-TF&q!Xm;J9jp}`duf+glgX)fy8HvJ4IY9x!P*s}L=r)5Y=UoHeKhJbtiwFe5rhXdjZl@rw0cA9fJX2_
-N+k7{5j%pHezn+#*yD!@MC79p6+A-*eFXlf1ELIK=xHqe-J^j`&%pE@+c?iv|E&8Kv`96dfYR6l=~Ot
-oe~uP%4?Q@bjHsUx?15$o*g&Ry$EA0qz4(PSlQ{8CzoVQPtOTeIo3BREjG@)QuHqC?QxD6TPldF?7nm
-%C%u_VQMu<aSBd`+_fVIkpwN6YrP#YR8{LP@HYI#D>x{<Urf*(N_M8wxgzT*AaV*g61lSmsvSDqK8IY
-sg+qq+Fl@;ZnfAgKacRTf>%vAJUNk_zgx1Zu>T<|_0Wd^4drmKvDIEh;a<Kn5>VjxIp4fsFKoY_F8T*
-&U#$+Ec9;PnpKKt@})Zd_r#165vCb#yIc*{8Dw!5Fd8%1xGK(5yx*)t>v@%`D_McL4)G4kGvYc5j2Di
-#6&0zI)O^Y#vU^jb@^&ufnB|*=zfD^Cu-CU!cd70e;NuO;(&cvTpWMTTx48{T?NY=_`2DDP=NjgP&%j
-m&(dff|IBF$R@9?0gvx7t!)COiybS#KiXU6CHW>c-L4Y0Za0<8)3C{ztKN1ttr&((#;YJG7zQ<<3St%
-h}K~q>^Q?lnc02mbPA7u_=4AwY!!}%6lB2k_qYB@%k;)I1-?1+q}LIibC6r!yl>1Ik5Jcu~b2>^@%Lh
-RP-WlFoQn!TBq7&;&ftm7{jm_L<+mmaiL<-i+!9ydG++!}ZFz+S=fv0QQ0y5YFvc?bwW0ss1x@U#N_+
-<}xF#ic3GGH?e$9>y`W3EwhHG)iAiYh@R}u_)-M+e9enIX&%EP(-W+`_qKEZ$|9I;>O~_Q?}&}%3^)|
-{Xn776ySFqJuvCy5D1`cEvO)LGtMFNfWfyS$Y032gVgRe>rul975NaOG3&7_%T;`V=PJNxD`;ip8_06
-BBGhiyH$}#=*|vlqD_#ITc6Kw%$rNzF<{2TG4y|GWVmZV`8{v^9FWPXzDrm0-YX*%_=hTZ{C?kgd6+G
-O4qtonAjYc!6X2VF`h(YFJ`38rI>KGshrN~J@7Bb19-oa5_)s^cZY%S+ItVU44nPR-fx5bG){c&3ZrI
-E!a<+mzrL-aJm!ZqY#(#8DjidEH!$IkNmX8ZuyM9}OTyx)zBL9UUlgB<k(&Yc2;$WScR)N<Gz5vx*{s
-H#gR??5r+Hr$cwt^PDt!3{kcf7k<KT2_@_SE9HOB_0LTI=K>Hy<lq<1ta4+C>p-aiaiZby|!<E`fP7R
-)r9x9RC9Dbt+COE4{0@gtv_`cw7~wtQ!ax98C>i$a5|l5s0JBg7H!z+nTf9CJybrgk=6P@<ew$gA~*;
-(4ydgMRi2lYAYVXHOje-^1TcSHi`7DaCezymG6j`46?Ifof(aeNTM6Ba<Q6IRaf;3i&<CVAnQj(JN2U
-R#{I*ubqq5mYDjMs6q=ha}qj!6M-OP~XV@;|?rAYcWP>(m3^ZKz9>A@Ph9;Uxll@A^^+?+)bPWTn6&3
-YyTe<JQ?H^#-#q4ATdY*4ddfE6}EZL#z8p)@Wi8JLojw$IgZSYYtz^`3s52T?**9(#K=SE0J1V#U<~p
-~_4Vk&Ttp$S$2ms)*6(bj9XX;Sv;DfUT`1loOIpM^uPJZA1IFL#3;7s##wed;;hpbFq(5)o~3TDb^x`
-6o5Xe4`T@>X2dGZ;^6aBr7U*<>_P=`sF1GJieZ<e8e_3jP>@o?Rf<prxTJP@rChc0bG@&MaFJ{6J-cC
-A`9K25<u~s+Ge)G=>fml={2Wp~1yS}9LU_g_HTQSbT-{7D1_MYi$7YTkQ*_u7ytGf@>#iL-i<Fa%9TR
-q4@#A^=m{s$3AIha1WeiEoRnt^>1xAYxQmGC*BuZ@1N(6Eh+^OIbiX?#z;0r{lY@h8tL#b00$v%`sap
-B{6PqH3i$*yS{>BEQ-9dx01d>P!`@yO?5olkJKW7Pw66kjjKyi`3jf%Fl_M5Awg?AZ!IdtNseHpK-?P
-Fml?L|`*k&0Y-uxF!|Ey~U1JzD2O70jt!1E;5`}(ft96r^c7P-vMi-47oalt^^HU4Yc_RT`cnUo>-~&
-u<|E%(k#0BfQ~2Zw2Mgb+_RcK7*>!t$-@V20WSl22ln>z<^2wSSp+tU4_X-%0cxkIdykN{(O6XrW%$O
-ReV?C0X*V^;YP{2p95xR02kzk(YyxHd@#zTXiO^61F`$|0^~Ip4Y0>&!fhX9no8@W+Ofw7Xtk1=0V~3
-g^p8n3IxTRg5V#|^o^%R@3h{P@h_ntJ5IBuus)7g*HxBmRyhsE3Lk5~T}d_Bg)N637)JcwF11ZZt!=H
-|Nq!UqOa36QSkF{6h20BidE)U^bs<$yy&86A?mSvOeF4T2!T17E4GSKzk@8}PyKIUHMV{e+cv)|=`BY
-`*C?G?@N+=do#NIgi5l|H6Y#{v-Y8*<Afsd(Qzgt(+sTiB{gBpB~S%)+z&URV&aoMLu*uapL1uEsYqR
-(!#3l$YF)jWTNAPZ4xX~!i`+Q+muYdo<HJIWsjnX8re}cooxOVZCe`O^=#GEdUrYAL5kCoKgHG)A*J4
-`&#^5VfQBSV`t?+ZB1n8Xm9Psor9SK99~ll7TZ{3JUaG2{wrL>zry9%HLijD~IY<87l$8xWp`9$QOpI
-xja4*=!>~HU<Xj6E`W?w2%5~eAY8EnDJ2j~q{{~5OmTH6$>h*ndeD!AuWkbh*S&+vm*nOvRjHWc3PE2
-f-$!lDlNheG;D<~>;OR?+~6!3iC9x7yNHaSHt}I@@+a6~84WeT>zYJgPaLnFJ0UTe|3XxVkr!)9ITHZ
-PC!Xpn2NnMddbY?A?)6Yr)0ra=Q5GX6m2KuTDoDXlqbuZTd?CZlFiagE8xF=eh&D>?>02$On4#X2#yI
-$Q^p;SHsb;xpnK&>~NM8gl60`I9HUK6~9{HUNyQcGw-v9ZyWZYn&sc<9gPmjy!;xg#9L9;y}M`K{zIw
-_E^WeF=pJ#*v(Dq6`Q-TYITC0o+oGZm=}3hU)yq4?;&bj4R#yZkeYXP}BNESotwHoKrF}`IIZrXC95W
-VdSx`+<)KW9;s3-l)rN**cGKI%eOQGJ)AnIZeCVaG125Fv{YsNSsD!5z+(6Z}sZs(wOxvc4|b|8E-Xi
-O6PM+WwV!tQZoYtoWQQHW3^ZMB;BcqY-g31>cjZka+@d}-Z>Gcs-99JZDTosl}@61tUN&q5nhlRvBDl
-wx0TrqMh$L@`@w6#9vZJuZ6@jTjB<I#yrPTpv#~1c68ml&f$YB3#`=^U)~|5P$I2+oyUz8Z26vhI)AY
-XX|B~)Ar7XxHbGJ_-2egc(Lvi;riSR#D+vPR&?9yW3yuS^)+_`4)x2XquC~Hy(?N+)fIW8S^d-u&T&r
-v5Fib?tG|!%=CFrmOw-y{@uz`s)Tn+{N6PlWZI@gH?c*tw*~lU`5kX`)p<_DBAj1IT*9330-~%#RJz%
-v-4^5`j5}e^<?a;gnLrerZI;tNBSs+xn;bW-i`$YeEhBW$lRg@S8TO`oP?;r_Jq1Kn;U4>`Z7CRO{ez
-*zZ)Ce42C}QsU-jY4ux7`UDwFO@94`qX0OHm?p4Y~$T2G?`ALh~VbpmpUY!FCk|kk`KW(4X8D8w%>%4
-6Jn*hd?F}A(7E>wMm~AkW_v84O}WpHM@9esV2G-7Un`dN7jPE2kar~AAsOLi%~^yw<shO!rwr8%Quja
-eUbXQ2BtFLk!gQFGQFos6>W`#X-{I(6}MZ-Krzs)wXJZ_+M^Q|o>R0OpqKi9#+#1cGz-Y)>ch^MDr+e
-~3qU6>P_=FggN5EK(dvNc-fBR;YOI0SY(+oao;@<J!aoORR?76?zt5Xn^i8S=e{)&|wt;8MhbC0S;xi
-{1PmeJ0?mR%M8OC50;6GT<avQU6<bZv{cys?1@P6NEuA0Y#pn}S<^;O?y3RV#6;v|>SPlftB0uDCj;)
-IXZs69$=qhN8odE)#VP)h>@6aWAK2mnzTaZKk^!1H4u001R-001rk003}la4%nWWo~3|axZmqY;0*_G
-cRLrZgg^KVlQ)LV|8+6baG*Cb8v5RbS`jt?LBLA<2I7t^(zohZCRek-0?WcrhM^cJ+dd`+KKJ6JUg{F
-HN{X8Br&E49Us<cukOEJKL8Q{Nm+Jsb+vb=N@Xk(Xf(PT{XzrU+uQ4n<fP2xT^6M)l@%f{SM={pWunZ
-IBpx4&hd2_GVzZKY(CghT;#@4Fdzp(>5*5&Hd6-5;{2;~M`;mwqqBx1hi4=vZ0F=4Ra-mY_H@O~(bzC
-e|S%_jGd+<uAnScS*aup{s3j~b-|3#^YmxxT10zNV-08cTNlL-4jUvaYmIH|aaCil@?_Ab+@{DK{q>L
-E_&hyb)!O9{{cwTGkN^`XiR7x8={GXW?)$ZP<kObOUj&Z06Y#Pv$1qtW|bv50^gi+Gh2z8ZCao~lAjq
-7}^%FrO+MOT$Ox;c1#|#5&p_2ARxN@*n{mPYNE*kyZ?j2?G<2l0s&hjL@MhVwf1TMa)*2g0Yqc)u`xI
-Ef^ruqh@1{Bm+i$l=OlbCt%7p@t|V`WLf3~%_@`sUdEa9m=P8GdC&A*#VbRDC`r^>PI;1kM<Ib`&|k}
-o?h>bk1SU<HHP9TUAFDD4awRIA9|8@Q-t?iTo`29o+Ah>e(zKC1Hy1bJ+i#A6K}jOygG`GOu-XVBxzH
-rfOUcrl0|g7QUc{3{Zv|X~zkxhJ{7e>zJ++^xw8-Ky$k4P*WFX#@h&J&dU*N((90%All{Ar_8BC(I!t
-_Y=5Z;V|!k7S8%PRc$b2PD50KB@7fv;-T^M@X(AP9(WFj|yJBqlSPx^c6C$YEHRGcOgAkvRQTPGHpH<
-fPXV@X_z|at!o9K~6GL7@47_kF*IGb_mo{p>Eqh==I)3tJMZq0nGlZ-X7?cS*DgE3}+=S+c2!~8xwzJ
-$lrTC{T#=WUkZR%Jt4t0-(;4h%6w6Iu!@R>`I;|4V3O*an%v8x`j%HOibW<PWRH2UmeGACXFbL>2r4=
-uG=3KP^B>2=;oP+C6V+(-#l>b&{WVl+UJS%gW%8{m(`kev-8<+43ri_XK!Ot&ZW!gTM2av~ArL@;x(X
--wJ<76Z6C$i|g_<EOBzB9kO?WRilSLG#0|t<&Xc|tE7}f@NrI&z6ugEqhLc9<+MvLbwIf-ZS<irT;YX
-U(SGf@q4;SAQe8lxoi<d=zD72=ZKTp*H<Ks{!}Y7pX7T&Yyng9X4{Qt5dxhCdK+9-zs=J_ZN#CNwX2M
-g(Okmnz#l#B$vq@9!TN9Iv9KWDKcQ7R9iZEX4bJo)*=bTxIuUy?6q~9#muO0Wrf66c0%Gsra<tvPAX=
-VjrYCi{LqN%{>3y>%9=8t4q+PU@&qXtM~3~6yn2EahH`aF_p#h5T!D#-{99kf3+Hb=^FA<GHqZ5ghBl
-n2PB<5jVCCRATy|+K&?#0ctd&&mkB7wBtaUZ8dl>1ga-8W0@MqecC_6us1fSBbq4Dn0I--?CLENvEDF
-%bG3sS#l&NU47>IGnE=H=>pr`he1b|IdATGhs!y-uHd*BRe+%lPxsn8xpzAWeSMEa<B2p}*}zLNs=A}
-enuKq_g@w{qs9Knm4h$L0h%Aua*Zyp%aOJ}=<UkCoO3dj+J4GF;l)oEBL*Ar}RK#wo7boJRrmJyq#`0
-sn`|;(LIFM9%-X23-NxStDs^p0ghTO>&hYeaQ;U6|{_U=#Q2+KOvOha|C27jEP;TJdZW85FFZE<pKwK
-0t#%h93fzE@L8!<3F}u*!MXtV(~0ykWP3Md-(g(6uE7NiOnXH2*i49JSpayi%K*P`c+HUrk}`-3a(pV
->a-3I6PMAt(3H0Xm7^NF@#|SSXJ^<BhGtxL$YI-8#88T!M)ok>s5AXM<Vwy#H5l`5m0D=SR>lC1oOC~
-c^ZV^(31|`p73MM+7R8kg#ZOLI3YBLjjgn$1QC8a#CrVOUj>ktw~r?s&P-opblu`k5?cnRX8MFx;R`t
-JTsz1Fnjx}U@9St8X~^k8kl%(A&UoS=IP02KJW0F7lIm{)*Hqh$@<m9%nhUPdnstjLHtC~6!G^v!}Cc
-yvo()bQi&<=sX2=Kb~XucOO<yMP%SeRur*H$98|ssy(X9L0wy0c(VGtM$|Q#oMzF@9)Cl<;}Z`+Yuu#
-zpNs17s*vp01A!oLp%j9PfX$!x$z}ZBe0j|RQrwKvzAd_`GMd%u2I=~Dt-;o1-g^yVDjkU=mX4Ugu2`
-@?qt#f@NvSki&6Oc+wa1khChd+cV{rqK}XBsyEFLj^{epa`u*RJj$eI??V)Q|dxU)S`g;R;OUsMl`MV
-4J|L83IczO5k2}p6*+vj%l#(WC8w@>eg-Ofj&r=t4I88$}S9m!|Rt&@ktH^b-gaMzCAV?J-dC$T~Ic`
-DO)>-HQByM}u5I(Qt#j&-nW$L=woH{g>5`WbxNz1wpz>>8@8&odOlGgkF8<oy|>eyW^z)0bk9H&L#A9
-b+yjuOLszPq?|gzPlb?zsK<6;q@_k2;l0b=uMD+83}Zd)C{dXX2Qr{03RK^1hn&2cI+*{f+#nGKnmSj
-ndFjkDXUngd!j<X>l~aRaHYT<FVsXOAp}y(IE6^>3mE19pb3K45O`Rfh`u}Rdl>gd!#MInbNA)zgF){
-<dp&Rs7f~J+Mb-!S1F`3huy??LV;f?hnh1RcWI2p)a^xObn9*N1P_thWfP+U+JAN8!$Gf6-ybZPEM^P
-ib?~WQZ--_DK4BZX2@Ttg!yQ8-qzg-c0g3Rd-J0sW>JLl~#2tElpL~O^Ea||k}H<dHdnr-AUF~^Ai{;
-bk_xj9@#1w`&<!+|0~&(lA|*bX8D7~xRwas&>fwrmOD?13?9l&VLak}=sB7uc5fm+<{!_~G{A?)L0zb
-aQ=sXHq^ci0*bwrnc0QPp1zl#6?SsSg3%<8*wr#)5*y%EtLLcC-StVp4y1h$YFJoX-msiLcEQ@jO;=&
-Zpb7HF}w~<$lteu@OU~9)2N8TaXFje4iSBUkab=xLfSWwnMYecrgRc$b%c&jILkJ=GutLIFWBtiC<JV
-bi66ACQfEMD?|~C*&Zs))73$oql|`)*p{>pQ6h$zXg-d{gsxu}_-2N~R9H)klA4b^ICo;=GBra3h*-E
-PRV~ELXWL)Th&foQFz(gWwzzl#ME$sO8>T}(th?f!*1`XISP5rK4Pmt2;Htl#+lnqs;2<26cISB;nSG
-^lL!EAaaUN+D?2xuur(`hF2yl;uqfd?(b3^IVUQ`Wj+JtLc)#L@*O!YwR+Xkg%W(5y71(L98eRz3PNO
-tjg@5ChY%xk)ImqZm|;%4iAoKUw_zJTUMMT0sE{yw9j1whu^yQf^)|j(F6k9iZUi?5DHKtAW_ZfhaSy
-Z&Av8oK$TgF$KokptRH|{r7-LWX(}}iaUX0*#Zg^ZiPe#H4q<GIZ9DFPc{S2>vCsGSfl6MoYG`bruSh
-U|3d-+En)?koIH@i?YEM_l8;X{t51AJe{OVc(%zDkuTL$6+GK<>t5u734q1HESamb9TQdw3mCNZ*V7c
-V1OxkGxL)_PEmA7&FwpbisM%+WwtZ5nWuA%c1aOd|rVNMGH!xet|)v2%rt#uh`_*Ki{_0`qw#pvR$YX
-Ln%g0r#NeRaCw5~y)+S9>tanhQN!ZCgD5>huxyum!`9xC8SBlhU?Qrsk{|HB&C=AKbQg`O#`X4Bb7g=
-Bn#ZRv>}W{@`0pjW+R=DgW=X@dW(YMjpI1E>!?)pHnuR_aIVP;KtMcJwrd<6f(!Cfa%(4=I!MGt+XM|
-iwtyf7!`eot1i%k-_=JTuAz7En3<-AKX|zOe&!j$wVP)e=sEVe0{MH{XTP_$FHAw(B*LR9v9Q^PTG!S
-~+Um}H^j;GLtbp2*Jph;n?#-<>W*?RJmM-^~G}pZ3ozP6~=PmG-B}A1ExM_#GgbLKrGR~>OhqlmB2(c
-0+Xmr)`iT`}6Q9h{!`2USrn=vE4TG$cSVH(?3&;LH_<+!i+Qm#-!aVK+)wHO$v=Ku**oJ=QJ6OhCYk~
-X$!108gj_-VL5W&K0Drn+iOrVTSTp$dzrzyhM8DjJ9cW(BwkPZzKOkXZ&O0X&XXxHeF%b%{n01myz$H
-;$%(_`8f21M0e;bA5)&;PD%H*K;Fp!+w)!0is}j;TGDw1r+*j>w}(W)H}L=#75lTZ4Wk}H%TH;2_KnX
-BVt#dsp^^hvzyC9ENG01cpN7HS~EH0oH$hj?N=M`UJZ(7RKS9Fr9f&$RjWkicp$=QrdIs}-d=}iz@`2
-HmiiI%G5$vr0OXrT*%(V)5!6J1gE1-KjhX=xHyhVkAkPQF3NQj;KbOgDpb<Jav20f|3o6U3O|kQGQss
-9%qX+NYSvV0gzn_pIa56LXOM6|kz&7P;+uw%MxWypz*j}ldX;!tP#g$|Hr)D!<U@ITE4D}FeO5!=JkZ
-EOlb%AgS15o)yp)64UkeRA|zbUF;Q!2aW`ddH?YupgZECbx8RJviRmlo0jrbpCOLtLkl$VgY08hj89?
-JZ&fZf4{SakPNxYCEcB+QSmlWV6SMTVrI_w(cIykyu<P8;G+96;Ex{uqF7k@P5MPuSN)_LuBwcQTtey
-xV1Z2c7wcb@Jf4Zf2oT@jbJXL6xKslOFS8v5S&_eMi8PU@Mdw)sy4NzLIbhGf3Aar8R23ka_O7_1p1e
-MyrzU)1<9|u7MC--3<=xUHARaUg+Nr|KOh&Pg5~2xe4D6DSFx=?Q2>W@%~ZXHqFEtXMa-f}QL}&~GD0
-TeMjqDNU=`DvYPOkwutaM(c~Gy9ODyfiDywR6WV+0)Jfz?i9<<W8W0||_Pkvb?@gzp*ToE>*{JmXJw}
-~Yg7G6!dMypIQ(~@i~XjJ#jOtR@K))5n3_Z(AURaJ_IWj|C<$TYFw#TFR}2iG5QC)eo?SbT00#CtMu6
-<I|@qH^DLh1v10y7uZ701GGNqNseE_>Uww4<&gNRSCcD1_pXlorB;SbL5I)J*vN2!)&SD!hD#FAm&9s
-oOfC{BBnzRuDYxjK$#b6NqTasWR5%{^uXbd(mBd(q>)1PFc3?X7ZgA1g9%ZFet8AX7-dr?MggL(0;~>
-)pr3;oCVY@$Mcb0f?AyquNrcH?+tC=(;}I62iI*_zwC~iA9USyux(_T*Fh?@GehV<?BE`^aI@FwOkqX
-un1B23_W!S1${g+=#-e&|3ED2&3gb?n;;Gj$GJv_)Po?&rj2CpHsM#I%1TSLx$tkGJUBrA%I=B);doB
-OB(Or0Js&^0=qxgBxN;tUJu2^Ly&t2c5H)_j~vR3C9p1p5~fom>KWrrfO-Rf^amg9c4RoWE&j^b6GDs
-3tUAfAE3$6}#ur<^)uvN&;Iwpe|r~wS_324kQ&saUxKFeQK(=#gct=G|H6&TOWD|;v9Xieg`}7L%W{}
-7J$<TV)AUfPa)>48Qa+{K`3VdCHJkANqz3Xcf6RMwjj&N9X`92v;MYij2Gf3bUeiH?HR#kI}G9to(St
-492CoOiB@iq?cmdPD#E2u&l~yrexNJAQBJcdDv%<m*n-Ej*ryWKY#77Q9cCCjcoU#kQF-iqkVxm*23W
-_A?q->Z;aScVGgwqh8xxcz^nk_l6brPyN*R=id%!s#)IMpH-=l2A+J7ly4CZ{)&<(b0^2a57(g~I3aM
-iLat1XIYs8*XBDKnx(bHBn<Oq`S(Zy-KkF1R+#{nn|N>_&QR5wNE4>TFb=AgcN($J;1Q*p<WNj~3D@X
-x{S#qGi&W?Vys+fL1CSVomuh21iBaJgb2vggegZw+wonCL1#_ZvH=KNL~}&1K-k{JK&%1cXW2S!1NfJ
-i*}vTCJtd6i=QYJvpB^B`iU<l9U|f$#0rLQZzcLD(#WR|#!@e>iSVs3ZLzR)zR@}Q*kPj7J)cO73VrT
-|Xbg_46-$*9@V#?N@46KB3$q*!en|DXD>)tP-s>h)6HM_mSz-vQITvtBl+Se5IC@5}xhfkZ+?&(_t}Q
-1-GPrUFIx~q1>O}lux+nh7VYF<NJc+7&8;rN}MRc#7nwHcip9c;hE-KOp9L$y`+7oJd<Jj4j_gLzr>l
-#~MM_;zRwsIO<Uf;`B)atk43f9zWk%5GEg~n!AN}q3GBaFwoEBe)TBrC!El;BWB=9J914$ItJ7#l1;&
-4rHrxJqzwYBKZ8kn4}V)t;dC7%>)%i#STeI0ol{Y?v{%=xu`AWT#KrFk9dvQ5h=E=;R#PgGJPqHP@Ek
-f?F95FUv7;%fyVeq%n0dlq>Y8N!p4khs35)JZ*hDDgfdV)pE<)?205VuQ3C<HH2u-#SZ+fQ}g1<VFgq
-Coj$`{u|zFbrA}qk$M`@FoUi~7BXVfwX31haEKT#^BhX5`e);nFNF35ZxLH-d93?opP4j3PijoD7+<8
-i}$0-QQ5+e&Pjl*nS3EvV#eil<nGv>fWzKU!~Ab-2<9G9yP^;Az`1{|P^KZw^y-~8#D?~lLx=1;B%Pd
-kUY15Ci*$!*%A3V2`t^|d(KGJp^86ZiV8lM}s1g{wYH*>^>X0X<DXE@xIv4l80&DPnx34}$W-L~E&(6
-B~KTyWtd&p@JwdFYw4--`DlLy>!r|s@IUH<2(sKCxGhe@0Z2w@O!@$sf&2%NuPt_j8i<4{Fpo4z!u|u
-@8PptDT@Om)SImIbS}ut=h@jMzbEwr6BjQ_PT+t&qrcH|XuD<s?4*jW4gMSV_&N4P%d(<7$k$Vci@x~
-7)mHh*;;eU+L7Yvt!M-zsHU{FNR(G6S$9T}rVKomcV%7>1R)S0&trIZ83j#z*TLX<Z4=B}Xfit14$?#
-Y)c0}p66YNC_aZOp$s!RpoMyZ{3#bHrR#;Hl4=dvReLUjywdZ9CE+Qq67c$dJ1Yf5=OvRoQ(Tdb)K?h
-VrOIvo);&tO(f2vtS4`8<7nIU>O>84<osDr_oRuAfUPcRy?(TKC6Vu7&Wzy6#Q0j+-MosBd9nd#jfBx
-rKn8Hl~gZ9@mkr^Y~3%V<U{rZ%ME5fZncCiv?+&+dC&3F|%l?W2HJi25{;LvR~lPQLbUv>6m@By~>*x
-Rh7<Ov*Jc3j}Bk2nxVqeVuhTx<DvQEC74@N%dP#9L~&X+D^@Wv);{D;c_s7VLenZ-#0+by{B0CnykYN
-F>V}$iF9hbv4k6AeO!2<C^d$HexKL&jNuf?PP&kzn^cERhtQuQ4)t-~P>HcTG9IUO;;i))k0^+^9mfm
-K&sX`75l=UXSxSZwjKP<eeT6j|mPa#jJ3-S1EU-zmzQ56rJj?kN6bq#b?v*-2Eg;f0d(@72Dv(FbQu5
-^%R$khx8eo7Ed(fC-?c_FakL|^d){JOY)8|+59s+`C%el$pX=19LgB{!~7>)(CGfcxo_1vP=4GX*P5;
-DFdqLo-MP1*^HkdQTlcJ1eqQC58lhOf9=a_fml#vc3yz@#c>1Kf$^fD(lne;6kb^`i*ackuvQ(?(rpM
-c&&~FisqN^1!AP{B|`URp!dUZ1YfTX+|G@<^?|9ktKM9xD+P9I;|NfHS3Q2<?~$18D9W5@no*g7rYY?
-MP|%Az-sHSRq}Nfc2Oh9@YAxy7JDr2XO%5LeO6kSm_)%p*wVU@6P<ZKqqoqtd!NoVww~uLR(uSTDz5U
-7=c<8Z5>uk>hhMjpexmW}BJW<i<$J5rLSP&Ou)G*!33IvC37HPIyN7NjxhS4^NFw1@$BYolMZezrx!E
-nC%XQ>LjX9go-V5=^v@^+TU@7L4?4;}pf#=g`VVv2yu&#IL&bzOU{z?=&LJ<sU{Fd$AL{7b4^@~CRiD
-q_dW?%)Yt<Hvf%Qp&y%USd_CspLRmDd%1VZEN{M)70<cd1KOjt?#r#3B%h2qcK*)VAdLwkTw-H)|isV
-by64XYia^3EW+6`rF*tYYHgLQ>LxZzrXJfX&a<kg^j|fMxeKGiK?xiEsJNO(r4s9t{}Ho6rJ0Y}4b~=
-TAPLiF8jdG;&qg$M(lVBYap&8rPLS*!>f|}{{E<%-3_6AR4tJIDJ|n#Fhzr=)+~?`SnodE|+hwLuMU;
-fqDTqoqC}^@?{!p{g_c_zLIMCGnf2w<)SU|oOEq6?Pb{TIs*M;QuOcrH<*LV2~W@k}$viqc$S|T?bX;
-Qs(yvw`m^Xn6%WG+!zPZA0C*C0mf_eXKA;3efj3-#k;F~ASvs4WJls&5-<3j;@E{e%rocd~xBZ56`~{
-*CzjsVFodbYRn62i%I7$zC+^vA4Vbs#~2)jCA{M*Cry5Or^Uc-)9<ROYmj=)|lDpnzL0q{dl=Fep&+B
-$Bk}hq-h%{bX<`3CiseR;{{J8El;T^+*uqSviSn_S*q}mPOYV0SZ&^M@@&D|=X#Imq_yc$K!s?+FIzE
-1JqwjgO^q&RXZ1a#rgq1IC4}v6Sub9jLG%XtPfoh(tl-P2`6@{K>y=$n1Y$6=fgOX^uHO!?23)8Ouq~
-K4m!VoN6>S>W28%C+c97;c96dr#2cyTOr%cyef<H(3U$Ck+BHuWOjLxo{{3N-UOUa4f2)AFw66=&El>
-7N|;-V1M6!K<4mmuagLD=5wqmph4oIhBoaD90`Dv48PNr5y7+-BoI{7kXY7#$~4?S*&IDaD5yr@HIxD
-t7}VTa>DsBQurf0p<wM@zdYPjrFQY<ytIY#iK9$UJdzT4h!C|S`0I}l2m$csL6$8{@ENb5HHO(=2X4J
-E1|{G&cdse%p%&Z1ka&d>Y8w?PPV!#d+mkEconHF=(sl~`A$qia+XAM`wDk0M%E@iU1kcjL*u1)p)7b
--wI&6ST!Y!TrQCGT8wQr1Xsab5!Re|bX}!Bwmmh-=0Ci|vmqy@C4>tg<b>1TdjiwpG(Ag<Rvrc7J`O$
-9ads_u$7L6@Ulou-d=dZ_mA#RLgs`qtSVA6WepVQA9ye#+%7Ee5%$Fe0rX9ML@(a^rSp`*bkR~ZknS=
-+qLZ3h*swwavawpv8V3|<6Fy83j1^(|?2nJmw+npjJ&0ZbUZRqFmnQEdREKkhzfv>K1kR+}DEDEP{qG
-V_)|bydVxN&+}_esRlbre^J}mV6r<PtBi0i$0Fjih_aRqG25j1>g-23PHkj-&2FW0ddd-QKeD4K)iuj
--4t0D3~LE*KVohn{CI7m8SIIrgiZW@hdM`-pD{DF&H?a2L@$PEbNjw_+&(_dxZD0kd+hRCoKL)|%(_&
-5r>pG|YXeJrs!KJMW)ni59v<yN0gt2>7HvQW93!4`2`^1?mkaYda6R42_Dr4~<nxs4%U(v=JcoZ?-mm
-d5$J_o`oo%SQwO*K3X9MfIw)ygV3mP4*s=%1~cs#*FzxI*QLJ)wk)IY`X;^^qxV{(kqcRZ*SOAW=&Cu
-o{BZu|Es%Uzo@@AaI6zV*)toQnE~1N4#L_M6_?&jw$LXbEP)90+Cr=D4m;NbsOCzTh1FPk5T>;tK*rb
-ecuxDsd^WN@<E`5_CWD%P;laYQOwq!WDg3n-3Haq*nK8%fVoC8(&k%t$Ni;?yG8;u8aK4v(Fwh#b*p#
-P73P+k@l0q-jS5;hkds;fH?TE_f~PN<F@?;gC&5!sWUtaIk~S2ueKkxYxwi%Z%}>*UFWK-j6kB~n?px
-@Qz|ZyfrYWI*MS&N-xy;D+6TPx0{%YAbbBqWUQB#*AkEI53?06;PSv(db-=e_{Ikp$x!T1@EtXx$x{o
-qRKv%;8Z;uT}=J*;{Nn<pu*Dr2NR`(`QZ5&KnnC%W+wWw7~JNzm#RgUpTe=c&&T*jm|t<YPh<q|_ZI<
-slU!Sjt~ZFwmG{$VM0RZYl;gVMnvj(|xe&&)<3jEcV-v8nZwtK^phEaQSu4$GMQO+9^Hi7(Ojgw0U_n
-icw+FK#wNnsR3N@?k}#Yry*?hJb>9{9&vf{L*Yo?O1v3rWmje3el2u?Wg2PFub_E3vVy}^~2@u#d+=3
-Xaz>cv#MrS*H;&MGz+*tTYuc<j6EHR%N9qjwk4W)5gz)QOEV5uZt6q58diws2wUWSr1(%e?KrmQd)6|
->i#*)T^R><mpw+ii3RLE|=uGMHFUiSBOYgw?Wsdqr2Kq{+Xd3rKO?YG4g2Z=jY2?ZGK&?}zx*D?i>ky
-IS+#r)}aQw?$^`V?<VVh(KEpR%aZ(W>1$2Q$kb#s<lvyjNHkLv-6`6L8gEQp(_W4>%cHyhBoc4+MRS|
--g7+7v6`*ZQg>%Js-71ACUyboKAfRkfwKPHo=cilzEZD+yC8OOzWTx)B`8mu#(v>XNbpR}$?L>eUfuM
-+)EaZ}JSPQdINna`vzEImf!)ib;J?`>WILBkI37w`5MJn_o-RCyU*~=6-s~rK~T`h9VIfGwsIX&kPoe
->I=q!&BCSYzY?j;&*mg`)=PIGrO$9(N)hxe)ws{2i@sJ%V}Pz1{}vO-n{1~Eep+2VMj8zd&%`64Rh6o
-V2M@5vK!8VQ(Gdk3Zy@rC*XBhU7~4Ea4ZRzV>rI;BYxFT}&^3S79X(a4e;z|%M{2z7L>GWiVU=paEla
-&cK_TUUXph&<hFLV9%V{XpEaz9Pz`T<LO#wr*u-12=@ZJk=R?@jFeGjTm>QE_=wy?3xtwYBaJX{`hIE
-*$v^F_QI@J0nzpv3y>Hgo?}#P=?lsukzrZjB!JG3JLLO#p`L00<pfr}H(2B%C#s{ns6o^_#VkxLI_vP
-e0nF$n4A&COX%43Z6?QMf2y&bbx2Uqf=>^8W#11CiXtgDsc}a`8PqjmtEmwr>5YlK9pL`z5`fLpQQ8>
-Gu|N;+j$wZEboEW{qeA~rOLYvh;<xtTa;Jzv`>m~@sBg%-hTm5O9KQH0000808trnOwdy)nK}mm05cc
->03-ka0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FLQ5WYjZAed97G&Z`(Ey{;pp^q$q3$j<R9xFc`
->(B5ko^Z^4poD~dv;rE^SFA~lkVYYhAEyCbQ0DNVcjLn4uP5AU6Kdc@97&seH5A#XRVvb(b%XeBy1If
--ue!mvVRRSrlYEf><TQmZ>*gpxdGrYcLNE!!#0u7A7y>6&&w3NUP^RlyFz?uCpho#$fvUCg?8fz^1vC
-v0g-NX1U1JkO8J?jdYEV|QE&F71kOnMH2#DMBd*l5Y`6AjYnesdXX=dt5WXb3rqd)*>3aI$o>vgJG&&
-Lb*&7Bq1r?f$!fNqI>_I!AGlk9H9Y%7)%sp4h5hM=$ux1;@ee-sJXlargki7%XYwRrNPAPm1R6PD(W+
--JXZ%adN`ma-$c<_P`!EJ_0v;)cx^ySUZ9Q99<1cX9F)$C^Fd=a=Z9ky{Up^vvY$mEyx<=GveFt=K|9
-x`$rR#AWgCw=ccV>FJ`IJkXeQViVUg@kaE5jU&GU${S66r6GoEEAx*=ts$s>ZKdqR-lyu!G(P?Q!ejf
-UEBk;m+fs#sAO%PIqm<M{;!7s8Qd@xw%PC%31dS=G=0P8>x2v_LN2UC<`Ut|Ct)2|1k(;#;Hg%0lAbq
-sZ#x22oi};KC+?k0~JLE4TJSYo&Wc2d*WW)3`NvQXG30Cw!oK4kgG8WP1G5(?^cJW{&A$xpZsvTX<z_
-lL*;_pN79HflhHI31RPJ7h_bFK3mwLMat@vF?~0zn~m$*2QgzWG0F<12@(UYaENPW0J>0nYfG~^Kd%#
-C1J6*5Or<6k>Kx=biUP)-Q<Q13jrX?5A2}<Yg#yx|t=7%s*f@^B{ncC;h`b9432bdrAXhMsmBuYQ&#a
-jh1*pol>o<NOK*Vt;Tmq0c`;Rv_SC`G++Pz=53(;x}P%4$*2Xck`BOqFA!N!piD1+ERt6$;JBDl30fM
-h7R<hN89Jp!HZi(jg#DvP;*ZmUU3t_>u(FcI`7pAC83V;AgKCD9{Mnq!UfS=q|A>|0>v`6vnL|1(zRS
-P#xD7Gh_YZt~haxAnWPM!c8vJ){hFn9)KCn<PsE`EJclxxO{{@ASigp2E>iY}}6%7l(-o*1lk#3=LQ=
-7yZq}s%5Q8(9406Ylpas8v%w#N3Dz!4hbpcgzU&vD?+~)n8n*%m_2HY^j)Kn8HUAg62o0>$%g|f_Rqh
-~s@QqujjD7CNvP+o6kX1@i$2xj9b!#zM-%9jXtnj`(YsV#^zM3#-UMd-BeM{bD_JQPA1vLisg^xj`Z<
-%wdu6P5SWMB}DLeJgSv9f85-uhp#S3ndJJ8e}E#A!mka?y7{5}aX&rP!3$4&e5+*N2ErV;AhdrlAS#*
-74Ecb;Eo(oFNx&J<s$)1E23jHymf>-gzyt)focyHeGw^;G<!A3N?EnX0Yhu<_O8<g!zl6nku(#2G`rm
-@PxtHCjA2s}uJ4(-9cxS7QZyR9}%bU(^@dK!-=Z(H7K&^IL%}F4F8F$2(?=N()Q(b>aG@Ex4+oBsN+H
-exxOTk@oR0FtEw>Hz`4Bh<g;6;85o$5^Y8b`aAfdM>Qfs6dWw5Rgozy!QW^-hpooQpXs!o^JaIyic{;
-~taB$h#;cGUxKHo#o&UvZzr<D;)kKwH_Nv*SIZ$2i(g&z8E&k_;J}>s?i9CXsD-fO3qWFIfJCH`);af
-e9n7yj<jHTS-XyHdnFoU#sxRRlke3mjD*)`zAA{`MnT#wkFfa8)}SY-8ZSykrP%v+!Ce}Kl`9<uY-@-
-95GOc<Q@e8^KXh$x|bKX1>D%cIMFtQ#q($&JtkeXAd;cuq|}Qu8~a28np7!kI3mna*H$PD=VYy(<z8=
-^d$P#$el{@A>?^?mr_STmf8~w&|G`qq2&I6#rErRJ$MtqnkYLwx<J#aXU942<3>by?&oNZts`lrNG@T
-Ugp$p4h|gyUr!)kKOA~Euk`TUy%J`EWoJGZ_2;3>p<$9tT2Gx_e(yAml@6!S?wlTa)w=f;5*<C;z|-8
-4I0?Zd+hbzVJrqFQYk%HcZ01bA?h~3W<@FTlzn!+cKRSdaO5;u1bW$|stefvJ{&ifcWK|@jin;jqn>F
-ST&(MH@_w=;2jw8Z0rgPJ|87xDMn_+C($g%1**`6}4O?1J0OZs%tufM%MwP}>Ee*f*SH_6SLs~1W5*3
->IynVW@P^1Ra=Kz`4m`>%KEjjkSc=#wux^U43y^a=lZrw%k7-kknI`Ge;b%v>ZVul-k1s`+3+7nofkx
-oUyjsPFHPCXVL1W<L(qR1|{^M@uu9m;dR34W^<^-#YzF=?*}f+T5;jnj&+PPD4g-1F~kE*)-WY1gZy?
-O_RU_3OAN)oO_y$c5EK!?c3oef_HTQj0e}wH-m279DOzDNz@dQrix4#koNo8(3^7wbtK3PY4jgZO9KQ
-H0000808trnOaK4?00IC20000005|{u0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FJE(IV|8+6baG
-*Cb8v5RbT40DX>MtBUtcb8c>@4YO9KQH0000808trnOt)E!eOC_v0GLDo05|{u0B~t=FJE?LZe(wAFL
-iQkY-wUMFJo_RbaH88FJE(IV|8+6baG*Cb8v5RbT49QZe(e0XLBxadCgmUZ{kQ2|DR9Mm(?mDF&u;>l
-UePY&M{_!mH@(JvZK`s8EAqp#_jVX3H#}<s@sqD6O*02yC_PayB@!)uC9Kcot-rnJJTb3wh1gs0*`uR
-?H?TY=QFZ0?F})=>yAO)DzMi(!nR}!AAFP99x<SL4Ig~N_C2z7*}kFEb>Py4YuKK{T)#sWJ4&9IVUZn
-mDKWWR$7L_(h7up@EcW`rqA%1U%4`Icg%UhU4B)1oM{VCUEbG8|)sV9UQ5(NDfbeh*%#KTa|3IEx=5Y
-|O%zY-WroZbngb&ti!vPv(Wq<&8V|sK$Ua0GVXfzyEa-uB@K#ysYN7J&%EweZ09%0_vJvd;1Wv*PqJ#
->g-6KXSe&jOEZ=*mao>=k5!_MN#0F)mqI#vi8r1hUaJu3=idIPf}T$Xoz#_{61#$LzMC;Q+iH3#<)UQ
-En`_(iKv9!3+PkV*ZY-4kU0b0MtMC0N0w@=t;m16%pQZ@25tCz>mtDgKIwRe9~OE$VInz^#T4|Cq|N=
-U*Y3FUsv$CV^jYhf^SCMz3Fi$0X}Tz6}lN(fNt6l6_ld$);q&}qHRQJ*azZ(ThXg4-!N@-fWc+00fTT
-gi1OIhf5mo3#D?dwwP}D%vSI6B4}oA{o0F|+L9{lpanAIR<E+)@;y~GkLhM0PVSQB1o1F#dS<iP(9y@
-IyT3f*eu|(CDxi^ItAq_-u2l4oUzS8D++t_=|E&iw6L?>8TrnhSoh#(NZ3VbN^u#h)^fCe`G9U9uB;9
-QVmf(>DaMJRdr^6r8T_CuG6*xj)`(sD_$Rp7F1;M$;CM8k%G3%TZh(Y22yD1OT<=yPZ$#LmX#{U(e6?
-5oBK0*KosV!>uUz!p%jQJkc;!zynF9TG!NIFMq`5GG2dxd?-IOX$7?J2vmH8IwC9jysL$)8XP#nQLUE
-li7Uwbu`ch<V?}w`&pYjjuv;*hXnzOxiVRNBhw*KCf~>}qsgF6v|nd)P1nhE&c%)HXXB9u<)eu@ei)1
-<U&t-+PNoYo9^H=?Ab2t5N<(oYO-F(E+FZSZugdLcJX(Ac?KT`OCMbJ2ofC!3l=)($K8%$)nLW&BQ(X
-fX0}wqKO@?#Oq}^+iMF%uP8PUGN7oy)O<1wn^@{|X#WR6&gI-Px+kG|Y3$lY{2(4g>E1BA-$SQF~NKy
-|E)?%QOb+$&!+&NT%|!cHU=NXg@!hQ+8?fnRkonoiIpbvjwh;cFW#o-bnd$C0kJi83GQ09lwhpMn~6F
->p<}AmE*7LK3<^-AX`$-yd`>jcK4MW00w%0GXlFID@eVhYYe@ZUY}u{&GpoJw^t^pvNreHB0fm(Fn^O
-%kUvP?ggJ1r#gWTIWr{K!hp35^RG-4)i*_wS-voHvvi>QE=}9-U*HGKPol^(|Da1BKdlbfbJxotrV1=
-(Kj8=dKa{p&%xbiX^r?gKxJ_o$(PW{`+e95cOw`4<nbv4DJRIgs|FConNYtNG(3|IaSbN@Tm|N^<Bt`
-!d*9@Ztr1KG1rMWJ1o9EbrLm?!R0euh$3ly>n$1V`tXsj9doPXsht{8|4M8lXSfm6g>3sqWR8MbKD{T
-#P>XKz5eQMcLpt^0da56!n_K;#FGMVouWX+lf2qcOYVIhN@+&pYR>76+c<`k6F)-8Q*t$*`dVbI801f
-6k{iOg5%E`IYp#og1D9ZTd=GJ|Xb}2hGHB4o&#c>-^}QlOIXKk3X_n0N+j*^nQ<tTMhBI5jWju9zxAj
-<F|3>SyI=v+2@5D&{iYk(~zmCiSoRSTZmq2AXga4>TqOl=o>G<FoyyihB5m|vtjaq1IOpMPe9$k@C{x
-fI#o=aE>m3BIHZg21K(I#w4i1nhGYzvR5@>(bkPF3TfSs85Ewc9uxw7ZP#E^brYLJ6G8himhR<9<5KC
-%IbsYwOn7e(B@<byvH!BLuTCw5TT2b1HoRF>Ng{_P~vP5!SE9IdambfO?sKP*eYpkEWGB5u^kJEfLtb
-i6$VYI3g2K227e$4neqG}<P_U2R9HY}Lg?qOalg^^S_^65Tq)uei~!KuH0s1T2wVcvPezeCG-^0HzwG
-+_G7aE(0$<teLx7V2PBFzr&6`grCtpRJjd(xQ)5(}8)g9+*DO)-aeBzxfqbK)3YD>$wD*@>YogHnA?`
-^#aQ;a3QaqI>?%LO=63VOS2s6P-jl8KGrFp4hq3?U8CW<2a#Q)gw{zlK?jxuV!ZrJev7kU+{fBdQQWn
-X!pJ+hz-m>}MDZn2mBmh>oXQAF3zY&WFDgj~A=B?wp2C%iaD9}P8aZ;Q6Mmt-$b%^t=QR|vB)Xz(n%5
-O|$GVF0^mVj=1M4bCk=BtdnXbYL+ozAP>chw@i%NN*Xy>D~qz%i}Bp`DMv>Gj}&B}4+WgW*A36$LyS(
-Rr5YCaI(L%%nksOXu+V4_$}+!g275>&;)Wngh8C=bfS(UO&A%^J=P+T|WBP6Nq!)GF(~m2m3x=qP~*3
-B?w~OBbmmT(IQ4o|J^MzA6&QSSgW}8JmH6igg2O(K74O%8%#{1=Z0#`$g4z7bg!xsd-mrPA`F)(pw5t
-AJ3_=83y*6hkUqdY{uP*Waj~GX;GWZ8pKMr)ry2Z0t$MP)I=7pg<FNfGdALcz#mOfjaSm9@-(O|7e`j
-73S-oTE={RB-twG$MyZ<_P>z8s>Se+M<)}h6H9;LsRVB!hm@7weTHeXBD1pCYP-W878nhs{hH0l3Qdw
-<X&~fyh8hNR>uYi{*I3d;sY!BIK0&~RwO3X>>>VUj6?2WfGp6h@sQJjdVqY!)fcXC8N1;>f01S(fv2P
-IEC|1+3EdmWsr#k@b!bb`H(BA8xJg8d5Dwc)OpSmvIV6zV#lTw6`7-vwoQEnl#(tYOBx41lhz*|_EN*
-T6rXNHW?_3Xo#te@S$_59VL#+7nE8r;q6q^Z7}rVEi8NE8Lvbb~4InU+HVOEB{Wok(gRovpQ=fQdoQ9
-@X5Ey-iI>Ty(>eRR#IoB!YQFcD)t(tL(=@HEN&AJwI_*{TK*hJJU>C8UQMJ`GsL5MYD3jt3@a#~X%_*
-@H*&PiTDI0pYpRXyOKKLZvcN8j#sp>+f+BhHh6+FJsf9)HIqgYtC#2Vg7pXX5a|}8a-*X6i=4sn^nSJ
-k)H37DAS%*&PmSCsmUPU8pYTx|S^-7BQg!NTgY27tUI-A~`C&P^-R4iQbI^K!SC=1Z<h|YMc)t~=w_e
-xV6OwzaFbx1;&-it{OY|_D2e&HdLN{41y=cgp54$;yDIcKDg2h#;P;`G5@!4_jKNyU_@gj+x+9lhlXb
-4<Ad(Og-YMLLo$3A$%AT{@kb8J_3tT*J!*M8~w38_P;ADnt_6<h)$QIVW$GspRKXq2J%5PUeqP@qa&L
-uZ{TTp8kzjr7Jq>a8B_`;gQ{bsY{g!$etm^y{Lcza&FlgyrxPaA<;QuHZ4(Cd?I$5!sAC}ITq2D(pg4
-TGAkQy^IIg@%OzE)%OF&wyb>8W=@6f0e#ru=@XYyiv}sKV(#R7vVV;1o$j5wA^?l4p*}yLh74zZgN!7
-X4DIt=bL{=#)J;W?z0=vf4e)4xm4uOs-Pvn$Lt;@J>4?eAk!TRbWL2~m%H*|{m;<K#xG*kK_RdS2rSY
-1IZ7GFdvrbu5ys&q@%yi{Pw=Xgi`1K#C&OB<>9RIpYiF3?hc<Pq1qzH{ppv{3pQS-Z*}8Io*By#H{NE
-xhY?>NSibplf1|l*`aF7xSttP#lNao62CxNUNOgA6HUq#=yBSgO~3m6mAe55mYzRMO++l<sL$U;-u_f
-sGw#Ze3l|=K(_`=)kVBYVV0Y{re)w9HZMh<E9Z4$w=2Dz8R;uhlV?1y(sA^XXD!>xB^|f2#ud_cU`We
-KEf#X&5vI6QJ}r-<h%(h5N@hh7Z8GUBB+lN}&5b|wZA~4YG!;L5FT~gNt<nqi;v%$ZoA{c><PXTi!vk
-@#-+~1jC{ghtT$AzFKcOsqbb<dBB8XV{Gzg!W8EfAohL?I}XAs-iQ_nHhl)p<$o5n@O&+R%X4bRy*=E
-GumBRMN7Zg$_gH{EWx*X<_Qqt)SGU_m6h6nA!W?H0y`=c%nz_l3H6CjpG;He%Xn`{DwMd%4m+lwOF^#
-aNF@dr*3rFU8`I`C^oOlPFXz6O0Ql=_VS%tJH`tPRID@T5KcCw0oWYJD~QOb4m5m7RAVZfoR%r{(@=%
-w5D_uYyE-nXOmBcgD=k<$hUxtz~bBqT!(q|C-GqH6&fTX37U0ly8AYH-I?oMD9pr1k{|_lc{iOR00U~
-{wnD$C?!opPx;D2a2Y6XTGN=4)Bo4m3bZD4X;G#dSipYmBt+q0R*F}U=e@ETuX~IY0S?ap!jjj)$Ajq
-YvM|}5k3nRvJSlO2<`I-FYiwiNk4I=KV9KnQ5m~U<mf}nSuBT!cO2uZMC%fNoc9d#9VyplFYqK~o&{y
-H?Q_#{<~Y_UNVs+FxmvD%wsx-^v7yUf%A;%|JQj&$~9yB_Rko4wj|#`u{)NO2)iOjxE;_S+rve7yE@Z
-+Z~(>zyFElu7XHExxUS4J&9aE;BR_9(7d%x{GB+w)ABuJVH`HI?dV9Jp`3CxPxI)5MIeHN%Dru_72`p
-48>jcBr1$ecQXabt;JqL0x6d0`YUyzsS&XdaQ*S7dn46PSade#LsrGn^~1&0#dTjI!R<BhKhNKyzAwc
-j)Qeaslyebp#PLm7;^8i=*CCG-dOW0A$An16r<^bgg`^y~(3!<#Y8^6&M?nTYJ`GbYB)O%g4(>Gkt1C
--<Rk&0%eR*+pz5JryFZDa6e{+fX=uPcjs2QgDQI>wUT2JrdCSn5qNY8DRo?@0^%z_L9U9SYz?JE5g!!
-b*`-A@%73Lt@oi*gNx44<^)ZKB?)nKrpR)+TwDo7#Fpj;>NuNl4$jtafflotS=oTitwl2BnsUkUGp8$
-HYg}NBo10mjMJ$?H`NTJj=)0dZKptR8vXR4i!OO014dsu{y|e442(n8Y0j3Yl)AjlMYm)dk%_;i+h?{
-E;(mnzd~}J__*YV^6IGAkW$KRB^LGi-Cl~Oz(qil_*1=8;P;}toK45ypynzgt>5?$P)h>@6aWAK2mnz
-TaZCiS+>k{N0015@0021v003}la4%nWWo~3|axZmqY;0*_GcRLrZgg^KVlQ8FWn*=6Wpr|3ZgX&Na&#
-|jZ+Bm8Wp-t3E^v9RT6=HXwif^2pMpy;L@pd5yC{YtKrm!!x&>>SB1vy?(G><QQLz?T)F>&g_v!C>kR
-mDD>Eqr2TWy&<Jn!>6hdMYon7r2O<4QfMN-R~?DAS5U8__M5xK&wi)SZ!a+i25?MOo)%ecz^&$=y=5N
-=T!`yG^&$wJ7>J>q=d>uv2#QORYPRmquk>wGl>DvQxR}G?8AG_e*=~`Maxjvgqv|m8rIsW`hgwRfmgL
-_<60(Ln`3djVSA^>T@_<te3h{VgW}lg)T(pB$-@jqh9I0&L#3BRzMRN7jmKToH~amD-DONWG(O2O4S|
-F7MZRyWk86shLg)ytaRR2YJ#lEYNgvwz*>+ABw}Kn*&t=$P(JE%AY3W=(9%hb(T^pnZ6X`^+?W#dK)>
-{@D*8%D;H~W>92_b~8LOU5=PI2XfT7A2TS2z!=jZNQ)@>Tqx^HEtOs91<JTS_A(!;a1t=z{>t(u|)0V
-jpgE0H=23;R2HK-q0(BGxE;e{})I?k1DTA!rUXWz>CNNh8$f#-O@E?eG+2B%9wGxe)Iz-w4<*1u72gC
-Fu#6FRwtvIeeL4T;AN>&TlTo84ye}y=s8FWFp{iad3=(zh3@!^;Y1zt5;VS=XaO%^v^m;pZzlZv!-vC
-Z(nY$IG7>Dm)CdauU}85z;~_+G0%!Qax_Qr=Zj6J+Jye!8BoLYlnzGS<G;U^kE#Zy{eqduj3RS_K3<Y
-!i@(6%1!=P+rvfF!zpZ*u8wsS~mm3AHf=XI!$o846DrM5>V57R;)FTt5O!a~oU=88lXwk#PtMjVTne4
-QAsS4Rw-7FHIQgtXX(TTKEQdmPovW~jGsX$5m&mIL;;Lm7Zn;Lkn*Hw)!ud|Z!0Z1{N5KA4L+?M|+@C
-fA99z3BXhvEaK4C`W?ErNaGL2Wn)A7$06mi&$)TZvY#l+Y%3x~8RPBI!P!eBuO1EA45x!qT8MKkZoq3
-Uh?EtaS&0dIMU0HkNFfJi|=`1%J>t(co=XGkaZT*!CTcGpw~@Mi2OS|7gVE?1_U=D$m#-YI6ZW@T<%o
-+OOaBZ#;gqFZ5&f?|G-^eO+QsO^D%<2eVSZXT*D6C3qhPG)DO?f9F_E#d{3hp(LPBC}Xs-HozPTt5de
-ge=rD2tUt8|9|8aSyDuquRJ!A`Nj1lnQp}(90MlTlKF8rf?9XL8$FehTz+Jc$q?v3x7H;Mqy}Q18dv|
-%0xD|HK)H;im@od{&SlZuIcfp_Db;f(lh=agZTpQ3xyzR0EUBbWb?_RyImcjp*g*zIAe5-49I*?fOMW
-IX}6dA@@k$+8oI{DZ0>97T=4mj!8Na00zQVh>W{0xtcpL|(hFSHdL!4Y$O8j&)x1YmW2dx>t89MM1E0
-1csxi^v__VUQ4xJng}l%z8@VZL1s4k5xWw<PT}CC`^v}t~h>S53p&4SGeecY!0YnUh6seenS7B0T9Sk
-gBF-)6)ZW!)5hVpR1mC`k1b`2In3DI(&#lNZ%+pWfTaM%O8$X#)9E1CBI>Z5mz<r6lheRY@T7^$wzOn
-E2=5S23Lh>&?PP#Ah)M62^&Tr9$wO42tTa7(-tI&*I)wLZIjIE#+pC={_7oc`P`ie6&qRN8<OLkq>5r
-~&Z#&ubt@yD$5<lA9G$<!F&~^}x7n~t<OmA;rUwS(1ucMU-v*7bD`iC?|S`g8wRRaIb8T##mS@a{~2;
-5GP9N{A5*p&njgGOw*Jt%90-w+Syc*L-Ss8L$Yz*_)qIWP(#QRWQWaG}VSvaCnoLzy`rdnP{mtVGZ|U
-Htsq1_yAGEz^6W`zHBm>Vpsq0sV$tN5D2M5Ml#N4;4WBJ~_Kk-{j5@{FXEwS|B-itA)|99G8|wnNjg-
-8<oKql^<B=@#^1|9Z6|i_}=uLTvXo)3Qhtzz)5?tF{&7Y7+bmdR9CMZ?hG{GnSNRY?`ve48Zc%}*&gf
-%CqA@jr;%k)xrBMqIy*G&bVj|(+0G_mATf=01-#>qnB;d!Fy?8TqP*eRgdfUoiG4w`b@bPC29EJ)bIi
-p4#AWyH)yTJMW6_sY&O$TX8Z5e(7xJp}rcrfHfH3i1#KL`pEWDI6o49ld&I=JWAB9nh>KKRFLV=(017
-E%t{Q@LId}pwXr7<O41Atu1x<hig=EMcs8w#Dy!0hd*(71UGikk%uV?e82>K^ol9HsjLIhK?a6n75(x
-l7_@OL3Aw@>-2j_Ko6fd}n$^Jd1lu;=W<QiXCRDINPevkg~8F-0R!`-jLMQ%OnCKTVnZj#3t58M?8?D
-%n`D8o9~wez=);sRgzrU#s5b!aCD;$wpY-KQ3XpzlH5hjL^iZG!%p!=X2R`ehg&NumQX3(&`qo%qi`8
-9io}prYX=*{URaNm0X-adB{Vh-fB@K>6O;>2#9@<zY;EUa1k*-}LBK-d(M$P=F`@h!4fF%8&K{JV)v@
-kCAxH~!{D)nLCc+sDR(uSC(P(96=Z6UQ@CgFh5rvl!8|b2uKS*x$5nb5XXm}t)RusHjx-s4$wH;^RBo
-t?Z3`um|!QK|9M3L1Fq4k91(e*W$tAex@oWv;}B!|Y)kjCA4a?lf-#*$ho2}iI|F%6?#R}U?6hP&`9_
-_wN+DYKE4QgH<>jgtAy(psw{FxS1d<IZ97<+phe+3ZNB#yN{Uioknn$+36373;F9&|oj1Ce%4JH(Z~=
-AK)vPkRYCgU+5^{gPM}BrPgX75^aU`&I^wlqdW4eW#CUN4~apOFd(>AmYi%K2q`>2iHN2a^5PSVAkKt
-t)1DtC&rdk42eHlq$f#<9jN$H&r!PKDcQ#r>0DXzVi_=e2<oJ#Cc*3><`p#o+JkdJdE@#8UH(fpC_&K
-p@->GFz9z{~&r}QtdcM=hq4dP8x%hAAkFqPBmp_*A&iL_sKt*VMNI(w8fgZQ%PvgKxG_p<RoE0V}#Qy
-d~X?N0q;_sBna1wIyxt*|xPgK*tRA&TAVikbI8MZe2O%0R?)9_eO=0qb<vP-lkY)WYSJa71hih~FBS%
-GHWW%Y2TNq-6|?22A`ORM4I#46jWf>EVW%Kr$_YR8DUOU5=4i>n7f|7em}YlULh=dEwH1Nfn32fNpSY
-Q5v93Q)I#oZk}vQZi#a=SjR2_!9&T$Eg~!*r_`uBf_~0+S_3uzj3+WfuY@*dgJBUAx*^{IZxTmlaWsW
-AA&Rg&S(9dM+fbxn+dSFXg!oloHPpwyZ)wHG+{C|N1cbkOOgtW@eW7Xef$6u5fe$#{72PGp(hQtoED*
-%sYC9<4@aI=H-QZ;fM-9e9-%*B!JhOY(2cD;bpF*U%s!i~tY$?KWT_53Sz^L5>)<EE>b@v4v0sFU|&>
-nkjR#fu7-AxtZ0OHNa6<&xSjI@`T80XE>K&~H7>>)<tLwv|m0S(eA1Ra10)FTF9+%<-&Dzq!rjT?H<?
-r?#v490td7VJ=*4?`C_QhZcUW$eW!Reg*R60=igrSj6jA>MBkUKT<e+FM1c!E_Nk;0*P-Gt$;>muzf)
-3<z2LRgW4m!U}9L*Qq@y)rh5r4heh$Z!u1XT*9OVoyrOWcmq(B=S)A0qa%Ze*g0?}mEgP?7sNV`1`#D
--o6l%(DCzeq3CT|5ZW)vJQzuckd){3k!R^*R<Y309KGEUZv%>2Hd^ElT_SaFPuDsmcEQWtO+EGNqynJ
-hQn7>m=-TjW0sw($)ci(@wFB98G7iA6AFi7mcL8$Ba?7cmB>>yw6*?r;;F+dWQ$53U{2nJ+T3CnmS%W
-b32D$lUEjc;{d!>+i5(hC%Fvrv3%YVXGCezkxW4WbJ9gBJ03jvE0wgK(A=QPYLxm)^%1(uZw_=xVK|?
-#i{y;9oNz-v210arC{?HZ{g$0&K->l7M8=mo(0#P@`6dh7crwC=eqVMhe@L;6ri!z>}615>cn_ZO4BY
-_Av&W5AT-&i9tc4%!TD=C9~^W?rktR;vhk6bPrs_0$Ngi4SH*71+~9iO;pa^of~t<jUFQ;Y=5v`x%P!
-+gH9b_(W>O^imGRZ61u1SEb&&6ZX|Q9TF#OD_DxxB9HpYb#;Lr%oz4Wlq%&N=fIv&C#dQmg=Zk&;wN2
-6BfK&jTG)ZLX;U)c8dIDEi&zD@?owT8>k;-ow2RFJZGf2;tAt(x+d{6^EB`+k;!Ew87K=864y!Jm7ml
-9tds%;C3ZW6(kXcl1|Z>U2UP%5VYu+;FKj}Mj>^{5ThF%Y>6gb96P*RW-%M~9*@<s)(qTVoYm<Lg2oF
-|p<(9y}jfTX>Y=?Ha)tDymu6W3r+x(A*b6w>uO%BsR7VFuVjULfa=7r<OE#^Ad!;9;T6gOn~g5B|Mf7
-qb*r4OHeto)V4iO2OyQ`-XOj!rbFAnZFo0=ITS>QD|UI2ovpxWM{V$yi6ytC#ShFYCKj7ScV;Bt?GP8
-I=nKvjV;-VBb*#-Xxy#-hMT0C$35r0YA(j?p1;i+4A(r9u=_MlO%S}q0r?_@79Q(MnGzK$j#b^c<=U(
-mOR~Ar6i1`6~;gk)*Rte5kx@6)Gq;Xx&=MIhG?d|JZn#n<qt~BsEumxxn0@J_M=4}u}^w)J}b}RG&ou
-XS$v4E09wJNpK68MNO%+T-xWuy-%4*ddUnR?tk_d%E`=FyJ0aMx-*4~r{)cb9{^d+RL};cM)0*i#71V
--A47h&f^wwy%W-coeKB79+ThmCPj#g;1SRIFD2R?p15wIyuGrhatK6QTH#9H3Di-0isa_z2k>zk^n&*
-{EnQzk+2s-UZ}k~-|QKt$L%Nn?VJy}<^Fyw2*xKY^&|}ac=Bn-g0RyH1(-fz>%D`bJq}?(XiPp@yfuF
-_j2pQ|nDQP`YbebOk<l9W2#n$2Hpv<qTPHWCc7IRaC=Kq|=q5RtMows%bNv|K@<}xKkhds{V~^I3bFb
-%t9?sp|@SAS6cd-A(amq>j_1kZ_{r*u8*fA&>UfoR@mG4FKrz7i(?>q_3Q6b~L22m+$5f8#pr>O>XE^
-0O+v{0F}V|v%whz026flGk%A}rK&2Z<@Zwb_031?Skhm<`M~6Wmb+?KRcnV9D-o3)Kge^ncLaUMB{!)
-5(7UP)h>@6aWAK2mnzTaZHb0pnOmO003<O001Ze003}la4%nWWo~3|axZmqY;0*_GcRyqV{2h&WpgiI
-UukY>bYEXCaCv2nK?;B{3<U3aMQ&9Pf8bk|DlHXKBTf2$74hV8m|=3$%0TYkTLO5mr#9!fno9SCmx=P
-z&7U?C)aYA5QS&3#L<B^U`>^m3{yt1R(gjdU0|XQR000O8Q5kVeM!}|M@CpC`=OO?AEC2uiaA|NaUv_
-0~WN&gWb#iQMX<{=kaA9L>VP|D?FK=>WWpZU?Uu0=xbS`jtwOVa&+c*;bo?k&UC~PkjC+Xd`*x<al-E
-E2scDE_oUU3H_FldRkd6q;iDcSWc_P^iEkd&ymv{~TtA(6=8aNhXL43%^CBaiom(j`+HcCQnmMe<t4<
-#fj4lpDj!9WR-#a>G>4-kr)F{CP3|YXrZ(#a}P+*DJ>JgcYaaG(S6M?_ixUju<8<z(tsnnM#&|C}kci
-4ZCs}XFN?|7r|0aR8^7S12Xza6(=pXyOO=Qy84d2=ci1;>VJr`l=)WZh-r}uZbZVW97HEJzutXhzsOk
-RMj($}Sr#{!m$6F3oX4d+z#hPV9;@t9i&z%ITz>oN<;(B>a(Pzj)6E%!pN&=-Fw=sAtQnbSE6SBjL|!
-s(*s6Xz6Q5&Il<bbEZnaiAV3AZ=c3OQMqt5OtzK#`G#;y8UoXjUFjuHFB(@MDKyHaHII4VW~zBoHOv%
-U=do4~J`rJ3M>R5{lt=WdaSY%R0_M;W1UjwxI_A^LOnLk=@Lp~0UCLryH?g<*RTl9h@bNW{4#{s>O#P
-#0PqKx@z+4FKcWY8AmtDsuY}tGwi}Ilf`Q09D8i1cX_L0hS2}vIK%i3oGIUKf<#o{!wl(?lF9cxRe>}
-xlx*8E?kO%V|XUeCpfRgwo17sX~{AY^=T<o3Z3(m8If-0s}<<q5TDxSNM*i9Q!>sHRjtz#jespuX<BN
-<Qpa}N9vOqE)ukb0h#aIo%5nz`4TO%&MatkHWbhoa>&~%U9N>_EEe%Ux4Bas;chWEeQI^ULC`p#!=~j
-WacG=9cyXEnY#9>HXDu^O96}Pehbb#l!AP|PSxM6Jh?)~kjh`qi2*T;zceEaVQXS_sgz`NkOa<!VG=_
-2+G*INUBzS$oW<06uxax%FCI>}S{UqlV-UKc^u%yY&*$ZgKc3S1~n*NZi)A#X-(U6tsfBk+Y7*j8vF8
-x6U_GXMwyLy1UgK5G&4%22dO-8~y90M~0-YLx6O)T4fuWT+`>JY(Op>qc7=lS^R!@l*&pz|)ENT!<LG
-1ZOf+VCd^c(1>k8%IC?1J#To<YJN4C_#YRiTB))gccAe@S!xN^5CLusEMp7i{wyEZ(9d}jaXG+kTQ^v
-_ym`RI_!u$!`>o2w!_bC!o)+x)Kh8SiHakq)K@-N7@p$6G3p^ZIK#Iu!o?wA5^MF1KJ(YwrQyH<-jQw
-q~_@1d`DIXT6#--=%gH1<p7;<rBxP-+3_>|gch|bM%C*cTf6^@n^sSsOuawzrDK@WK1v9icl_R!No41
-}9CMq;r532`@2_>%Mm?3a2T#vV*jYy%Xbac+7Z0+SEL3I0F=@e#1Rdgx6puOFJ(h7GuJ3A>Wtk<9xY$
-7&v-TY6q=ITui??_65$X1rHx!k$+f7T%>Wf^I!Mgid{p_()#O;h2Co@R@vDVQmvcDFFONI!6VbmL}i^
-b2%n0bpUUzPu6jik=!Cm5BO35!iiWIgGmawnksg0c%;m{Z8WD$V~qv?kn0M#9U}Xfi_g~XE$7S&RZNH
-1S&!Ch+XOgb9bMD603MQ~b5hR%Zq6AW-=->=HMV~w4&zE|A7$4~{D8qzVJG2G5O@PcJGxI&qzTb1U$m
-pwF{LSB8fc+0T|#j=rb#gGwDBW<N~5d)helU{MlsaNdPo&JF=H3s6CguceNVAUWfBIMu{9}>Hd^&E%*
-F+&hZh%N=wVwBPG{`}RxX<?AU8Y(js8SB@mfA5`%(2=i;B<^*sw7y9HQVDBF-&7YJjd*F$2c)bY$u29
-uRJZEew<|IURQGtj?wZ{&isd9lY5p#V!=sO|f6@-rV~#WMi=!>md*VM%kOz?1rb<8jTew7;OXDfoc=z
-LR@LmPDCOr%F|@_H4*Q`YjY>u97!%7UmVtq&NmsTA1NKAsv`glF)qmUz($CBUXbg4#ExNRYrU1GC8&j
-E;u@S~JR6-nTF==Gzpz1xAU==+Tx2z|<Qtfa3(7Sc=r7eV?4lAy?oUKP#Yyg}58vuQJjGONUtBc7k6q
-3XsL(h?y6+LFAA(?2$)qbIl5|g%1C0UJ9!^5$c5H<G5}DXS1W^jj?LaDkM*_N`?d(Krx84CA-Puys`_
-CR1K#y6oo+B}!D8T^^jTlo0ck%Ivc`3_w%p2hH$bQbGWBUzToYWhxFm1-Nrs$~snC<Q4s2D9*SkkA8g
-i!3n3Jf&ZYIGsp5#1uen=pg^lO{k8cM}BX^pb>MLuS7vxPKFX@ZAOmv4gZ1B+y%yJdd$wfsWxOkhoUn
-_6DogJz~i%+Ox%JN6ooEgZ6lLc{Q9I-3Y^b${JQW=K$0}xf9c{C5GUNj&u#)-a#!5tqM3U<_2`5y9a3
-;5K(D-(}?Ccz47NS<oGq+^@}fb*Uoh_R`R{=%BaVF0qNXGN^U8ev{-b1Ce5|M^m)Rz@*wgVHssS<jwt
-BKp;))+6=$9-9A0#WHvnvU<#%khz$gX-;Ra!%JZHZG8@zVgYUn0lReEAa0b|f*7*j#|27O_hwW><?Or
-ejS)vM_hxCXUT%hZcS*VcXo$r0p9SSF2+?I}^&{%zJTB^^c*QNM0%0DWOe+Ub!@4Tpe3ap(7$V3be3u
-#-OuPv5XxN;u9An!ZvMo2JKEAO_Xvp;zd(xzMz~F@aI{fVT?*FXPvADGb4dP^u*q?v4Vl6EF_e8X^SC
-1Ak-ZS!P`C$-ip-AA#QrTBUHSHy0aTrRBn}87hgV`(>0o5Oy9SUjv&$#CRc@kauixOsNbZKUNyTxKMe
-5(vi0F5dX-bwr|>~Do5nQ_oiUp*pm}kmmI^=mI(1QCgUY?kiI*|SQyaORle;2u?9*<W}I?%eYlk~AYH
-rqQV<RKXmvhR1v*BJr;I4w*pS08i*-_Qu%Pi6jBf=DL<zJq&{!zsYk_(}hTi)dr!XTwZbOo{Z>KQAy*
-6J`5}Wiw*Y`#C&3z77{Qk#4OJC@)oi93<6ESqeD_gD0#MUcO@DZntkTo&r+1hzf;mLd+bk{BVrRRjIU
-ypa-qupD$&2xYb%26(!2nALvc*=PuR;y?>C><<&t{-1$Bh;Z&!(}5OlcpU}@hFVw*!Esh#bV$B=Dmv&
-{FVpy1*FV4-Nhqj7Bb#LGqnu@j_Se%TP~YY@1b2723ZOc)QZY5gi`J5(s`_kQ{dowF_E-BopzwP=4a8
-)UQ@IprKT8+jE=!0HnoKpgkHU{cizX=1lK{R&(LiU=}GlAGdqr@8PQ_JH_%(OHwwFqztfm4KI>hv8m1
-f@r%*cjYSN{+9_&me_pj&mk`GIuv$*qC90xuK*_&``gsAHNP;<fz;u;q5TLqOJex_todspjVgFe=g1S
-8O&;H_F}x<O!1xL2hU=fj!Z<5d{z;<p;7C@uAJr6XxRMJyKh3G6486<kY$?YaU*ZSi&g8gqvIBx*#C7
-44zf-(4`aSJvOjGF}vP-|ZRTr!L20JS+AqyWmjF1|u75ND7$60w1l~_TD>y5-c!napnekX0(_7Jp+c;
-&Bds79TyLs^>$ypE}@UkIh4|svDa|*|3|!PU6CB5I1V-T&+sn8&-oK4%8OJ&v2JTC_o>`|UqV{Em4Q=
-ezb-%P>frxPpm&!7W5dn9mm$1U!H=z9*xi!%_HX_<VMv0(F5e3f+_F5u3bd*xM*V*gPKy5lP)h>@6aW
-AK2mnzTaZH(5O<G7D005G8001KZ003}la4%nWWo~3|axZmqY;0*_GcRyqV{2h&WpgicX?QMhd96MDbK
-AC(zw58SDbq3ap2|y{v~!cGJ5_9@(LH~i<TUN&c{mgaS*$6NB}m(PZ|;A;-335`pOWQxG7$mnE*6W$V
-)4P{a5(&&1!0f{T(DJ~vd0vjqdVrsK4;n5%~+a8g2fTL-ezm~Ic9F;v$w<Ha4>kqPUB>o26yX>S>A{p
-zkc)jd-(4M_JK!#x|;y7c*au^M}t=Yea+KNAVdIU0>Rci<;yL*OWi2r{+O*&&RM)--r7y?_?TreRJCO
-Z;j?&|xj}@ixxieq1#$qJt$~n;SJ|VRa^lPtBK86oC^A3x@(qtNH^UlNK?rTMvNdPJg~Aw)s2ZQUA<z
-SMu~Zkb#{gQKg9Nz9(!fJ1V*v8P+($liaTsg@RR^MzI0TRb!nuHUAh%<-iTz-OznmJE<jXJ+>oM~KB)
--fu$P}3A@d&Y?E&mDqA$W+a0S)XSYH`USL18@!3N}-s5}5P2jyKiT1jy4WPa~+76P6!?=&05|xtC!MB
-CO&tj31>AM1Fwn67Q+|ZlKg%#t)pDB)dI|GvHYAfqjvbU95`4+6_at<Vtc-HOSemv?@g&L<V{gxFJj8
-lq#*a)|O0snzF^!$D1#c`IOBT?0SCn+w5$5#)gvxq=#enWp?xF>hlc)i23C5<_~uDkxefDVE>q1o{ib
-`_v`s|v0ztoAU3<WKA%k?cXoMt{`qWn`78SXn3q>K?0j}Hy8*H{S5&1UHk&Sx+{JW$`U#Sg53}>x%^z
-bR^>KD{iF7|+&Dn%qPv$qX)6eIVIlKNmzrI>bfrT?5d^x-PIEQ+s7t_ld8|sBTHvJ6}Z1HJwevXv^wa
-I5_!yLI}r&rg1%xAxTx?!KL&d;Wh`C$s&O+K7YWo6K`)APyfV$9Aa7n5J7gmndUu!RUHd1PNcO)(Seo
-WQ@+o7vSRHs<u|@@5XnF|>7lQy_ntEv92Ona>s|mXGtR3v4C|7I3bJ3}9YPB^?xcwQm3f)1Md9f+Rbe
-PR@ba0+D4yHMl((tWr=}$64iBo^r=w!3H$}G)}}J3=c=92LqMA$|Em}<51{~04z-<BL-!3vpCghu`P<
-SZNkN1;5cp$gE)oSPS~(vwAfEemGw(P*3XX9yPt=E_5kIeqZ03p{pPj(8tfso=d<9eJS0;JFk4V@Hx-
-;Ico^-g6_`C#bkuQsaQ(+IkO0nXO)`j9@z>Y4?Bs+UL-E`0;<s4*uC@IA@h$uLgjsLL?A-`NwqgMKe!
-$=l%}sRYkOUAnOUINSfEB*uX;A=aS>T0WQ;Tf;mH8Qe$|ze>p}b`fx#?EtF1Hy<84E5Zzb|J0J5|hX+
-$RzIiw}4xcq>;+S8$ot&YXqZu`rJAMlC#A#H8$G`xJ|A;BnO8I*$UJ=UO<&_Q;A?#BdV28T9GK1}l|j
-0!_a){L_7Kha<^9{=H)VE$2u#d~~-0t-oMzkAZY1>;kHk1hm1j-mss3VsGD!*!S#><ggTqBs$BEz^=w
-%RF@$~E4_BX1f%@ol|>?8|8b(z*IP&6qmzxwDoHx*cPl1C4;&XI_~-K#47-qnHd`>=tc(`vzm&t6jF{
-rJD9+Mt6&8qCzgweGk;$Jto@DF_v~vZs$}~;mw2JZyB=kK<sFJx;Mol?MT0g$qi`I{CYqWeGvfp6<lP
-p}{cffbB(87$-i%=2)pJ(FN-3s(lq%FenjBXKvVutM?6*3X<tBFek<bXSnhun(X4KJzBq;ZmEV<mN*i
-E$c~xy)UGZK4e5)C?$RMWv1=?nt@=qw8qY5e4xT3vYoRsTR(;`>*X87hYP^52+X6b7e{~#>`+B|1i_W
-JZK{Rn0R-*L<71o8WRH(T&g_GaG)Ux2a<94z^#!%8swW1OXIShu|gctxQHI&dl+GkBd{*JTP@Lb0pA4
-vxi}bEeiwo#20j<e8O(i%17Dz<t3-`pci?M+`KnP#`6hlSfP9o$kiZ0E*Tz$*SqBx6mdP<1(HI?*OnH
-DU!y^G~Lu%BQQU*l_UVumDUr2o_J99@bLZ^h_b4UE~<T8#botne6X&FQ%>m$3MQf-7ew-|Xq83m5SoA
-v|?mCBgeBqGpKEaQ(o1Kj|GW*80Cid3^>N^rHor>Tr;dW*eR2n!PiC579gxesobW4R(^IeIt~rG|o+w
-Tva|sLnOzR)?$VZ8^co1kG^!k6h|xgVv5tmW?g!nMx|%)&*weevme&6Ko~U&tHcM1H5&3#H!%=wg&fi
-0K_M0VbG((6s{g*^&3=C$JK*J+|~t0WF%AIXy!{|7Yv4gWn1VoKu^<vmbrl(V-1qX>uq(Q6@&GeV-3}
-S#+!V=9IS^%pUf|k?SrwX_~7w~HTRB5M~%JyafwiE)Mf8<kq02%=58R(2SK$kf`3hG(1NL}YBocYR<L
-^;nYLE%ZcqWyCDl5=J55<(e>#nshE$_K+o6py&TVOn3Y)SBo-P3F+RfI|2jO*RK>HXIwgEtxma?^4pr
-JPs>&2P~o@^XMf_4PJ@5Pn9@;huviKb#%FCc{+T`8QHucy~<Umvqo5cxn7(Zkq<M_43hddMzu>tO?xq
-bp3*&=W7VrtBZ&7El<%)EWrd$WrSf+D(vfZ;J+X4O(c0606hW@zkKIF!xdX7^z}3Bme$Cqc(Ifjc%jO
-p)va#EF43mB#a8t?CE?oeFaR5u2$;&TC)0gHnfNEzs7~dBi3jzgw9%pAr0D`L!VbuSqJuOdmUrarn=>
-W;bpeFS#4DS26uIik#OBJ-PPEJ3)$WJvaK3cxpn{G+ZKl|bpyef9A#8&4QWJ3We0yA)Fp~DhLz~SZi>
-`!RuJX+Euno*57yT>B3x(~l4)(Lv1E8=BP(93G@;66Foa*W$msJx1QG58dfcKxVfdl7b*Ur^|F=0|O>
-0hoj+AoY!<1vTt*vU9)WlL5Ie~Bz*SmM`dU`;cPW+oo8d;iy+6Quf6TyAm)wD)YB<*sY{sq7|S9`2rf
-!8tZ;DR*4Af_p9--?8LOd4%LX0bq4=JBoljsce(E$zD>jK#0XplamW6@_=&(QD+o;m8Ho%}`1N#Z8r7
-dCco0Q_AMAJV@~*ATR}sA}J;c?wic^aEE%%9{?kV*<dS2oiK-8tChesQWJ5Wddi8X)*v~7rpOgV-eBM
-qGvG=49IAa=W2z;Eo@IO^O!wQEW-*h7HqKr!M9C-B9a}E-rR2#$MdmhcdXLO0p+SAE&MYC<{Mezlpq;
-ka6}sb<L=fZuMb2p4ioXg%Xe`0&Em%w}bI6C$Oa&#3dg`UMa$)>72v!p{NHf_%JBX4zlS>Z8n_PjIjH
-d3RQ^3iGPHIqJ)IttyNf*w>P5Q;80Pv@S1Zbc4=p#@p%Kv3<UOx7tFWd3Ur)3v@>PB~bhYX(zAo<Wmi
-W?JH3rRV+!eBX6Ynpdt)~SGq6Mi>!Klj?m7Uu?Cm|`9BC+Dv`&ImmTV3AGziuw2;i#o8);Zqw*9T=Yl
-PtO96G|qhX;xOd2t=P#bf}ew<t5Nmyo~V*Pja;VoK!5s%itw*s$EZ*M_|r|o!L4vE+uvh0YLI5qq^)*
-XDtwqNZG-jVXcgQgc;G{p?v&EkGTn}lY*Vg8o@^a_ZiDle8|N;PqZ^*_7k+HaY6Exte6!g)**fJejp=
-&23eZMkon;A3a`An@|8!HyASQ4$LIR8JvUmptA%%gDHDu9&x(OXTBg+&nW>9(y9!8O47a*NP%D(t?b8
-&uMqzFCf?ik5@7(fl0<4VhANgF2LxIyS_0+{tTIp_*hLL?~PzL;H1FPhm1ZkOOY=tgnWK^lCRF6tGe9
-TngaS(WfjC5H$S&<;X)idQA{p^`&{2&jz^!hX8BxnA(}L3Ud+hq^<^WE+jsUuRW>M#e4*3-UdyIBj{m
-=y=zGcQ5BT<1vv>Z3utmJSUj{p@%k*lqaduOMGmF5wUmAGg0zR=|wlAhMh1hMvtw??#UHGup9N*1LpX
-F8^&bw&Wa~hW~;J3biBq>lK2RzCK&^!kCgCIoalV5?+caI+OEk};Ccy?UX<KPJ!$e+f$Jlf1>|tt$RC
-Z4xxHA~J%OtqjRna*ESSCM3XYH+SxIUdWoB;=N4}(?9*W+LdKCyb2;<aS$FZ`~+5IWzoa&s$?yA9;f!
-SZhW`nny${snT9NkBKRT!AP(!Z~&Xm<Z1C0)glQpS(PlOhmz%t0D;!-asg;4)U)b0O0o;)*sIQ2ouSY
-j<{E)$eZE?bP=?4Z)7d=^9AuWi#z3(sr_4gHRZ94(}t$ajoA=QbTBxGTlwGk63S650`1YjI+{NsU;O-
-W^Nm;r%jk9p5eC03^hT>M4#)T@I`H!`~Bj4etlX_bc#?p)!pKKHQ#5CLFC7ef;OUHb?&iZ-@kT=2JbE
-n0s8InQ0@vfw<`Xw_bM7(0-kc29rdW%ayuB9XM_!!>YkB4l`Z#S<ms!rUr-*>RyQN%0d4zkWU&oon>+
-gwV<=SscW{eZMgzQVB9D6vKAI<*xUE#r8w}+6%1L!AsiAel(V(3#D%Fe)N5<(U9c9Q<4JdNVA$Q1L6>
-Zz=^PuVg#<Q0}rGou;tH_I=(-jCcICdKabA1k;e0DgxWcDxd65Q|*WPpLiPwL(si2P?9L<gdp@Xy5+D
-DDGs^XMft=h4A+7kfX2Ro@@YNy1z_A2*K<tW+T$T5SpoYuwC!J}OBU7AfiWK-{d*<>zANm5FihwhAz6
-ID$56etfo4A%TczVeB1@4iN6<AnQTsro5kzo#M^3;9=*8x~<Nny>_}ft@chLEfZ}y5%yxXPmR5N4LYX
-39n;(n&vVrDa+R;!?xvc#TE07HT=GD_*^Ddw*~*MdS^LkppXcY(s*`-&>n|IqxJPm*?kTKqV5Hu}@nW
-q{?OI2DL8V=9+grPz-V*LXdP|tSdfU#|bM;m!OPAhOMZ8OIi?vW2iJf|zaxhOK`(~P}=v8%BW$v%NfE
-On`YF9vAMdukGxc_13AOYT?!#haek%9jb0(j7ioqG)6t?Iu6AE1skjYIJ7c$TE`liG@ZF7{j%AJXzG6
-53gS*BiPl$PN-{f6n;I1#h41$0s-P!vi}4Y0bG$?7WnYJPo-{V~-1QVA}xuY5NjJXgmFd4Y>w`@EE85
-#oafd@g>OCs=wyk4L1kToGe9_x?TqD3%p65tzX*6Z$gN=>zh#0?K=zb*z#L6@Y_(L7JfUXUW&hX2?5-
-*eG&f4_&;^MHGd(E&k<cze5n}8ZobS?0aVH%#UBoufdI-2xf|ulA=u!()@R>mbfX)2+ZR#5xpV6*w|F
-IT7k<0{+U4===fNuMgM3(p+v~-4araz5ws0OhJ=vO|cloj!yzb2wWcKi9MG{BfaPw0Wtb4RFcYl`_#H
-o+gThvL_(V>rk>xHr4Yw$o0C4lc3zXZ42lP%G^#zKdz_8klo{lL*6k#`J-4hEk;9<=iH42Y_<caI1K-
-y9N}(C#r&9zuP)VPPC>RYyiyu>atgBN9&E<#nIE&eJ*+u7`y^b*`jvnA(;2{hHUq>9dv3?B#C#YaU4M
-RKaRbbd%eqh@I~~f(D(Y+|4+18=6K}?M32xI<yTJe6z$CbnqU&z9wHn?S0!Cfr#_+y)2ZpaWTDZe^9;
-dkN(x3czP!W@zgxFCuTY8NnAPL_eL)417VjPwJ(8c*CLUg*F@Eg{I5rZaWrN})NXuG&5)0hDS9sHAKg
-Av*}D~dPo*Yh#pcMm9^?^gHD-VtVR(`azOzv(rB<)jGid}-mV(HsI_MR2IlI(?2h6ENRzsmwniW;v1=
-6pnS86Ta$Jz02dgHYsG-R?i>{TywoUhM*E2>(VHH<)7xwj^|WA<G-WZyAr^>~ExFyC}_@TC|B?{;HE7
-Kff3XK0k6lF2fB!ZKM%kmwTSDVOCcQJ_l*d<#St!&9})mpc|hmg`g%<}QqvZm2+10wKybm8wk$HuTum
-0w}`At_GOtwiXnLt|nA6I@(~Samp_A!Sx^T!i0mjt}*xyy=(iF4OI7ELhl*<FNaMP!wRydF$gjn$ylQ
-S{s7TBmdS(XhM~Kpw`BEWPyHGM-*|0S>_%G)I~})yogumg_c$*VT260h-pkinBMLb~bfA2b#`4V{Q&0
-6PQhBtD^T>B}<Pb|`G#O9@va>y!+8l|i-UB;Pfo?7+iF09TVHLctO=76PCSE9-wPBG&pOqaboi{^O4{
-n96)Vjf83xBQMQEzGqOaGNY2}UmvLPsU?Rei)zok6{><<t^g2P-G7Z3(MmRAuS+`4Lu6hl5T{F5=U)^
-?)&Bfz|(&XELUnDrFe2j$Zpz@r1UzV+s(!LY<|loCHviMnzB&wdnnE0HJr>3bQpbv6Qju#*nQ<3|)a?
-#9Glz!&b+Xwyg&Z0BSgf$?L|`KsDUb5_Y31m^KT5M(dt$g@vzu|Ly*<&E5eW-zFe}F!UMAC@9Eod<E7
-<A)t$6y9h|AHvBLU*=~FZW#T^s{1KaF%1-JGYB(Sbv2<ua%SLp=%W@Ngxb8-vVt}t2wB4OT;z-Lrd0v
--DY_mt6)gcny=#OW0hr~8|W8cou5YOt60_GW=Qh*>%VdJ#GVX-*Z6EZ7&3-AkNEG%jR88%-A>U7hsja
-MK|I+CRwlvLYx(IQSwW7|j50`_!tA6O>_>2CVeQ_rLSRkD8DQ$^DfEv=UMPuTKOm^H-vLeckc%tc$?i
-a{9|Pj8J51N=`JIx0w(=AMko7DU-Gh6R){_8`|@(2q6z`NMEz<APe%6q;y=atyep`d}9*gZo-t*^PYu
-L_r5lIDkP=2?5X=0G~}RgP2nKrA>s0ZJnZ`4~VHtR6@GP7+5IHPGKg^rhnybh%RzHPkPeoE_5Ya<C|O
-d(+PWH+$ff~b9!ri&hPkBNzlklh7F7wEJ0nknYZT3ldncb*t4R&>KWGTX}fAs#w+$EPVe1RdL9`6HFG
-214Z*=;OHcs;p4EDX%BkRumatQvgs#V}^yr`eJQ_3nfd>pwpkN#>JU7wX7loF}hq_u~R@nxnch<6ngE
-;je|Lf~p(-apfXf5;Am<1hZ`RZ$MJ8I};@p3X=7Q<+`R`K?#jW36f5qo56ZAC#1-7R%hXI6E&M`dX*z
-);!eY2#j+SlGJd82waamW5>4LUKTh@|?=?jjT$!+Hk2gLB*W-o15MVIT7NM>VaA~BnjG(!pN#)SL!mF
-dvIk2ja{|9te(yq%t?ShanCWr)yX{^{n|4~9|27JpK{u)v9d%>X=9cxTcY>KIC!m*v2=*MEU`un6j%r
-0?FNo^0HXlQa5&krZNo?+V6c-C$I6yQ46G7tP%}@|a7*syfXvWa7mf<Y=7h1Q64k&ZQ$WfyF2kc^9P4
-tk*ft}R1S?IkT>`6A#gKxj0JlvkZ5c6HXe22LClcIV=_N%43acV^yQ7e)@{$gu>tt}krQ&kKF5E%7Ag
-dTPw)(hdfjID&NeR=LiUiZ*l>=GBJBYBCe#t(q6c3b9Xq#Ly6!M7-g?v1E-%=lvb8yGhQuOfIk>1*SJ
-!hABO<9;qR!hsB*b-SXN|J45^ye4xxktt32-t&SV+;)vm_xE&gFz5Oxm_~CE>S2Ixncb>zhR&%0}f-(
-NBr@7k!?dRG0NQx^c;%VZ|^Af+p+yaWgxB+U{w;flQ^LOGk5@s(ifQ@=UK%90eGvbOFLWL*}+dGaLac
-yx3;x|@esje8E=mv(AWrS-4bFML8MbGNmc+}v6+k&h1_FsCR_)QkB$+t<rCK)k&KBKWOkh?%iw4Q!v~
-3tP-+ck2%*ltBHxX%N^H%OHrq7|s{iObM;J<k><ndYp*anPRvNE2eq=#=D8Je;>=HHp=!K5K`dCq@G5
-`QZe-}lMZiIVqf!crih~bBdLc#0G2RV)Ap()^rDX@k%8C?OOWluB(P~+z&&8smd$@0{clSqn6lw18Lh
-dyqBsuLOHbd!q=BQYYY`0WN)1#cf3;nyO+)^bj-f;U=@fP1zaK)-d%iR7LwM^5)>IaDH>-R7<s<bntc
-YT)C>1zvq+fRf8dnD{vlG;`LdN)~xH8(DKGke&37e3C}(O<@8|pD_0ksQz1~+`Ts$?Pd}Tc^E`S<b7-
-S&uCa3X!3a8fMCPEuzn>;B-Kg@D6|Z=rn<@DN?0u_+Ju)%t{5mM9O#H(towpT(5tDNk;FxFo(NhLnam
-6@Q<aO%1}cW}p)6oy)am&AME=BERk0)I&l5HCmOlN?nb@30!DjbPqpL6%>-wyVc>qravILb3HJ2!cgd
-{bb+E+bB63jCJTISxN@+8OdbX*QWoHywtP(|w>wL6WkOX0m6l^)Au>L$X%{}YT;2<xoiF5>=4xorP3p
-Il#0=gwrYnEiT*A9-2SFA?O4kDn)MLHc}sHo2KD47uw{F$#431Zh>-FX&)xtg9OVeia=SS_+(Qwy5V8
-w}&-Csw$QYf0C+iGNhKXv_iwc!E|J1;S+Q>`9tLehT_@|=BvXsa%EgrpccNJ3hAH9n2|cLe~inzBy=P
-CHp6>znU;9vo&`R4QGLL=ZrppUg<@bSS_OR?zG&S;{s0Ri{2G-y+Et$?QlELE%R{v5BrwV`o^=%=H(y
-b;u7{x~4bG`dQmaa$eqxB{fRB!2d7;qp!!hh9MN@(tf7Irh5>0tGf)#+~76BeK+M0C1z?dCn95<5i+b
-5KBG-lRl%>Mm<m0K+phUv-ZH)@m5y;yEbqX_B9Reh|hzavczuO7z6X>bRN5%T4rq&RW6F;<%SsfaL^h
-j<#EEYy+XP=VtdReddj-q+hg;4T+I*ZY+oZmWX}_cW<`V2Ca~VxlEJc)>H8$pT~46aoPpX&D^VeW?cA
-Bh1PvU$uZ53M2be3Rhl&8Y@wg4q>t&T+t?N0Hlh@k0Uw9de(Q!Al=q|RaxkFVrUDEB_INGD1ORAQ*g-
-SLm%R&7*xbt0ZswNNG_IqMC`Mf_ZGkCp<^hoK>>BpalA>C(1vOCJ9b(zq0jF^wXcJ1A1j`qsLF&P1^N
-;Q?o3k9@gxbi`okba<K!pR3<ID=KwEIfl?}5aRnd`jQ|lK^+8oN?a8a&2%3peVfq8C(M8S7OJ_GKv=C
-Y{rHw4zd6M*2kx!_u=(UI;eEfs5I57~G9v~)XkEZlm2+2<!k9uaRq%8oc;p}Sf7F2(<SucH7LRDdP5s
-yoWF)%X8(RMA`_HIUyf#PBv5S6|n`pejY2VfA$`HOt7|KA2?WZ3=Y!^tT69*k-)fmtcVAJkeR|3N#TR
-18jhU(-WI<o*NfT)x0JTN3N&W3`66in&I=iAKnlKArn$@g%QIP%Lvcx?T<gQU*??R^!O8U2e4)6?x<}
-<5ES`xAlHQBZMjj?F6uJ7h~w`F?xx<F_7LTF`ZUvuH}(q-NmLU5H#ZIF&dMvMt|!8%gwZO3r<U&sprs
-8Wx}3|mOe$WI#(=*Ow(1Et0$OV{J`q`SAVh9}yk#!$J(jV&)prSbq{5tY-)7bV6d@rWg>)Lf)QF_XWX
-Bs0pss+<FPv&*l=??XL^=3H=;w-;UxBZD8tfBK`H?7U2w`T&4-{}A-m^(0#WK_r&rpB+kOU=lW`o~bG
-zh|2UO}7WEK4V8C?lu^7zFe6NP`~6D-GXrN*kfBdTZ|8V@nKrMRkpSF}lU*KTQ!VXc*Er$qZsp$W#0V
-C!SYpNs*~7zJO<1MP&i$Qn#hyM}^6tfKhD$wuh~IQN`_F`Jsk#c+@6wI%76F>}yb+#ml8Ff*PHU-+K%
-qj4VDz|A-`Gehq^xN==Ro-?*^{l?rWAWZx<-ERP2N4^T@31QY-O00;n48F5Si00002000000000o000
-1RX>c!Jc4cm4Z*nhna%^mAVlyvrVPk7yXJvCQVqs%zaBp&Sb1z?CX>MtBUtcb8c>@4YO9KQH0000808
-trnOj1`IxlaNB0JQ}G05Sjo0B~t=FJE?LZe(wAFLiQkY-wUMFK}UFYhh<)b1!0HV{344a&&VqZDDI=W
-@&6?E^v8uRNIc)Fc5wBSBzY(1T93Zs!A2wJQNiqq^i5xOOaYtV92DnBsQ|0ro8mq>svyAY#t!?oH;Xd
-e4JM>em#b*%((b9fy(6Lk8X!hO38+8_XnwrPD-}NoEJ#`T|I<M8yJ`!!u`?gq=5IZUTeACqiK`ZYben
-MGsvZaN+Z<V?0^ZIVXND0W=PG1Ba*OH$P5Aln%jH|fehs4H*QVh`{Si63tSSCD_J&>xc%r?i#tL{hB-
-9DteSQP8jE}crOYs;ijH7Y<vA+bN%~a^907_TOIQ-<eNZW>bj%P~7hIrU4JSUs_38c_kwE6X%J=~q?U
-E14Su)Q-NCO(pz_mMs+te?9_`YfFem3-HEa@J_xYhR?D=M714hLuLQ!f6nf@gksxKS{WqBw#YL2YFKR
-ur<vY)Ih-e8JJMO%HFi;>I0W>WTvwp2$b+sbw*u+6dV5b_2vT4`f=Sm7~F1L^rzOf~lip*<A3m+B4cn
-t4-wSP9H#Td>0KY^7q4P+R$6-#yZg=5f?^xTS;r8mBL&*f_F`o)<wWII3t|uokA&$dlGKpZ9kaH<nwI
-)>G{jkYWh5%&mLBfi|?~*f;8<iMArl<Cuat@vInh1pur5Zv4WNw%1Ya8j0E)L0fnYg!pU-R0`@Lv*D?
-p<Fvc_%d05^vt_GIE%iFnpp$ry%=i19;K^U2?NOVX2Xt=J+UgBI@%nO`O?+Zbr90BNe4gNKO@yWg|?v
-{!j4wf)LPG6Q${Cu=uj$xagM3;9imapPs<UdeL0|XQR000O8Q5kVe`)$hQKLG#$umS)8I{*LxaA|NaU
-v_0~WN&gWb#iQMX<{=kaA9L>VP|D?FLQHjUu|J@V`yJ!Z*z2RVQpnEUtei%X>?y-E^v8`lEF^HFbsz8
-d5T}`&`qj(nRY>N0fEE?9wEvacZ+D_DseaZ_N3_;Flo|qiemf!KihF#&p{B!sFZ~9ULl<YK8AqKNWIs
-4j^a&6Xa--4V-FW0dqSKZO~ks|6tP5P90}~(5l7<%!Y3&=J4_{46&pAyB8;FV6Q|^K-7(uLi==o0tPT
-`nO4rUej0Y^&B{r*>csjwjNO;S3FClPP-o2W(-J1F{(cnPdav+PEE#0kDu4@8!h_U^le5N3-akUZ366
-FQ6qOY2I`Rg(RoM$&T{gh0zAUC=5bF10VpdWjOj_uIWxhjXYr@~kzDt$4qTOlX4YoNdT{WFk${7+HoW
-YtnfUd+6q8=chx?=0{{mTZabAh28ylaTW}9H+geZ_)=oI7^k%I&Da6JYrc~iWen{|MJC3eFIQS0|XQR
-000O8Q5kVewK|V0vIqbGMiu}7LI3~&aA|NaUv_0~WN&gWb#iQMX<{=kaA9L>VP|D?FLQHjUu|J@V`yJ
-!Z*z2RVQpnEUukV{Y-Md_ZggREX>V>WaCxm*ZEq7v68`RAQF4Sl4$g#-Tb8pfD@71)Be6-2z#cl5v)V
-H~al^QK)ZNDM{rY>VdtQ^kvUh7FF#S^XRMk^2?eTd0b|q;oe70JwjPqKoWiq8=qcg9Jrox&vUG4k|-;
-Y!LnUQo(YOh2|+m+O`aZ2CN_4Vs?JRXlmdvsyEoYUKta#W~N68_!jTw3zbbanlTN|j0NBncOmGL!RPY
-w4mkUaNve2y;F!)iNcbmG{;B@Gv)-OXGHG?9JivVJ$9Q`E@xOsdZ(nCo7w8Zs!=4szjb!V5b%IE+vpJ
-MfRDG$eg^Pr|GlDq%>4l3i{3qQl7CZ?Yt;U9D)mgjX~|4m+Ki!mwX79S3>77_5A9zR&p)v7imw+;7~`
-2XLoF&87Lr1v2D?cgX8pvDH%w%TLpnempjT0y}Y=Nae;e*C-@UM%+}#*1Kp+0m5X8c7*A#pA-xITmy&
-_zd^z}bD|X>N_Bs$x)4!x6Z+G(%Turs>TAz*NZ6+&E=VATKT4U>jtyfPFcP&Sw#R7IaP-n5g+62a>Pt
-v2wXf(=7fpagU^{P;r@G{6reih{=ew{{{6^`L}E(==Z+ObK|!X(!-YOI{WIk$_gD)UU(+?^cNw?V>RY
-Oj&VGGlZ81~<HU^@5%qJ^f)uPDXA&gU!dIaH}SlH>Px{lD-JsVn!X>BI9d&^{s<=t5#J5_H6%$kI^Ls
-Y2zu^5f6W?^c$<`l_;Hz`u6B55-%`5#^CtC?X(xS^ZG<73%`c7GupRuEmX*%69`USRVts@NjjO<0Bk_
-;z*Zv!yW!M_ClO^|V%#{Ie~j2#pJJ=Io@QpFeKOgv#lpz$*iXYybawC2xpN@l-qDYLeg0%l;)_u^<x-
-<~I5GtyVZR`IX}JTSB36>MLGE@EJW>leAzOV^0d!%-%^Fn*iE&D9gIwFOJc(3YmddSU-V;$7l!zUPwT
-Xp_>0L^`E;yo&+{$b@DSe$TqIcO!;f#h<)TosK*t83);C#JD=ypGF1eAh%^seVG6q&5M6cU{oJ*P1}h
-Q7*z=+kLK6jw=L+f-a4VF6_VO1Fom6WFKS15v2i2XdfzNQ>%za?++zv({+)N|xZio25e0qocGw$$cX$
-6}(8-KVQCk{gN&&-;(e+R0T(doFzdO>H|)(gL7^ig+c(~gY8OXt5Fl>UVyWeup;v~1(PcaC!_LFDVDN
-~buyBI?=U|P0>8s{+PI>lJ!;VYq)*9za?`>Z*LKkoi7BYOlVveu9t7+`twzeTMO>48$+fT()v~Z%<5G
-}{s**ZSCLjKtetcXfj4XSoQqUABw^e?XOm6kT!2}J!b}_lX-8bNOLv)<>PXAwF>d8T`xAJRof-B{EDM
-M>x*oZCybb3(7tS{$XvsmyE1%+0JG!&)!53c8i3sXplhuvyrDqSWjnKbU4HZFFu@2AVArOraQ+mPxul
-$b6oN)ASv6fJhU-R^&{#uRB<icF%?{<c4X0**C`W1B~4i@{m3&T?IA$l^e-8;v4IgQ^hj6(*K8PLH-i
-&wmFLUuYEL1gbXnICC(3F}~9YmzBwH=_LJRlulU6G%o!M&~f<u?-!SE&R(2epG`--ih+Y^Y`hIKr%hk
->X0g$VC%42bKh^XE!<7r;lFq{Vj2%3MojH$8X)_ooT^RZsCC9TKuW=m6dqNQvjqh;X$watJDPWacVBN
-`t<Cgi!04=W6;M$?29vf5@2L`qRo86#rb_@EpLl#r={EF(k(xuU*O}df1MQ_cN59671dV(e|3#B=b7_
-M%N1@qS-hCJ<s%Sn@>N9m90Q#zpW<;Jt3>&#SgJWU6K1UQS>a)(-DMq>&I^5`-pqtkL*vNEKs;8gzv$
-(S!MVA{m>fY*{<D!BUwE|hV`*i>+u6zh3!X3GQ{QO~Z+9eNSY)N>tz(H=}ywWz-){m@6pA{jUyRWcpK
-gGHP)KCgLm=bgb_u$$<*xcn-uDt27uJ?-<MeM*oKxn!+5dl-WF`4ClMX}Jq`;ks*+eU?7Gksf{1@@3#
-^lb=&^zfriK#^^qMe)K$$v<Y=IV^eaqK%N$c$8MR=Xo=wUDH681?PAizd>pa$6+{Z%9TB)*hT$Q+DGC
-I5gDj*=jkrRPLy2IZ%_FSmRma-Gi(o*Uy7{xUy}lpDlWx3D#<7n<zc&2|WOgSmpqk9N_l*am%-}O-mb
-&0;7RdkOH;26Sp#hLop;3QJ!i%#vZx@$WZ_h6;PG7T-u<+*WAMeiJoV^@JGPO^VKZDi$sR{W#^lph+_
-m}tv>Kxh!cEKdjJ#tXeo7bifs1MJjp4@j)>pjU|H~DArC6t3)@>`s}-Z_Ek;KgS!r6;O!238%o-_aNY
-@TSbe=!-{UsJ5ux7%}-_uASm{0;VDe?MdVI-Re_16un^WcNlx>fdbj|N6h_2e3m_prCM5HLFXz?53LM
-tLme&`bk7God;nL#HW(oI6H+Lw)DO|#JI}%XlaNMSY?8^Hl02iP9&$<eEO#^d!pvb$;p)5(7rS9l#Y<
-o^1c1#3Y;8#>RCnIRLGZmoIxr+ukHK<dQ8Q2kA=92SdcZ*I`iG5g;$zZv81J^>9?Gr@|L-8%cXm9{=M
-c}lbvPJS_(cWfAH^z<zghV(%m&1iUtDv*Fm0gL^n`Gn1|e<tIH1^S-f@HQ$G8t|dw>9&<$d$_=>7Zm_
-kXkC?iBk$c+lWEm~q{v7qPqykaeQg8=S3w`AP5X_d*-1RG{pANcGu2Ot)`DwE28HvZd5Xb7D$A(b3(u
-cJI|aZoAi`yKQIOjBD|!Q@17zVUOJK;3G=9pO<*5j|1~sR0%)JXD#UIbUJv}^})iae<s>T_8S-*tskC
-zeDD$UHSM51+-?mX*Zd1a#{q7`ci;?@fbc9VF&u1V7>qVLN2C5PP)h>@6aWAK2mnzTaZFNm;lHE-000
-yO001Na003}la4%nWWo~3|axZmqY;0*_GcR>?X>2cFUukY>bYEXCaCvP~!EW0y487+o1niIw2>J&*6h
-(#=7}6k44?7WxO*cYpOC{-K{rgF==-SDAGT$SqM?Ti%TLVz{(h~w0*9K2w?16pL3&IdDzL}q%%)yqYi
-=~Q9>Dyq%9bDt&b7cbgv#T&yvyr0}(=%2^yg8sbBH`nrPH#PyzU#0Q=R1AOF?@kgkq-f@oK5)ABa5cC
-_JnXmTOsk7!NGTolWui@vhh4NVQ$9B9u_8kMe+ODcY=Rqb&Y>L6;NzmhTx@u?Vs1}dK0roq*y<{?biF
-<)27(I?)C$2nUMr)*S#YJa$Rm0HTmX@P$o8xz;ih1ImZd&xC4=Z3)ukd%M->X-?MUYE&5*O;>(^0JAp
-(F_4^?$)s0&b`qZ*r3Nq1CGw=3}0!PnTd9cI?F)0fR(cm~ADgTxjRd=!OMp{Ck_7sP<)oKo1$O$He0J
-dr3t^LSF%e?*NP_Ufte}dgOpv;$*id@IlAg@Nls9%5Y%~NK&V8#A>q!V(yImL9Z8jqV*V0z1n-5t&?F
-*zNjCLWE@{GJq^xpN0z{aHqX{sB-+0|XQR000O8Q5kVetDj#zlLi0)jSv6;CIA2caA|NaUv_0~WN&gW
-b#iQMX<{=kb#!TLFJo_RZe?S1X>V>WaCwziS#Kgo5Ps)Zl<Wt<V#j+V-U!JL#LFgDytcLAyhPE^%rww
-(Gd=3=fhE5_Rej6>>`LK*fj+*vzp7bjwS_cYRkqSRO+jo+r7f_fQL?f;_5XWe*{JN5+un*UC3_}pJWs
-#VmC~u^ED!sJOP*P!O+57bWR}jR57WE(2xeh(s<qO+UN7e>5GKu3QQ*2zMVf0>mOLNO(r^rL3D1&Ql(
-BtdN}h?8$a;XEi;D~Q{L0aU!oXZt9K;IjhC>5~;1Cdj6*-uVs$>pJJR_CidD3$r<C1B%b@#?@!7XNz8
-8cpNtSzNjCcn?;&v!NQ0@U&!{234)mE~jjtTdECT?10Qa+s9mv{;LRk5Dz#W-p`!Cim=MKs()GvG~lS
-;fn=W<-jDj&W;EL8`NEP?9x0tWKtAsu$mPH_2-3^2f*V{nWW<)3Lo6Unp<YAcAgzUpH}-LaH5Cq9D2_
-kMJ?UxdGC)KlWJE5L)@)ns7F<Jq{eq>KPAi|1OW!7$~M3ZEDsR8Jxq?lDZsr5UZ{3njn6CMR;@mqY%i
-6PgHG-aNL!4M*m70b+qcQvq4x>@mhsYd^Y#SKtJb@OIYoF?6?N`qsuXCTs|;U7NqGQKxbQw7>;{j$Pd
-<XN7-6P!#6aUU(+9BJVC7Z9@&qP%jwn`vum+4+7mVtb1gHXozVOhgDoL(cBnb0VaA0{ZXoX4Gs+@wyq
-GEQ#uzc~zP6@0BQRFU{6x=`WZoqK8<JurhE=;EIH;PBCKRwQ3jhTb7d<(hars!MD&>i=8qxnn<dq`Y`
-XXs)il_q@$sF~)*G#(GmNq>8I`gQV<ewu!sygba)`Tdva)60BRd%XKGs?r%x1KKU6+6cPNaErrnEQpY
-VWa(A7cIB8MgwmPj0J`;!_jbGxyvTTMVFGX#ZouIE8(WoFv5UoEqm1?X6B`Z}i{X#u0X!q^xM<*>w}M
-Fra233D1&*({<=XR!34{^$F)P}@qM-E3d}S^<<~+vTV)PK(2R%dvW#3b6wFF_Rn5x8z<T(+T$5>0X#G
-Jy=vP#-oDr(^Xy=j;+Sk7Z|)_8&36HbT23t!0w$qHH6$-U}E)5|9HEo>{S1te_--mPi{-ml)L4vUztW
-i(nvSxv0MLY_cCjy~A3*XZUZH9hZ43LtzE)b9haI(4$QSd>y4cjIYBB2atxFBsSGuKUrbi1ZtTM+T$4
-1mmKu*$cZF^#AG)8)9+7Z{r~?O5FduA1Fy{+@iGhQZC`8PL~~%*ajWlFe%lZ=job>bj7wp9tOk6JZP@
-v-<)~W6;Lx#tQ7Sf6Cf+{J#ilFHyp2MvUacZE0DHS=|4F(z&@mOj)m-Mzy60FTPnLr0@|E1SqtnLm^L
-SD&@g7FFB&o-LV6@`2RZYMalJYX(9dLP;FOkyt)v+Ru*et5?CI{0bT<DwoqTBpg01`kdnl1wO0BFKLB
-<MH9t#ln7;1y^>I<RSy70ucP7i7w3X=U}a7I+HDSj@gOmJf-aw<nEj*#t=@3;(PQRjE`aIsE0FezS4y
-DS;{Uw83HIuU=UbgWG3z&|GK@d;_u`NXk=gBgV9@K{Wj2)=_u)jjB*9G*Bi2|gGY*4+&BOJ^D@L$eQN
-aq9KNAH1u9uRngOw4Zm#F>dBLueKX`2E((Pow7zql5`ePGl9f|+y1Ek+g5vU(XQ*do(dq+Kj4gE?8Pw
-5-``J%m<QviP)x8m)*TH(O$FjXs=#o5+^G)A0D9u);0nK@9_MPh?%OAmRnBP+@>7xHr4wrNt*UXuh^P
-$9!ehsYWAZtDd7M2@@BCC$Q#mzhhu|7)$+a8AnIk>JnZ|*26<E%5A2oGHi;=PFHc+!xBl7-nI*(4JIr
-jef&zr_eXD)ahd#%*<hhhvj%%q~+-8hD8+;;Z$D2#5%VxdJA!2(}J$?=Or&1F#tuC*rYko%}-+;1$oZ
-0^J)v_X?BjK6zEWAe5X5`!6=%Z-~lkfxIs)V+1%rmF{P#MGp^CZVv-ZQuo4N*XZcss)tO<g~>Xn0gHM
-0|q$*)9KhBZENuD#Eh@6*QjT;M0VL;n+^L{?XN2>adQ7~T~<<F-@JQw=F+lS8yx@1>O|@FwJ@gQH$VU
-K;r++|*($n;baRIH96N?~7vE*#rxix`<`UNf{Y~8i%dD$NiBoAO;73*6Cbp2GQ4l6+OmdXj<Z6FBeuq
-QNe^5&U1QY-O00;n48F5TOVUX7W1pokf4gdfn0001RX>c!Jc4cm4Z*nhna%^mAVlyvwbZKlaa%FLKWp
-i{caCxOyZExE)5dN-TanMl6#%#4ii()X)0%@8K0fMGL(|y?ng_ce+8=2HdDvn$9zweHESM0Rg@*%Owy
-NA!cUvi_jkR*BKDuYP^a$9QSK&-7UDu+q^J;+&XEiAr#(Tc2JzCe}g41@YMj!Ti=iW{`CmG_<00;F<y
-gC=qN5^XDs_bHZ6YGqr=Ps-p<s!Xg4e514dnK9Y~!O7|A*@vs-?EUHG+w=Fo!7GSvzQ}TsVO|J_QINb
-lIlnl2dv$hkL6>^{8B;f#2SGp*uobtMY*1uq?Cch?Ohh5?@YQ>*Z~-D^5{WlMs+;DtvP72bP_8}*VER
-LjkZB?+w`o*Lqwn|0gX2tEwkAnMx~bosuRK~9hW_uz4OyO6&O)vY(35C{BPL+*?+UGhhI$-$@l`2|*g
-|i|s^fN^!}ax*sqp%m?8-6=QL2?9UyzSiUS;W3q6TveIq^h~dny#H5d^HYE>Nfi6w<l{5MApGiN>91`
-#v}$l;z-9aC#E1Ui^Y^U?+=$>~`>3ONAM%_mJxCR`g;Y{VTN~5uxB@AS`?QPG*>m&FDk7ngSRs4O+V4
-FK*+J%+kxkURSUaip;WAx*_;ZIV|^Xqt&u9MIqPEpFWFUhNBnzm=AoW3sSMj5{~HdOG<2!RIJ@;lQpj
-ML62Bh8~H`lk@A34AaT^;vBbfsP1EkbQt&v-|3PGw=#M8QODrihozcY#lwSIiNmicSi)~rpY87-?uV2
-4DTFv~#sBXhI!fl0m`b+#QoOcjk2PF}$AQ}|K0-`=2_^t<tz8&W<Z6Hi!_+EX#Z0{L(R1M!o-Jn6GF7
-~y)koob#q&sP)vQDTJr$iPU-uY_Oxj6FO0T$oU=PI87Ok}tdFQS+Wcd9-gykqfuD3cD~NjL8J<AE3dB
-BcpT(E9682k3wXA!dwTwo^aUT08YY_OSXee>#9e#n>A%tgss6jjyr@euh6sZtAA%Y(48S=kqv2e;QRT
-U;Y}+yN8eWg6{bPW&YzNrudIgInoV!KMs39&7kW8HHbl4M^vlP%yNq^$tB^I+DaxrThp3A!&lqMSf#!
-rpp~LD@2159w)zf%QFt`Djc_DK3ran2E@>{9owU?Ub{NsX5zgVZbS!JgSZbRCTyCB9-o%*{j~H-3wB@
-IjcEFRr_d~trBusu_LC}>YjYE3ZG<T81qM-idw}-=k&g>_puDOY@e$3jlK|T7l3ufn+e!W`2<wyTvQt
-Cg!)rOwRWS*npndyhQU)`F`sVMZ0%eV3~J{2zAOb`U*g8ZDpb<N=#xaAqxZBQ{~KZkYW4L^}R;RA*YH
-oQ@K&~1|%4_(T?lZTmcG7PAHm<9Q(fE0}rQgs2YseCYUD~v4m_3FVvZ<jNJnWVI!?M)C6kunk|s~V&C
-u6;-TSQhdYn>DpgKwFi(09#6MydA4kW-^@~;X|8z#F)kTFHz=%9w(r;-%GrjCKR8x3Dvc&PJEDI-mJl
-pXni_a>F1ARVu#x)|La^df(r8Re+RShL;><A&}mv33P_z^wd`<_4j*puM}9(|5p|sF_&(*(?&EM!qpd
-aUu0eVZiu^IwpA;Vqx{7Z|qsG!(@MFxw)=<wrtNd~&j+!u>$~D#BMNwhHud{AjF(RdF4jk$>?u*Arg`
-6+cxIxl-Pn-G^8;9`3>-R}85B>pAO9KQH0000808trnO!PS%pV$Kc04E6m03-ka0B~t=FJE?LZe(wAF
-LiQkY-wUMFLiWjY%g+Ub8v5Nb7d}Yd97AWZ{s!)z57=Tl7nr)5sK#03J4a#)~$2cHYn1fH+d|LEH*T$
-B`G^bvH!ip4_UIEU7$dHu_^LB&c}Nr*GBK4DC*92hKd5juGPi?ZmgD_qav;+wLg|+EtapiC7W6CmhJS
-OY!7IhYl~6}QVh0XDaB^e1L>`#)(NdnfE8gy<{6C@YP&Q>o5^HSQ4PWtwWrdSs+r#WJ<lh=pPQST@cp
-r&^3}qjA=i)rgss?<f?7zrlj4<tAyhi1fyj|f0xoaS;Lh(xKL2@X=o;uWl>UzFbZz+I%y9tT#xP(lYz
-lO~W+r3Z0)&DREy45AHCo+6rOB$P14|Cp@$@<yG5xZFCu=)`+aJIG;q=@PH$?fEvf+-f8%qg~&Ka@c7
-KPdkp|xo3HzM8(1TGxtx)!BCIplwr@;~4)doPR_#QzY2sAB}DJ|UD^ITVWfS!?d8(xJE4t!dDW=(gl6
-M<|KQU4d2{SA(7PGJ_dq+YDAOFVDY|ZCQ6Te>bbT^%4B475%r&3<~b?pD4R{W_I(3!i^*^pNbrr9j9|
-rX}l%r@n)Ws&SYd<(F7+HZM4EHF71WvAH&&^?xlou5*pkSY=~W8yRsx}>rToectS6K4`04HgC*lhmAX
-?LA6JZg;1+^KeMb!0PCAwbq*(eJl7)U#%zDs<?Z*|4`iA>+e<eho{B3<b_GCnzM3uW^OT(#k8WfrD)F
-%#|r^~u$3^lgU8ObN^M>8b59v(xFo`&#Kf@s+0oON|!>02HE+?IpjTGl8eSQeaeoFq&1K%v{-&b~GWq
-nYqks4CS5cfQM6Po!aoEYylN-F6%9Mk{=us*3f@y5cNL;l`tdFJYmxFod!WRY`s87w}G1=0k>2doNtb
-D7`7Ovpu+@JuYDuu;mN>`R+?L&DdBwbh8sluqRWT^fsTzs<1N2E9Jra3)u)mSktsOT?EI(dBmq!yGN<
-9dKWX=Kj8wfQ&FKsg$@~dG9edc1j>DVpCvk<!JXwy1&^+Lq`y9$OTrP!EZxb}eSSP>&H$J7z1G+)K_A
-lh;+){&Y&9QVXC_Uc!s%f4S^wbMueNB(&mGy|NrWE8hPTo02&?7ePj~55ti%dcCD}F}{<#yutu;Kh?N
-YHY>D;b7cvU_!W>`aBN|t_pX3l<$uFpcgg`c1P`n1g9Ba56ZQ)#}JJ!SQd8hv1Iag#d!OAzLg_eE>O9
-v$^kg@S$5=;}kDi@&*beX3d7?wdC<OWg49TQ~ojMmTE<SznI+{-OuCpIkl8I)<6q+;2~Pfv1yy0Z>Z=
-1QY-O00;n48F5TKVei|95dZ)QIRF450001RX>c!Jc4cm4Z*nhna%^mAVlyvwbZKlaa%FUKc`k5ywOi|
-w+s3i}&!?E8j*Ec8g}7R~e9Q{ttR>3YI<lqOrOQb<4mbpcBq9)CaM{aIDbJqno;v`pBA2tJT9Lp^PhY
-<2?&+T0R^@@k@wRQ+O2jeC4#%=;7~j-o-ZmnZ-$&|klO2TqoR_;@R_sPwq>z+(E|MlIi&~Q?_(7yid(
-4F#k~N}g$}%?t8vb6~?X%oa6bGK=`b#B7a$XdP`$QZ)+QEpy&x^7sV9^yYRkqEts>*6gFMi<n*P^K&o
-Ja4fvMGT}=h3y`X@BmusE@Fca2{P1w>;0%*Dzkdqfqm8<jH%!6NalgyC024pcl5#+KG0ec>^Cs6~r-W
-B#y(;=m~qt8_w#cY7^8u+m;mwe5^z*iUy{!W-r)5G(5#|<rZH4vlVqy!wZhOsoT6^S;07b20^3IwH)v
-|tDCZV00yl3gNgrgGG)Jvf%v{m$5S?Ls~rCmDDPMb{24#vy5UV*BZW$&Sq1ip^D^ORuJNxR>nO>2T{E
-&rP;UMK1Hw72G9HiRV?a-_&30`?v!W5bUGiivg=4&F#NpVmyDZOHQVHG&5WEm~YPzHfubVw<kDxM<GO
-!qkJY{uB)IguG3@_M5u$pg0{s6SwTBK?<B$R<A)sR$dvjV8_8Ww^t9Mz3R;_L_zp3g@{PnDXvP$DK0l
-#8#X@QSC4=lH)=%;KxiOxrij5$3!DYCrITBR~|Th5A2qmXMHy@i;9~U<fAPFIQm92|k=ZdnWGr0n8mG
-<>A>RlpMaT*ilqxY6c5nzkyoITd;PPikfid%7@=k!q6A-^Vgqh#Vn*+&Szmbtm>@hn;dk#d0<CC3Zj3
-#e#P@ztk=IE7er8TKwG<(Z~_kQDt<fy1F)Uu1lIZbU$80iY;)nbp2%}5Yt|OIsOymn0bW^grbtd|JK?
-}IDmLLQiD!r!7Al@uEY6R-;@~d}aFJ!h^SM#M3cs?VJ#0iJy@Fi0DH+f6@-AX4@ToNeN0NwC6p0{Hvl
-3RXV3)N;Q%6>#Hv(4xZU0ynpltkHi37|4ZnGM9C3q-~eDES=TaLVf%VWSeQ8a`UWp>p}aKr4%6115Lj
-udNL1j*s&@&MaU6m_=AAI|pKZZG#Kyfd_TLevP2Z6WTDuyMdRBHannWKGQQ+cHCo!8V1sqWnZ&md8Q)
-W>UB<gcoEUZL!U&y3x+FKSSXUzbK2+vf${!bF9~7uedB?v$fTPz6q5-utt1c-mwEO9`qZ)0qoD5yq1v
-2BtwvAD;(xldk7B%GBr%12Ji#Ak_glL9Mp}G1PRH<hq6J<SGS_FE?&a(4rtbO3zpe~yDLhVRb?2lfHY
-2)vyjxWDigrGyVB=t8*wY~@Ng7;b)nB3&=n>go?d96QbbQjN<XM7r6ay=MCGaIj{7=N$^nexSI6tf;R
-pTz`hl%c1F+A;b_<sK4Osi6^b$@38qlvu3*ghi=7)&A$qt#_U%g!+rx;@04RUFQAYwRsy;{AqewN}XW
-+@op0j;TE7qjyz{CbYRF7Vgath8?6V)nnkk4FAWTTx2#AE9dl;Bo}-LyWMc-0uPMLJ3K!IY>M1z&#32
-bqC%gFw>A(ujShq44H@=QZvKy?}R5nJZVd&dNJ(whSr&TivWQZ!e52HHI)dE6BulVjY>GdN7VbW&C?;
-j^xcC_A*ML6EGW5Bij=f!<!exD7*=2pk$Wk@c^NwJ5c22-_hfJYY8ixaoA?qMX`@17%Sc2464p!r81z
-d+iw2>BMHqpYg3Td`tmbQq;L*$FtIMC>tl}S*tJiN|#y`KlS}osP-K+)-z#RnYSY@R{@SvJbXufOVxw
-G?Xse8bs0ADK=?;@_Ncp{?neKLT%i}4wt0QY@HktExC-cFg6hJZv}NUYa3{uZg4soa1IVm<#+=(>0yY
-{Ea2<&mXy#^I}No0lLlW*Fsm8*h06hZR?2>J5``$T&yz0UOcW2~p@{LhU&FS^(NWp6bES2@WOb!;KIE
-j=Hy~vICr$P<u%80X?6YO>DzCk#R#Og^>LK;8K~QOy%lah$EWHO<eKkgU|d&_LK$B+22|4!De%m>}jX
-+k)5$~oiY=mi5X0?q-A|Qp^j(KIVv19G2gaDGG9l;&e~zkP{Zu%msvCeS2c^C)9)|gcN9gx8ht8GFs+
-j$3W13Lq^o&Z?40xukXrZ~?7Pbs|M&LQtN4e@znnsbR)`CZpq86%7W&B8z=?$Q9Q~aAycd{<PBq%y%v
-eXu%(`50zlRLG!Q>n_G13Do`^5q#kp;51l{{X1(Xf9Sk^4eA=8OA#APc&AjC~b_*bRj4oL8_lc|k}1a
-wwX?8OX`kNL<$&OBo7#q#yx$+}oTFG^I8)=JO}FvlN4zfsS&R{TMPE1c=e6FD?}w*j^SJ<`^&a7a6Ur
-SAr7?=K2&1(ze2ClCc%1lM|p0^fE_(1*b9zuB=EPp@lH9j)*vNtUMDEFRRqUrV~TTBxx&HERxj)IT4%
-&&IZ<Gr9z(p{i4Zw$fTfMtap(6jmhi8dnyuHn<<D&Own*zCpfz#CnbktDDiy1tv?t--u}8?uCD(YU%p
-x`uj8B5<?5%K_{H0o%bPV?A5wV5?07tuA5H~4I7@G<^8evPCYs<Ev)1JG^718~snyZ?-B0x2%jKKpYK
-foTzFS?r{qY7ruC6a%EGNI}!~F@y{Dr<ehvf0g=if}(SF;N}^~oH!Vs>Z`#y4PICgYsrP=M6=^O>9jd
-SY>mQ7?|cdF0!v^rDON*;Jpe78q+(F-Ct>nWFqEH7~#P%U|74xj3cEX)oNLBI&#C1+dyrVpmlwrd_8Y
-pY{o=?PbI}1xuPA&fTDrZzCCZ7E*KmE2TnssXqCy=?u0Y)%q_Km={VVBiH@7M-IxYq{~Gf^pm+KqM5K
-@Gyg?bYcPW5kGgD{*S#Z=!>%=)VcdBHOd@tee`XgQFthu}pU?^0iw+n%j1LIddv;=qF+t~vKYVZM#l}
-Tf(t&p+J&h_->#3J^pBCayZPBMs-`|DS#^h0v(=<z(z_YO2%oe3S_VosLp{h2zfv2<EJuH}Q?*PE3-r
-M+t2KVRmJis8l{5c(OFo2Tj<EUQ@W97swSM1J1e};A{E>7%-uw%YR7TyD}tXmq#Gz5>PWce_7`c#fqF
-8|LIYNbjIPO!NGF1-noyf*b)$Bfc5syvcho`WUqDSQXYyW>?_pC#qt$eV1F<yrG!>f2>*lNzj|@Fv1Q
-sYztEt_uDL>37|cF8J%hIm|F0Wd#jqF@e4fgwV%L&kJUCR)E%vL<B}eitS-<HPoRR<5t6sN5EVp(BDJ
-K*>HU`6gFOLnFfY}zEaI}r&hF!Qn6`w!T3d4K;n<5N==4N!gKaT#m@c&zsHW9oYi_raNb$JuoF$J@s0
-ssLd7@fD=<@=b21?swKYvLO6Ur6Y_tlRSBSg0JXN~H%;zWUXGrV0ECK4Oge+emWq>ACZ{gqt%iWr)Vv
-Ttrmezx-T~SuH%vOi?OzzB!<-9nDjCsM}cYr=1Fx}4}=Z8(o+5Mc|8~0>-Xc~i`-I!B)2gB7O4ctu}!
-jB8Z6TJQr@~lBD&a9HP-DG8CF&N_Lr27<ppIAqpb31DsvO@CgBz{wWxzIugoC^3cC-|s9<2-Qy1$Ia8
-T_1S@_`tSNJ%9F$TGLS`nr&28yJ!36kUy)o$=A;>W>0EWroV`uM_>AmBBHupP>uioxBBTXv$Jo0{R4d
-XpYf^1@kbryL0{<R+;R5!Gmr)0F!ZspJYX$kzdQnk0^_6t^1y@i48I*BgC35Sqm!lA`3}bF>%a*Hd_g
-^CU$B#l+m$iX#Jv9So_2eerSOER90F&O08I})ud0Xtk<Cu2d^YN0O}+Cy(h!*BS-RtzzNh|{P{lzwMY
-_t#3R|}^hcT-TS*ThV(s)~7uXOE@8Hb$&+Ri-{p-?Ug0)1g&Q}y?YXE&n=su^M4BFA<V(T%;nOter}l
-SYRp<niSoD-#c=L9N8Xq@X9Oa~7b3q7+9tk#3mLXHJK6FDiK~>%rh7XG6NT<p(Q*n$uP9CzOg1yP>M0
-Tb46-BK*b#pg|RSsa~fG4qP?2CN*2H9b93VN0+fwwytSm5+RG3bVER0&CvB5luB1su$n?8Np7+qb&qA
-rG8=e_p;i~GU`@Q}!gH<3s8cl--D)q^H<2r+u+x*4jP6u%BUg)^EhNS6IEh>w8x4Ri_WRIPv}o3V1C>
-DV4^bTmI#`IaI<^gA86Ooi;ByBM`T_&idhf&pFA(vpg1n_}sS(T@w{x3<$40Z@rGSi@`@QxiwLP;&ml
-f3|8Pn?U73oXpX0pKPbm&%AM@~GK{bv%AC{(o@=-^_zn(C0SdPP-T5W>_(EtF+*yQ`Ir*Z~w(OB=Jvt
-obZ4gWmNq|BhMM5n3G_NuOBlR-((t9qC`}Me@EzaB;Q+lNDZH&KgPP(kW|?SolrFQ4}eOvbA7WrO_mB
-Qy8f_h<e}XQ|z$h6i|nX9Oxb7!-#r^K}Z10isA8t(Wz6Y>G^Tg8)3x;9!b~K*|1bPMHILpMqTvr^?6m
-h?&6u-(K7b<mIdEY3$!e(UgTvH*q2RJ+S1r9uQHqhXMq-*nsul7;5Bm0<(#Rh-#fQmw2MXp{jAEFg6y
-kuOIBMC>v}{xRw#9fwA;N?_Lmi{ZKvUA+3H|RPm{|gLdOA)7f-Mf4=xLaO8&xASVD+MFF3RvdK=+1Rx
-~bqH9Cq~790kUr~9yj&~qLJPKA`Hf1(uT+C%?z5K44{AvRAH&s|pnsxxhup_B3@1ORNpw~cc_?AxwG1
-775vEr@oGh*PiXJGDh#^U)N~tXjiUgz1>O&2miqbY<EO@Xw$!KH0aQ;WF^3=n=;3-%*(E7I{uYmCD;H
-cZ%jF|C-9P{;B#si}8x28i}>D<b6}YVR9&UyVk9^;p?h~JE5;usE(MM*r}eANm{7muktoYjJkf3AJq!
-=WB-sgZFkUm|2fu7oP~P#A<YyFNcyVuy36U(TyP{k0>kRlK*!Gw=~MSM5&lpe&0J;Bomg<VDwj#o17i
-T+wt4Pe<eN(&QB|mTmG(lyEA{nwyz`q8v|pth9&b<BOXsd<nk9HNrHtuJ9-fhDniu)%r<Zkx#UA<`P=
-S<2h6;Heten%IZq-;eUFHqnx&+xdPSNYL1v|F{ZG*?%`OX%j29NOrL*+-$GuU)j`!~GHxp4i3U7NRbn
-|IO{?~C%Tm~<w?E3b~(uZ=A_XI#*Mgqd;GgK4!?b=R6IZ<X8d+isSx6*b(V`i*vVr$b=!RvEUTYct=H
-G=D&PC)pmB8}rx`LX-L3Hr;Os;lGz^G%u(1LL&y0VjPFO&0tF{aSu_!fOZtnPie?DGautjjUw(mTk1W
-~lx63h=VUZQ!Ug}QWbqHTrXQ$hb$he@n&T68rQ;KN>Wz@>mRnO&P>9R3_jr}&tJw@(VTZ(Emd43D%Cn
-7kHw_>6Tc@t7yg$&1zF+>hyuNx7FR!oPUiYmtWcltjP-lYYwH`I8RjC@?Gwo@fZ{96mT)omvN3sVMJi
-bIK799b?-h@w^*tUDU?(ZM)H0$1W3G`75;=b9Rs!7;~VmNg|l<x7EMX>MNk3)+``ni59x6{S#H*g&*4
-0kYf-@^+OhR?`Lsk;Xd@?72(v4FBaS2gGvJqrh9clY+5(@nc_Qa+gwVpl7`RCMx1JqhQsp+@8llVLCI
-HLu*8F!(oQ>L!d|n5DDK<O6mi_1~d=45T4G*kt0Py)^T|%?IH5q=&W%S?7bv4L&+X`rsu6AC0X(IC;R
-wa1uU>ePDKBd&lz3LEUKltFkB96Qm*`wR)M~>J0$R*)7l2{eC#Np52~D-+)fM3&7@&wl2cazX4E70|X
-QR000O8Q5kVeea|~R?h^n2n^FJ(B>(^baA|NaUv_0~WN&gWb#iQMX<{=kb#!TLFLPyVWn*-2a&s<ldD
-T4qbKAzTzw@uSNb@4nrBSI)rZXNZ9VMds^y1pCCCAgJ@vukWD4_xY6d$71IQ`qZyZ3>+!+|1YyKOL&h
-z9QV_V#=C7T9Os^Z2GLs)iLyR*Ou;O;OcRdB>Jjv0|_9n(HEGPoi&s!<vHCZAoL*?Pu`do6$Zy$?Ae#
-^O`l+f-S@~zfFsZ)uo8jWhxSu=Ir(CHT&lG-?H^}8eg-tMrf62sykNS)iKYq8sNY<gb?#uAUZr}v$K~
-MZ<wg6qKeqXHOyNTNt+3TP>H{{X$9aHBIYejG3Y-*q>@6^EH4_iEV8Uv17w(EkmEU`RX2hsh(}xHh&^
-v$21`;{AQ5$3r6qs^SmIXXO$}ST1;paGt#H|j1F{v)%GFj7d9@wH7J<ZRodTs`w@Fo$07{c^i4-D)qe
-R@6fFtf{#S?*pS3J!d_>UbO9{vw&MBT8sxD^$@647Xst_TE>B`@?pR)CHEE#aDf74ePe{&iRDpG~?FB
-Vuz5%fk%7v}WpI&Q~I7+A<SU_9tGJX?`^t!6u)M7+k9YC|l%d%#I06WNwVahgg&i8=o{yl`h&w%#eFi
-c1CdNACsqy?RT>E<XIRd;WwK7G<$h5e=|Edh5O?p_UsuuoT$6+-ke>`%<ZGeX!O4)=kxQ~i`fqsaQmW
-a1+MfHuTs7MrV@wi>tbDlAPU7k!ODy`z>gKlFgJ1(jppZnIsf70#R~xW^5X2}>;(WV7Jq}M;|T&j2eC
-+Vk)h<0)N-V6BY>hH14gi37CEqOemZ-8^7h4r!td1^0ESOSqfwmkx&~-+U82!=Msx(0OeDz@v1Idkny
-1ZtJ_Zz*Qxt%>NQ4@I7f6?=#txt<?q@lP%-l&g8XiO>MSzL|HnJA0L|LiDtTp7W*xoZ|87Ym&KOg?`-
-Cl&m<juH)Ke55q%`jA&VpfJ}Bbu`Wl?1}in_|99#_C^c_TJtedn0Fawsdt@S}}E7axP+LOPY6;f>xuE
-0aX)MAPVagcvge_XLlMM5*Yn_0j4s-<!E}k1cgNt!t+>Yl%_b?+SM`v%Bp8{Q)IR19vgjf#sdfqFT%f
-hF`jfx8`7_fyHfxBiD#`)n&yD7cnU(=Js$6!<+nUb6PrL!+0TbxRlgW6YHCmPwgE}dL5p>pp?2Ir$QI
-m0fmF0!Ccy1|b}AZCtw5`kuUNJ@Stc}#XyxJ0y5gm+Xti+xmcIf}JgdOI-+@}^Nha#fxq$NLE&yH$;&
-WBCWh0Vk1p9;m5!hTb;GjFpf_(>;=E;<OYip#k_jAMvbq~><viX!f;?-3Re;(be@t4I36j<_QsYD43Q
-q??;(<*M$hN%_N0ZMm@&MPafz_e-rdbj9TEeDMz$K6!h6hP?||AitAvRX9;3cA1wAZ2k2_79DtNGr0u
-McdS!pa%t2^9*)7_IKJ7)mP`*2fXS`5~?CO_6Y;4D_ro(7-<V>KLW;pndTt<V{lD-WM1|>Id?$_X@df
-q;96X5PDh=RZeXz_-CWV@K7PNGb317!|F1$HX=dW0%|K;%nz5uMIj86+GH_0Szj}U+QiJ0cf`ShUvq)
-kp3XTvhmWgGfgDQom0S32u92ZrB<_k<;bFE`EkMnXKkWua{x)RNJPu<;{5`Q|5BMNFlD*c|v*AFFxY;
-}mQE<Itya}I3iWXUm{E@sQD0DGeTJ@KVQj{}<(9a7|Rq3(c9sAc?i2of$p2@;e=aEEG6)R(H^4fHW|C
-z$vKVu#-test;x#D!5=S~p`?jbINRaZq&)4=Bh5c1r%-WAJ<U?P+4HS_m>1WK;+hkWUE_C6T1en2Ka?
-(%}u8Ycu3RFIX}|z>sG`4+OdBjr17n8yjbt%_ax0eWnbKG_X~%&e`Hl+Z+`fyAzaQ3QiChoJaUSZ<1}
-qf-{FEo>U?~XxN$p()?!GW@HYGE&l+!T^H32-4!|xtpDJt(nF1F0Q)ts5hDm++l359!TlI2N()l*I;0
-T8mKv{Zt+fj(WU*;P=D|beZvzg;T^_z41?WJ@D`i+nZQSU)G*2)^!2A;87>Mza8lEvW8?5IhZoo{$ta
->aX;z*{j0D5c?$NPZ%yYmxzxHmzC4(?&gtGB2IJ(={kOo3~MbeMQBNL#K{rqO+4ZeNrW=M7mX*VYYAf
-hC+--{}>HSHVk~G$osomdA?H7iWK(oxXZ|v2jh;lx|)NhIeLmz{G|wIquTTeUCz@$obgWbr4isU|QJ*
-wMnr$jKjvL#vdH^R|brqnMnf-A-V?tqqu`@b#;RAf%W8I$}SI7<^aDBmI?k})=}_R!W(|@eqwUpxt^<
-P4P*7!%JI}4)I}>>A@`&+c6KA~Y6@S5Qf58U&Y3CYG$4-67#j#!fx(;=o{e1~5oD>Ds{%Ss<_ob?3gN
-lI#!Y1L3TK2p=qeq~isGg%O@<bV&<7E_Tqf`RNF5kQLK6xi^t16ErH9%qRN@LE7Kl2ND3CGQY=A+7B*
-cdsX{f~Hd&u6jq>QBiSQ2uwsGEw%jnM!`vm_QLos_5=Ty2m?vGQdKLLRVUDU27=HZQxHX3Wlh`$|;>B
-MsgHfW+z7BB<<mr-x9;&1vpmb(a5Ewh|BnBoRBoC~T3!b}BO?hCmgt0w2QTYY0^VNpM#ZH*0N~Hmkvq
-CMGJ3;HxsDw4%m6k&zJ}FmhZLQv$*%ZNw_al!+#edUQjWn0MatDlJ+n6=q@uMBp+d8OxF5$&_K#gMWq
-kAs2wK_2%!bXvKIk0m_sjPe`M4rwk`+rw6BE$-&}iULHthA_6r*!zrr*{I*yEM^bdtE<(nkD}&oDpd}
-`3B`opWN2^o&oFw@`Qxkbc#7HdY?9ac9EHG~bPaYRJq~R-N#-!w9`TCB5U6{jtzch#UD6sZyBOz(&mS
-+xzY|E~NGBc5i6`1|jekE=~mF)tnXyU^)hZG{c71kzrh1Gsl97R@i`jM&{(W0eD7-m{=GF94BN^6R?L
-YhVFZ7qq_=2~rGd5GQCSk%eQ)b252rPiYa8-iR`R^k?Am+B$fa&=}9D}opw5r%PAz>*O=llqKtVykfQ
-Sz^=p-lEAsHPbi7UDo#04dSrwOoYXRqrJMO!jB?T3HZ5^sZAG3Wt#hf8r|Y5^*9hi108UHLJvuxehvf
-;a&t5#@ezLG<)Mr(i9wJb^<7OT*@n@MNKcjJoidCfj;R9SOSzT+$1)-ru)I(4ygJjt!xm}g-MR<tevJ
-N24x3N_ucmy>{yDZzB|b9iFk-TG#Z?0Hi>+!oD{Pn6#0sstTC?J1I2drLWC7HCO#<SujpH9bKV?53{W
-6hCAuFt%F6{+{LtS2gFja`y+w~B-lp`>JhF^ZzfVYgWSaxBP1$=AS2Uj}K0xksFX5;wpse(%0_$pNv<
-#;1&daC|Oao14Th1Wj&qi7o35*l9_X3){9GH&W{5IwNTdU3H@h9|S{PfnjlKDKg>svJ;xfsXT(bA7C1
-q^BCBtKyi$s6(f(Opc7}1ZqA`9zqxdbCw60H-*bCCJwI<vy~JN&RKwx-0YfvJ&5rJLO?%OMUpP>b~U9
-xT=V=24>r4X9j!5{q75nrc?ir^oqhK5)y3>7J1-#9*F`4ChKmxi;Pf9t9?uu0sAT9yo_N_-SkR7kRKU
-xP%J+Gbo=wV^8YlA=S+7W$d}kfP)iPbdT+Z62KXA~@Q>_f|>DBSKyY@cDROk`$04jz!43F5#L>&f6E(
-Y*GV0c2C@mP#WZsgLvZ4H|7jdH4z2q~wkf)bL<*P^0BdqfqIzLsZdD#}lrLp%wVYGq|{PKsyM-LW){P
-E2JBy2!2yHm)2?v3OZDXFAmoiIfm4ASc`ErxK)0_&}cd=`2@uwW#7dCSWqN6M5ZMs$+p$k#U<RqRQ@M
-22n%Q7YliMxvYfmuY6k-XAn0IBpI?3LGJ()5}2_~DuKH}xd44G;*`!%WNJHLF<caNHl(Dxp9p~v>oLI
--CCQLC$nTX7u}u1Jg8043unkc%s8+dDoBj8g2~BI<b3k59wzk@(_T_ENaM{WjVeA~^9n3!zkCUz03yX
-5qJ>g}M9ck2T<X4wa$!;u=;O!2VeH*fU!Kz!_u0Wx(ZtgsBMt`u%hL5}>T|!N&`GmR_PBJP*U?!%k46
-0wuId+24)(M8ZH)VVBhd#)#yMaux%dUKRoRYU6FE|Bs#<18V-c;kD{aAfNdX){0Lxu!%w49=<Nq?K*h
-;@a<y>5hq(?b$Gyp%)Sfc1TT(uUSK>aSUs*!5#GXUh>!l3?W5heny<5I9AjL2$l{)TG-Y-Pw*(_XQvB
-u9LKmc@;+0-O#3yLz|jA&L2=*4~77EIh_?<L#6y<+GMPb1kTE$PBB7&XaRKEQ4$L=S7{|4m+uWOo)m8
-rvEa3@R8`eH#j0%X=)k`YBw)Sv1CT2;pxtSMVhNoddXE$j0%?!h;H7sK+BH*XlkN3!P`Uzs=)>4_yc|
-Y{K36e}I!55mZ6e<sE17;Pja~AeQorWZmAC1pa)Nz1`?eV6Afk*=<=$Sa+iUkW3Y098RO};L2U<I%mL
-IdjQ0+`j9XOkoQ$HSC_GTDJVC@hPGBf@2UOPv!{eCE8l?m}sfe*MFA>Z<3j9NYI>|B@KOoEC|bHP!Do
-FASLxUTOt+}XzQ;W*FjJ;3YPt8L};s99Sd6GrlY<MX?<5L&x9HF^SJUwzY)&~5#l1>&RG@9S4DUYxyr
-n8zCg`0DM&0HM1*OFuHTfP67W8KV7mZjw;8hVJD2&?*vy`(4R!PodX(B+p1NjdbSwmYB}=sON~1H#(`
-RMO@^GmjEk%Ti#)~ImB+hJGMK9?W^-VeKR^-BHIsbRJQM9TAa0w>Y+Vit26^2OM3}>lYLfUQo{I}tJh
-xsA*zBJjX5MPk2rc(UN?^nu9`CUYzW`Uh+>gu+Gnyy>_|NEdU8x>n<YWCp|B5gyD{|bUBZw7Hw}rF@n
-{2%+6buj)q0g6s?vel3X9InEVHXawZMGM{^?kwUHs!NkijhN;J^R#o_AN*EBd~7R&MEhY2c@OUuV6o+
-^=x`uLwC{)ld;w)u}DW)=u4h@%eptaC195@%l4(@!I#gvrqQpVUWHjAFw3C@$FOD?5)oOr}hG0%*h9t
-bDx(F_9k!KV+YaOrN?Pm(9-w>s#<vM%W^R~YkCh+zR5yodkOV7=wrPUyZYtA)m`6DmDm=w4PCeODPJl
-ih#nLah@GN>0a)0WlC|+o3ZYQLZ$z!#zG^y23T&Cq1->-E6z2y(W$BG@vYLqfU#mKf7ox$lXbM5n{OX
-}G1^s#aq&Iu3w<N+O?WR6HiVkrf4qfTYf=ZlR!jAl|k9Y7WgP^Jg(aamB<0zoMcfg?vHmYY$9)ftVC@
-js3ek+#MfXH6qap4*(^7JkrzDwiMbHzV&K@Ju(x{^uPZ8)VjN$qJ5kC-}&sgP;gdIs}js~u*-#w1?H-
-G2Z5q1o)q#b&c#V{qn9vSTxSckt{GFI%4U$%FHJ*r{~~6`>$dc4WFy;E!}~n=nw0WWQxU(ndc$Aas}B
-Dk79S=t4r>WBQ<&P)`1WL1B1<U*f#thDKR*p?~W_$_|xPoc!aT=g-exT+H6kVh@--`)Pi1dK!2kWx#Y
-QMqr<ERb(c3x|F+kKV^qg{1U*!BG@lP8d~kYls2C+bPkK~eX+CZw)%C7?&<8s>|)k;4Z(x}uTSHg4{f
-{j0IyzXA13>+MlXI{g#V8uRd#k@pU-&)zzKdsfiL6`zw5`nFrfC{XTVF+ZH~v6!{M(_^c_QBMjM`5n1
-_yF@scf|B)j;YUWZ$tTQs3AG#nA73H(1C?CPS68VMGy3FLQM$Hm9TVQchh=Y#hwFreh26~6G{Vb^r7-
-c~oFHQZ`zhFIN$!vS`9mxHweyo$_9;CicF9=(46YWgLCj~4WahiS-2(0l&|tm#{x?35j7bsJ0%!j9X?
-50F28j&LA<9888fy-&(=mS3gn1#sshO!6}h>N`G=;m^TJ6ftjL8%@<Z@9+I^E#jNnDGA6iwR!hV&83%
-cu<X^fLlP9#K%8Hx51~wHJAcDU1y628)ueSdS1lpGC>CM0f=W6v4MJ43p`MsllC?O<GDPGWR>Jr830G
-?U>e{}{VVkTF>35m<El)H03>6h85HW)jJdfBo6;Ih8Pi7O7H90=cIr0LWbPwQ~R-x~P$gWp>NvSJ);D
->C8h-e`WaPEOCI%V%H+j%N)9y%`-;Fm}WthLl#p#@u56noMlw_Y0Pso<4p9O+VWFrM@TSLp_N4Z7F+=
-7IYWB>!UvYPy!deGsrhH{dStjeqxj!6~EHsWPDXKGQknu`GJA@0j|dNX1UoSKE+}>V;A)L5<G^i0PuZ
-6_e3^CqVS}7zi<bWFe+aaQ6HZz&$?&Rk=7n`~Mjmw{=Tj>f!P{^62n)-%LnvyjLN|md;Q;*qi{@qPoR
-?VEOuKg`bVXmPGW99t_sV&nqONp%?O&eU)JJ!94Xo4A`&7C2#1((=?BZs)B);d?N?+iA-B2fSXs95IO
-zAwxqHWgcJNg-83KI>kgH#vSPtA*84izNC|KMvuV9P;MBJ)2a<aSo{<cFfz7pumelrvk|1mY(<#Di1i
-3B5*Mk6uP4&G%&z*KaS7EoZ^G477m)s8Y)b1;cs!*&8LkG^Mzk1k#4fq#OO9KQH0000808trnOx5qmq
-Gk{P0I)9r03ZMW0B~t=FJE?LZe(wAFLiQkY-wUMFLiWjY%g<jY+o*LdCgjDZ{y05{jOipYXgy#q3DP1
-BhkiKI2ujH!1xi%gTcjOS89<ht7D2(*rYYe&CPGmseX`6i5lNv^I;9c=A*j0y1E{xs=3UwHJi<rWl`p
-0He+(V$?}5nh02n$5HoY%v5!Tbr<uFi@;sI4vvT*VHIF)-B{5vcl&eTe$8IIQCUUt8See>OL$~5;mB@
-u7TgTrAOs)8Z{(JfT50+gRim#E_6f#Sdqn%DaP4Ya;19p=t5kdNggcr*!Uw<)j1#EhEb1Rj?wSCm-bT
-Dk3rG@xfuq$?#rK0okdO8CoZa?ruiO$V*_VCmF!{iR6{=?~H{P}V6^mu(YeYk&os$O+Y*)88FR;&a|M
-EYE;Shi%G#qwFGf)yFAHyOlOBtkEkEz2~bwXjW|#bpG+Fjy)(f&}{b;q%>ic6<GRS$^&?{0uKgT0Q#a
-yYrDzlfL`myOC8_(D?;RjKz}8BB-js-}Q!LUk&Hkf=4f;ydDqOqCe83Pfkws|FI!u#Wu5oC|Za3YsnM
-0E}1gTm#0{lT#K-yhdyEDZpgaCniqnG7Q2mLs>sh4yF#c?lRgUA88-1LF9nlJt+Z+=FQQezcp4kcvJ7
-wYtyCgxNSX^(CbWGp(jFx1@je@nh`mL>uPI;!ED2an0{=~JdL#hPbG`#9R$kqK-YCIi`}ZrBu>WPbor
-=V*X1rqO&~K}5A<nZXcv0j%@`HeNoA0|pHPNx3Z|_+jGZ*=8#Mmi&q6uk{WTH#K$#<3JZ=FM_#3+Ki2
-RH8dHs_m}%Ayxh1Z+Hce45?e-%SGc@Ob}pKfeDo1H;$LVe44uCz$^uSL9s()iG|#ZZw5<N2AXTSIWxU
-%Ip3C6Pw8b?`G(3#`m`mkCW;2=Kk*J9LIQIC(gfKoa>(emzU<!8{=`;#F~Qq_?nqW!r($2J09ZMG%NE
-+D6Q^whIcZhAj7o-<M-*)ltpp_OI4%JDFzJKswg&Ubau9tFEU(bf0IeV!z_P3n-X_f>~N94ihMSev6z
-8DbJTVlLRAT@JA^HqAxQj1M1?wAVAltmoFjHXpfj1q;%m4n)=6XdYL|+aa4pVw4!Q({E1t)K!rx$rwG
-6gmF;IGbHNZRrEBu)jo?Q7^q#}pYON2={x}<esf`?ozMXuL-5f1H|nJOimTN7*yLE{A+oEHcN^kO6OB
-^E-OMCyo1*SUyxtoQ!o<ZLp=-+tgT(vMgMK^a}p1}sETSWdJDX(SpWc)DZPlj-13<69j@#w(8B%X7oT
-y&eB?e1sVd0zYQV02|fd?l@~^73+nFc&R9|=P{Ng20V&H0tFT#rXkQDg64XirG{B76{k#a_xaN&#!G~
-_6#JyjDPXtnzh}4CW2L2kKb>khoiGSPTp>h+o%fRu*PlN<&BiwmA19Af7;$&h4gZqKwD;fI&b!#9i{X
-GIMp_`L2h)$&!{2>p!;pPH{&<bw%k#m*{imNUhUecC6$Uh^h|9(0?;IEJJ?+ptyvCcxBgfZ0JfLc!al
-AbC2M-(#q-oN)yT|GE-c0t1yZsMNdav$8;||)#_5bw05x6|~fH-)Y#RBO8508gJ7m;_$B+Dp4Z1ni_v
-IV(!Uk7#vVFqd=BDs{&h&}9z6~fFV`wbh07gZ8b<%amGnG#4D#)V-Ay&i($kA3!sE1EGRCx>CpC}y!g
-u--7}vn+oz6M>Fhwle8=s=*p&;GryLvz`*kG9WxtWKovP><}-zYMDV4IvNPOPu?ItWuH|Qh}kPoN(#c
-X9h@8?@l<#?NwgBt%WRdYBIRpQLA3)qObjeKTVo$VgnbUHq}alg&msYpJK%UgkXeLEFyU}ChAw3yj*f
-m2yKla)H(9@L>_d|ASPM6cRvb~lY=@gNV3v2=et2@Z%WuhMuUe+Jx=b<?%#;&?6a5v*Og9@|tn^K*EV
-YKsuug*pc+oJRn3`sVR>bJQnsW}wSk(u;lkqizE;3D#<x-e|)_V}4fe^C<UTpnLo$Oh-=U#3>`fjH4+
-ukA|pyp0%X>-tHvOWPR8(~{rv-=bBHnUDb$lAt)IBPD4ge|C==(e-rECM=*2l**FM9@KA5v<%i=Nx{3
-g2nPb!saskF+eOrpdpyeDTiX=z!oeO(5NnDT#3UIB(Cs~QU6=^?Q6KX8y<eOyWzmBK{S=iTYIxl6>!#
--4gq@`=1SO*E)JF7y=Da!Dqhq#(b^dxf8{cvbRGgZ;Te#^EAqK&QC+vp6O_6`6T<-Ym+~2D9lJ#!o^K
-EgH@Sp1lbz1~YrbO!S+wvXFM*%yp<tDY$V49O-4YUo3>JgYslTZl+q1=9wXi!hEzqkhc@=s$L-wHs{E
-~KCg>y*ME;vNAjsbJxEK;G&&O~}fMx%-|9={UmiU+0Q&q71l7IvouQr$+ilu<{@{{~&t++M)#SyiQVV
->TP#x}!$mJDj!af~BLZf^7?_4Qmyty+6WrmW#huv|fg4A%|*Q@^k}SQf;HIy+Kn~cTL(~_G8-dc=iTn
-34eTd81YO=-SA}V!<Orn9}WWc+uxe~YVM(cGru|g5C6*S^*pA90+>ddv4ky&9IlxbJ=&dsc~ACxC<Hq
-csq9%I4)~O&yCF=Qh;*4q#7bgFGQ%HiFJ*+<pRe_cI#i8oGKi%c7|KSX&>!W^R}cQ+34y_?&_M^Tz7k
-(!`7B|FI#eu#uK053F;|dnf%uapy54YWG?3Wicje!~(KiW?L=VMCz`EUjm}CezJ+pDPonbpkSGr&0Yf
-=+YdyG;C-uqp!@EQBmU|`5?zICI#UQQDNG|ZsuD+FqgDZr(SZI5fjem?)D8=5HB5YPgHQ}#ueL?_Y+U
-fJtIk%){`scm+{%l~BCEQb+LdvABCL-}Sn4EI$xGn;r-cSQZkLdV-qs>4FnXmab-_Sg^2^PVNOI%#bt
-^*lbop)~!Y3iNeGeacwRp-nnuldteR!cr$t-ATZn@#^H~i(gJ!^1l6P(Qn|I#J-UIzVpUh=zKJ*0%Q+
-13qg1V!kiO68cO47aOiSPT?~@|ah=PkYGMX#yOPn$nLl-{2*6~T4-NO?L<MQi)&k)rHhEloGs;86=Q6
-Q<%J-&b(b;$e0r_a&s4V7&?8Ze2?tD^eTmc~<CW%2Z(FD4N$xO4f>c1lU<KB2bX4iAftsDf*;Ma^V76
-2qVTbnt1(@X<3TCj<iJ2rou{Q2|E<K+DuJXL{YO>@n)xYeslWLb0peT1aeESnR`n!^_IdJ$V;SKyYDQ
-2yVUg&6%ClXeTKx4@uu;2(c4{5@#)fps}xZGdKKRs%ND*Y%tmBbC%MBT!Yt1CqYk3-%hi&}_gwT3x<W
-v{D=Ap#VqtbhSiX_O9mG-xr#?xqkn-qTF)^FZ~~NheW=JL+|<56}jIc{{N!RO0NH#N+VclA!Zh{QuNf
-#8BfEmgmo%3_uuNJ*nWT;Xwi*V{9*&HlcWk#3X%QQxV$2lUkgr1ma_Jo+<WG^!hCK4!yk99NfI<mFH;
-_J6z7Et9-1qqC*79S!!_g3uHG_otDnye5Ad>(Y8Za^E@U@A7kco3y*J%V-O!>wyzSys)}zz|tyhhm0h
-<bnNwgIR6*^-8OOk8`iaHH-T&$r;wUuf`Q9z`+Yijws7#3%vQC%VGi0rD4vXF^)95Sn@qU!jM9*0LZz
-Q0djb$5Pq#r~m3dS?zshMy{_YHin|d-`BKRW4K^i&B^C^SO5-F`pZ#fS5X;Yv%L04fZIuk^d8!BE&AT
-SJ7``M$cAjx6x;FLLsuoRllujB|tb7n6`G^N|>VSx7i#>KYNaE<F%$v1#&&rtXjI2d|nYisix7r|3y}
-;DqdPGX0ype=sZFv9iAliKxN79HzK9F))pKMfLl3Vy}&Okp>q+|f)}OCjW8avX1a#5J$Ad;xX#fPr+J
-;GtGqXFOm9t~o_uO+j!I}tL9+<2eF@<Vckj?@J`eV$_6!Oy8xI=>(p1TQYw3&0r_ECspq~V2+}{8y@k
-LUX5GF8sjK-9q^HMwNVFzRj2w*V;RWf$rmK7cSj`lmWF5T1)=ykz8<0bS$E8jD`3V%;+mrI`=TLlvY4
-=7Lqeo*H`2hue2uo*=$`!RzS!da5v_jTK@Gh#(xQ;{w?>&I0BbaCMzW3{z|PfegCV!@RptdnOi1Onj>
-`lKkOf}Ff{#q;&DO!S+W6Hd-bb-?`ZSN=ih-aJDp6|l>%`aBPQi8!=YZmtye@GBV)J;pZVH{uy=$+o`
-O`0?g;!jPajmBJLpoNru&=kGi|Jqeg7*y-^6_x<Cu`zOJ^^@JX!vpu&X4j@=kfP}W@1!`3K3gOLz7q5
-%p=JuPyu5F2h?j6hZn*uk_8k$I~Rp{m+M%MzRM(_LEq7OsgAW*g<F;T?LwrL|K28h8?QpV&|OTW+~L*
-Ypw@)UHh!ei#7LZq8!)tRO=j(DK2Zyd)sIA-I70b_euN4IFILktgx?cKfw%Us{B*&J@Rj9Uk`pg<4I1
-^T^R!Q0cLw9WTGp#I-Pg7!Gkoc}iDY)ogNR?S&QzN&uRhmm-;BP-ah5OPZTGK!6K=R~I(A71W3i>3&T
-?3>c3AY_%*p-Q0V7OpK&?Yk>s>(smtU+k)C{?`;&25V|zkMzmuXkI6cx$A)uSWGEI>lS?WiU<lJ=mEi
-$iW$mEgZAR)+S?)E8)^31>!i6DuoV`s(kc^a`wkAs802Bxw_;PDMAax8A;)f(pT7=Hd*mKAs*S*x(j9
-&6w2yJAO<{cP?}8$Hxkeh5n}py2@dIok?^2XhTZCQgTv+caHW**)Q@LfrpD7ON<(q>#um4hmrfLJj_J
-hNIv(9e<_Q*pNl&0;=gY0{X`vMVCD}9lpK-J&nQCrQ%wL}a0%5!N-7$^Y&jJ|;ba7Z$WgC4ii_C(z=j
-x2PWn!>7DWn~gqxf`GaMoWt!r^8gaSi>g0BZ*T}sgW#UOI`AIE$YR)x4$c^eq7M9|LcZfb?%DIYc-?l
-dx$+@k8EIdz~OVNlf3&>;$Alw$<%*ED?ecF+_BjbXf`Un!XNy0!=WKi>;sG$2Js;))7VUF>KGJaI<A1
-^eyU%13=D`j7E#crkn)u$WX)v?gVFx3Q=5r*^ldBwpIk1=LhP^Ba{o1}9fm_~Hw&@L(zvl)Y?cVkOjl
-QC%5ZXbKe>B)^Bi3C4;81Mh@=&M=&h|f0{Z-_4TAVajUZEG`fC6zx5DOntZR#J1^f<c{36ph+bY&`MV
-nbWH5d*{??X|%ZnpyhqxNCmR}qKbLpUDx+s0%2;t;H^c}zJUQ`XyWGP#KlvCBTz*t@r@IdUA`y-wN3r
->BRhu5hWuCRo1^NWGL90|tB3CP<06H!V$pc1J0<?!b3%(%9m?K5ViOsYCAcMc@8;Hf@oPQ5&m`&}XG%
-YJEW6EGnreARpl=!OASB^rPqS7<kFY@4*{(`Z&h41L!cDzHMzi(DwMbv+aM&LH57t0Q=~{_2Fmf^t9g
-shYt*?-}xs{O9KQH0000808trnOjT0OAae@<039X(03!eZ0B~t=FJE?LZe(wAFLiQkY-wUMFLiWjY%g
-?aZDntDbS`jt)mmF~+r|}s*RR--Mk8_tfz-HeS~Tj!wH4PhPV5=W=_9!W7v$C;7R4?^vk(34J?HENy9
-6l9X*<*EAts64b3fm?AXTS!Y_X_%(|2OAU~<>0&M>~xs_u<g*zac-?0zfQT2#ER4b!UpBn&fhCsc1T)
-@!k5s{`8_)7EmujAF7`%aR+x%$6J0D1Vskxdv*w6{W1Cy=H(kkm$}T6vh#Ef-GLYefQ@VZx^rbethxq
-?fv5Z%};mlKHi_X$4K?e-ph0GxfHFDs?q-Ty=D5rfFyTar@AxX{eo%H7}<!LJ@C30UlMm(ShxbT`mP3
-rpPemUIn&%SwfdVV&1`;#ygq6{r1G6=lu?Z=nXDLp;IihcTI6SC-*q6(0uRCEjQ~+iH^Z+PI}f+cGfM
-{lgOtmfYwgvWS(fwSjKSae`MH0<O4U?y({~)LlAqCY_e`^rH*7^t1zW5cD9VF}E7ifbR;juu>^1!JM!
-5}~fk6YTZ@<lNGS&&czWpx0nTHD)5ODfE(D{isd?T!8aP!vvJDlx=ZozeE1-zDb;_toCW_I=Z?*1xcS
-NLObeJwuoT?>{g)$aOgZe@Gdu~u~7xEpM?-^y~!)Pv|cxfYsy7HfvzQMY-l+^^xEd6V3FgZ$=ZK0je+
-snO*WL|PaKzzySdZH3_--w7i+jlsBF{;V3YT*lHhYH`~7c-)yEKmJ=b9aI`vV#Fc2g5(4d4X=y9<bEq
-bNwr%+7+G68xfpNOB$X!#dD(z|AmShCT>LDM+e<JC*h?eAC^|>UQH#o;OBrQ*!p0b}YfaAHH28a<Bpx
-8MY(}q?*+M}38{U*CAh-H3-iaa8Ge!x30*<2pkxM9*-U9M~m;phYKD-5N6zhEOslyENIr_~#D$Jo3&d
-6vm0cn%5s#e^PSa>w?htn$dh+sSZS?>BB<2%)Z6;x%d2(0#8`UH130UW#$@c;+gcVOv3bH#LDmI9<_?
-{?D0ZW6avOP^!0bG#Xh8pxrQ4jTCR8yRamwSx3Guq8g-)bK5$=V-{rRfoJi1Zv;AAl`1^SF;72Q{Cpe
-w4bjlS&Qr6-8@_UcK!Sh&%S&9`|G!IbseZ&)X$$i|I>1j2Xbg#s|^Mqq^<-AZKM%F3N+o=a60jxcgd6
-dhf(%b&RYqy7otHfT9mz!4<br=$SDPI$ZaL8Tp&9j2+3nzJoq#5&Le(}bJpjlb!MROf9TZ2dE}4BJ(u
-Tz$VS8n4F&GNDqb4ZS<L5EMG3GK9xPICqGw$HfQIY@v|vpj2L%3dfB!ysF2ao;;i7}=jJ+q5Txs^|=M
-Q*T)rgU61yBqULN_7~0YlN;0j&Z#)mSH5^RajEr3;D>ddAw2Cce^=9<nLxemz9sR&KWJ<@=8e>;{-fU
--h2179JrcHWc)I(@+Tnf56E-JdmoB<^VwdAnI%ouVactT8S-xfHOKW1t30OuO)_hHiRc4v=uZI9@Rh?
-?gZD+<_<N*CDO^{NlX)x-hp2UaNgK*FeKC<H(LKu-&=8=A-(?zl+m*$PH7hc<oTU~^X{I`65m1{?zp6
-8T$H@mA`)zH54Vw_ZE*xyWCs*i2ZOG(H$uZpO{cB!(q7~Bo*#6A7A4nE(6O&|yqGp%$sO8HSi<1a4zf
-d525}2OOEqf{o{y?O80gy@f54_J8M2cbN=B^dz*O}RRIvf+q~V_it7+s3mfy(+1{o@{-m-B3RqUYpj%
-^eimG)GRegbVEpFMeAAsBKCAHkJ-?BB{7q9bV%G6H7kJUfOFi$U%*V&{8qN(kn25Z)qb#E)sngUIW|I
-`>VzmHDEG=NH@f!_gLEgnry4&8`m&nsey>(HsSh;i(Dh%t1L!hX|F6#Y~I3%4|HlmeV(&e*AGwsQ)@I
-B5%}HzVJ=Kt@{pg$u*2!zR~m@EwrZY)7AWl1X=CmeS8X+@t@<HHV;qUq{ncT{vC1EhIb|sf2ai3LJ;u
-IK#|TaqpvP?=+rMeXCnMyEqU3^uh=D<g=-W>P=_qJe6eVt7B3cAYQrqDM;2-5rjH+JLWCN=RqH{{vAt
-`^LW+)zA)82goFiXuMfu6r06z4;Frdm+k8q(GQH=7*wKPPspk5}4L5z1V#PJ>EZ?E7dg39Rnz%?Qfpe
-ZpPts}5!B^Wy(stFwa0spmzAyf~IL1BGl*?OwBfB>rDM*tCxZJrZnBN2c|mzWBou4cdB&$MSK5LhH3G
-G|S{6CF(c)&eyMfhKLRvO$hxl~RfP{}7#`euMPKj>KbcbE+%JW4DFR0Lhjo-1j+IB&=MBLKx(e`F~7>
-8Y$ozewes9$-yE}OjByvKw34Wn7II4(MX=&M#DySot=l(25-<LI9Sm|!M$798^d-zfcAMpYV>!Gcgdp
-8n!%XoL;9QUkV-@+t;EAAyLn=>dvF%XnME=`StV=KOHE6sOGwNW)^w+g74}OiO(}!mf*Iu!-R~zRwF|
-!f{+8VoBW7dSU)br#B^*>o5I>p@ycQVAUyz;THzV)5H2{yZ=Sh@~GK}3!S;8N84h;S)pwhb5nmzlUb>
-BF*CSf0EzJ-lj!h65fIl_9VBnGpo5&N(}q;V1YbFty&A%*e?^v5uNv=N4(3>|5=LmJWDA6Mzh#uc~OJ
-afyV@?kdj{kLy=9qN}PFam5rS{F+v^>XMYZGS`sEbzx&?}J?T@p#|{+2zvxvRp<z6aKZpzy`TN-c{d}
-(M}cr{Bq0^uoY$6ZsCSq^!N+M&>p%x-_2QVhDkKg2}R5sl@3PFkx_BlOmWR{F?Am`RDM@G^n1fz(8m~
-b!Hqa>fReB(6$HUiQFnq4f#iONArXc!BhkCKVS`Z=jE_5BT-#D&30`hPd)^4K#z3f`4c?BZ`6y6KG&K
-LwU94m{3rU;~_b`-Ti+2sI+ORfHwspbEkE-&kY<|K1ic?f`WiWAwe7+W<B|gI_$K9C2Ypq=LyL3Hben
-Io)iN-!-c0C@}CCF3T^?wMts3W-m{~Eu@pf?{b9`jQ%<D=xLU!_orn$}ZTXxrjZM~hLGwBb|H_5lwhe
-xdQqy`oz8ot?%4%=qnH>}K1`xy?-UQYjz3O)9Wn!uS}dq-t1kUFY0c2V%snXa>e-*lN~jjKj$WZfgE;
-?I41{RBthobEr{P5){JmO@xUXpXs?LeqA-29|yq1oxyh-5q?~(-7Bdn7ryp5O^Xsy^A=qP&0;CswxOn
-aUSO3gmI=4zRKDIh612-0B`AUIf5rQtF!PGKHEbFPnD2@CzcL2C!v8M`TsFfJE0xU3^@O&H+0M!gTcm
-O1_?aRJ752^P==j0G{b8skE>8TIIvpky4q>cBjNET&yX0Q3#asGx&x?Q5Lxh(ztW{d#B7JDTLOmYXBx
-QHj;D#x5Q(<BYZ^`W|jxpyDnJ?3KB;(*5`oWA9I01)3ay)b`M_s{G4A~vXbm+t>oVX_m!lUp*uA>L^!
-&8RBL8ehpyOS0ij`tnOj$;%z2x(6bnqdh$ywW%h5GdX-y@O85HLVo+9+lj_bR1{cy+%##uC*)3<M$`L
-MHM;;iCQ1htz_yii0N#69UiPjE1ET~a^0>vY$ubIB&|jp|Nk!>y_?IC--I3^$yf1?9QrN3s-@oI3s30
-10V0d#Kc51aOP_9ovuRsBl^VaqX+7<z|75a!9qxm<CaX^p<KB1&;ZPn67sL$t2|Q<ewv(7YO9Q~y`y{
-aZ-}vZM3ZA}dm#R<Vk{q4la<uKZz*jW*f?)Ec@W@6{aODY|uc?9*Suva?ukoX&JN|iglMPs7P3S7sWW
-O>$*|m<06mJ*m5dg=Qexm;-A=IhxRPke(^kWr(O!hBOO9KQH0000808trnOv4^+5ex|c09P3R03QGV0
-B~t=FJE?LZe(wAFLiQkY-wUMFLiWjY%g_kY%XwlrCIxL+c*;b-G2p9qmYfdN*}<YXIz>-HoYy-?RL}j
-4!9ua(h_YGr9>@BCH4OG_YFzOl<hS4Fwj`0=FORJhV07diY*qa*0n|~7ED%+HjeS7)v9%35q^(WL{?~
-}MB${aZAVx0N|df`lo$n?JQv>!(F}+_=z`P2CvL1bH%6P$Xw(|D;LaJ#PT5svi;bv6He(rY-G;t5+B*
-6s3I3ah^*>r+w)C(vd|ip!W!Iz8nEgXAU8^m-<+Wo@vs#;qEBU8jP-NMybQ{KN_RHnvr^)9j3;J>};<
-b{?=S<cs0b{;gd<fLKMHC_(n|#!@n3CM3U>oO}eDv|Ri(g-Vc>mAWZ$6waKEM6t{MYl(aAlIwYwrNQE
-gn2894-{MkZ;sv7qm%+-=OJ(F`dpw44(%N9{BH{x#QNEwxI1{D{Yt&jS&`p%X-~;L{{hQixnl~7FHVp
-@|xXn)p{l`YQAdgV*a(EO;|wT*POl4h>F{Y&P`sIjN;BXl=TtxLP52qWiM(;d<D1Sv8-W=l}_G(yC}3
-N$t=X_;@w;J{4Xzl$_MT&7FKCzk!Oe$f<kMhSYf>uw~NK3P<9rLIi<MG7^OpeB+KF>B}MnhI|45){rF
-UgWL>uSpE1bvkt;93yIyPOf8^G2<1A&tBs<9xYWjHcQ-&Apk^hm(3bqd!VsKBpq*MA<7<iwsg`mTPNG
-of0EWd_wJ=3ZGI*=JNz_tyRkz+H4&`$FsaSkC4(G7tOF+B|D9UmX%U4Y}RzG{qyZny3Cm=sXvPpnX@B
-&NuXcgX7{FTUM!Q`*Ocu3&&%N+sPkR4&rh=WUKU&nP!#A()ci1oD!*yi2dtb12D4<z40&0mH3BCCDQd
-y^i=7c3akkYC~qDSiHjwRf&axYKWp;Ce5A=ULi|HgZ!YEL4dSA;V2)6`$}RSA;Hcl!FCLzeHTG@mvgm
-nN*71``Y7D3Hs6?vkes;I=OE=k>Q-kqtq(1YhGY-z{9&1~hiuY^eYWE{%*y-r2HSna_Wt>;u5Uo^<-h
-@;4JVdefG#%(F2S95(E`g=$tsP+!Imfi7&f}C%g5NlCL~w{$2>*H%Z=Ex98ic?tm0e0b?61+J1-pCjt
-5ar5bB}QlgYYiodb{4y_`cmGqyyhk*+h7g#OV=U^j}1ErV!6(}~E}xo;J=7Z=(ZTPj|E^ZSMsrPzi8j
-^{AC(l?@<=DWz8f9DnY&YaEXqrq0beEE`nLH72Bg+?|%IazDHRw74Lo>W{a;Nc--PT@~i?_@sY?Nm|E
-Y^^Ya5%UJU5{X)NlK@G;^NS}#SjzJpC3g2{Ful{T15K|wHS-rwyu>pvZrsZ{nu_;e=sq|`ct{XKQ7cI
->!cQ_Vjy*{5;Q_l9akAN<R4p~w4R0DzhYS!^<2ppLY=R_z!iJUCx27M#jw0BJWRF;eC}pVt^6_4FPXy
-*y16GeM_py3JNSJ&+-^Y~AJxV$=IdC{Y_dWdk4g6kgRy%ACu$(aW+k7wonD{&LBgn4O*$CdDXYT=Gil
-v@@M8vj1(_E~iv2KDEUkW8FyEjw*4Z~VZv#rk;5BZoQr4xoP6(DjI*l2;K1d@o^+T)NHjENH98SRUNI
-lBn<puI$vhGr-)oj5D*kXU8H5j=dq@{#f)XGEDQA`uizztXA*sa@+00y;!X@Qh$34Meum`eez?*^>WB
-@Njl=nt+&pP0I;I3Uc>Jd;0A8zO?l9?gT)uKNrAti_xVP+^9I+)NQpCrVqT$!2!QZ!IdBR6*p^fNHy5
-hO4bWmeg~S6wtmTzri&!6r1>%kNd{rhZ1a_@%SkyXBzpB%_GFmJg{C7&D+c3DX9f0*G*Y__%<;ug#Li
-~?J$TcZUIq=vrFTmM^SaX5ML&q>*01J~?HcKQ)rok-p3bq*tBw`5Yl!%FM<um1U`OdZaFlHB4}9qL=x
-|??gEEd?m^&Yf)hghdmxTETKPx{h1OYUeY07LDj<7j<Cxt2luwY`kL4K5>-D6}RCu2e2luZ-K;XIAn4
-zo_B%lX%Cr2hKjI{L5X0qW)P^wza>e`w2gJlWylEsJty)Xt}OY2S%JgFdb^IVK*_h}j`IEdEf}32GSi
-YwlHZ{50zMv)KGk30G3zD0%z?TKz^UI>I2K3tbBIbjvWY8O7sRYF(-1GPC^wXhxGF$g8&4L?KpU-{eX
-n8>qN-YcT$cGC;2%c6nXvtw+qj@wzM}O~zcQ?JTG#8G?Ed4>vcZ21;2Z*EShBkY~Davf?TVLRWbEY3n
-w+&if*z^n|s$Y8<n38c+7ClL8t+u|FX9DCMV!<aa#k_P_mTkpAXF`efef*FtAMP4Hk0I3~@V>3-rNY#
-i9%jd)>J!{6L@gNdh}v8U5c*gF|}9YMQ9jkDKqLmN89UJ3(X;V$0AjM*eslhYctErna<+N@7Du2LsvR
-nXPR*oMot$ItU;A$2^?kgto_+6l3f*5uz`WhcJL(Vua4J?(eKbENxnAplUKTKXIm!%-+kG-wI;9E;9T
-a;uNotHX$m*#{2q=~XF^4@f0}(C9cqQdjS3!{EG&t%<>XH3;qdPd7hx8i|%t8{bz?uGuN3sjF<KJj~z
-+n{^%JrBr?pyUsctpL8_KXTqUZi`{g;mj{WdNf8kF(F>c!?&urI4^P%(8jRM|UV=udc<WD`IPZ!zCNm
-lm*zE?Rlx=u{{H)P9R0{wxdy<fNSZ<71$?w8?!Wvl>1+h}DCFENm3Y}j6^$e$Yx;C-}PRDMV52Quk$f
-R6a&pO$=AES@q5*_UD-q-ig0kt#RL-rVBShzRU(<j_7v%k~jrWg9Zsu#+N{iwg`Ptw+3f)*%GK%~|=n
-;a?2{Q1zf6qiOpN0JR)+76R7B+~#tsoD<4nOz6^kB^%>XzETHQ3;(tkl#Z+K|}(b;Vv{J`FK!|zxO8}
-5_Wc{unu!mNoR?q|I0N$o~?!R^>k!9`<ZUakpiOhcjJc_;IP^{!OP(!-3)F)`izODHhJt;bh#I2oF?z
-?HtE^_f62cAP)h>@6aWAK2mnzTaZI*6Bm4mZ00656001BW003}la4%nWWo~3|axZmqY;0*_GcR>?X>2
-cdVQF+OaCyyC!D`z;5WV{=1{WF&T+v<&IfO>gKuLmal7lf~Y>li<R=Z|*WaGc@>`Jl~6WT%#?Vhw^-k
-W)EX0~*;hSZa$4O{0y)jR7LCL@sZ{bruevme>F#Wdb;sl-O}yo+vsW>4AuBA;b9x5NAM>~4{blF?{XP
-zm_~73ZaOxw1L!$*`YzyLt6fXm3+sRg-P_`raB!zDB0;cnr@1^dLyMd+1_;EvyM}k4ocO6O=&%f>xfv
-mJo=EeWVba-LbL;wLVIWS7s}SHUv}&JM^9kP$q>LapR0XGew4u4Y)#v4VsWz877At7T`f~C8pI>C}h&
-dG*lgdLT)S%JZwdU<4}2mC)5pP&RI9Pdeq1wvWCKvkGKl=6bkOVzDkCqN_2Qev!UL`P;zq4@Btp3U5h
-(Mcxgn;h4S<iD1;SyWOhB%xKx^q9S_)gA3R*cGJdQEnI5<zcL<6UL#?(I$M#5}=2LW11-GP8=d7eXy-
-yziZ6&SX=<mhcO%gzVa^}nvrX)b6KP}%yiVl!E+DaB`755XEoVyd}0G6+GTz+1q!4A8AiR|)A$ltKOV
-QxPr-7F`;-N5o?1s}UKt8ODs3*iWh-umC}KnRvT{`(CGg|u1Uo&C<jU#$J$)#zm>m)0DdOwJ#B6QchM
-Z$cqVCKU2l=ENs-;LcA_O9KQH0000808trnOmD%VI4%nS08l9a03-ka0B~t=FJE?LZe(wAFLz~PWo~0
-{WNB_^b1z?CX>MtBUtcb8dF@*LZrer@|6fnB7o(trN{o|SdoB?hupOl_>Nr8<w75$GYDKOr*3?qqE-m
-Yd26>GG?p`iWax?ouE<fa`$sJG>6_QBe&dkov{N`gv*&|UFC;TcPg`6Ms?%liB>k)XZ*^F_$B-DfV&P
-$VAE)qfD4<#=*a*=V8ELSO8GA^l1;A=J~a>2;-r)S5PKYdTeMjR26@|fna67qN<<tn&;-)`oM6^s1!g
-39%kpXFEgkETAEFh*XDkDojrlX;etm`R$X!q;j9QMTIT$<;yz<kWs75BDEDB(n{fBuh|bLRSgb)M*ki
-E?7WLCQpV$faLSD)A7ZmDOy=#o@YxEhVw!eISWHPVU|l$@C3AFVVX#m(^T|&W&xi@!tnViov~C{rt{;
-I@%g0J>-{)>H9326K@N$x?|<XLlRYxYmW*(^WI)a<Q_&orW|G{{G>NU5;WHIX_~aE^(iPfRFu(Wm@0Z
-VBT!a_L&&LxG{fj!Smxye1aPZA{qk~c61@3oms3~qoOB#(LFk1?yL7LikLj}(gE;F&P1aLsg?dm$=ak
-dttgTMV1*P|7F__fzNJwAOlMrGi0FJ^N>MU*6Anyp#h7cz$<4gw`22XkNMlnZdelJqm4ZU*Fda(Z?~Q
-YOL5g2;?0MiNnU-|^@l2tKgDip97{NB^{lSkas=iQWJxIeD!eW*+&PDrewTE`We=wr<hXFkT4Q1OYPD
-N}&#;1aQPfB9j}o8<zLf`A1FWqiLx4msCazbUQ?jl|eL!e4`Dh2Oy~^G5k`IDgB0o0@i^W5Rn5cFm$z
-pl;Wq83AtvQb(Y7XR5fNd{`!$pE)rs`{v83@3MTIFS!&R)VU9SN&sh$UP88BH%!4J9i(vYGwF$t2zH-
-%+;KMA&1J%u|bIN*=L<@ZY3IZbuVCN%a;RQG`LeJ|n2#64wV1S^@@$9hck{~M8{+bIQbj1R#EWVD8j_
-jcUhlO`Sqqi5o{4hTM@$7<3&c46+^(xN_9(y$oDg=XwHH`W!{Q)^d2{Rg9-@)S|-0%;`Uk;nHc4oDEZ
-qZuF!BmCsd)hw=)g&t<M#YSgITca?f^wU=e2KA^Qpt=eIu<PU75G@+!;;_)tj<2<Hs`Sk=`_o(i&bC2
-)C9BD=Ny(4_F&@@&ybT7DKxD88mQ2V7%?9|{7aDO6_YOCjsX^BJYp+3vJ@i_1MmfmU1fP97fZe6q*!5
-2hL|=v8WU}r2z-Lk!|Itt5n-O_%pavMA<+a;3f>H+HiJ(|Hv1WXJtSa;06quPi;T0WHA}&-dA8=(91V
-BAfHbJ~Tp4&nz(^)mG=c>9`s@Au{qKhQ{n)&pns+E|P-NBThx=MzwFLx$3p2f~+M(~gm2dgm`P-a$0}
-TqSN5G&9mk*XSURI0AT(5)U@I;jr43zMpdRBV=kf?f~1R-lFr=)1fvYS8@K%s&pmyZB*31_ia5vdHP3
-hr%)B%vW8Zcz>sKF>-Pa5<|BSgG0?nj^c#wA6P<Dy{8n51hWKF{|W>!6peXs<MTEB4UvhX^ioxin(7C
-Q>h4>>n6fCf#t}qwsvf4k!Dn^BvsVP>~C=W9Wc})$~dchreit;%|rXFZ$E@t9(INKafBg9Sfc8V8|xb
-T2z?jdCa5e`a97+QFE!BJQoOe_TT+@pyA+Us-9}KL;9pP|8dTw*D-)0NJj-{ANPy#l3MysZHp&qCp3?
-T-pcM}-hF&u|jKkaJ{&bwEBNFF0eebn7N4=2<$XB^XzG`bT*a8P-+6rXauoVDa0kolyk$4LzD|WS~D6
-qZ@^7``W=s?$T6&Vp28X}?Ws#IlBh^d&3?R}r1!IN1bSrDiYtjhZ-g@z%CXsXkMxp7qLcL;E@K`93ND
-$u+DIo)>{D{)w|P=I5cCbJTJ?@idA;@cUBucHuOc#R3>1qT!w;+$P!(aEO`ps64PB@-EjeZkVX&ONp8
-uDp)~zR6t5KDC8*ZgEbpH_F*6HygEq>pd>7BVUOl1W&miUR?rZJ>}rab!1XzyVA$lV?%kC*fnBp!cLz
-`=xl-apn^Yk7bDePgs|}7+w*Z_?ZLMxgJr#X(q5ghvNtgeOTt$LRNy&HQ|#W#%r+zpV?`W#V1N{gs@K
-SDPZU4;8mQC8)xe}NB^-N$*+yClcfGaiPW{5Ryl2r`MwnE+KV}ErT_|;?B+j5whMOaUgmr@_IC=5huV
-r6#a&X>erQ$|?2VxGORt~%it6z{->*=VL%pJp!>9h|Gta6*>7)+<o+Cp@qy0m$xs{#|C1*_T`rCD38)
-l<0U6Gn4ru)uaxR@xtLR2;mjuiTE7Ek^?K>V>jJp_A$?TRM<a4no$LNpN%ss~Vt#W<7BE5DzW!T`AiM
-cfSsQ?eW2z{ddDwy>IE_BzPsh-*Je+kgTERgSj>cFVJL}-C(fWE1{zDo#Lq<2uX7(khMSa-rhca3V+8
-P71PGQ+3wB5;N9JV#wcv7pp%^ijX|T66ZqRD46~IL^vDQuT3)kc3~Me@)&s_VhgybBJ_z7QHgk`H?vA
--<%Yfs5(P#aBvqe4SHUivwzO#`XxIxlzQ5hu0gE-*}zqF3rds(FEz0r(fE!4vDE>F6ZL5&t?I@>wtv{
-O%82y{Auq%}`+fp;A)iY4swa{=EN&x)%B)(8ynd<nOrdV^#oY0aSD!PQmH)QD8&S&Zze>w#rn?E&;LT
-Vldp<8$OScGs7nMASg^XC>Sf+x3~kUA3^Xg+8<<EUTD<p~n1e*kG&`KsC>+7f{`|!`h6Y&e+vCA!m9?
-1#GBXXFSSv6P@Z7DsR`uGS(FD72}|)%#b^DVlFHfZ1kC3TGf)XTiGwEYuB0bX}j?4v{kbhQb%2779D$
-=gr#w(@$Ah9g2WJMKf#r$xaLCLkm~Mf-3Qd-VVOMiyRKrUp}?cKodm)S<n!nne^O{97_+|>*w=*B$N-
-{9lhmgqW>RUja4)3zGetS`u`hMn7I_DW-mJDT%Nf1aUan1R_5fa}JG))bLQU+jaO1esCOI=4Zl}5Csb
-`)C={(^yJ-o~dXTI`V&iRQmZn0$Nu{B<M|2OxwHr>e}9l~mYoI?2p{m#b^|Hdl$@xy;ioz${A>twS&w
-t~mu_=C1TqGg1RCgDr2JKFs9WUhPCYWP*=aMMNAS}z9>?bNED4{B-n6STo^2n&P5FAfX)L&#@Eg&v)C
-)WYTvt-`-pRQT`g6aVa??hKGm4bgUQ-9I;M@TKNs;b+eaDiK;Y#G(4oSe+I4BP<RIJg>1-wPLkWWrlT
-T)Y(Q$yT=>4yp5l*l6lF1MX|hM#AL&qsV6Y@&zP^t@s|)oZ!RageF2WzHO1w288!48c5)1inxW$^U;_
-;irAvtiQ|B}q?0rr}_EQR7hU0udks1G?NX#VHb{edQ2Gu?6j!B^3BvPBz)6W@?lZZ<5qY=-@GRvKd9l
-Ze%Vv?`_Wb_;_cr)8-VqP*HseVia_u{BMb)Z?R9-aT=!HpnoH4CL0wA`F(Nu2JeenL|c3|-%~`=Hv@H
-nKHze{JR|mT2cen$d0hZzhHyW!$il$K;V3AL1djpDdINR%0q@9o#h>RuNg(xnTw;TGffLyVV;ZxLaHf
-y0;{j4qtVR1Cy!}Sx>lWX5d~bsxwtGo1SmRUQ3<3-QKQ`w!PS`K6dtpf23|t$?|>ke`tcBF->&S*4A9
-qJsETee?R%?j%i*;CEw|8(FmU{)4&cuvrmT*v%PS=1O6{iO9KQH0000808trnOvkMViv<P%023ns03r
-YY0B~t=FJE?LZe(wAFLz~PWo~0{WNB_^b1!URVr6V|E^v8`noV=FHV}aC`4wt<@FmJvU_R`b9{PS9I+
-OO29^M;+v0^L6-~rq??X<tWfH6qBE5JD<ULIEaC9&+}@$vEDfz_W6xs_Rx?^L!gpVN3N)3TNShd;L)e
-vi-Weh0hVz^a^82dN5{#V7fE<2Fft{w&n~P;J=P`=88N3Wse!*{eF`8GDV-D!b9CN@P~b4g2!??TM9A
-vX|e!e*fe3JA2Cuwv$z?(y~_l*ckpZ`|;xk`<AmTubAAa>Ze-t=RuY1O{J36zvD}lpW;d-ahiUzz071
-0S8~@ZeLCK(em;LbJiPq+<@?Jk`-T0}nz6WKs&-9sQU6@3Hy$oFt+@U3sbhM%{y_{z02BH?M%Y4aPtB
-DMO3oApp|bnF8G$H-(p2VY9k|TV$VDyWVd$;7(`y?f8#V>1f{Ue?2C>2s(1G4kU^Lgp4%~=!7<4oNrV
-f!Y5`-bNfkVJuGT<%>xJx_ZqJXcbL9B2DbZr55Q5<L3*nv&JLlp2HOx^K-yGFnfOn^hcS7g9fDBvsFn
-H3DUSWbgj;Rv|01$>3#IK##cqyyfA>1sUSD<j|tCcq)!N&OH=>w~_zX#l+*)GkvRJ(L-b_S%D)Sy{s4
-!OVD;%s|kaV`DVe#tx)2(}QslZ((qBus_4&@|5#n8QN?#5Bo;sOL8j^pqc@;xz?>EK$)E4ddFBR+()_
-g={OP~*Sr}A)g;(dj}uHUjZGW@(Q}#tqq$ypApPVbGP5tFJR&dvnXy*S0H%2rt(|F5UvL^kZ4&`%5;8
-miN}(l=0Zd_FNg)J-Nw53N%&@To=@j;0dC4Mqi9k3Bu-~pBy{|)D6bHF2<OkfYJ*Z!%oC#58LfUHrq_
-=AbQ|Qjnh*ur~t%Vz+%*<H21L-ro2mey#B~E9=aY!M3;)eCvg(FFxXBwL3`{s=ZtWTmtY51f8b+ZH4H
-~JqN*`(65Yzc$JD#u6@B*~O|+oDP6_6*<Y?p>f}TUc6SL<(D5F7PXXpj%miI!|F~gb*ogJ*pu3x;4Ez
-?$?AjO=5726t<2{;09}Q^>jT^A%sVk-Jv~qkGTp9xaArlFYZwNjhX}?h#Dzih{M$=D4GND3k_Wc?@n=
-|vMMhRdK?B}$JGMLL5f4#DDKK@5ijynoQ<x#%S#>x@GWKWp|V~6al3>vs?RAbBnHPw6C}w>mE3ohGwj
-qw<8~%z;doHxK(-fwQu789y>dz~iMF5^Ge8gq2-*Mv3=nn$dNj^T6<yuu6&Gv2-#a?mk7436QFsrMXu
-CWf?a*i_@R>rR{b@?ppN=*YJFJ#Q`>G~u6{79fXgLSPN=MO=Y~dl?EL%I&XqhQAMFnU_Vf5|jrQ}4#k
-f<ReOWOgZ4F{XnBE;h^4Rr|vT-pE^7yt)-6xxD#{G*{nqu^Oe8=t~!TMeM8+bW!cVx^<#+8zNsQk!LK
-hc@-PChBz<t9euPYEIw~PNIg4tbrA%0XUf<6Wf5J26%)49&LaJ41gmx3T;8$sB5TC7~s<e_`m=-rJ>L
-k48{xy2m=DzfB+Z(XABhDf_P-2p&?;FNE;9W1K=AnjW(Sa9Nj{(0bh<qtTNTNZWcH>s7#g;__o+@kHf
-*T-#V^<=cPf^Th9w`Sa^T3=>(+#5)pwA1P{$er$OKWm`QZU8Hl+~Tsfu1Tt$RS7j=<$@qL!_cddv+mv
-nIlZq=SRjBa8L;fG_Hl!h)HNit3-GLe#6%0RCCN~i%^<Rv*DcW<ZaJwC@>?JQ~`e?Q-$?i*angsz;z0
-MwS2vveGTYxCGhHBuLilSx?~)LZqg%y72CsFB`Zlgj8AXYa86KwK-}K%I??W^fR(aQB1474N#oh`Vx1
-Bj(!F9??s5laOOEKy@8@{!(ZyA%ePZRQ?C3Z!OFxy9pihLK<(MBveL8)Y!yzqsE}M6>5DO4?zt@m;%r
-}Icvi`6wI!=jbIHmYX<8s8Yi27eh~f^oalqtz))as;uK&ht!==r{8Gw-@8nzkG}&p-Cqw-7@bAO_P)h
->@6aWAK2mnzTaZFHuF&{(%000>U001Na003}la4%nWWo~3|axZsfVr6b)Z)9n1XLB!YYiwa+Wo&aUaC
-yB`O^@0z5WVMDOsSBaie}qAB5~;Ma#)G>P<lXOQDl+<ymf5XHUd<&zkU6Y1hG_mtRp3k{pOA5J<nh;$
-TINbfNPYMs=3_SqWLM<8ikEJfB!X7(0AOTWQI8ex5G=0!~l(|_X3NAA6H7B4BzhD81B0%+<y9e3+ofi
-d7~uEndUN~1+P$A9K+rGVFVTtW{>yNZ}TZ^lz|!@<HCCCK`4SZS{Vn=R>{nn(>PLWjA~$Sgy3sv0sc>
-Elo=i?)D9lw>eLuzu0jffzxHU|>(DH#aRba+G_DltfQDLUeARiPNIQ_$U@~cEMS|uLW6<r5Y<F5lFD3
->tsZZ2WX=a>-2`mXAPpQx=x8C+D1$<>1x(H~kaVogR4M^7f4~O2vVzGb+1yVV{n!9&?>Bo*+*l>a1zi
-jVR!yK=e5T{;_I;8HdWT8)4Hv4inoz1;0zca7PDxRe+%1af0!=MJWp%*?yRGt?i2(KyGlYG?UA>uokm
-L%vxRu|yB2ZsVHf4Z$QC*U$(Jnt~8Ep6{fw9(%oR@1zw(X%2Y%vPMg=INdBJRRqf^bWTbcIa3`fSym9
-iYKcCY}m0BD7_YbM*XZU`y4%ro(GN;nV&CPfk%h3rhQ5hUPC(`TK^tBNdiNlEer9_2cTWTk8n<wryTk
-9(cenWv<}J1A9B$qgcQ$;OBzABZx_CSvJ5n385)d~Wy82EOVYND?<z<8ej+>P^!Vnc6RfZrtKzU@?yx
-PC+1{L+DcBh7c>z#M0|XQR000O8Q5kVe7MngDx&;6Lq8R`HApigXaA|NaUv_0~WN&gWcV%K_Zewp`X>
-Mn8FLY&dbaO6nd9_zdZ`(!?zUx;k5(K0INswG5kp%c)#S&mZbqdHiSq8DBR`xbDDR7sueCeV6BfS<V(
-B6AX`%C&uI{PA*FY94fuuO6}-#3q)of*AGLA;{T?HHweJ#4*t^{UlE@OdCUiPS6B<AiZ0mw&2!l=vC)
-F{1$zl8B|06SR&KG}RP6B{dG>&0|7u@Aw#fG`HxaKR7}DBU;e=I6@1&p^=gfX+R=I#%QuQ?;u79nqPd
-JUM{ARdqp^=Ap>e@^g4;}k>{;bo+iZe5WU~T2}fx}!35%kU{ZoZrUiTEy&J~ymvqxX^RvlxzUTn0knb
-SrJzNFOGmG*;zmYatpNl9+$UTWT4$q}{(y`ZMD8$<5tJ$#KYPD8mjWA;*;a-9%Bg`e+fNVI8qYhf9QK
-0VL;^daW<?WXTan~M8y*zmwX9gHyw=63q6f4Teb6i3oRw~vc6mdqc(I&yS_jrt=7!u<vNpfLfBRZ1?1
-Isi?;>2~%=?X--e*1>?9P}nvW!w~5;f2@-Ev|Mzd5%={T?dk{J9OH;2;UQQdW!Tyo#^KSM6YK1ii+(2
-KP1t9qG*{cBO$-!dvb#fh%$5;M?~z~50Cr~PLB+7uQ9^kel4Ql+C5u*ytqIQcjC;l4GxGttmRlPl%#F
-m1C3Vk1M3b>-ksE1Nm<+-4&RNsgM(lp<}^ACGC#YzxI99Ou*^iHf%l(3F9*f2$v|}DD11Z#hP<axr6N
-W-{Yv>`&rW(AhNZ+8rAw{=N*A5{L~7-#+_=8ubd+pcc;w1QWtUoQmw~D@xkVh%<fQ_%CuBn~7wWJ39W
-;Qylbdm&n#C#Kq`ZSXbZXZ>_Zp~f&|A%5bQGW_e3Wrl(MTJvZyKenn(AKH@s|mdF$vgKExB&Vq(VTGU
-LIIUY6YfI5Na`vaCmx^q@)Z|R+lW%g}%WO4e4b&RoS8@!HOXU1o;?-$aHHY4gf<qA?Pa(p**YfLp+Z2
-1eAva5`YozsvPWra0)%B-L7P#PC0?ekC(XGiB2P_O(lD=$eZ>ymprm@<Zae>mfPuUxt&bl3)kSg<ra^
-?Sw}NE?Ojx+Q#*hEb`Y-6*{^R7h8n$xLF>kZqtMwvVWF)J(HUH9w^>>*x5K^&mZ`L=zWn?1?|F&I-nE
-}%s0bg!lyACfu8Ko$XR+(<B#^_^@o)#TfYQu>U%uHK`dt%AeHIr9YfKX7SI#Nuf$}>v`Sg9OLBVVaUm
-)-Ims_%%ygPXB6HCG1eRnd=l{Dy>DLrH)^z5S}Ea{l<)}j4q(6LO(sNb*mWrx)bk!fI*mNx}Er&4}Rr
-n}<YK$Lr_h~`fbg$EGrq}h`v_w0zsm%}vQMfQ}3WwQPDFE4qzRTfL0>7S}O*!4~Y!)X@Ii;-0%UQ#^s
-(b|_?0O9q45Z{967#CW%HR0*liFekr$77H21f~m@MshM-!(i*<;EQL*4r^@4rpIg~DNd1%6r~@gFlqI
-EjA>-%NZZYN<76kcx7cy^0EwaYIGhY+1q-3y3w=kzFs{PY@}3Nin4q3d6NZxLc{EwhS0f@C>7E=lZS=
-?pXX#X=bvpWd>YM*Z0nXJ_*zq!*&1UBZs&LG(EN}9EcDSDHQpuB}&xPWsvEq+!f9=arns=VzQE94q{&
-wp)&#HT&)aZwo({-1zn!~>Bra;hzN=+lOGN%<X>%(*;k8HWZ*LFwW)Y!tWaNFp@Pt7M$#WH#T4nk6ct
-Tg8)t=TU>`F&X?)1;qjxref;iTUODe4Eeo_nmxMhDkb|IEK9`$+Q}ojpZcUdP3IIvL?@zx)l<zlMdJy
-z}H`H2l&%+yBfWQss&H|HC!PQzR%$X9`F#Z*wMp?p{OvV>konhE}BK$jl_S!Bp&1vu!(!kXPbnpI?Pg
-WKGmRxgXd~|KB874S2Lt#pju9?vGpHNO9KQH0000808trnOh|7<zN7>I0MZZu04e|g0B~t=FJE?LZe(
-wAFLz~PWo~0{WNB_^b1!&bb#rBMUu0!wX>Mg?E^v9Jmu-97G!%xv=U0f7l7yupPS-XL3()li3S*RYFk
-ml1mW~>O;{@5EEie1+DE3kGq+LJkB46%vEK54~vD~ZP5^Ao~{Bk6gr5QGw&1Rz^-0zAK%Il$`cRg7aW
-G9+Tnv<@^-`@YL7dXsCI$LBkqr8-5I?u)2h;mBedS|uR4lgGBF1>o%NX-{FHocsdBXQ(IG3ZAFk=%%j
-bmkVikc%|0@6J+1c|jxb_~N)L3L^33?C9j_#fdO;D>Rid%?h`4<z?)ACMFZJESHuhlU03lTZ(0#x)Nx
-Tr6pOJ6^#ZDtgb4THnz65Trn;Yhv#SRg34r3)K}W|O}#4VjA{wzR(nyqpv-hdnlF}RSCF-HTZ~&pX;W
-3U-0gyYmRwCa@7PmQX=idV;Waj9ch?=8lrqVv6Sj17|M!->#;q-@tGFe%;4D|Re!|&FRjc*=xI4mI-`
-5*=8e}#;b^WLJ?8|DI-aXBE*?;}6Vvp&*VtE9LeOFiCr`XMoZWMc~tyt_uX-Upr*wvYASBI<X7sespe
-c`6un)-~SzGrGZv^jNk#Mdvpn9cPvqt$75i>{_l(%j6&Sm0?tbC=rH8o8X&xV8CWx4P9({iw$EyVB{^
-X_uS3F;u7ZP#PXcJ;RRg9;iFF)+=n>%8#?YwW#cEWk1GN;P6$|*D*G^+vsqIj`@L!=c@<iu8H%Ta_as
-h?T%c$`jewvLBh)XlG=m4{mw`%Y?_zt)@p-o+Y;MCP2IT@sd2YH6478N$ekjWJP`fs(}RA$(`js;3)l
-9#&8=70{eEj5Mj;%8a5sbxL%0{h{SY36aOlI*2YDDwLa2Ob!!-(_S%*=mGzyhQq0%T+8ih)uP-zq@jY
-6f-FobakWe7vHkqV&>VW>Cq^$O+(%qDY-`5|+g`BBYgt6Ar5zTRPe%zVJ?GIy9g<|j<wEZ-^LCf_69A
-m1I|8s8V+6yK2%^Hb&{=9u{z^K<4G%tPj5<`MIldBQwpe#!ibdB*&j`3>_4^IPUq=6B3<=J(8J%nRmo
-<`2vtnJ<_>F@I+M!hGo;^(ziuGv6>L%wL)Q9Qi}!Pmn)8{_OaJbIF`CQ|52X-<cV6#`JI3oVj5B!St_
-J!St`?lKCg|ih0evVgAMZoB0p(U*_BOJ8-amXP4$+*vBNoWPr&oCJ!;$!(<<m15AdP#F$7-5=;~(8WX
-|<ePZ;9(I-Zq7=2>&iP0xUpBQ~&^oh|YMxPjcV)Tj8Cq|zbeI)uw^pWTz(MO_>L?4Mh5`854Nc55DBh
-g2qk3=7dJ`#Nr^hwYsL7xPD67)&XCqbVCeG>FZ&?iBk1bq_pNzf-jp9Fmr`Y7~K=%dg_p^rizg+2;>6
-#6LiQRt)4N1=~GAB8>&eKh)L^wH>}(MO|?Mjwqn8hteSX!OzOqtQpBk47JjJ{o-peF%LBeF%LBeF%LB
-eF%LBeF%LBeF%LBeF%LBeF%LF`WW;v=wr~wppQWxgFXg*4Eh-KG3aB^$DofvAA>%|`E=@kuTS^`L{$I
-xHa5TI!q<oYvPza|rrWo_P5%Q>O9KQH0000808trnOppzSL#F}&0K^CY02lxO0B~t=FJo_QZDDR?b1z
-?CX>MtBUtcb8d3}{li`y^|hVT9rBE7_rhV6ABr*xMVdMNaZ5*DMi#)*h51xY4JOaFUEU;g&ykd<binP
-}d3EU#9p>?<wL^a!L>(o!zDJQ6Adx$p~y>Y7SsvK4ZbRy8S#s<DlRq9DA!C~XOSHA*xVim=ZDhuPbd?
-G_gSmMfW(_HASzpqVVDu2Lw<QqIS?U(TpBz#mBbv)?V#Cu&ZK{e<f`ND!Bn#Pu>MxUq@+g6n0nJVAMG
-<#3y2)&SLId)9A$_Xd4Z*OtZgGRdW}&guw%4%=nEk)w<sDX^S#Jpr`*FSki-mL;fQytHIT{$>O}liAo
-xTEpWszVZ0L=7<hr0qZ#&p<W~+owW(+A^{m_AE7}kVx8;>>LLLdiXEw8Fo0u?BRUQTc=U`!b`%Y0Z#*
-N`iv*-UmdS)(C_sHrBh(LVvVVQ2m1dyP>cfl(vn|YvFk}6stBDoUre;i?HZ_@_&HR{7hG>($VCxJjas
-*qL27{V|S$hqD?Y`><@<*SA_v>#Cf*E4)IRQr2Q8D5a-K2|{gd+Ex*am;xY~8)=3-F4>vZ0{+lr`fPY
-J+kYu56K9Shse#2d}Lj-N}6c5C&#T4RW_Wy3WHPDy4_#ElNR+AzZcvx{`O-FIms<+tg)WJzjG`b=QK+
->%`ml)FQO8>V2uS20Wls$e+#KOpI5R;IHXAa)nEw3=}oBcp;n6hA*=7f3`whL8tx#n~s3Uq`<J9sL>h
-jC{f-TH7wI9q5<Ema`f-R!^?~x5q+i@jVg^Tu30cQcp6e2ho`CJ8o%?doYnVk)2r`u@ioEV<}wZ+Uh)
-=$TL~9Sep1oElh#TPE4(9(j1x)1=-_*)LC5igK+tA8_k$0&stP*AKzJNdH)-59u8W=TB+vc>P)h>@6a
-WAK2mnzTaZDXyJ74Vq003qM000#L003}la4%zTZEaz0WOFZLXk}w-E^v9RQ(udtFc5$DQw&0>f(ZM1;
-M2lA9s77M%OYtUZLTr#GI5uF`<q0q^(=dEY$&wGncu&es(!G}gSK6#OqV3Bvpo!IC{Kb=+P)X20W}pp
-PmgPj9ncA{tf5k#QC^n9_)t6iJt~Ji8c%D_=#{3WutQ%fLtbc&P2DK+PMyYxm?TLMg$}AkUCHG?;$2q
-PM)X+MIhRQ-h~PPJ&I+^nJO7pdpEON>qEqb^Zd@=3c@Z5FoW(l=8y(olNh35kplQ%Zg;a89L<nT8;~0
-${<JCyq&UZ@*z+rH<gI7C5{cp<)8d;0GhW7tdaZDmmgDtqxWQ4jcV5TWRxQ=F{v5G?^Ci^7XOj{{*ZH
->NG--RYDfG%pNvOK@R^ooch4?`sGmcC%wtHAZ1srKW}qKZ7Z!L`;!WehSYTm^@7!I;m1s_H;TI6wp_I
-nZAyeVla>`^tB8#2)UT7x+8=z_K$CwkKnv0$$(pEqyrCvX#oTHru_7TXZ1c&rB137w~ab@(hZ=Sig?7
-OpAvI|L|1YTiDcn?v__T`cdfM`tgju$og5(CgqR-uM}MEI4y82`wI7u5hj~|Va%8Ny-@9b2Y{1%9MLu
-vhkkSho^F@O|B`LVeQ4>6g_E-vH1{Tm2Q?brhCKNLP)h>@6aWAK2mnzTaZE75%(G_$005N<000^Q003
-}la4%zTZEaz0WOFZLZ*6dFWprt8ZZ2?ntybS}(>xS?_g`^UI>jDML|-fQVT>Y8A0Mr{A%xfzWr@=n@=
-LbEXs7+}T-#}rG-VQqyd<{oJwEsN*iI_T9KtZIbuD=qg2<~<YKZPtnbn$yu1!eOueOS$CZ!Tpa33iim
-w6r)$v*GWH3@lpalHsHm;bLmEN-rrA7Kuo(TKb<d2mM61J5$10JE!%Yf%=UbR;#7#8On6sTU$S;u|p1
-!iU$F>#NnxHBR$H03Q#zJ$N%aX^2Q+n@<^WF(!SzSbg|1r!c0r8Gc@_-(Al~<EOUu_5AL61h=;~=jgF
-fmnLjJZohvMyt-P27oTpHds!CqDU7GUfRSg?@Z;c@knl9BGY$TGIO1+ZF||*?+a2ml>ms&;$HAt|tc;
-@!9!r^^hUSHRl1B;n7qRO;bi_p`qRO@>WU&b-$WV{25|lb1AB$sy$dfWS;OSjQjaX;k|M!9dsW>4)Xn
-ObY+$7uC6-PO<pPg!eHrCBVVN_=bGz@j?N%KfQn1n({qEO%q@cknI&0yT3Gk?l@XoIR@>c+Jc#RgQB2
-@SVkarqBivJM#P!iaHwYmzjA5j{~X8{s<cHF_q5#95@2*_Mrd%?72-o6Rf>488!|X%&~S-_g2+dk(eY
-38ZD)-7ZBiY7{G?oa4^(+9A)?R%43XnxO&uOSm4f>9`GWJw+jO7*fTvbOPs*+$emVe}8P4yLk|q4r-i
-$Nn*hPqnk|**>RqPWu+C;H1WZ{J&XvV#D17Vq~~eR_w9Luru6T<NpCE&#+-Xfmw3RUg_J&uuzhoPV)a
-K7ZU*cTcr;?voO_ELP1D&MahY%{s>Nb|RKTv`zx!MMyMIT2_s8t*Szzd=e@ovX{2Trjt79?it16O;%K
-*<0E_G8!xRGUD(KnMrk*xK;tc%9>E*PzA4BRn3Zom~DALw2Ezz0mq)OK&g502NXsbarjEhp1qOh3Fug
-YSH+DC>tdj7`Q@6x@T?uHP2yz64H#KLI>(x3*$;2MCewiwN3S8#L<)>#qOPtTtTJ9tf^?$0p{fj2iU#
--{TCPJO_-|h5Nu%x3053ujdwzXNn(@+hUYXxRk-86q@&4Xq~uNub1l?d?{<lYo(zwr|+4%Ej(o50ZQc
-s-%3%?o~HdG82JTIO9KQH0000808trnOxYfprW6PO0D>L>02lxO0B~t=FJo_QZDDR?b1!6XcW!KNVPr
-0Fd9@i`v!k~4-M>P0Cu7Liq-pcyx!jp{w`ntzNp`wvU+&ytWRPv`0wR*Qcge5MIg$VYvK?m|9<V{@`&
-;5DMMbjg*y>iYEF-*Xgw%u{lqg%xGW)z*x%Z_wop^ofAB9@2j!2>5O~O9qtkGQ5s;BZsR28j@e@ZFj2
-*>M!ed<BJ6|$oGji|L0<p?9$&ppI{*v~DOtYWo(&-4g#po-;|K>*aT9>9B$yefnha-`I1UJf#|TA?Kh
-F1Msc;Y$7s%NnZBGlb;O@^WDP4}5qF%yTVdHwQiPlBrH<Rt<8TS^m+G&BSZX<Z87-+cHVg-pI*`>F>?
-ED9dVEfqP;A%S);hc?(#jpoP;jTB;uJR|Ky0dToAt1k%v_BRw%iP{#erEbhp=?%j7JLR$)b1}Th_n2J
-fOKolZJ@<cT(=SR+@N*wb4-n=J`6dyo&(#mpp|Gmg*Ijj`UI-Jb_garDP(2OY2%A64@^D}=zFaw9~qo
-oo=wGA3ik-{m1q8U@KJpn;8H1~Q-Ue7!~BmWm(Fhh#ggi+OzSK1LRoGKlm04hob&VS)j)J9EMKCpokE
-0T#h(I4QdO~1aeqP7Z53-5a{LcRd@C-UTi?wLFUP5DTkoL_dv^1A^(Ns<ecc5*_@s{MNiJ?$9C^^z;!
-iH|oC%87R|l&|4DIHw}*uLfYWlR;1|1g-4Qq>D&RoN)_wgi^(8uCpvstUPYXmsFk<{CxTG)y2Cd)<Dw
-CQe;aIB~AtkKJIG3g#wX*&<Z3$_@sYcLL{^>e?Y%zEGtP4H!Ud#k3@0&Td`QdH9eH<4iw+_cc7WFh4t
-+YoLXcBYwqE4D#d}8Zs8t8V0GX%gu)#-qAt7pv6Rg3fNtbHz5y-rlF|BpcV=g*&dgZsD(0|=*Jf92ws
-7ASOzH6-SOj5r;OyW_+pIR*2`z+4hq{&-+zCL%G<~5GU=~Y|p|mY^Dj*G7i9K|(d}d{nM(brOf@Bfo0
-pK5#bv)wSXM$Z*QhkJ$9aQMT;-Jh$WUJ8+qGmy5euUT?x&*Wl#$c9!xdciahkPclT%XB9PyI0=>j@Qm
-t>0QU3cC*UU(&-9aWv1et!r#{c8K^aBX#-=-hYAi4a;Fu8IUXtG8*g})c?n9?+lBu#UNyugrtN!aWX&
-;vwy(K-yLCk8yhTCe=uWhY#Ag6;VMl>c2k;1z2Yzj4m`MmCJ)m9`8%oT2UrM_>!Bl-oD#D6>n0{S%pN
-dM3=*NMVf2Log_dQQisdZXi?VS*wd3i?Cj_OKh!>>er1;x6P7E_l`LcXYK*2y;nkHn*N-&_Vf(!w5gU
-}xyP!sm#Vfy^ICDw>dgQfIChxZ)+2Z`ZKyW!2|Y9RJ8cQd|cq75NP{;L>B)NL@9pj_k^f_sX;qo-OxA
-IP1RKF9g=z=IxNz8~BiLiwY83p`-}J@C<sUDIXXd=38j-Ic<35YpH5<ay>_3^sL;*j<=NCt8pi^1f!a
-67)Nfc|Ki;ud&%}32xfvbsddVyS-bGfIfq))~T2LZ}t!UEbI*`75&IuJY**++GZLRlPRdixe?|Js#%d
-)f(B*kW;19vR4OKel6dP0ui>tz{Qt7`gpKb(>tj3~cNoxW-R8on0Tzahg15cs)#H#yFt7n>4W0%+rsO
-BtGS7m?0e0Fg_Y?J}YiRAKFxvBg1_{7!5y5mCWhuDQnS|t&JU2E_Oal<DyXa{`D9m~rhUtSaxC&VjUY
-LdW0P{Th&Q9|gPWB+><dg`!qoWwNb2@t3?7{T=&9gUWgVlq|n!^nz!O;-Ra!Zl?DfJmn4GUX2sIvZ1R
-<uYc$VWunSt6;CiBzr9rpr3syIn0Dgk8h3vrNvlLy4e;_#~i6>>;7pKDNm{s0S%NjEezs=6uYnRo?#8
-6^ME92-TcP#W8h%i#={$u97LHm&4w!3-=V@RM;foIRJ!-!ry2H5id~vJqh4XPv@c#l*fNO*SiI2x{0Y
-BncXWZrqC=sUQDPW?%gz0j#!0ce{$fk-6kiqi_6$?RMWoNEC3v<)cr02ddH;K)6#%Wt3*0`ULt^_(~J
-3x*VO;%trWLW;Xk?a2v$OLg6Sg6ifHU0b{~zgwm86ur-Zy}o74Pkd~FgBDbCMZqXlTZU+88}WRq7aar
-3ow9bW67U{DzL(q!|6+Muu;vI|-d4hrKUv|N-01t@}T8MD8e%!V*dSS3(SOjbAjoFN7ejD_bNAOjT;k
-CR{&F`C;=C6g6bwmq0)h=v$;78eOQ>CGt1KC!&DC5JaIQ`$mo2@W(B#e>xg11*q3$c-Yqf0JWLPsw^2
-On5CEvjmGTC6VX&dH=)9$U8l$j}}oCmdd|utfqe8nwl_>*sm5eyu&)zd8gks!of9AOmB$iYGyjCp<!U
-Z?xmq(7)G0qJ1Gu3S3zO+V^H+!oHLcqrY3*wf=;*Up5dfKiNobc-o3~wQCyI2deSyvPGA3qptJL(Xj)
-{L%{&}-=nN<<pE;MlmK)(k+hDHR^3o#cfgd!&%O;QJFXLs1bGwn6shEH{ecPyInZ*lclUCL@^9GM$v8
--n16HjDS4#+Zow!tq7WRrXlyq*oZ9t)#A?x2bJ@K`U{sy5HTgvS<kblFIJLGO7PB{+@_2w~-2pW*dUg
-u@1}&3jJ<UqR?NTXIDvyaFcrGkIe=YujA%<h%)A^4!!^2DELQhdjpC#dG-8uTV<^1QY-O00;n48F5U*
-_VZxb0{{RM3jhEX0001RX>c!NZ*6U1Ze(*WW^!d^dSxzfd8Jm{j@vd6eb-kI1_H?&S?TivdfH@*q6Jd
-4P4kcj1TBqZ))dK-)OxpH-ytbk7YishF|aFft~_UkLp4Tqgwm#Wy#Y!I@3b<Gu%lI?cR=GhNd~!nvDb
-Iab<%iud?_l`Y34?E>uSM|RG(WrnH-q~H0zkGN4tl(oNSZ^!yH%A7L5V;7e>ptnhY-|05K{*`^5vRPL
-L$Y`wxH8Uw{7bcT$opMbk7VsRh?-r<AaMRdeeMKO#K83X#%1dRBs2OCCd}VQ1O!+}|ezf4ki-JU{kM_
-lQ<n$Ao~IXjYwB3l>Ghz&|}V(1CQ8G|F_$6-jWrS}_Ae;4aV;9T=&Qngd1yX}RN1KrF&Sr7|^`Vv$<1
-4iH)z2}y&jw-^<LqYWW%v{5bjqIBT$>!`3jqA@St|J4v;Dxq46>;dbnCwK?X?*837Y>NVG4#w<qax2?
-M_%$@xYFu(hX=Xt*Ik{t|wfML@Uj~ZfHn9z|MImzH9rnf5f9{z~o@i85T}=_WEm$31kb>-L;eYAD_{t
-v+Gn{F@FsZ@1GM)3VGGLXDTc%8FkoAps!+PP$FJG7P4jg-8rc4_yVC8cHq08MT3&fouR^FGwFIsGgbx
-|+?2`32`yG5Yz+xe3gEU~{OX+egAC0n9G;S2J|iCYrc!Tyuv2%B+wi@nhy7_Kp+;~m%n3;J5Zn@D)WW
-qlA_p4W6nzP*}mslSiyPrv=LMYfmw?j}C1r)E3?Ig-Y!6S;69JTC|fNpLC@BfTXl9XL&2&x?q>2vsq$
-Ny(OGWWzdzL))2t-Af}Qk4#wDLjF?|2hS5Xu4e+|6Jo>pePWihLLHgFBo$bsqE<vIH?++r`sg5D4!6V
-PTPQhT%b86sHWc4a#YZV#Ms%|oI3huseA)vJX80yF7-qZI!+4{&>i>ll_x(QB#h$tLeTj2pKEcBb383
-z`N=DvT{3E{kioX??*?4R2*TYmZgYXM~IT<%#q^(iC&VI<3EX>Bd>E$rthbt&2eqPUJe7sd?rKB@T;9
-cTxbv%dgTs#KVL)2gxm+gHfd`$F*Tbow?&PU(r10Wmn6+uO7Zt_*CSqVLLWr#fcV43v1iJh<KA0)nD_
-X|dSn4;G;b1>03u{gM$FP;EQSM$m(n`AcF%Q4w}*e|O;&B&|qBwCt=*+CUH_|-IsmR7#KmquQa-(aK$
-T6n%14WenAQNQ%#_!)`3)K{-jKs!~hj^nJP<?Q`-Bc=a0XBbB~q6gpik?rj6ZbAEgRk8SKg6E^S7(CZ
-m@P13uza*aU{{T=+0|XQR000O8Q5kVe_=)VKy#fFLJq7>(6aWAKaA|NaV{dJ3VQyq|FKA(NXfAMheN@
-|S)G!cz&sSKLR!OR?#q)|FRj5!TM5S%T3n0szOcK+?Hoj2$_l%v}W-G|UZahA7GIQqA7&Q>a8t=RT#)
-ufSGLG<*RlRq>#&eQP_Kw@G7pM8ytF{%gosag#CP@<*wb1m$EmUe4xU6T|_v3NJSjU~WtWq`D8FYI*-
-XB+pccNeJ4Dgy&otIDc0zpG)E6InOulL7KkGJgZ=Had&50A(DFCXLK_901<5I7i8&Kb}a+~;V^7?XTJ
-DRP8WJ-3$JA@dY@HvQ*^gy3^^brt{7s!=V%qd-J8_|~h6_eAsRiMM!Ts!sd{nne5~Mhc|jlAM5e3pIH
-bt|R+>bQcoc4gB)LzyQ)&(uf|2Q>0dC*T5Y=^$?kaL<xILKiLEnQo!uez?Vjgw;>EP?X*!X`KGiJO4=
-XfZ6JR~D5WFNdd$$g1n8XBBrT?Ok&Z>5=u|_4T_mJ%jAa)3rXbhcv=;xapPnbRMs|%FpD9|90MF^-ee
-SoqA%<2%%`j|Bc^zLc{%k>nC*AY3z~4RZTV+tuAuTol>@ruT|GKR@B`UDxrdhTSUWKogsddW0EAoc>-
-j&<d+dw+#b(v!I$39sC3AM#GI1nWv$h@;D*=;<>{4hECQwf=ELd-98(%e`u6k7v~n}lMmQC??nimjCS
-T0Z0DRJo}&3KA-DRy)xUsa&)kHo={LRU084i`|ytKEMgD!I*r5H-OtlPJ_POtZI~V2z0S6s74v=LN`v
-yt4PMV#?%{?r8|50F2|WF@f}4iUTZo%fwEXbC<qH~Of@WwM|N?Yhvg7^{=cYYNgT(7-CX!uwAhK`o(P
-_Fp4+$vlm<C*rRJ38gxh)G)@&nBIWJ@?;W=AByiqHz%OKa;^2{c_d@EmIqh8nCK^B1{(^Ri`+rghP`Y
-ccW0#Hi>1QY-O00;n48F5S=7SNrl0RRBj0{{RN0001RX>c!NZ*6U1Ze(*WXk~10E^v8mQcH{5Fc7}$R
-}3ye4y0z!rRgOsY|o*mun5H-+v-{mB$=%L{mQcCL}7I?@_aANOl!3S#@f-378wH}jkX^6)#+jM$d)@H
-?Tj<RR9Eh>)>3lSB=Bju9^m}%bb39X?_m6_(RiVid&0h2t1Tg<9=LPxhJ#rP<@(+KA`nhd6z5*wpbrR
-WwT0E%g+c@<E)kAEX8?_VM#sDPS3&^njMW|dUa5al!HwZ=r<wh|M@2~lHrRq4Rq1eO51^L^9e~@;tug
-1bJv!0Tlhd6wqV@;q&@(5b7`SDrL^c&~r@Q2QegF-kF&u@P@I5FUtwA{G19`v(u2XboOeo<Qs|>deL(
-p=cY1Oh}Yr|%R%gg($?|V!c;fA0v2&P_a^ktIpS2g$<hnJ_c81_eP3$WEhdpA|ugHU-pa+Pkxunos=T
-T~{UJ;^xIb%AlAqxw+#w#h@Wa|MOnX8)eCLau0*`>%QxHwMEhQpu+)!lXx#$d%tTBlRhV<-%dM-X(>f
-K&$^+s4}ST9|$SrG4IA@3;Qs*6|v0JR>lhD**u@}LGY>nUr<W}1QY-O00;n48F5TYC59HX4*&oJL;wI
-60001RX>c!NZ*6U1Ze(*WX>N0LVQg$JaCzk%YmcKi@_T-TFRKyBY{Kk)ZEaSXm+o3xty<GFHy`>&$N?
-wuHo+{0bmz<c_N(#(3>Xr6A3EvKYC7PmqF$~lm(A`9aU@Z+tIDciQAGGL7ez_vR*JMLS)}i0GxIzZ`#
-sP0_EzMqprt74due}_?3nL(%Iv*7R3%UC-4iV`AR}jGalV-mxa`1zv2@0sW0sfXRz3Sz6r#{TYLslqF
-Ct^J*$!FHc^($*H;ey?{Z{dU9a&c1v$6r%QpsX*Jkl)jfWFrw4R|VIT5^#|3w+{5S<#ebrzjKAJ{4P<
-u1LaViDJn}#s{F(5YQ616c$Q?+f0@;O%-t^*ov5!o4dP$ow%svyNajD2VUsMvt>=%(u<FY&~Iqos(7&
-gER$%`gag$*D<iI7&64QE3JHiEyl{)JwAl9jEC%zQyPyfnVMIyMsPiaJEV<3@c>ebvzG?$^@z5jWS%P
-!aVjNif80EA)MB*u9MT4P@ZNR?b&3g*aEB#yX2jH_Ax+E*WD~xZ3AnecT*&>QEdIYat0$7|<DXspE&K
-G?jSZYt3&*!eaNKWHNx@VFgdp9#RwkCJyyIZnApAzK(c;H#Wo|#;dN&+LKXs8pJvzYHVXg)N^|9XE<@
-<RLy8YWed*3W+i-%IO}#F&7y4uB|t{!x^SNKq9rBeaMQ{Dfc%4qb(&QV?0?s6y}yEemp{lstF%1HsTV
-^A*f79v|@aC!R1xiDraRd4@@QCZ#ZvoCyU`kuvZzm>eQgQo`_-k=oP3mM+m2V5Yzf2b#}Hf?naVg(Bn
-?ynIg{jCX${KYI1}6L~O3Su3@#Yxpn>2PmzJ7BMaKO9(xz8Sr(ArE9^TE+V8Y)1uRl;rwVUinQO<z^E
-sMAS-a#;*1*YdTD5Mo3I_kcAoJviWZWkyA^p&i@k(DuOFX`t7}>i$QSL&u_B1E3~K@|>a0eEI1~ZP68
-J#)(BAhULYk-_Al;&gUSSOXlm+ErkHvC%Ef!07Nw+DRfZ|$y0-6eo7)B9i6saD>D_EDo3jSS}pf(1-T
-cZh+<tETWNV_w9WF<Y(ViWX-z^1fH%MIqh_Q-*y`KIR!FdJc3{s@GA3Q5pH(0sl-TbiUia7msxU}vI)
-@RFw#0t<VFG^e5lhKM&ifq@t4ddZnLeUXf;*HykRXu>cq^r$%uYWBS3o_Kj68G9loX`yf1!D;45v^f$
-;GpV4RyR}ku_lZt^Uej5yKh$`O`3FPRXFe5I8H|aY8_OZ{99LxC*Bu7<JuMP2nnawZ11$pyNudBDXD3
-R}m#b@a>dXsS#8YR)7p-FB6<)pi$7qb?Hh~0tu&6AmE`av^FUH-_|81ghR0)a%WuZ60s|eVLrx-%Ker
-Mb*B%cA}0O3&S8ng(d4}&z3#gLKB4QMx0lzoJZKx>R~CEK4N;epCu>cs0VxiKY1gFxB~0|sj8x@de5J
-Z5t95Qr>2ula7BF_thjUo`wTpXxubk`+gufl?0QsnHV1tC&IU$%Ck%!rU5#f*QOUo2%E%q0(vTnikB^
-0-Lry+Z#9zOx0v)m$)hli2AAH^fsOl3017z;R}W=*s2)dZ3tI0Vw`IsmjlAIwTM!+CBboA*eDNzP%Kp
-J^^ww?p4I!W<>|$Kwi8fOt_x<1HJ_U)m}m&*$~pTLMX!BiMQU=SmBrWz!1zup2^HwmkPU5BzAnW&0pA
-aUX>#A{2*vjqFukt5#VfuBiiUu$l>b&yQ3h<Bvle?%s{<#HNdU`>QaNGTaA_PyM)|os0L1n653F}#9?
-FZc-hHQL*^Epnw)D!{MVuBLWiOtYh$vZvgOTLr%aY677FH&U+$lX`G%u{->c!fbz|<gTSeN<o@*E1G5
-&({nT+TU%B>_Z$|GZI6hxE+~S9Y)7-raq8`}yswf1B69e?CfIVZ|bzWJnhGjJa$jBCaqv=p{OGgMx=&
-?mvEt-o3s5=%t2Wy9(ui3I><!%lSn8v;E$yek!B>&_uo0bAm!N*yBn>1<D;L6DDoSADLS7g0~-)Mtu?
-{0v1P*(xJ@N5)k->Waw5@rCU|K#wGG=^`g*AYVq~$r(bS=`Ns`;$6^X@psQy?RzP|wU;!<Wr$8F6><f
-JKuzkVf73nX^$q^Rb$mEtCC@cq2{%5FeN=TrSEmR2MUyI;?>cjkD)og7!h}{LarEZB}@9V_$EaF&=Lf
-w!-q$bFK-)MGLg;Ryi3%29WUUBu%pChoIbovdL+9ABBe7hoBSm`v)qEh7R6jYNA%tgJ*!c?agPRS(U=
-j(MWjybr`+&k&!&7_-q)HC-ZTlqf&nos`s8jIv-<GEnv{2V(}Cd!bBtHjvRR8EmYbNfM;TJi5?+DTuS
-W>nvDT7G>Y8u$|}&J%F3)|`$7jy#R8IAwH7g<(QobfEIU+DTt^<ZOS*K{?V#W++AbLR5L%by~FuQcy5
-$Cs5t0oEDJ4y{2}?v7li^*?!><D~G$~6f~=jWz(fAs?0R#4Bsn)-8QF1*V301>B+cEWc<gN)xa!$c)H
-hai!<HV(gjz8)@XibSqXLazG-RC?%;&@W6=v>b5#q#I!{8@g38@)7(i`{5m5D*woG-fPw<TE^|RiE^5
-xsP%Gr?X_n5Jd6>i2rj%UwtT1m_&s!x<+KMe|nLNAIS^{&+GJoF%dXcD?r&oTL*Xv%TXV3Ri8@|2gV>
-3yUbwyBXx4>8`3`vTU_GVH`0yu5oPZLk3gq^Wp{*t5!&=~PQ7?6t+7Vib?8uAM$qDv`&qoHva;y*AAS
-RGU}^gDy%Di*$tw&V-L%Dl*)@L8fR17TxV2+5ZX3Lzn-33WR^BE79vM<mF2A&;z~xRZ6TfDCJaF?PV%
-#@c-`==r)X}DNk+sno_#yPhV7^N6>+Ad#9F7Pg;6XzrgO7mj~)qThq?NmZoh^yjW@OU8i}`G)6WAYfr
-C&>wTIVFR6MMXb323pzsgrR^s1955_T})9${2Z6F#+I&Ba{^*2ax$^Y=pCseC%(H6{sauzc;J>?ga!{
-XFEWzhFAWzY9Cvjs5}6Rhs1D6eW(Q@H+AT{wQs{mX2k7Hu$vu<1%#$+13I(MMZ$rSqM+SS*JG?47K*A
-Z5-9?7@J;*K!(8)#jCMn5^rj!+@B$JVR<HE;()`sF?*7O2d12QPQ?Agfz#d_rh{@EwHxE#_bH^8Jwuu
-W3&fn92HwK4Um8G49!Cqw*NMJ1}Ho}Cir{dpX4o^p~=+%_55UEan#nL^r0vh20M9;XwkXEO<oW7pwC?
-~sXi+*YOh~!eL~R2PLpXnH7&zcv++9MYq7{mo>lC3c+^20*(M<0ca7yZO}hi@#H`MM4p}vts=w9R$1E
-%))WEpTvnvY>8|K-~ti|pQmr;d1KVZ<!#EbNxrLwXl+5(%n%~Dq4QIZ8Ju{NY#kRr$ZK;I^$S5z^cGX
-grzp`)6Z8q#N~>?4dKw2aU?g-Cne*~7HH*gN{ve~HKO^l7Ki)C@yT2kbY!=-`zMP<Rf$2WumY$<3f~L
-}b8MYbkQuv%8C?Tiz%H@`;Nlr8U_UB!ekI;&y8iYRMJN95)S>MWt?yp(6B#mbd6Iglt2Q-0omjvAEJF
-3ZRbBepn@9h5dKcI(?$qASr}|mEQWFYHjJOUGVB#|H2IPBGm^MT`0wG`><WV9PxAIUfTCJ?nF>CZlEZ
-_%V{*jWG#Wa_TfptZ`A}h7q~Ok(56!z`GMWyxW;fF`q9jeXN_U*M}g~2@h(<9;78X@kQzzf`a!$dax;
-`hN73EQ?=A&*Y?Mf6+pkNfGwdhT+2-9ifzN$Dpmn!^ZB*_)^&>XPY12to1OBEH!^Zse1LbGa?X5X6_X
-A3lBE@x8qc-y(I*K7Tb5h90`Rxa8cRuUav>*F|P4AIzJBqwQ{-Vy@_D|&wknT7-4M?4O>y)d{1BQ5t^
-P=R}a16OopE7H45rWJv`?4RnH1Du<&H6;^^W>hlEqs9m6C<*rPaEr-(P(>3lD5}(xNo~oAiQNkiAOuo
-+fw#S)Ml8}o0ck$;#uioDmuaHUZ$o6a;n3&>d3aqzv>W)IW;XusG+!>Bf7q;YZzEyVD%8GO_GInj(*m
-|3z%VJN@;PuWjj3oVAo!QXir;Pk(s04ey1MbemsL3PalQR>CRYx^YCpPx?L=fg8Oxd*LTD@90F0gO3N
-EqGVCbFC78Cf>Gq7!Xclei)Hl+S_~F7EJid%)0&#nGOz*l5S<tE!)>qXIpl43wW#;wezL$G-oy{;kZs
-X26XNpC}VR0+E3C4C~d>qHDzdbFPG1CtY<wB~CLX`4t)O?PzQJ-?S&!T+=@fl|1D0i4_r(|DysRiRz`
-PW{5mG1C*Nq)v_c*=nvs*~)Z04kFrOem`u_kHjH&G}M^XRk+wWvKp!Dx_tJDlQ?k1(;=n<uIRMxFa&^
-bPc=LPJJQr8@8lSs^Ph3=>a(aR0)0*b}+}b2zI|VGOpWuKCWbYS;kfa6XPP0VO7=~@A^z%mQ!J(^1k1
-YV2!Pn{&!YmxaL#0kM?`9%Wur792ZylhHd)b&4?R04ZVN_;je;c3Pq0KIC>iA*7PcPwiAos-kBcGdtb
-?5)!e?Mp0Ej~EyTm6xqI2q+Y@Mbt~U$}lKVEQ&W6DC`n>2SZG}5ZQX0R4XT17s8-MkFrs(Is*N5};j_
-sw|s=W~?&v2{WPyRddUQw;`YpM~;#PyYk0<UsY_WJkshT7-NCz#$ob_*8dz^)kfv9_W-kQ^`}#HpGe4
-~*h(=VL(So%OuwP;$R`*fOFw{qV${ZbsMrvlbf0Qy77`DodSNTEm7P)5z+6`ML<eseHx4@*yyoK|56$
-nO;IqV+I`t(H`xM0EcB?C)JVHMoSmt67h!rrE4T5(BC$$zOH<?L$K2z2UA<h5R6>pK569_>I2&hSw<l
-AzhOP#W%P@9oqZS;O#9BeBEyNLud5FEkri`ix|-J9Rbg?oCGK9q=gu^MkXU~er8y4Cz4^-3^O-@HT<b
-G8)fBTIyI~LsgYgm&ua15uhGh4$dqiUjZuYxUo;^-54qktPveoS2@)}iBf-LJ33-xvxE=-S52I_<K_B
-+EXs39#06(vM?X%C#Bf*k8z$ydT8$d~*t+ZuzwG*j#UWkXmT%Yv~U?jY)TwT73#4ks$RPt@Pq)r=^NL
-Bg$oWul#lQo}~M#u#l$J4)$pqgpWCpX?SBv)K#}dk!w)oiD7N)1Nvc4kgJh&dhoJgNAcb@QT!rY!>}C
-`!7&S0|XQR000O8Q5kVe4@<{5zY72WX)FK$6aWAKaA|NaV{dJ3VQyq|FKlUZbS`jt<yw1>+qe<`-=Bh
-Tu#lA6+T^YmpbNM_oA%lOLGRE8EsDiLM@y8KSy@y`Y1h8C-@P+@NTeitAD1f%)CjURH8Y$i=SNbd6nm
-0oW!H9+Wf|f7M#z@XtrAt&vdsKmEbRDaC2IG*61yF*ckbr{l{NfSi&h@576d*e%H}PTtq_%RqJQK~R*
-8DYRJ&k@oHZ@^pr8C+N+Hj2a*vfz6-ZiWmWDTJcF*cUNXMl3!F#x+isfRzr*+{7-kYBTjZun=T8&7wf
-&(3|3wCfM-_!h#?%20D=+Sg7AM}s4Z9CRxyjCr(Dpq6#SFPmRPS3X@_%q`wV+C*NwqnUhR9dh`vYaBh
-6Z>bj7x%3AP=C*xw{QMt!Z7gV`$B}~?CBlL%viRQqH9(}+hTq!78qD2$;L%E1(iSQu{g_Wx`#YT7K=q
-*QKiU7(AfGXwto{7#N~3S{~`tHEhdfel)_2#sw-du;>=a)LbF(JDncbA74QQeuL&hN#BU9<Sgm-=?-@
-~G5IhtT+@1#0qM~3!gzS+X=@iI>AxA;TMI*(ITwDL#xCg2OJLD0$Pbi;8M$v+mP(8fnZI;D~RppAjrg
-8_yy?%Z7U>#vZHsC(bSu29%N!oM!e2bnBqKBbUpbOHc?)Q`;rA1+*8ut(J6RkzGg8$c|YYPhAidMmMn
-j_C9Qmud`pp_jP5rC1jtJ=-Cv{Ed5bjzw{W1Qrq_dbe}=jhlO9lNF#DCXzU(Mf-yj?C!jvi0ZD(Mcze
-o1a+@3O!HB$|zZhoK|02!#Mg-nnJwivh8Ta>U+}O(w5x9dc3Q|mR2xJ&J?a?g4Ckb<x8SKmQ~fzSI6~
-SeI>*6gZV)TobkcBQ%p{5Q|%_2dGOQY_FY{aG5?#c?Je*Y4R9DvyM`r;VKAQ)%{46dUp$J-4|?Ur6k}
-`2Dh8`6!IoICdsc~N&+3-kGpTS@Ov!JLPUMO#X9Br|HbVsZpoBi6h%))x3s?rRe3td4kbBymbHHqrG3
-T;b-uzZ@NKeS*itT8A#A3+->g;QUUrWi@kGjke>G(<5dvEy{a9G|#+A|k(GZUeE03%n#2qv-hS+XK_f
-?4k^&6Lo=G`LEaFZLA_8wB$o9hWaz;?Zp&Av+<#n64M7KErk4V~55v2VerYi`6-YC!(A+b*9ee%{6eu
-_Pq&Qi9NJp+GyHP2^Ho^@J3U_3$hJGyjgjZB+p@Up-4Ogu<dwNWY(yx)F9Bp0gEl%be*ge>a4IdJbW-
-<5<=cfhCPZpFA*b<&<0vUBRM{71-PFpv$|SDo6bs;44{1-0@N^fP<&SL`c7@Ew&^ewromvu#<M5PwW<
-;i8T_BY>S7m{K`@Mk<dBRA@3LE=+JP(>4H>`(*k7_f;f^ESPZ5M-YzQ{??<5T|uClAgQACjDg^ic)QE
-KdF2iUdLw7Lo=b9<u{zr>TuSgzNad+oS&JKZu?6NmSqW^jRi;8g_=AgCJiV{4ff+7g#0v!hGN?>e0<`
-7NzYSJDfYWQ~A!Bmm@syIKJ&6l7=%l{_a;Z?dFTiq=QM$`TepzjWPab}JH+`Bgr49wyCCb0GZxd?(IW
-Y~A!SC(g(Nzy7zJ*wxT@dC6JvG8Yc~|91}bU;}}*^-rQ^&-39YFv_-l2MV;W)B|txTkQb@1<1%hGZz0
-{bg<pk(2+PGw22M4_?H!vkQi_S%*bo(7c){$@xlB@(MfYcAnKBIy2YSQ*XV|uIbn)v9Fd?Q1y>s7=`L
-jb@<oHu?<X<i+@RaQg<+ADgOmJInwi*qXAeP!eXy21Y&p@}h-4tKp`mWUr3FCOLAM_FY|fqGgfr`1Sc
-cfRZ%=wCbO7!SLLwXqY5F6QkkAd!!>Fk@L&te0Y2<@;Im&oAsIfu@n8Yei^n6U_L_5kk(Q``sc=U1UK
-K0odG>3uiJ!Zq4hr~R|hj1Y9j==>}@<C4vyskr_jd-oZqBRFgMj1TnbgHPVf(h^#ur7r<7X|Arl$2T?
-yXPXmHlrHJ7H+g>ya{dU!}7mv(`NG=qk?RB+%V{H*&REYglgkKA>S@1Ak0O_3WcD(XlKPubPD5If;Wb
-Ov>kR##Yr;uFRIYo?KCU?_2x$Jz>t=Vs}-+%1-w)}<NU{cF(7;JhC3Wh`_UWni@rhuYe||74D(fN2(C
-seBOWNH1>1JJIQp=wg~XF!O$i<*7kWRwiqg-5*YPkzGRl=e*PDeO&;b3L$4`%{OG1Df*`Bo&LQCUlEH
-!NpZIpzZbF-tPU|`yoG%?PDIqT*@9>|LmvrT)fx3&S$xHa`>H>Gxe6T2|u#fcpY)wY|=O~5_c(w^PS&
-Pdb86=N&n@qnlP(_(|4_SoS0d{^Jq;-Q|NFXCPT8hXL8CNcU}BfYZ?AI3TWP(jH=3S<EmnYVkLYJ#6v
-7UvLe&pS&vQR}+@r41i`;W2AKJS%Vdu`2g`sa+^juDl)j&Ek};;iU8C0%C-2*|EvPEv_?z4S0BSh(n3
-f^qu`cI5sw919OJgJ=tuea4!M`eX|&;l8)PjXZ45@0a|Mv_HfHsHSYtPfSO{Oeyma_QpNJAqQ95&Kd;
-Cq1k~`a;IcguK$ZFcOxX<+UbK|@doBt__8n|1a)@Zn<a805Yoa4Zon<O{#Xwz*Bm9|=9yzND%`h|`3#
--g_!}c1a2+vH$*PQW)1V6SFMi+|27qHA+s3am6WV(bJP+%@g^!4O4!!(Jt_{38e_3_rkeVYa}RM03l)
-g_oaIpHYVq38YO&9f#SH6gY~a($t0rXKOZt&M_~H#+Z~rp9Rkmj<(EWG8U+<0!+2@cI%rw4-MYMsZcB
-=zd#Jt>M))_z=hk=v1@UM<=%W04)1E0KF$Xf%Bj<ugEQ<rcD}Vl#yBH$8hbLeMc|CpX9`TYplAxvlw;
-rCpA$E!Vnn7%L}#HT&U%0rl3Yi{3NyX1<EYu)6;qGL&_Q7jcO0qMw8GlF!a%#@SKX%QgU^wD{9(<PA~
-fB#X5P96jh%jcA4-~WtjFAF&7uQN!V;Hxx`|5V5DZOz~dW4O`1Y+ynHI{!IXY$B0%vKt94Q)u%~=8Ee
-Lx{f)^t$X@?5G+huq%Qsa9KI1ko3toI#y(Fk35YP)L>C_sRXghIW*R*$wqrcYGJo6za?c14zCX*Lmi+
-QfG8I9!ov9g)}MU^Pn;PZ!Lods^v~8bqGXWuV0uVlZ;Oc`)WyyI15}{W4Cu7ea!wYw`!){;}J-r?+j}
-sH@A%9borvo91GF*&G{s+3@C)E7dV|`SrVR-oDb`@vaAUk?XJCzWdeJUw!lLms$u_I^^gZJu&*m*yH?
-u{pJSDML32;heR8BKod2?!r3h$FYKWA_KFjN{18kO0bYr7aGU0Wu^idFSF&Qwv_gT2MVkO$@MN^#iJh
-De>Y=G9zJSvQ@7m0lR-ZeRonR{Dh?5Yr;z_NpJ`&BnX)t`AqN~3fM}1S;;C>~xN+r$~-IWcAO(L5EbD
-iOCH)(?IlJ3306L(Xu?#2%j9CU<2RRVT}x41R#^nt5p*&ZKRBEnapWLM*<YkznJejTrdHWhzUpnHR*L
-zq+HAMlc2-!={hs6XiUvCLe&oJ=#svu~Q$OM4FqZD#pb(@*fLfi?K;69A2+Nsn+jJukzZ{-EFb`~sb5
-ZC2L+ZTi`dkx9n0xR5VDT2$!Hf%Sn5bVkP+EW0Hvun`pagOGO^Fk#O4qyD`s?Z1^<*YxWHNa4vCp><p
-f5qS+63DpATp$el8t%oe%O>mleIxJSAvsQ};HAtR9>+oTCh&%B*vWzkQSfF*cCrLLMOM~SZRG;4hr^R
-;yS6t0x%6Sxli#*W&GtfOkzeh6&G(@bC^(0U#en?w(Xft$H96+jp=ihT^bv|^c)^!vHEV@BFJ)P)WSO
-YmOm|D=>E?_n?C?fGAqu*sIx_zT;qyG<3O9KQH0000808trnOs+zN+$IJ90G1H|02TlM0B~t=FJo_QZ
-DDR?b1!pcVRB<=E^v9RS8Z?GHW2>qUqQ4mB&D*@VcVBrF3_bJRv=A-Il%^ahQLU)%|;Scl8WsW{qMV@
-Nb1ci`e6<b%jDg2ch4Q~sI3$wNz-kk8_Cj?@Uj+C6Z)t`(P);ozh^VMUWna}S3CDpos@gj?5Gct*0b3
-bA!}YIk5sWtlqIclhkMojjLGWZ>gsy6>V!eCrrODUlsS_uf5$W3iR9u?6@q%OJ6``)7P8LnC9Rb4)61
-43XNB^Tr@QyvUZZ)pwPQNfOqRT&MXLBeY$TW1kexiQa#raSRy#p<%vi0tsMILVYbk~7<dmkmQE3LgdC
-A+4>4&%XSHEAc(%(Kl+`j9i(`Q!YLMAoMo+!GIJTs}lic_trRE$v7KBRVc0^r4;cBy1aG%{mqYDV!Ru
-=d<}b~N0kS-~OT*=&YHFiDoK2oj*~#;k>DTG0~9Cjzmoph}SyqcYoD8bbRWUCs!6Uc7kGZj&u|hq)nb
-j9~k)7Z4Mo5!h1==*bhwM5QSQdVl%cFnM~D0EB@uf=d!8gBO^!MgbBmIvGOdwG=zD7Hy6;4#f#LD}ZD
-DGCrYm&aWhx8PS|=;k59I>og4&E4DGYpmL|+>*DEP<7+W%;AOx<Oi&?8ynbJ^Qv{hLEAte*RSC__1Gp
-V}3H$^L9>nl}f#rA%;=v|VmtF?vc1ot{GnLEW;g6e%(v~)bUSjA;eX4od$YLn6XGOgXeuYy_K%a;$@T
-B)pk9RFg<UN`sp@kxI`w#`uY#5&@SeZaZnbbDGbSFhqhp*!y1yM)5Y%0sS&16iF!5-^;ODdtw>gB+7N
-jZ4kKb2wdfh&avTe8m$hh~FnO$oJ5!nT}<DU&D(y6l)0C=|5d7Y$o`t`%$;-&^(22zzHc5G$&&YeA8f
-MmO{*J+gdbI`CZYLFZOftRF2jVCX8jXmr9A)%p}h!@ws9lYSRQ>(`skWGy+gH|P_PI2EEl@d#u&{2BH
-A@j;B}XE0tW-}FbzlNRVRZi#G@KBBXibu2q9R|wDUCT7h`95}>oQj<P5yvS3<6!yx{fngW5Ya{;LXaV
-f$ya~PO*r`VYb>ssy2dy+&F$ul;PKx8H58zD=A#AlEk}Iq)0rtJ%(oquF4(3+A!jh0dbS?)72VEN39T
-lLdJ>Q|t_x+xcf-6nhX@S9T1xU0gPK35w&<5<}Q3?5zkpqPj<o66r*WED>+JW{oiP8d(Ag>Buu>=f*9
-q9V757C2$!5O<!X+hvXkOLzbt)TI<WZ=HHyX;>m!j>0o?+`MekYT~vnF5RJmgh~ctGh{Ib{*}VfSb@(
-!2S$+=L=gD8o)jUru~3<Vkb2|yl!)i8XExpGT6qCs|5Utr@LKY*rzixE(ajAw$GcP*jN7x?o{ksKCU~
-oO+xD$t`?zP>9sZdyhJ86rkR@r17W*83@%4u3}sdqG-IB0yhf@F%4C4Uw;kzA2jcER;eUHKqWWAYKE2
-r2+vhe0dz7#oy@lkN77c?GM)q`_Yoz9ul)=rqtZXmEhCXSqxM=;e6Kz<bt$n{g21P~@Vp!5cktHeVF<
-cKgC|DKtsy-sG+!9{(!j8O{tb+vztQS9QhD~O4sQjJ*`>ACQroM&-!t%6tKG$^um$XkT)8;DKUcSr$>
-EBwDgOE=!v!Q?M&HsLi@x~bh=g;yt80a7E(YS>~VD^T|z>kIt1Po%Ai;>#mOu`oA=W*Q+K;DoaUQbK<
-CBb(xb9CAl7au&d&Mnv8@<g*E$-UVn_%C#QWMDn|hI$zMT?LT+0RApWIF0NT`7w%;Pl8ttyw@sl9N@)
-#zPM1p!CVDoeg<UP)`p*8u1Gjnk=Kr0dZU<lt3EsOG^Db9^?^&pR)pwLG){%7HmJdAZBKKO;}lzt3LB
-}!4apxHbKOV8DXnIJcCVo0f#Ln7ni(VGe%PN%*aXjNLp<n8((9`&;CW+Xf`a$AtNXV%H`nhj3DVx`Ms
-Q~OsOL>j=gaq5`7ZDY#Le6L>(%`wt{VvJX*cc6dp&umIKHx9SLQ#yJd8)6a#yM`-;QdVCp$Q>^}3yyz
-~o;J-r%Fzzfem91QY-O00;n48F5SuQy(P!1^@s97XSbh0001RX>c!NZ*6U1Ze(*Wb7*gOE^v9xSl@5k
-HV}UIUqQGiBp0^OXJhUb<VP1QZGt4*OJJysMBA)oNhPIZ+0g%ecPCOJE!k<`=7-p#?mONczdPP#rHUP
-k<5gYNO2jdfyRuLf<Bz(?>Pp1T^Jug}IkDq1i%PDvP*(Cni1db5MrI`|)@zxs?PH-0x|C(~$hAm{-Hz
-v}RdCuob~3u+RjuQsNQJgScYmIqp5NU~+4=45^=&5`KZ!goT4T!XI#xm#wMvBUNrC0bmZNP^UCFFfp7
-6ZLWx_N0kBD==6Qj`xod72n)|+T8sw-LxW0HyE35X>b*P7jJif7|SXuc=&5rfZoJjRzy=Bq;OcqNM*V
-q4S@mRv9}d{-y|Z^7p*6Deyf6gmPRDZs73ia>*wfL3Y^0<dHy7<*f)V$B|k64mP^`^9Maz@n&Cq-(HC
-y`ZiG77bVtj0l^G6>vo6vWnwSi)=Mz@3>lP_<FZ}Hm)|Cln@{%98-qklc+_zxDEy~QL;;8a6v~rr5|8
-e*h=6hn5}{-{GF|2CUh|MUIJIDMKJV+C#Y%>=n6s|SE?30=!(}_wYcD!7XGV^$jU_%uWBRMs?IW&Ne!
-pBa>7NsG6*LVJlWXjMZsj`d)OpS1VEuG<6^v4MO}vPr+yG7UEo!no0yveo-&M~6Lq;_c~Q~o+%vx+ar
-Dep4ipXpN}f5p$poY!1J*prR4{HWZpa31;I~HmU1dr@iO5X?+Qo0RAWq@lowtyJ5Ks;4T5y$YVoRtPS
-r-y$vTuH=WM0Jv>Yu!$b4u}#DdY<ikcgh9>`AD{LW_3UJWuAY`(YMMnSsQ{$R9Dj&2IYs$blUSPOIWr
-R;ccD^hm*AB_Hd?D0YK>dW#hAhInAIh86I#NGLbqu(4G7T#MM{9{H5`R!ayG<D>?P9$SlCC|-d`(88P
-4iK@S=0CW<kJ?mHyiS>GhjyA<61*Hij&P(Ju+}X2W|9+<>q<@J@y&4=n7itUKi?yg6!dm!4uk?mx1ib
-tTo6_TC2|JVxvncYkip&~-5`YXLB7-diS&mu*(OF!7=qvzpmyPk;bqg`O05i>ME5Gc#uvr5k@aq(UgE
-?*HIpf!sz?`*}v`6m?SsqxamKVO5J%12;NQEE6#&bc3LprQ*I9YaTzPG=SBQaIE1^W!wRQqBF{7!kr_
-tzmzQd5NTM1;7-bdLpRuyzTgI&;XjmzHnX?fL2T?U`n9)zw+b9-%^UMWr@Eoy5x42JL~t0`hFbb!;WV
-pivm?ZG@jp=0qX_!Oh-+VtUg-d&m+}o#>ZEy3Ax12Gd~j@V=o?h9M>m%frAzNBBGXTF5-~&y<xDCyx-
-&*W;c}t4qN>1>a#g^;yza_XA=3bbfzwc5;6*6gY<hz1X?P7AW9O-9PAStd`FbuAmyPAz20*uPU;&t3N
-+-!b62^z-k-&gU3Cn=Vy)(tfuSXe{zI3e|(%>e!jT=`6KL*qtWp_L|#FmEFlEdVBp>N$70{t<Eb%K_Q
-8`2@LF&eUNiRc^WFW))z$g!zLk`=U`SgWhfF+(HXEW?gq5uf2LwDXEYlRZ-~tD6k4o@u=iD3iTUDgR9
-48K}k^L&$_7ofbBuqEZAitnz2tb~GK^km|^w+NH!yFfz(Qe^Pb&g?<NQA#b8>ddh>W@>IAiZ5kl0h@(
-s)NvP#S2D046Le|y%nL;HzUhlyKX<hrr3#D2~kB^UV}TT`!%Ck6`wPi2<W)?kItS5SU^37YdDf1gclP
-x@|QT-7F#G)ax0tw;rNLCYbtogo@KRxW~>y{cx?nv!JSqKO^b3RVGUD%>4n0w&_<%UUm6DP+1^nOE=Y
-}ghQVp8d(MVv>g*lyvV?&+L>&*A$a~<WbD);E4xXs%JbTI47PsMWn-L8)Xqdf$L@l7(^hJuSokC4B?v
-Dpv*Xqp#%@o(p0`$1ot~VVxHowjge7tRk6RPvnZ-R|2F<C~fFm2X0n{wLrn<B4w)QtOvJIB;lb`O)P*
-J7~`?ET<;M{~(|Hk*yR5PGjZLl-z_Z}oWE*0`|gQXxNr$pO?~O(yn$PKF-D-ZiP)!?r1X1pB+q>mJ(6
-_=ETpDgZrjS0P?OHl^bLzN;$-wOlm?r>DRcqN7-I>-WKS4mgIsHI2PNqpZ`Tke+r>m_q%TOuQ-F<jfI
-{eX>>B<Hlfl#!t8HP<eOV=<Q?&-2ORsH|T3Rx~it<V_y#Qv#Vh4<sW*Lj-oU$Ke*el#=;JE#H4fVS!P
-YoGGr6=G`=}r-}4jp5Y9Fi-Z^*G^2kwN(E9-s_q(Og{@3ltO>^5Ge*>^?OzOt;KOwWtD_T#R3z$;G`D
-bd^%NsAuKY8{_?dU&HO9KQH0000808trnOsk0*KhOgJ07MG_02u%P0B~t=FJo_QZDDR?b1!vnX>N0LV
-Qg$JaCwzhZHwbJ5dQ98F$5OJhu8G;a=tIy7D}O%UP~#*p(yq^7As3WN#0!keMj<poa}OfMAm3tAB|>I
-8QlP5Rp&Z`jDcucZ5;5U)v|NQ`gIfy^j5S{<wfWtJJ*PEl=#;#o_SH@%wX`_xc!^5j!XF$e(Qw629--
-;vG|O%Zn?3@%uKbjsw1~p=%(SS992H|%b5qi7uY(XmA$gcJ@FS~w27jqklb4MM~QxK(6S%q<S7CgyWK
-9#6B{{Kyzmp+ED9TB4}>M0B!bh>O?-{E4u%Dmvl#rY^jX2eM{e+`SM~^h68caI>pCZ-oun3u&cfAjIJ
-6g6YXufv*JkZyWH=mBIM<@6gFXO>{1xGdwIIBdh6Wukx#Ql~5*?aGC?pB)pc0Y{osk@vtYw2+p9>>e2
-WP|E7R}O~<K>1kCBCB6?ctEEKvcXz$RVCUiUYZ`6e7__Hh_oL=o5U=JwRXK<AB2_$g=DX&!d5l%ajT6
-1c6bn?dW99#d~n$IOF~ZO04J_2qhe2dyBG4;R81(OVfv!^N<z2HbP>5ojxgenIxN3EQM!T;>n7pWaPc
-gco{w@jQzynNBn5wl>Q$VVa4f+r9|uUcp3H;124SZJoe|N%8hizJL&Q-U)OY>B(L1$v4`+VrbgN33;g
-`g)i`IWq~xW%5Gs&Q;uRIF&Lv*y>m&7sGJwBpx=KA1P;f<gOUXgX8uC)K{)UOhAJy#Ak7Ii2F}>h5R6
-Ukk`Us(Qnku6+-Azb#KWi0Jy|gb-X#<5;l`u^xIH0RVT_{mvNZD+cL~HLu-7^_+qH%-!>|}J;?te<x0
-VZ>{nobRgI^2a6e9kRWHI$4X&W@dsC9`O)hh`8+$ZZ&CPpi-<6pDdSG|p&AH^-M(Dkb<m`!#Gm_dDc(
-+b7;fnv#`@&>UFd8v@DC-C;DIg)LSJlU|uy>sjOw`R_>Ax^3(?Y1PL{it|6T!gRB5P4UKVNmW{E{+0q
-ky^&M0=VK@%fi=3kWw3`hALcE?0;_!Sy=F|VPpGe}bm9E5KW&s=0T-^ug0{uYk8PXIe0yb*+Qn@NKfE
-L955w|K^f&pF4Rs5PFDfH6qbtiww1vt`g|~{j@dmjc_GsvSXoL9?k^7AArpP$%fR${6^5eZ6pzk$)qN
-3M=+sM`2vbP~LTv*(`w{C+M|ED`D?(|UdeFEqaLhlt?(QR9r_K%f^y+=5)K&1w6^$@Ra=U-#K98c`KB
-!&liP!%o^@=yiC);kGw9r;wi_q=nO4fTCWacUb$^gmEb0|XQR000O8Q5kVemp60f{09I4F&+Q_6#xJL
-aA|NaV{dJ3VQyq|FL!8VWo#~RdF5GMui`cnzUNn1R28s=ob6q8wCqK@U1_DNs@_)W#cCCqWB~V=IJF%
-({QGytb`mET&S5L{rd&X<XU6mK%y{g4!&YxrtWc$>c8{#F+tm*=GTCZ%V0pf6Y@;F1nK;x+TgEp=$;L
-wN|4$}iT&mp;CA5E)X`fD9S2$rNUScikY{Lx{>Tuvy*^2!i{M`r*2dL~%ex@gf=K^XgRApM~K=QNJN-
-x=O8jeCW=Ep|J@`KQBxM$b!cVd;_!S*DL6|xiVe{!XB&4qyxRkop3TH1C=D6G=wF=+`k&Tvw_*WjRzP
-=2a@6ZQ9R|Mb4;`A&NP+0y<=e}3Y{9+v*utp>emEn#sem3Po&GNC|#X6rU0*$(V4Zfu_C6+d7s7f4n}
-ZcJFhdvksngT>>7;b%IXx?i`x=V4qIdvOHAwo0?JYBbY5yI~YsG#{!GszQLtCQgFq6*$kxk9Jk_;)(B
-oq#U?iIzF}Cf;P<Vf${RlD@z1w%PM7^5KZ8zg+$~0%0_K1!VFm1Xc~kg=ra?Qv0TcGeMAipil)JGjLV
-W4021${d6$=}Fpq3+ZEYSO9^4oLhnGl2Q<+c?P(4U)!Pp0HOXMzOHDH_CDkaVP_1o+RZ;6-V$!8QWH!
-x$30dL=?6vpOWg<b-KXA6}f*tk#=rK53zT9;YH0v4-M97Wl1>8V<0Q`p=CMI8Y#^Q*g|#*m107h1-?t
-+m>*&jCnZ*t;m6%+yebtpNR=Wm$HGW2Fa72n`|O7Q^Qi;5x^`Fr4@cbBHxszRVz1fu^=BHMjd)JnsTh
-N%liW-1){dh;&2?y2r!YyU;uS0@vBhbCs~g+9)bv^L%bVZkOy0*E@vPn>SCVkTza?jfoeh8KF;Z7g@(
-1Gfp~2%;_9$FsK;OXYKz>ij0@;0nMFvlMZpK(`<>~D`(QG6neHC5R?e!wMRvMIeWltIdZ+8r5Lxok#?
-<2Rx}#thtqqI^?E)X_)}Df*LO(zen~^xC15LvDgynT4#fD+6j#uM!IRQYl-*@pZnNp4Uw3iSFMWl~F!
-y}I%@?ocsZ{=zY#UJ_y6)gnl{~+aYZUC2s|G7SnT)g}2;AmcwA0hPpwab=*HqJIiFi+cezuz9zOZY2_
-EUWVN`P7lDCzIamAI@v$8~RpVSKG~3jD%F5KHC`mqIBl-$=NFCC>Rf*o-djpccCdccnb6W%BxL_egOU
-zHpDdM?sGO%pl^q3tT&?HeB99m#4S_ubcRJ0edmL{30w6CNM^2q=VV8o=kDukVwB(q58~X7_!ij5*+X
-H4EA_ej5U_xYjrawXzS-kE)67W=clTWO$oTm!AgS!?3hDObp)wuw<%+nV_a0(kLOn8GF?Nd_n^vxTXI
-zzW?Vk>0)~b34)_(Q**%C2SkL#|?7<8`h>F2;yX8eJ2mS;>QohrwsfPiG^T|nYG((@d4YcOkfKJ*O&7
-%<fw!;PAE+g$0_pr6@SoCcJw)4ePoAhNKx;f*zh^TQGokB*a^NnQ;-=W2W1JW=F;y$!3Jw6-4V9+RIe
-<*~@GtLQYPjpi~j`PVKL423(B~Bynwomob4y`rVNfkh$y=~Zl`X3q<HPr9d44ZOyRw19QM733}Y@jOH
-$f|_hv7xI~Q|~k{A(Ef6Tet%YL!@(S^?YC$c4Z$>jZdfr{c5pkTv?6cPao%?f!Xtm<o-I-FN?&q^~S5
-sPsvDl#CxTKKMD*Db4c4IwG1Y1nO(bkB})dCrmreS$z$lx^3be>9xBiz`TQcmvfS^DeuL@R;&`@vNUc
-se9ny5g<uGRLbw@@IiEyn}j(gQ|6F_iJf{L}b1-Os7v!igE6~@%v7+?TW9;d|hS2P*>(6~ckvF8=KiW
-q2CL#>RUewmI;RuxKOIkO1Plsu^_x;-GJcy(rgNAUtPWO+fEyvSIlqMmdfIsBhF5WnwtV#4C!rmu5iL
-LU0{-*RG8;SNs6^789k*z^BK9OyRjMoZd<J`dXl9R0$+>l_T!ZRR~gDhOC;9Kq1}{{Ag1Vbkp9vrp9H
-)2Y=_f_Y@$8ak9OXW3s$RP%m?sENAN^-B^3T{l0};9?pj;7OhCJ~F;B^gF+xiQE*OW?tY96cO)9*uAg
-dp`IEr)MIu9m2ujg+}KcS>P+3eWy~Gwe(opd-Ifs~3|$s%!EV{o)z+N0-}$&%Ww;Ms8b1`|_mP5bUQt
-ee4ciHGQ^eTqVwu0d%<+V3wUQ%w<dor6@nrxm!9D(X%hs`(&Yf3aK%eLwi;=Ks&F~8RvN%MJ6ng!Fb|
-L=j5gyXSr8-qoaWD8+RY968oQmVi<4%5J?xv8iwL`i70}o+0Nk^yf@sgwIE26Lsp~~4ahk^W{$}7tUB
-(KA7nkWL~I(oiEJn(j_Pj}Uq<{X~R)_r>w4_|Ob+20#QCnHriWPLsYVH$HIBHtB8O`@*=UFQ2+)QoPn
-Uv$}PG!EVRNQ(?jj@37p8Rm7zt*^QiYV|qI@J+b6_jjXd{Wopt32%MUZu83zU3Zl*`0(od;C^sDtWfQ
-Z3zpB%U#^Q7UIKM8hQqgnEYg|f!*kkrZRU%#U!6BzacGJ^(~n$8e|O}Af|ZH2Z;X6^QdcV1wDm75)9)
-nHN?+_yYev;7jWqX0ay*K0#VU6NYr%EnRc<(Nlmm{usdIXpLkF<`15ir?1QY-O00;n48F5URC#iAl1^
-@s+5&!@e0001RX>c!NZ*6d4bT40DX>MtBUtcb8d9_&WPun;c|DM0X3YwB^A%(I5$BC16$9Cd`D1uGgX
-+oJBJFP_;N4C>a>9oK7p2tqwq%CawaD0H+eqMjiiy!0r{++4woR}#!go!-oN)u5wpS(2WW@)CfBy%_r
-vebl@j8p|Rxl}Wc32l@Z*9MOg-}k*-$r(x0yf(GsX-dSblFAS|*0QJ#Pu)5O1#^J{J+GmVy8Y5i?KwG
->sFHNfOD0vK#ZxQH@F$a+WyL+usO6bQ;K$MzaxxL+B*|o%i%Cn)L}vbQJ5;wc>3Y}WPZ_TaxwPaTl#;
-3=6K%-ktfD4CmY)>8VPGbUf@c=3R>Vj#0GeF@&-V>!!H|v#744F<*4iA3iZZ6S*3YU~aqQB!Ee5Hc6S
-bumvFWo~l6EH%RoZ-#^Un6=&HI;FN^TZXJ#MgEyIpS^14yf^2@38qo|6eTsWz+-<1kv=4xyf+C0|xM_
-_Jb9kPB%--|_lU{9Q_{m~HBZ)tBN>FD233gt;gTSK(O7B6hY!(aV{ERR|?m=>Nx6+W=DJ)CQ`bDu#>m
-PpalGd;S7rY<ozmE1rp5WShc%92n0_Q(6?zX<9G*?K1RZ;;)hf7q#XZ?8|62<+ui`p+E7|NB~Ls&Je$
-(M$Ea}A$}Xov=$844$ZWBoLG_fm)94g`#XC=XB>>>t(;D2!qx-WEONvuX_{&(%3PA)&PjL_lebNHx+a
-2e2+%s>F3zAn!ML|!x3nn|q*~T0;~p<G?>B;3wM+VxYHExM;W#G2mYg7RGV&hZI*qm%uqbEHH@6J3eP
-d<RbG+BG<S(MsV1$X?4_&A`+1=}D-DFA_&m`j^N>8yYWNp$k;U(-s=0q!|rtChK0_iU-*G8w?B{!%|o
-}L0~D=XKj6zUl0A^S6a{*eL{9fQGPxD-pQmW(6ecxiaoqvw?Ep9T=OMr?p`nr{m>3GkNAOb~6AmDfp;
-@1VJ6`8lWd$ZcbbfCe=wC6of$-zT*Ll^97rfBLw83Yky_hU8Qf&jYf$`kw>E#&8A7E{8od-AF@=R0Dz
-~)1hIFIMCOYf?-g}Ju-hA48xMXq-aNm&uIZU4Wu)XDcMkxHw089>lG{*U25{04Bx`9qvL~v2>u=(kk_
-xt@up&wIanP!pSley#E-^a9Lw<Utz*TLKocNJTqrLj*QAsHJxnKZ0W~)(MER)K9!!m?^x0rA5oTJCaU
-2>{%Zd(QL>N?cQ4D@LdbbC+P*!VOsp{R)!O6kFk&}Oe!DldHLj3c(wBrxXm~N^fthPDOPMjGS1LyBA|
-He_%3i!)jB(WP(^;FgcBOE3ZQ$y!pl8GdAL6?m;XNn4FQe<@J3YFYXxpNxxkG9?sm}*?YjX8iy0gNtI
-okWn3cEKpU9(^2LU5)O8P8Q@00xNYQD_&Z}V_c2W+l$fl)j#B4w`w`p$%vN&M#*vKklt{+u_)07cUNR
-^mKBgNc(%?ftf&T^2ANK&-M_!RzP$ePj2JQFL_$GNdG<)=by0Ff$D$Bs32miDx3wV)jvx>w$zmW$YiP
-IpFfYIkbS@DZk?W?`TCptPj$6MHK(n(AWFyE^I_KnT>+IJaa~};0hE=f%N586^S{v*(){wvoBCWtjvV
-c_W!w+u|Ip_VZ(d7<%M>ZK=>0ZwKO72BbSV)>OM5|G0TQWX*WmByu%EhkXXq|0pmOoVxN4Qnhu8RF&P
-sukM>u*S98?;fidqXrSe_3Wl%{W?$voBS$E}dOixKOv_dIBM|@qnkpWFWMz`Qh7><I|oxXAExwVMD%Y
-Ut1jZ5JIJlMx?{w+aQRnnXQoC>0r<;n~t9L^ULAcLl>rYA7I)8W!WR0aQiSdFt51D%e8|UUApA5w?qL
-$C3cq?H<VFBU8*-N1LHR4AP+GVb|fP~!^T;V5Z9tW16)x?WVX3vmKAyg<1l>AL<vk|s^K@(-JTu2lR{
-=rZCEXbCud)`9{_MMd<mS{!Nb=WeOeBW&-#S!Go4eV!{F-j_lpmApMofIKIELL)w>(ozY>k7bP3XC^p
-QL3!9eJv8D7jW(GsvxY~PJFUT0zj=)=He1WpbMJrRoMa9=(*a}8s1(uA-p<_*fBY64ZKc@Rf7UJC(_#
-)Y<!*+h*2MwCc0r_v^hP_lGOubG|EC{*6M*-arIg!&P5?QUuHsLA;`jIM<UtaM1=62@@5S;FKKH3iqs
-=J=Z6hq0~4;kxW@l$=9qfCxhIwc$n_TT5+8v=Z=^x_6!q+&@W%J8zG~T?|3X7i^Cao1**1?HDPL`mj@
-`FjUPl$jVk-LdV)ZJguN8>M;&~lyMks%}<Tub0^6A4^T@31QY-O00;n48F5U4qNSHj6#xJ@S^xkT000
-1RX>c!NZ*6d4bT4FSV{~J0Zf0p`E^vA6JZp2?$dTXmD<)E01Z^6zeINFsiY~>KD4Qvn(vh^iTQb7}fg
-y<%2yg*V67MSi{knS|7ytv3vb}q|Nl-3}1ZH}A`rSPZp0M#U%ozOhn4he-ESa->$=S^|UnVh&lEos77
-p|Yg^Kjt?p`VM7Y?TC?h<A=oSjyKaeDQg}9>RRd);wK>Sr#U-%lbKjhUfQT0MC~^<!qj$Z07lQ4_+E%
-FyBvBYcCIHVHD<DdMX#c=P5$L`61lR6ZXda&OJJTIp=_C8ZMSOd-LkmpI^Rt_4*Z?ZP~{#_O@)~{S>Z
-U){P=I#4#Bg@{FhVJP?y_G=d0olkpC1y@PuS=kV8y0~Ul?o`$nc&Ve4Vhb)=rfH9|sVUCCgiN9I#I0x
-hb6e8}$TejY$>m(E7kRHh<XLHVx4!C{5a*=v*&I6>KrcA!{aw5DpOYS-0BlZ_3dFaFK^_qJr3uETNw%
-~EdGg<;C0-#v}lqVqdsWb}NQ0%)36(D4r^*Tv&;C6Xq9lZ?U7kev?LSm2_CIdV+<4DVZa14NVd6*$EA
-j^6)i$Wi{3n=7X7~_2)y{0iN13;wcX-X^VWozz-^U&|GhcwJ{9!r5R1Px|?><_v>vQhVM{Tp`CADv%y
-`|n4rdv(P=b%(?5VBGJG*r)#Z9UJ!Ec83>ie9gx1`Xe^Fz8u4lUWfGu=T{#t`h&Ls4kz~C-(2;37bbw
-~OZL7uJbwpYyWjV(`r{v2cW}Wj`{O}xGy;Jiu)#I!ee4a!Z1fI*R51I#$FBO_@2`67@_GnU;r>nUyx+
-aT)i3(P-ualpgY)absQ2F=017-}7v1;Wx48Ha5raAE#;14P@#q>>8^WeWAFjrLJG&fSzh_t1BSQAW2=
-;Z+9d{Ax&F~r!9d%${Z~U%@&;Z{q{5v1_uLn3D79J1bYljVbZ?F1qdxP^HPQAwQK(ZkW{4kOeI;=bFk
-8sWF4`ToZ^I<4}1So@^fJqdG$%qNz&>O<e-**Y_Wtju+(L7C7Y&xB9@=eO8Qx>jJCP68(Bmz~Oitk59
-^1d=pOAyfrtcALta`h?O>YMp?&9fu1#2O65^q$87h>;o@J|4jy=8<>D|ML_i`e*OxsDFVhxa`B;&j6~
-6wknLc)B5|Z_ws+H6a4?x%Rf&i&;Qu!;DCPn=;$cmb9V1VVK4>Vj&mn#pB^!|Rsf`c=&ronU&2Fr7S2
-hDR$?SxsTYD7`RGL(-b>RYby@=$;0egeM$!VH96UW`&(aoq#w5Iy0|{d`PB;9BtRC6<`6l+sTES<)GK
-_`3N;<M6j<)zc<vxHd3@~V>SPvlO=~m!Kgj6#n5vTr=`*&CTo<~Rg(dX-&_2~)iK+Hqx7~`A>|8E!j2
-1=mi$Z{|Cxp>+Eq;g{jZSWqbNl*1{9>H8NDH0?*lLN{VVGP|RdKa5_r*wA!_AM(<uruRBd>1DVv0OnC
-Uo33Fv%bbHeViD`XS}jQT5}9yE0?^|XnQeIgfDoC_SIvp8p7t)5+Z}fHeNKKD&-};KO$M-;9_Gk;_>2
-#AAVqd<YgJU9JI?R`i&I7B%2uFg8G3oS276^0vdT3fi6yX558sOg3;{z0y25aY!l|*EaE8D8-Ne|Kp&
-t%xQGh{39*z$H9dnM0?30QN!DQzxDx3QH|q!h!8!maOeMAfz~Db`LRbbQ8zwxUGxjn`lnlOy{*sYOQY
-fUC1HTS;Y2$Kb0tP_S1pJVf^JpvLik=5^C2?2=t}B9w$Adi+JP4XLsh1<Waur!DlPDlxh>qXSH(n&RT
-8tF|3I!JhPA=FOVu-<{3!sC8#E@!oe0<zh2$N3_N%6gOt59@d$Wft@(*@7NoUf)+C*#q)!|wRjP&wic
-NHW54?Sl<j$~I9BgYlVb?#GoFIRvhl0gh;{7%xaH7eqT1&ga0ZIPb6wsfo0R`6C$gaK%llp=Y3m2pq}
-^h3MP@rV}#e_`GTu&__7pQ5$8^DHFJ35c~=xuCr6^@G8cSQ7+pS%R;NUYY(?5Y1T9daEB4_e@$)0ZZt
-Q6Jq2Src*}$5XM-f>O+2+v`8QL4J4{_C>!&i+KILnedI(GY320ukuZX3CUZ%mm;-ivfRa`sNup)qe8`
-j^dJSc7!3Ka&AXD?qjF|su7Ur^unsS^QpaszZ#q3GFHX%s>D_A2!|<w#}Fp%(Ca2(r%&syNB)CvHZW^
-mi;QOcA$IY%U;($XaBZSVvn?ooK#^lsn2?4U0aUUk^U^hU4i?cRcP52j$E=ZT;Q(>&;)*DZqRDFU-Fu
-FWRSn`V-#FHgmk`K5zfA)fTWmT@NoB0e#M%JD(q3wBc_{@b}`ndD+iyeSCj#(fgr!#;q~q^Tb%D|F*w
-lq2PtapCoOnj5p+5XY7A9$68>lTkMqnsxhrXkXrtHL66~Y<?%lR^b_`pvlSH!A3P8lnQeH5YhVyubQp
-IRu1xWxa3<;%^bHc7GtfuzWjZy}i7*axt#U#(43Rao4Ios~7&+QDxTK*<#PzBmyGeA<<)WFfo)T2NhG
-LXX{b1KZs596-njW3ds`3-0l{#rFu-Zb7`siAhpeiX~=Vt3D%$=6oDt1Ff(lZ)DZsJw(NY_@>HKzny8
-Ye|^2O+d8<5D(Hy#*Q?1YEZbwCam92B@$XG`2RRwt5u{Fr-KZhrV|RNV_&cmVLU4UPk4odhOfQlh>Cf
-jGh;Tm4-T$e%@jE3~9X0To?<2J5QYU?d#J?X&9Dq%=*u{7fb6;!t@Laa2Xa>oD3AET}JF4+>r0V4yV%
-&eaTbL=XeS-odR4!!BYFVFGSl=aVg%yEtN$4LKsvX?4=|a82-U@Fp_xQkSBf;xu&p6su4Go21%c%mp4
-qvmn;v{cPyWwvm$u<=1K{@X~1R06epD2@d{lrra`v)nZdK;4>8r6j2hIl^cYxH@$i;XoWK$P+^$?62T
-r>p9zi*TfKiJy*{m~=q*s&jP(1bt!L$Y)0$6$m&JqyB+jW)EG%>uCl_Vx<?3#zz2D@;ylc9!5$^Y%dW
-j8+bG<XECC7hbaifXx_hUrWt4j6PduT)R~#x*a}ynl5yT1@kbVI^QU;e^bGNz8-LakHAChJ-1Ima|IW
-|0ulU(bi78I__~Z=7ha4d%AqQAJH8oY3AI1%^+kNNogyrSCw>kbz5JpXINX6<!xcXgod@ve3%fH)!7*
-s#??Bn#lV4K`1Tn+{aFSvs*(-(d$Cz2ri{RCELcO(ZlJM_JUmdJZDkePNQ}G)ENkrL;XTh>Hj+UM)u-
-`L1rL)GBXr`Fj9>x2s6|(6+Zf-N^=&;RNbK>A)IZ~#Mv}W6$+g94d2N(Yr&gCr+A5)7#WL%W);Lg&pm
-U&o_+ir3gr8C8X~vH#Lcbh-BFRGpKi9>-J~6lCgms)n+WqB7*VoO$M^^;WQ#xR6pQ4h%9rFF_?SI^r*
-3q7$lH^IdZNbcLdV<1LpfEXgqbV{(GHEUGxmCAIMWiCps^(i%78lby6k=GttRCMG=TcrOP!XRks8rEW
-!LClA#1p%BP@LAo9I;OAd{0DKrgbBR!<IK$o~)YEHPC%k1i*$8nJ<Zc9}jbj^d<I>L?PIYx#xrUY)dh
-oFL1*I4pW|%({8n^#$@Sbv|+!)S{N-y(RA7p8mb<Vgu&x;EG(dBlh3Kv;<wo!&crFds|S=B;wv_*FxM
-}zKs%jP&~#f>rk}8LG_oYz;#9RbfzR|P>}^_PvIy@ucZ#C7cat_vy~9LJroUmiS>Ud1DNgy$^XCF+iE
-M;(HDgRE1MH|GRV+riSOSBnsxG0K6g06|$DCb19<G!_y=+Q`r`bJz$Yo!b>O2tTAbp4{{2-pzk{fg@U
-gk-*Ik#E2vf#_A7W$S_RjXR&s?@g%;a3e0qEg@)=c+F;d{df%-Az36AqB?%G2z(@>q=+13VvM~iJFzv
-Dp6H@1B9MkKrd$@CM8?a>9<thgBY?eWirl<gM?>sOZ8)Iu@yytJT3{P6m`Ac1l98O{?tr1py3IHn28B
-BW@j~k#&WTra%xqJDynNd0VTflAOJ0<_1@o%f1F<Q&&OC#`-i@-+cZ4?=S`UMtHi%^c9dsOK#O(is-^
-mp3f$10wA5`ttiYsh*iTB^lamymMXSzS-$t#qK*&ScRFM>$(^xsOVdIVaoz<;jMMM&vsv@_iZzkAO<G
-ksx?;7$eWq)u{wa|{7Z!QK`TXFW!#LLzpr3oU6M&zLm%pcU%B9t(V0O7;W%^BG@N)Z*#XLSnPA_BWJJ
-p;m2TY)Fe7adV&6*xj%=~>MaHeIT{YX7bcyj^fYq8qH<8Mb>#ndXjU$(G~*)9XEK!D~<IDGk2j%@c(P
-ua;316kfGj7sLx$UbhkQ?j93iYMY#4-}g>2EFFFEsQ@G~mQaNlb*P`v&X6x)#9<5&7(9jkhtWMvlDtB
-6ywxb^AlUf)>*<S79Q^P9g`BkQrw~)nUlFu|uH66zVTKD&`6C2t7$=o|bM^7G5OzTjtB#b+qU%T8OD$
-<%0A{Q@8Z-6V(@7od34^#w6hY{4O%&r^s@ewzJCOSER1|Z-S>j%B%Qi(+K*}OjJa~dC7n8m~+KS0SX{
-%@3e5yw{Pq%417W$P1`6)82QDq02h7&g6kD#6bNJkhER}T;hfCbS8PwT9eFe;KE?mk5<#EdVI2{E%#A
-n37E8ueS|CgEvk<t|?8z*jO;v(eCAEGI}hSU`2N0*LR$1%w0{ub*{TMsFNI#&*ZIHb5vlQItGj2FY`L
-ktIf3=(8jZu&H}qPW8TVW?>3dMmd+GW;TTNJEf}#Un_DYA2{V;v^k(t(V#p&x8^ie3TT;@H-25Q{etN
-5u;|1PTNNNyrB=&;DYF(p4_ulp)#DN2`)T4-So&wVM7;^=gk_L~aw*^WGUZ;7v6UxJ6V?g7hLEau`;}
-_}pclcn=y)#ahwc6JF54kE&;dn;8(H8wX|h=?#oK87p{yt{#xft0Xnd;<UpNruCwbZ-m>9UME0mSTfo
-=JRrI)udNNeVlrJ5U}7uH}?ps*5u>wH}E0bhQU?>DSdejg^Atb+V(lQ&LBlx3Q1-Fcn#GQd^Q5Pq$VF
-(Nc9tWj9%uDsZTt+--GbdX~~3wyq(>ow*)APJapX-(jdcw-Pa24>R6(fcF}WSof0`^zv2w4^84@35wK
-2BWQIHmZ#t?Xpjz3@z6toI-l>lzUldu?S>-=b?BprMz^Vii$!mg0}>m*hAF<Ilkk3P4H-a+Cf>ccXF1
-HNO_DCOS_|&MqRg#7tNR!$>VK3$;bCHA4ohmYb`X8+hjI)ze*aa>OF=Q?I;dmXN;mgaEm`WyQ?wcoJM
-z7u@~&vJ#HR7k9bV)kj0Lg*$g}0tju%<C#kQ^lW+$ipz#`c5hckT^OT{XE`WL7RJl`^=m&8^_LmX{P3
-MB8OCxw2PHs<WyHvi@o84U^DG8X1ZMbn@g4|t~(OYk>ohjA|>%4=v-==u+J1tw-l2(yFlRrxg+l3}M<
-t=PW7M>ZiVU9GmnLu#YxY4?2NADcQ8`=-Pp(Y{@4q<@JhM{ksZ4Fb7fIDoPY*>~jYq3s{&}j+atGtl~
-(!1n=-}AI1qZL^tXf}-<L_a6rY=O2;lNrq4lGA)3XXIt{)?^&$&I&rZtmA_A3>MjMrX-WkScBiZg^%{
-)YdBXcl=Q4w>cjw76>1e72iN0KZ@h1okuF&LL}f6Z7kUfqSUD5#58K94J3zINvln|gAyANQDHa8@F@%
-O&ihhwx6v+q>zrixz@3w#^$y`QA7td0#9bTr+z-UalWuPb{9n>{YWZB}?ar5l7dhCl00!?R>vcEv{{1
-yjKP;^jjv45S^7O9UhwJj~Qvf2J7i0+K2Hl^cL?Xe?+WMMGu=vdaETE{Ai#~0Oe+iM(z42ps+DU?6Iv
-G!8<gtYWwg9~iCK$^~1c~Q@>+1Me+z=KZ3(6Un#x;3^JKMJGbcs~g!lGi`-p&;<uueH>nIrRDf7~G4W
-0M(?fE{czUeQQ#w6-%l$Pa@`@DXI8cuGZ_>NK#u#*J@yb`se@*DQ?U*TqCEH?oz81Oz9A~y*(JUGTwp
-OD2ixbrHWroTv_Nb>4mp|SgqDRQi;u$qsFE-l^~GB$s~2eHw-r9{W77tfv%`fsZNhq^ioM4E?;h1p;s
-{)tF>0kqky}B=Vie|SL=nW6i;sF6RQC_#L4V(E}q`5SyY`H0ccs!R9){dNz*6tJ4LPV4mJY-_iGvi!l
-@q~LS<utGI@(58lbTHGWjJ4jk$P%#{o{<%n9_wa>Y<ZgeKAKNA|UI2ti<d4pAfTF5TbR(kJKtN^N}#o
-u<}4+ItZ-?6607)E!oZWbBgK$6A$o?Fk!UOOzLZi<Cdsp=4fEcqoCAE#ak;f-1qnEZfXz4Tn(a)PCZ~
-eGl1kx_u|UHq-%HxtD@5ZR8zZjiIhm3khRVRTq86FuAP`wKV=eEehVJJ7S@yR^3e{s-j%4zRO1Ey^I*
-WAK&a@!^#VzWs>b?gu+M<))d#>mGvQCi1IeON)~&N24?`0pB;p=8rzJr9?_(ZgsXn`tvY9G(yikMxw5
-69_K;|vB6*11xwkqXlCMYcqHGT9(huy3_@@-X1FRKEJFQWfyEl6Oc9Hw;s9lim7AdhJ=8GG`MoRKD#B
-a^?Z}#W%oprDPMu4n7l>i85DBsMtyb`DZ?e8{2bZjA<kaHuVRE^Urk~}0DRVpb%D3PLfnB^2!Mx(ldL
-*b~bI~^2^E}L61tv*1OY5>c3Mwn+a|I1%48dVnFu-wa9IJ#OTu`Ha)hQ$gw#m$b{M|&n(f$gtw-S8B}
-s(PeIK0M6iiijfBU@%09llY}koyzR5OI1R&9bJ|CMOd=uP!Sd;s-Z_2Es8!F)u$W!*A&g6T9PUi#oN<
-KqX>z@zLKJ4Sy=XWFx2zqqTkt4DAjtYb*rXT<sI$m%CRor*n(5D3Tkm}6)bs_Jgg8xD@y(cimaJmRb+
-5ao~29HDms8|UloTYwO?JZDA^A6D!)&os>mjR^?jS{7nAnMzX@J{w$Yf%v}U6EB-$QM*UD*oLDfSjD!
-M_f^gIgmyDH~0JE^|CB7btU7^o^Q`X!b_-d`zxW2d~J0#?*_U`zi8P)h>@6aWAK2mnzTaZIWjXS_iG0
-02h-000&M003}la4&6dWMyn~FJE72ZfSI1UoLQYODoFHRVc_T(96wFNzEzN%gjqjtx(9!Eyyn_QSbzD
-bQA(A13bC7xZ>jzb8_P26>JrvmB2DeItof4Ii*-G08mQ<1QY-O00;n48F5T#PBLxb0002z0RR9K0001
-RX>c!XZ)9a`b1!LbWMz0RaCv=DL5{*O47~Rhxiv_u<c`DxxbcIiwCUDW8b`4~@O$D-K~#wKDe=sB>=`
-pIDnT;t>f?af5ZugyS5M}WLx8h_C1GZjx=dbmq-xv!{hOxgLr0{Jaqu^d=h^qX+c&Dz;78>gL}2GM`7
-r*7bOoiPCnoA3z_uMd2ka~IauYJ80IX%u%Gv6uY#Y3*Q=bNou?*lzw-s)8TT!|v_$m?bLjcLmgz;aIE
-i5anqJ9PP&Z?Qn^DUI@`I6(u*)u}aPoGs(!av<l$Fe|8znz#9?X4B}auiP(4d!247I*+qO9KQH00008
-08trnOaK4?00IC20000002%-Q0B~t=FK=*Va$$67Z*FrhUtei%X>?y-E^v7R08mQ<1QY-O00;n48F5U
-{Wn!qV0RR9t1^@sT0001RX>c!ZaAk5~bZKvHb1!3PWn*hDaCxm%TW-QI5d6<6R!9h2igExXF4139B_Y
-{>OX5)5P@$@KuOA_?^JuA5f9~wgj(5k7q7o}8PFS2%f$vu)utBaQVO*-buCYu@CY7Yy2=r-~l#Cxus?
-<QCU<aRH7Gk_;n@g_Pp~f+86RK8#;nJBfVt3@`obj$pHfy=tt>p&RKukh%5$zimD&={Dv1LhaC?sn+j
-rv+&oF=Jt7CE9y{kWxz$NeeoNmv!|49aG&zt?(SbuS+n1WiWbtD1l$X!V572}3A$ejyLV6V%BTsIGzo
-ncOs9;M4QB7J72fPU32{dU1_325klEgy7rH#4=NnX((5a3*;LG7lBg4n$^-|Blawb9`v0hAF%O_nZ86
-t%D_!Y-F~1T)Y)^!n{;gaL8RlOgS|b}Fj=2=F-hpwU!IpbuZOpzmtya*=*M1Fl9wg%0yL<&GptL$xwp
-QlBmaAczb-I_!&Sj4zhPiE=pMUVT(B)q4|hAI;Zrh836p;OeHQrkVLaHEdrLn2cRO@bar(w|y^2Kdh%
-DL0`v$eS0>Ye^VW4xCN41^th~Fv>2x#;TP)h>@6aWAK2mnzTaZLFlGc$k%002r9000;O003}la4&CgW
-pZJ3X>V?GFJ^LOWqM^UaCya8OK;ma5Wf3Y5D5xNK&-<a4fs@~K!LVfWV@FQ0)dvsHa9Y<l2q(uvHyK%
-NXepXNp^Z!q7RAs=D~T>Ypr%H%ht86HDnnRyGm)x_{ylVwvhSv*{s<w)n+5)rhV0L{8EW(wkBrykZSn
-Za{4Td<z@K*KWm|32h#Rn^fz0J5?cJn-@ksn|Mnw$xbJYa6{Tqb8?c%1OrgjMVXPJ_L?~%GitGhsp>#
-`AJ#R7%M%6lpb5vUK{F&3a`jT=kl@vKI#T#Uj?_hv3WZcpPXZ_B#fqSi$p3P=tJkV^}S~10=d~thm=J
-;n>g0KSCY^?#_AfB;i>5k>{o04#M{IV9Z$VwrfjsJkmQR7U>^0nEh4e0RQJc|mI-oW966$<8cX|tEyo
-O}@&4ctPp{KQKW?C-Y#WtQ`N3nvsLWEm&PV%Ap@PanLXhaR71Ek4_En{N?8tY&UotOIoyJ?=-ehBQ~Z
-3S%hlut{ow>wN3k6i}hRK<2MUEl{pk4RxR(VnX)AB;70hj9$tN*iJGkMCf$OO|}Ee3vPKFo$^oZ!A40
-(HKaod2a6kV59ENvpQ60wPk1n6QhM~s@l1rEGj-PP9U{7g&1M-9f<9hQl~=S8)5~=dUIml|i{@+g!9?
-tX!+MAM%;hd$(GCCnd*+3S1doH@?jG;XOgOcg$b27BmqW*=z`a(#_6<n&Z|MrfC#~K<1{EQt8sbhh?D
-=!OPQ5YUa9VK4p&BVZeeHZ5O7~n#jPG+bZa%6Sy(bkGPGS*Op9MPfW<W=Z*-ERwA-BF%4l7A3SJDbuc
-aUC8JW^924o@z%e;(^VsKk-<mf0;ZRrzqTTW(pQWaPR8!<HtYK=xKKE{8f%$Hr{knaQzi1q^n=V!gxn
-94jVZwI>xwmO<4TfmjwPUUyhCMO8w;Ezs34>TU+hu3~#&5|AtE^9)d7++gEjYK?Ui6~~f-qES*KJk(D
-4vmpb2Jc2O%!#7+w)r5@<GeqsSx~TBHveraP1lhQA2qj+Ig0qU-EuCo4)U@^j0Sd!0?$IO+Rd06|XTi
-}F3usu6pc*&F6n2D8DetQ|!6q@8sv#Et=h_-lGmdVfi?ngjNVqJ5zCyJQl52$@g`OwV>5Aq$y2F3xfs
-v!j#VDHp<;i%t=dWg7%QsP7MYr~JRHf&xeq2Q*JQWhbVP5O<Dx!I%;X0tzwZX8QZ<V?3^vGIaQ#SLi8
-ouK+bL_R62d7DrWH<t8xmaC#-|8l^M!^`e4o_h#<Y~T*3!!xaPI*!IxSOQ%y_ImIuw#iG%d*qBjppF8
-W#Gdc3Ss%GgwuiM8kW=N4-EbI+u|v`WNX0T^LmaYmZ`q_M+s@^AEIS6E{&LEzLTG~4&TOG-qUGMjHaV
-BoV<hQX`<s$-absj!&yCe9w!>M%(M@#uo*$7?bTfYQ&X?v2uqR6iq?Dow^_!Ls_k4^JHkxZ$&X+{uGO
-?HZvMcQRN<HwcF@+KZnR*JAIuXD4mrosl-*2ob7KPOnU{Dy@^c4{5qmfMG;`R<h!?J2_rL44;P=MU`>
-cU28;c}!mzVGE)(+ojAhXI1XMa9?p-29rL~+3qh{y4*nSqmW@K_c!74PWlwgL2p*^2=%I)nFgeHe5(6
-?q)>47%%%;RVT$h!>9Sf9e1lUA@B1J?niA|Md+0m7?Ms9<q-6H-(=4pOVYHx`2{RvFI|}iR^nNy1ivT
-FvixZEY+SevNz@LK?B3s#PNRh%A!6g-UOSUbQay0?j{}TL@{KP#=6xP-_tvN;bjd54UHEGybAN(s^IL
-fU<Y@Q6cq#=hcga_>)Fp)J##w3q>W-4g!>K|c0yqE{{T=+0|XQR000O8Q5kVeTxrr7fB*mh6afGL695
-1JaA|Naa%FKZUtei%X>?y-E^v8ejzJ2<APhzKo+7xG-e3+e+s<+*!GQ>Z);5XvABzZ<X7`i#^MBxy0W
-nmqOo$NkQCPwMq@=2ZT^kcFZecnx?xH@WLB6|O>8z0{)2<UMq=TD)52>5AOpXu}4a?zK2zdq#Vhd|MU
-+^{1#@_#0ciYINpAD_+-e*9&Y~~M8O9KQH0000808trnOdQ~h3TX`h0G2KQ022TJ0B~t=FLGsZFLGsZ
-UuJ1+WiD`e<r-^q+_v%i{R)iS%pH>x8z&#qxmMGe#PUR)v8CGTxHGmxLnKbeibpU2sna#dfA8+%L4Xg
-%_H_ECH;GIFyNlh$zOdlQ$;slC__-^U*o(T=Y+F`>HC*YkzFnNa>|(3ro@Lp#Yda;fjFtOFs+RE^Evv
-2-nR#C<?6}nKNeTC)ca?bXFGmj{n--Vya0jkxSXbLco3cr>dr=osrMi4b_wruov{O}8-Z(Z0pK;C1aA
-xSuqdPp1vlVK~D}Z*(1455k$U|L8UO0qX(PpTeESGf)s_G$?_!<At%38O)svN?Fc@4DNqlkxGG;Jws&
-(A8{h3Bx&6$)~$lvGKN*R^G((?T>#<Q(xG`YVCb6&LkY**yLFjnSjWb5QxdkY?G%BFlg|*v>Qdc1cRh
-RKUUV{bKR@hab;hoM*4j0Y-^5m-`0zTB+qvt6keRzv3VLE9xZKEY}Efkt}|=eDUJ^<@E&C>Zf1d>Ex>
-?>6d?4CP4ikS67#>uFs!kmsi&pmoHx<CkqC@o=d<6B`RJ5N9*C7D9V=KRAMv{$}yU(CG1ln9!3*1nt>
-IKX0|YuRb_oQ!NUV^m(8Psisc~#D4}XTH;wx+3j+Lp6p^mhd^^^KN1vJRVBZfrAto1|pXAknA2ksDci
-Bu~-jp?0$I*<etK-}pnDoS$%!Sq&7(BSKsPp5@KD4UStthgc)a{%-WIL{R0&u~!pD;VgTFGuO;At%id
-<l(bY@=Y-f1k2b>-w2}AF*&-$s0aDjhtD&+MQs_Lg;qM!1BR~**&j1F~dvt?ELjLG9*_?idbwb6_c#2
-*(5wHu_(lrjU9f4eq8gtSTnSDq0U~)8eYJEh0ZXL*a6G4c_Tq4ej0WSpgaxd#b?hk;I0{2RhIL7CkQ6
-l5GBYrS0<iE`(Tn1uM2i8MO92hRz@38gR!IwqO<`C`JOqUHaK?0+Z_Y-fTJ?G9j}nan5cw}5$D2EM>G
-t><nZYg&+quHcutTJa<4QXaH+~$*bms9T$QA};p!2t)vsAOuSz!%0a^WSCb@H&D}`L}+5ir?bK3#<7h
-49-16yKqKB&H*H;PxFH=)2XdF}W6apeWuyBV=Zlj$4$`vXF_ou_}xt&@$FnxScI`Zak8rg432Oj=w;#
-&<Gd(h1v_nuL1l7%teII3A=b7+1F)f^FDIOlWBtSoY(IF{+GA8IwP_+^`<#+37tgaGw5g?Y+bPy9kzm
-@CIO_?)I<*ghU$wS9THaeij_P9Z@nsxDjeiFX;U}olUrBSqVvmD4W2FU@QEy4!Dj88b6qIbpH$Gb79U
-28u|Ojkn-W8e@uGyg3KTaO6erpL^Ms1fH@cJ9#Nx@JFlCnY}d9dTvM?5mvo9W?@B-gT!VucB?BC9rCJ
-PJt0kMlFz##x>>gi7E;H%%fyYOV5g7*lgR2WCP^yuAf>|Y?_m->n>}fK_M42)J*N;!YmAAE2Xxn?^N{
-<5TyRre#yA=-sTwtok_(*yEyx*Kpv&5OSG&ZUzPYn{%F#SxR4|7(Kp$x}h2N+ta!NwxXe`eP^h+a8I3
-)NkP>51h^K*e6){*lZRt8?p<eXUB#sVNAIOlE6S3xPhjzOFG6w`5)1_&`7bv9QYO>l=jK@q5glOl-Fz
-Z;2XLKpu|=lXZeIcp!EpK%L9Rlt-<N*TJeOyQKW!R-C5F_WVed7HEV#@TO~#wu$;=ZN;>pg=Dq-EP08
-Vk@*pMf&WK2r<xDACu$QCc<y1>VaBqK;yRZ1U;<?WmJ&MlidXGUcDGQHbP9yb=_rVjkT@7&G}B#!2RB
-h9W=HUNiQts%3LG+<X=EIk%tXS6e1AQg?<Z2Z4@^c$RGz6=+Xq3?lI6zPyfM&cpsKPe%-LM6Oh5qV=b
-#sj*@(td%&2xWGez$Jv_GQ(68fzx8EmoUz4!_HVD$jWV$WO3(Mnby*r5as!X_GK3s!VgW4nfjBj8tz@
-nP9Xy4Is^bq0#`fe&9$c5wW=jArcw#ks`SJ4c<~3x(kcPLf;6{=!z@tl4*K_H7c1bfrpg4Di8k((lr5
-*QTk0K?c2}5WE86pup|wGM9yb90A7%p*?|^so*Vza}^-0mR-C3)6%d7)8JfLzc;43LLpYPu1PqnfDBl
-u)0!<#o)}kA;ER~E(K^91Q0v5C17)SpC0QTPVbSFmn!$ghCwNGf><iY{SIg6UiHZyAQ~?nh#?^8rdw7
-maZD3P)5K7!;xJ~R8Uus#Asd%NOZYbNM9DwEAf!LsQ(WCp>xJU_`96OQUx$aSBT*Vw1SH6<M4M_rH0A
-De&FLXrSVEh;!VjU6|OAh>u{qkE>P|?|O?$k)9%$R);%b_4^X_ggb-ews^sc7Ua!o82N2kaOSqu?Q;$
-D2F)rD!vze2CWQ-Em-F>*)eBt^wQ@pSg$r;2SU=R}#VV@Z{hP4|1?=TaBzwRK`~N&X)eKS)mWBxeh3V
-qeFZjUVmTrj@?-Qu_SN5ejgQW!##<8V{(5&A<ly5^~7dH<UV?jY%keGsp*2f-==6@Dl-@))6F0V#2B$
-hpiyB!bWRXLg6<+%!(JAIzq7%1;|@MfKVb7?$YaS6L?1~l4ahjuAAmYVLIPvh4-Q54{o_;%uJWC4F(o
-l?Pq4(})Rv(mm&O1F`&izaB%v7`*ze}V3H$zdH-IF9W|o6YX4%JxWp~`XE4yr<PLKw(>_{R{eNv*&kV
-fhhpHh;-y%eQFVS4>di*<eZ>~h22?2g212d4ZX@Hohh5cF+M{pGi0`GG;zPFE)fQB{BSgnZF9(NURX+
-cyawZvxD@_{iQqCaSuppc!EJo^1sf9W_Gb6eAe+Tu&+WVgYElg|hI#RWa@7wtw6&Fx_7sc(5IH>ub?k
-ZAFIxT5MRwy7lA!e=MN8F-!3w-X8p&oSqW)sl!IGq5c)vk2IG^<{04%V`VOqP@yMda&*F=i@=mU>jc&
-s`Ht7Oc&}F5E=MDE*-CZ9qkStu+Yq2zFv%%;l>}TxO!4|?&uZz(_&h#&zZHYoFh15?c)#*_+JnEJuE7
-a$t&ToVgA?>Xss9rVb~VKJa$Abx^Yqu_|9@%EpI2kG*)yb{)pUasA-o^a@|SU#Zz<hR679i;MFIZ$%Z
-u$EPOoj1h1Yzm$-`|jV#VE|A}3fGe1vpkc?MUf`ge#Ryr_%SB<`5S{?2xonV(<$^TqiFP2wOsNDg3ga
-AGD?x)Y*dKsmp2JzFh1m5TudI~OeB`ZSR9arBf%!MJh=7yg*r6Y%vwE2nO{(g>V7Aug%(YYwY6OvX?r
-1SN#48r(a-(fDs)MI-|PhN-NTnDaGVZVW3DyUN;d6%#<!TUhZ>YN!?_Nhaf?pc8Qte#$I*HKcInMY9<
-2<IDg;%%olQi2)#BS-~}B?x@b~iA>)@Pg0%(o+BRKTu)QfBF7JJOwsE7V5G#=$(JW<Mi<}=9uq2!@YS
-Euqooqtf1m44`F8jB2mpl<*}T18Lc6W$gze7zbZ|5m)+u9eY*Y5Y;q(B&=KCMw()N{W|Lso__A%B}y5
-ay5Pt7Tw8tJ~5%GI4vrfNFu%6v!ldM=gf8q6g(N3&WQH6mMiC#da#0@&WwlG$b#t>I%--y$(cZ#QO~T
-39$jnTDpKQjLaEx_Qyqh+8dBmkD!7@dV7oTTQ$0$nlM|VNIRr#jfYSmypfs>*&4(gfyOu6yV(8-}`$+
-V+K)!b`vS@mAm({Cj-=k>mCQe%QU_tOn;Pco1KPT<P|T#7)8}s%d;0Pi(nhFEzcpBm*kw|JB6>N`&E9
-wA|glY2oc#~HSfD44r$eE+O|TGYXf7I==%rXA6<{a3ryWz2#44qsJ+$%-d}@xgP%ATIVj#(GStgMUOS
-NBP&5Crn6YX9{f5er@JfqnyJmZR8`zY&Dxd$PY=z*#77>fS+e>s8p&6NRYb(=th~8%Y2GiQLSixXXV3
-20{ZfP3S=-m)??@QU4>oT@765_G1hJC}>?3(fJ0y2SEa1DsKHh4Lqwfs(yT9KkDNPKEm+Sp?p1{zgD{
-Gf>JI>X^jLM;w7)dz!5x?i_V0$LX2w$A?Uoe2Z|hjA$sSNSdsvjK&V0dr;o<rhRDNDkWTiK3zTI*SoL
-DhrBiH6maIg@6EVgfBx*oHoX5yBQae`s<AFXU^UeDu*a!gODRMMjmg4`;CKRzu0K29to*-x8|jsHkRO
-R&@~(DB*lc-7!&Y8qT<#xT}spJ-C|bdpQJ>)g6RXnv8aFo4r)FqZuu6!`v4bAtq(tPzaIzx*C;}0Uv*
-(Wl3-%rv`6C!v73F8*VtVS>|S>_tL4&QB}2GCuTi---orVQFbepcZx#kh0O0USnmmg^9!DytVF7<iB$
-rtAW4pj?$xGRajXj;hted39DV9l?d?97jd3<}?vl#U3?O?y6g_!N%m!Yh^h8z#kN4h;=tatyVNAT5jT
-!B`6e^YP<Vp_tkLn_`reV@b!<>9v^<4;5W15ir?1QY-O00;n48F5U3ZB@hfEdT(QwEzGX0001RX>c!c
-WpOWZWpQ6=ZgX^DY-}!YdF6d;liS9%;CKBB?C5F%MkMs8#9K8ElXxxZMs@vAN%r;bN)s3)n=`lq0R#Y
-NMEm-`-}C5qH%N}-)Na+H5}5;ZpMIS_?>@cl+g(x=+x@ujMNuTxu50@-DOW>V??+Ma-wz(h_jP-HT{Y
-M0&vsD1dZB&|H~X=w^<M{FWE8t@Th+SY*q3XuD%T&?i@UOK0JyI3Q^n;UY_XG@Y8VmnkQmVGw%JzK-u
-E2;RfX0!WpgcxzHLV?CU#|2=Uv$kqF04p39)%YZ)96t)#b&lXf~}b(|x=ydNH*7el3Q1GE|>}q5yUMv
-Bde&UF^iV+E$_;jug&!W&aV1s7hbcpT{cn;_v&a7dz36y4LIFwydkoTk~n2SbrP?=gjK5Y}%$;1FWA!
-(Ud!JtmZ9ryJ{O%_uu)?c|y~hlmq`LWU&wu%woQ4Z-r@{7POOVp{5>c+}#LKTdT8fcU?KEYE3y-x1t!
-vex6*55q@myYBf)Oc>T?bZ-01as%_f4rf$oPs#p!hzOUyA{8Nl=0U&R%_u~!zMPHyq*{^R9JRze7B|f
-c1H^Q)V=d%Y1Jg=K!EbF?&PcQqvg)V&$XzjmzFf*X)c3nmwt*WNz4)dhnH@Gi~eX|jLaa;A{zN|%aJ5
-S!cep9@7`PIwsUKU?}@%G<dzAaw8{_5p7Uwr*?PPO+ijZRC>QgbV?Z@RiX$g%gku@_<vYxj}f6yg)?D
-?oVMsQa$iR6Wg!8qlg1^iF{q3)$>YjQ~cy!M_T|8{9qO`nssAhMVBJfN^y(>{ngi!Ulsfy(l-uC_are
-@AKqU`BA*0U&Ri77OQ<#Z@53A8IXGEejp0S4vLM!zIoEL{f_aP$I6`>3Y`8Lr^%bA{H7dk3~v6F{_@L
-gMAr*mK2`9oK%CyZZr)Vgv!_2WRrBjfN~#eN*0vd;D?!0QjQehE+j`(3s~YcKe)s*G@4o%^t9Qk_zrO
-z3uePsL!L}2y0A1BIHdO%{g8v7kk~5`>Yh--`lk`qll;d`-=K_A3_p~?F7aV#)Z)n|MA%Ebl`v6A_G<
-T_(NDj;N6}`&}qBKPTO8~v?%drJ=xU|S;{!abO3tb}rC=NpgbslWQHo@Irb%3wHSB4B%cy>wHumecF0
-4h7KZ?Zo9Tb4hbWgp(Z|J#SFtH&R%X8)4%mY-2+t`AkdX&XUrs%^4kNchmEXxc)T+vV4NyYI4RGhHV5
-_FTfQ2XO=vzIZ^Ndsy?n@k-1kTs_`$E7WlLKXSmbHXu&saIM_b;0m*33k;5a0s>0#IG^jf90o<nEH09
-@tN#$|5!&JXj@^KrR*glG4Wi!SuKoKQsQ69{1>y%VN@^ST<`QQV2C=C|Bpb_DB}~U$PltYxFvzmyPyn
-frC6j%(DMzvVuHVP1bqC}LfO1?Qkz7?msz9EB${Pi%Wzx-GLtu=+>vDY~Bmm${fM8|Sj0|FC77|CE>s
-8DQ9suT41MQ|}Ei#%K<amgvK+eZQCk6`)K4X8l40;0<0j|9a@Mh)|V`dZ)0zzoesdmT_wScsAxb6TgE
-QU|H*%Z6s8XCWNjj~_+ae&qN2%MczGf!T$NFK+8m_+jDivWtKp}BOK%4U+X*#H>^`La1=t!kXGkpI$q
-dv>x%OPE`RmC&GdUFa74b!hj=PLxfuT*f<QZ^d{MT0qUW$T>#XI_qo}E>Bs3uoJNTEDHTXE>U91aF<E
-?Xh=UakA{onQNnm4dogpHb1}`K07%dE26oCb`oO>LYqLq=tNFt(q_Ca}sXyF8W{V@u)_-{WLvDL0qJD
-b)EUZljrL4c)a!4PrA^hF;6|j=BF62x6k6W5a2z=rn_TJQTH{%iR^UH9$RjH*aZ^(RrLtX`i@whhp)*
-CU(K~=M5!PDkB_&iL$yMeCVwDo34Mwk<qn7^oyj;!`1c`#kZL5*0)LM{s&d?;%as}4zd3tAAafk(v#z
-~2Gb?50>9j`Zg@=?=>Jb+rZ+=B|R#gWds9LEln>8_8!1<Yj=DT(_XQVNV50BV~U`SY}cZwm1K%k{UrW
-1oQm>-5A?s0J0)z(ARalDr@K(2z~JKfM_Z|`Ot=&c3*ESXgB4pNLE5L$r@Gxm{Fd52@G`I_6SVYR6Pa
-aHQuzF-0N|*5rFMSx{S<^Ctm1{Cc6S{OCGxMrjy?SF#chI0|5{xfS{J!5!PqeuTenX?(4+XYFvQwOF@
-Oj24*pwTTjkR+HInRQE&B=3|U0i4nu{*>D#(Sx;*nnVbu<r!xq%slu0eFtFhYQpf~LTF%LNMqHPvN90
-uVZ{@;P{4B!@t$ggt?+;A9Rxf9fD5~J6!-l<=Bizk~Q)lxUJOh}yYMgmGRDp902#fyw(k7`Z?2beHQ)
-pV&O9pd})ClapY=U?0!T7E)FRQ)~|6F>(7rJWJCJ+kY$B`Qpd!~^qiM~Z66QcG=I;x8nY^1jgWC-SU9
-A$qp12P0t?o-isUIjB|c>#+bGW=i~{=cvdSN{ACsj>wH#fkNf)lTx6*LKddWpk74g2_^j(pkMVpkO5K
-{(7K`r?@ENuBv@m1#8Uta;%M2A1JcnfMV0L`^@J~nzgw1)41QZmPsk1JdW53-Gw=-*DC!~O0ZwQP=4W
-hrwI(s45wIqK^GQ98m9SRF{EQXU$e@123MmYk-g2>8HYQoWEin$@_=`U&v%t(wNQfSYnY|jMFhbQ+8x
-3aE!!z1({vzI6>AIJ`b#Za=B{5KtXPStX${VYcy}G-p);Gzny1p5a0hZRNEmNss=+N*8&7y54CEE*7#
-&n+G&R~GRiN1gPRc?3ZUR#>9LNqQC?t6QU#l!+Nvt^Qgo}@?imsd8mTd=-?T7?a{b$KX8RK>sZp{uJg
-Ggarwvst7?OBN<ww)2!CXdZD>774X11I6K6@j<#3*fuV^I2<EB6OG_F^>Dquv!dh_mvXsMn9+hrlux}
-VR|EY`D`_A}ZNvfP8kWw(1__5q7=1o6;BKB+`#!LR`75M{Pz`|lSvNyXCCbAx&s;!L2%A98p<y0*I-4
-oekk=aGLufUIR^vMOy;N#^E?(&U`>0pM(P}ME&~$8V=p-}=XjoWx+wPl9j`}$HKw{-WOMtyxmJ<Pn=~
--)PUUl2C5S<G-b7rX~OH%V>OwFYmZF;g&n^wYfIfflW=Rou(Eh3!;goQzX7Chf%1xlv`q2#xkNn4{G(
-*dP<G~g%fCLo6ZU?-He_ZR|nXYFC~SHO7GCPYo{BLaY=eem}RR?Y|DO-MVIJnU3z_OL5(8M8k9kblUZ
-0H>hRC~$<UWDhGk6ZTk75*=!YHuua!u!qc0X++V%0P<0Zu!~%A$yR%ALZQTrw02;*YI~9;iweGyMJ8;
-Q7mtSJQku7@fn4!s{4E_c{vL^Of`@3;CagrjppKB5dwmUzx4cGt&S?Y<V+JB6+7zHA)JP)G?kZ5hRst
-m#lqJ%AgB{zXQRT%Q6HN^oa8%PaVwN@l<HtBcz8NUZp?-faCC-S{feoJIVEo5e#pQp`6Lo#T_8wB~JT
-79#gxhoF*r0LSGM;vIxfW=n5`CIHRz8i;H0sN|?8|`eNmquod!dKQkm@NoXoej7OnnWQthQH%m^>tpf
-s(Mm_-IIBXXwJYO}ip$l`?*+vQA5k7mnniK0C&}X`?513>ZCk%k~dv0UYhSo(0Vr47~K`#qx@HMNfK2
-@NrDn9)L55$g%1<sW~*(U^S-(WX)P8*K>w57wMF8&Dl8Di!Oq6vSj+lM}st{UIJXB^FHeTgl)LHfo+5
-Zsc%J*E4S)gW9e+}TH|M?BVF6=al4Z#U3&AjsK)f@dAsh*jhHK{R<LK>)yZCx7ak~WIZ7iNq9gJPP`g
-N;B1aEW;<+q^LZKA3%+CC#9VHZl)VuNkV_;%UIGZf6jqkZ%2!)hH;>n}sFtDkxW&YN7LaW)=TW@q&fn
-AB4wn@iiKd_ybIi#d+z&lF(Kz|zfnaaR0%lfW73}l2JSxl)9b2bETs_hn76Ld^A2SaYC0rHz`P%30aY
-?xSJ3DzzL(F5z0W8NcxzP(GfG!Y0Bl-_~7-nJ$3)xJlTxNDIsa<64?6PWQ1=plCrdWi8RBNPQ?80LOW
-nlXhOZT4n{fd`Y^v}<8Nm9$-t)y{6y){q@q1v5P1b&--1BVdmIDXg`W=qb@MBt4ER$)a@H|LCr?+kT5
-yc+1D+_>}w(2F>L>r~E3@MdiM8l{ndD-Qa&)9^)8Nyx)k`{yIy)AJ9T!FCfdfNVVq%jNIUV>3VdJjt9
-NnwM;TWcoa{|jqox731mqMF4_2yVA<a?Fz6roc3vkXnn$oOB2I}h2jzN9qy%W~##a=WQ0_XE=?5UB3u
-#neE}!MkaZMS_=g!AJ$#1a4aqKe@C2H+L*-TDA1`=&%%Fj^pe->4e8xStCYQ(8D#b>$lM<XlE(&ZAC1
-^!*8GmGdNZZj=&#CM78rEB@0lt=zQ=E;jcp&WP?FLpg}lE`RZTV!>7m){Yqtl3mvrSq5kA@NU}rQKGg
-jK!esWUQE%#3tBMvvoKk1CskihfpYYaB=|kYG{)?A$^np6uWC6dw{+Le8B)k?aF4Aiueb-1{F`F%(cn
-m?^Y(>@d?EM9LR(t)T{FjRW<g$4cyF=5&Bo69bh=@h>o(!7k$LQnulb)A4U%eAM&yeNjB`EDAaEDyY4
-W{lkb3&Vy|UTAqyg`aF#WPXt{vM(}k-mEN3mDU);s4w0ML^I33`v3Y5-wA2;|rOBVzH2}oCUi`3l(kr
-0uHn>fTbeC~snN@ffV$!g1zMX+w~fD#_FRQgpcz4_Ja|Mm6D%jEUIdONJ?N{r}hB()9^MxrIIi0<m2l
-kDc2c>C(7-h$Q$<TD^|I)u=+sBv^_7Te?axGa~P4#;(lvw)bbsqIwu!c?<JF**IJH~-OAO=iWlvb11S
-h4==Eu-&g)*cVa!!(fIOhCI>y-ZeoWA4U#qlO5PK=naokp4oho^h^?+eS;DEcSJD~MM#kCTgx1f1EMo
->0+~p0z=v5JL<keP;g8r7HYlzI{?|73fdY{MZ9qk4tan0mB*j8_qZ?vk<aO2larxJBj-KEe`V}a3q8}
-Y5q3T7;Ol@eVj5jOB_GHJRERO>`Czz%YcLBTz9tRzAwyw8rZJ6H9J==qjexdPFX@?A*Eg+u*<q_q8_>
-Ymz$g7YDfhJTndl8z(J$s4ML(4y8(-j9s3R@RRjOr7p{L-X=?E*L*%0#p$ApLW<eR~yW^CNvTkgT8@I
->|!^G#o&4XEA4|(7-P2l|2#76h;>wffbFVn^0MhI{hXRw|r;LpTr`rb!(cw&ZgBebWj!DfjCB7Gjq5_
-$or>aCXCifbWs}+hy6;EEN#n14@#Pz?4{pBo3dE_NG`r<WmpH2M-pS%8-OK^DZvkZR;Q@+2?%29?ca?
-LU&TFBLE7PgUK2eGlBEV{I*YG24ameBzhOF{;<ilv+;t_!^_zP|6;rU48nVwVe;t{-_>v+3$t@bpD$C
-0zWQ&yZ&_Q~k#xCP4^op85y<9~x%kg@Gs<mYqfh>8L(3vsE+5>aTXY08B-W<l8wt0?c7eQ1m3KipsBg
-8nzrdqcf*9Hzs?3@4noY3D<cDXgya_PVk>bQOkl<BbgnTrOS$Uqsvqby{#BfW&)qX%{t`WsYbBh}f;(
-|P+TAX#B}$25b%Cw<E&$`UoT2{~CW9}P1te$gg1Tqxq!b=JzVZ_T|$SHHrI@f-J2`BKj7Dp}>G@ROp7
-&6%vs$A)!Zbr=%w9l}yx9KFhRr4^8mV!gw-#`lOb;*(hKNuvTJU#!t;M_{jf3g$#bhNMNqeGGsv7K^4
-`VC?8(y}iD0VQCi0y)YG%_o@1pUU{VG2Q+S@{kxO#04NeKc=8eD6Qv)w?P%=bBRXM2yMrVdxNns26|K
-}GXi5#OW!YE(;Ls4-sP|~<^bHt&3lp~sT=hpZRW$=NZ1!a0Qg~AorQUktTorzjWTBR>W+@G$8_apd%!
-V8(7<M;Z5M+Ft`YpLb@lI5R8_Yq6$9`ksE?VDhmf>i_&34n?;R)P!KTe(TTDQ9$kl|t@hV?S-h?JXcu
-2IqT5+h}g`(a({rE}((mj{J1qOY^}7xIwu#TCfI@^{3X*>-fsXn78AS7p7z*5Mo5Lmjf!3r3{(!50n1
-?*BJHVlS@ZQ8sNCe?L75Vfm}m)};wM#L;j(F_xQhEDLG;367bE3&jHsExz%ZTC_$liqqPpC*^3M)UV)
-?6OmFWY{1Qa4fITPi|h3*9g?95c{E^z+9y1<)=z<Xh({qwA7mMQ$R}d0CK<CkFV>d;Oh}3*u-SoV*{T
-d(gOA#qEaQkmrR%)V1e*vrK?pbHP^g|{k!I8rQ{k-lAz)M<Lcr(BXR3m-cQ`6)1YF!WIWeBtSO~e6-q
-HC;L$WRwk1Uz?M;%=<PvMTLP^TF(G92xS3uh3YIMJ0A{}EQK1~)LA8fKg9v;a9C$um6+8<Zze&}a19k
-bDFU409<sRiw+`mGwt%Gal86b;(ND;Hmo@eo{m6!m_urJT^964j(L$vuP`fN+9?=OkR)Z$`naU@dm)Y
-fgHBm<i{Ve{*OPR>V$rv9f-4|FRK|S7!fjzsBPA0NJEfFU<qhNnMV>SJofD#gLWt2WbcGXZpN`2E}uN
-P21$LtLT}-d?$DJ_V7;Go`?`Me`_G=|@$pzQiXFm%Pn|dB247J82M2m$t+F}LNiKE{IpMP=JI4`t@U`
-mOCK_C*9t_bwx^(y`?5`!MI9b82L|aB<C2W;d)sRR@;#fp%^`BYN_GfqTSNHI&8u-{lc}JQQI%iTg6r
-i>>9ms4yXN>y@vfy*pro!i8@<lzgGQ3El7Y6a{ui?J}rfae$MUay+vP@DenkEvd)r%qh4LYgG8pcnGW
-|O^-BhTqMV{m5UVe?mEHHVIFslpbEoA)qoAjHi^ojEYH{px{Fv?-8Z)r?33_c>*dek1kWC(2q{3F#wn
-qyC7NTb%QRY$Zhq-OYLOA=D7gY5OA9wx>12oZJcan(x>z1~eDrq9{y^+}>Ta{>c8VwyVXhsPTKwJ~9s
-)5^PZpReeA;9_y^hLb{dCTMW1(>maNn#^V~lJRY#}p_MWL$r_J-j%B|hOCtsh0ydLNWZ!q~V8@loWyU
-}qJ%6+0Psy_*3>u`2KB9!-^HCg@b-7z@%H-2!@(Fm#9#fu}(=W5+akQd|%&$j0B!d=4zdC<Hl9@a`g%
-fdyhU+DE7J7L9^y;`*IRY}k6N&=;7`H^CifhuOS*o5CIbHdd#O3tOzy0gt^*67+O#=xRzei1hlPVc*K
-Lw8i4mqN<iul2(TS3&aE8be2n@t%kyL<~H&S-?vAL31Mm#=F;$xKe59iliC1MF0wDe#gL5XmFecv9qj
-mjCY0vkzC(9+uE!5qAc~y&G1np@ztWrjSCmj0>HDenPQPdEb_SWg(THEL)W2SToUfv_}*eKCBffbx#~
-Y#T1AI(2qw0pI?$wgXBXsHfbQ9FdK)7#3s<?-uCTxYz$>Oj_C$W7uB&<rHneK>CeS@vv85K&(Xoer@}
-%a&JSUZoU@kLu8^S9F>F^+)Y^I&(RzGtF1{=qtSl2#^a3b<#X%h-dF8D)+93}7CgQZ(Hy@k!uDO`<3Q
-V|5U5b1p5<_RRiG4icw22-n^8^0gp+dE$IGaJriLm2U7LPN!m_APR)>7w1=E=pX+~5hh%j8jiF?saFU
-O;Z~Xn4x)njB}8t-wE`B99hBZ=5s5=mrH@4oahHi?mF>$s{m`bI5OQC!k_sz^Lj@<6*!x;cF-)Sg>*~
-6Kte2EE6^q@d<sc(@;VPa^0TJBkEuJeFFdmNl1!TpfuIDb%L{%WJF756a*gB2Jz4eM^_VUZ*G;8L~iS
-HKeh#B<m`8`L-_i)PUS*Epp&>|z3=gi1Bi%B$_}hHyXir!P^>o~&4S_v0_7G3R8mmLNYL{M1FFyFlYI
-mK8Y%L}AMO7B_@g?$VF7<DI3RQcolDeW6b7t>+3v>y(<_j11D$kTFSgYufVR+3=&XgFD<(atjG$pa>H
-oHhPjWJbmT3sGNwOY9D$Em*yBn3n$5<2+O9ID5WIw&kNQ9YU7AEmbbe-%C4TNX?v8c8(!Kd%xWZfu|x
-bz6E)>z>3s=0j_TWl^gB9ak$%G*GC!!lwW#(+eQ54Tf5J#Z>2k=f1onc=7Sfi)6J?R212HXaR1l1@xV
-v!(#C^wGe~YOb-$Mv6y6gd<T0K@Ew2v9hJwk3rL89E@i?o`DFrNsO}FGi0W<YOEZ)KHmK5IVuNv9IWC
-)Q0UCtl>G)UeT7k$`EM~@zu}Y+OU7C<FmM?pv|<!8c!|n%+Z8JJEhfUV)8L*cZUXE<R`~hpFUIg8<A~
-hpcEix1n@ZQ?O(305g_pNN>qs&La>-Myn?|ACGw3-53?vX;P>3&Uwh6H1M<?*s9)3x%oXtyR?BN2omE
-+iRQw4PWwxUysDfR;d3iLZTu|b9(VdFs6d$c}mS~PQDFnOu5j5-Iz{<-SY;0G-~1je<~IlktY+=b%Gi
-HqzV#%FjPo}06|w7rosf0A)homq^Vx8g^SB;AVCokSqteECpq?|T73W07yc=}DQ{;)yOfzX8(Ygu969
-?xVciY^HEZP9S}CJbtN0s0Fd{eEc-}Nv!bMwpMyU+7WDu1bB|4Z_=6>Z-|9kOpO$<QG1lJJTj9lImR1
-jKIYyK;<nfL+t_4>*<tiC3_3qik^xR1-DT7B3Yg?auTr~)4Iq;_E*2QGQ;UV%01LDq_YEF@UF^yRcGB
-j_V$q8=Y)!=;eQ;acYo5FvU;Ys=jBJ%t3m>mWmNVGcCNud|eSCCjO%@%TnS>Sqn@&CJG%?{u)MG7x#3
-TB~!$$DwIL=`5dldKm$#jr=8Wb!R5wcDhbIe$-&e{?N(M_1SGuD3uqfeDi9w#YBnEr}d>t9#R32)Mv?
-J_@i=G6TdWC4pvSKr%`RT<~EGUy}&31UVzC(1_}F`KBo_DBI>T~)9ikA>{6Wx}_H=+nFU98C<|UZ`{}
-#2-la*-v#?b(30+K%;{?UD=NnQWTF3%gXtM5{!&BG!zu0x%!U@jZ^%}UAWlNYQ*;VyH9Ye)0ukRK<^R
-da8RaRuRMona?Z7JeFMs-;pY^8qM|aTmwl))8y-yDZ5bTsta6cCvEhrS`Dg2A&lcU`dHxv!Ol}A7bMJ
-gVkGY3R7)_NmM47c&dtb<Y<ko%v>}tAt7g87XhYX?cpiSqkiajYdwvdhG&{%pBO|VOu-$#&Q^Cy(3#v
-8kjLHCjx@q-i_UEJb;HCE#E)eX68%ph%Kh$+BROUeY-!+1~f^Ko2$PkfXi@d2-_2xL!~svgDQA=%!<Q
-)?9+Eb}OOPtrn}GuzUM+YKeKoT=1*QCDo{f?6gXp2Q4uFF{Nv`S#IZ@}co&G@Do(szJ1gMhm7HDZ}hW
-wtL|O@g3PfXOJpyQjcuFb9Rsq?f=#$^5*1-ef5M-1}zkH?)#>_b2L24zOzWaM6=oDqz7i4?#e?-W@0f
-pj`kmx>W6P_@uXE*iWNaFpo1?thodPHZhCoQL5Y02rV4tSs%!PfzS(DrI^csB56Ls<vc^3`V7Ib&f&!
-lyQoEjUhM-PU%tGM|#v?C=nwCuO)dWd&t8z@k<;Ij}Z7quP)>t%Sf8b3Y)kVxHrdSlZN)~4&g`1vit2
-oGdb+yBQyy4;!Q<bFiWah%)d%5@y2z^0U{;u4LFX@F03;5mdB-mM`Hqqa07j8Orvr`smBL(Xnk$E{r_
-b4q0wTQDT-SAoJEya|9fQjsFS?|d@AR$$lZ{jQ%vIqCsG5DOZYw(%gIU$h9?!o7L^!BWS-UyHGp{a(B
-@`oe6pe=SZhHqLq{b%$e-<3_Z#lXA&2RgK1bVLpINN=W0*D4CocAp)+S;4Ds9c7gFG8C>SF%mp(0gNR
-7vcBdD=F!t7lBtVn2UR-i-YJ(9Mey29T^u>YsK<y$m#Xo%93ew=#%DX~Vh)O5F?w$09~-;OS9~Nf(uv
-pyPTr#O9{X+<l@3`RnMfZEi$_ELQ`M!e%P>67bgR#F1;C=gb0)=#-R7}W6E?WuAjZ%ETM%@|kaKHdM8
-5n^=J%sqj#Ma5vTAnSP(HrwZdPFgMYfvJb&K$;oUQP*HcUZG-ZT+EP6wf0T4C_>9saYze@dTcR$Hs*F
-xyomU^rMW_aYK}2w5FKcM(8d=vMjy-S6xGOy@@i64KCCM=d)APxNUO>C*<NH#-5A*6o%@z(xiVCAaDS
-1ZcFuI+?d4sxD9;rkC(^c|Cwg;m83lE1QSi(%ekMsaY%|v&bizfqpHXIs3;&9k(8AX_#|)y>I@1s*a?
-;0JPgn!ew2DE<Szr)feBrd=U;FNLqUbU_bl)GVtTNV|35+YGZ+)X*)Pr<RPXEY?sq1Pw33;sC9GHC(J
-S>XUsjSB!lFSob^#()qXg2>R5J?sO!1FLj%1#$heGSpLr|RwJ4hc7Os#+w_cesCXNk2QC=1cL0+qnWa
-0oQ^N`WZ{BaCauAEN=x{(3!(@)P{zDWM~$K=^(sHi<{|HmKxFjYUl>nn7C^%(=3J8{7F-0IVQ_IZU#{
-lJ_JTpqc`cUrhsDTty4tb>Q~<(od8fX}h@Gxq}=TR@&Qt8jenW<FWa@znNvJEkOkSKd;5?+Lb{Wfs5x
-EW2>0IBF&oU;LXbxE%D^J`3R60WbI<Z%_6=I?#gv*q$i?aIj_OG_GNoU)CKZ@9}JdED7yDyS$2(0t!I
-+@$9n-b9YzhL`6GGUMB-(AydK2nUS{y^(vH_uHy-#di`R)dG`%RY3NfOlz6V(iu#ZU)U8zxKmSfeu8o
-t{?xh8loI}ll;kX>i>jX?kmZo!u4-w*>yy;Qpk!ubi8?qtfs`J^;DYc$naxZ>~(**BsUDMTL+KlWBu`
-az<ZfK@5eyW80G73=ry?lQ)r}J<VSCcVDMV9u+F;_bne&WtC0&=`(3h$Rb`kR3V{fS>zVa^~JM+WC%c
-1}S|#qOF)90|!6%2%tZuEs;A?+o`(Qn*Or-F5A^DA$0G$sHNDGqv`Wi6^7b9wsm8U>@xyI$hgtRYWM|
-Ig)-+W$o*b!fnt&IJOoL3b<2w4lr*BlP!D=C^DGD<4zVxV$K$nZ)GFu_{K)w@9Wk`^c`lf#|J0SO4n;
-;bQY%xLEny0XN+l}B@UERqFe*fZ|tG8W+c_1h9L9J517Q=O4I7%CMM9KrI3H4DKbmlGQf7;TUw@v?Qs
-ZRAqgUa=CKSvUKf{qWZ8X-tRc+&qrp%{J}dWPB)=?2;zSb6@`qwdpm0FXb$pbB=LNuo`Q7Bil>N2N$8
-8;GqW2+%@d=98#d%`yH+Q3P2DUJ@hfZupiRsc~5z5*>SqzkcywC8OX7ozRzeADjL^3J$oXpn~owmmT#
-hn%z&&%JVo-^|J=%PIIrTlNaphrRD$u7LbjNPH+<m7$JA!N#=qOa~s1H1?sw8w5}AZJrzwQKoW>9Cs*
-`4BAKLX<2Pd=bQA-=OX*N!J~PZ4gaHvK5Q%U`UD%a$@d%LrHT<pt=?EK8PSJacZ=#`imz%L3k8+y#nl
--EMnf0gT>D($p_v3=G;pLit<!l({`9W8=q;9hOD)|DVuA-{gYeUjW@u@gbn!1P5}dPR}b<P($*$*V3|
-qSP(9`O#;TK^5t9Nq8p%7Y)OmTvoTV`tmM5#PdQpD7#{{2!VVp@GNls0Z0nSWOr4zTwjd$eQI7MfV5R
-~Y7OnjzNl*o`(m84FFmSXB^x}p1cEtxx#;#*g&w4gEl&qvVG`9x`H(N!77ZT>S5)8fWhGI|N8dMr~mM
-+qDutpWVUOIziQ+X~dsbGj@0h$G7+zMsf@Z$A#|>n_io9db_OGvXu*=TT394Q@UW-aWCL9%M35POho6
-hom2xlpEI5Mh?6WcDfbVVi?sJc>eFrDUGT8C@buDV=sg&%GsH`I9VaN(zRwI)lj^~yBR$nkarbSnYgL
-WLHO`fuTz+(bKiuOSe-M5Z2heA(Hr_IGQ7}vU%bh}YUdKKC*N5ezD&>+LkXzqOo#a*L*0edZ#U({zY3
-6XDDZUX*SdyMi8(aS<g}*fn+<t-OmCQmTuwU5PG^jtxHrkkmQ8QGBz@MB`Nko?Ga3Z~nVeVueuB7VXK
-=;-AQ|e#Vs9lbwM#1+gXvO3CCn~yA~9>cGSa&V^~z1k@?KF2)R-1Vd-7)B%2D#PM>i%i`rW`hpC^w{q
-;3OBM4L#S7ij@&q`Xc}z6NQpycaC4ldAQ;3KiV$AX8wR00x?@ENG!YD8<C;fd*`<I&;G+Ux9a;^@TZ8
->nmfR6y4(G*W@Qqsjy)E0Y_yd5N-y3uMJHh%kd{i>BTpqg!Yd~KJ>V$Tg>@R<WTE+zoFEx7*%u%kn@<
-a*>){!o+KTx2Vezv5GyG(b(Y*9dg&LPh%_Wr9<G*FB=_w1T+;Rf9Umhzt2yRIE-P{sx6KKX7&)34V~B
-pTK+9G)?S=7A%=s#)Jfl8X`8?DeY*Xe($#f^ngv300rKf+}LSz<V<@^W+t22H{w?`9~eE3#sKS9XZCJ
-Nt<oz3PG#%jkY6c}_=bh%PAqITSWy5UVzQjf;ayMiSWn|LmNe)@|(&MVpGRg|`Pz4BgTx9mpF&TH-~M
-0a?*cM_1VgwlJBZR;vXCk<E=8IE1{A1y=q(W77PlYt$dt4I#7_{xUePbFG0*M~*lh;B$HA^NK_e-M=W
-wJEios}zoztn|+G^F4%Q`xUD8PX2W#lLz0(s`C-S#?l!WT=WVlJYP5xN!)8Ekc=dCNI;nD+pe!*ch)E
-FQ#y5RiyOHVn4%w&kZTV(o2e_NfILWc2BU#NX-A9g+wh>3&Ec**@X+r>dTVYMQg^D-)nqWGu*c**WpS
-N`;Q>=2&mlXd+Jsbo%Y(|7WidF;69hxFojeRi`(CTj)oGem`hmUt&dzm`vv`$U*9;OXhbzAHQWFHzjx
-B1?Va%H2p)^<7*lk3Dlp?ql$t@Bwz4B%9=9Hq=@=O>dP}&7;D&jy)IDt-t@!Jno4xD)ZylD#N5+B<&t
-lr5xaNKEqVNK~b?f439;%DrOC@h&Q{!2N3E*LfPLMCiEvAXf0>wD+yFY%=ZK1<Q@1&Y7tomFwVIAQjR
-V~A5TVpzp=4%3=NG-HE$R4=iI`oy@`)hTQGee#y#bMXTbGAj#@I*N-^M45x^6QUD`ZZ)tPW2i|fDLJ%
-d4GgE@+Zi9pw4@i2a8>oVgLG1n%-tEEIOV3EbCPl0XI+E1i|Ad)=3?iGOOqpaY^iEi=uIqiV9pmgo5%
-r*-k1=80|+7EwL-68hgr~_qKE{`aBsPVZrYvTLL;b!w5vTZCe$G!>@H&oinKjo>6!=JQc5~sI<mTbU!
-7y8!WEsqh`KyNCgm;dq@^;Ku``C+GKZC$CM=kx=`8QrB=3Y^(cLO;z^U>kg}F}jRS`Z##pFU?s{>;Sq
-_K;;3A75&XHTc7@wRI90s*)^n7w~`<)iiVoViFhIV>L~%#L5`Zn|aE_?PO(WTsR!Oyf1~O3Xfe3poap
-k&Sq9-L{*A?|>)sgNZ;X2Ng5p7^?-4$Z|baw<trQ;g2Mxg#@u{H{x>z&w+)x3Q%G+@oV3|{R(v}x~V)
-W*vh$IwXM8H-iayUMnDny`4>CdkzY$<GWL7oF=#dvqo1DB-V|7k3}-M2J<E}J(ybz8Z+DPWu^_4j9jD
-ue3~Q4E2J*iW*2G%l`YV?J)&RAK#e#y0#BL=v8;%l+#ujnnI4o<B8i3briM99=x`wpbPp}Vr5V;l$T*
-b29wIGXhLa1~!I*7?wmg@3)z>F0_XC@5SGgBCYToIE-?O^|`E6ki=DK6rZeydPpGo$RYyuJouK<G|(n
-?EpfxGA4M|2<(Hl+nN_be-pfx~LPu%G>Ssn`;3h!`$33;dhuIjgYvkuVMEkKUk+}DB>Xb_ASCRYjjN`
-k|_pFa2Kvi=q_<F=rZ|1&IgJQ_{ktcl0AfxE%Q8|$+n#B?5`UKEihQh{RSd$*LHiP?R1hno5gnp4z`e
-kiN#vk`y$7CDlFry%(`ZnG+G{=5t0xgq4w1^I^w7|wzjF+J8^bw&$Anu9->wcyRzKZW2Q?>LFfI|O!+
-GGr@$k_`zEtM!n8b~ux4T~MF)rud^JPujJsh^);m%XQ8Sk1k}O$l#O*wJnm-2=7}rvUQkAs*2Sq_Cl=
-4A8y*1h7!>J7@tu^0UkoD=`D5-V!=SytjKNlZ1`R```LQavtb1RjMI5zY3P<FB1Ze_<7s%N=17kKFq)
-y%K^cHd?4q=}p)_%0`fZ~oG@NA;s1;YTh+al0ODQ3{4mhnENP`YXNC&R_}1VI|@LBItZ|)E1<WxF@U^
-9QbR$P;E%OrB7e1QSXA?VG}{q=y2OS#tTm_pFCOB<qiJ-FTJ>>8=+pc?W*kGugagU{=0pb>r#3r3Vx|
-!<?k^lqM&|V>D8wnv^6m>mT9WIDD*4b0Q8*```Xh=uX%`$E%;&bdW#8yFf5Dnjo1v4XfoHDOG^e~09j
-b*Eie9#5sX%z@$2y{`|$q#-#%PjJ^pY-$feW!B667tgV#mV7P@CU7jv9mt8dTwo2y6ofG|I@YR`?Ua7
-u;&^PW}SaYZ;)of}Vo?XA`qFU%G7`hszl<OQ$RN$|*()sl&v%VWBm)58fZ{UK;hg0J)eehIThw>*+Cf
-r+M+{fiP#ku_3K>bJ?Mrh}At>b0-E$<-_1yv~tx_LSU3pWL9V+Lw07m7;1=GDhU~pp!VSE?Kjek-tZ+
-DB%j&?Suwhcg2Ixwgv8jj&|J84H_4iD99P?ERVrB<8*=3Kd(R5Mn(sUA|xu+G~Yz!U^u4uj!plg;S!^
-1JqR9FGg*PMk7ewwSKQj=>fuN?g$9`9T&A7Fq~><VEUJIMWNM3rth#`zCR5t!v}loZWt8=da;3$x*xo
-w@8PAtBG7KSlj9zLxdwXQ%&!rx)6xxtkk-&#RaZJcT^eZWoQLVGI;kB*Fzkm6TIu^-lv=Sgmk$;W|KQ
-gm<a$Sw^@69#*1NB!w^^apmoC98CW`zEfS<IO*yGiCjk5wqC5e1QCD$~4~D~kOqc48PX2^(PME9l{3q
-56V%Fj4|K#8tb4L6`{oiR9g$Dj~c&0{0lC1dfAL$?N6)Zt~CJDvUZwk&s&n)%P9pXJJKJPOY#rA~_us
-gfK$><iyz(E>AY;^xV3AoKxclBGf$T_<nVk5)O1|gV2S99J8rrzfqS`cR?kKBs~<9<0b5c{Tx}@4mBO
-RG|5G7zLE0{_rXU7ufvk+dSbiX{~3`vNqhebP)h>@6aWAK2mnzTaZD23l6JEp005qb000sI003}la4&
-LYaW8UZabI&~bS`jt%{^<A<F=9C_gCO%YEDv4(#EO#G<TC^<40vHvE#Bgv8y&y3P*$_W++l7sF9Ua{`
->U<0P&<W_FdJf{1{O{186k*jpn9n_hPl$9Q$J@S1VEN4{g_r;z_mjv6n0U{^rdF+pXKWmg~N18)X`na
-#I}ZzO2?gx2byB^=(_*7VBM6HE;Bny4`N8W^2B-N<%(Whvn);Hf7tHeuwAns*|ccc5A7!tvdO`QL5gB
-vu^i?qBjlXkB6cuk4kn!i?Tg6bz79C&9qXhO;yX)v8(3-zLZsG|9)93{u}<Y>f05--p${L?C01ViuE&
-gnGGY#AJ_8WA#VD<QGHR@1wQ?}>)LKEeg`Z0i|iCUc~^I`D9^f)EXPI^;<HNiUG;QCSYNgM7wxer=i=
-*5zEtf|{q9)R<!4pLql^OjeW7-GGWJi!fB(5TR84bvCLK^n+nxX1)!a)R54d3HDE_im;j>X-PQ$Oy{j
-O~^ava3M{^P%^iV<b7tMT>?PzOwCFPnbo0$3WTb4n8^D|M)gGw&^a>jB^jiADiE&xM4E!0`aGn2V<E_
-C;O&LsIKm0C%~A1xgG4%StJr_utdQu&F)_rft=fFwYe{4I3gs6>ih@P6CP1JUd>ZS{(>OLsy_%(;WUB
-o}YG7T0DJ+U*5dInaEB&nDe>Z%Kne^Y`R)C#U41r?9H1u>$*@%I7n5~_UZ4i-?RHSj7PZvW>Pg(zgkU
-|tT*t3*-ZSpTs_OPf^j}R2G5a!!1I6pYXF2zLm-_5KGis|hUPCt4V)m;;o~sMN9gt_Ho!vQ4?wyD?9p
-Atx@~&kTuQHGj+|{DL&m2*6c>n+JvOi~;P*Mt)PYpdT7j^7AJDybIELrT;&1>aIEBAw2{iHoA9xsdGT
-V4EIn-J>ZvRdmx_Dn1@3^OvJ9RJa)I{8gDYl(H&*p;uz%C!3A7?YhyIm%2@$502!^9)8f8MEo%@F8hE
-+)&rw^cLcF$a=F{`c+)cwj-&X`o63dUJDQep8}7_M+cO!KdIw0oI!Ze>uQZ3pnK{2^5}$YQ5y;e}E31
-GbLI@(ZGSDGpQN*Q!NGb7X|)a*X_w{;6j|F*dJ9dp5Rw(*0+FC5S06>ku)6#y1?^hFfxUKp!2$DCUEN
-84w-9x7CR7WHTT5%9}nBED6yH6v*pO3TiM92=;48=0cE1yi0;@d`f4v>LP%7ySy#ZR^zf$&c*?OiOT^
-W}vPDsr72>%7q!DWZeCe5<+GAas?z`fJhLr#Y*vk{{Esgbb7G;ajfE<Aj6&)NzP&i;_r5Vf40a0B8t{
-RY(FA^3HG7VcIGgD$xwul<&(s|Q7Hn52n21*8R18JXLii&n^0!RS-EJULx3TQd)s`U<=84#sZRfnwy1
-S1vL^&_f)sQcr=8)<I0p{P}B_QC)S>7eTTX{PXRac_VOTYwWnnovMN0H{!HgVdPZ;@Jq9tf4OviK|x#
-K2)eswTkv`XV+0YwXoBB*%xKe7fW;OGC~2F!VjoQ>1BmN!v7UGi~nGNiULqW+@SRA97r(yH_S~6-WFC
-$KO?fIl`L_Fmh%*qk^*$6_xnRl*q0?~KLme?Bh7|^kyWe!+bcT*f8@_eUjPh&9?HiTj$W@3DtMbJ<?i
-)Qn9LiT$-a1&t3tCko=y_E0RD@D6f@jl>;)%Tn2v-=gBD&UD32fknbv@<f6gZZ`bc<2gaYF*)dPY_OK
-1HE7N_8-s!b)!6&&=oBY1^oxj@9v)TkiVH4aVB<(}ojy?6&aumS1>;tW{+Ky&zikf=TumS&tt-o01fe
-wM%*HIsD=2<H!IC{xduU@p)q6Qhu(l^I1{KP@Bi48Q;lt|B&eI`k+g1g4&$wZx`GN9NqCX{?3>Yacdj
-Hv9O?$1Bgtt@z^o_g{W~zw7&hx_|q23%h@OLi6qI;e06G0)KxC>N5!Xx1W6S$**j`1FYY{1LNr@;(_S
-?A-O0xusrQqG-IK5DCSV`0N32s?Gtn$u_#MVt;7Ck5v&YroK7qcKCh5u)UyAvpUiw!kEgi=c&o6vzZq
-r;G+8qSHUvdDGm_VT77_#kyK?(dI0H$ulG`nO-?Y=&Xj9lc+4U<;I{Tsrn+A++Ht?nnp&JYMXOeo7ZX
-G^#<*Gg6bJWytWq-*Qnu7uahB$Lc)vfst<BQ;LT9bSD0<;C0Fpl-_E5t%Cx95ki+6L^?Y717WH0zS3?
-hnErw<8M;lqRO~&WGdb3E9qoA=tQ1>OswrU^J8Ayh6*_JXD~I!ItqTF{r~CeKw$WKYZwpI1Q}}n(o9?
-S1zV<khtZ#0AkWh(lU0%c6oL+dgXyN&CPw;{;5%p{N2~03P1N?Mil$Rtnbm@2E9OmRbMYqZv%Z74Dwp
-A&B1I1c#1c_Q&;u91kJf!iuW6V%R=4jOiJwVBWZr_Xo9AJ>gCdd_br+^xCGQb-S+VPfVwDX0u8XUXDJ
-V;=ds)_y7dn9Z?b(naKNUy$udMhcIiSd-NLjBcNgo85-l99Wd-&{IVWk1k4jlfvLN<*5cjY`<jEUYzX
-yr^bLiwqZx|8JJ=uJAX@VZkwZ^Yl{cZgTMjof7OEs=k(5C^&oYv&?e%AdyoDY&UzKB$B0<JR?dv-F3P
-Ykh_Xxg9J4$-nbV#9lJ69by)iA-(+q2M!a%e6pI+Q0oKnwy~{<-Z(}`Th6b-}`ii`xPG!0VYIO7YBg2
-FPgquvrL7y`{L}t10n%#@dPriL}Z@i1dl<*))9~}8J&YwZ)ptJx<d21Y8+tJ6#xVXXa`&C0Ol5GtrNT
-Vlcm2_Z_W?i%KV1LDt|CsJNdI^<wHCB$nOv`dFT*6@;d|^8rla>A^|;Eo)5m8&((pxEDppMz)CLassQ
-5vIAXnW-4+qR6}2Qc(Letc;Gw~u<ti9H^bjUQ(|~}K@51XA@b#f*=sxwy`nU#_SZ$6#iI!Fg@!{;emh
-KLP4PiWmD#*H)MRPnPTCmK9ANY>|S*~<NigCaDO$Xr)?VK;LgJ2H}@&_*#{DWvII1#K#v#AHeu>7B`(
-1r%~?*RG6r}JP%y2}R>0@4?JF^_l%-0#!4O`vurfy563KdK`NY;*dSq;RcVu&2U#;2#>rIM>vHlqVLy
-_Ixs{cC&JR4t={m={u3PY3;iwR>(nOPc70O5*&_<k_`V}HSytJYFD~%E9gx_xr;#;*l?IIuISMl0F1$
-|N7wX2UF@IA0w3N}4?O0}x;@EmI*SaCiE-_IgsD$;RA=T+6M;X@F8iZjy~>|Ee>l)EXBcwuPhVO@u=w
-fZzweZGzx<cDD_zIXRL#(-{_9D!8Fzx+L8}#6BdgWY#A@cEmJN=t$N|q2oH@8d%hDTz0~`bC%~5$ozK
-s?W0?jGh`Xhe?k)>8T8Vi~`Huv@BcV+3(exXF+`Mp7Q8^bKprGwe9dWL_Y6bc>a<aTSML{^P{HgDEsq
-%Vj5po9SfMcs2<pb7wIy%BpjSk(bon-)%<SJqe8BrrDia$C<Ub|Js-nzY&$J!dD>>frc-jAu93V4ZvL
-$WrGO9DtH~R7q4-vajD2$;iZ)4qnKK>#vkU$mH1NMSs=y+9^r8bhSU!$V=!6IV3CG6N;6)fG`LP4LvN
-(F?Ldb4%=*GhZ-jUj1=mSD(<NVDCFevgPr3Bya5;|z#~bP$<8-{Wb;yWFamAwzUZE1r<~EOdvJ(Lc-j
-PjR_mg{UB|=#Wdaf(AAzHJ1BIkiDPnj9B4CZPCfDUhhmH|MG~WQk(4F*I5Dwz+>~aTM<Go4R3Phj}?x
-|UNT9#(V?(gJCS!ona!wm@hOdR%Io{Fvkg>HKD9(5vA?J$t1VTcJv^f<~wz{R;eb_sLB`P}IJ!u8+Gq
-xp{p{r$zz6lMW#IimYGFo|2(SU@vH#R<C@!vOij)*qfku&?p2D7fP7+^ult9g`Vg+nt<s1cwh3USRyN
-Ir6|E_i5A#JphOtf3bRp*}k^P5Yu2E2`ywdMoA^H{YV>hrz~j;3sz4NR6b$`2LJ=2Yrnh^cS$HbD>Lz
-^iDO5)tF`*AqwOXehPrO704KY7dT*c!Cp)-`tgqQ7n{#@Qq;!R8AeW3u?=GEpkffG}qFYQT668<-I&?
-Y4>1|7a7QoV`E4Gxq;`Yp%O(rqGnQr>*xctjD@Z%8p>AQ1GX!1u;Hi1cy(9sw}^t$>)Ovs!7CH^4KM3
-xu9A{N7wki#~eLa#qQ0IVme)@=w{Y=g!&3R>uMxxE%x4?a`YPp=*o|5XRMt~M2B-T1(~AAjyapM2IHb
-#%>=*S30*4eFF)YE%T!Oz+g3i1gvEo5i{&en8*!G(>kv+;^5_UT(X1Ikzaa-T6f=BF+6Hj`ipZ#spj)
-t2v>}FP<=rPMVmtAPINsH$r^A+%D&01scs#EPj(TdK}eX{M$p~H0LI393LND5IFZF%LHu_G*7f%k|z{
-D@hR0<RO+}V&8d?UWbLE@8`X!Mq&glw0ew~Pd;$=tr0uZ*X{ohmGG7oz<M~YEDL*DL7w9Mcfy*7nG;W
-avBqcBoGW9^2pK_W;Bz}nr!%2*w&@Z#ZIW(V?TjwGp_AvOG18qJxpOS6CUT}<JoyCAY-ZNC(Qhr|#Oy
-vyA{t3babVuogyWUce^8y$<Hj`W-bRZ8@2N4Sc^SMR0K09!m_T*)`IIEeHDn_cg*_{kDouR_^HW&f!;
-$q6hPfi#-2#Wk%FAzk31bZ>RXNna!FxsYx{xcBg81@`RGD3mwvEZ4_W@-Ft{l1h>N6_xSm3`03y|KIc
-7RA8LcoJ^3=6MPOxeb0t$Mb|bxXX`-v!u6VU?}b|F>|>UpB7EqV4MKYk2b(HUt5q><q`z`_*AT)JGn`
-KV$<PC0)vic<$5iA4iSpG&`lA6a_set>J)&8@fte=KMs8!uT=pV%Y#Q~r_Ds)BXsCmL?F*(SdF$z-Cv
-DpbM@XSD`^SeTgaM;jitrBdn*0NV-C8FHC#2wsK9=7hYw_cMkGe8Lw_Fg4tn}qK+-{W{W*u}T*h*(vw
-yDhVQNvEIZ!TZn^A&R&VtBI8jT+9Ef42Q0nH#TmdIQVJn+M{jA`_9q(!!hr0|lCo=S8`XvvA)!B1L!(
-u{K5RTOueP6p|U`6M>TCrWd@VG<wA*ID4f2$&E@A*94uB+1hP_|Ch!kibmjYj$W8H#THHqvsw;(VRNB
-$vnvl?!#@&vV-jQWq881fX!Kc1^f%_V8AAAwlQa?H(#{|2iC8|)4J<W2l5a)U>~GDlZ(cCaYP-mZ8lZ
-6k8)40VgwP=FDce|&7o?Jk^gcz%*~sX`z4et6cyT6{c7kNB+c6V`jNC<`}fz}0g;C%V<~j%4JM7-(*g
-2tNTNcP{}y#u%JJZ=nzU>6mUCeJ_<zLHE=4GZdqLAo`<d&d1Z@}7=lk}ssO5|Fywv2kEbzZOVa)#$Zy
-ve%E4TFfg0vM><@Rk!=~0-gu3;&mgOQ}nQ!vGDP}|aBSJs)93cdfwH37jc417*g@z5Ys$o~K)C`5+x5
-ZkX>eL>C*mzf#QJjEgy22DW6nV8C_xq>TC77O&a8Mi22;6Rrs9_GbDkGRkyGTv3ytby<JBKDU|Fc)bH
-#HyS?4+o1lnI84vAuAnMz`>$^cT_2OS}U#^&#1u|%CVtImG&OMa^ex)yLEr0R2qH$i00{J%=Nf*sgo#
-kxTd%iU$%;fa_9QThii<3X-L$F*<3r&yeS@6p-9jHHK#W@Tie4C69FhC74#M~3dmoNfH-O5Ndg5(lQ&
-Ptw1o43=A;`@e<~D(ohW1``t!kwKY>tOV>%Jjc92d&#3t!xBm6L2b9BhtAwjynI<<s24`I))aG3^O&}
-2d#oi%xvEv9t^W|C<u4ehbq4{qM0|25qumHnB^y_qH5yB3)k-Gyf<H}87M)=$c5=WLBJWT1oZO?TR)P
-P+56lPduFt4XfXCwsVwlF1b|>05Y45-IR;`qqQEk#PP%-oyIioy_;bY|BNpS#Zeu#@sF#A`Kp_0r74!
-1m6f%&(&c_KT2M<Nz2?%$^MOQJ2;7%2>O75O52TMZkTwdt>?-{;*p8kS<FqoA30y)RBM=FQXCyQdyTi
-Bi@tc~>viZ*T9Z?fE^_f8AV3RvfEI+#UQ*87-cjIht-VR+vW>eknmFaTQo^8jWd-x2ob*l(mfO|2P%6
-W_^lHktb`8LsWWQdDcg^5sWd}4#Q=S0E=J^r=UbpE=eXmNak6p*949*Qh$sSw_&CFSaVQU8wL&zU_8r
-}&$c3R+Ir@DHU!v#ak$p;IBwwlNF^C!9%gjXZ^(wM^ZfwQRa(sH#q+sjVI%>#U%_lnnmO3}b}dd#vwI
-nW^ouP9269VFXYI<DGxEviDjb}I7hG^XD=ht^yfB!oM;Bg3_!9$2oq5r>F4?anyrsZfTnDX{;Qm&M@g
-i+n^39m9OgL<XugbcUcnI69h_fA4?~YqeQvgEmxda(5Jbeitw_qtvB%T^HUWa^Zkp$`te@fey9f);q$
-!OAMQNIgXA=>8vA|Ln>zR1>lLKH_LKAIxp?@QA0@y2z@7|OEE+)4zb{}%!+P7V`~#Is$S^}wZNu|Gl5
-Gu0Xdd2O=i}zx)5Fm%LEOQDuVgwt3PxL%eBi#U9=&G4^W@>&1#W7Qgb3d%ZLObKT9x5sz5~^{4E?r;o
-d=mGfNdMR7;%aha*}^DT){%kO}~t3QxJ_w4@-En(a`Y*J%s_sQa*0x;fpIAab%fYWbeu?an%524+i{K
-3X>c6)=u3nh#$s3ZH7a^D&-A-K`$fTHk2gZ)&Wpfaeh<rTHNj8oPD6up#7jOKXkp!SHi7#scEz6BgT;
-j_|*+FkHxD^)l3oEVu{p*H@e%|6<rH+neNtfX9AOZShJlhM^15RBOC0trX~sWC{Y?L6O9<Fe`uKAPFG
-*5+#rhs72j_n3xd%@v!LIMG3_0TbFdl^=jSp;&4PVS{Fhi0Kc;mTc7RqlyC+qmuzMk7Sj_S!A5f*dcD
-cR*Num5A{E**#7K3{kj$7p7BS;|t81>M(I<N=&)4CNyR1OR#I_DgR=}##x{;{_;Z${qFEf#zOC<~<{^
-zSnA0)6BVj3r{5Yp8ws`ik&`0m~ZZlAE?ikO<q+OxSm3v=TIL^#vB1=SukS!iL3QaMrKTdY5_N6pu!S
-dnWa2t~)rmKSRZf7J9*CTYn{N6hpyV$zxBZSo^--6pVboKM|u4aZO-XmSb4HP_+sqr)I{dw23D+6)dD
-Pok0yBd6=uH>O~_$;>jzy(M0+GL~7=Zk>nVT9o3ZNCjDAC`o<J$oGjy8M96oi=qc6E*RdXy2O-N-A-E
-GR|pMjh)0_9)fRxWZg*x{a`XMyOkP-W+M1Z*4?;5NUI|wub-#dSHlW2_m(3&_0WeQwGq{wQo{__=gsw
-w0cd?T7k|n7cKWVvyaqWbzKbCBiEES<(12BpXvJF{tSOUO&I4{YqJ(n7NN!8|3{k<do^}s?2JzngP^P
-FObT@nis=ua&dPO}ROfz+{~)L9s@%5k$KU(+4ft#LrzMhw9peeqKyI=pU#Yq{sp){*RK)V(_8Yl8Px+
-*&CPtvjyx;UtrJlRkX}k3ryeX^*hI07Dss%tMSKfdq=@c?2FpSz?i{u@gm04^YVwGz<a_RYa!lrQ(Yq
-c;{CJJJW%m4@nC#5U*wqoUqG<bjCp}{jw3syK~{JGQ<%S%3wOalqQkrnRhecCso{LT-01i++NmMo?^Z
-=(KEatWAl)$(^xBxeRrg6E7luF2+*i_rev0lk+ORSs8f7sb-)%><Pk`i{EvkM$Y43hg3p|DHN@U%(Z1
-=?gC_Tf9&46$7=;5M%S7f#NQ*<wlh@0qTk+f9;!aV7@2s#op)C+*>L$?DmRMZf4jiUx_;TKy%QV?4Wt
-jT5X5UJpd%IpAJH@<*Zo{p+>Hzj`j}dz|AvAMNd-JHez>xRyGkAxsQxGGY!|+TWNGN<bu)O00q)2np$
-%I(_LTu4&SqkGqOgRr5v>5<`zL$$ArURh;Omotr%9b;IiYn*G98XoX$?S9rPVD8;@hO9CO8drZBe@*e
-TWbdKCQz+C@wbo#SWNyc#Q=g-tSsG|c61#!JH%W}C<?wjoF_Tw4$I19E!+I?H(0)bgBoNvnn=E967$W
-rBW-t)PjJ4$$oaycH6&6oy;HL#2gBf>5il5Q0iI$8M5weRKcdgE8Xy!|j=)+{Z4wyoN#dM3sSZen=7u
-3<FyMs%W`JX}!WcUjPGNVG___vt*%VX3&J-(xg%(?|2bXzJkyamSfo`3!B$SI1&Cec4!WeVTTpJ&`CZ
-ZlSNpYI*Ok{0W=^M7NPrbeb3c9Jc9@j0EVgXl}wqzHJslCgL?!*M7?Xl=eS<Yx8hL7yXTZfl|3##%+e
-tTjrqu$V4*W64^`vZc2N#iBvFsv~oQ#)5=7r)LV-xKGii!CR^k(uG@=s+sSfU{%2f4r%;&eiO~<efu%
-L{HK5G7Nm-C+%jy?Tc+z+|#glB{xk><*W8&L#Q11qL^-BDkkc5m>%70<XL;Bw9!;DdoqqjNd?4872b^
-9V~P!$Zrz^hstTPl5krGXH3OoSVv12a`D1}flARVqj_Z3T;8E>d@t04(6@UKbkI<3BsW=Gs)djPcN&W
-d6?UN53Wf*W;0>D>Dc^#-$zY;@DOHGp*AVU>*PA@|gqBhu9Chuy1#4;X3+8JP`E-pf#D)?Z8FW`V~j<
-t?cS<hZrUCW&jE<3dU6gog*E3~UlU*$J<z%rmH$q?k?OI4<5Tw{BveLo$EX5uHe`w1%uKV*40CHEOTM
-{sTJ{p-dYDL0=PobDyG(Ftz5YFjl$y}Ibk!A}AJ%$)1vkIea2m?HYVPF|>I>mKj;!X`1^0$JS%G$&Sn
-JaBCytBFuP2S_~7$SW{F=qwPSj=-z9q#6}u=oDQI?+#t1jGF)}jd2YC$_yC`p7IMNMuMbceSt3S-@bi
-|41y3uY8>E=3oxiw$2kq*kAUKPpD@+Ej-ujHcnk7#W72Zpd61wbx8#pY2mCy(n~*UJEwP%l>>o50IV|
-l8u4nbTaVGeOrad)_ZQGV+rbuX}Qd}w!lgy4_U}{(GIgn2Ec{jxx6$X8|iiH+c^#hL5K1)Ao)Q5yycI
-;Wx)j3E;coZ)GA2Lm|Q)*8pS!#$j;Wy5pHhF95UACL&y`Nz^iv@EwStGd55_xCx!l|fF#aS5z+uC9Zj
-en&}R-kqdI!Jo<n1au}SGM;^3P!qyv8_^ZAu?{0t1sok`|BkB#ZkYZl-}P^653pSdc<+X5kSDxKrh6w
-5!HjvHB4>CNR_Ww;3vOIEbx03I(Q}DF-o`tg){*h6dKb`kpUrFIi56e8`N6QeO^f^_{sbGgOzx<b!qC
-fAnii7bbSF-P&xGaMda`24ys$;Kakk)5o<MnLDsL{o0w_7tEq|W*4mqE&h(HI2ih#_^jnXXzyI*z>+y
-tZ{Djxr^4`kfR+@2f2C)WXT8?-;v91$M2?Ie_?!Z`Ov32^#w0igY$jblHl5r>Ox=FyIc|&hQ$@Yu<CA
-ipRCgGJB`2QQ!zzT@?&H=If2S@{5v~4(H<nGr&0Dk*K-Yyx5rh-}uCd(2pKJ$}|euST&9%hMLF*@a)c
-sadQL`!jV4ULH*<&b^eDjj4HL9~XQ<$8q0@RFAVl<Dm!|Cz1Tcx7fo0wd$$qx5Es2at3h?|Ox~jeOk{
-dBHzB&5^;pI@QrZ>rYL0#7~s+c(Dh5eqvr^qU$SjBQFeo?Ey>WNT#}tD<BsWLCnWX2#K->#dMsb6NH6
-*vC@$3Kf50nYw^PKZKFK=s}mj$MW_7N`COgm5H!<*!sq(L>`iu(+d63t<zGfO<u}#1jkN-kd$S*@G0D
-jDNHynCrN<OEl)&M)>f<jTUz6ez@%erGB3JgMRXXgL@idVt;{CGMlh+p#{f!vPvQE|UspC2;qvad%15
-MqM!9(!)n@g7mutY5nl#h2@BxC!g2Cv?8x~=<ehN#MN+$Bb;MW1(pGOT5rUaXI%NXg2VrHm@uMw=2H<
-L{{8YIs#lUu(s51oz;QKTA9Q132VZmm9u)Q0ZU{X6fQ}DhEWAB5vh=Sk)!5>I6;Qiiy4%J_%w8=;fgo
-Sy6QzbTh{Unc9<3&kbrMI@3<%I$xE8r>hYCoQ#y4_k%@C;Jn4(V<m??FQ3dO$ym3Z*R>{$cF+yfg}w}
-SXQ$~}Mw_Zf6bt&1_<62GQ~U%~RpTTCWjdP9Rjf9Tq&qBcB3awg@dsVk3(@^o`2DYw5#fr9nVU&vFd7
->)<~4t>LaK{5@$Vyez7na-X%VLc*+{TyVs;rKz9bwTQlLWCWL`Va?+^H@4)52oLU!47PW%j2;ZsSH)?
-xiBQ$fEsWU*-4h2fwuC9D;&<4d<XmNxm;dG$g9%<$TV32g)!Y2lmafD6kPN~39y+Z`ICecQ$n-CM!0p
-5hX@avz(hW3P?4h)W&+w_<L%o1%BaDV-8r-^Smuw79P8z={f|swnT(f*vcJP(ONI=3%*XGt(|)=_X3i
-xKxv>xAVh@_GH)T;3c(6UH)abgr|#Oba-Xby_lYAz<0F|Exp*asDVFvvaRTx^jQl^3+>^4wN6FEtS}J
-sa1x7Wu|BWy?M+x_6y$UFRQ2>mQ>x!SFf)FW%`;};>3iTd&mdc)=7Vz;yfW{Cq&1nUFZlM(0>gVnvz0
-srJ+cF)GWVlxw8U1J;l(H&(9@Wr3bAuH2gCv9SsipKgGz17qN^)bRY0GsBwgJdu&wvVfZ=hxvK;hiDA
-<7<*Et(V9q7_2k2PHpOcy!|UOZ`N)CHZZ1(gCfRyQfp%N+()Aev`%ZUBG7Yo5I_e$f0eq2ZfVL)%$Ap
-2JoA`X#Pa@QRXAb~vYhR78wM9*(VhWQTI^x+=q5zaY_kf0)kZ;umO)!T)~oe8Rsn1)#J-hP=76FI(1m
-RG@`U*~_*oUQB@j{eB)wYYO8JNZuyuK1&Ygy>piL$KgkQ6_VkH{1vKbD<_VIsjsa$sQ?+zg7a39P8ZO
-3`R_21$3V-x{?dg8H@vc-$*xZ?-)SAVlP=#C$*YH)v1KzYT^@eH?UJ9*Yk~(C(3Bf6Qz;F@Z1FhRfU*
-nGz{`6fgEN+G=%2lOJ3f&4pY=h#5}7PHa*=@HMGBw{>l((WGGW?(2gd@-v<}&^7P~oj@-)BsSGi;ph+
-paXjArw={mitz%6G|5kyD89mGwYfUf=)u+7dPWMo}@Y=HX}jm1)kKzW)bMO9KQH0000808trnOa(^7a
-8L*U0Pz|C02lxO0B~t=FLGsZFLGsZUv+M2ZgX^DY-}!Yd97L7ZsfQTeebUzJTN3-WjU9Zg##l9_5v&r
-%r0g&nFr56W=m8z*Al6al-r#k|DGyRlqiWko>@dMZi!^ESas@D72PP=k+N(CGbmP;gm=AEhS0s1?O<5
-x-gmq4dn*qIE)M=xYX8fyu5WnDcDn{8_Pj4D+4a<TiGyak?9Uagjw~l1etP@;&mZ3B#J-ofrqps!6`R
-+ymx}d<OQF4te+VwLp>0d?^AAc%HBTQ5Z>O26Gm61JR6pf}>#~&<ZF8cSpdHgW5mI%u<^N_SsCZlnDa
-KQJVO-Qq7?5$;?RGfE6uI}NC=Sg0-F{2U5~Y`A2GgpRYCS9b3+(cqnN;q7W0lG7b_AZQtE;~e&A^NeL
-E913MH3^*o`I^Jd}cLlPRx;!VR3X^L9GnM{xxuz3knt>&wi^}11{x)o3czbYnz<ZT>D+|!H<R8?H)Bq
-v*l2!SOX4=5BBB=1ONH&@+<BDpYhLfK+|Vd)*MatRtmP-$R4uvsyuw!%_r!Y>bNni9?yW2f;0Hj;`5F
-Hd<FSc4UF){8tlNInXqfX{{%KBCq}3OBYUx6=t+RH_H8F?-kfvtBW>aI66B~8*R0q@cU5jz53kfJI3I
-x47c@UITIa-2-olZkwvH%t-*OX*z~>DrJz>?J3l}3q6oUwTM$7=H4cJ`)u%tQ@eePN=o&e<g!N6h@NJ
-9a*Z%#B9l{JYJ?U|e?hybAz$^t1M0oQ>84OIYkJ;}4iolo$a<RV=LR*KqY`7{MbE2>$FN@T%7!D+aUp
-T}MRMmk;DZMJ#1&f#bVOJvau_X3^bjO+&)xH>X@41r)lV8_xk889YBt_B_xL?7je3_YQZ0ftCMQ?mNT
-PASZbNf3*bViXk319>&z7R>MXMu(?cz=OSv2zmJ9CvtyJlA=E+go=8>u93swAvR3wL@fbZLU4P~nq!H
-I=LGPj&Vfn&2>5>GZa<QJ)<J&KQc;*W2}Udc@p-ygPMkezjt_nb*dt(DbNm5x=1fO4iZ8b&atHk?WK7
-~GE84VInIQD_lC{2b69{zygb4tAUr7N$;mE!N?gq0GF?4%C5|F(WGYJu_Vp>xO_Fy4Kt>e*A3J5O9PY
-t=HxA^@Qfij8kAB}`xcmjl{<;T55%A7>xq-DV1jwj&T%-=`ADrjfn8PcL1DC60sk!s{*@Gh=*!38w)#
-Lo9E6I)Oq7N|I<4;v8Rle*{tYBKu75xls&MfT#niwB1vV6%C0p)}y7Pp5EWeU{l63%^9A;gKde_FVJ%
-KV=c<&chKl8goi8DaeR$Onr>!lyTjHi?`7Axj0|)O06JSPRvrY5nIe!xKuf6K?fsCKw!gFcW<-i66^2
-m<QbQbk24oPJ`(g88JD}lCLIKD<qY-5$8ZZ+0tAX_K3hO;gvl&>X?9n$6<jnj-T33`J1P<rq`u@@Ck5
-0hBeS0v1VtkUQ7<xNah1ne2`iwYR}u?7TM#biEkU$OXBQPsCT_#J^jhCs>$@c1I(WNz@co%74K|)u1u
-4xsVy<)36>g_sb|Gs;hCJtt9wzkBE1~nYp#U{Z59K{3lH{B$hPT{{Pe>mTKgZ0t46n$}&?2PCFG^MnO
-2YJfE3&_mBqu3ol#@gxS++h@m<6^9gqtUC0hKmj&~2c+D=_gTm4nf|W|rMS7Jtd^lC7c(!rYjBR3gGM
-ubY84ffcL+E~MF@fcITq(LL4pJJmx2n%^fkQ(Pq5uz2-x=f6*&1G{;}2A}b|V5f2{Nu6;VUB&?r*r#U
-u;gBZpyqjzV0$a`{H4wr`xKTNqPNtxJ&%~PA!)I(n?TmcV{KC-#@5ArnnYIHgz2J15F;eta+-HdppXB
-{eVQtY2Eu{O&sSp{Kb1pdd>#4^-VP27KyQkHYMfNI-j6=32sg6_}fR_O@&s+`~^z10a(f;gH(<V18VG
-J1r8_{TrV0fo+F-M?^#42*F{{l^uwpk~z(*H3hxE?f`84|PyBGsxgCoW(Ti`4j*7mBboc9&)`UH@e<w
-T`8}rIkxn(a`bu_wv_sz8v=!?;bkKG93Di7?@m1g7hU7*3bwH4EDPTf{+fuoI=8>1YY*+p@NZG^F1)%
-YtTYOY~khZqteCfNK10*u4I}Jxi8sVHO<Y>;<hPrD-`L(R*g8<IDV;RQ<OvUh}_D>BS`pU$ZSgq8WMZ
-)Cg7;p@Z&v(CEsg(MXo39E`*A;$JmB$rrJTjN&JcnZC#fTM|OracjW43-TT`2;L>Bd(OC74Z^+Mre1M
-8dp7i$q18ZKOM58UEIhj~o1_A%ZMz;pv9+@r(`Sl3k!rKF>FfG{#@dq?VYCvyYDGpHecejBkhnJw@(A
-=;as3V@}fsHps$RMbVz4g+l3+{2EstyEseL}p9ce(Z+BE(M6S~%l8{Nd9QKi-)3FJvtw4VES!KVs!|n
-`BXUhMjt>DG8i)A;BZDEC6VW=^0S-zP2ouJ$8zI5HwT!1e!}&ySkWo1M{uJ?R5-EKB|u*aWeYzpP!tW
-$Dw)PPsPiUNk>FBn8#^tU(*OztN?8PhHk;0c|Ym^G>YREH1@~%L1$}+*!{2`w+laW6%tMjCVE(&C+Z$
-8y~-=<e6ey~yUU8ZbD3lnWec16vd4jgeB)KjK!r-yEWH{`bMx)hs-SoOW+4B>>|)7lt5{Eijx>&m(*;
-a`7f%X;&AHLp{Pmh=YBE9}|BkvP@vJ))F1~sKwz;;KyY^xnI$W%w!XWsa1&Vi`^qs2P7Pj;C8i8D4*w
-@6{m)Uk>u+60k-W%-x2T)4`1QY-O00;n48F5VDTC~0sApig~Y5)Kg0001RX>c!fbZKmJFJE72ZfSI1U
-oLQY?LBLA+cvh}^((OU%_Wt{^rP)|$F15;6Q@^m(<Bo+o3?3|p-4z#O_3@emesjG{+<T_0wiU7y1g^|
-;cBL}L;?o~2j`6gWKkAt5r&JVZb})3B3*BavKG<2Dzc`QA^#qY7T7K>vP{NxTI7{(n8@E6IZ{93BCq9
-bouzaAM3!Y<=pU*1mKAZ7$<d+MO0kM=q=-b-%-2QIWK!hOS|-BFisdrRm!8<J(s(7dMUy3>T182*74<
-3w3>MhEsi1MaLSUs_Hd#~>fb(`J0wbbIRCN-npZaZSa4#zTZBta~?Ix;M`a!j7>NGRI>Zmr~oB5_JVp
-*Ba)y{maqjHgEW`N(*4gF+NZqiL4Z)3S}s5#34dX`1_@S-e>vTYm}Yrsjgl!gV8VO@k(T~34qg!2Sw0
-pDSouma)cdRevIk>bu!{z$;5N@0yRQG6XOWi>%!mLWcyh_cCZAXM1o2|T+=%esLj%Wo#4{T}8;xXg-q
-luZcQwnT7=%q09-N98s2#5qq!;}(<fM&?OTYCHhVu#{ENlt9K_s{ocFSQj_a;GO21rXFmkTfF({tpC2
-0b-6=6FbfaAM<d`NXns!EQ=hcZExy~;vYNd{#<{FZ=sJ5nl367O8=DrRFoXpJL7IvWUb(JIDZPpClC;
-`n(Jn-`!ryZsd9w+VwDg#C>f=S#HNJ<|DT-3(?V>2xQ4K5fJ3&pWFjX8g2WIF)g9g=24x=uqJ+4JaLY
-miArzwpXW->}})d`gFR#D|Xa=PS*O$NBAX*n-TiDFnGl%=f0T9)fHk1~ThJ_OlWcDgk=$O$nGHfnMZB
-I_4&s`(isp<4;;0E(jxs<Z^;BPp61JIK63CD)(G)3?w5Yxa+e@Z!g-i&vMk*RL+I`Q^JeZ(hH>x_It9
-cRJ!E)C#~zH?pii#JrEA(Fpa7EP)Fwr4vB&m-O5ZL!?d^jz^>Kem=7XfF8aVz^sG$?`McbP|tt&#-ks
-99&B{`JGaq)GxZl<IbYWi!1#IgrUwM5P0hBe3|d@0eLFbJQo&jpn9#USHS9q2>5TM5bSC*kbVhn2oC%
-IcL&OL0J-{xU5ePNQr;<w`q7a87FMf;Y@gUeI(+++k*34o?Ku8fYR9@8}k@IHhdk9?FEHFoT0cP_iN=
-X)hJS{GV;&q<w1PHHqv#VD{E<OuBdt#%B3-lm79V$H#O#*%go})xA6e3|!hGmpi(nqxnKe!v(7~tQDx
-X>2sYPSI!@i;1%U^N~;zTV=uF^_KMjUUjnO__s-p#}&CA&;s3zUdGg#L6At?+&k~(u%o{dP!k*aBxsm
-0X_)U(Y1uPmDr}R8ci)OE`FR{UIoykKLO~Z+cP*D)z_DVCfW$ub^)Uz1M+;tU#9E=1w6#Ltvz^73Tdq
-l{UIU(K#lu6sz|Z=;AjLe>zfZJAID%6K~h67xoIAT!Dfe2dK7!(&Um~Q2ahUoMAq>@JVJ*B91$5eHS&
-W!Isa)5i!%o=kR~}1NObje242A}eYeKgMBoQm19>on2lG1=Z_(Nc2?}xt{$92al>{@CkVrHeQ5WJf^{
-5*ColLV|)x`!Tbc^mpw3~i*a&j^e+X!sbBE6N#^ox^|F;R|<tPcw`5$O_ak_;sxR!v_-V6GK@?86278
-#})oEw33Nr*~5Z!3|g7bY-&CoHy{wUo?3<5x92frNv+_7DdaFuXFJ}1qWpdd<;&kK-*T~at2_xMN~?l
-Wt1Ehpg+K|E5H|)xt{SDm?VYPb)krkeiA}iPehap<6WZA*Q>JF=7A9Jr2t0|{ONiH-sDP_=<1oC3XmF
-6M4AB*U?Nt<MlPBRUZ4+==8ZHG1gs0(v#yK`9U{}>Y(x!QBjTn6hoFY82wfobQOnurQnPTuSJVtr{3r
-R@!DTpmd-3#n%VUQ)Ht<o6OoOnF$?3GkHC_P(pDC_^ynj2px)@tfz|$py7iGFczeM0V5w!^JMgn!{{Y
-IALIGeuM(9#4gzq9NZ53wuZwhP!%Oy8&I;Nozqk+_L6pe~9>B$n_tR~!VYh@4n-U@=U<Wh+FyO*Azjc
-&SoY3bPQ{4-BW)ALz5iphJB903y8>qp=2qT0yxp#Ic}d#B?goY+)z31S0{_O;{y?9wQ#!Rkd8p9G(Nd
-{&<28A<QgBi!%g*ni>#5uc*oDJNn~Pu^%jOSy#x0I3wr^v;fI?VkTV4&A5lP7kJPFe|&&A#_l;j|7fc
-)3IlolT9=*G2YBaG5A^Z1*DmCXbP1+MphVzmqM{bX0@e_EK;T?}`h(>{NTl|l2`?_Z)?(~O2~Jrc<O%
-)%492SCv0l&|@IO_08YqNI1W({QhhQs|IX!uKn^tv&_`-BebBi81Iu)npX9ps50{iUeW1A!$V2U~rw-
-9HCYDjSXD~LKKAV3s$sxgV9S<XPo0h$m+re%>M{eABZd3RtZFT<zLuE51XJLZ8>z}UneI|k8$!XpgYI
-&Nj74~X`WYbUV}aiIRw>YA2JwSb`^sKEhlBx+~mL2F61Ai}uS2H?m_FCZ_`Y1h2>DDmobID7Tx-Br(w
-yRMMmvsK=!g2QC6mldW4fc0b|{Qt0_g1xQBUy0uuSs|2j@u>2|qaG|ZS?9T}_;_x>E;OK~-e3#;H9((
-l<Bx-^*n)u^+jKC^(M#R8wi|F6>w#(iR5WD^!GBbai2w)+j5i7*E{~yyS(tO-^??yNgs&R`BVy$9Ymt
-JwP@FN|LlxHsFcpaRG%&?(Ry6O=G25UP8t6bj#W&&<+#d0m{`7om?@@5N_~AQ3liMFt!{9`HQLbv{z}
-pWkz3#&r1hEg7f&PJk;Fv`-B(=p}^hL)ay|hNhUcTl2S0&g;!0Z#g{e*6gt!U9l0e_fsf5`031{`B@N
-sMiTzQi0#Tc%ZKC<|BeCE1fiP$7V7jVf^k8)#3D)Y_>QJPz*b{{1m<KBL~4h9)|b<FD#<))IsMGDX0L
-P$WS{$F?HcfGbm0WOmr&NzrxZmuQ-Dfu1H9*P=?1ZVp(52uK0g(Ws19e(8N(r*$U3`S8!LKR$jdZ&ET
-Bza&r2K|lyI^c6eY-}ZikG7rKx-wFTQ^RJ^1|NQ3T<8Qwie|y=?b^e6mpkEry##%Q!xho%kp><VcAl(
-bDT5evT!!Y;87?~|LJxVV&0s4-hgOuyyHTB}?ZzdYXmtnkW@@pOn97zz;X<7u&FJ3%-_wp+I?%j(Q7j
-MJM+0Pg4Qv8(4EP=pE#vlMd+$5?a&J;$3|527+1J&oh0*i_UT<A<(ynYe5h5@;tMVOEPRwKS8oDma8X
-CezzGgs%#q4l+SvLn=}nVMrS;b(Kc?V4q*uf1ci#QOU$zqI@fFHlue7Yq}8dhI+SI1AuBf+D`QA0VhP
-_~8Q~7k>zvvIoP$$&Ma52>^d0PA#=%<8o(5XlL~tP*+O8Jw?AxZj`83b#+uLk)X|#R6;Y}^uV7Lx`+x
-4(+jzmJ;5}P!GxpcdPQzOg@$O$s%GA5I(Qaguo$nv^Dus5T&&mNy>Chh0W+-SE9hr@Fd9iw#j>v47$v
-W&F?Tu4B3<U=UV|2|Rhwo(T)bdPh?v{Ci#mUC!KjyinYyj-!NS(Gyo_!VTWN9JkjQRiSnbwX3QAy#9X
-cxanTkUrCMGD@w5}ky&Wk*aBT!!$W*r&u$;51`38m<Qkpoc4T)UNHQJY;O2d7?8qwNgHeb$C_1N_`+?
-?iw$m3lEFx3JU)L;)Ss{E{@Bj=fZyiI`(V6ydAILSX(F=vC;6V@`|WDO_s3`4+eX7{>_OYR3^==7d8(
-m6C3!$iT4ihojHWKXSlg-r{rp`uyl~C*m{67*jy|7=Dq#3g&X#pQ>&#=4o=`r{a#}eZ(ci0wMuh33kE
-Ckj&Pb41?sF5)5KqlqF0oVT)k{4yeNl<ZuF11gkN1N$ewDnnKu&lrFWzFSd`P!ZU1Sk;_hU(yNi3G{f
-vrJO9yr$Uw_sWZLnZ?50A1vrrZa?ONKo)=nsZDM#ZW(YA7jAuadFIE<|QIR6Vu5R(pC^U<cVhj};N|0
-LyVZFwr0o#|%EF4;{cr0ZGFV+IfRYSV<go&&-#IB*4DsnLBquKxX=;(!tx+o_Sx`*y;{y-I*BLPJ9Qb
-vFq)$bFtxoFPR1RelW_DYYfW8~rNRNA^t9TqOi8vW*pKpJv-=SDAtKlDVTj6(yW0gnHMTC*;mG4^hYB
-X7?YPt}{=-4WZF~df)&;(uYdpc9vlf#m=gR-7HrJhS{<2&Cc1{|5K(&y$}#;g(?6p0@hxnw66&P4eo4
-(SvuGHs<Sd3#0^UiP=Vgv$-ws9dOQqDgf=relb%)7!pshH<f^5f=C>MW?IVRS&{}96;kb};xeU<|55<
-AhZ9>C=pcN<=wBZYO$P1w35q9((N2(JgYUsmTICn*g?w+(g<H{$|2r>Ik9?j4;hx@6n)6LW>D7n8!n#
-Wm_NV5pl14lCL89kcO{k@3&+YZAV9*GR7fB{*{%>$aNYIXakPc5ZBQD%Xp#8-J~u=KP)qIHf{wZj`=)
-Eiwwbn*MDj?B!kI{WkqNe*L1<+4HFfYKT;2Id-(Q(+e5{v4r4CKPi~&|r3gcq{8Gp|GXk-!2MjXK9Ge
-lVqZc1Y+=-QUX}PrJDpp{kjw~gxTNMEZN>}4n2`hNJZ?%P6?2rP4fgjQ`)XvD?0qF=BUOobp!4(3Q^m
-^Pwo&wJ!X&TU1<98{Q!rtc~E~ek$nv~HaNO#Haq~oyK|VKA@0Wd0YDvM8U|^b(j#a2TI;=MbkpVjG1Y
-?)ydO=*+^I?nwnd5CZeb;B2U6N$lwRg539jW%J1;2My%yc2-P^#WVy~G!UFXF|T@|4WO6z(ID@&cDAX
-?xLW3PBS7r7lIo5BbXTWC>kQ`8z5#w%&O!hL10!cF}cVwf^5lt7%0hdeorZ_V3dm=+>>p)d9BlCo@97
-qmZ~y9JBX@odcS^5TeV5g!KG1@f5!vXj*xgJPlA;;cLRtWmR~xW<lZ0PXWA5q$ylK0Kvh>F_fGN3jD|
-z0N`HCkZ7KV4y9%sTGaUi_r@Nu+NPBA?;}v1T^hhf`^uX0}j#2uT52JzUR7wvf^EmMFH`L>%ifpDlBO
-HXmSw`2vwljP^GBfkwyX@V46BlI)0s%@ab--JfxRG!g$CogdUXElOE70`{CRL<33D{t4TIZu~g-_m_r
-^W7wGn!%dzWS-tAoO_bt^++oyKDb60JAFL|#Ukvh^-GYrU^ZmH{e2hb@8cSZ+>T+PjGOri2b$NkFwle
->dCb$KJRVsm6%IRep&Axnn?iVI)>MN;Pi6aJzd1_f@*R%9FHR9AAH7u#0ML`MNu9iPJr1O}9>F~90nF
-P7IYY*XZ*Z~6636|LV-Hb<gvHh`mlI}y7v`cq)UB-ZLIX(rn=0laR<oRWbDE151=H9TQ7AueA<xTg)K
-RqvPTF`+XSDw+Hh<y?xm&cg5C&t6^r>@RFX+sp8%O2<W<*V)hu8m6d*UIFJcv1@r_F0IAq0ha|2><6z
-pHOcfL1Oh@FFrMgfgR9x=XFQRK@J`P@``p{Ry-R#KC_5&{t`;59oC^PBB2I>d&FP??#q8(O6deMe;5L
-c-=(PXn%&;7743&4R$s%FZLOW+zIYq=sFp~+tUWad=zkc=dr*WV1-F0_bAfT+Mr1N5kXr^9p09P8u@0
-LZpoV~ih+U&D07)9shv)3=*{XnJLe>-s#DOfHLmmf|)LNE3G<fG0SsPHUo)>!^w6=f;Kro%USuMVT6`
-3>gcX&;AVtH5nxbc`VG2c89&C)*iGp^ijo9z*Sko8S092VZ=kuxsn#t*y;gc`YDHs%1X3Kk*KGnxaDC
-(;g{#cAqq)Ph%aUCRhcMv$p)C!G8)c8^_Yhg^8HX#Ckgzk`m=u$tSqhtBp2Mw=l6d<F`SkswxWR004n
-g+eTn6Z)7qyx}J&>^)Vhodo9;<sY-PL@=kEADnqd$`+WFiSr*M^f<ggKdj^g&?X(?GO`v#kdw?6_Sqg
-|p3t)Eetne@p!cx-;KqPC)h@fTO>gr5uY*dmtTDhje#n&Z=*5r<gO@-L8H_bKQNfB4BUu6|4x4t00z@
-tJN<d}gS?NLvXaha$3cv0|kx_N=zLNF*5U2NgmUq5FaX+vVQ=Q!<cWJ1pX2gIa_KW1B@_{{W1(qLU6n
-hb1@-?_aj;*|87Qqw?B#Ep<}i=43M-EDGYTqT9YXuW<IdNIy@w~l)B_bv%ED1kn7$GftGD|a!$%D1*L
-{GvkaZY!*N&8@8|-0%i!InQv<yN~ywc-kg5dT%Xm=?>ZVk2@XUzj2>TEsMcqz3trVx9ORTwsSy*w>~c
-50BrOavi*J8K=k|Jhw6V7&tREhi4G5zB8zXn5vPA0>_g?o)DgMW(IEK17G7IvEcTQgP<?QDOv>b#6v?
--P?d(Bysqy98i|>7W%95k1nNNz-)6-#c@PN4gMrxR`CbgwerZV{sLU(}jwYD3xDncc#^cX26OCjxrV(
-O@oH~f?0%P+qaM_pSf{)gwKtZi@6Ne7v=)&@-<=^8L-JrhPd#s88CBS2uq{v-=V;3Bmn^>1py{vAx1s
-{Y3%8rrU3{;ss*9c}QmnWZI_TJXwqc&<Y9J4bQPbPYnnGj<OF<sMEOf^_>ZoO*={27>NxYjSmtYa5lA
-ZE+(U?^%>n%2#rLhH>p08ItPp=+MPN5g1E*CkClDBpMIQ<1yobayQi{n1hZVLdvc0hv4zGTAnLr`FeU
-5d;uIID@=V=668xq*3q1fj6}Co9ssgI$kohi>j!u!9~?@sfRW2WQ|8~4H^8HdvQ`r4_w2OY^Di)cKuK
-k(LdL93qI_&S-#tbr!b11L8m8|lV1PI<aNktuGdKUL8wAcn*9qzr1l{8XwS?n>*#S?cdjzlJt=JH%-F
-gVZUdIFJ9fDhcS&ERM`22@YS@nGirI}5^Je}6NjfcS>ipye+vQ(DMhR*OS!=X8NQx-`ROG;Ypf#6pg8
-K;YsN*}<=fN!8`wuT*^yTsi7cr#9gX{11|)qw<J#zz%z*xy81novFe{{2%+m|Nx~BR1S;81X@t9Ck+U
-a3opL1ZqvmGhn3lE~Wq9a;FX=x@Q!}|G&2Xr)!HJOSZeAkadR4{<PKEs)Tl{DznjLv#Yc1kE%V3i_H!
-vRLp<%F`nfvL&416nBq{p+d!1Ux!gKk1B7V3A$M!hWTehx_HWRFrdS<7Y%vfG0h=}m;U0~1sF#iJHrX
-G1JRr<yb>;n$#Ge#J9R9Jep>y=|j|L4$<Zj4d?tK_cf~ivhVNHk9t(^_sc&IqmoFLHds&9iKt4xkI4|
-0t6By@|^_q%!SH3hxucAcw9t5AJy(XniymHQhU*A-_&54WvK5TdJS@U`4gzV|`5w(92ZCdcj3a)=_@V
-T6gPukFMhPQ4y?^)8F(T_@o>=nf6<3ODyn7Xv{1fnAE`VNvoio>1}n+wk@=ojoU3Z0rv4Jhm>kA&U}Y
-Y{?F?V};CxHa8H0RpzXWxqrqyF+JKxz6Urx!4t128$nZMW4&q8rG#y|55<ewk3U?TtBU4t`!CkfGL1!
-*E+Om&n^3h)l-Y|RBt=s>9J(+L#@zX!Y4WT9_g9rbKdOvuAK@yX-5Y<^IjrZ!Z5$NW`V@pZTi3CY_bQ
-Kp(1=f4_AX|+FBo(2z`Zm+P-r&w+L6>YgnOHfAFq=M7{OwzF0kP;Iy~w<#Z9AOQ(ojDZz13w=hP$I_j
-n3;Y68|Z1Y;530g=42Q0=pDJBTULJeMW?Qp|kFB?kHsy;m{QP;OyiU6X}Jqw!!Ww8h#{&OV^D%@i1jU
-~kf*snEG93ovH1r&5BCr*1%q&=}=W4sP0vYZ)jHiA8<|z`|+4aw=%@c9W?yfOLXJWiJj5&UhM&#^d*#
-G>H}qEC;l3rQKs|EmVKHcO>Yo5*X|#2j0!})_6O8#+8%28C8=MO{t(Ugg{(i9WGw0uw3En>B^QhTS=A
-ZqBPY+y^OMT0roz}b3$|*ngW+n)j8@6;ZuHcMYSZzrgL>|8icR8-13IFzR4jHbW6vwC^R6@OciK|uaN
-Yxm}e)ae?2-mJ32d42vF&sh8KwiK%|rUl|})P{>QUR1#VknF+@qD24a@5-rGuzAOzE*OcN^CtOagfmv
-p{*F5?JqZAkUv#()?Wrr^qxgrWPE$=kHv(Zv?(`h+sV{*2&4lA?0C;0Gk1!I%h!n|b!CQek8u-mfB7%
-e=xcdCmPtbg@POViBud!&Qpc)lqj`<_O`+iN4H^@AU{w@9%c)vf`b1nrw;%@mvYwgC|*8_{7l>=+6v!
-O5fXY2>)5EhJ-L#M<F>}g84B9R8GM}-&!NJ7|nS1|L6$VVP0VE1qaV~q8c}D@j&?$^?Zf}8OR6EFTQ*
-C{a6)3DbNNnYcilCiabdX8ZLbx{O=l7=7DNKA;wlwS7hvi73rH~&?{H9X<Q1y7L;%Cz?^SX88QT8XZ>
-N3;4zC59X(jfaw!ugomxR(qEO<+7#&$xweIel)`qI?*6BOf#+vu-!Ub<;Z!R=YTTA!P%7KjlR|6cAwm
-1tvT)a+&wAiFmhp`ZzP$wes+QU+KzvS-k1Lx;~cc6dvqYi2WzTv^6>Hy6f{tnbl9X<e>;Q7mg&c>2KT
-bD)QkG6?3=P6>#87b3^n>v?V9lTY?byR1twg(djlJao!8x96^<p9Q)ep{qtTRW=`E58XEiXnZc#Xu4i
-7qPRP6!~@uFi~tbwOU?YJ%9b~ir%Eg)-tQ{AJ;^qD**pZ5WOiLpy3(bm+iXKH9O$@tiT)N!^j*v_6Uo
-)1c$nNJtrd_%;@U=F_(?e^HK8b@bS=jXqo{!SkulOm_AZ5P&O2mE4K2-z0@TRkFWZ?>>il52Eso<scx
--s8nl>eR;DgbNTzy2E6Rg`yC4q({KJ>1JRv6j+Px@{RO!$L@ugPRG)@Y>PLcv!X8rAAM?A3gL$-{aRE
-e@QLm3Hega((>{-}ll{#CT2b;66hTCuwm9G&%rF0EtRDZo@iEWppJR{jC0_=7u(M>{>h)X0POTA_V|V
-I8IIUsF)bE_P4F`gg4LH~ppV#gY1h<gg6OK%!g?guCU#*+uUexka_Hnd&NEEzWpv!>}mpPd~wR|DZ}|
-w*oR2Plj9mk{><r)4!#~#q2?$nkEU&9?h0mM3nO*b5G2}4)G)M1|e$eb$^7}0*hc>mZ2zZY;)is>tIf
-}!#Ve5i(SN5Q8I{de+BPH*X?sJ?tH|kgT1Ne<Bq*caA<k{fj67+x_C3rXY*}m=bh+v_&y@%gY~Vx)2q
-F~tRp$SvfBX;wJ-m`B#)am>RmrWZoW$IVEFM^w|uOt?)kg`Uop~_F_=EYadhzrU;c+ja$!AXq6-rA{b
-vNtm%%cCwc4DXeQ`!r3%Hq~ZVwde2qKPLR%0$`M)uE7C+t;Y{-FeCgI(3<l7WKnjF;{RzJZgG;cgsOb
-3n<9W;|!1wkfs+*h2yr(|LJ(#)L)eHAH}-ZsB2Mmr*&#duQ4r<4!5{gYR)sWn<<Zmyz=BcxvPit1De5
->auZE#fHG<VmUrF2!rs<J$63OfrchXJp=NNGFpWU{?YfzK)2oj_IG)T?}+|#;4FJ@$Aujd`iTJ-7D?l
-^r&Mu;`_+8W5*Y25ylg6frlda}S&}Ni)J5gcPqBE2`vl><ff$uGa?Cfy<o104?K@tgJ$HQD?M9<G1B}
-HBfI-EGe894mp!a38v5sY;ds3-uOw=iI;)K?XLpef>2*5Ksb^InOE81e&Y<5mjdKiLT$D3v=nJp#^+%
-lZ_GzgaxcgKC+{>gA`ZZ|Su%;4DJuFCeotxbI>4==DVBX(RcW{X$A<pbPc0Wtjp0@q`#%evUiYIRTLV
-3|2yT4Rw1+A8w&uNE+anN_^3ffVcaoVM}xP3O>)y8fLS@!29X2D%vNltVv1&hVUAnJ(1>Ye;w%SZ^>g
-YkzeSgT`9U5A{wRDDOahB|aVl!DUkERGJoE-rG%8DuLcH?qCUFPW8?pZWO~E#IbNRBLK1f-u~+cf%*z
-I7t~#;^1JFjayB+T0|*B#OQioL1)(5t_G-Qpom<V1DO5b>P?CdDN_n(J=t2eKDu=m4+7PWDTL?T>X(D
-rty*6MVaXI^oFVp#P)ogIH;aCe8-lwKc=R8vvTjL2{w?a%&OQktL31cNE-as)CHVH;7n!|4=E)NDads
-*<u1MxWDdv*7)y)DT7c-W(v#J#g5)(L`V{Kn2#6@0a-_DS@JME)Ki^>0=<-iy%JA9^d9Wknlg5^J)Vx
-cIGsxL(NsOr6{-x<i%vP-yz6t*@5O4tsm*+WpoT#NeU8do6N3oA6ZVSIopZvyAfH)KsV$(*`=9562(s
-6jN@PToWU$ksK!Z3EmGZacNy>9Do}H7EGUuGSBgrC0VyQRU$WI6`0k!q;q8FVpZ3h>iqb43Bxof^y}k
-!QP-K=?9`Xzc~;DiPlD6a;0yH#h<f<)^vf>{5%<|G+)L@1tuQHK`o|?SNAva4o_b;B9H>3MMK=ll*yG
-?)GCd3|!vuA!dvX(=4qwfMJC=AM3zeOUD8|H<-mfEvnAV!<KOrZa@4wTAeaJdtTl1W6KAvK8oNgKesv
-pc`0{ssse8eQ1eu})*y^Wax4c>{Nw?*k}quviJ)aAaFy{%;(18T31&|9yCIvq(B2GLEC@*QsW$#G`-_
-Qt1Yv}J*t67shuE$Q+n=Ju`hvW!m%^Vtg8IYD)S*G1MvkyYB6`wg$ja?Yo}ZJ`Albc@=l8H@Q|nq)fR
-YK|^((j8@!Zy1+kL+M)SBIhG^c)D8Z{JS~~PkSUX!kfg?wKQ39i;#T=vd+=>=J1~1T}tiXxB=t?yIRA
-WnfF)Fxdw)B+iFUCVk|2u-8W#3%r_Ro3K-bWRx-Zk<6r8wBC*7OUm@Q&8muh{g}P@7Ug=G?ZM!`B&|2
-+P?M-nOW7FYKv;WUbNYvs@24$6C?V7dp>E4jqT+@$MiQhPviU0#X6V(RR-SVV=YufI3^Y|@9WYd%J=z
-jrFO9KQH0000808trnOf?GLJE;l)0Ba%u02BZK0B~t=FLiWjY;!MRaByU4a&s<ldF@(lbK1%k{?4!1D
-xCo`SR{5{J+V6!I|+0BR+Gf{PRJ;Ww7^~qt*TuaXs7+{J?E^1Bwh?j+Yg;7lMfi}KIi>8XIF6?r}k+g
-HS<*<*o<pt_`QhOC{a^3F(%f>?e<ujNjh|WHEnl%BOgTHa3k70jsux!#-o5uRUk)F1T~|WPNiWgO<0^
-JvC=}jH3!5Hr00!NlP1FRn4HEcF^mtj3R5FI`**FD{jPNWO)qrK?v7=QTEyJsyYG5eXV-WA78COr^hm
-WxilyFzhys<kTF&$JH@_XWm=Sa1nMEvWwOSxX40m}x_b0*wgBoC0#HXTpTx0M_P<Q-tD?oAZOd5s^G?
-*|j)l3BKKG3o7!2v!a7zQwGq!M@zt_8eM`rJqrxix~qkCTaU7%V{?{DY~{hUK3YG5ipcq(Xr3jY^~d{
-6ritVW-@`?jPIl|7>5#VZxI|yNjE2`&}oFuRzS{a{1>-&a>69+$Hd08EgD{_JM(mcp94Ka?_mzx6U-}
->mCn2gIap<4z)uYP6x34j2k|<P@wf-i8dfDtV!2VjzYGpC|p3^jK@Nw-AqRG^JV|+iUrEo)<+Qb5Fwc
-s#>i-_*;o-;w)}gy-#feTF0Q+s3$Jr?bJqFP`Mz}3!ex}{_%9HVA(z@15=f+?gGBKu0AmbT047i%8;G
-4bfhCj$B4EP>`%a02>o9M=H(ds%Y63GhWMEaCnmlF*sMS==CL$5+X&MD0c}kj(p{ODfhL2p<hgF0l=6
-o85LKgvcU3YM){wBka58i`mBQ+n~Bx)pK)!<$Bt?cje#*RM~gMJ!|1T?kJ2hZJSSxjzvSH0`2W9z0-8
-u=6p@CB5SW)3ZP^0eRV><1pE!X>!8ZsaJh(!z)*?1L}_Gvr!OIW3=2ZJj{<yZFtGRDuORX?SB{yqS!=
-kqW_a4QGP_PP17n3AvkqS5u7<y;+zE7z5RBBS>PPb~FUiKoO}TAwzi&R0#1>@M{T8fxZb-;5?4mhrDF
-OR713cfVhS5pzs=HEmFW#C73;i%TT*ZG;j(~5mBcE{j}kcFB+&*iJqE;!%B`JAK-V-D36q<eHFtyK|l
-<Qc}%>5g1QyvSYRNf+2;1&m5efdGNNkb8DNP(gkS@>z>Pz0z|bi>Iblw~6Hw3jp-30h-EdYZ%X!?aA2
-cD?T#Fw~MaVr7Jv1EPL$BNEemwU+USFO&trg`hfv#lXzpu4zL`B|~`&Ldrjb)fJ5<7X%!O$#+eyoWts
-qa71!^%0_8?h@Dfs((c+IrnqQ7J6}Dks@uuag<&u*OiSQ1Ga=q-1L+kZi<;0(%4dl%(Wku!>}4m0i)K
-MD@A3MVo+5GX)u0(?KtwgNP;gMzlznnM&?adK%M)96!#uxn&(mJ)8v2fWkrH3XEPvemy`jp&HAGsHL*
-t9nNGhk{RJoK&CsDexkG*8Jf;Sbdc(Hm{pMPzkc=V#hbT{yT1GUS<~e@o}X6GP*1d6`>EE*S`a#^b&4
-a~`s7h@)1!k&`BPMMr$`D0JqYKq9TQ0v$ED`q))SChno$^Wa{@y^ZNs+8=Z{#v*e9rZTgbwYL=rNsJl
-n8eZ&)KzCJ$i~)qy$ZO!?^)1_wLw_OltJJosRb-KhkuDSLt@rFA#tdX#lw`|3f1*S^Xu0ru4DHQVT&y
-~n^cuni_|2fMY4OK^nu9ufdEr-h9h282+}sPb`sMOq_QX`6H_X<(gH)O-s^yPR8`ZE5H19&&sIeI1y6
-$uyusHnim93g+#`Ip)#suyZsb$<5|k-`lHWZ<1Kaqf*POKVIGSW~;I@Z&Ax1H#Ov)@{4v{uLQEb){RS
-%gPy!om&e*HxO61Pn;R{*o1)L|c}^s}|D7gFHkNxVbzQU#xgcw_6)o~{`llQ1MzsGo+HH+i)10rXQ{g
-^s)u!TxR*VGwbZ<#N$-~|2tM|PR`!VsVrhAZZ#wI&P<-7&`1W#^6ew^3J>{T*<oxiNTc$`=V`H{oIlZ
-<0TIRz6j=1D*YS!qOx;56N`AgyTFso`+@Zo^Gryoh-_mT}wWar^n}qoY&e%T>6Q3$=nGIUKctpr96FW
-$;EOD}V!H?4ZPv`oDIYwiL0u*!CM_+Z#)+EsT%NzMS%Bz1#j*`K`2-tQ2sBwD&06M%q=7m7&qf+&(CF
-fDY|^RW@YXv<Safhrz*e*%yc&&n#@b=Q8{Q3^T`g8#PY&6n9ZLIGe~I5Wpq24LvPdz($Fn3?aLf8%Op
-!lk}0mfE!Z7W(njPABG~kzkx*?A*))g+Oh|K?0Xy4y}rD>zA9fwm4PVTPuSN-%J<uL3aVQQsvqyhtUs
-2k^>u003lReYLa5X|as&8uYr4&YafLRvksEFTp>-^RHf*XFUI8;#P}c9fatqfYTQRvro%7YnxBS5po1
-<APa$OCMGWl$+MO@wbZTVN#TdPWbE8qO^aK;y!e2Ef?1Z?hy3v8e>5r%8QbnS&}gWOeL=W|>`oPKbyo
-Qm>}nqNO^cxZ>$l|1$E<%kE=4<N~+;cFR$UX`4)CTwrYIUDgX9CH7j(Ih1Q3bX|Mc_=_p)~iox{L^V7
-FqHPHH6H|XDFt_rQ=ah12!XQ$(X_7;bO#WWo(Ve&gFI%7>8ZV!2krDqqqi?}&@K>SJ)|e#%-l+1{}cB
-2qCZs6UB}GH4wO!7b<Ii%!_uyrPN96Z?x-H!V1qq>SJ(gJYvJrHN$$lWyUztH+-r#XFJe)gb@B%ve>w
-ln>wdnyJ-_<oeeR#%778RzA4bv{w5-8pKA;Y=q!@Hl@NHzi0MkQC49@3qs1lJ3`sgW`)X-DfI@IR+l9
-pSH?w?D_{UsI2;tMvV^LYdGZms*fSx(e~;Www@3<e3$M<IGW3GEO0@%fP;9=_Tgy`z^q<8}CEYlw#F2
-vo3&x_%-!j5cW`@olLG&qlyD&z~K>u(oH*z|0^FU2@RTq1*rXK^W`p8z|qqhCQ2=jBI7cwP)DWMp?x_
-VP|R<LCXs0l%*$_@zjkdxuM!7{6Ro#9Z!bRFds%HT^wVcEDtclbgW%YuWdEHwx!_>&}N|j*!9QqPck@
-p^YYo-x2LwqCR}@n>LDZ;PY1nPPMtmy8E9EBAZVhJpy4;!DLZ`mvPzAsV0etIEEs}M@AK|kSzQ2uxWo
-OUkYQDWaWCMgi_w5s^wE_V3LF9M8UWzZxJBMSY%zkWnqkubA6MvjxwTeXogIMpN-nZ|WmPKbyIK=iZQ
-HBFHtM-AV#9g_cb+7w<fPqb73$CHa?8u4Wj8pF=zj*}jmEw;gM6g5F1yATx6pLyD4oA!%LeUB1xaTo4
-{7%Zx)THWKuZjb+xAY4*;k|_jj({>pfPAwynoH#++}Zd`Gb;y#!CR01_59y=ZI%t?&0|R+2+e~;IR_2
-H^=w{U;nstfGxkWqrIh5lg<ikpCi%Hi&sadnKODLCeW3rlx>rpez(^n_{%?c`_N}W+Vbrry%bO6SVqu
-DGS$f))ka9?g&Y=aY19c7hb;uHm(sYBkfj_ZP{I(69I7a!EaMuP3N{-k^IGfz#+o#yKi1w<YQ1(0{TE
-P60|XQR000O8Q5kVe%?wR000IC2AO!#b5&!@IaA|Nab#!TLb1!0bX>4RJaCxOv!EW0y488j+xb!dwaQ
-y+pvcs^;E<F|KQIKt_VJl05B&W%W{`)A|PVAuVVKV|m63NHMCsNAW9)wUs96SmE)H~}V$R=1lL=@w`D
-5i58YA54<-bU=5B8^3%5{@HR50P}3VSFDwvbAWn3;}))q`P0_v5nTBO4~f~YWuAyfWHnE6Cp!Uh%%s7
-6&Ts$?#>#l*s3v(8xDZ!yMf;dUXXtt!Pp3obU*{r03MyDmLha>x{8mxcbyk-m#~}<tczq#1#!=wFZfm
-K#8VEMYqz5lnaBE!Kq`|43XrJgloQl+bRj<$oozd~_X8Fm!K`C$-~qv-)afQ*pQ>rFl|w)XmV?46@Vx
-}s%L69j<S(3i$9i0$g;TG|JY$zik}M2EUSz8Q?)S_iqUl2NXsuBxSCcOD8mjf=VyKu%Qo3a{L#@>GCo
-_S}xH&=e%*_Xu4xDA=NK(JgD&zv|l`%`Rn|raIr6}iato!FKtxM-o(Q&uozP!zJZ#UcRRi6KDpewvp=
-)X15)B&IM%_qH+MyH-6N`Gs^IcQugN6(}4)95Wm%p<=H1~%Vc-{AF&fBUhimG!-h*|8QPkG2rJO4)>{
-E)2Fyc)n%)82=oz3OOzw13b1B9HbujHHgguA&0gar5RkgNI4%}C1hn6N~~oa->Y&_z+X^H0|XQR000O
-8Q5kVeaUN<U1_J;9xCj6M7ytkOaA|Nab#!TLb1!6NaB^j1VRUJ4ZZ2?ny;V(X<1i4t`&SHJ3JGMxwue
-0|n}xFNp-|cq3OyP*9@{FiWF$G>{QDhARuU&px2H9Q)S8($PxJAdrfG5ujVd~UU~6W9H?6=1r8Quc5?
-ogF3n*Dm9>~lNdZr~E8(_KWEEL#k+%U_PG|MC<z*4IQvaIZEr!mVMq|%n$jS`*3EW9Vla4u9;5ng<a@
-JW(v1TzL+czbuq@fOUp;dlNc0eV_;JOrRDoQuleabu@E*4U^m77voJufIje$wdDQzy2_M5!p-<-Pu~n
-o9`3X`vjLS@D@Aq^Xo5o3}u7|X|d8ijGVGq&dk)RA6{SuPf8-03oPN-GHcKnR^b9DF;+_N7Ep3Q?QiI
-erU9i2Co6{#j{Ls^H(q)xa060VpC%Xv<20X1Z}&{P&qglp`84bBwip4-{Tm81X3CA}a^I)f0rjJ{#E1
-HV&=~{<ro|0sLhQg%Dg3CThQ8*T8hS1S)JzssF7g3Y(gxxQ)X{duTN)^phL*R>k?(-Liu<&z&_4RJS?
-ZjR_cWa+CwX3L>H+<=oo<yuV%!<O`!&LqOV}`L3BE>6&6UO?D;#5i*1F{#qq(SoMiiIfqRzr;LMe;zT
-$cOPIk9tP>rZRYGfBE+oer_KMW%rn*CC@Cq=^B$YpJ%@!H{loA~;kENT1G%lttqT(!2YY_5JVL*N5k)
-A8=(-y6Rv(t<PlRO^{4R8HX(gV?$TB)Kii+5=;v>Cs<q5#&yA6s8Y}oXW<I7^GG^~3*9c9ZJ31jj$rc
-hx&#(WfM;^mJvTJqKFH5jegNarSDrG{DB>SG&B!&>jfxv!Uv!G0h7e7HY7~)E`If8BIC6a$^7E0sU$3
-9n`}Pamq8K;f;&P3Y@_e?JasQ9HI3M|rm-r+awN`pM_B`(Y2u~1Tw@xGgF=ZC`&W1WrLBq#absCOlaI
-gN}Yd;Idf50iFb&F5%tP?i9pj->TP_kIP>JA4@sD#Rym@YsPHU6TEk0t!l*XO|Y2s;K%87XGO<1bK40
-|XQR000O8Q5kVey;?u8x&Z(H%L4!a6#xJLaA|Nab#!TLb1!9XV{c?>Zf7oVd4-YDZ<{a>#^3oXPU!=9
-OHl(-R7K*YT{=z5+GyRL2#O3G!78zl?I_BBzcVyst%Bw!uzz>oci)M9tF(nel~@>0^nZ;ic!TFZjh^Q
-{y!?EH1X2&^1U(+o<@V3-r~4`R2V33yY<lf^Ht*kO^HE^?usk!jIgVqi3)YNbanv($GztuIaWpPR*y@
-7ya+&8XpC4bo{doSq{k5b#G=_!Rx1zxy_o-gUUAjoJjrkI!x0_>_ePuqQ_)4sRAFSGv0;vQgx123H*~
-w(`SYz=99P*Pz1IB7<1C`QrMP|S%+K<*)*yaQ!TKWK6BcSXRy{^v_Z<?G_AHw?uhC8&a#tNynJi`HT1
-{pNs4MDXi0|rXM`ebV*V=~h<bK<$$PX`SU(s_C9J-Z_+a8rcFa&65~*gBvJb^+YcXb)O;VA_yYM`Yo9
-3g_mmtGR&{S_4HFhMTVv+R&s&nny?qh8yQ%y<A80cyQ^S+;#7zZG@#wY^2Z9MU;JT>&WzOG0PxHAop*
-4;If2&_8A)Fx~KyOewt&5AsH<QcUm1<6R`Ad7|`dY5W;6;nOqOz3h@7hGVd=?O9KQH0000808trnO!7
-nRz@z~H0D}Vn02crN0B~t=FLiWjY;!MWX>4V4d2@7SZ7y(mZBoH*+b|5h`zzksLsK9#b{^o<uwlc1_0
-R!32C7WQ+HBFFq`LY0(X!GsaCI<b^1Vm$iEf-&A~;m;e5)rD`>N`MM@(+2Esq*O$sZ{m7Qi97wyLU@I
-@q4<zct9SC)q96`_C2h+~P-vnb5Moi|EZW!C*EgL|%D_J%PH8Y;>AbRdA<47cdE13SqxMd{LX}ZW!=4
-g$NTu8cCDdoL11%S*vxTS}dnJQ(OnnOXXl<lpU+wjm|(?=%)0z9HE%R<F_QLa&QuQcANql{9;czHur8
-IEYsmb^NP5LXsu#jJ<y8_F}$_nd~We253cAerIXI$qIpv7rxR=vAs>+fNqt3J<xBIsdo&F`T}!X>j}u
-vE2A$crgY!ppED+{Z6V8LB)r&qshS1{lL^7P-5wj+cHrSI;ribN=kXpv<V$Uh!<9Bp}Io2C?l+(7qY;
-IW~HTUg4t!`}?^kQj>czFCO!t%aidB1OF2($r|<fW<_cLgG4ZFLJxJvVk)#N6I~`Tuix_<8Ab%RaBhe
-tqEvugtt0x}x5URL1=eP)h>@6aWAK2mnzTaZDgL1$5v9004Un000sI003}la4&UqX>4;ZXKZO=V=i!c
-tybG^+eQ$5*H;Xv1|m_3vE&+c+}cIsI7I*<2$B|gXbWORj>wJ4U1oO~Sug$e&MZlZy7U6Hf+35`x$T)
-Vm$lIqB+0sQjlm=VS=HJ&5G$+8#$nPvk4D|O!Twk3wl&)RsV;?EYg6^l8)1}GxgCv08LlBO<tk0Sps`
-Y`#5zOo!suoM^a<W0`Bt_Sf=&opp($tsZ?!^@Yf#!jW9hUNjf0UlFz#ZB?_VvKAqz(!l|!RMS#BYvZw
-pzeYgFOeUzW>g3PNQdEVu%@7oDL>s9NL*R&4DQf;Vee%Mz8S$iD?vp0bkin#RYC85Cr$^b!OCzuH-o3
-TmTsBdQ>Vp9_-Mh%Ic8f>KbT^L9$99??Li{nJL9M{t@P=ado9jq9v!3Yiw*G184;yD3`BUPbB}e^n1o
-?B%=H3CC`0ks{ol!sI2L*|v$`Pp+CIN0$uqMVcqp;&X!D3O=P+JNVI2{#L}G2V=C^I~c=<ZMD)RT^Fs
-IIFgsv!R(GNZ;$}QDFY<v?woHAPDX$XEVS9*9khAyEa?exPjH;Q%d~^hbet0%&&basLa>Ohg3({$5F5
-0N;2y~|Nef|;+N%uMO%mq}gi#k>y<Na_`o4rzSG90*B}?hLG;~ClluPS`N--Q*o^rg=9?nCjgQqydRA
-(3l!lqINQHx9m)j*C4lv0AVFv1beL^oJ-ODMz_O#0|bOxogPextCG=-Mbr^d&?HJzwK#f$3v%Q0a$}8
-~ofzgIQ9EPnw=9sbtku3H{gooyPD^7>j*YxK6!Y5V>GHyb*Frq4rs6^*Zg3NJT*GA-No%YG54{bgwm=
-jBQOg!wOTuQbe<jP>!oDlQtEGnu6MPmJInO96mLQ%CQiR!p#fE2_y4s>Mp)oeeAoQHJi~P6=W+~h<e{
-yxDyCRcgda;h>!dDEyvcP8&X-tu#`#|J+V8h{rk=mMQ)F}q}|bXaWPw5%)g1}^B{^TuLyZDyS%!-Zeg
-m3BnIP(BMD6q{_yU5pNzX-FJ>=(|2q0D_D6iF{wSCZ=@JboTJ3q*_xqTCgu%m8jVUMTu%~aND`4SCPs
-OSnA;sQf?{FIItQ~#=$hEtHXEuOmaKNbdjdHTWkFE3QxFft4rNtrdLmCTV73W4bbr^WxK@`F5?GZPbc
-L%{7>T$HJcXxZl;cnWUt)1}S(Eq51oSm9|28OacoCwjIe?;Iv7OC$R{j86BD_m?%DGW`ZzOVA_X}%#H
-DdIRPD`^gQJRa}3AHxGvo~Ti6y$%fwa@u?FbNFU7CJlf;zM_ul3au9Lw=hd#a<qDUM^lRPbP`?|MH6o
-!oOu6}DNM-5Bsw&E8DISmW?!&bI)2%-!`+#NI4_5{D6@<@ML#q7kWa!_xRSIL{Iq=Y@*b#?7qj_1@;|
-()-yZ0%Q51!16t(N=u9Hzyt57K0cB*cvz(O=MXN40C@DcK@<c5}@92K_Bf3<~L)^Huq<Ara%NIB(R&u
-%T2yl!x1&}JiTNo|$44fw!|BAL7yHrsYh>oJ@9rp#Ll&!pCMzqF7wUU_WnOJ@&m%jNuN5&8R)IFvpqi
-ZQ&V+9p2E+P2h(N2}hN7lxIfK|_issXi{NGhAqQAF8&K8Vm#Pjr!<8c+u!jP)h>@6aWAK2mnzTaZIT+
-=>&ZQ001%z000vJ003}la4&UqX>4;ZXkl|`WpgfYd8JlSZ{s!$e)q2+dN{-ZQUkl~hM_|rimqGxu)9O
-s-5!d<Q5-qeB1@hmH_Z<B-$zomYqu#jYzBhJGDUv;NRcd^ts&3LHndLWIjFj^E`V5htJ@&+_?{%)ekF
-XR)hbC!I@hQslaGaLg0jZ<XD?CaSLJIFifYlnd1W>WxH3Kntp&+nIA`6Ho;D~wsBluO^P+0a);~$)57
-Mly%e;E*<y4Rkf3;umax3@U>OtsM`Xou-z-=W_Ut#MSkIOZ?077pp*b)MMtSx>C8Jt(bY$R?e54%bl`
-5+w&Am$)Z8kNzjK*I&g`XA94?5vp~Gc9hfM6ulow+1xVpqDG9RoG|A&u5=MUSHi_<d<hRmv9O*Ux|0`
-zn?L{52BWyz;xs?ICQJ3JubD~A?VefO&=dKddq}^Fl$&Yks3a^T%xY?);V-W?-wX<J%N>c(i*fO0%$2
-bhSwuPt(8YL$4+{ME*jpBz_R4#_WI+8Ul{Mj4I;klAukyGw?BN>t=@n0Zg!7;6k2%C(Uv~7t3PBB<|h
-f@b98ic20JI3hWSJgt5)f?hq~24HCi(K2+x{AvR_3di>)W<HHeK+m^iF#YwXS(Z>(KIALGsj|F30<*{
-qBTd7gTy%SEUB^aC=`0U95m=cEx%)Sci7oWWWZfdVoF0u0BfvC0HYWC#|Jyx^k{hiK47PbD8w2_{JJ2
-Q3n^EboJR3SYj0Dtj6*{Rk{b?R#pH!8zt7?-=Q>NatvLnfiE6;=pwEB*&vMAt(?5_=eG~5i3o3-f5zY
-?^Ufu5Lq(3UJHfT#uuIN8$!)*Bhj(j8;g{Yx5G|p9RtgWU{Geb#_5EjkyG>px1VnG%I^kU_h_fPPnnU
-sboelz9E{Zq($ADjT#*)VyKmxh{?dqJ$6u7OboQI!%#78A?3}<`KZCb0GCc8`IVO)I*;7+JEj=SK)l+
-iu04S2o+6H4JQ`Yv()Bs^YB=tJEZXQyJk;L5$b2z4OI;SI(c#L>Hz>&mWVxHwX6Bn&LC3CkM)Atz?_a
-eonDbXEx?Piop_ljxxZ*PTQ>0_<7coDdW{qLlYbVM2s-riBOOBw5{PGL)_I;Utka%zWF3fqD-DSg1o>
-{hcm)pJrf4bkg(m@`H&3Q>*@{w1C5>gklo>!=I6B^GK2S6rU4e(%S1I#Qe+;ACa3es<Bvmg)0Lvt#^Y
-bn~GJb>l|Yi{js;7g@Iz9Adg1@jJ90D>1cw*vT0-%{nT<jNpq%k^*i2*(xV#UWh=i0=Igclzf~GiqHx
-jk96b3=nQu@PHfD$@npohhDi#Wu-%bu94@fakP<}avVUlG)6o3HQ;99hZirbfV;q)Cpb=#=iN_oGM8w
-(FK`9=n=gFb|Ac74JLyl%30Y`Z2f{b<UD1+ZA?@;|nldPMt=k~bZ=}2h}ahB>PLT`}=kW@G0SD|-e?;
-|nUQ{8BBUPvdgTyWIq+2D59+rLcas}s1p|N3953>o4QbvMy>KQ4vy<Zn<*0|XQR000O8Q5kVeXC~Kpv
-jhMD{|o>C6aWAKaA|Nab#!TLb1!UfXJ=_{XD)DgjaFN4+cp$_*RLR)hf1wS6y4h}5AzatGvGRa9UvHr
-K%gbc=0=eMNhNWA{SGgZC|g;p7t7?ieCK@UqDsjc<$2YbR?$31tZt+-h#a)!t)aR9pCsYDkiyVc!`Y!
-b;qrK7;&|~FpNJ?qRk}NuI!TN=|B@hh!kIZKN=mCtUkln8w07q!rKB1OmTg_1^IjYg9qA^O4WVHTE@a
-&h(<wc!w|DoC`{BAZjO*@}3T*=}nTl}rqWLowrBtYonoC7$lH8z;G#beYm8`0$q5>>gxEd8ifLu+z5p
-!aCj+iKT>k#kH+R)lXh9EOwD2f$#@vqzulfuL4+@b~AN<ot($sxVDHpEak>r;TaEC^4t=o&Lo0ytugf
-#^rj{e9pLhu4}2a-=FLX@$IkwUCOoUVO?thS_Z9ewQ8fC@7(q6Dv;Wg>eqCx0(VTYUxL^HBAfbN_3#X
-EG<#xB0oE0R;s32gB^`%&5RXbLbDPS3?4atBc=}v1TdXMPoI6xjPlZx$pqm%x_ZOXPu^1EvT&p(k1o@
-Y1x2AfguNxksC2M2NADu>cXRYH14{)bTBEhQ0DeA8Rf8T?Y1bY73D|cItnbPlrke6<4jv1s%4|U2<-<
-O=5SVuP1`whostn3tagGj<d`F8%hCtX>Y)4O*_}<##43sHUw93_UoEuJ`DaVr-I)^2c*Hu_}Dwavr*$
-n?9nMl9(xAsYAXolWjvyq_>h%;z~SlCvUJp|-~X{;O0j6K%rgKFvE{b_g&wDwA&2y)kW`HLb=`rf_kK
-!m-u#|<r0CYp$zV5$p;Gi}nK3Yfow@VxJ5yf<e~@ou$WJ><*HCLjtXg8jaXZmkykM$5f{ey{)XgS9WE
-(P>vsH|P$k(LgCMUZS=^1X)D33_K{rAP|a5Cv_svbeM5&?pFQ(A;jDJ&HZi<oQ=7<K@TwOkf5~GebXZ
-#9A<=@g(r4AQQfZwUsP6-%NIDuW9GZKR=eH(Za(6o&mYv8P2XLX&8L+gm%HtH`{)0u|GnC5?jK_dPwt
-I!O{Zdh8X7f+qGTq|LwRe*z`~B`s30c!!IP?4(rZED!``xMVuA$wSY7N@0a+i`5(emld}QM1PiZ8Q4Z
-!tDw!HK?aUv1ku4IZ(Zgz!<<4`C_$f-&RpzY-}*ihA<3FI}2+J*4E4<UUsykMGX*bXr23K~Z?pNu^l8
-MAc87ID{Joj{a)SjttHs@}PVzA@%(6W~+l9m0-^V?Pn?wn7xs9L<<LJkK)6V|0c6MVd{f$&RWEK;Yb^
-9lkG?`|TRRc&)#KNNP;QGgDGv7@_IxVYT}LNER?|m)re%_M@(0U%M*sSsZ-!Y{!1DiT?gltMxHjALCY
-;Tp@9kp4GUdFLLS@gB>>W4z2J?zN^Q=!KinHotlv7w}rQGEjz&XzTrKa6gogq|0b7d0`Y#r|3U4}+)2
-CT;A??#dO75~uW39X6n{eGvZ3O#vxiUJ6bb{rkWU!i1*t<b9f+pZo;}H~mgA2=z>(iRsxRbqV^armqf
-a0AcLaJo6J5R|_zt7r8G($by1eZ-sw+frLFuoN#pFLwO9KQH0000808trnOh{DN>WKyb08bSF02KfL0
-B~t=FLiWjY;!Mfb#!E5bY)~NaCy~OZExE)5dQ98!Knx$54QG#VFQBZLy)9v(DVgO)}qS-fsxKJ6Nyww
-%8pU=zweHErQ~!5+J2ZmBofIx9-q5=?&yV9Ig8^(X-f@p%tT%&Z5h8YDl09-)%RplkEh&%6*)BDcSgz
-PJyW;0Lf$r?%0vaX%jVN;%w)2l-3n1e@d{+BG;2kZ`-RA0v;b8k_ng!=OIM(cP?B-O+PSzM>}`;!9Cv
-Sotg<|d4J1mYX2#y1y*hdQ{-Rr*s}wTRtbVh3bJoqFZQP>rcKWZ2)3@>Q(ed-s_~h*EjOkKJGNP0z=y
-)ZxEqMlV)u|}0=(K}01a&I(jNO8bg*0ef25EZ=UoIkG5IqZdqas;Cavu}Av06*elgZ@b^!yoGbo?SdI
-l4TJpS`?fhb-9pFyG7Pd+Fug^Mk#Y2YVNP2e_6T1sdmTk40$4xf=`PSn?d>V2aC<j2pw=wdc8jY;jCG
-Us#NSP~F@?Vy6cahEEC$j3Ob0jpNYZ!g`z@`iu<8&`F%xxOW{M(VY@9#N$PU#`%XC3-IJ~l5wYuD8d3
-Xr_uI=ohzO)y95Rg!dMCor@UQZ^`_gLp0&UoRRJ>GV#<^vsU7kKee2O^G6n;Jr(r8GZ6)9#fx@!z?De
-VE3cdS|XC=7zsjt`5`RVhdh0yR7I3s7Q*c76Ph#5;ttwGwDa<8ZC2|KbF7X?K)TWf&|Rf(xr>NZatip
-(X~PI#aL*1?xRaTug!UW6m8K8;4`2{4Xq?Cb~*yp!P8dO<JYIDDtG?aKPNpgIqxk;LcmP<yH^Q<z)vJ
-#5V3r7pM4L%}t-N}Izlm<5Q`K``}Jb!qcwrfzul9aCn=Lc#wiWv;q>zuqN%X6yxQzH=fuH&Ghp{2mxl
-Gy;YdWQ{4cmJU3mY;>Q}n^sILm{emv4jWIQ1o7!s5C=!mfE8Hwo%Twt8x!_dP}hyrw}c5p=Hc+o250c
-AG=O-aNS3i%)l<ipfI+}zIy@m3AIBJtQUQi>oJ=&J!D-ZasI6SP9dPn3c&cd)qH}zChA&(9^07p>GzP
-kWH#^9Db=13f+@(%9C^NGyaR!m>jrWs=){LaT8PD#{u>(85uCUP46&JT?)}!nHq~{)9+lZRDnW%x>61
-QX-w;P0YKw$7Z*3pH%n5pvh@%E_lx9{g#W@~L|%){=d!MgG#Vrl5B-a80_imDdaK6A;+f_ifIMJ;3Hk
-aLj>>zHDp;bRFh*)X-Ja?DT;DwzN)unAlP+(*orKwM%FG$a#1N8+TAP8;dri4{mf9Ttqb_lg&Za`w%j
-FJ|Z|)T9;*x26hQr%u%)qF^S`0!hJTYIC~E3B#rsBYtbM98$YjS7G$rSPl>MO39HEDx7*?;|8Pq1X74
-L5RQ~q+x61|rD>N+t5;2%oPIp)x*Y1~EQ&Ojt*Ct|Z6eh=oc4(I1T5%WNTB0mv64VFLg6vd^=9dy_KQ
-8P>r(}J(JiP8DOCuc0R}7ltnD;ywHTSFaLluv>?(~{eS5CQnLTE$LD$v)!sB_@z0gB--ZOa0p0YpKkL
-=gq@Xzl*yFX(}8o1dr+k@%4U+>=b;BQ0Ga}egwU1{)Q3`5tgxt4uzc@~V~xr%91kZl!H(0y)<H{EI@3
-V7n!xYXGgXX+4eo5N4RQ9{iaa(}>!A`{gO_$Sv`4tnb8$dE{LVIW3Ea#3EI&|fnE^lD_r%CXtXg&lG}
-q~pWTlVN2K-G*dWIK2uqWWW)G;QEo<19H;gBUwHcn2tv3cJDEsSWP2gVr0774p092YW~Z$UoM}xHnrd
-5AtU3_a|{Dsk@dI@h+J#?g{F4WW4c^f*n!~s+PtpKBNyt{hM}l3448hbhJ8wXIy3>fWt?A~Ky-tswTp
-i^9Ef|<gZ2$O%yfleN7QAPC_Q&Sp#)gz*n1&UwRUxnuarp9a8rUA$XCq^YN!5`u1Hi);Q^u{yVSoPZD
-9&LNs_1Z!;5dk4y|8bb|_K(UK0^5pk3o+2tKINb?l|7?QSV&&&=3TtpUG#W8}GDtcI_+$oLKR+W$yWX
-_l(YQid#Q1iBepja$uA+F~WRW40|y_DOwJFxh-wiMV3FkBagfBOnUKxz-DU;f<|EW_ZtbP*zvQQ}+)S
-cd*uwrEpUY01Ga$vjOB-L){b5rLsyjIv1TO!z44^?~KZ|WCN3NV{AnhYS4*JC;tLaO9KQH0000808tr
-nObzCexaR@@03Zke02TlM0B~t=FLiWjY;!MgVPk7yXK8L{E^v93Rm*PMFc7@!D+mXMB*5XNw*WZ=O;Z
-GIQzLQPLs8I-w6d8<q)Jk5{r6o`qOFGmxH?1;cXqft`*5LEMHnj@+h|~nh^kiF68>yd*;ruhcN7&42N
-f43t+_U!1M&_aU;2|M>W)ga*$BA_pJs15|60_P?Lg*ABTM$m9V`%;8ZuD`(B=&A4q-yc2{PF0*A3HPR
-HHNK-5$*FH-p+D0oq)&n9g+wn{L2<_GbxWl2@oo8bwhK1<AIMy&~`LMj$z>_japfGWt%hB7)CsHuLZI
-&WDJC*e#G25uztTlEwh3xXrfSz8-O{kE+nf(>($fN*c0W=?2z;HxQ~KT+ycn<3SyF1=7+X*Bvj-8DzO
-aCaG+n)e{YvTWT&00=Ojia>q-NKZQKpEz>l&d<PCKS~Mw?#!KixNpu|f5n;%KlF%ydo(r;aGW&MHw^l
-om`=F7z<#b&W(Ao<?oRs}M0zEs3kKJ)>PkPAZ3GAf$ZT=VJ2M{I8eOHASY~o5t|2NahW4cR%+}A<)cE
-FOD#`HxAnN++^jMWP_NVLN+m(I_tcfZm!je4n!II(bV=G65xb~~%U@|;_q<igmle^Kp37$J@2G6Qc}4
-9AMz;@LgM;oe$2H%{9WtC$}Ic8~L<TW*fG#9uzFZf<W@H*uO?jf>&ogP?kF4~7zBJHfjA^zrik;qGgE
-7U>Z^7;cB0On6V0K!D|%D(4XeE=1Pt$m`yEOeSXP{!ao$Yjz5|+F~G?MgKlLD;4%dda6|sIq-DJCh=n
-jx?Fltr=QjPqd+L7o9O@9YzJ-KjQ3V4{U%LQyZwqOdx!6B8zuucKhkq^$bht163<Ocu!-7T)kx{q{qi
-v9b2B4zGNn4S7!LajWY(|j#YxyGoztLm$8M1h+`HEFV)S>#Wc_hNdi$#V@u7dXcIghYn=QLFhGJo-_t
-)d7uml&c-aFjon>tN3n&?3wO-GXx{R2=-0|XQR000O8Q5kVe7NYV>y8r+H76AYN9RL6TaA|Nab#!TLb
-1!pcbailaZ*OdKUt)D>Y-BEQc}<Po3c@f9M(_6&VIpl|>;+_(f`Xzjy&IHLGc9gQ>EiFx+aeQl^FeaX
-ml@O-*8>wgg7GjS-+bv`;D$R{!;S`cIKF%jOw^58y*wQEhuv;d>w2}`LIpB|IJxUR1^z>e*n7pny>X#
-+>pIlBnukUH#oOwPY?y<br~(9e97F*rl$<0rDV9!HwPiqak}8Jpj72G$CNxdbM2a8XmbRl2<!^ycw9-
-=VW2;PE1xzoZo328sJX6^RP)h>@6aWAK2mnzTaZKgnkd<N%002!b000jF003}la4&UqX>4;Zb!jeedC
-gi|ZyU!Ie&??kP%y-`sg>=tL10ut9mh$8x^`eW@IxFdhPy*@qUFqXXI2!0{`h`pE_)%DbZr-H^&pA6G
-iT2AJD1_I)*F^(%f>df$TB83m98!03!}@%ip+nWEXS7>@=hA5)npPLNGocqb!p-Qvon6Pkt@Z^xY2)_
-vzzN5uV25LvqCI+Q`$@_o2|JjN>N7&R&GT6KiA5Ndt1syd{XMwN~+bwA5zIG&Gn|@HXii;`t|p3-rsb
-u8!Jl_-!65%;Wjh!53#o*4TR&$l_2H{p)9u~aJxFY6ROa4C)oYLyR@qHsusqi3*IjLj@NT`t@2uIh-i
-t=CpNA{S&6#kd-lGDrc3pAc`wy`!v5`_pRT`unZ5Ys?aiCFQ2tME-iHs#iL*^5l@cxEH~!;fV(Z;Acl
-0q`<hs-~-|)#9d!?;mdI^VFE=3K2nW$?GfpV^}ZX-MqyOw6oq{_>tAm!iej1`-gw3NXsK<L_$c2ClYx
-X(pp*-Q5aR`Kk_W7!pZt(BNe$dus!DmqIFW4?0FW?82A1`eG}CKLD|%Zw;RZnG$SmY3X^Syc<LU5jGQ
-mb@$%Jikr+VM68Fv3f-=!mX{l#pzO(V$P;<&2;V<!dbKvvMkwFutKYI%Wjq4vh5m<+fpQDFe1V57iPu
--p|In;EZOgkL692LAT~TPOM4|kQVT-_O;b4|G)jV=Aoa1v2qMCs-@LfKW^l&TZI(->ba(Kx)}LyDa96
-F!k?$9}BqcFCCYut)N*f~=U^QR!n&*~$6|!wPEN!(rcq{GNuZ{W%<XS#@d#~89Ef)uRC6#U}yUU=Q5=
-uqPr34F^-Bn_iB=eJ7Pj32cpOHuK8foloj8e7cMi|ig^|z!o>brVJ5*Na0o#Y*;<h&Np2ALPw<6aXc_
-$Tx!8X-^%>Rm}h7W3{Tm)<kBy1q4ipYZPB9Ra$h$O;Az#Fkv;5`jP`k~;*u``u(@Mph>7ota859olvV
-Y9pS0_7s@@uBDoFvL>k$Ma-f^iH{c_vcGt*eCd|BXg=<BZd+-@!HUk2CX?(t*a8>|&p8sqL#&+>08`Y
-vmjGh$TsJ@wII%<3nO^)3Dk03L)2aLWlfz+Bkx&My&}$n9E)ncXn)NIprz2cLj1){Ob}M!Z&1<MTo{@
-TAc}G^nGQBm3+N~-zFAR}hh;A)tP~hkWsZQ`a=O%(Mki*Xme9{|tR?1t!*0Ml`VtG>=U~2+GYvio{ab
-8;dW8_Abyl#yhbOmQ$5b1LROTq6Q2+I}J<CNkE`CK$-i-sVGT=Wk12K=%o>C?H_h+o4HAddV}lbA#d2
-SLLd^UO2#BxTpuDa%l)km67aUvlrBx_5;%Ike~LbUeAbfrV0mGDuYlWW=4{`jy*C3KNi)QqNYki=`sp
-&OwcWiZ7vQMzNy$O83@mkz~7;`5Kl$jI2Qvi^Y8f_rS_RlzfN30+}txQPPJjLJ!)lC8ZgdSw%{Xs<DA
-K9y$gylnJTeiEOooxqu$P^)5mKexlDfE%UM#yx6sxpiBjT5%-)vr>zsae_W<RIU{YB&B%G@>>;mLNWB
-jq-fro?qzks_`t)-{vXgWgf=R09_6$L1l5_zu_V*(xA?Y3l+uVgvlD16kvoq;PP^`t{W37m&_Z8(V7L
-;z8e~a=Ci*1jFOTA%3641oB+&qsN>Q3s$v|??cVS-Aj5OOZCsa)yN`+0{Lg%|{@9(!py3}-b!LfX`aA
-9+7tl!#nJbXho>YhG2NSHzvUz=9WrWIiW?8_M^Q9C-;+0K&ikg<RSt#$bOi;N0HWv`6n9L~;*-<bWhs
-Dn$-}HJ*1wd?>>AY&!SO-=pV>kD5y)KlZoa#Md3T#f1=I+*s1<x^uBpb{*>sS|<*e>zrrYW8VgyopM?
-qYn~RBhn=H1qXkWQJHZGmh+7g?0{OOUSVGi83=N?gC<@b(Q`Byh<!%mEe46M%&gVr;%sRcad>9A&YE3
-!~4nibg0g-4n01#Bs;)q^fP`NP7dke87O#=_1B8So;xg62^zMi8wg1)svoVZjN;2LgNig8WLPRFP|P%
-Ir$W}n~Fh%y^0p)C}?51{*VU}3LT_;h&n1|B8*aa0_Lu)#jQ5{Q}Elug+~Hrs1jVWUUvX+ppI8$8p0g
-;K$Z-L)db{343|0E-n`*FC!xDV=qne2iXZDsf2jj6J{8vS5FRTDNnB&?TnnA*%2@^juf$ar$_OBZ0Rm
-_DoMP{DfV$gh(UPOEW#jIr4!;yMY#9pX<mCUX8PX7wmzVvIp(D%oh86_46`KP=eD)J7?<ZN$)sHulE!
-Y(hiT?Nr8~LKSWg2DR!okBOwsI`aLX%GW3g`+2@)-4TWmGadA&+%;mb+lu{6*SQVFu^=+tE+4I*o*Np
-lB)1&8VG}k)DwmxMyI`l048l1>wffB&v2ab*b7}6sZ*cxU==}UE{gs;6<I^r1d=z}wHOAw9v;HVxg$`
-pc11XsYNP7@0>B^_E(-{tkarSXj~X{SUjs9@S7=i5gQpsgaE<tb~BYk(cun;_8Pt}!%vAhuAtS*=|a0
-X#rS=}w$_r7Des&_bC?D>rnQl0~L_0T+g7uDbDsRi}ZGEZ#T8mAAxX5AXU8_X)+{8GEr7Xi>e~99F6u
-rHF4}MRdDRgRNt&+RlSEx@gcr_iYyR7ux8WS4=mxAG$dGNPAQfk?e>9-2SW1W1pi+d#AzQS5If{f@HA
-IM^5W1&icN^h%F(fIuHNmz08ZsUK$Q;n(b4g8nQ3^fQN+n7;lF~L08;+l?$#tdb}tG${5HRn4k$8-z*
-CLtoMqPTA{i*!slm7y)2tS4*y>W?RYpTbL8?^@$enrkA#sz@5FTXNYxN$ArZoZJ5qmbY@r+Lo_6KJ^u
-Y`<nWIcdiU$uo2$^QNl=uE+R|q7Absv2mcaORRnNSuzB5s%*f04*1#2(DV<Cyxi4n9H3UW%rinz`ZMN
-IBqJI^%|gK3z`z+IpIdKt*^57TT+mG~eZAsHpsivGem#Fu1JV-`}g~o2ozqzRy`_?Ln>R%aV4LBNo^6
-#O&1%QDbgN__Rl*l!}O)pZl5MuLG&W$wM1cy$an$u4vkaqG-6raWc9sa51{ezw4g;wm(YPdas!g(-f&
-^U-&aQV?PQwp3IR;+eY2BH`G7UH2@1YDrQ2f-^T>*N*!D8!ZdjQ{v{0_&CqY6vJg3^>8`YB+|lzi)K`
-L<ku>jdbG=%)|7qmuZ&yrSbDPr;o-2o`nxdW%Q`R1P(F3CR)-+@~^S2R5k4jK;`o(&g{I$EiOT)h#u3
-+!lUA_3>WvClwE<-+xGxh&OQ8^F9oSN?>9~P8D6SVgtA>ns%<O=OTskL0Z=E%#&+As|O#8gN}p>$QY)
-@A=Dz*QdSbsWu;7lw|RhdDphvAt0uJSf&Wj^@S1KN=}Qaynx-0>WEcnP-=mE4*(=$D7M)SMkeAR+rM4
-MwrX5{`BOVFi;OzH7FwJP=8xScVsW!L=)ZgE9iwLW#6_pXxFcQcr&Jy;ha7sLj>5Yck$SP$>2U=NXTz
-j<kiC^J(`32%b0ZD0{mXdjccO@Bm9v@29A_@xXj!j<_`V85wKP<=+GU`o>&X4JMngp4w$rIDfT_?aNE
-sq_hFlE1+RQVLBD!HT!_-r6(_B@IHbLwG5qpxuRbnKpCj}X`y7o)(dTb)qvD4#G4FrW93eG08(;ZxEP
--D}abvEg7au<S^Kv>;9h|Y3n@R$5{c!D@kOR%77YSagZ-Esu7l(UKXyWQ|`sC@K4?UqxrE!1~-^*otU
-wb&<9Irq+vf(}b*?UtHbEWrbtmu3ADGxrN@1~K(NK5A4dred6F;<MUX4uc4SuY^{*lBF)G}PQ9tV4^*
-ru#f@WntIDu*f{=Fqs6&rXQQ|G%)JZz(C4gllQWwq9$guZLO_{J^o_nt~^b}^WMC2A%Jm&wDX9|J!-U
-8xb8&XiP|ye@xCk=r8IvB;QGlvX};pJ>&od(Q&HXdVL>YENq=0sVbde#)!f(Eqd+m~G5VUmP!QT+&K4
-zCx6IJpj7u`;Y^c-q3O#;iQ1}rul|mg^G1{aZdUNU_rdPd^qa7QvwZ<JAwe8p7qlXc~CMS0X0iE!@D!
-U7gBpJPanEPy%9eC)cG2cIaK=4G+eNYE+bVB_-7<gAVf+}A2i=i7W<o=@BEZPdo%%MniAv++C_g{w16
-hg)Bk~tGLPkj|@EM1RQH8w;5W;)L~4RQ&X*-R^c>xvrp>&Gl+PXuAO<VoO~pv7}{vCP@65Y+`Q>15*0
-xNif|9rdjM^ZZVlix<~^CTBUGl?Z|hy}Ssu7dJ#qf$IXP!QFbfwH&L>t-CfwUHpeoX~<as?Jr4Nr&7t
-+k3S)g90Ba(arF6FA#{sV*tNEznD)Fo>vfW!1-&QYJuV5wrc_Hkn?5klXjVQS>Zd*W{|zKM)sf$a;+(
-D>{tE~Z&u)Fh^#q<YJAYu#>BeDzAoJwoNbr#kO{0I!LN_`K)@ggRUf{(3maV8oD`buEDc!fCy5fgH>H
-gvr0lE;BB5OQuzZ7QIHI1!ZYK>pT^zrY%cp@#qM8E>+MlMK4Xj2%qCb8F(sYrc`>~0gob)hKQ_RHUw$
-8FU9EQD>pzCcNI2!I30PVq>?dCS}ve71aNB0mZXRPL=6w?NZNxoT>MP;KYgsjBPFxT|H4wr792I?|s-
-uCK<b@@UAB{;k_Lj*Nq?gJ#YNIPB;<fs&D?FP`PO@Lv);_-?@gXYnR$nscO<(&1MdH}nOCKDoWGiH?z
-R*Nx*e#uU@;D^TrY+rI!%O9KQH0000808trnOvqNnOXCdy09G&n022TJ0B~t=FLq;dFJE72ZfSI1UoL
-QYrCM!|+cpyZzQ2OlU?I72<R&@b4na4U%S(F&+O+5<y$@-ir6t;CSC&*#veymr-*09}O4OUzn;1dXmd
-N4onfD>j&(HtM^E4Bh@hoG%zq(@KPADyloFzqGsUn*(U6*B{s`K;nvz02gERI)oRVxw4Om6WF<4av+b
-tPi+`|Qj<7fR)Y`;isvwanM<XQACUy{RjiHNOt}%&b$&GKzO1PYV@kc^hquozPLOvP>@B$|YA?Fs_+-
-9Mf-azPL?9S;2O+oAHvTuZry!cHNG`^_u}<Ds`Fh1JJ5AbGGEkO<l&RRCAU9NU^S$r79Ak_56&Df7G^
-8Ld=1$8=?}6Td6BOJ3BjzW26zYOZFkyB|4b1U@fXxt0Y$9uUaax6?qkWgrNwSP%zRW7s0@v=vf%YIp2
-Z+kYbW?t=aF1zA|zOi{+mpsb<fJJD|FTwbcRWeELj}bh3d(G_j!dhFFjl{@JYY|K;Bb|L9d!(%)T<?B
-L8)tU&rQmsK2xT4XD`2!0;0-)JS^cv~pZtg@HY2Bl*pwJH?baV3jdv!0@Plt2e6vDM8JU${}Ng^qJkW
-kmwwtw2ABmB=nQ^XU9~s5Y>`^Go(5`e*cyIeQvCWoaRF9#m|@cY+bImEvney_qRj46x=^r9yvc0HZS=
-(0N<r!UJKPSvUSTyI^J@*;bBoMhHg@;Iobp0O+9*lmNrbX=2n!K59l=3NJu^VXf-W&_g8$&h!Mm4CsV
-CqC1||LWi?SnqV=gq*F9M*fk?Nj#R@wW76)y@%3?P5i&@FWPcq`%|A8|k1f&_qn++#=C~b*%|ULSw<1
-#38i*}$9hvrc0|m<qR6$Kj1}{Ok5QU(pOvVR9d#-Zu0AcWo=Qz<3Cy#xBUIa))tyl0#7zX{NaV$ZOq-
-0-RdN6d}eQ;Ah0<7?TjMr2wYv9y*1CbJw7QbgLw@AiQ={g@Gc8TUSXE^e*XK9EaZs890Q<3$zK<qbzL
-}maP5^6O3PKpgE9#t()5@fq;wiF2mcL73S#-)R*(iYbef?(i5g#p9jNfNh!fkWgN>O6)qX1njd8AYu&
-!jLUi^u6bWTkBYXvDEN|SB8VLb}MF`ITO)3Vi3im0Y||C<KChw7VvrjwvpTvbrsA;IisME#MPl3k>`X
-MfIT}UvYhMKF&2&>F|MSq1t7nbxd13&pBI_}0xGOg)Tsd92g0#pbh<yzx(I(z-+iEVj|$kzmI$}IApu
-^}pC~K#U^BD(TE=Lou*NZ}X_zgw5KpR{6Xc~KJ<yD1iqEi}G|i!ph#fp|!3M)KP&ioJ%ZI!q$>{nkqc
-Gh>$wC?gX7e^EH4h%Jp8z2=8k-J-Uvm)#^|#u{hCX}cWi)LV>ILvNi<)E3V13;;T&*D(eDlrC9>4kV3
-~_*gKnecurwyH*4N`|bRgV#A>?Q*pC<`sCLLDqq_+Y}9zy}B4Hkm&|bJt8)95QH1`3fE3vq+1wV@7+K
-KYhYrubt7U0vE%=Ox_5VJp1F1RgtAajk^mPJ7*P_h()tbnaPS?g~WJYJMdvdD{5RZ^!S^htEH)DR@PS
-n>__Wbum_L7{nt~H@P2bJQr-&4DpR)S7&HLxv`$3&%+B0YRjHpX7LZYI>LvK5?V>!Cd;w*~f+*?*Qf%
-<A6wh_Wp>`7MHPjZ$bLjS0C&~UEI1#seTV?>k>pywEE-;N?OP~Xqrkz^{j<@U__Pfl);xS~ux98CyXE
-F36fF|P!I&IANV?Wf0TQZ@O0?Zp4ORKlKgy939pyE~qeNBa~WKNVClC3j{L<HKA9UxEN=UKs1vmFUF>
-YQ{1;t0kZz#jKVv-K!Hic1KmZ;R?jL<<vek-kx?P+k89oPqA|`sw2^bZX)xDU<@Q;cxN%Z$B}pC*jdf
-lKn3aRG31brzzd=*_}ALo<J^R@EV%0(FcVczj%HHEF3^m5TQUz8E0FbAr>~(f(=FNygTKcRSA#=%=ix
-Qd;ah{$fm0zDYECFuiwF}=kxwF3h+<>K18*KQQHG@zknx;pAY{j%Lkyem-MZj*jgUATu9bg@GxkC5v(
-%rZSSIa<JWsGe&A-vv_l{>XOCwe9=B<h@vRUYsT!O!Q?dV53xo%&F5@e`a!h507<}<P#0~~h_-NE{#e
-x^aHqz|IC9{f|L@q>G244_^y<POzuX8gxJj#3!%myBeu!Cj0>WgM@p9D~|&=DeKoq<(tAWdh>0{k$?%
-Dqycx#KovMT)7bTMf1k6H4?Rvk2=ba<3#j8%1G>KRO5oFTt$gCD;*|0i{}?1_NKvPXK`LHhq}4&)rtM
-+@gUfN2Sl?--2d0(RKo&w{A2T6<Rg=eQ@C*JgJRc*ZE&{QK4na${PK)*x_%U9~wH~)n$ec!L{p6H13`
-nse1ZB)CH-hk88Uh!wv05x7&G4|38`7)hjcHRr`Xx4{pt5EiwhKC@WAnxdx<YTX{lHc?J?%tw1yK1j^
-uJTQI`zB8^PV*rm1N!Mi6jZ%@S%V!2BxF*;1`1FC)SaiFd_unDm(BaC4mb(!+Y2!V-IQq%*3N^ZcxV5
-V>*$a%Mpqo`G4k`@;*U5zra)4O8{>V2~Db}?@(HZDvLa$;XsG_whu7&5P~k;3&g#>}#SGy}g}UxVPTu
-fLc>LP>NuyqmfAGzo#_nG!rbJfdbMf=$fYpiVIkIP?g91*as8*p{aEWZ2fZ?-XQjvRmUq=rbA*`7ScP
-$D+^lX3>`04AZs<a{=lG<Cel=mwx4rywvBYqL?4H5k0ZbUjcr!YTh_bWEFg>z*L$y3cW}&h-}f>F@PE
-hfDj3pyhCXG8+E1ijPZs-m-L){&okIR#1EnNfW$aRZW6>qT)KG<S;)4;r$oh%z%E5M5(;~sp+~bjdz^
-y%`6pOZXpry3sgZtxQ})=)Nn9)<h6XcWSsK;x)IOPh0P;Vb_QYiO0Wv>KP2hjCu{lK|ECXD2ioq+q(6
-b{g3}O;ZnCkKf!ayd%+4Ok-Sj237dMxg8^yLsP{MdG=fvscu$Be%JvDi^UbhL33ym#RO5WLWLHhS)}b
-NqCXJwDd6^XY-(s5MJjzdpojblR{t>3>cK@#;pFC4%T0mo`3tt9(=ykC3G(7_u<Ee6K}%RQr1dV44W1
-^hbqha*?AlIaPM|(TR@n-@_~#&lm=wo>7u8XQ7;7ss>&++|Oi*f0r{lqhxpWD}fFjI7<9)Pe*-znL(_
-MO6L^G1g~8_k79AU;QJ?tEokN3SY0&1Eot%Sn>(a;m*j>R`}iJ172Z!k29C=RIoj+WEF54t4(dbk7J{
-}-W+@b3Xum@+s?JA%7-(4kEJ&B&7_g_%JDU!J|6wu&%%sJ?nXSmo-adT$@h-*cK?*hc?5s0IuDrD`8R
-+4pmQA~!z$D6z<3?_exbIU;`BXEWwA`cqd#G~e=+{&V6E#B59{b425#%0#(9pIJnxU3M&3*^X{j@Zi1
-FP2}6E<do84Ph7IrgAi5EEI_R5m!y;BtgPq>I-wfI@pmV`8<F9N0^sf*S;zce*vY(|NP>NfM{qEp&Os
-O5Dx<T2S~1DEfdW*0Ks8Js$Lr9CiQ96>H?vx<{`v0sacGNoq(j^S1v(zP;0|#Z<ZVVGRW;CtT+i>ItZ
-7i(%8pUvrqjPn_&oRU4iyk-gde!bo>$<m!#9%Or~Gv?En+TV}XvkPsG_w)5-JrDBrGNlz}r9=C%xJ1|
-QN6P@;?Q5Sgp;M+N#nfPdYYN5x3<MWG8u0Qsf+O?m+N8`B{dBx9<KG{?|HkI*83ibI*i(FS2-S<2i6$
-Ua$I%^&%#Cv=J7`SF9_In1^^w)6Qv=8sgwzGt$@9)lDNRX%O<xAOCbsi_?7Mr^*u}wiaHpM>HRSHIai
-4FuF?^AQIIO_61>c%%DMJg@>T6iLu+SL&A<OoG^TPYrkd?!_r+apa4RYERQ{{}|~)Ecb_4=;4Rv`aNF
--{GMf{L>QfIKa5Q;$<lm<BBdQ^ls&uqkNvG=DY@owk-%lna+AmPD+Yor`XYSq_X2O!zSW*Cu5u9t)eC
-k`^X;Rv*!KOS$mJsurD(b*GZ{XM{p<2@Z~q}is_{JR*0=<H8(5SFIS|Rcm=apI6N@dKchEqe|huv9o|
-+bK)T6>%!5u`UBS?s_G4~ZNo-%J6lw=27jY|++O&2hwdaOX!Vd%u5z*2ZC4C--;nJ8|dnL5Fm$Q<n99
-CT}RNzjjh8H}>D<(r2HlxHN^S!x=iVX6mw_cgkFjgewO;UT&jqWR$gXYHQhxc6Q-q>An8#Ual>38`oG
-3=)=52i_)cwPP<>6~y2A-}Q>P{?1Dk|_iUs#u(BVtUIJUSCQ@1=94L-Bu(Uo=d$oXAQa(351uVyO7Un
-_ihd`ZcZdHA43xG2b)?^G*vu$ff6re*}k5C-^>l9)_;3@fI5PslLu*3FC)S4c*A5Wofu6dT+DTst}X|
-+sJgdpx`_>5nCTLDcBk*@O$cYvB(ta1dei6+yhLkZ_bikXV~%NaPs_FPA=EYpJ@z!m=t(dn0y@*Wel%
-_h8}@8>tVP-=!r)C0#*r#~?D8dLlM&Y)tj)kF1ioPBp>42S{r=WNA#iE`oc$mxW;^yj3kCj0^2|Iycl
-?t7&AGA{NqkhgXc)GS?(6?hO9KQH0000808trnO#8sh#WMu}0NV}#01*HH0B~t=FLq;dFJfVOVPSGEa
-Cwzi+m72d5PkPo5Lp<KcV(q%3KUqtMcXtj0t8JFw0$ua1XrRgb|q3FskNQ2?+mF6Wyxu(7gM9*T+duw
-XjKzRi`KT9Q%XeLC~XOQG^%PXr~ZAl>gbg^9E3ddugdf%%j>2P6<@7x$e$m6`EXBu<3KHiAwpV3j5wv
-Wdgdl=bybPSv|-xtmDT6_6@jNfJN&2K2FF2|>B!XI;HQi?mb`O3Z?#t13+OHZ@AAEs)6j?}ZLO$G&#!
-B%IZsF~OjEHlFxzruea;3(I40z8u8mOgjgnTYYUIn+QC5oOqv^J!R#C8EwOV1&xF)+kdg+1N_l_1*Dp
-?J2-vC=yF=NQj>@#CJo@&~7ACVWtM30|!<OsRYJuMxGnm39LteVNJ^dC%C@|qhU$L<{;Co6G3ccryWc
-sBiuG39V9Mjm&ZNV=<f3OM8p<OQHhNMR|B4X=s>v$FeLNr?F^(+3FZ?d{VMPo0y_(zb!%_)sJS?`_gS
-3<#Lt9j@MxKhCyPlKikE-=^QE-zDUA`kLg58yQ(rvS&_O!woGoJJehPh&7Q)(o%5EbXJOtRe`jR{2+{
-l^i>UcY%K@^ZcF&7Q66Qiiz`8tw~foc4@EkN5e0#qGi!Amf)e65F$DsPkqH8UPk1Ap@TdG_xy<8z1aW
-`ZT)%bc-{r+2SLl|uU8X9PF$*9J?0NCx#c+Om@|9om4zvz=Mp&iKg!vC(1;z!BIX6~FCvcFwC>L7^1!
-MzG`>vAKPdT3BXzMLR2twg)qtR)!Ic;UbvZuHgu?aJvOp0|0zC%Jyyx?7*acor1=AH+AsM!;T1na@uj
-L9xuL|Bq3t$Ajv^F*3&FQcx}$-ePT%-5}?nW}5%ax=KvUw=qQcFcFZcgaM+>@lS}Qe$(~+TE|LGJMot
-Kq9K@!h+7$F?Itg%u(2^>`;MubXA-{zMrXT(6UMK&OPx0B6qEG0>uO>+9qd~PgH!h^ro#U1jP1J^g!;
-ydyA^nqh&${ssib~TYx>M2&xvFI0aHX0TU1|qBm-V%ll}HZ54<QGp=sbV0R`l01IdWdp%j3O+?oCKHT
-AuwlC`WqWCDZ*!csUDtn?qDaOm`OhQo?72?NPDrBMJ83Lm>r~!r?0oZ{@YlF43HqjicsB=aP)XqPKL)
-sa>neuG@tD?GTxQG>a+q*EJ;IJo#7;vL#495*Al`X`{HH*JKzVAl?D{x|HY$O;890z{G>89!Z%a`z#<
-*+c=MeHrizpGFLVrneY7OSj`BQHOiPmykQxQoD5+)T!p!}2Ew{WH(6j|2E<`cj!j8qpC!sn42_FUfgB
-EMN>*LULFao!AsoEi6(@d<j5g+qoZbT#F{2CLTqdP)-~<ydx4-L45M>$pRGp6Tz^=g<xR3(A&kk(>nz
-Gw7}-W+Ni-ybOt#0uO1e8`}(B9P>c<xxu2ym9<S&K(iiNU{>Bxf95XUp<{wv&Y3}>ZbR7Ug?^*!CME^
-blR{8%RG1%&LOc1f(LL?`~8l8c`pIQNB2U+a<yTJCgXt~Qy*yR_-G~@-hJ!HOY!(+@AnA1ufp@KJ)!i
-3tpzr<8$#!#1&#PGv`Hd_4ydquy{qdzIq@g3zmU`1Q#X|Fc>Z$@-wtwu1@i(xjT^lG@HwfS*vZa~Kl+
-BVE1ho&SHn9M8-+NB>c&;I|*R}6Gm{eG&B><pW<F>UP^ukN~mbsM+#n!)-I?uebO4nFYL3I3d=x?9w{
-wz*mT3s6e~1QY-O00;n48F5S~zTPkZ4FCYWD*ylv0001RX>c!gV{<QOX>=}dd6imikKDEq{(irLxWiS
-Fy{ogEwm=uS!j9|21%f1q)1<}vpl~Hh%bX<2qI7%PqW`@!e32-LyLY}1ww4+WhcnN-k;+?9ktE6cu5V
-eA5MDK+?FijTQT826^zVxcGhT|K;B{etcC2c0UNZYz$he{1{^BA>wheFMR8%lx*-Bb5ML)b}k11<9E^
-29MzNXnbQB}0gMylk2)tP8x$sglNJTMveZCUc2ozu`(GD0QM!-@L+{OK+G+%wrZ49v)qMMKkjiYka7S
-Svy9g$U{)F>f7B^c^pUO=es+B|Rpntrcmju4RtA59vS%k1O(vX7*0hT`S6qiwlqv=JSr+PIesIaU|&L
-QzYgM@IiC37D$X;<AQbHsj)CgYA{xkL_n67R7&zK@4~4h(dL4{9})tOpx|Ag1~T5-v3MA4StAlVoR*?
-ydR(S^Rxt^qq56$~iq%T}_j2ELjr%O^4=MNd(IH281uMk~L|4+V91zZH-X%#WS(&d;Be&m!1S|4_wgq
-VT#f$p`KEaL#A+E@;qP>@dwxX{yLTf@B&>^ckR0Y}fg+mIA8A0(jH#fBHcv`Z!01&fSw8f2nLSL}3S*
-KcssGpnHfBMUxU%iS3c05N3H^c8yO)FBft`zBtXygD&+vAGlEiEb(Oc`5QH-v|1!U4EyCNV%+9(cD81
-EsBKx{{&=ZE;#A5-h)0#=-Trn{~<R5Fg`Gb}eth;3kNoyT$yP9gu2b)N}k_da0()h|v8bazzj+AtLXr
-7?4)dl!d{kPlyVT(3N&EXE_23X-yhW3B$Se&Hfe!h?dM~-mx}m${w|743P6W3xk(IL|&5DCzjWw+s!!
-t4yYZWyqh<YZpT@hyJv{K@@Qokl6?aK0WiNJ=sr<AcoRsobfMAfAetnAZyOAi^EqJq<^4|||MA23$&c
-Us%Y+YNgK97k*^yhdcHH)LlIrvjZUgf&fGx_sI3%*mMBm+hLrcjf?qmpK*@1Iv>^rN^9AI41JZ%y66Z
-#SH43;`IJqVl#0m>jbZz0WmMH(TwPI@9I-JTJ5?>m-K*)wM<3?2Y6;s9v@a;YSb@iG2SY{p`+3#bG5a
-Fcx?W=UuIcdVf4(S&Yt*z<HxXnCMVNn}OK5;8!y$M9woP3+Nr5C`$^g4f}oN(Dj~j<%bx?nZ653`&W5
-ng;D82OI1W^P7ps08Wbfa13#IdHMcP7a5=*47iv;Ky9Ku5~@ehQ97X>GYAm8R!jzNz+zyBl}ZA633g(
-Ombkjl@Hq_DS{Mu#kbc)rj8K^CYs~tgWih_(+T&&(Vr$V20yu&8#usHRol3yw@g)YVY2=^de!*uOfYY
-b<0R1&Uf<59!)>QqQtAE!`3w0Nc+jZ`i9>4IQ6-f`-?Q+`?y#O_{t?L@bQPN;(B^w0sheYT~&lnv>R?
-2Sb(Y~BQ;2q9Y1_lzYplIm8O>)sPVt0-}zy!-`Njrvsh9O#vet<5rYiXTgzNzRDf+5R@XgL%<H(0n)q
-O~-l|0e}ysn-Aa;q7bdt(pzY#TC%#IaUa<E4bqhT5f407zRa9b=!eTav7omoLH;nL2aSW8R@QNK(3LK
-8`2y~UXRO6t#Sn~D$!Yyrxw$Wx*eu&N0xVPfP=-JT7@cLl}aC=7Na0c)K4rqUuzyrb%h#3W~re*T|)o
-zo#@L<c^xKI5M(MsaE<jMl&^gS^ARBx@8V01z6rO;C#eI>IiTI7_9Tvn=Xcl-wM@Y%?ORn%%00DV3?L
-EXKMJ5b=qF}aLyeAN?*R6e30mmD%hE>n24b~x3X1$=@-t?Kictk;@C`bLgjqrHs2S`|xf99?zVUP0vz
-UAoI?429$1Cu%@(8I3{()!os?pU7%4<k;?2)Ewd-9ZTC?yYWVPT=2!cEqWVz;mEoZy15)BVH<swnYW!
-c#&(9iH<7qonqfSUUk0n}OnWr^BH3({qeWAW{MMbAZK~BZSLjmR*_*RGG+rSBb1I*(4<37B#^$aCSw$
-QT0X6KqY`uS{D%NR9C4}WKO|yCL*|@WH5kRtVQH+x3erBypI1GznW*VE3+U*TMQC3%T#fL;6of80W;u
-w=-cP>+BQ&(i~?2OLY{%w0?SbG1V1mAEAR`3ZZ4T}mIJLj$O=QU3BeD+4PhI#O%)ZDP+Cu_OUE3uq&U
-8?;eVM87cp%Lc8|?Z1ul;U)Xuan_q5HP2IruejR77Rk@<zd6}t}NfCF3yIMzwstO#SMm~gJ!b2?QCWb
-xh{uV4x#A(-`AM)M51#LtXzFtK-Vc9CG=P1?*(RT}z()5>KPd2=7HbFl<T@U9e?5@B!GlBhif4tv9KH
-92Y020EAad~r=3)mWcY3m}_2Cyt#m)l#b`T;N10xL|fge!zT_VOARozo`SlhVvZam5zHK-oO3(@^C{}
->5eQmz@3Y(XVv7T!oMf;!pWJ|CH)jr-GH-VcciKYJXiv^^SSLH`jf6}-0^ICrmJJ}&!4`tb+K-5O~uL
-T6slry9hSw@q>rzquc4m^>Za!P8U$Lmtbj&sOx2&__{ArcsAt{GiB4wNhDR3jq`TUZ*Ps%o;lc7gG5Z
->5AvQY{t=+dOlNG_DH#8N7Q`anu4&rMRy#g$#b}gg#ZiEF=ccyLGVTtYQJ4Xr1jzAylQ?eNjhN|o&7)
-%YCIPv_9S%GS;>I$?ZI;i*f=CsL_w9b-#sq?-pb%%8h!~f>2%piRB4LAY9IMf{i27x?MW*vG)b;bhqh
-zn*Ax9L0o;S_EOFq_ZO>HmAS0#GIdC<09{Zxt{B?-WGNuJEt{NJcQM$m?k|IigZ*t7LeqsY^|Bi8?m;
-8v1(okZ)+D@)_=Pd1L$p4`t^Zwbs9w<DSvX%MT3q#mvyyK3-ZgUUq<uw@S$z&l5DE>hHk&_0b(>9$Gs
-!v8N$2G~v{96vU<q$HiACiHr`<6QN?J6p`8S75TVV&2`3_mZew<{-)zWE`KAE*C}AI3t*$wju*Y?<t%
-KR^SycN=bVU)ke~2#D4vm(D%zksW50~$d@e~iII`|^Wn_+w&_sK64KdAA7|Z_qzlq<uZp0nw$6(_TN^
-du}cVBq#G*1jCOzW$r20rkp&ZXzBw3$|_>iFgaD!zcfb*!hjTR43IYvX1!&MIA+8OCi;a~{4ATT6Hcy
-tRoI{{7(G1u8W4yNm;>@i_T8c+!V6B@jF?br*){g4U{U;^t^iZwhltO<Ezk37D?*>6GST2!@x~b?c*P
-Zv*FKOQ?f*w+7nh<&-Cr$`H^Ut)r&RJw6zf?qq1>o7r@f+ET0Q0n2-337pgooAymHgs{Ij4x+ivtdb{
-3q>1O~d>}aNdC4aGV2@mOGCUz@V3!D@c?Sl)-`S-U(fHmjU@pMJW%f2o9_QRn7g^%_iu}p~0A1HoY*Q
-ed_04cxC~%Xu_=XbZ2)$}WFo%K3J*-fpn0OXS9XE6SycPfEXRd=AV2B*N3K~-Ay;}|f)3PL&epco}-O
-l1nMwfnQPt5MSubht<*Pq1OtMg90^i2$J=A)I+;@2B0POWIhEHYqu)rpVjvs~xtu1(d&Hz)>gXzeKq#
-|G7#PeJnOS&9dJ#=Vg^F2#Yh;pCJRuV6Rx{=;xqA6Epbd2Pgaic%Cw(~950cs97Bh%t^U4~T4?xmI<i
-+cP=BJgr7gi!td<e2v0q6#H7fxt3QT&#k^i330uZ%Wt*Vg>$0jqzSw3GJkj#?NZG5_nEu|(f;6)+@fy
-Xfn|yMdC{M%<FeVUx|?=>R2N!M^2n~=VW%#k_P=K&=p}34?1k)byBqv<qd<Wl(x~tOK~e5EH#fm}a{u
-$5Vzp;LnW=l~9=~}iG1?S+j6z3(BOgD0&_AT8SjX|}o=h-V2cusdM0>9nqC~G`K6oG@i;Ea9eE0n>ip
-kf|ULBaetfQ6&0?oh)lOuk*L_RRANDoZ4#}8PW>Wc{d1qMX4O!sg`pS;tTeyAG%^#m9(KouyM+H!C4V
-Gfm`y^g3)X*LU5&)JLqy2Ct<AFC+;8b58qg{LviJu;ntk>Ni+HM8`$EaOUsJFFF)J5PW9dY+>MHFJK4
-;T|}hthr_-$P=j>5o=g3vbUCI^yMecB?jS8Gg@F>bK%D>`UzaK2edt~;Z9-NWjnQ%(@$wNyis4#fj{g
-;Ht5BC1ty2Y7N(^<r548uKo!Ny$>;MDUg8boi*FaOECaR>u}>AC&#F27Iyn8eEK#2^N#G?l?kN=+yA6
-0zi<Sl68(fuQMwF}1O`UH{y(jJ&+x10wnGR)6#vp=J>d+;}x(4q+>x{Lk;x}eEQQ@e+OB*W-=Mdn5@{
-;aKcInvLw*#e>i;IhgRDur|9Iqn~1<}R-0Z>Z=1QY-O00;n48F5T`Vrm^>1ONb#4FCWX0001RX>c!gV
-{<QUWpZP6a%o{~E^v9ZS6hqhHVl5xuP|GNB%DlWUl#^imQ(uBo)#ARvJA#2aT1?(>>S&f*`@TqS8{I7
-WcJcqV8C%?>67$X(o{ybgwm>az2TG+(RSK6!aiFqd&lYU9!2B6)O9UXJ-uo>tsHN=N=P0>6>986m-kL
-cJ1H!M?Ie4q9dk`aOzRBii|DDC1!0+y-?_0ut2?cn(Q=V1^;t>H%1IctQKxBd0wH?hs?;X8;wf+SiO;
-GFttwG>%vf%sC_-PjA&1GSyyos_zn4&|SPS7uL9CF>TJj4wMQ;R?$r@XF8xeR=95lsE9sBoEm}x7Y_6
-+YdopuYU6(9C((eM^f9!P@cGt}~-ajpxNc3fNAOe@EnDE3|sV0xpxBK!$mO)QsH296aVq}2!#pPQSTk
-55C!8cu$yJt`}lHqV3&n-EOmv|pCoI-$IdSs7@UwPDsN_zKu30_5#uiR&cZ4_FW{q-75%r(=jN?^VZ&
-$7E8me0An|!8?naUeQ9gEmLK(`ijp(%uLaU6OR|Cj~TIzK2z&T-Mhn&Oj@3i;#?lKCM$4K$_ujtNdtg
-$knLHxq8WpXG0HG#Kx=-Yx<lhO2)WPuz&(hQwmGsk|DuIThO^$kkug5GrU-&HpA6}n-?NI}`HkQFM)F
-GhhJ(4`tV{wh=`|tCT@oWe&p2?F^%7GE{;lO91P#$0SD{Kca*k8N?5K_+BW^e88f~48a6Abl7YqEU;G
-HAMulFB~(I#6v|4HBT0>kV-dV6qSZD+XM`I#97cY8~j_)hn-Bucw6oy!#u?*v?goxO!$Jmwe-Wh-R?X
-kgeI%zcRau4E2*8t=cxNAe*g%|K5iML@RUz=~|wd3MEE*GoB>3YGtt`1EJTfXWNL0Mc|TfW6)nR9LLl
-6t)7wiV9^eF5hAm4nM%_ar1rbDOgTP0*Qh>fu$L;mBwU;@2}+M!osWS;}EO&1ZsBiNQ3&AT(1LJs4Bf
-mQK2e*ji1mVfVrfp!JnNSm>6dpLA1Ep42*6+hP~LsPG4d)K36z0G%uvcUg;HK#sHww<C|*!Hq}P@yxi
-TebsgU57Y{MEg`uAK-h{<2pDNvP9f}t^$ZR^d&WLW!WpADeOHm5BJ{6M$i|CpH1K?ncNmhl{a2U%JO3
-j8=!I&8Tazvn_8Lk$|cZ3IuES#`IezE&W$kO2t(D3KK4$tV&C93OQ(T3UPU9Ne_f9{&nCI3Hs^RU*wS
-yRB5ue~rZ^Qmc2gB$6t`iSJYD4xkI7LpG87z*c7pK%%hbj&#HYz<D8w{dz|{k&qFBx8T`I=$4&x~84c
-U!ccM^C|+&aUb7NdnW}93VVp;cj?2o$7@h74f^POg39q`2Dc>G`aJ53clP_8{RW^NpgKa)_v1*mQJrn
-P3a-*n%umB$|Bg-zBk&LM%$_Yw9=3-7;jBC!x1`i6cBEx6Q-rhf2-s68ir{Y!3}iKg6|yx?9%=L!P)h
->@6aWAK2mnzTaZGMBl|dj2004$0000#L003}la4&Xab1!psVs>S6b7^mGE^v9(T5WIKxDo!ozk;w~NI
-LH-af_nOBEHKt$Q=Tt*CIu)1=d@EUU64COQJ$jyLOBI_s$GOiF)xm{Zh0-5NOHaa5$WK=0)BsS+XSAH
->Ob{NmyRiQW?hYwJaJV68n3xXvYhAIONsA{gm3hDY01WkyoA9adH$@DpjoW$GDV7q2opsMSkzN*Ia4A
-xMp@Zq2J#6yh_ERBmR_E5B*eQ@<O{QRT?G4lBKz>3;qOrOg18oTZ!EgWL=pAMtj2JuHy)=OZKx+I+xX
-ZSs5jZ#UjziDtRo61jJ30V7GAEcqhv`FGLu?;O#}Y`TNE8I=ToVORdClN(nDzZj4A*Fb!+&Qg6i^Zx#
-II^QScn<Lk&{oTG3vw4d9l;ex!{OA>xgBo*B0Zyd|9MBU1H(cZ%Fw_*HE^!63L!K%dql`Rxdwpx!5!h
-E8!Fi9$2f`uX3uHag;KR5SBtLbp4@o2qZ@E|>~3P6^C2GU%)vA7#lqLzsp-eqF<ARA++H2f@uhKZ1vE
-Q!~()|q?FjH&&1-O&I!NJ_hkJ%eMAIzlaq{Sr>M;|Any1;yv$;^MOaAF4D9K^;rxv>GkhDHEW+ducMp
-;YAw-s?o5bTMg<EV11P|9q(8nT^$Cmf+z-e(x=>Hw13>{0XW}v9PkN#&r?*A*cqvw*6d0L?5bnfk%E5
-e#(-9cnQE#84U<=CIN-Jk@WerX+U;^MuQPc{v`K;8?GL=rVmK`xjpB)@j=2KU`e*Rz`=5Rc)+~4*{Hr
-I7y0?;>T?R6Fz7T7{)h-LIygg~YCq>bU^<YnHe({N`3N$=C4k_q8uW)H9j8J7>2?qYf<etH%%-IgAZ8
-=%$LrmD+|Bx=46DAe+%^?i_Xq9d<ZrILBaW5<orfYUr;ihbSQhXFy75hn60Cf0&Hw#(<g^?QKgOW`h-
-bArAnrHOtfyaMCxo*4v4-J#o4ixN94AtBtgLuTaaTXUo5D5q-NDBy9I!6y>+>YW!8cDCI&?c{lNyp6x
-3I{FDdl8tdw;a7oN2r%Iu0`-e8gHb7r)XqJ77hdk?1VQaOE5qpcU;jEw^}DS4D8u3zK)J|rSV9lbK0*
-{O~(iE%nQe1G&DCbM5$vmhFCo2+URgbyY9L4f(c8d&{Y6Pnm-5>g3JzYp25i!;}s)@n8r-`bnwYmtG!
-e^!S?wh#1NC^kQv+qlN01EvMS*A(p02y0y_Fl{F@0ko1TQzqvLZPeDT=?*0_Q#yB=KWHQNkyx}7@H1e
-`sS#YnQtT9ZYCTXtsUw(wLuk#iGR2G5FxEVtf%O`UQh2K#;WR(9>&R^wgdz2SM~?cy>1AMhG5XIQ)*0
-nagMQ4f<B7J{*Mn0cimjNb6OTO;5e&vFR-?MN`P{lr6+aQ?!VKC5UJ_{rgCP#<?d0I<N``~8Fz_ni7j
-zwHYlf$sENIG8b?E+2%nZuRA>Ef(+IIhV7j9MzVJS|DQWo{|E}65n_MEXX1N55`nOb&A6QY=j?506w@
-hEN{qEVt--`g&58J`6&eMAa~BIMvPYms{my>zxa~<@bPbd_^<|0E(*drc9QA=GuMi72%@_Oeh@4J=vy
-H-3{{wdemCLtAjlF|LHvsZcl5W7;WBd*!d$djuWq&x)Mh8B42HKjHS(VAISmoTE!|TL?^70iG<Skrf?
-3=|o7dZM#HTD^U=7YK&j$ML-BtpmrIJ79WmEQkjdsF8$$O}xpa2Ftf#2+qL&-c%)qSRyAeIqpX7~e;Q
-t_%`pV~+XWo~QpWJKtxKC0P`Z`td`z*_IQrrKG7_giV;W+CRDc=7ODuywfNN-?xcw0K}L)i{oB)?3(l
-vwhZH?a?X;d@C&&ZjNZuR6AP?77$}~bC0|hW9BXH4y&S}H35%Y=wy%QcliWaraisC5-_4A5288$8>J&
-X>)C{)btnkLO_8z_o=jC!f9c$Ie7G*c7hd2>&=&g&=}4!D7Gr5~6rI6c;#5AQNNfPJdjS?grAd-&eiU
-T8O2VmOZseb>I@)z$Nc}G;Ke#fsRCQa-Xy-pN3~Cn{tRX0aMytbw%XWVBLte9d2nL?TgZG8*XRpm@?C
-*|b=<`m;sCn-Ymn@S8l0p&(>qpyWV0;gC4<n0g^Wp2(OKs0#{puCWLel8V>t`lS4Pe;kvDP@FXOb1Tg
-ps}jyGJn6x4mR)Y6Nh}{&o8G4dxl+(?1V(m+T{yb8x}BZEn!j$OiM}oN$D<PHU6tCEX)0WOdMaDm*>}
-VR8M09+HvaN!U<6K-TC2joTkE!Q=%J?xAde9YCAK46DA;q4Gl)$Jy-^UQZdo-kfg_kisp))=;}e5RG#
-ruFcu4h^U`;8??~#OpO4S+^@MEZZd~Ce-#00P;oRNz)jF$TUU}Rw=P6j|D=s5sRo1eXoeN4n9O*r)c!
-E%+X47oyeIHO1=E#vmyO}4ue2a%3=vCH3XB)?tN;WsVREYgd83PI#)!}0+NUJZWMmTcy}^0d?XC-xht
-6##WY79f*LoI@JJBYiZ3p^e1wLIAwBmzOQuQLah=Z0h4rjfQz8KP`m9@`!WY|=tOUP%3MA*FF&j33&9
-3;bnh^HP}QBp@f+L!6y-a^s*TdLN{LNXV2I+4jz7c=~!(D6?b;_v_pe-}hx2D9P~=-zxK-OcNX$G4&s
-pun)?b*PQ9c_pO$0x~Mg!zP+{)!pOk-CYGthSrygf(XHk;2$aoOo*vGb-oHGnL%^6<k!RK2_}b?>n5*
-Em~P%|BkO0BprNz~CvcHz#J**37-WkKsjw*Wb6^Va6Airm?y)S!v1QO)?7tMa-Xb!Y&7@|!izGkKA#e
-Ga7mXmx53!+L5L&<r1NeX(*X&ARWjy6R*AT_=R;zt;3ZnM2iYvRNR(&O^&-<nm6EZ@mx5t}mZ(P0@HB
-*etc*2AR6#8P5-aTEjK3J{rqRuvl@OhzokIxh+t%B!14!J9bk*M#Ij@LUq&q{P&`J>NR{Vm{*6MjR#u
-pm1{*6FplR0yTC9rw+405v!_X~Fb~rjE`Sf~9;t2{H5emsUGC=a&ZJ9hSR;HpEOsLF*p1w`P(GIsp(u
-j)un@%h!iNH`X@>vL~C1EBOlq;8FFDRcAZnzQs`?j^mWyM1Ao;t+@w%xvtWlO5X}dx$KpGccm|Z|E>M
-X72>%_jmwENUT4Sl!`x@bms^rhfPY_{_>;y@bWLdkRJ&Y5?7}`X0ghj(w{ntO*{$D!<(Yg}3P`uoPMB
-xAhJK>m_7XVMMUXg2O8ae84jL^e%CBn>?j%+EE@*kCvB$xYy+Sf9rg*98LnQtNP=yrH10$1x2OcuEFZ
-e-wTrgbVA~XU>!Q`RJ|6$wT?I(<Q;ZfVqE`w^Lw&>x1^2a|5uy!%%mC`q?TBJ!O3|Ijy8h+<QPO+VHX
-7w(JHmjShFM{JT5CYMv&c)7t6`pdnwcK(n!qU!S>eIe{X#|!v^gd}xc}JN)bW?T5ZpE2cIj&qR7G48t
-+KRSzGHxvo``DXcr2-<iE;q!b5pAnL_3}NzrWw}|l~t&gy(tC*+l9dPrzbG^YV|Ac^N6EeGH18=rv-6
-8tYSAYBXMUFYID<r2sS$3QKQq&50MQ$3|34{=Jha8AeS|9!4)&%VNP-+bv)OEZliw5TtD+!PNPqd)77
-&py|2UWb~<pFz3Xc-j8%7S%Z`5Q7&!K4891V#7soQ_J1cGp81r$5ExQ9mhC!zzTKpSOO9KQH0000809
-6@rOsjD;R}lgL00#vC03!eZ0B~t=EjcbQE;24;X>)WfX>Mk3FGNLCLsCglR7p=xE^>2pl~hZQ(=ZUe`
-&W#_0SRs6dqqL0Jk(o-mUHVmQ^(+VB72h3f6q8+Nf(u6>8Z+mkD1S7cfM1r)k>+y24TNFZ$CgnOKpp>
-##+5?n7h2xx-<5NaXz}LJ99&^qU1D29Smb;ZTplkvVOPUDJBYVqy#=@HX#TJwj&8970i`VZ(zTf>W00
-PW+&f?M`tQe#Xum3fO^)d8g4`J5rvOrd+C&)k+>k&jfoBexqlf&Jmp)9FP@wJ09$E$rn>QCB{}J$P^2
-#KP0l^SW0FD3+|MzzFW7t`e#@AkHGYgM_{<ZxP!siCt{jmII4X=^^mGu5!6)ubz&Kn(!Qp>}I<u(p!X
-F#id|fZ$RVjc3`#B*-s<D!CQJ<@Y_7tI1Re^6MuH_Q0)BDy{x$zk4T+$Y%*TZ-Kd2k8<mTZzko*4yly
-J{mv2rrT6WCow-oLiF_(_JeePw0j9S0D3IAJcUMo+)YTfAju2kmz6W(-tK9j+W;x8#yXU=ex!UP0bC~
-Wb@SJM9w4eU}}f@{eUUUEm%!^d_UBC8?V$_4i4xDYl?MmSuLLal=>vvXNo8{T7oo|%WC-u(h`U!T-te
-^!HU$uWXumRZZ~kb3DVgE*v7C*M6LWcv3|0mS<rw#I}yPenB@5gfli~r^eFw&<9=6-LGA7p=YdbB)9t
-|5$4cM}Ixg%4*Rr#}08mQ<1QY-O00;n88F5Us7nsB<0000)0000a0001RX>ct$E-)@KE@WwQbS-IaW^
-XTLZgg^aUvO_}Zgg`lba-@&PR`FO&d*7WFHSDXEGQ|C<toT5P_R`1l2*BinRy_tF*;w*3|WK=08mQ<1
-QY-O00;n88F5ViiglWR0ssIV1^@sd0001RX>ct$E-)@KE@WwQbS-IaW^XTTWprU=VRT_GYIARHwN&44
-6EO__SHeAQ)0TEE15s%cgCS9AV-@WinoilBcMZ!WAwSwxQ~!7D<O&_);UvUU?wrs5?9X<di%JRa<%0z
-0iwXNyT)_&Iu`TGp=0Sw$*<`}b*a@3CQ^zVuqX&3#ub?<)#Z(8-HPq}f))I6DgzjQcNQ7L=3baobxAQ
-5xwAPswdf@-fbiul7LN1Jz71`(JA*_W1wx12!KSZf&wlGGe$e2;%MB7T;uxp{4D4Ikw+k~aj^fl@U<8
-S%`-}VEJd%}2c;OoA?vwpy7YZZ{Nf?AsIW}D&;o#6?a>d{Ig@m$#C!z<IaLf6^0cEXkwA`H$!0!fP}9
-g|i_O*!EA_-{58d*8a<l09?O5QJ2j0;2~}g*2AW1t3->zl1zlNf)9}pjYo3XQK7IF{V*KX%dkZEhSbg
-mcWpT)h}k!<+KYCF_<g1RCR5tNP3jynp3F3S58_Ih|pJ`<{!UKXN&3W7w&v0QsT~hhbolOb!mS#nRpq
-3^^?H>$+_KF!KE3zs1=^9ap703q-2@t{68zY&0TaNFLeMPa1v5;8_?iHz^c*ZzLq|e>m`6<2SYv{^5G
-!`eT2>0xH@}-@S9R<AB0kLNj@>iyn`M>v|+cA&@^=XZcd_9-HIb2Zae{6>~k%GC|B5!PTdh7?l+Fgr%
-u6-C>{7Rt422$=eV!Oug=GO$dA%_+MOeQlzgHtcYfXUkQU^-Q(`Z2s<AcIV^Y%rJ!nO46M|EXsVnry4
-ld45`S|c<k=c5R(%q#=@)0-1ZFb{_dv(bi(EjANlH_6!#<5ORTGDPYt*9PxRXryLV*I0!|CjV$C*Gm3
-qhk9LP)h>@6aWAK2mn<XaZJY_m%;`B000C4001EX003}la4k75FfKAKWNCABEop9MZ!dIja9?a?c4cf
-Xba-?t$SmLj08mQ<1QY-O00;n88F5VZ-O|2a0001P0000P0001RX>ct$E-)@KE@WwQbS-IaW^XT7NJT
-|V3(rVR&Cv}@Eh^5;&$Ci6)HC36Pt8j$N-W7QvQkJ&$t*63F9)en&@j+5HqbNB<O<5qFVXcZ)(t2vO3
-lekvQj81Doy1INldp=D5x~j&CAbA)lJN+gozj<M7RJ@O9KQH00008096@rO!~i<AEg5T0Qm_302}}S0
-B~t=EjcbQE;24;X>)WfX>Mk3FHJ>MK}11RL6uh9a@#f#eaBa9rw?vDCg@9&PT0t;E2pU@iKB^~_R)sP
-6^Vu<PynRLzt4i8M9EQFNiX7X&)GW;_#U0egcH%9XslFq0_Xgc-G~Yk&{DJY>zDkLpR?Phs)XqhxGNC
-m-TVp+rmCv2&M*U~R0#`ZK-SiYvXpgBAXlgwv`9aT94%*ms0t%Z&j}RHX`93`1>(BXf=d;%tA+?BL?8
-oX*kY+P<uRBdtb{Bnz20-wO5++)V%`3l8`WsbbEWbUIpxLP$rNi#q2AB#*jwzD%49YH6t=q`l7viJ*E
-m^Pu;?1?i?D!s4x?u_FNLGRssujWyuJDG*A1JN!dkhINU2_j6sZdiZk=$Ag(QLJ5W(E2tVtbpFebxei
-Cer`?Ly<OnoMGyqNiPt^=@K^N<8Aj?F_E8HmW6R($}^!Z&B`)mZ=Bas)bt$gIkHx``;Q_W(1>xw}_N=
-ZbVi2`Mnc$-q5r>ewZaaoga$lFAiq>bRgs6P&_}J@$6v6^8*>PN|)#dB>dI{+q`2R@t;N-v{67Na5<r
-#o_sgCpmTZL|DO&2=lqyaoK|K8fBmmBA_0fiQOs|?U%S7i!_XfsGW-naQ81an(EvPpiX6`f{BSur<7c
-No?nASwk=l7{pk3_6s#N-UADlMm57tg7^QtzPOc?V5^YB!|*sHZD^@>Ft9)yM~lgC)cqy*$EP8(xrO7
-Z2xJ=;t7*fBiJf<27()h_v?0Jay3c=W{!SCu{vdAL?-Gj7LD7Xxxy(0<Wr&;Kt_jZ3>3;*E4g^9Xaln
-rmv_zx0|Kdk@~#0H0agAlw-$)YtuAj97ZC9f+SS8t_u?X(bIVa6R>@j)yn#SBk%C3buzj(juaZCGh)1
-W*?^seD4iFjs4vq)+$3zX77EpdfGOEG0s6&{ze<GG+E``781+M`fd|b#%(_U+vW@a5+_WKZsQUp$mXi
-`6u+!{xTh^|r5*cR3G2}83`OLCj#9abBle9Wv~ICeCQjv=_sxRH{|X<rz^K15bz_zVjY^qrXJCUOa|L
-E9wIRzuwmtDtWI4vawBg%i683m^Q+I7VV^bO&s0B<_?XPDRZT}d1O};x-Bb{h!q)5GX&@;H<qhv_u$U
-;i49)(4F0{wP_^Cy8aJAt$ijv1vYdKPuIwW5~LBu|>0^dC+nA7!bQeSjcJPjY;?=Y6B@cNxcmm&@g5!
-7H&Mc%&9l8sIVQ>=#f=0|XQR000O8RT*(i5fKKgU@-sym|_3`8UO$QaA|NYIW90RGA?9kb960fZf0*U
-Qbj{gQbe_!$&#Z;x1jfJ)^8&H%{(l6!6-n0009zgFy?s>g8)5!qpXZ9g(4#FUEE$&WkhA!cO3WQXY%9
-T<=y}Byu8Ur&-+ie?uN{VQ0)I&gG5tufe{xOzhZDMNLYeNM>^AqTsz;|DZRFdSA)I5?Ld%3!2kWfx?i
-N)&znyq8#`uukz+Z&8^O@e3=UKL!s0y;xk-kn5BCO9ii>-Fa66Ph{^11v5QlAD`%UzMGR>-X<3UI4X$
-i*`I^JgYP^Yzu=B>b09vk!Voy=qJOg#q$0{_A~zaQfMg+(2eQ_RDO*&BVE-vPEZ^&raS3&85rvY`)*7
-fBLLM!*gP5Dfi?71mMPjd|M)FDyc0LLMrQ6c2@bW8-*x*~9E0NO{te1rJ>&CVM>QG@R2Nh#~mzkBr*6
-sapT_3q4!%)x!|^^GS`!?LQ6`t}N=qY>5=$D5il@A3GR@g0?#t0#W!MQoMxmmr>F8o3NK=c+{X^4~Y^
-~7QG(VCrVRp$6i-tLv#gK@1$$FBS7f)3g%4|FE11sv$B!m+z`6WIDJd>zSQ(^hEgWwX816bvT>$JlvY
-=92a_cFd(Nvi^xp?W_L5PhZNp$X13eC`*m!t-^;?(pM&1(z1)}xrVjF4D?obTE{vma7hd}7)r?03RT*
-e`iV5%@Yrh_A92Qjek13_XefK3wB9Qjo8<}gN(ZS_dv_o#-^AE&_!+bDje@z}&3utR|x>QR?0wuuN_K
-i)(Tvxfb+r-51HJw#W!OSl8k-{YFIIIdnG`uS2H258Fn4Pq&m8jvgp^A#qX)#KEp_9M6qi%1?TN#B+Z
-_)t#o9yd|jf42uOzJHeBzCE8M&$=V)ky@%ln;kiUbSw(?#SFZrkXR(CwL>uc4d{1Wl=rWnxhJiY=&l&
-#XN+z;<UYXF2J=u4aj>=(nmZ1S3Xuyr>Fgi~#)!|rC?CeYeceI`+fFmtg}2CAShGWe{mB5JWU;SJavA
-nB1I`pd_L))cU;;+S&%C_zqo|LE*CEb%9o#|=@8_8_t0`;<YMc1T+pEW`cA`Udkp#cD+G~^U2mr*f&&
-alq;y#X|JRD!3$Z_DO5VHv}6^s)jSkoT4Gkp(%uBOF4?gHWcN>YW6&pQMlk<ZL-ecFz^NneQgoti8=$
-gpv-j=BMf4~g(d_E@v%eXLQ19fnIO0;Ny1+e{)L4t{3#@&2EmUYJ@Kxd;#eZKe#7R8z<ZP%(80v}+EI
-{BWmc3O#Zte~6tOj>GT3v0p!rv4oSPN>ER!fomvAPDbNq0VBbUVYJL*OD9-B^?rePjoXnV4t)j=`KuA
-2uq={XyAa{gOXE0jN%~>kXQLOdEl?%%L$4G_4v(up>|kKqZ=YeIA7-05Z#MO*zI8U*%2y8{5{qRTCR8
--@l(bl0ip~xyn{!@dRn!1fvOcU05B&|k+2<FqqAhOXMv#1DA9g>W=oOwRupdOonKUB4%kFvBi%oF38T
-oBf{)OyEem8#dAclW%R)g9b6es~y!(sU0!8yD}PlzKRoNnFqn|bt6JXf~u3H)tNe*N--UdC!~@4KEno
-=4KY^Q^(p<k|}wcfZ|(a*rzDoe~>2K+7FY{%zQs6Yc!h%>XIpX%#`KI(VtnCDRJ;EnTmUijhlsZS1dC
-8W?&6nG0asw0}qc`m_2pDRIRPa_Bo0h&G#<HEN-`=p7c9me+>dVPxZj91M+FJlbu>0SNhvfF!Ttx!>&
-ACkft>2+w1Ey|FM{gQ%7aI?-2Mi}A^|u!Cb=+~w;kGDa%yAQT4wA|Q*Welu!$_-cYKqtx5OdMP@MytG
-!%+L7tHhDtLJ)U~_O*E^@VwF#?lRu@G6#@`~2+^_P->(X8oEUpeDdsgFR_D@Wz6xNvZf^b1qipI=yAS
-Unv!RRvVFcilAg8w=<$J;u2uzB%N<jPJ_<|BK7hrs*FohS)$8{^8agPF_qmD(YH-KD>N8NS=B)1|S-R
-k;g}CtI>Fdx$3*Anz?&dPE;WBCSS4-w?Lh><WyL|Fw+gGJEekfFIZ?g@f6mbhs^xA~`&kiuLIPN@n}q
-fH{3sOc^_`hs`9Q@ZW60Z!w!+$cHa-uIqeT$}_2yjGt8I$?@i*=K!dQkI_2Qq%&71I?!-u4tM0c)eYl
-*%#-}PS<=tO3R;hm+vfl&P6zRLoI;QUN&v4$tQ`Fyh$~GI-8S4|KVrWG(|mq%Mv$+@VZ`T>WQ{EvWLm
-l>ZnU*jsy=zjQAz-W!-m}#)%=a!reOQ&KV4k^ac2y7O=MwV=R4cY_5`dRR3(yAVsL2fkJeH2SQ(UWgt
-fUd90Z7W&G{g={U<A?>1=fHhI~aSoK9|si;o*p7E&0vT)CT;pZl3SsB0#0JK~F`Xa45Q$M5FW88md(t
-1Z5U{D}t*S4!4ygE18D1$u7OFn9J;5y$q<7OtW1D)<{5<SCl;@$Ci7dXFP|SRbuD81VoIr7S)2YUK4R
-5F8o#)blavE$sc|5jz-!(0AkYLhkxD__Q@kdJ%%{Z|P2p@ujbVeN2)--i{cOdhy{bM=(^;xR=4o4#ZL
-Xd-ShApK(|oOwaK8MF2dvmoo+(`$O9v*V_Ym=;x;31F7>d8&3f!@~J#9=ddDnTfX+L94`Wfcuf0t>b`
-sf7O)fHh`BMH!z&W{q?iVPg^?x&X@~2TjSGwk5sxfS$PUJdzkI_c;tTzFu4jqsi?v$|ATZpTL3uP*@Q
-`ryRCdI|z2?p6s>7J>Q1Cr|{zGr0Ee?7H`f<JO^}Ko2NZaW=EL_(zM+YIjvS+usUXUBu#+4Al;Y3oaZ
-eH<eO1A|@zc|)EBHnzeb~GPCc@D-vU~gwqTc<(^uJ{J_iCXDm-DK@S&s@crx4aboL2bg0M943*V!8;7
-=vU(Lpohk~%N{Y;2&LPm3%TWu<8;}p)R|1kc4HGL`aL^trux;%QF%Q_0qGB5BpqF!S1kcLWf#$=?Fe&
-AN%Ag7bWj~4w6=^D`$1XaA^fW6<$AMI(3xRYJW+}S1yQx?sm1HrBv2P3vJOLOw(8{^Zuuhm!xV4ip?;
-0ErfZd|cT;5jzKQNtr7|UYacQxOm_-N5Fd{i>TC9wC=6mQ*$`Mat@l~yJmXM+j5YI-D7P+nB2@n&@A=
-V}Ipg?Wxf)PbD!8x|(O|9S4m=|{0zZsN0eu(OOdWj#%K0YDm>Du}DNat*h-i@nHT<#H1J#7D+Jfk5L`
-N0PMLVp>ya^n?Kzb+R<2p(eRlGTwFX!xKKXAN0%A#Th%AyQ9UHZzDL?>75i_Bg){TW!J18cqBurBPcn
-EehA<l|fs{P#?ys1oYw`MX&-fh1%>O2K}TSPxO~zgK&p&+W-xJxiuP+3*#c3B+P&wi*N(In#fF}c-St
-9hR<RDU_{aY+AQ$fxTPym4Rd^y>xP-@lCT6$ALO*`y<YQ5F1Y7+2Dxdcz6y5`fP+75mVek^2A&@7;w2
-|98C!7sMZXGnRb2Z<zH@;>Iq7PhT?`ehWUc0>1^;1}XK~QSUuPwR&+h(+XZQ7Sa4^ZB+(k-f$s4RQSp
-pZQyekd>IJCn*HHCnGSj{3I-sa@q)zTfJCqN?7MzIY|Q2018jeF~5K3MmwoTmgs&*>@M!et!)VZMtlY
-{u7=P;)BvW>~sO$O;^qC|?T)4aoB$<SX;Su_UBW@|~WVbQ>^<A@4EHZ*Ju`X)sl(zeUPT-A12EDxh%F
-H**?{O#v=?y5ysz+-Ks7mB$`EwPC3;?j_;$ehW20h=70CnNJzv+UHf3hwmcf6YCfE%^e8@zB(+cA1R2
-j<g2y)K8g?oM_E#2q`Qz$Z6tr%MNbiFAIIf8pKz!P9$17kpC!KoN>MronlghlcY7R)%i|W_65x_rM~d
-1$0s9hJz3~6hoOc1zxw+LG%3;vR%BE)C<xU?`G(9ONL<^#eakp{mUWR}`{qj9O==?7M+hTpY4o2p8&i
-Q~=fa{<3wvF(9gANzqVjT2aHq#0Qt_!>_>*@IsDES_ZzsMLfKmRgE6#(M!Ve&56fvA^SKbahlR0HHh9
-L_J71lG&*!X2)XzI_7plUx3UpZYQ%vUdp=2#O6=8g3#sU8rQfo{#qB(lBxF+<K9ST-~fa1*i<Z+$4Zs
-N(_G_jClio*}G>*Y)?kUmoUk5{HZ$gmoc^1z{oW$!|6({BEb$TwX}#G3cuIsKHzomQ(#0HBpUMqd7p0
-Q<Sy&3x|h+sh_}B~Pc+kBZ!<BVCvuVX9gKiK?6i$Pd>__jm}xYPbAwLH0lY*kDxKCPjO?z#qXTf;-)W
-+`^k^Mq$YwUdA13F?|KzjJ4h+q<$iu=TEF75jxuILhIvxY{d|X7428^TD;A7D}6Lp06!HWz(&Wp^RJE
-n?QhOeC2Di7t%LM^|@m39#?R}&!pQt%)xcW`8fVn2n{!;kX<id`Qvv{!<+q;8f2gDG^daB_9LvG5RHu
-=5rS&r!T?+4RrOd)RF97qlpj`^qhVi*!38eQmjqqpKkYsp5#E#f`jUPY#L2C8}&oisL`{lBvn>aX<Lg
-_DdX&pUR0hdD~P-b#^%ffnpj0o2DF1(z8QqjkhG!=Py=l^~E@D(E)@IKiGw7Oo*?ek67XkKQ5<%CQfp
-`YWaTklG~hj2EW*(8iMhWmd}&O&0D^R{V*}lp?^+ch7P6yqVCx%z3&qENG3PQd&I18Vq}Ie`X<#^miI
-dk-+UGFgC2&}w+T5FbiyG_<zQbLgLG(So-4-^pB|liVnTY;k-bAl{n0)QyPtBSjr{xP_)~$|p-+U2)Y
-o>ih?uwMi_9bRMWb7eR&O-fs*Bo3A-aX_!!{pZe0N*5y<hv^jhbBOwKwl2Id!Fsss|etM~Ew8WM4j1d
-G<Z9I%t>f+N#zzBkz{w1MD|L{;7xnOwC@GZ$`bp<E_^m^V4l*2+i+k>4>wk?cGTEIGQJ5+n8TUbg$I0
-o%05UUZW(*rD0SKqQW27GJ+nxWi@T7Jj#2>r$e|l-l#5%!f*bF#NN*s{=lCz@vNN<ujyMT+-zwK2<UX
-c1&dkkI#jd=T=kfC3B+R{dP&-^ZdpLU7IT2_8~%g+K4kCAaIJat4iq$6V3P&@dOZ5!{!U5_NmPs`@~4
-<r4ve60_8WWODKFSD?q4mSjaztI%m?s>G?;em^RD3T7cUzfJx8bbdRAcBvfA5?b#~YnzxK@Yt33ElE%
-v?@t16S^;=u#WTLO}_04%aP(Z|CT6!A*ULfJ`qi=%evyJ7v{eo15b$Fb7LNVODUUwEL**iDfx*fF(&t
-}zO;a7wde9Yd?c9Rd)*58TKf{pXSE3%O`=sdh?0DWDNcT_<Q7j4<!|+}JKqUe|a^JeXSeuqt;5iM=02
-e30MICYhN?7yjnq%k>_m+#<tqQpl78bCkv^XBoCB1TxA%r?-6v0`E5N1N-Z&vi)>ama(2t!~R(&*|Ks
--W?91#YCIfCU0_jp{y?KLu3*ssZmtCc-hJ)|x%QhpiHFxohHu>DW<tdV_tkMh+6^MVW2yX}DycPJIu`
-)K`g#i+kl2BnQ~W_GYQHbzPeaa)-oDJ;YR^S^l+IT|<#ZDA6hoOi;}j<9;mELiCIfY4Q#Rs<Dc;<(|6
-IV=xv+)=*E5KU5r!#c7``2euA3RcH6JD(cbHI+#<9zbqqTzx0{&qx`gmxkKKyj>YV))m@Hg4MvGiGIu
-OY7s{S`cN;ncE=dBjN4iE=N9*Dd-6zIc)k^bl@aYkUPSU7V?jcs^*Ry6El%Ku6M;Aw5tR57Lpij<q{{
-L9al*<!UJOZsR_{<7Ow~CH`Z7I>4eVmhHjuKrMtHRmbHLFoNjsTN)0Q_>MlDM@sbsw<E|eWzs)X40)y
-Uc~!7lcqMQ5HYRz8^T<x+gj;Y^nk-~aljyawgzzL!>_{AckFGzc)0n@8yc{%Jd&50vn!;O()RU!F$F*
-t6d7~gV_R$WimS@a#<bWLtk>n4X`Kyy=(lk3+YqcC$JmM(m3@i6bvEa4iLBVCHCLTB?u(MQ%vx8v#z0
-mjpo<C2mERH=b#RGR6A>Gs`dcSUe;RH&YT82;yb#z{`g1*&FxFb*$_+i23&r{oYTHewOUX2fYpi1x}2
-lB&}(lcT}{&HSDK+qDxWd<(YkqGpDM)!yMcGPcaC>$P_lY;hmAe_(p2JLzt%VvqQ2jxP#sx*zKiGi?Z
-jSGCQGyE~^fghG#+kac+4sK^JGEc&mu#ov7jezNqbXw73cNbYY&Be<#aV6-k`p+2ahw1oNLcJyCueH`
-o9Exfb@akzfpENKz@E8FwQsXn&8A)g(<woBzXCU7u=Kb{gD}Bh`w9mePBRn}btGKuVUf6p~&+}T&nks
-5-bP_uO;ilXKi)0%;ioI8PzLBsFVcR5m`kydK|HO;4dt7d$;h-_u!`hYUtGli#!~GQH7ne2#ncJq3kR
-^GGj<EN5;BP`+4m8i)Dy4X_@Lnub!hsM^V@1Mc0N_@uh(-s_&Y;DIoGdpP<a+`3tB}#}pC?|g;dIvF{
-nZGIEryv1=2VmOIo52FG7i_^%#-QiN+}Jb?>7TWLYwXWEFv503jHBakOpzC`6?>+Wbe~{q@B$(j!1n{
-OZWB>?qNSJl^hp(a@gVTr@jAz^UNRPrG8!E@o`;KXHzSy&N*v@?l=ch0SZt@edyW!IjuCKad7mma61s
-g0rW?9(@o<r_ObsOIx$FfMN^BO<KT2z5ioN!$fdhdv(@`jdYMbt@X1~^S3!0#^yL8XU;NmXag#qj<u4
-B9pE#PuZXqh3Z{&3()jR=Dd>XESX(mcE-{{iKI_ie(a18x<UY=V2>UM%NW(syC6Ygq;BF2bIu3*bD2?
-IyuV1b^}2o`+sKp@t$(**m0yD8x?`pqYg#wH=i-(inT`f^M!MT(3;v1bZJ={D!qk~bwr@(QHwsNHQo`
-2FzZ5Bt{-U%KJgx|+zWx}md|M_5g}tK$tEDo>?IG3ot)lwB$gQ5+G^5)2N$7cu_e{~US0(ye|=Qh`v@
-<ePfkTY+>rL#dSw9)R8K%_X~ctLf{5d&D+fLBRJK<jZ3AdHkK46Se^cVah_ME<Qt7Zs{g;r8CXb!Q;M
-~j{$uY8Cpxgax(-3`FH$V?22g~6^iYl7-t%~QB`IW0%B|X$EYvul|RfQqOQvA;2r19RQ{d4MOND%uU=
-a3Zs(+QjmZqSJv(I=d{H8sT_RU?0Vb&%ClM$Qek{s!-hbTrzv$ii+DUb-b-8zq1X0$Dx~4!4X9QT2Vw
-1@RevkkFszuSw_C&keX8fn^xtXdhsrj}M0KwU9_yr-*XMgXRVtv`85))5)Y?L*sDxGw34{&y#cx(5Qx
-_sdMs>}Q!9`n$z{PCaT%}<dcd%f>9=pN}P51-77g6S@H%vQFdE;R{sLDI7zU6QO<0lO~;5?{o<E%9S7
-TBJ)kMK{>Pt+q$JoGuIo7X}DstkPqQ-QOp_B`#Y+O#HNKKj3*&#Np^YBWdq<>FTxrM)#yf8Nz289Bhe
-pmpZD4DzMhjhoqkF9HSgrZV{}|dHVIA?AnL0YD+p_t3C-D%Dss#*NCw3g8&*HyalOZF-hm73od4Np8d
-3PB6i-vUsBmG^nY4i{pzjzk`wY2DV4pR%f+<V63kN+udaI#C=uVr1S!xT!qN5MiFlsIy&rgf5i|JDZ2
-z;(z_pvyXEj#0uypr@5)$<bp5w@=$MrGV^EP26qa?2Ey5)8#_+FL#B4f_-O`|$Ld|mjXHUb#lIOgq^6
-Gz!(s&#D|B(@(a%XoW*>aMCS7+3oWJd5W)ZSKu^#lQQ*zTGJmEQdE`3nbc%B&E!YFU28Vghsp{Gnu-!
-+FoWK1TklmvilN*elI1Bn<0BG>R`4w39Q<3%N>+1cR1Dx%tjeyKZa{=oi8!!2@w<*!ThT!;-{7WBxLY
-kvu(Idko(=Y9FfXHylc`pm?axRvhH-o-IPpI$@eaLoUX_>XU3l-1XEr`KTMWY(Ma2uX6k0Vc+{h7Kjx
-Q)47=lbn6l=ipF|;M0sfAZI~W0e+Kr#YyzO`79u>9cLWy@Ub$UKFm#Tl*VK|z>{)i5VN_1D&zns{d+H
-I@;<0kwhBWmA@-^!2|*Yy#pT1fauRMdy5qg#cLFnmQZHdV*NeF(^Ox8=-#TaG^x;^%KKGW?rJpALl=@
-y?C53^6q0^q|riB}%6m&3RS`kfJXgVZUud2*-ZfhF^tv)#qT3;nG=9MBTlMEKl9S5h-t4X^-nstjRbL
-_?u_P+`?%L^>pBWUHjRu${&`V;XCWZB=VF|sVxzzQ<C#NXC|=BoaT;Sjq`Y49~Q{Z!wyA}zkSb#l(&_
-S^F0*ufyzffY80!_*Gsdw2U!(aqy++jX9O}(Ru`q8g{Z%7_zwx6*PRnq-XK__a@1yJEwWlX@tAL4W2|
-v#9VQ>BPg}fAPi6R=Dfqu3;C<PN!j?G);)_&841P-IjLHzCBF~}iwCs7*d8Vnf`R*s;4#9~3&MbYq=!
-1jJi7{jsv#KVnK?qa3bjLwAv~CYDdT#<*;Ze~;I9odm2L3y9^~Gu-ETnOai#D*U!nX-7l!{y(oF>4c(
-W#Es&vupg;^YL>4*DV^kDBkR=IV$q-5QTDTc3K(I<zetQFAT0?gZW}YK1so+H$x<uJ2Id8|L$Zz-zi(
--JJkmCtS;@8}Cyh6<xwP^)Di1)#(shlfMT;fEo?}wPhpZcf<TrZ8i28M6!FV?i=Y5T$i=(FV^PbT<gB
->A<Wcg7sv|~&$nCwde3iuBR{p<9sDG}M2;>VQS)3}BICh0OxEH6Ldm1T^tKl@*K32~)<4b+_y+m>*IW
-5-&!hxgP5rT@$PTXppi-!z9e|#HfKhYo4>8TbEn!W}Ki~e{$8SMO?{5y{HHa`Bu<90fbL*Ujjq0s%OP
-)frv{f#r0zA=mV;zV*GYOn~_JMqd-Mo3}r?K}o;-hl5%(JK9u8Uh~<=Gy0TI@XwxA+}j?Q%p=>F5RB1
-wwZ3q2e#@mX9LX8`N1V-Jz4Jpce09-wcSwg)}@IR-3uZT8&LSO!%BJW$UvK3nAaFQ`Ls$Gw=USU(H+h
-AOUthI!UGt$-_QL6@i#Cfp-zlp|Pe4(Un>T#4L9t{9cavL*8P+^5d6RtBRilSU?WZ5hEsq*VB$jN)0M
-cNV0D8v=;Cc3#v3}gK!67DD(rpE~C8v1|P$>RFwDe=qmDX-owcVlKI6WL><NeK`jrb8waoSad>u5eaU
-(M;JZBf20oPnIhB~oPs?i82UO25Gm;-~aAM+0akJ9tN}~SV(L`s50q-jP2R_`YE&BV0-$JHRDux5(bF
-<H7@TwSw$e%~WD$hs``$ZVXn<XEQe7bp@_h92+{#ySq`4l~0ul3y&?o5T=b1kUOnG9=(eR>$=+ywiUQ
-WDnKqEq5oqIwhXkAmk-x@nCcw9{v`d6XfenW~4Gp?m?<zDl1rV)h28>zj&dW=#wa&_MP=q3rPY%MGvS
-FAC}1RX;?{{xJ{zBRKJ5!0*vexP_hr`I@=u{-YNS0HaUs4t;lGFXS&q&(1vx=qWuG0&DM+S702$Rj*0
-oR;GHuo|lI)6PL;&OKL}8KM#2r`zai!{*y&9#F}FyB=lyp@=eE?T}KwUJPugJr=<D_wi;z*GiajiuPE
-gw`q#6SdQ73F%OnnL^%G2{Ae#=6HYlfkI?*&!b;h3J9KH{fEt=c>)KBC-zD;=_*YW4t&Y8s{TRIexX5
-Geii`wwpe8lF9Wa`o0y<Uo?lQtu4g*3H8U<m&SKXh@JC;8{GpDD$N`^O1Rj*wXLF5|o9G`qg+afh3ro
-*qco<j6g1)Ms)FK<H2O_hJ`ZW0(78`BZh`h%I10)D6(%DD55G^C89a(oYs)pjGg)jr!fr{)_#3!f=`o
-&Eh0IlxFI~Sy1wJ5$Uo&!smv@n!TGu;MJGArcs`b3`O4;vP``{hfUvxnc+MMBSX6lc{0m7<;jrm{79s
-ftm+%rw2$VgMQo@;pXn?7bv^qwecoI9_Rd}d0yrXDtlQor<dL*nOja}+ot{E09ECu?;(h0JL}gIVt4!
-}(=Yt&hpX!yWCdEcSJNA)3LCxxO^Pm?Fz52CsF;hvo>nBj{*gfTJM&$jN^A9v^r{?n&rjol+L~-Gwxe
-qbTBW>SU@Sr#eb4jL4wb#kk4s?LHKYKCJ_qM1%;4H4X&q~L~Su(rkeX|-&G6bPg-7BlC;l%|)BOBs7c
-D1`YHhE<8ImCOf<R9?R<xTUsSC_FzOAma>;svv4Kv&juS#x5)MJk5$uaxfzix^u+tlUyJ@D2RjfAKJW
-yK<7j+w_b{t4$IY{d~I<#gK)lmy(MZ$XR?BQCaZqoD`8AjJ_AlUdX={`V*YiA)E|~o9+>sklk62S7FS
-W_*)U2t=mxJffBEhy)W%{+u_(x>|Y%QjbD8!Ji805HJlZOYckOLJO;tWwW$knV=8F{(gnP!3WxWp`8-
-wr;)MSQ_{jWUo2)2*g--(D26qt)*o&v2rv$)83w=OI!z9(F&es|yj)U_&V}G}*|DwCsxSzh+ZgU?l6Q
-<2IaM$5v_Sk~-#C;l`43Y`XAq{1tM)lMVgJAq8=rm@p*~F1~9w5u09JUKQDH$>rrwl&zQa0~-^fBfnI
-6HfHHJu%azn`Q0q5jWbkogzAfnR60xf=G3WXD5&_dv=C=E9svt52yglI{TN-b-~;ZTaLb&JKAm*ZoU<
-ce7=9%WT|2;1J1)(^R4{>O|62VY&LE$|i}+PK{Y@zsH}Y8tA7r3){BLKe^Zm*BLact5%sKliWk2|3DA
-jOx+(HB%9Wm3^n9@v5rlmY*Fx+TGk)(w-?r1cXno`#!v^~m2Gdd1(#aY#iDgYDX+$gT83bQ0ZGW)4*Y
-Ve`iK3rMz8gxi8jX&AGxlvy!_sDQwe27`k2nx13xq-SDph-twQjs?_do3N!7A#E?x&KTq&VtKwdR@!@
-XkrN{#NCf}6vLl=s8znChN79gU?mtR4O%^;e_nE4B(B(1AO}P<)#9hZ}W>ItsW;Rwv>dhs5l;x`;So5
-Dtbst6%7si^adezf+@6JGo~kLSjq|=<Y{c7#8&Q=!)6GbO))2dc>U-e;^0Jqn=GeKds!b+2yx&^C<Mz
-C4HL-Ht)#XWUrir+~IvCR_c6$51nw>%a8KHGs?C*zBEeyi~jz0zE1}8WZ{+4Bf^jkh8sQTz#1HT5L<+
-w$b*xDSKj1#E!@HIyGwnce-kpU@xt6M!4&}%j3a7UKXuf>b@y&dZEn_tq9)(d-9A8|baU75Mdm;3cXK
->wn^xKKwK-H<S`|o2v!EPlhe(;+F|*?@op9u7Vm=YpvqADb=bHMe$^-a2FU2L6#*>C{kA0p@(I`BkB|
-RM24wZY6-oqrObVtb0OHh0|R`>^S_`J6pzHh()*e?hw(^Nl@m@(Dpa-afj=<_+DVa2ueV7TKIpIh^mk
-^|6t6UGNUY&WMJzFkj44o8ESuEGNoyT|Bc<CGog+qEDNAqaSjhnf4l)`vu9pI5N~;D?d_%kJ9twOWNv
-0l{3G;{eVfblofKWZPN`d*l#a<TN{{fpC({PQOmv^TOzR+2@1*tzn8DU`li8Xq+0kzYsPFg2&8uFEQ1
-?&wEqs;W1v+tKRj%4#R#L`WBd1(JR*JRYM^R+Nu>|OJt9h&iimV7ufZ#yEx$zdBb7V-Z}2M9ZJ66p!g
-SC#a;WU$4uohqgpX6$T#b`A0kV>7EGk4DmWQS!W(fE=SgU6d-7Ll3H%=XoZ#ATHY@TPfbCI`rnHI$l$
-2wfXcDp{a2YOlTgy{f{&aMz>|EqY0_mG;`EuXj1O9vKydGHgBg6vdi!7(6aqNx8ciS$zLCdvc?y3>th
-GJqo+M=2BoDJ+J?$B+E_nLy^^}!NgRE9)ta_y6Y>vvWM59jkyOfVZuW9e#UQBmtGvV$P<FPir}m;4_-
-34NzOZ*({5=Ua;iSiyd8uKSXvyHjL$XU(x04AEQMkeh46ax9jG;+Rp-r)r4zFyUQ9GgkH6=F!Q0e?pB
-6+Kac9ix4*tJCjY6=2RtssA)`DWK2dgg^lbG<oy`>T|l?C+eZw;s|0$Hz*W&W42q^nkTk5Q+(mwDaj<
-y|E+P=@8{0TmG@FWBrUAca1n(k-IGmnuUii)MY^r&UgbnS1>EPH56Dff7iPCNBEQo76U+ToC1H3y_!2
-!)rTDe(t^u3Aoi=a0A<n|w$V;z;$3xS3d_`=l=WOGoVvgmvPzgdjC^ejr_2f!0|7)bsXOX0nJ$Ny*L`
-XVmKn_stOUpptEQa)#U>g*nesR8(9`@iW)wqv*zwrCr1F4*d#cAM;f-Ew=c(fpSpt9JIP`2M+{F37C4
-<OEExL}`jhuWvlexfGijF46qv^*7AvGh4x!b_YTL_Jh0ph<U!7#inAi{_rRZrmQpON(w#i-2}}_+aVb
-=y|hJX$#Xf|^4@2H^j`@0{mzW{_Rx&2``SrOwvi42L1XYW#of~yNjH)6ibt$uwhC);h_&gwBgpqdzb{
-h$N8e!iLjPz;`=9RZ_=}+0FXOlRXb*}M+g4sj(>KTgrvPEJbvi@YbvkE91aA_)NnIl}vdu0a?+1%tr)
-;Ra+8@Kr%QlzT`1QB-_6uzXi%z$NN-c>ytNy**@<lq8a)lyksjl~4GDkqcdhPDZmAwC!%)IWZUu8c3E
-exut0>2#?S3Xry))1-7I+%IukoumMftjpGiKMK^8ZD9TQ2f2(@*(>fZ+`b-nBg}_OWERz0L<jIoOWqc
-dyAiWw7)Lc0c0%~Z{w`coaduvKN#6x^lyVW5A#sTm3UYXjH`hQ{vxDsUE(+8c!X7;sbE$nQl3iM%};z
-u+duKY1^@!;RlRT@=L)hQIxs=YQAwfeCp84qLFKCl)D(K1Y5ns~)O$nW8~jTYa6YRtK@gX{q7x%5P&t
-B>>LKMZ0_rfq^VX5OK4@pLy)8+Be+ssK)5rd`)v7~eq28ZtUyan&-DfS;MyA*<Y8z716sIPP35$0K=Q
-4fj@J}x17kh}SUpKj4O|mA6>SHc)7IiUkHIEcH8fXKS%;~zCS;sOQlrT2`kmGIWAo$))`<cHf>uU(wg
-}DOMs@F#lK8KmisprL1eO$Y6sS7C@>5nl#^-TP<ykGM9Pv|kP<92#oQM?k=K9x~NfI<;0_N&`GY)>Kz
-x-#sj<}=+_R|WK-;Mv*!enIaOeEa3K&53b5L9nj(7C>ie;5dVlQ*IfnbdeiMIO}*AgTX$9&&m!%-g_Z
-GfoDH|9kT9qkr%L7?rW)WoVhwIOo#2yT7j?;(iUr3-zb<Qf@j+t@}7RraS%7ZU!eGIe~x%h>H2b={mR
-+<C7GEO4&Q_#%YD)k_Jh2S0pO<hbk{x`r{148`-HFj;B)B!p-$d$F{9{q7<-v)2E3%SA^@0B#g>5)m*
-5EFf<yN3^LD~}r{X7eU4Ee-95G(!rt{@S0}kgrBxL@QMu27CPhJJ8A?CFFp1=(cdFF5EU+CjAXMR<ay
-IJCLdXgG%1h1p%-SakaD^9{giFs(Tm)&jQREBy*>@f7*`+q_&-ZaF$7j15)iC<p=!=W(Ij4Vh>gE^EX
-MYzq~wsEUzb2&gKP06lv)?agZ3kwnW<Dl>N6O`YsC1l-Tfr*MRlUS0ML7B$;2)$$0dbTM$e_VkJ%w6G
-3Y`NzfaL60+`9M+mnpaWyK?L^~m(EBZ(J-qOJm1($xJbwkqFV79o*Sm9<NNS@004T&wNH=pX0FRpOYJ
-LuwnE7xq-jPEWqR3cwn};kI@eTB)`tOnTsdyoLC8n3;1Bbg_bCZunzZ`tq|^=0Io7<njt6S&)wmg4WL
-dJH78fa|?zqzK@IRNA{t%Nsjz7JIm0|mpSGs~J0<|Fa>8VDospYXS1rZhPH5)OR9QL-z<5|x5h?xHHG
-Jklj|0>Lg6db=MZ5RWU9jn{}To7{dO=oYj<uRx4_ocT(p?u!@A@O(G=fWX@2$zzJnuF$194$1Px0W=>
-jDf3pHI96Hy<OWbIJu_U?#M3-l0RFxt5>7d-VbC)HsBRfwVRUi_IRF5vQz?@iWabko%1=rp6}`DC_Wn
-=z;|Mme{z>3956Y*j*vc$o+FfwAStfUT`NDTm!UZC*VE|60X*HrXS>J8OI&|&L+tnA>+H4WK<etYb(+
-3rHZvV3;{nhPxiUF+y)8Bmo-E%PYSwRe$e+WYe|cFuzvf|%g5n--5l4+wbWvP|qaL}-26E|j-LuAn#z
-@@eTXRe2iI3|?e`r(lbppo+5ndn2CF-oG8DZnzMfxmY-dR;>6o^w=bT2*_%}Mw?R3hGY-1{w_2YTkRd
-4L>42>_)6MXpS-f_D|!=;VsP0)grEz!}lUrpq|=@BDTCw}~2b9Xzoc>c~iiKu`4(5E5Rc-36)9uflq`
-ELtE3jwB=D^SMsw6YrTxe7SoP8GT%7?4=K5_Wa;Y6f{iEcA&$g;1;`vsF-Hn*dYA9{M8-x+iLw&RQ_&
-=fHB~nK_ToCpUR7gGB<?LADesQvbz(iu(>&E|Iy=+#_c}ZOn%ee?_PFR5}Z8m4%aMM?4ibEs#!Y|oxL
-td1<m5T-Y+9@P#A;S{qewU7x(`>3;REmbi4rH4eB&oDj5#optX1ioC~Zo`tuzRAV@1A@_e<#+KekZ%o
-P1;488)t7^`xR&$v7&d!y6tIA_ogA=f&m6!wS7Nd$Q{_Dtu2wk88R6#RHcbPII9``9}_yAI*mA$YOC2
-TyGgYYHl>*L#!+H+ZN57c#yA9DggHCE|Zs+dtl05|tcCg&nSzs%7<IUaWlHl0t56R+iB50hSSbpULiK
-rf<&!a}s)^ecfrP(+m4*)|GlhQQHpuyT^@&s7)ji>Vd!uwRgN>R4fGPrpkYo_XGI3<Gm1u?s^L;h+je
-;K%>+WDHqKqN4sM|1I&hX1zcP^);_g^5#+<af55)81W6=7cFGhSL#T$sp7F$(U{~^K+Tzx|iq_M-uvb
-)})h+%bJ`DY@D*bnBAzZ!LIfH1MJEzB9fNuxz7~~-1;MC#5s7JJ@+MERve+r++d&DQ+*LQZy0+Nq=aS
-O^(z2P#C^6vZi?uoh*Uj563M_CRg2ldX#`i>wzE=c}E`_+g0x+jKOHu~hu)YrP;8oN>W3>s;!Q^T`t#
-Fzxcg)8mni^M(8yP;QB6nA|bzGt9Uk5`J34HW5?+_-YHF=f85omGr98WS;AuuO*Xn9RYH=PSUUh#!I0
-Ypq#d4mp2D55ea4W7##Eg@i`52Q=q)AA#IxG-x8vhXXkOdz0`V+Ea^%br|E<23nW1>B&*x<kmx8m7ch
-BhB$bl@x$Z5A~^D}Yfpid05!`kiX~rp=@!+$c5N1+?i8cfO0sseT^b^e{<I?J83!Kc{p`<6Yk`7rg)t
-A<L4TTk|6x5Ni%%y-ty1D)1Z#nmKDx8MUT@oO9hE6U6HGu)KIAxP=1j~DdqyfBH<kZ^Rc)HSJs`YZCM
-0#|y&hHtekB0ij=IC8jLgg7Xd-fM*~gFrkgji^XIh^WZp*QvEh~G~l0=<PjEwdWmyFsWOBv^&947#V1
-cnIhy|hJoRR;*Q*(y5}`Dp(C2luBF=QY2|>M943HkvV3%q~)@J7-7-HUk>;L~~Wc141O|Y8v(Mys!Yg
-^0v)Cbz|FBgZHk?Ku{$^SgX>-%UzTWhgphQ+S7v3<cj1-8Zu~r7mmF^Tgd!TW&Vdcy><_D0b8D_c&c5
-jh}`fbK`Rw3L{6u%20fDQrZ%#41k<5>-d6h)=-tEbTXy_}uX4*2lzKReXPeN34pdO?%BttfD)l(=IQn
-|6$<gzr6!_z=?UNSx5C2oA&ghtPhy+NRBt+c<C#WUP`5`WDG%GD(z|zWDiO9WpcEacDy70fK^ivv&%E
-_f)bDW^|kR=zKE8Q8>?<Eheh%N7#uhhAkYa+|1^!Z@X>lfB>A5PCpc&|m>1J<+oEHK78O56a!XHlT9m
-3N-?7AndzVm++4Z4J$yr^+9p$&)rr!Pf?@12tWtbBT-YU0S&ZryfJQioE$i_d1+(SGKwqe&=#dB<@J~
-_ZxqE@;|_Tp#MBC#P0JZY5xz)ote$2nBqzOPd|)*il{zuDZne;nSrfCE&|rBAw`tT#g9Bcdu}{m8c=}
-Z&_SM$e&OH470#qs%B247!(?Z5Mvr>M<uFoD9R@&1Y1*aWHcTZL0+Hx4b=oFK-$Cf_ROk!U;Fy!a?sn
-h*?M2`?`HvHb26c~~B+3<YLEYyk#K<ZFI<99RU@r+W(X$eis-N`4?&C4bFT}VR`_=2({Mj!!E`R1o-z
-Nq%h8@WoQG9I=4LBPZevQKwhFX+cb*_1^X*S=s;NkZZD__`uUV12ow)p^q4j?eOg&pLsQR%Bzs~pgvt
-9xRP%HV?fsA>#)WSC?RJYT{`zekU4_q)dbGUmrLO)*k7?JDi9S<|j5k;IQPZZrK=(tAq7AF(>kcV6FO
-ivRt;{vS|F0Rj{Q6aWAK2mnzTaZDN}?<h79005;f000jF0000000000005+c00000aA|NaUtei%X>?y
--E^v8JO928D0~7!N00;n48F5TYNu*^n0RR9<0ssIH00000000000001_fnyK=0B~t=FJE76VQFq(UoL
-QYP)h*<6ay3h000O8Q5kVef*6bSLk$1`hAsdA5&!@I0000000000q=CZ`003}la4%wEb7f<1ZEaz0WG
---dP)h*<6ay3h000O8Q5kVetE>JyrVIc8;V1wA5dZ)H0000000000q=7ac003}la4%wEb7gR0a&u*JE
-^v8JO928D0~7!N00;n48F5TYnKB`M5&!^NKmY&{00000000000001_feS1E0B~t=FJo<FZ*X*JZ*Frg
-aCuNm0Rj{Q6aWAK2mnzTaZLR`DN&Lm005bN000jF0000000000005+cxIO>?aA|NaWN&wFY;R#?E^v8
-JO928D0~7!N00;n48F5U$dX|{G3IG7P9{>Om00000000000001_fp=m60B~t=FJ*XRWpH$9Z*FrgaCu
-Nm0Rj{Q6aWAK2mnzTaZEP&CI4V5000i0000aC0000000000005+cVQl~aaA|NaX>Md?crI{xP)h*<6a
-y3h000O8Q5kVew-0xjkq7_)`V{~G5C8xG0000000000q=D;~003}la4&3cV_|e@Z*FrgaCuNm0Rj{Q6
-aWAK2mnzTaZLIsgtbc!0087F000pH0000000000005+cs-OS>aA|NaaAj~bGBtEzXLBxac~DCM0u%!j
-0000808trnOxvt?_I&^V0Gt2-022TJ00000000000HlE=uK)mWX>c!dbYXOLb6;a`WMy+MaCuNm0Rj{
-Q6aWAK2mnzTaZG)gAUk3v000Vo000aC0000000000005+c(yssjaA|NacW7m0Y%XwlP)h*<6ay3h000
-O8Q5kVePrb}Y4+a1LJ`w-`7XSbN0000000000q=8=6003}la4%nWWo~3|axY(BX>MtBUtcb8c~DCM0u
-%!j0000808trnOofS-iii;a0AN=D02TlM00000000000HlGU+yDS@X>c!Jc4cm4Z*nhTaByU4a&s<lc
-~DCM0u%!j0000808trnOp(FBt{@`-0L_&E02KfL00000000000HlFl?f?LAX>c!Jc4cm4Z*nhWX>)XP
-Z!U0oP)h*<6ay3h000O8Q5kVe-NdE^X*&P_FgXDL7ytkO0000000000q=B&!0RV7ma4%nWWo~3|axZC
-cVPs@-Wpi^baCuNm0Rj{Q6aWAK2mnzTaZJ`y86y)00090E000^Q0000000000005+cP)z{<aA|NaUv_
-0~WN&gWZ*pX1a%E&>X=8LQaCuNm0Rj{Q6aWAK2mnzTaZJG=bdKuK0066N0{|ER0000000000005+cn^
-OS*aA|NaUv_0~WN&gWaCvZHa&u{JXD)DgP)h*<6ay3h000O8Q5kVeU>*mJW&r>I1p@#87ytkO000000
-0000q=CC60swGna4%nWWo~3|axZdaEp}yYWN&gVaCuNm0Rj{Q6aWAK2mnzTaZDk5yb8|=008tR000*N
-0000000000005+cS0(}gaA|NaUv_0~WN&gWa%FUKd1-EEE^v8JO928D0~7!N00;n48F5URSWQ|;9RL8
-5bpQYo00000000000001_fm<*F0B~t=FJE?LZe(wAFLP;lE^v8JO928D0~7!N00;n48F5SiR;)U%000
-0k0RR9b00000000000001_fzwR_0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gD5X>MtBUtcb8c~DCM0u
-%!j0000808trnOxjdNr2_&004N0j03ZMW00000000000HlG#P67aMX>c!Jc4cm4Z*nhVVPj}zV{dMBa
-&K%eUt?`#E^v8JO928D0~7!N00;n48F5Td=BX@H1poj55&!@r00000000000001_fdo+k0B~t=FJE?L
-Ze(wAFJob2Xk}w>Zgg^QY%gJCVQ_S1axQRrP)h*<6ay3h000O8Q5kVe5~{}VECB!j76SkPApigX0000
-000000q=A`M0swGna4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zE^v8JO928D0~7!N00;n48F5T4JS{
-W50001d0RR9Z00000000000001_fdp6r0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gPPZE#_9E^v8JO9
-28D0~7!N00;n48F5U<V7cB14*&q*G5`Q300000000000001_fdN?p0B~t=FJE?LZe(wAFJob2Xk}w>Z
-gg^QY%gPPZgg^QY;0w6E^v8JO928D0~7!N00;n48F5T(CNzBc0{{Ty2><{m00000000000001_flX)v
-0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gYMY-M+HVQ_F|axQRrP)h*<6ay3h000O8Q5kVe4pbie!36*
-SEf4?zCIA2c0000000000q=AcU0swGna4%nWWo~3|axY_HV`yb#Z*FvQZ)`7UWp#3Cb98BAb1rasP)h
-*<6ay3h000O8Q5kVe5@CS2C<p)mh#3F?B>(^b0000000000q=Arf0swGna4%nWWo~3|axY_HV`yb#Z*
-FvQZ)`7fWpZg@Y-xIBE^v8JO928D0~7!N00;n48F5UDd&NS$0002;0RR9a00000000000001_f%|#_0
-B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%h0mVQ_F|axQRrP)h*<6ay3h000O8Q5kVeo*h>F%K!iXaRC4T
-D*ylh0000000000q=EQ*0swGna4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zb1z?CX>MtBUtcb8c~DC
-M0u%!j0000808trnOu?rH|62tB0L%>l04)Fj00000000000HlEoeF6Y*X>c!Jc4cm4Z*nhVVPj}zV{d
-MBa&K%eV_{=xWpgiPX>4U*V_{=xWiD`eP)h*<6ay3h000O8Q5kVe(}>1YrU3u|%>w`cE&u=k0000000
-000q=B-60swGna4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zb1!mbWNC9>V_{=xWiD`eP)h*<6ay3h0
-00O8Q5kVe6mSJcJpcdzKL7v#9{>OV0000000000q=BS_0swGna4%nWWo~3|axY_La&&2CX)j-2X>MtB
-Utcb8c~DCM0u%!j0000808trnOoJ=h!6yI!04V?f03QGV00000000000HlE)g#rL@X>c!Jc4cm4Z*nh
-VWpZ?BW@#^9Uu|J&ZeL$6aCuNm0Rj{Q6aWAK2mnzTaZClF+Vu-M0s!zL1OOfY0000000000005+cf`t
-MAaA|NaUv_0~WN&gWV`Xx5X=Z6JV_{=ua&#_mWo=MP0Rj{Q6aWAK2mnzTaZCvlLPx3r002Y-000{R00
-00000000005+c$-e{uaA|NaUv_0~WN&gWV`Xx5X=Z6JV{dY0E^v8JO928D0~7!N00;n48F5VT&ks}N0
-ssIP1^@sb00000000000001_fvmv<0B~t=FJE?LZe(wAFJow7a%5$6FJE72ZfSI1UoLQYP)h*<6ay3h
-000O8Q5kVeIlqJu?>PVf7J2{x9{>OV0000000000q=C)E1ORYpa4%nWWo~3|axY_OVRB?;bT49QXEkP
-WWpOTWc~DCM0u%!j0000808trnOv~qIW;_D`0Nn-v03iSX00000000000HlHW{saJUX>c!Jc4cm4Z*n
-hVXkl_>WppoMX=gQXa&KZ~axQRrP)h*<6ay3h000O8Q5kVe;8`d=JqZ8+!z2IzCjbBd0000000000q=
-9q-1pshqa4%nWWo~3|axY_OVRB?;bT4CQVRB??b98cPVs&(BZ*DGdc~DCM0u%!j0000808trnOo>?}h
-;jq~0Lu;l04V?f00000000000HlHT3k3jhX>c!Jc4cm4Z*nhVXkl_>WppoNXkl`5Wprn9Z*_2Ra&KZ~
-axQRrP)h*<6ay3h000O8Q5kVe;Fn=qzXt#S_7eaABme*a0000000000q=Byx1pshqa4%nWWo~3|axY_
-OVRB?;bT4CQVRCb2bZ~NSVr6nJaCuNm0Rj{Q6aWAK2mnzTaZFtMH%O!f000IK001cf0000000000005
-+cuowjZaA|NaUv_0~WN&gWV`yP=WMy<OV{c?>ZfA3JVRU6}VPj}%Ze=cTc~DCM0u%!j0000808trnOn
-iprWk~`60B!^T0384T00000000000HlGN9t8k!X>c!Jc4cm4Z*nhVXkl_>WppoNZ*6d4bS`jtP)h*<6
-ay3h000O8Q5kVey+WEXXafKMKL-E+A^-pY0000000000q=6qH1pshqa4%nWWo~3|axY_OVRB?;bT4CY
-IW#$Na&KZ~axQRrP)h*<6ay3h000O8Q5kVeL<FqKzybgOeFgvk8~^|S0000000000q=CmI1pshqa4%n
-WWo~3|axY_OVRB?;bT4IYb!~GlaCuNm0Rj{Q6aWAK2mnzTaZCh=1wAzd003?e001BW0000000000005
-+c!6yX(aA|NaUv_0~WN&gWV`yP=WMy<OWpiV2a&KZ~axQRrP)h*<6ay3h000O8Q5kVe!3toa6b1kQ4k
--Wt8~^|S0000000000q=7Uo1pshqa4%nWWo~3|axY_OVRB?;bT4IdV{>gTaCuNm0Rj{Q6aWAK2mnzTa
-ZDgL#Ly}Q005;9001HY0000000000005+cf-?mGaA|NaUv_0~WN&gWV`yP=WMy<OWp!g}aBy;OVr6nJ
-aCuNm0Rj{Q6aWAK2mnzTaZL0<19@Q>008PV001BW0000000000005+c>^KDgaA|NaUv_0~WN&gWV`yP
-=WMy<OWp!g~a%OU6aV~IqP)h*<6ay3h000O8Q5kVeCIy%HI0FCx)CK?mA^-pY0000000000q=Ac31ps
-hqa4%nWWo~3|axY_OVRB?;bT4IfV{3A7a&KZ~axQRrP)h*<6ay3h000O8Q5kVe%-c!TGdchOg?j)1AO
-HXW0000000000q=5rf1pshqa4%nWWo~3|axY_OVRB?;bT4IfV{~_Ba%FKYaCuNm0Rj{Q6aWAK2mnzTa
-ZI2=jTkrs007el001HY0000000000005+cbdLo9aA|NaUv_0~WN&gWV`yP=WMy<OWp!h8cW`oVVr6nJ
-aCuNm0Rj{Q6aWAK2mnzTaZDLS($`}r008Sy001EX0000000000005+c?2-ilaA|NaUv_0~WN&gWV`yP
-=WMy<OXJRrlF*0UyWpOTWc~DCM0u%!j0000808trnOn$5Wk2V7U0NMrs03!eZ00000000000HlGAx&;
-7mX>c!Jc4cm4Z*nhVXkl_>WppoRVlp!^GH`NlVr6nJaCuNm0Rj{Q6aWAK2mnzTaZC*<)3TWo000g)00
-1KZ0000000000005+c1-=CUaA|NaUv_0~WN&gWV`yP=WMy<OXk}t@Wp{9LZ(?O~E^v8JO928D0~7!N0
-0;n48F5U)8aZJVFaQ9tWB>pj00000000000001_f#1*t0B~t=FJE?LZe(wAFJow7a%5$6FKTIXW^!e5
-E^v8JO928D0~7!N00;n48F5Soc_nI26953aOaK5K00000000000001_fiM9E0B~t=FJE?LZe(wAFJow
-7a%5$6FKTdOZghAqaCuNm0Rj{Q6aWAK2mnzTaZK=N$;u!L001X4001cf0000000000005+cxfBKfaA|
-NaUv_0~WN&gWV`yP=WMy<OY+-I^Vs&h1VRC6<Zf$R5Wo#~Rc~DCM0u%!j0000808trnOvv$8n*s~~03
-1dD04M+e00000000000HlE+AO-+%X>c!Jc4cm4Z*nhVXkl_>WppoWVQyz*d2(rNY-wX{Z)9a`E^v8JO
-928D0~7!N00;n48F5VhyRRu~2><|)F#rH100000000000001_foLoS0B~t=FJE?LZe(wAFJow7a%5$6
-FKl6MXJ>L{WovD3WMynFaCuNm0Rj{Q6aWAK2mnzTaZHb9tr)!t002=e001Tc0000000000005+c6*dL
-{aA|NaUv_0~WN&gWV`yP=WMy<OY+-I^Xk}t@Wp{0FWMynFaCuNm0Rj{Q6aWAK2mnzTaZJO(Re;qB001
-yC001cf0000000000005+c7C;67aA|NaUv_0~WN&gWV`yP=WMy<OY+-I^XmxI9VRC6<Zf$R5Wo#~Rc~
-DCM0u%!j0000808trnOd=1`Kk^Cy02(X+03-ka00000000000HlF3O9lXNX>c!Jc4cm4Z*nhVXkl_>W
-ppoWVQy!1Xklq>Z)9a`E^v8JO928D0~7!N00;n48F5UtGQ(uZ3IG6JD*yl|00000000000001_fo4_)
-0B~t=FJE?LZe(wAFJow7a%5$6FKl6MXLNOPYiV<6ZEs{{Y%XwlP)h*<6ay3h000O8Q5kVe<m~XImj(a
-;`V;^FBLDyZ0000000000q=9o`1^{qra4%nWWo~3|axY_OVRB?;bT4dSbZKreaB^>AWpXZXc~DCM0u%
-!j0000808trnOg42GP2B_l096eD044wc00000000000HlFSXa)dqX>c!Jc4cm4Z*nhVXkl_>WppoXVq
-<7wa&u*LaB^>AWpXZXc~DCM0u%!j0000808trnOs&%qsB!}U0Ne)v044wc00000000000HlFzZ3X~vX
->c!Jc4cm4Z*nhVXkl_>WppoXVq<e>a&L8TaB^>AWpXZXc~DCM0u%!j0000808trnOlkJv59JI10EuG&
-0384T00000000000HlE;aRvZzX>c!Jc4cm4Z*nhVXkl_>WppoXVq<f2Z7y(mP)h*<6ay3h000O8Q5kV
-e9(C^?p9cT{85RHlCIA2c0000000000q=7<y1^{qra4%nWWo~3|axY_OVRB?;bT4yaV`yP=b7gdJa&K
-Z~axQRrP)h*<6ay3h000O8Q5kVeivCZag#-Wq+6@2zCIA2c0000000000q=6-d1^{qra4%nWWo~3|ax
-Y_OVRB?;bT4yaV{>P6Z*_2Ra&KZ~axQRrP)h*<6ay3h000O8Q5kVe){$p2AO!#bz77BYApigX000000
-0000q=D{=1^{qra4%nWWo~3|axY_OVRB?;bT4yiX>)LLZ(?O~E^v8JO928D0~7!N00;n48F5T?fJZ%W
-4FCYeFaQ8300000000000001_flZJG0B~t=FJE?LZe(wAFJow7a%5$6FLiEdc4cyNVQge&bY)|7Z*ne
-hc~DCM0u%!j0000808trnO!dFKJw*fn0L}^k03iSX00000000000HlEfo(2GLX>c!Jc4cm4Z*nhVXkl
-_>WppofbY?hka&KZ~axQRrP)h*<6ay3h000O8Q5kVeN5_!Yxc~qF@&Et;9smFU0000000000q=AQ`1^
-{qra4%nWWo~3|axY_OVRB?;bT4*ga&u{KZZ2?nP)h*<6ay3h000O8Q5kVelLpr^0{{R30RR91BLDyZ0
-000000000q=9^+1^{qra4%nWWo~3|axY_OVRB?;bT4CUX)j-2X>MtBUtcb8c~DCM0u%!j0000808trn
-Okdrtxt9b00I~`I03`qb00000000000HlGyqXqzQX>c!Jc4cm4Z*nhVXkl_>WppoNY-ulJXkl_>Wprg
-@bS`jtP)h*<6ay3h000O8Q5kVeSk!4bvj6}9@Bjb+AOHXW0000000000q=A~K1^{qra4%nWWo~3|axY
-_VY;SU5ZDB88UukY>bYEXCaCuNm0Rj{Q6aWAK2mnzTaZElHr(cT$007(x000~S0000000000005+ci>
-U?xaA|NaUv_0~WN&gWV{dG4a$#*@FJW$TX)bViP)h*<6ay3h000O8Q5kVe$78_Ra0&nb#3cX#BLDyZ0
-000000000q=8Va1^{qra4%nWWo~3|axY_VY;SU5ZDB8AZgXjLZ+B^KGcqo4c~DCM0u%!j0000808trn
-OnuhaFNFdC0DT7l03rYY00000000000HlEdxCQ`lX>c!Jc4cm4Z*nhVZ)|UJVQpbAX>MtBX<=+>b7d}
-Yc~DCM0u%!j0000808trnObu<KJxm1v0QD3A0384T00000000000HlG&x&{DnX>c!Jc4cm4Z*nhVZ)|
-UJVQpbAcWG`jGA?j=P)h*<6ay3h000O8Q5kVecY9|c;spQzk{AF09{>OV0000000000q=8Mq1^{qra4
-%nWWo~3|axY_VY;SU5ZDB8WX>N37a&0bfc~DCM0u%!j0000808trnOeUOBmt6q>07U`-03QGV000000
-00000HlFz#s&azX>c!Jc4cm4Z*nhWX>)XJX<{#5UukY>bYEXCaCuNm0Rj{Q6aWAK2mnzTaZFzcb6{vH
-003d10012T0000000000005+c2FL~gaA|NaUv_0~WN&gWWNCABY-wUIV{dJ6VRSBVc~DCM0u%!j0000
-808trnOgaj~yuU6000_bW03QGV00000000000HlGb@&*8KX>c!Jc4cm4Z*nhWX>)XJX<{#AVRT_)VRL
-0JaCuNm0Rj{Q6aWAK2mnzTaZH0a;w>>1003Q5000~S0000000000005+cr6C6ZaA|NaUv_0~WN&gWWN
-CABY-wUIX>Md?crI{xP)h*<6ay3h000O8Q5kVe(ZzVLwlV+!MaKXD9{>OV0000000000q=67O2LNzsa
-4%nWWo~3|axY|Qb98KJVlQlOV_|e}a&s<lc~DCM0u%!j0000808trnOoo@Wn`{sO0NObK03QGV00000
-000000HlEfY6k#tX>c!Jc4cm4Z*nhWX>)XJX<{#JVQy(=Wpi{caCuNm0Rj{Q6aWAK2mnzTaZEiCt^$n
-*004>@0015U0000000000005+cta=9kaA|NaUv_0~WN&gWWNCABY-wUIZDDe2WpZ;aaCuNm0Rj{Q6aW
-AK2mnzTaZC-SZ1J}v006O<0018V0000000000005+cb%F-~aA|NaUv_0~WN&gWWNCABY-wUIZDn*}WM
-On+E^v8JO928D0~7!N00;n48F5U=w?&w!3jhEPDgXc=00000000000001_foY}(0B~t=FJE?LZe(wAF
-Jx(RbZlv2FLGsbZ*_8GWpgfYc~DCM0u%!j0000808trnOuGN;+X@l@0C+n903HAU00000000000HlFW
-vIhWgX>c!Jc4cm4Z*nhWX>)XJX<{#PV{&P5baO6nc~DCM0u%!j0000808trnO!b(M47{oU003M802=@
-R00000000000HlGH#0LOyX>c!Jc4cm4Z*nhWX>)XJX<{#QGcqn^cx6ya0Rj{Q6aWAK2mnzTaZH}##aU
-ap0001f0RS5S0000000000005+cif;%2aA|NaUv_0~WN&gWWNCABY-wUIbT%|DWq4&!O928D0~7!N00
-;n48F5TE*a0QCIsgFw&Hw-#00000000000001_fgUIc0B~t=FJE?LZe(wAFJx(RbZlv2FLiWjY%XwlP
-)h*<6ay3h000O8Q5kVep#23_uNeRUpIiU{9smFU0000000000q=61&2>@_ua4%nWWo~3|axY|Qb98KJ
-VlQ@Oa&u{KZZ2?nP)h*<6ay3h000O8Q5kVe*nI$rTBZO108Rk_8vp<R0000000000q=ET-2>@_ua4%n
-WWo~3|axY|Qb98KJVlQ_yGA?C!Wl&220u%!j0000808trnOkT`O?+vv8003|S02=@R00000000000Hl
-G8BMJa;X>c!Jc4cm4Z*nhWX>)XJX<{#THZ(3}cx6ya0Rj{Q6aWAK2mnzTaZF#-ps5Wd007IF000~S00
-00000000005+c(%1?BaA|NaUv_0~WN&gWWNCABY-wUIcW7m0Y%XwlP)h*<6ay3h000O8Q5kVeBkyPY!
-vFvP5&-}JDF6Tf0000000000q=6a!3IK3va4%nWWo~3|axY|Qb98KJVlQ7}VPk7>Z*p`mUtei%X>?y-
-E^v8JO928D0~7!N00;n48F5UniZ5l(0RRBY0{{Re00000000000001_fg}G40B~t=FJE?LZe(wAFJx(
-RbZlv2FJEF|V{344a&#|kX>(&PaCuNm0Rj{Q6aWAK2mnzTaZKW3J<vxS001v!001Wd0000000000005
-+cGyw|$aA|NaUv_0~WN&gWWNCABY-wUIUt(cnYjAIJbT4ygb#!TLE^v8JO928D0~7!N00;n48F5T+76
-7gG0RR9w3IG5r00000000000001_fxsOL0B~t=FJE?LZe(wAFJx(RbZlv2FJEF|V{344a&#|qd2?fLZ
-f0p`E@NhAP)h*<6ay3h000O8Q5kVeHV;zP=pFz7OKAWADgXcg0000000000q=Ek*3jlCwa4%nWWo~3|
-axY|Qb98KJVlQ7}VPk7>Z*p`mb9r-PZ*FF3XD)DgP)h*<6ay3h000O8Q5kVeL_!}!Vp#wH)M)_#C;$K
-e0000000000q=7F#3jlCwa4%nWWo~3|axY|Qb98KJVlQ7}VPk7>Z*p`mbYXI4X>4UKaCuNm0Rj{Q6aW
-AK2mnzTaZI9{nVhcy000aF001BW0000000000005+c*O&_caA|NaUv_0~WN&gWXmo9CHEd~OFJE72Zf
-SI1UoLQYP)h*<6ay3h000O8Q5kVe)p!o#B@_SvK|ufjApigX0000000000q=Cem3jlCwa4%nWWo~3|a
-xZ9fZEQ7cX<{#5X=q_|Wq56DE^v8JO928D0~7!N00;n48F5S=3~e=A9{>Ope*gd^00000000000001_
-fheyF0B~t=FJE?LZe(wAFKBdaY&C3YVlQ85Zg6#Ub98cLVQnsOc~DCM0u%!j0000808trnOvFZN7QY+
--03<5`03rYY00000000000HlG%&I<r=X>c!Jc4cm4Z*nhabZu-kY-wUIUvzJ4Wo~JDWpXZXc~DCM0u%
-!j0000808trnOeW*5SUd&*000mG03HAU00000000000HlG$>k9yIX>c!Jc4cm4Z*nhabZu-kY-wUIUv
-+e8Y;!Jfc~DCM0u%!j0000808trnOvt2t{s~9`0J}v203iSX00000000000HlFD@(TcPX>c!Jc4cm4Z
-*nhabZu-kY-wUIV{dMAbYX6Eb1rasP)h*<6ay3h000O8Q5kVeW7v1x%t8PFvdIAeBLDyZ0000000000
-q=AGw3;=Lxa4%nWWo~3|axZ9fZEQ7cX<{#EbZu-kaA9(DWpXZXc~DCM0u%!j0000808trnOx(x2G;<F
-C0AV)(03rYY00000000000HlGDeGC9_X>c!Jc4cm4Z*nhabZu-kY-wUIb7gXAVQgu7WpXZXc~DCM0u%
-!j0000808trnOz+dL52gSB03iVY044wc00000000000HlFLjSK*AX>c!Jc4cm4Z*nhabZu-kY-wUIUv
-zS5WiMY}X>MtBUtcb8c~DCM0u%!j0000808trnOw5%&mYe|q0Mi2i03!eZ00000000000HlE~jtl^BX
->c!Jc4cm4Z*nhabZu-kY-wUIUvzS5WiMZ1VRL0JaCuNm0Rj{Q6aWAK2mnzTaZDstovEe)005c<001Na
-0000000000005+c3y=%|aA|NaUv_0~WN&gWXmo9CHEd~OFJE+WX=N{DVRUk7WiD`eP)h*<6ay3h000O
-8Q5kVeOHXdj9RdIV?*;$>AOHXW0000000000q=EC13;=Lxa4%nWWo~3|axZ9fZEQ7cX<{#5baH8BFK~
-G-aCuNm0Rj{Q6aWAK2mnzTaZCUJ0006200000001Ze0000000000005+cPLvD)aA|NaUv_0~WN&gWXm
-o9CHEd~OFJ@_MbY*gLFJE72ZfSI1UoLQYP)h*<6ay3h000O8Q5kVeZqR&y9{~UWZ2|xQHUIzs000000
-0000q=A-{3;=Lxa4%nWWo~3|axZ9fZEQ7cX<{#CX>4?5a&s?XY;b5{Vr6t`V_|GzbaZlQVs&(7b1ras
-P)h*<6ay3h000O8Q5kVeB7pnEl>h($9svLVBme*a0000000000q=5;R3;=Lxa4%nWWo~3|axZ9fZEQ7
-cX<{#CX>4?5a&s?YVRL0JaCuNm0Rj{Q6aWAK2mnzTaZDk=JdC#j006cM001)p0000000000005+c;Fb
-&kaA|NaUv_0~WN&gWXmo9CHEd~OFJ@_MbY*gLFKKRSWn*+-ZDn*}Ut?%ta&u*LE^v8JO928D0~7!N00
-;n48F5T~>(aIN0ssId4FCWn00000000000001_f#{hG0B~t=FJE?LZe(wAFKBdaY&C3YVlQTCY;<LEb
-1!UZZgehic~DCM0u%!j0000808trnOd;)^B*_K<046B_04x9i00000000000HlE-oeThQX>c!Jc4cm4
-Z*nhabZu-kY-wUIW@&76WpZ;bZ*X*JZ*F01bYW+6E^v8JO928D0~7!N00;n48F5US9#oj`6#xJjVgLX
-s00000000000001_fi$EH0B~t=FJE?LZe(wAFKBdaY&C3YVlQTCY;<LEb1!pYZfSIBdS!AhaCuNm0Rj
-{Q6aWAK2mnzTaZI0%YOT-#0046Y001fg0000000000005+cYPt*naA|NaUv_0~WN&gWXmo9CHEd~OFJ
-@_MbY*gLFL!8ZbY*jJVPj=3aCuNm0Rj{Q6aWAK2mnzTaZG|TV<e9N007Vc001oj0000000000005+cg
-1ig>aA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWnpAtaCBvIb1z?CX>MtBUtcb8c~DCM0u%!j0000808trn
-Ofe_Nz7YZd022lP04o3h00000000000HlFjy$k?wX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7VPs)&bY*g
-LFK1<Lb7*NUaCuNm0Rj{Q6aWAK2mnzTaZKb~Ul1As004ak001Ze0000000000005+cw!aJjaA|NaUv_
-0~WN&gWXmo9CHEd~OFLZKcWnpAtaCBvIb1!pYcrI{xP)h*<6ay3h000O8Q5kVeN7*-S;{*TzP7MG6Ed
-T%j0000000000q=6Q~3;=Lxa4%nWWo~3|axZ9fZEQ7cX<{#Qa%E*=b!lv5WpZ;bUtei%X>?y-E^v8JO
-928D0~7!N00;n48F5TR%2uj!4gdglHUI!A00000000000001_fkej)0B~t=FJE?LZe(wAFKBdaY&C3Y
-VlQ-ZWo2S@X>4R=a&s?YVRL0JaCuNm0Rj{Q6aWAK2mnzTaZCv6F8JFA004s`001Ze0000000000005+
-c{nZQraA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWny({Y-D9}b1!6XZ7y(mP)h*<6ay3h000O8Q5kVep?#
-O|GYS9z+%W(EDgXcg0000000000q=6pZ3;=Lxa4%nWWo~3|axZ9fZEQ7cX<{#Qa%E*=b!lv5WpZ;bWp
-r|7WiD`eP)h*<6ay3h000O8Q5kVe+Wtz=Yz+VaQ8xepF8}}l0000000000q=A{}3;=Lxa4%nWWo~3|a
-xZ9fZEQ7cX<{#Qa%E*=b!lv5WpZ;bWpr|7WnXM~ZEP-Zc~DCM0u%!j0000808trnOmjpbmQ4l#0H_rJ
-04x9i00000000000HlFZ_6z`UX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bUtei%X>?y-E^v8
-JO928D0~7!N00;n48F5TaBbdOV1ONa_6951x00000000000001_f$97V0B~t=FJE?LZe(wAFKBdaY&C
-3YVlQ-ZWo36^Y-?q5b1!0Hb7d}Yc~DCM0u%!j0000808trnOl691srLZ@0EGnr04D$d00000000000H
-lG@0Sy3fX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bWN&RQaCuNm0Rj{Q6aWAK2mnzTaZDn?5
-HS)3002x9001cf0000000000005+c4FnAUaA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWp`n0Yh`kCFJ*Lc
-Wo0gKc~DCM0u%!j0000808trnOqLCtM`#8B0HqiJ04@Lk00000000000HlFt2@L>nX>c!Jc4cm4Z*nh
-abZu-kY-wUIbaG{7cVTR6WpZ;bWpr|7WnXM~ZEP-Zc~DCM0u%!j0000808trnOcP&i5Xb@m00jvE04e
-|g00000000000HlE$5DfruX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bXJu}4XlX8Rc~DCM0u
-%!j0000808trnOaMn*n==3a06G8w02}}S00000000000HlE`6Ab`xX>c!Jc4cm4Z*nhbWNu+EUtei%X
->?y-E^v8JO928D0~7!N00;n48F5VWNYv>X0{{Ty3;+Nb00000000000001_ftM2v0B~t=FJE?LZe(wA
-FKJ|MVJ~BEWMyM6aCuNm0Rj{Q6aWAK2mnzTaZG%HmT->%008I!000^Q0000000000005+c=oSqCaA|N
-aUv_0~WN&gWX=H9;FJo_QaA9;VaCuNm0Rj{Q6aWAK2mnzTaZCv=`f;=h004e0000;O0000000000005
-+cuNMsfaA|NaUv_0~WN&gWX=H9;FJo_VWiD`eP)h*<6ay3h000O8Q5kVeW4!ti4;%mh=YRkJ8~^|S00
-00000000q=A_t4FGUya4%nWWo~3|axZCQZecHJWNu+(VRT_GaCuNm0Rj{Q6aWAK2mnzTaZI;k^s?px0
-07kn0012T0000000000005+c;yw)kaA|NaUv_0~WN&gWX=H9;FKKRca$#;~WpgfYc~DCM0u%!j00008
-08trnOdIEYq89)F02KfL03ZMW00000000000HlEfLJa_LX>c!Jc4cm4Z*nhbWNu+EaA9L>VP|DuWMOn
-+E^v8JO928D0~7!N00;n48F5U>g@uJ~iU0s`(gFY-00000000000001_fmlKf0B~t=FJE?LZe(wAFKJ
-|MVJ~%bb2K(&VRT_GaCuNm0Rj{Q6aWAK2mnzTaZK}>BY=Vm005gL001BW0000000000005+c0nH5naA
-|NaUv_0~WN&gWY;R+0W@&6?FJE72ZfSI1UoLQYP)h*<6ay3h000O8Q5kVeE8g-aA_D*bTnYdHBme*a0
-000000000q=CWL4FGUya4%nWWo~3|axZLeV{2w<Y-KNOX>Mz5Z)0m_X>4UKaCuNm0Rj{Q6aWAK2mnzT
-aZDj5ynb^7000;a001Qb0000000000005+cCEE=EaA|NaUv_0~WN&gWY;R+0W@&6?FKugNX>x3DV{2w
-<Y-KKRc~DCM0u%!j0000808trnOdvdREgA>_0Lm8t03!eZ00000000000HlH2-VFe7X>c!Jc4cm4Z*n
-heZ)0m_X>4ULaA{<0Z)0m_X>4UKaCuNm0Rj{Q6aWAK2mnzTaZI~~@VyBI004p&001Tc000000000000
-5+cHs=ihaA|NaUv_0~WN&gWY;R+0W@&6?FLQBhX>?_5Z)0m_X>4UKaCuNm0Rj{Q6aWAK2mnzTaZHgT3
-E4dZ001}&001Wd0000000000005+cgX|3eaA|NaUv_0~WN&gWY;R+0W@&6?FLQZqY-w(5Y;R+0W@&6?
-E^v8JO928D0~7!N00;n48F5TJDOkpd0RRBd0ssIa00000000000001_fd%jl0B~t=FJE?LZe(wAFK}U
-FYhh<;Zf7rFUtwZzb#z}}E^v8JO928D0~7!N00;n48F5U3c9zN*0RR920ssIZ00000000000001_fzI
-&_0B~t=FJE?LZe(wAFK}UFYhh<;Zf7rFUukY>bYEXCaCuNm0Rj{Q6aWAK2mnzTaZKiEO5@7`003MA00
-1BW0000000000005+cCG!mcaA|NaUv_0~WN&gWaA9L>VP|P>XD?r4Z*6d4bS`jtP)h*<6ay3h000O8Q
-5kVe`u(I5a{&MVhy?%uBme*a0000000000q=7E=4FGUya4%nWWo~3|axZXUV{2h&X>MmPUvqSFbz^jO
-a%FQaaCuNm0Rj{Q6aWAK2mnzTaZG(ID^~>y001T+001BW0000000000005+c<Ms^zaA|NaUv_0~WN&g
-WaA9L>VP|P>XD@AGa%*LBb1rasP)h*<6ay3h000O8Q5kVet`VQ}cLo3e=MVq@B>(^b0000000000q=6
-;@4ghdza4%nWWo~3|axZXUV{2h&X>MmPa%FLKX>w(4Wo~qHE^v8JO928D0~7!N00;n48F5T}MT3lw7y
-tlyZ2$lx00000000000001_f#3%Y0B~t=FJE?LZe(wAFK}UFYhh<;Zf7rZaAjj@W@%+|b1rasP)h*<6
-ay3h000O8Q5kVe#p)*y5di=Ir2zl{9smFU0000000000q=B#?4ghdza4%nWWo~3|axZXUV{2h&X>MmP
-b#!TLb1rasP)h*<6ay3h000O8Q5kVe4)4aHVGRHPBrN~{AOHXW0000000000q=Ee*4ghdza4%nWWo~3
-|axZXUV{2h&X>MmPc4cyNX>V>WaCuNm0Rj{Q6aWAK2mnzTaZJfAKqgIX002Id0RSZc0000000000005
-+coG%UlaA|NaUv_0~WN&gWaBF8@a%FRGb#h~6b1z?CX>MtBUtcb8c~DCM0u%!j0000808trnO!``JjF
-JQZ0M82m03ZMW00000000000HlE|oeltSX>c!Jc4cm4Z*nhia&KpHWpi^cUtei%X>?y-E^v8JO928D0
-~7!N00;n48F5Sx!$t!%1ONbi3IG5b00000000000001_f&8Hk0B~t=FJE?LZe(wAFK}{iXL4n8b1!0H
-axQRrP)h*<6ay3h000O8Q5kVeDu3}X4+8)I-UR>v9{>OV0000000000q=9Ls4ghdza4%nWWo~3|axZX
-lZ)b94b8|0aZ*^{TWpXZXc~DCM0u%!j0000808trnOwQ~NPWuA@0456n03QGV00000000000HlGnsSW
-^eX>c!Jc4cm4Z*nhia&KpHWpi^cXk~10WpZ;aaCuNm0Rj{Q6aWAK2mnzTaZGmzQhVqE001Hd0018V00
-00000000005+c?X3;~aA|NaUv_0~WN&gWaB^>Fa%FRKFLQ8dZf<3AE^v8JO928D0~7!N00;n48F5S>#
-_lk^1pol|4FCWj00000000000001_ffBI}0B~t=FJE?LZe(wAFLGsZb!BsOb1z?CX>MtBUtcb8c~DCM
-0u%!j0000808trnOy7KYB?18e0JH%B03!eZ00000000000HlEpw+;YsX>c!Jc4cm4Z*nhkWpQ<7b98e
-rUte}*a&u{KZeL$6aCuNm0Rj{Q6aWAK2mnzTaZHG*IlB}B002k?001Wd0000000000005+cP`C~NaA|
-NaUv_0~WN&gWa%FLKWpi|MFJEbHbY*gGVQgP@bZKmJE^v8JO928D0~7!N00;n48F5S_P~K7z6aWAiQU
-CxT00000000000001_fvLI<0B~t=FJE?LZe(wAFLGsZb!BsOb1z|JVQ_S1a&s<lc~DCM0u%!j000080
-8trnOqgTnFBJv=09_aW02=@R00000000000HlHV&JF-@X>c!Jc4cm4Z*nhkWpQ<7b98erVQ^_KaCuNm
-0Rj{Q6aWAK2mnzTaZCfP@{&Xg0000c000~S0000000000005+cM%4}gaA|NaUv_0~WN&gWa%FLKWpi|
-MFJX0bXfAMhP)h*<6ay3h000O8Q5kVe1)<vY3pxS-@FD~N9{>OV0000000000q=CfX4ghdza4%nWWo~
-3|axZdaadl;LbaO9bVPj=-bS`jZZBR=A0u%!j0000808trnOoFna&n^J~0MP*e0384T00000000000H
-lEo8xa6-X>c!Jc4cm4Z*nhkWpQ<7b98erV`Xx5b1rasP)h*<6ay3h000O8Q5kVecgbN*R0041S_S|B9
-smFU0000000000q=9uD5dd&$a4%nWWo~3|axZdaadl;LbaO9bZ*6d4bS`jtP)h*<6ay3h000O8Q5kVe
-6GO=}cM|{rAV&ZI9{>OV0000000000q=5w=5dd&$a4%nWWo~3|axZdaadl;LbaO9bZ*Oa9WpgfYc~DC
-M0u%!j0000808trnO!>~~&?*D~04odt03rYY00000000000HlGrG7$i9X>c!Jc4cm4Z*nhkWpQ<7b98
-erWq4y{aCB*JZgVbhc~DCM0u%!j0000808trnOoSa^;&KE408<VC02}}S00000000000HlE<HxU4EX>
-c!Jc4cm4Z*nhkWpQ<7b98erXk~10E^v8JO928D0~7!N00;n48F5T`+M~*P0RRC10ssIV00000000000
-001_fzLY;0B~t=FJE?LZe(wAFLGsZb!BsOb1!IbZ)<ZdaCuNm0Rj{Q6aWAK2mnzTaZF`>M|2J*000Ap
-0015U0000000000005+cggp@eaA|NaUv_0~WN&gWa%FLKWpi|MFKusRWo&aUaCuNm0Rj{Q6aWAK2mnz
-TaZC-~@2*M#002w^001BW0000000000005+c&SMb(aA|NaUv_0~WN&gWa%FLKWpi|MFK}UFYhh<)b1r
-asP)h*<6ay3h000O8Q5kVeU!P`~MIHbEnri?6AOHXW0000000000q=8mt5dd&$a4%nWWo~3|axZdaad
-l;LbaO9rWpi_BZ*FrgaCuNm0Rj{Q6aWAK2mnzTaZEut*W&*K008?8001Na0000000000005+c*@F=Pa
-A|NaUv_0~WN&gWa%FLKWpi|MFLQKZbaiuIV{c?-b1rasP)h*<6ay3h000O8Q5kVe<{-)sd;|ah#0vlb
-A^-pY0000000000q=6cV5dd&$a4%nWWo~3|axZdaadl;LbaO9rbaHiLbairNb1rasP)h*<6ay3h000O
-8Q5kVeN5R=wogx4L1Z)5R9RL6T0000000000q=D9r5dd&$a4%nWWo~3|axZdaadl;LbaO9tbZKmJE^v
-8JO928D0~7!N00;n48F5UKKJ|xn1ONaf3jhEg00000000000001_fv&I-0B~t=FJE?LZe(wAFLiQkY-
-wUMFJE72ZfSI1UoLQYP)h*<6ay3h000O8Q5kVe02$MiS_}XH+$R74BLDyZ0000000000q=8_y5dd&$a
-4%nWWo~3|axZmqY;0*_GcR9bZ)|L3V{~b6ZgVbhc~DCM0u%!j0000808trnOkjkrrz;Qu0LwA}03iSX
-00000000000HlHY!4Uv(X>c!Jc4cm4Z*nhna%^mAVlyveZ*Fd7V{~b6ZZ2?nP)h*<6ay3h000O8Q5kV
-e7aAOIgC+m~9*O_}B>(^b0000000000q=9A95dd&$a4%nWWo~3|axZmqY;0*_GcRLrZf<2`bZKvHaBp
-vHE^v8JO928D0~7!N00;n48F5VVn#luz2mk=f82|tw00000000000001_fh+kD0B~t=FJE?LZe(wAFL
-iQkY-wUMFJ*XRWpH$9Z*FrgaCuNm0Rj{Q6aWAK2mnzTaZCX@jIu8W001`^0012T0000000000005+c>
-H!h}aA|NaUv_0~WN&gWb#iQMX<{=kW@%+?WOFWXc~DCM0u%!j0000808trnOxIn|7f=HL01*iQ03QGV
-00000000000HlFb2@(KsX>c!Jc4cm4Z*nhna%^mAVlyvhX>4V1Z*z1maCuNm0Rj{Q6aWAK2mnzTaZK>
-87?RKu007xP001HY0000000000005+c;S3T0aA|NaUv_0~WN&gWb#iQMX<{=kaBpvHZDDR<XJv9OaCu
-Nm0Rj{Q6aWAK2mnzTaZJiF<iwK)0024{0015U0000000000005+c@gEWZaA|NaUv_0~WN&gWb#iQMX<
-{=ka%FLKWpi{caCuNm0Rj{Q6aWAK2mnzTaZEo-f??Pg004Jc0018V0000000000005+cz$X#_aA|NaU
-v_0~WN&gWb#iQMX<{=ka%FRHZ*FsCE^v8JO928D0~7!N00;n48F5Si00002000000000d0000000000
-0001_fz?0~0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FJE72ZfSI1UoLQYP)h*<6ay3h000O8Q5kV
-e7{jfTgbV-xaVh`+C;$Ke0000000000q=6hk5&&>%a4%nWWo~3|axZmqY;0*_GcRLrZgg^KVlQEEaAj
-_1X>MgMaCuNm0Rj{Q6aWAK2mnzTaZE0yagC$}004dw001Wd0000000000005+c=1md+aA|NaUv_0~WN
-&gWb#iQMX<{=kV{dMBa%o~OZggyIaBpvHE^v8JO928D0~7!N00;n48F5VWDz<SK6954EI{*ME000000
-00000001_fzMMC0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FK~HpaAj_Db8Iefc~DCM0u%!j00008
-08trnOy^U;^J5?Y03~+-04@Lk00000000000HlE|XA%H#X>c!Jc4cm4Z*nhna%^mAVlyveZ*FvQX<{#
-PWn*=6Wpr|3ZgX&Na&#_mc~DCM0u%!j0000808trnOwdy)nK}mm05cc>03-ka00000000000HlH2hY|
-pAX>c!Jc4cm4Z*nhna%^mAVlyveZ*FvQX<{#PZ)0n7E^v8JO928D0~7!N00;n48F5Si000020000000
-00u00000000000001_fme?b0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FJE(IV|8+6baG*Cb8v5Rb
-T40DX>MtBUtcb8c~DCM0u%!j0000808trnOt)E!eOC_v0GLDo05|{u00000000000HlGhj}icIX>c!J
-c4cm4Z*nhna%^mAVlyveZ*FvQX<{#5b7f<7a%FUKVQzD9Z*p`mVrgz<X>Mn8E^v8JO928D0~7!N00;n
-48F5SmuiTJD4*&ojF8}~J00000000000001_fn1*w0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FJE
-(IV|8+6baG*Cb8v5RbT4dgcVBE}c4cfXaCuNm0Rj{Q6aWAK2mnzTaZHb0pnOmO003<O001Ze0000000
-000005+c_^uKFaA|NaUv_0~WN&gWb#iQMX<{=kaA9L>VP|D?FJE72ZfSI1UoLQYP)h*<6ay3h000O8Q
-5kVeM!}|M@CpC`=OO?AEC2ui0000000000q=AmF5&&>%a4%nWWo~3|axZmqY;0*_GcRyqV{2h&WpgiY
-a%5$4Wn^DuX=8LQaCuNm0Rj{Q6aWAK2mnzTaZH(5O<G7D005G8001KZ0000000000005+c$hr~$aA|N
-aUv_0~WN&gWb#iQMX<{=kaA9L>VP|D?FLP;lE^v8JO928D0~7!N00;n48F5Si00002000000000o000
-00000000001_fl=5J0B~t=FJE?LZe(wAFLiQkY-wUMFK}UFYhh<)b1!0HV{344a&&VqUtei%X>?y-E^
-v8JO928D0~7!N00;n48F5TfR~)%d0ssKD1pojt00000000000001_fuq<G0B~t=FJE?LZe(wAFLiQkY
--wUMFK}UFYhh<)b1!0HV{344a&&VqZDDI=W@&6?E^v8JO928D0~7!N00;n48F5VeZOY|80RRB70ssIz
-00000000000001_fkN970B~t=FJE?LZe(wAFLiQkY-wUMFK}UFYhh<)b1!pqY+r3*bYo~=Xm4|LZeeX
-@FJE72ZfSI1UoLQYP)h*<6ay3h000O8Q5kVewK|V0vIqbGMiu}7LI3~&0000000000q=DMp5&&>%a4%
-nWWo~3|axZmqY;0*_GcRyqV{2h&Wpgicb8KI2VRU0?UubW0bZ%j7WiMZ8ZE$R5ZDnqBVRUJ4ZZ2?nP)
-h*<6ay3h000O8Q5kVeQgz|KqyYc`6a)YOBme*a0000000000q=D?^5&&>%a4%nWWo~3|axZmqY;0*_G
-cR>?X>2cFUukY>bYEXCaCuNm0Rj{Q6aWAK2mnzTaZIb9Up<os004~;001Tc0000000000005+c(&rKY
-aA|NaUv_0~WN&gWb#iQMX<{=kb#!TLFJo_RZe?S1X>V>WaCuNm0Rj{Q6aWAK2mnzTaZEvBkk<hP004O
-o001KZ0000000000005+csqPX0aA|NaUv_0~WN&gWb#iQMX<{=kb#!TLFLGsZb!BsOE^v8JO928D0~7
-!N00;n48F5VXIUJwZ0{{Rg2><{j00000000000001_f$Q@U0B~t=FJE?LZe(wAFLiQkY-wUMFLiWjY%
-g+Ub8v5Nb7d}Yc~DCM0u%!j0000808trnOg&-m+lCPU00}t&03iSX00000000000HlEh_!0ncX>c!Jc
-4cm4Z*nhna%^mAVlyvwbZKlaa%FUKc`k5yP)h*<6ay3h000O8Q5kVeea|~R?h^n2n^FJ(B>(^b00000
-00000q=Cu_698~&a4%nWWo~3|axZmqY;0*_GcR>?X>2cZWo%_*bZ>HVE^v8JO928D0~7!N00;n48F5V
-2@5rKN5C8zMF8}}_00000000000001_f%_d30B~t=FJE?LZe(wAFLiQkY-wUMFLiWjY%g<jY+o*Lc~D
-CM0u%!j0000808trnOjT0OAae@<039X(03!eZ00000000000HlGRE)xK7X>c!Jc4cm4Z*nhna%^mAVl
-yvwbZKlabZKp6Z*_DoaCuNm0Rj{Q6aWAK2mnzTaZJM=Z4nF!0037R0018V0000000000005+cQ#um>a
-A|NaUv_0~WN&gWb#iQMX<{=kb#!TLFLiQkE^v8JO928D0~7!N00;n48F5UuJR|%80ssK31pojb00000
-000000001_ft*7V0B~t=FJE?LZe(wAFLiQkY-wUMFLiWjY%h0VX>=}dc~DCM0u%!j0000808trnOmD%
-VI4%nS08l9a03-ka00000000000HlH2MH2vUX>c!Jc4cm4Z*nhpWnyJ+V{c?>ZfA2ZUtei%X>?y-E^v
-8JO928D0~7!N00;n48F5U<tq6++1^@sPBLDy*00000000000001_flE;n0B~t=FJE?LZe(wAFLz~PWo
-~0{WNB_^b1!URVr6V|E^v8JO928D0~7!N00;n48F5Tde=#3K0ssIR1pojf00000000000001_fsj`d0
-B~t=FJE?LZe(wAFLz~PWo~0{WNB_^b1!XcY++($Y;!Jfc~DCM0u%!j0000808trnOct9y9l8Yo0HPTH
-03iSX00000000000HlEyS`z?pX>c!Jc4cm4Z*nhpWnyJ+V{c?>ZfA2ZbY*jNb1rasP)h*<6ay3h000O
-8Q5kVeNN+{Hqyzu}(hvXuDgXcg0000000000q=64$698~&a4%nWWo~3|axZsfVr6b)Z)9n1XLB!jUv+
-b3a$jU+W@&C^WG--dP)h*<6ay3h000O8Q5kVekPU}Jrvd-~#0UTY7ytkO0000000000q=EZn698~&a4
-%zTZEaz0WOFZHUukY>bYEXCaCuNm0Rj{Q6aWAK2mnzTaZDXyJ74Vq003qM000#L0000000000005+c*
-k=;}aA|NaV{dJ3VQyq|FJowBV{0yOc~DCM0u%!j0000808trnOfbRBvu6VU0F?;<02%-Q0000000000
-0HlHVX%hf&X>c!NZ*6U1Ze(*WV{dJ6Y-Mz5Z*DGdc~DCM0u%!j0000808trnOxYfprW6PO0D>L>02lx
-O00000000000HlGJZ4&@+X>c!NZ*6U1Ze(*WWN&wFY;R#?E^v8JO928D0~7!N00;n48F5U*_VZxb0{{
-RM3jhEX00000000000001_f#G!%0B~t=FJo_QZDDR?b1!CcWo3G0E^v8JO928D0~7!N00;n48F5VbiR
-`4k0ssI#1^@sQ00000000000001_f$n(|0B~t=FJo_QZDDR?b1!INb7(Gbc~DCM0u%!j0000808trnO
-db}{ovHx<0M-Kl02BZK00000000000HlH4d=mh0X>c!NZ*6U1Ze(*WXk~10E^v8JO928D0~7!N00;n4
-8F5TYC59HX4*&oJL;wI600000000000001_fw_JY0B~t=FJo_QZDDR?b1!Lbb97;BY%XwlP)h*<6ay3
-h000O8Q5kVe4@<{5zY72WX)FK$6aWAK0000000000q=BN2698~&a4%zTZEaz0WOFZUX>)WgaCuNm0Rj
-{Q6aWAK2mnzTaZIj4gxn?u005Q|000&M0000000000005+clbRC%aA|NaV{dJ3VQyq|FLPyKa${&NaC
-uNm0Rj{Q6aWAK2mnzTaZC(TA0+$+0009Q000yK0000000000005+c?Vu9?aA|NaV{dJ3VQyq|FLP*bc
-P?;wP)h*<6ay3h000O8Q5kVetBDyu&;tMfL<;}_82|tP0000000000q=6f#698~&a4%zTZEaz0WOFZd
-ZfS0FbYX04E^v8JO928D0~7!N00;n48F5UPH*@Cv2LJ#u9smFp00000000000001_fg-FE0B~t=FJo_
-QZDDR?b1!#jWo2wGaCuNm0Rj{Q6aWAK2mnzTaZH&fsd4NE002M|000&M0000000000005+cQM3~PaA|
-NaV{dJ6VRSEFUukY>bYEXCaCuNm0Rj{Q6aWAK2mnzTaZG}urI$?=001~z000;O0000000000005+cak
-~=$aA|NaV{dJ6VRSEKX=8L_Z*FF3XD)DgP)h*<6ay3h000O8Q5kVesv2j!K>z>%M*si-761SM000000
-0000q=EF%698~&a4&6dWMyn~FJE72ZfSI1UoLQYP)h*<6ay3h000O8Q5kVeXihS1;Q#;t=K%l!6951J
-0000000000q=9MC698~&a4&6dWMyn~FKKRMWq2-dc~DCM0u%!j0000808trnOaK4?00IC20000002%-
-Q00000000000HlF?(h~r1X>c!ZaAk5~bZKvHb1z?CX>MtBUtcb8c~DCM0u%!j0000808trnOwVOvsIC
-D305%2y02crN00000000000HlGn(h~r1X>c!ZaAk5~bZKvHb1!3PWn*hDaCuNm0Rj{Q6aWAK2mnzTaZ
-LFlGc$k%002r9000;O0000000000005+cnA8&haA|NaZ*XODVRUJ4ZgVeYa%E+DWiD`eP)h*<6ay3h0
-00O8Q5kVeTxrr7fB*mh6afGL6951J0000000000q=8P_698~&a4&LYaW7wAX>MtBUtcb8c~DCM0u%!j
-0000808trnOdQ~h3TX`h0G2KQ022TJ00000000000HlHc+7ke9X>c!cWpOWZWpQ6-X>4UKaCuNm0Rj{
-Q6aWAK2mnzTaZG`2Rm1l!005V@000&M0000000000005+cndlP$aA|Naa%FKZa%FK}X>N0LVQg$JaCu
-Nm0Rj{Q6aWAK2mnzTaZD23l6JEp005qb000sI0000000000005+c#1<3)aA|Naa%FKZa%FK}b7gccaC
-uNm0Rj{Q6aWAK2mnzTaZCk9#Bfju008kC000;O0000000000005+cr#KV<aA|Naa%FKZa%FK}b#7^Hb
-97;BY%XwlP)h*<6ay3h000O8Q5kVe;99i46CnTqGim?;6#xJL0000000000q=79#6aa8(a4&UqX>4;Z
-Utei%X>?y-E^v8JO928D0~7!N00;n48F5TC3f?=Z3IG6WA^-ps00000000000001_fpcOM0B~t=FLiW
-jY;!MRaByU4a&s<lc~DCM0u%!j0000808trnOw9~UE&u`m03Zbb01^NI00000000000HlFVZ4>}-X>c
-!fbZKmJFJg6RY-BEQc~DCM0u%!j0000808trnOmQA+BnATj0JsPM02lxO00000000000HlF_ZxjG<X>
-c!fbZKmJFJxtKa%E#-bZKvHE^v8JO928D0~7!N00;n48F5U#T0gM50RRBY0{{RO00000000000001_f
-x2=O0B~t=FLiWjY;!MVZewp`X>MmOaCuNm0Rj{Q6aWAK2mnzTaZK_<?ZBh~004sn000*N0000000000
-005+cr*sqmaA|Nab#!TLb1!CTY-MwKb97~GE^v8JO928D0~7!N00;n48F5S?HwARy1ONbg3jhET0000
-0000000001_fq-@t0B~t=FLiWjY;!MXY-wU+E^v8JO928D0~7!N00;n48F5UhH0cC=1ONas3jhEU000
-00000000001_fslI?0B~t=FLiWjY;!MYVRL9@b1rasP)h*<6ay3h000O8Q5kVeXC~KpvjhMD{|o>C6a
-WAK0000000000q=7zw6aa8(a4&UqX>4;ZY;R|0X>MmOaCuNm0Rj{Q6aWAK2mnzTaZE^5*y@P}002)F0
-00#L0000000000005+cBZU+IaA|Nab#!TLb1!dobYx+4Wn?aJc~DCM0u%!j0000808trnObzCexaR@@
-03Zke02TlM00000000000HlH6ixdEGX>c!fbZKmJFK}UFYhh<;Zf7oVc~DCM0u%!j0000808trnOctW
-@O1l6602ToN0384T00000000000HlHXjuZfJX>c!fbZKmJFLPydb#QcVZ)|g4Vs&Y3WG--dP)h*<6ay
-3h000O8Q5kVe<>HW)Vh#WRO)UTb4*&oF0000000000q=E2{6aa8(a4&UqX>4;Zb!jeec~DCM0u%!j00
-00808trnOvqNnOXCdy09G&n022TJ00000000000HlF`o)iFZX>c!gV{<QGUukY>bYEXCaCuNm0Rj{Q6
-aWAK2mnzTaZLNb%*8VW007$#000pH0000000000005+cldKc~aA|Nac4KodVqtn=VR9~Tc~DCM0u%!j
-0000808trnOentIFaQkz0KF>!01f~E00000000000HlHSu@nGsX>c!gV{<QOX>=}dc~DCM0u%!j0000
-808trnOnG8z9bp6j0FVs;02BZK00000000000HlE-zZ3v)X>c!gV{<QUWpZP6a%o{~E^v8JO928D0~7
-!N00;n48F5T*G?hUh3jhFyBme*v00000000000001_fwaRE0B~t=FLq;dFLQNbc4cyNX>V>WaCuNm0R
-j{Q6aWAK2mn<XaZIamG*=M<000LC001KZ0000000000005+c2hS7$aA|NYIW90RGA?9kb960fZf0*UL
-`73WQb|x$Nl#8La&vT0O928D0~7!N00;n88F5Us7nsB<0000)0000a00000000000001_fmzWM0B~t=
-EjcbQE;24;X>)WfX>Mk3FJ*3Ya(Q2HZ)t9Hb1rmvbWlqH0u%!j00008096@rO#g~?nt%cT038MZ03iS
-X00000000000HlG%(G&o1X>ct$E-)@KE@WwQbS-IaW^XTTWprU=VRT_GYIARHP)h*<6ay3h000O8RT*
-(i#~+u%1^@s61ONa4ApigX0000000000q=AIg6aa8(a4k75FfKAKWNCABEop9MZ!dIja9?a?c4cfXba
--@7O928D0~7!N00;n88F5VZ-O|2a0001P0000P00000000000001_fyvYq0B~t=EjcbQE;24;X>)WfX
->Mk3FIPxKMNCjj0Rj{Q6aWAK2mn<XaZLKZmmj4A008+3000~S0000000000005+cU)2-<aA|NYIW90R
-GA?9kb960fZf0*UO+{2eL_t(RP)h*<6ay3h000O8RT*(i5fKKgU@-sym|_3`8UO$Q0000000000q=7!
-!6aa8(a4k75FfKAKWNCABEop9MZ!c0sLr+pfP)h{{00000837pqf>i(j)(RB>000
-"""
-
-
-if __name__ == "__main__":
-    main()
diff --git a/vendor/pip-9.0.3/AUTHORS.txt b/vendor/pip-9.0.3/AUTHORS.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7859b7c3109861c8a061a949cbba2559d5ce7fcd
--- /dev/null
+++ b/vendor/pip-9.0.3/AUTHORS.txt
@@ -0,0 +1,329 @@
+Adam Chainz <adam@adamj.eu>
+Adam Wentz <awentz@theonion.com>
+Aleks Bunin <github@compuix.com>
+Alex Gaynor <alex.gaynor@gmail.com>
+Alex Grönholm <alex.gronholm@nextday.fi>
+Alex Morega <alex@grep.ro>
+Alex Stachowiak <alexander@computer.org>
+Alexandre Conrad <alexandre.conrad@gmail.com>
+Alli <alzeih@users.noreply.github.com>
+Anatoly Techtonik <techtonik@gmail.com>
+Andrei Geacar <andrei.geacar@gmail.com>
+Andrey Bulgakov <mail@andreiko.ru>
+Andy Freeland <andy.freeland@redjack.com>
+Andy Kluger <AndydeCleyre@users.noreply.github.com>
+Anrs Hu <anrs@douban.com>
+Antoine Musso <hashar@free.fr>
+Anton Ovchinnikov <revolver112@gmail.com>
+Anton Patrushev <apatrushev@gmail.com>
+Antonio Alvarado Hernandez <tnotstar@gmail.com>
+Antti Kaihola <akaihol+github@ambitone.com>
+AQNOUCH Mohammed <aqnouch.mohammed@gmail.com>
+Arindam Choudhury <arindam@live.com>
+Armin Ronacher <armin.ronacher@active-4.com>
+Ashley Manton <ajd.manton@googlemail.com>
+Baptiste Mispelon <bmispelon@gmail.com>
+Ben Darnell <ben@bendarnell.com>
+Ben Rosser <rosser.bjr@gmail.com>
+Bence Nagy <bence@underyx.me>
+Benjamin VanEvery <ben@simondata.com>
+Berker Peksag <berker.peksag@gmail.com>
+Bernardo B. Marques <bernardo.fire@gmail.com>
+Bogdan Opanchuk <bogdan@opanchuk.net>
+Brad Erickson <eosrei@gmail.com>
+Bradley Ayers <bradley.ayers@gmail.com>
+Brian Rosner <brosner@gmail.com>
+Bruno Oliveira <nicoddemus@gmail.com>
+Bruno Renié <brutasse@gmail.com>
+Buck Golemon <buck@yelp.com>
+burrows <burrows@preveil.com>
+Bussonnier Matthias <bussonniermatthias@gmail.com>
+c22 <c22@users.noreply.github.com>
+Calvin Smith <eukaryote@users.noreply.github.com>
+Carl Meyer <carl@oddbird.net>
+Carlos Liam <carlos@aarzee.me>
+Carol Willing <carolcode@willingconsulting.com>
+Carter Thayer <carterwthayer@gmail.com>
+Cass <cass.petrus@gmail.com>
+Chandrasekhar Atina <chandu.atina@gmail.com>
+Chris Brinker <chris.brinker@gmail.com>
+Chris Jerdonek <chris.jerdonek@gmail.com>
+Chris McDonough <chrism@plope.com>
+Chris Wolfe <chriswwolfe@gmail.com>
+Christian Oudard <christian.oudard@gmail.com>
+Christopher Snyder <cnsnyder@users.noreply.github.com>
+Clark Boylan <clark.boylan@gmail.com>
+Clay McClure <clay@daemons.net>
+Cody <Purring@users.noreply.github.com>
+Cody Soyland <codysoyland@gmail.com>
+Colin Watson <cjwatson@debian.org>
+Connor Osborn <cdosborn@email.arizona.edu>
+Cory Benfield <lukasaoz@gmail.com>
+Cory Wright <corywright@gmail.com>
+Craig Kerstiens <craig.kerstiens@gmail.com>
+Cristian Sorinel <cristian.sorinel@gmail.com>
+Dan Savilonis <djs@n-cube.org>
+Dan Sully <daniel-github@electricrain.com>
+daniel <mcdonaldd@unimelb.edu.au>
+Daniel Collins <accounts@dac.io>
+Daniel Hahler <git@thequod.de>
+Daniel Holth <dholth@fastmail.fm>
+Daniel Jost <torpedojost@gmail.com>
+Daniele Procida <daniele@vurt.org>
+Dav Clark <davclark@gmail.com>
+Dave Abrahams <dave@boostpro.com>
+David Aguilar <davvid@gmail.com>
+David Black <db@d1b.org>
+David Caro <david@dcaro.es>
+David Evans <d@drhevans.com>
+David Linke <dr.david.linke@gmail.com>
+David Pursehouse <david.pursehouse@gmail.com>
+David Wales <daviewales@gmail.com>
+Davidovich <david.genest@gmail.com>
+derwolfe <chriswwolfe@gmail.com>
+Dmitry Gladkov <dmitry.gladkov@gmail.com>
+Domen Kožar <domen@dev.si>
+Donald Stufft <donald@stufft.io>
+Dongweiming <dongweiming@admaster.com.cn>
+Douglas Thor <dougthor42@users.noreply.github.com>
+Dwayne Bailey <dwayne@translate.org.za>
+Ed Morley <emorley@mozilla.com>
+Emil Styrke <emil.styrke@gmail.com>
+Endoh Takanao <djmchl@gmail.com>
+enoch <lanxenet@gmail.com>
+Eric Gillingham <Gillingham@bikezen.net>
+Eric Hanchrow <eric.hanchrow@gmail.com>
+Erik M. Bray <embray@stsci.edu>
+Erik Rose <erik@mozilla.com>
+Eugene Vereshchagin <evvers@gmail.com>
+Florian Briand <ownerfrance+github@hotmail.com>
+Francesco <f.guerrieri@gmail.com>
+Francesco Montesano <franz.bergesund@gmail.com>
+Gabriel de Perthuis <g2p.code@gmail.com>
+Garry Polley <garrympolley@gmail.com>
+Geoffrey Lehée <geoffrey@lehee.name>
+Geoffrey Sneddon <me@gsnedders.com>
+George Song <george@55minutes.com>
+Georgi Valkov <georgi.t.valkov@gmail.com>
+gizmoguy1 <gizmoguy1@gmail.com>
+Guilherme Espada <porcariadagata@gmail.com>
+Guy Rozendorn <guy@rzn.co.il>
+Herbert Pfennig <herbert@albinen.com>
+Hsiaoming Yang <lepture@me.com>
+Hugo Lopes Tavares <hltbra@gmail.com>
+Hynek Schlawack <hs@ox.cx>
+Ian Bicking <ianb@colorstudy.com>
+Ian Cordasco <graffatcolmingov@gmail.com>
+Ian Lee <IanLee1521@gmail.com>
+Ian Wienand <ian@wienand.org>
+Ian Wienand <iwienand@redhat.com>
+Igor Sobreira <igor@igorsobreira.com>
+Ilya Baryshev <baryshev@gmail.com>
+INADA Naoki <songofacandy@gmail.com>
+Ionel Cristian Mărieș <contact@ionelmc.ro>
+Ionel Maries Cristian <ionel.mc@gmail.com>
+Jakub Stasiak <kuba.stasiak@gmail.com>
+Jakub Vysoky <jakub@borka.cz>
+Jakub Wilk <jwilk@jwilk.net>
+James Cleveland <jamescleveland@gmail.com>
+James Cleveland <radiosilence@users.noreply.github.com>
+James Firth <hello@james-firth.com>
+James Polley <jp@jamezpolley.com>
+Jan Pokorný <jpokorny@redhat.com>
+Jannis Leidel <jannis@leidel.info>
+jarondl <me@jarondl.net>
+Jason R. Coombs <jaraco@jaraco.com>
+Jay Graves <jay@skabber.com>
+Jeff Barber <jbarber@computer.org>
+Jeff Dairiki <dairiki@dairiki.org>
+Jeremy Stanley <fungi@yuggoth.org>
+Jim Garrison <jim@garrison.cc>
+Jivan Amara <Development@JivanAmara.net>
+John-Scott Atlakson <john.scott.atlakson@gmail.com>
+Jon Banafato <jon@jonafato.com>
+Jon Parise <jon@indelible.org>
+Jon Wayne Parrott <jjramone13@gmail.com>
+Jonas Nockert <jonasnockert@gmail.com>
+Joost Molenaar <j.j.molenaar@gmail.com>
+Jorge Niedbalski <niedbalski@gmail.com>
+Joseph Long <jdl@fastmail.fm>
+Josh Bronson <jabronson@gmail.com>
+Josh Hansen <josh@skwash.net>
+Josh Schneier <josh.schneier@gmail.com>
+Julien Demoor <julien@jdemoor.com>
+jwg4 <jack.grahl@yahoo.co.uk>
+Jyrki Pulliainen <jyrki@spotify.com>
+Kamal Bin Mustafa <kamal@smach.net>
+kaustav haldar <hi@kaustav.me>
+Kelsey Hightower <kelsey.hightower@gmail.com>
+Kenneth Belitzky <kenny@belitzky.com>
+Kenneth Reitz <me@kennethreitz.com>
+Kenneth Reitz <me@kennethreitz.org>
+Kevin Burke <kev@inburke.com>
+Kevin Carter <kevin.carter@rackspace.com>
+Kevin Frommelt <kevin.frommelt@webfilings.com>
+Kit Randel <kit@nocturne.net.nz>
+Kumar McMillan <kumar.mcmillan@gmail.com>
+Kyle Persohn <kyle.persohn@gmail.com>
+Laurent Bristiel <laurent@bristiel.com>
+Leon Sasson <leonsassonha@gmail.com>
+Lev Givon <lev@columbia.edu>
+Lincoln de Sousa <lincoln@comum.org>
+Lipis <lipiridis@gmail.com>
+Ludovic Gasc <gmludo@gmail.com>
+Luke Macken <lmacken@redhat.com>
+Marc Abramowitz <marc@marc-abramowitz.com>
+Marc Tamlyn <marc.tamlyn@gmail.com>
+Marcus Smith <qwcode@gmail.com>
+Mark Kohler <mark.kohler@proteinsimple.com>
+Markus Hametner <fin+github@xbhd.org>
+Masklinn <bitbucket.org@masklinn.net>
+Matej Stuchlik <mstuchli@redhat.com>
+Mathew Jennings <mjennings@foursquare.com>
+Matt Good <matt@matt-good.net>
+Matt Maker <trip@monstro.us>
+Matt Robenolt <matt@ydekproductions.com>
+matthew <matthew@trumbell.net>
+Matthew Einhorn <moiein2000@gmail.com>
+Matthew Gilliard <matthew.gilliard@gmail.com>
+Matthew Iversen <teh.ivo@gmail.com>
+Matthew Trumbell <matthew@thirdstonepartners.com>
+Matthias Bussonnier <bussonniermatthias@gmail.com>
+Maxim Kurnikov <maxim.kurnikov@gmail.com>
+Maxime Rouyrre <rouyrre+git@gmail.com>
+memoselyk <memoselyk@gmail.com>
+Michael <michael-k@users.noreply.github.com>
+Michael Aquilina <michaelaquilina@gmail.com>
+Michael E. Karpeles <michael.karpeles@gmail.com>
+Michael Klich <michal@michalklich.com>
+Michael Williamson <mike@zwobble.org>
+michaelpacer <michaelpacer@gmail.com>
+Miguel Araujo Perez <miguel.araujo.perez@gmail.com>
+Mihir Singh <git.service@mihirsingh.com>
+Min RK <benjaminrk@gmail.com>
+MinRK <benjaminrk@gmail.com>
+montefra <franz.bergesund@gmail.com>
+Monty Taylor <mordred@inaugust.com>
+Nate Coraor <nate@bx.psu.edu>
+Nathaniel J. Smith <njs@pobox.com>
+Nick Coghlan <ncoghlan@gmail.com>
+Nick Stenning <nick@whiteink.com>
+Nowell Strite <nowell@strite.org>
+nvdv <modestdev@gmail.com>
+Ofekmeister <ofekmeister@gmail.com>
+Oliver Tonnhofer <olt@bogosoft.com>
+Olivier Girardot <ssaboum@gmail.com>
+Olivier Grisel <olivier.grisel@ensta.org>
+Ollie Rutherfurd <orutherfurd@gmail.com>
+Oren Held <orenhe@il.ibm.com>
+Oscar Benjamin <oscar.j.benjamin@gmail.com>
+Patrick Dubroy <pdubroy@gmail.com>
+Patrick Jenkins <patrick@socialgrowthtechnologies.com>
+Patrick Lawson <pl@foursquare.com>
+patricktokeeffe <patricktokeeffe@users.noreply.github.com>
+Paul Moore <p.f.moore@gmail.com>
+Paul Nasrat <pnasrat@gmail.com>
+Paul Oswald <pauloswald@gmail.com>
+Paul van der Linden <mail@paultjuh.org>
+Paulus Schoutsen <paulus@paulusschoutsen.nl>
+Pawel Jasinski <pawel.jasinski@gmail.com>
+Pekka Klärck <peke@iki.fi>
+Peter Waller <peter.waller@gmail.com>
+Phaneendra Chiruvella <hi@pcx.io>
+Phil Freo <phil@philfreo.com>
+Phil Whelan <phil123@gmail.com>
+Philippe Ombredanne <pombredanne@gmail.com>
+Pierre-Yves Rofes <github@rofes.fr>
+Piet Delport <pjdelport@gmail.com>
+Pradyun <pradyunsg@users.noreply.github.com>
+Pradyun S. Gedam <pradyunsg@gmail.com>
+Preston Holmes <preston@ptone.com>
+Przemek Wrzos <hetmankp@none>
+Qiangning Hong <hongqn@gmail.com>
+Rafael Caricio <rafael.jacinto@gmail.com>
+Ralf Schmitt <ralf@systemexit.de>
+Razzi Abuissa <razzi53@gmail.com>
+Remi Rampin <remirampin@gmail.com>
+Rene Dudfield <renesd@gmail.com>
+Richard Jones <r1chardj0n3s@gmail.com>
+RobberPhex <robberphex@gmail.com>
+Robert Collins <rbtcollins@hp.com>
+Robert McGibbon <rmcgibbo@gmail.com>
+Robert T. McGibbon <rmcgibbo@gmail.com>
+Roey Berman <roey.berman@gmail.com>
+Rohan Jain <crodjer@gmail.com>
+Rohan Jain <crodjer@users.noreply.github.com>
+Rohan Jain <mail@rohanjain.in>
+Roman Bogorodskiy <roman.bogorodskiy@ericsson.com>
+Romuald Brunet <romuald@chivil.com>
+Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
+Rory McCann <rory@technomancy.org>
+Ross Brattain <ross.b.brattain@intel.com>
+Roy Wellington â…£ <cactus_hugged@yahoo.com>
+Roy Wellington â…£ <roy@mybasis.com>
+Ryan Wooden <rygwdn@gmail.com>
+ryneeverett <ryneeverett@gmail.com>
+Sachi King <nakato@nakato.io>
+Salvatore Rinchiera <salvatore@rinchiera.com>
+schlamar <marc.schlaich@gmail.com>
+Scott Kitterman <sklist@kitterman.com>
+seanj <seanj@xyke.com>
+Sebastian Schaetz <sschaetz@butterflynetinc.com>
+Sergey Vasilyev <nolar@nolar.info>
+Seth Woodworth <seth@sethish.com>
+Simeon Visser <svisser@users.noreply.github.com>
+Simon Cross <hodgestar@gmail.com>
+Simon Pichugin <simon.pichugin@gmail.com>
+Sorin Sbarnea <sorin.sbarnea@gmail.com>
+Stavros Korokithakis <stavros@korokithakis.net>
+Stefan Scherfke <stefan@sofa-rockers.org>
+Stephan Erb <stephan@dev.static-void.de>
+stepshal <nessento@openmailbox.org>
+Steve (Gadget) Barnes <gadgetsteve@hotmail.com>
+Steve Barnes <gadgetsteve@hotmail.com>
+Steve Kowalik <steven@wedontsleep.org>
+Steven Myint <git@stevenmyint.com>
+stonebig <stonebig34@gmail.com>
+Stéphane Bidoul (ACSONE) <stephane.bidoul@acsone.eu>
+Stéphane Bidoul <stephane.bidoul@acsone.eu>
+Stéphane Klein <contact@stephane-klein.info>
+Takayuki SHIMIZUKAWA <shimizukawa@gmail.com>
+Thomas Fenzl <thomas.fenzl@gmail.com>
+Thomas Grainger <tagrain@gmail.com>
+Thomas Guettler <tguettler@tbz-pariv.de>
+Thomas Johansson <devnull@localhost>
+Thomas Kluyver <takowl@gmail.com>
+Thomas Smith <smithtg@ncbi.nlm.nih.gov>
+Tim D. Smith <github@tim-smith.us>
+Tim Harder <radhermit@gmail.com>
+Tim Heap <tim@timheap.me>
+tim smith <github@tim-smith.us>
+tinruufu <tinruufu@gmail.com>
+Tom V <tom@viner.tv>
+Tomer Chachamu <tomer.chachamu@gmail.com>
+Tony Zhaocheng Tan <tony@tonytan.io>
+Toshio Kuratomi <toshio@fedoraproject.org>
+Travis Swicegood <development@domain51.com>
+Valentin Haenel <valentin.haenel@gmx.de>
+Victor Stinner <victor.stinner@gmail.com>
+Victor Stinner <vstinner@redhat.com>
+Viktor Szépe <viktor@szepe.net>
+Ville Skyttä <ville.skytta@iki.fi>
+Vinay Sajip <vinay_sajip@yahoo.co.uk>
+Vitaly Babiy <vbabiy86@gmail.com>
+Vladimir Rutsky <rutsky@users.noreply.github.com>
+W. Trevor King <wking@drexel.edu>
+Wil Tan <wil@dready.org>
+Wilfred Hughes <me@wilfred.me.uk>
+William ML Leslie <william.leslie.ttg@gmail.com>
+Wolfgang Maier <wolfgang.maier@biologie.uni-freiburg.de>
+Xavier Fernandez <xav.fernandez@gmail.com>
+Xavier Fernandez <xavier.fernandez@polyconseil.fr>
+YAMAMOTO Takashi <yamamoto@midokura.com>
+Yen Chi Hsuan <yan12125@gmail.com>
+Yoval P <yoval@gmx.com>
+Yu Jian <askingyj@gmail.com>
+Zearin <zearin@gonk.net>
+Zearin <Zearin@users.noreply.github.com>
+Zhiping Deng <kofreestyler@gmail.com>
+Zvezdan Petkovic <zpetkovic@acm.org>
diff --git a/vendor/pip-9.0.3/CHANGES.txt b/vendor/pip-9.0.3/CHANGES.txt
new file mode 100644
index 0000000000000000000000000000000000000000..436631ad09f11b2167e5b182bcc0a4486a14b149
--- /dev/null
+++ b/vendor/pip-9.0.3/CHANGES.txt
@@ -0,0 +1,1775 @@
+**9.0.3 (2018-03-21)**
+
+* Fix an error where the vendored requests was not correctly containing itself
+  to only the internal vendored prefix.
+
+* Restore compatability with 2.6.
+
+
+**9.0.2 (2018-03-16)**
+
+* Fallback to using SecureTransport on macOS when the linked OpenSSL is too old
+  to support TLSv1.2.
+
+
+**9.0.1 (2016-11-06)**
+
+* Correct the deprecation message when not specifying a --format so that it
+  uses the correct setting name (``format``) rather than the incorrect one
+  (``list_format``) (:issue:`4058`).
+
+* Fix ``pip check`` to check all available distributions and not just the
+  local ones (:issue:`4083`).
+
+* Fix a crash on non ASCII characters from `lsb_release` (:issue:`4062`).
+
+* Fix an SyntaxError in an an used module of a vendored dependency
+  (:issue:`4059`).
+
+* Fix UNC paths on Windows (:issue:`4064`).
+
+
+**9.0.0 (2016-11-02)**
+
+* **BACKWARD INCOMPATIBLE** Remove the attempted autodetection of requirement
+  names from URLs, URLs must include a name via ``#egg=``.
+
+* **DEPRECATION** ``pip install --egg`` have been deprecated and will be
+  removed in the future. This "feature" has a long list of drawbacks which
+  break nearly all of pip's other features in subtle and hard-to-diagnose
+  ways.
+
+* **DEPRECATION** ``--default-vcs`` option (:issue:`4052`).
+
+* **WARNING** pip 9 cache can break forward compatibility with previous pip
+  versions if your package repository allows chunked responses (:issue:`4078`).
+
+* Add a ``pip check`` command to check installed packages dependencies
+  (:pull:`3750`).
+
+* Add option allowing user to abort pip operation if file/directory exists
+
+* Add Appveyor CI
+
+* Uninstall existing packages when performing an editable installation of
+  the same packages (:issue:`1548`).
+
+* ``pip show`` is less verbose by default. ``--verbose`` prints multiline fields.
+  (:pull:`3858`).
+
+* Add optional column formatting to ``pip list`` (:issue:`3651`).
+
+* Add ``--not-required`` option to ``pip list``, which lists packages that are
+  not dependencies of other packages.
+
+* Fix builds on systems with symlinked ``/tmp`` directory for custom
+  builds such as numpy (:pull:`3701`).
+
+* Fix regression in ``pip freeze``: when there is more than one git remote,
+  priority is given to the remote named ``origin`` (:pull:`3708`, :issue:`3616`).
+
+* Fix crash when calling ``pip freeze`` with invalid requirement installed
+  (:pull:`3704`, :issue:`3681`).
+
+* Allow multiple ``--requirement`` files in ``pip freeze`` (:pull:`3703`).
+
+* Implementation of pep-503 ``data-requires-python``. When this field is
+  present for a release link, pip will ignore the download when
+  installing to a Python version that doesn't satisfy the requirement.
+
+* ``pip wheel`` now works on editable packages too (it was only working on
+  editable dependencies before); this allows running ``pip wheel`` on the result
+  of ``pip freeze`` in presence of editable requirements (:pull:`3695`,
+  :issue:`3291`).
+
+* Load credentials from ``.netrc`` files (:pull:`3715`, :issue:`3569`).
+
+* Add ``--platform``, ``--python-version``, ``--implementation`` and ``--abi`` parameters to
+  ``pip download``. These allow utilities and advanced users to gather
+  distributions for interpreters other than the one pip is being run on.
+  (:pull:`3760`)
+
+* Skip scanning virtual environments, even when venv/bin/python is a dangling
+  symlink.
+
+* Added ``pip completion`` support for the ``fish`` shell.
+
+* Fix problems on Windows on Python 2 when username or hostname contains
+  non-ASCII characters (:issue:`3463`, :pull:`3970`, :pull:`4000`).
+
+* Use ``git fetch --tags`` to fetch tags in addition to everything else that
+  is normally fetched; this is necessary in case a git requirement url
+  points to a tag or commit that is not on a branch (:pull:`3791`)
+
+* Normalize package names before using in ``pip show`` (:issue:`3976`)
+
+* Raise when Requires-Python do not match the running version and add
+  ``--ignore-requires-python`` option as escape hatch (:pull:`3846`).
+
+* Report the correct installed version when performing an upgrade in some
+  corner cases (:issue:`2382`)
+
+* Add ``-i`` shorthand for ``--index`` flag in ``pip search``
+
+* Do not optionally load C dependencies in requests (:issue:`1840`,
+  :issue:`2930`, :issue:`3024`)
+
+* Strip authentication from SVN url prior to passing it to ``svn``
+  (:pull:`3697`, :issue:`3209`).
+
+* Also install in platlib with ``--target`` option (:pull:`3694`, :issue:`3682`).
+
+* Restore the ability to use inline comments in requirements files passed to
+  ``pip freeze`` (:issue:`3680`).
+
+
+**8.1.2 (2016-05-10)**
+
+* Fix a regression on systems with uninitialized locale (:issue:`3575`).
+
+* Use environment markers to filter packages before determining if a
+  required wheel is supported. Solves (:issue:`3254`).
+
+* Make glibc parsing for `manylinux1` support more robust for the variety of
+  glibc versions found in the wild (:issue:`3588`).
+
+* Update environment marker support to fully support PEP 508 and legacy
+  environment markers (:issue:`3624`).
+
+* Always use debug logging to the ``--log`` file (:issue:`3351`).
+
+* Don't attempt to wrap search results for extremely narrow terminal windows
+  (:issue:`3655`).
+
+
+**8.1.1 (2016-03-17)**
+
+* Fix regression with non-ascii requirement files on Python 2 and add support
+  for encoding headers in requirement files (:issue:`3548`, :pull:`3547`).
+
+
+**8.1.0 (2016-03-05)**
+
+* Implement PEP 513, which adds support for the manylinux1 platform tag,
+  allowing carefully compiled binary wheels to be installed on compatible Linux
+  platforms.
+
+* Allow wheels which are not specific to a particular Python interpreter but
+  which are specific to a particular platform (:issue:`3202`).
+
+* Fixed an issue where ``call_subprocess`` would crash trying to print debug
+  data on child process failure (:issue:`3521`, :pull:`3522`).
+
+* Exclude the wheel package from the `pip freeze` output (like pip and setuptools).
+  :issue:`2989`.
+
+* Allow installing modules from a subdirectory of a vcs repository
+  in non-editable mode (:issue:`3217`, :pull:`3466`).
+
+* Make pip wheel and pip download work with vcs urls with subdirectory option
+  (:pull:`3466`).
+
+* Show classifiers in ``pip show``.
+
+* Show PEP376 Installer in ``pip show`` (:issue:`3517`).
+
+* Unhide completion command (:pull:`1810`).
+
+* Show latest version number in ``pip search`` results (:pull:`1415`).
+
+* Decode requirement files according to their BOM if present (:pull:`3485`,
+  :issue:`2865`).
+
+* Fix and deprecate package name detection from url path (:issue:`3523` and
+  :pull:`3495`).
+
+* Correct the behavior where interpreter specific tags (such as cp34) were
+  being used on later versions of the same interpreter instead of only for that
+  specific interpreter (:issue:`3472`).
+
+* Fix an issue where pip would erroneously install a 64 bit wheel on a 32 bit
+  Python running on a 64 bit macOS machine.
+
+* Do not assume that all git repositories have an origin remote.
+
+* Correctly display the line to add to a requirements.txt for an URL based
+  dependency when ``--require-hashes`` is enabled.
+
+
+**8.0.3 (2016-02-25)**
+
+* Make ``install --quiet`` really quiet. See :issue:`3418`.
+
+* Fix a bug when removing packages in python 3: disable INI-style parsing of the
+  entry_point.txt file to allow entry point names with colons (:pull:`3434`)
+
+* Normalize generated script files path in RECORD files. (:pull:`3448`)
+
+* Fix bug introduced in 8.0.0 where subcommand output was not shown,
+  even when the user specified ``-v`` / ``--verbose``. :issue:`3486`.
+
+* Enable python -W with respect to PipDeprecationWarning. (:pull:`3455`)
+
+* Upgrade distlib to 0.2.2 (fix :issue:`3467`):
+
+  * Improved support for Jython when quoting executables in output scripts.
+
+* Add a `--all` option to `pip freeze` to include usually skipped package
+  (like pip, setuptools and wheel) to the freeze output. :issue:`1610`.
+
+
+**8.0.2 (2016-01-21)**
+
+* Stop attempting to trust the system CA trust store because it's extremely
+  common for them to be broken, often in incompatible ways. See :pull:`3416`.
+
+
+**8.0.1 (2016-01-21)**
+
+* Detect CAPaths in addition to CAFiles on platforms that provide them.
+
+* Installing argparse or wsgiref will no longer warn or error - pip will allow
+  the installation even though it may be useless (since the installed thing
+  will be shadowed by the standard library).
+
+* Upgrading a distutils installed item that is installed outside of a virtual
+  environment, while inside of a virtual environment will no longer warn or
+  error.
+
+* Fix a bug where pre-releases were showing up in ``pip list --outdated``
+  without the ``--pre`` flag.
+
+* Switch the SOABI emulation from using RuntimeWarnings to debug logging.
+
+* Rollback the removal of the ability to uninstall distutils installed items
+  until a future date.
+
+
+**8.0.0 (2016-01-19)**
+
+* **BACKWARD INCOMPATIBLE** Drop support for Python 3.2.
+
+* **BACKWARD INCOMPATIBLE** Remove the ability to find any files other than the
+  ones directly linked from the index or find-links pages.
+
+* **BACKWARD INCOMPATIBLE** Remove the ``--download-cache`` which had been
+  deprecated and no-op'd in 6.0.
+
+* **BACKWARD INCOMPATIBLE** Remove the ``--log-explicit-levels`` which had been
+  deprecated in 6.0.
+
+* **BACKWARD INCOMPATIBLE** Change pip wheel --wheel-dir default path from
+  <cwd>/wheelhouse to <cwd>.
+
+* Deprecate and no-op the ``--allow-external``, ``--allow-all-external``, and
+  ``--allow-unverified`` functionality that was added as part of PEP 438. With
+  changes made to the repository protocol made in PEP 470, these options are no
+  longer functional.
+
+* Allow ``--trusted-host`` within a requirements file. :issue:`2822`.
+
+* Allow ``--process-dependency-links`` within a requirements file. :issue:`1274`.
+
+* Allow ``--pre`` within a requirements file. :issue:`1273`.
+
+* Allow repository URLs with secure transports to count as trusted. (E.g.,
+  "git+ssh" is okay.) :issue:`2811`.
+
+* Implement a top-level ``pip download`` command and deprecate
+  ``pip install --download``.
+
+* Fixed :issue:`3141`, when uninstalling, look for the case of paths containing
+  symlinked directories (:pull:`3154`)
+
+* When installing, if building a wheel fails, clear up the build directory
+  before falling back to a source install. :issue:`3047`.
+
+* Fix user directory expansion when ``HOME=/``. Workaround for Python bug
+  http://bugs.python.org/issue14768, reported in :issue:`2996`.
+
+* Fixed :issue:`3009`, correct reporting of requirements file line numbers
+  (:pull:`3125`)
+
+* Fixed :issue:`1062`, Exception(IOError) for ``pip freeze`` and ``pip list``
+  commands with subversion >= 1.7. (:pull:`3346`)
+
+* Provide a spinner showing that progress is happening when installing or
+  building a package via ``setup.py``. This will alleviate concerns that
+  projects with unusually long build times have with pip appearing to stall.
+
+* Include the functionality of ``peep`` into pip, allowing hashes to be baked
+  into a requirements file and ensuring that the packages being downloaded
+  match one of those hashes. This is an additional, opt-in security measure
+  that, when used, removes the need to trust the repository.
+
+* Fix a bug causing pip to not select a wheel compiled against an OSX SDK later
+  than what Python itself was compiled against when running on a newer version
+  of OSX.
+
+* Add a new ``--prefix`` option for ``pip install`` that supports wheels and
+  sdists. (:pull:`3252`)
+
+* Fixed :issue:`2042` regarding wheel building with setup.py using a different
+  encoding than the system.
+
+* Drop PasteScript specific egg_info hack. (:pull:`3270`)
+
+* Allow combination of pip list options --editable with --outdated/--uptodate.
+  (:issue:`933`)
+
+* Gives VCS implementations control over saying whether a project
+  is under their control (:pull:`3258`)
+
+* Git detection now works when ``setup.py`` is not at the Git repo root
+  and when ``package_dir`` is used, so ``pip freeze`` works in more
+  cases (:pull:`3258`)
+
+* Correctly freeze Git develop packages in presence of the &subdirectory
+  option (:pull:`3258`)
+
+* The detection of editable packages now relies on the presence of ``.egg-link``
+  instead of looking for a VCS, so ``pip list -e`` is more reliable
+  (:pull:`3258`)
+
+* Add the ``--prefix`` flag to ``pip install`` which allows specifying a root
+  prefix to use instead of ``sys.prefix`` (:pull:`3252`).
+
+* Allow duplicate specifications in the case that only the extras differ, and
+  union all specified extras together (:pull:`3198`).
+
+* Fix the detection of the user's current platform on OSX when determining the
+  OSX SDK version (:pull:`3232`).
+
+* Prevent the automatically built wheels from mistakenly being used across
+  multiple versions of Python when they may not be correctly configured for
+  that by making the wheel specific to a specific version of Python and
+  specific interpreter (:pull:`3225`).
+
+* Emulate the SOABI support in wheels from Python 2.x on Python 2.x as closely
+  as we can with the information available within the interpreter
+  (:pull:`3075`).
+
+* Don't roundtrip to the network when git is pinned to a specific commit hash
+  and that hash already exists locally (:pull:`3066`).
+
+* Prefer wheels built against a newer SDK to wheels built against an older SDK
+  on OSX (:pull:`3163`).
+
+* Show entry points for projects installed via wheel (:pull:`3122`).
+
+* Improve message when an unexisting path is passed to --find-links option
+  (:issue:`2968`).
+
+* pip freeze does not add the VCS branch/tag name in the #egg=... fragment anymore
+  (:pull:`3312`).
+
+* Warn on installation of editable if the provided #egg=name part does not
+  match the metadata produced by `setup.py egg_info`. :issue:`3143`.
+
+* Add support for .xz files for python versions supporting them (>= 3.3).
+  :issue:`722`.
+
+
+**7.1.2 (2015-08-22)**
+
+* Don't raise an error if pip is not installed when checking for the latest pip
+  version.
+
+
+**7.1.1 (2015-08-20)**
+
+* Check that the wheel cache directory is writable before we attempt to write
+  cached files to them.
+
+* Move the pip version check until *after* any installs have been performed,
+  thus removing the extraneous warning when upgrading pip.
+
+* Added debug logging when using a cached wheel.
+
+* Respect platlib by default on platforms that have it separated from purelib.
+
+* Upgrade packaging to 15.3.
+
+  * Normalize post-release spellings for rev/r prefixes.
+
+* Upgrade distlib to 0.2.1.
+
+  * Updated launchers to decode shebangs using UTF-8. This allows non-ASCII
+    pathnames to be correctly handled.
+
+  * Ensured that the executable written to shebangs is normcased.
+
+  * Changed ScriptMaker to work better under Jython.
+
+* Upgrade ipaddress to 1.0.13.
+
+
+**7.1.0 (2015-06-30)**
+
+* Allow constraining versions globally without having to know exactly what will
+  be installed by the pip command. :issue:`2731`.
+
+* Accept --no-binary and --only-binary via pip.conf. :issue:`2867`.
+
+* Allow ``--allow-all-external`` within a requirements file.
+
+* Fixed an issue where ``--user`` could not be used when ``--prefix`` was used
+  in a distutils configuration file.
+
+* Fixed an issue where the SOABI tags were not correctly being generated on
+  Python 3.5.
+
+* Fixed an issue where we were advising windows users to upgrade by directly
+  executing pip, when that would always fail on Windows.
+
+* Allow ``~`` to be expanded within a cache directory in all situations.
+
+
+**7.0.3 (2015-06-01)**
+
+* Fixed a regression where ``--no-cache-dir`` would raise an exception, fixes
+  :issue:`2855`.
+
+
+**7.0.2 (2015-06-01)**
+
+* **BACKWARD INCOMPATIBLE** Revert the change (released in v7.0.0) that
+  required quoting in requirements files around specifiers containing
+  environment markers. (:pull:`2841`)
+
+* **BACKWARD INCOMPATIBLE** Revert the accidental introduction of support for
+  options interleaved with requirements, version specifiers etc in
+  ``requirements`` files. (:pull:`2841`)
+
+* Expand ``~`` in the cache directory when caching wheels, fixes :issue:`2816`.
+
+* Use ``python -m pip`` instead of ``pip`` when recommending an upgrade command
+  to Windows users.
+
+
+**7.0.1 (2015-05-22)**
+
+* Don't build and cache wheels for non-editable installations from VCSs.
+
+* Allow ``--allow-all-external`` inside of a requirements.txt file, fixing a
+  regression in 7.0.
+
+
+**7.0.0 (2015-05-21)**
+
+* **BACKWARD INCOMPATIBLE** Removed the deprecated ``--mirror``,
+  ``--use-mirrors``, and ``-M`` options.
+
+* **BACKWARD INCOMPATIBLE** Removed the deprecated ``zip`` and ``unzip``
+  commands.
+
+* **BACKWARD INCOMPATIBLE** Removed the deprecated ``--no-install`` and
+  ``--no-download`` options.
+
+* **BACKWARD INCOMPATIBLE** No longer implicitly support an insecure origin
+  origin, and instead require insecure origins be explicitly trusted with the
+  ``--trusted-host`` option.
+
+* **BACKWARD INCOMPATIBLE** Removed the deprecated link scraping that attempted
+  to parse HTML comments for a specially formatted comment.
+
+* **BACKWARD INCOMPATIBLE** Requirements in requirements files containing
+  markers must now be quoted due to parser changes from (:pull:`2697`) and
+  (:pull:`2725`).  For example, use ``"SomeProject; python_version < '2.7'"``,
+  not simply ``SomeProject; python_version < '2.7'``
+
+* `get-pip.py` now installs the "wheel" package, when it's not already installed
+  (:pull:`2800`).
+
+* Ignores bz2 archives if Python wasn't compiled with bz2 support.
+  Fixes :issue:`497`
+
+* Support ``--install-option`` and ``--global-option`` per requirement in
+  requirement files (:pull:`2537`)
+
+* Build Wheels prior to installing from sdist, caching them in the pip cache
+  directory to speed up subsequent installs. (:pull:`2618`)
+
+* Allow fine grained control over the use of wheels and source builds.
+  (:pull:`2699`)
+
+* ``--no-use-wheel`` and ``--use-wheel`` are deprecated in favour of new
+  options ``--no-binary`` and ``--only-binary``. The equivalent of
+  ``--no-use-wheel`` is ``--no-binary=:all:``. (:pull:`2699`)
+
+* The use of ``--install-option``, ``--global-option`` or ``--build-option``
+  disable the use of wheels, and the autobuilding of wheels. (:pull:`2711`)
+  Fixes :issue:`2677`
+
+* Improve logging when a requirement marker doesn't match your environment
+  (:pull:`2735`)
+
+* Removed the temporary modifications (that began in pip v1.4 when distribute
+  and setuptools merged) that allowed distribute to be considered a conflict to
+  setuptools. ``pip install -U setuptools`` will no longer upgrade "distribute"
+  to "setuptools".  Instead, use ``pip install -U distribute`` (:pull:`2767`).
+
+* Only display a warning to upgrade pip when the newest version is a final
+  release and it is not a post release of the version we already have
+  installed (:pull:`2766`).
+
+* Display a warning when attempting to access a repository that uses HTTPS when
+  we don't have Python compiled with SSL support (:pull:`2761`).
+
+* Allowing using extras when installing from a file path without requiring the
+  use of an editable (:pull:`2785`).
+
+* Fix an infinite loop when the cache directory is stored on a file system
+  which does not support hard links (:pull:`2796`).
+
+* Remove the implicit debug log that was written on every invocation, instead
+  users will need to use ``--log`` if they wish to have one (:pull:`2798`).
+
+
+**6.1.1 (2015-04-07)**
+
+* No longer ignore dependencies which have been added to the standard library,
+  instead continue to install them.
+
+
+**6.1.0 (2015-04-07)**
+
+* Fixes :issue:`2502`. Upgrades were failing when no potential links were found
+  for dependencies other than the current installation. (:pull:`2538`)
+
+* Use a smoother progress bar when the terminal is capable of handling it,
+  otherwise fallback to the original ASCII based progress bar.
+
+* Display much less output when `pip install` succeeds, because on success,
+  users probably don't care about all the nitty gritty details of compiling and
+  installing. When `pip install` fails, display the failed install output once
+  instead of twice, because once is enough. (:pull:`2487`)
+
+* Upgrade the bundled copy of requests to 2.6.0, fixing CVE-2015-2296.
+
+* Display format of latest package when using ``pip list --outdated``.
+  (:pull:`2475`)
+
+* Don't use pywin32 as ctypes should always be available on Windows, using
+  pywin32 prevented uninstallation of pywin32 on Windows. (:pull:`2467`)
+
+* Normalize the ``--wheel-dir`` option, expanding out constructs such as ``~``
+  when used (:pull:`2441`).
+
+* Display a warning when an undefined extra has been requested. (:pull:`2142`)
+
+* Speed up installing a directory in certain cases by creating a sdist instead
+  of copying the entire directory. (:pull:`2535`)
+
+* Don't follow symlinks when uninstalling files (:pull:`2552`)
+
+* Upgrade the bundled copy of cachecontrol from 0.11.1 to 0.11.2.
+  Fixes :issue:`2481` (:pull:`2595`)
+
+* Attempt to more smartly choose the order of installation to try and install
+  dependencies before the projects that depend on them. (:pull:`2616`)
+
+* Skip trying to install libraries which are part of the standard library.
+  (:pull:`2636`, :pull:`2602`)
+
+* Support arch specific wheels that are not tied to a specific Python ABI.
+  (:pull:`2561`)
+
+* Output warnings and errors to stderr instead of stdout. (:pull:`2543`)
+
+* Adjust the cache dir file checks to only check ownership if the effective
+  user is root. (:pull:`2396`)
+
+* Install headers into a per project name directory instead of all of them into
+  the root directory when inside of a virtual environment. (:pull:`2421`)
+
+
+**6.0.8 (2015-02-04)**
+
+* Fix an issue where the ``--download`` flag would cause pip to no longer use
+  randomized build directories.
+
+* Fix an issue where pip did not properly unquote quoted URLs which contain
+  characters like PEP 440's epoch separator (``!``).
+
+* Fix an issue where distutils installed projects were not actually uninstalled
+  and deprecate attempting to uninstall them altogether.
+
+* Retry deleting directories in case a process like an antivirus is holding the
+  directory open temporarily.
+
+* Fix an issue where pip would hide the cursor on Windows but would not reshow
+  it.
+
+
+**6.0.7 (2015-01-28)**
+
+* Fix a regression where Numpy requires a build path without symlinks to
+  properly build.
+
+* Fix a broken log message when running ``pip wheel`` without a requirement.
+
+* Don't mask network errors while downloading the file as a hash failure.
+
+* Properly create the state file for the pip version check so it only happens
+  once a week.
+
+* Fix an issue where switching between Python 3 and Python 2 would evict cached
+  items.
+
+* Fix a regression where pip would be unable to successfully uninstall a
+  project without a normalized version.
+
+
+**6.0.6 (2015-01-03)**
+
+* Continue the regression fix from 6.0.5 which was not a complete fix.
+
+
+**6.0.5 (2015-01-03)**
+
+* Fix a regression with 6.0.4 under Windows where most commands would raise an
+  exception due to Windows not having the ``os.geteuid()`` function.
+
+
+**6.0.4 (2015-01-03)**
+
+* Fix an issue where ANSI escape codes would be used on Windows even though the
+  Windows shell does not support them, causing odd characters to appear with
+  the progress bar.
+
+* Fix an issue where using -v would cause an exception saying
+  ``TypeError: not all arguments converted during string formatting``.
+
+* Fix an issue where using -v with dependency links would cause an exception
+  saying ``TypeError: 'InstallationCandidate' object is not iterable``.
+
+* Fix an issue where upgrading distribute would cause an exception saying
+  ``TypeError: expected string or buffer``.
+
+* Show a warning and disable the use of the cache directory when the cache
+  directory is not owned by the current user, commonly caused by using ``sudo``
+  without the ``-H`` flag.
+
+* Update PEP 440 support to handle the latest changes to PEP 440, particularly
+  the changes to ``>V`` and ``<V`` so that they no longer imply ``!=V.*``.
+
+* Document the default cache directories for each operating system.
+
+* Create the cache directory when the pip version check needs to save to it
+  instead of silently logging an error.
+
+* Fix a regression where the ``-q`` flag would not properly suppress the
+  display of the progress bars.
+
+
+**6.0.3 (2014-12-23)**
+
+* Fix an issue where the implicit version check new in pip 6.0 could cause pip
+  to block for up to 75 seconds if PyPI was not accessible.
+
+* Make ``--no-index`` imply ``--disable-pip-version-check``.
+
+
+**6.0.2 (2014-12-23)**
+
+* Fix an issue where the output saying that a package was installed would
+  report the old version instead of the new version during an upgrade.
+
+* Fix left over merge conflict markers in the documentation.
+
+* Document the backwards incompatible PEP 440 change in the 6.0.0 changelog.
+
+
+**6.0.1 (2014-12-22)**
+
+* Fix executable file permissions for Wheel files when using the distutils
+  scripts option.
+
+* Fix a confusing error message when an exceptions was raised at certain
+  points in pip's execution.
+
+* Fix the missing list of versions when a version cannot be found that matches
+  the specifiers.
+
+* Add a warning about the possibly problematic use of > when the given
+  specifier doesn't match anything.
+
+* Fix an issue where installing from a directory would not copy over certain
+  directories which were being excluded, however some build systems rely on
+  them.
+
+
+**6.0 (2014-12-22)**
+
+* **PROCESS** Version numbers are now simply ``X.Y`` where the leading ``1``
+  has been dropped.
+
+* **BACKWARD INCOMPATIBLE** Dropped support for Python 3.1.
+
+* **BACKWARD INCOMPATIBLE** Removed the bundle support which was deprecated in
+  1.4. (:pull:`1806`)
+
+* **BACKWARD INCOMPATIBLE** File lists generated by `pip show -f` are now
+  rooted at the location reported by show, rather than one (unstated)
+  directory lower. (:pull:`1933`)
+
+* **BACKWARD INCOMPATIBLE** The ability to install files over the FTP protocol
+  was accidentally lost in pip 1.5 and it has now been decided to not restore
+  that ability.
+
+* **BACKWARD INCOMPATIBLE** PEP 440 is now fully implemented, this means that
+  in some cases versions will sort differently or version specifiers will be
+  interpreted differently than previously. The common cases should all function
+  similarly to before.
+
+* **DEPRECATION** ``pip install --download-cache`` and
+  ``pip wheel --download-cache`` command line flags have been deprecated and
+  the functionality removed. Since pip now automatically configures and uses
+  it's internal HTTP cache which supplants the ``--download-cache`` the
+  existing options have been made non functional but will still be accepted
+  until their removal in pip v8.0. For more information please see
+  https://pip.pypa.io/en/stable/reference/pip_install.html#caching
+
+* **DEPRECATION** ``pip install --build`` and ``pip install --no-clean`` are now
+  *NOT* deprecated.  This reverses the deprecation that occurred in v1.5.3. See
+  :issue:`906` for discussion.
+
+* **DEPRECATION** Implicitly accessing URLs which point to an origin which is
+  not a secure origin, instead requiring an opt-in for each host using the new
+  ``--trusted-host`` flag (``pip install --trusted-host example.com foo``).
+
+* Allow the new ``--trusted-host`` flag to also disable TLS verification for
+  a particular hostname.
+
+* Added a ``--user`` flag to ``pip freeze`` and ``pip list`` to check the
+  user site directory only.
+
+* Fixed :issue:`1873`. Silence byte compile errors when installation succeed.
+
+* Added a virtualenv-specific configuration file. (:pull:`1364`)
+
+* Added site-wide configuration files. (:pull:`1978`)
+
+* Added an automatic check to warn if there is an updated version of pip
+  available (:pull:`2049`).
+
+* `wsgiref` and `argparse` (for >py26) are now excluded from `pip list` and `pip
+  freeze` (:pull:`1606`, :pull:`1369`)
+
+* Fixed :issue:`1424`. Add ``--client-cert`` option for SSL client certificates.
+
+* Fixed :issue:`1484`. `pip show --files` was broken for wheel installs. (:pull:`1635`)
+
+* Fixed :issue:`1641`. install_lib should take precedence when reading distutils config.
+  (:pull:`1642`)
+
+* Send `Accept-Encoding: identity` when downloading files in an attempt to
+  convince some servers who double compress the downloaded file to stop doing
+  so. (:pull:`1688`)
+
+* Fixed :issue:`1559`. Stop breaking when given pip commands in uppercase (:pull:`1725`)
+
+* Fixed :issue:`1618`. Pip no longer adds duplicate logging consumers, so it
+  won't create duplicate output when being called multiple times. (:pull:`1723`)
+
+* Fixed :issue:`1769`. `pip wheel` now returns an error code if any wheels
+  fail to build.
+
+* Fixed :issue:`1775`. `pip wheel` wasn't building wheels for dependencies of
+  editable requirements.
+
+* Allow the use of ``--no-use-wheel`` within a requirements file. (:pull:`1859`)
+
+* Fixed :issue:`1680`. Attempt to locate system TLS certificates to use instead
+  of the included CA Bundle if possible. (:pull:`1866`)
+
+* Fixed :issue:`1319`. Allow use of Zip64 extension in Wheels and other zip
+  files. (:pull:`1868`)
+
+* Fixed :issue:`1101`. Properly handle an index or --find-links target which
+  has a <base> without a href attribute. (:pull:`1869`)
+
+* Fixed :issue:`1885`. Properly handle extras when a project is installed
+  via Wheel. (:pull:`1896`)
+
+* Fixed :issue:`1180`. Added support to respect proxies in ``pip search``. It
+  also fixes :issue:`932` and :issue:`1104`. (:pull:`1902`)
+
+* Fixed :issue:`798` and :issue:`1060`. `pip install --download` works with vcs links.
+  (:pull:`1926`)
+
+* Fixed :issue:`1456`. Disabled warning about insecure index host when using localhost.
+  Based off of Guy Rozendorn's work in :pull:`1718`. (:pull:`1967`)
+
+* Allow the use of OS standard user configuration files instead of ones simply
+  based around ``$HOME``. (:pull:`2021`)
+
+* Fixed :issue:`1825`. When installing directly from wheel paths or urls,
+  previous versions were not uninstalled. This also fixes :issue:`804`
+  specifically for the case of wheel archives. (:pull:`1838`)
+
+* Fixed :issue:`2075`, detect the location of the ``.egg-info`` directory by
+  looking for any file located inside of it instead of relying on the record
+  file listing a directory. (:pull:`2076`)
+
+* Fixed :issue:`1964`, :issue:`1935`, :issue:`676`, Use a randomized and secure
+  default build directory when possible. (:pull:`2122`, CVE-2014-8991)
+
+* Fixed :issue:`1433`. Support environment markers in requirements.txt files.
+  (:pull:`2134`)
+
+* Automatically retry failed HTTP requests by default. (:pull:`1444`, :pull:`2147`)
+
+* Fixed :issue:`1100` - Handle HTML Encoding better using a method that is more
+  similar to how browsers handle it. (:pull:`1874`)
+
+* Reduce the verbosity of the pip command by default. (:pull:`2175`,
+  :pull:`2177`, :pull:`2178`)
+
+* Fixed :issue:`2031` - Respect sys.executable on OSX when installing from
+  Wheels.
+
+* Display the entire URL of the file that is being downloaded when downloading
+  from a non PyPI repository (:pull:`2183`).
+
+* Support setuptools style environment markers in a source distribution
+  (:pull:`2153`).
+
+
+**1.5.6 (2014-05-16)**
+
+* Upgrade requests to 2.3.0 to fix an issue with proxies on Python 3.4.1
+  (:pull:`1821`).
+
+
+**1.5.5 (2014-05-03)**
+
+
+* Fixes :issue:`1632`.  Uninstall issues on debianized pypy, specifically issues with
+  setuptools upgrades. (:pull:`1743`)
+
+* Update documentation to point at https://bootstrap.pypa.io/get-pip.py for
+  bootstrapping pip.
+
+* Update docs to point to https://pip.pypa.io/
+
+* Upgrade the bundled projects (distlib==0.1.8, html5lib==1.0b3, six==1.6.1,
+  colorama==0.3.1, setuptools==3.4.4).
+
+
+**1.5.4 (2014-02-21)**
+
+
+* Correct deprecation warning for ``pip install --build`` to only notify when
+  the `--build` value is different than the default.
+
+
+**1.5.3 (2014-02-20)**
+
+
+* **DEPRECATION** ``pip install --build`` and ``pip install --no-clean`` are now
+  deprecated.  See :issue:`906` for discussion.
+
+* Fixed :issue:`1112`. Couldn't download directly from wheel paths/urls, and when wheel
+  downloads did occur using requirement specifiers, dependencies weren't
+  downloaded (:pull:`1527`)
+
+* Fixed :issue:`1320`. ``pip wheel`` was not downloading wheels that already existed (PR
+  :issue:`1524`)
+
+* Fixed :issue:`1111`. ``pip install --download`` was failing using local
+  ``--find-links`` (:pull:`1524`)
+
+* Workaround for Python bug http://bugs.python.org/issue20053 (:pull:`1544`)
+
+* Don't pass a unicode __file__ to setup.py on Python 2.x (:pull:`1583`)
+
+* Verify that the Wheel version is compatible with this pip (:pull:`1569`)
+
+
+**1.5.2 (2014-01-26)**
+
+
+* Upgraded the vendored ``pkg_resources`` and ``_markerlib`` to setuptools 2.1.
+
+* Fixed an error that prevented accessing PyPI when pyopenssl, ndg-httpsclient,
+  and pyasn1 are installed
+
+* Fixed an issue that caused trailing comments to be incorrectly included as
+  part of the URL in a requirements file
+
+
+**1.5.1 (2014-01-20)**
+
+
+* pip now only requires setuptools (any setuptools, not a certain version) when
+  installing distributions from src (i.e. not from wheel). (:pull:`1434`).
+
+* `get-pip.py` now installs setuptools, when it's not already installed
+  (:pull:`1475`)
+
+* Don't decode downloaded files that have a ``Content-Encoding`` header.
+  (:pull:`1435`)
+
+* Fix to correctly parse wheel filenames with single digit versions.
+  (:pull:`1445`)
+
+* If `--allow-unverified` is used assume it also means `--allow-external`.
+  (:pull:`1457`)
+
+
+**1.5 (2014-01-01)**
+
+
+* **BACKWARD INCOMPATIBLE** pip no longer supports the ``--use-mirrors``,
+  ``-M``, and ``--mirrors`` flags. The mirroring support has been removed. In
+  order to use a mirror specify it as the primary index with ``-i`` or
+  ``--index-url``, or as an additional index with ``--extra-index-url``. (:pull:`1098`, CVE-2013-5123)
+
+* **BACKWARD INCOMPATIBLE** pip no longer will scrape insecure external urls by
+  default nor will it install externally hosted files by default. Users may opt
+  into installing externally hosted or insecure files or urls using
+  ``--allow-external PROJECT`` and ``--allow-unverified PROJECT``. (:pull:`1055`)
+
+* **BACKWARD INCOMPATIBLE** pip no longer respects dependency links by default.
+  Users may opt into respecting them again using ``--process-dependency-links``.
+
+* **DEPRECATION** ``pip install --no-install`` and ``pip install
+  --no-download`` are now formally deprecated.  See :issue:`906` for discussion on
+  possible alternatives, or lack thereof, in future releases.
+
+* **DEPRECATION** ``pip zip`` and ``pip unzip`` are now formally deprecated.
+
+* pip will now install Mac OSX platform wheels from PyPI. (:pull:`1278`)
+
+* pip now generates the appropriate platform-specific console scripts when
+  installing wheels. (:pull:`1251`)
+
+* Pip now confirms a wheel is supported when installing directly from a path or
+  url. (:pull:`1315`)
+
+* Fixed :issue:`1097`, ``--ignore-installed`` now behaves again as designed, after it was
+  unintentionally broke in v0.8.3 when fixing :issue:`14` (:pull:`1352`).
+
+* Fixed a bug where global scripts were being removed when uninstalling --user
+  installed packages (:pull:`1353`).
+
+* Fixed :issue:`1163`, --user wasn't being respected when installing scripts from wheels (:pull:`1176`).
+
+* Fixed :issue:`1150`, we now assume '_' means '-' in versions from wheel filenames (:pull:`1158`).
+
+* Fixed :issue:`219`, error when using --log with a failed install (:pull:`1205`).
+
+* Fixed :issue:`1131`, logging was buffered and choppy in Python 3.
+
+* Fixed :issue:`70`,  --timeout was being ignored (:pull:`1202`).
+
+* Fixed :issue:`772`, error when setting PIP_EXISTS_ACTION (:pull:`1201`).
+
+* Added colors to the logging output in order to draw attention to important
+  warnings and errors. (:pull:`1109`)
+
+* Added warnings when using an insecure index, find-link, or dependency link. (:pull:`1121`)
+
+* Added support for installing packages from a subdirectory using the ``subdirectory``
+  editable option. ( :pull:`1082` )
+
+* Fixed :issue:`1192`. "TypeError: bad operand type for unary" in some cases when
+  installing wheels using --find-links (:pull:`1218`).
+
+* Fixed :issue:`1133` and :issue:`317`. Archive contents are now written based on system
+  defaults and umask (i.e. permissions are not preserved), except that regular
+  files with any execute permissions have the equivalent of "chmod +x" applied
+  after being written (:pull:`1146`).
+
+* PreviousBuildDirError now returns a non-zero exit code and prevents the
+  previous build dir from being cleaned in all cases (:pull:`1162`).
+
+* Renamed --allow-insecure to --allow-unverified, however the old name will
+  continue to work for a period of time (:pull:`1257`).
+
+* Fixed :issue:`1006`, error when installing local projects with symlinks in
+  Python 3. (:pull:`1311`)
+
+* The previously hidden ``--log-file`` option, is now shown as a general option.
+  (:pull:`1316`)
+
+
+**1.4.1 (2013-08-07)**
+
+
+* **New Signing Key** Release 1.4.1 is using a different key than normal with
+  fingerprint: 7C6B 7C5D 5E2B 6356 A926 F04F 6E3C BCE9 3372 DCFA
+* Fixed issues with installing from pybundle files (:pull:`1116`).
+* Fixed error when sysconfig module throws an exception (:pull:`1095`).
+* Don't ignore already installed pre-releases (:pull:`1076`).
+* Fixes related to upgrading setuptools (:pull:`1092`).
+* Fixes so that --download works with wheel archives (:pull:`1113`).
+* Fixes related to recognizing and cleaning global build dirs (:pull:`1080`).
+
+
+**1.4 (2013-07-23)**
+
+
+* **BACKWARD INCOMPATIBLE** pip now only installs stable versions by default,
+  and offers a new ``--pre`` option to also find pre-release and development
+  versions. (:pull:`834`)
+
+* **BACKWARD INCOMPATIBLE** Dropped support for Python 2.5. The minimum
+  supported Python version for pip 1.4 is Python 2.6.
+
+* Added support for installing and building wheel archives.
+  Thanks Daniel Holth, Marcus Smith, Paul Moore, and Michele Lacchia
+  (:pull:`845`)
+
+* Applied security patch to pip's ssl support related to certificate DNS
+  wildcard matching (http://bugs.python.org/issue17980).
+
+* To satisfy pip's setuptools requirement, pip now recommends setuptools>=0.8,
+  not distribute. setuptools and distribute are now merged into one project
+  called 'setuptools'. (:pull:`1003`)
+
+* pip will now warn when installing a file that is either hosted externally to
+  the index or cannot be verified with a hash. In the future pip will default
+  to not installing them and will require the flags --allow-external NAME, and
+  --allow-insecure NAME respectively. (:pull:`985`)
+
+* If an already-downloaded or cached file has a bad hash, re-download it rather
+  than erroring out. (:issue:`963`).
+
+* ``pip bundle`` and support for installing from pybundle files is now
+  considered deprecated and will be removed in pip v1.5.
+
+* Fixed a number of issues (:issue:`413`, :issue:`709`, :issue:`634`, :issue:`602`, and :issue:`939`) related to
+  cleaning up and not reusing build directories. (:pull:`865`, :issue:`948`)
+
+* Added a User Agent so that pip is identifiable in logs. (:pull:`901`)
+
+* Added ssl and --user support to get-pip.py. Thanks Gabriel de Perthuis.
+  (:pull:`895`)
+
+* Fixed the proxy support, which was broken in pip 1.3.x (:pull:`840`)
+
+* Fixed :issue:`32` - pip fails when server does not send content-type header.
+  Thanks Hugo Lopes Tavares and Kelsey Hightower (:pull:`872`).
+
+* "Vendorized" distlib as pip.vendor.distlib (https://distlib.readthedocs.io/).
+
+* Fixed git VCS backend with git 1.8.3. (:pull:`967`)
+
+
+**1.3.1 (2013-03-08)**
+
+
+* Fixed a major backward incompatible change of parsing URLs to externally
+  hosted packages that got accidentally included in 1.3.
+
+
+**1.3 (2013-03-07)**
+
+
+* SSL Cert Verification; Make https the default for PyPI access.
+  Thanks James Cleveland, Giovanni Bajo, Marcus Smith and many others (:pull:`791`, CVE-2013-1629).
+
+* Added "pip list" for listing installed packages and the latest version
+  available. Thanks Rafael Caricio, Miguel Araujo, Dmitry Gladkov (:pull:`752`)
+
+* Fixed security issues with pip's use of temp build directories.
+  Thanks David (d1b) and Thomas Guttler. (:pull:`780`, CVE-2013-1888)
+
+* Improvements to sphinx docs and cli help. (:pull:`773`)
+
+* Fixed :issue:`707`, dealing with macOS temp dir handling, which was causing
+  global NumPy installs to fail. (:pull:`768`)
+
+* Split help output into general vs command-specific option groups.
+  Thanks Georgi Valkov. (:pull:`744`; :pull:`721` contains preceding refactor)
+
+* Fixed dependency resolution when installing from archives with uppercase
+  project names. (:pull:`724`)
+
+* Fixed problem where re-installs always occurred when using file:// find-links.
+  (Pulls :issue:`683`/:issue:`702`)
+
+* "pip install -v" now shows the full download url, not just the archive name.
+  Thanks Marc Abramowitz (:pull:`687`)
+
+* Fix to prevent unnecessary PyPI redirects. Thanks Alex Gronholm (:pull:`695`)
+
+* Fixed :issue:`670` - install failure under Python 3 when the same version
+  of a package is found under 2 different URLs.  Thanks Paul Moore (:pull:`671`)
+
+* Fix git submodule recursive updates.  Thanks Roey Berman. (Pulls :issue:`674`)
+
+* Explicitly ignore rel='download' links while looking for html pages.
+  Thanks Maxime R. (:pull:`677`)
+
+* --user/--upgrade install options now work together. Thanks 'eevee' for
+  discovering the problem. (:pull:`705`)
+
+* Added check in ``install --download`` to prevent re-downloading if the target
+  file already exists. Thanks Andrey Bulgakov. (:pull:`669`)
+
+* Added support for bare paths (including relative paths) as argument to
+  `--find-links`. Thanks Paul Moore for draft patch.
+
+* Added support for --no-index in requirements files.
+
+* Added "pip show" command to get information about an installed package.
+  Fixes :issue:`131`. Thanks Kelsey Hightower and Rafael Caricio.
+
+* Added `--root` option for "pip install" to specify root directory. Behaves
+  like the same option in distutils but also plays nice with pip's egg-info.
+  Thanks Przemek Wrzos.  (:issue:`253` / :pull:`693`)
+
+
+**1.2.1 (2012-09-06)**
+
+
+* Fixed a regression introduced in 1.2 about raising an exception when
+  not finding any files to uninstall in the current environment. Thanks for
+  the fix, Marcus Smith.
+
+
+**1.2 (2012-09-01)**
+
+
+* **Dropped support for Python 2.4** The minimum supported Python version is
+  now Python 2.5.
+
+* Fixed :issue:`605` - pypi mirror support broken on some DNS responses. Thanks
+  philwhin.
+
+* Fixed :issue:`355` - pip uninstall removes files it didn't install. Thanks
+  pjdelport.
+
+* Fixed issues :issue:`493`, :issue:`494`, :issue:`440`, and :issue:`573` related to improving support for the
+  user installation scheme. Thanks Marcus Smith.
+
+* Write failure log to temp file if default location is not writable. Thanks
+  andreigc.
+
+* Pull in submodules for git editable checkouts. Fixes :issue:`289` and :issue:`421`. Thanks
+  Hsiaoming Yang and Markus Hametner.
+
+* Use a temporary directory as the default build location outside of a
+  virtualenv. Fixes issues :issue:`339` and :issue:`381`. Thanks Ben Rosser.
+
+* Added support for specifying extras with local editables. Thanks Nick
+  Stenning.
+
+* Added ``--egg`` flag to request egg-style rather than flat installation. Refs
+  :issue:`3`. Thanks Kamal Bin Mustafa.
+
+* Fixed :issue:`510` - prevent e.g. ``gmpy2-2.0.tar.gz`` from matching a request
+  to ``pip install gmpy``; sdist filename must begin with full project name
+  followed by a dash. Thanks casevh for the report.
+
+* Fixed :issue:`504` - allow package URLS to have querystrings. Thanks W.
+  Trevor King.
+
+* Fixed :issue:`58` - pip freeze now falls back to non-editable format rather
+  than blowing up if it can't determine the origin repository of an editable.
+  Thanks Rory McCann.
+
+* Added a `__main__.py` file to enable `python -m pip` on Python versions
+  that support it. Thanks Alexey Luchko.
+
+* Fixed :issue:`487` - upgrade from VCS url of project that does exist on
+  index. Thanks Andrew Knapp for the report.
+
+* Fixed :issue:`486` - fix upgrade from VCS url of project with no distribution
+  on index.  Thanks Andrew Knapp for the report.
+
+* Fixed :issue:`427` - clearer error message on a malformed VCS url. Thanks
+  Thomas Fenzl.
+
+* Added support for using any of the built in guaranteed algorithms in
+  ``hashlib`` as a checksum hash.
+
+* Fixed :issue:`321` - Raise an exception if current working directory can't be
+  found or accessed.
+
+* Fixed :issue:`82` - Removed special casing of the user directory and use the
+  Python default instead.
+
+* Fixed :issue:`436` - Only warn about version conflicts if there is actually one.
+  This re-enables using ``==dev`` in requirements files.
+
+* Moved tests to be run on Travis CI: http://travis-ci.org/pypa/pip
+
+* Added a better help formatter.
+
+
+**1.1 (2012-02-16)**
+
+
+* Fixed :issue:`326` - don't crash when a package's setup.py emits UTF-8 and
+  then fails. Thanks Marc Abramowitz.
+
+* Added ``--target`` option for installing directly to arbitrary directory.
+  Thanks Stavros Korokithakis.
+
+* Added support for authentication with Subversion repositories. Thanks
+  Qiangning Hong.
+
+* Fixed :issue:`315` - ``--download`` now downloads dependencies as well.
+  Thanks Qiangning Hong.
+
+* Errors from subprocesses will display the current working directory.
+  Thanks Antti Kaihola.
+
+* Fixed :issue:`369` - compatibility with Subversion 1.7. Thanks Qiangning
+  Hong. Note that setuptools remains incompatible with Subversion 1.7; to
+  get the benefits of pip's support you must use Distribute rather than
+  setuptools.
+
+* Fixed :issue:`57` - ignore py2app-generated macOS mpkg zip files in finder.
+  Thanks Rene Dudfield.
+
+* Fixed :issue:`182` - log to ~/Library/Logs/ by default on macOS framework
+  installs. Thanks Dan Callahan for report and patch.
+
+* Fixed :issue:`310` - understand version tags without minor version ("py3")
+  in sdist filenames. Thanks Stuart Andrews for report and Olivier Girardot for
+  patch.
+
+* Fixed :issue:`7` - Pip now supports optionally installing setuptools
+  "extras" dependencies; e.g. "pip install Paste[openid]". Thanks Matt Maker
+  and Olivier Girardot.
+
+* Fixed :issue:`391` - freeze no longer borks on requirements files with
+  --index-url or --find-links. Thanks Herbert Pfennig.
+
+* Fixed :issue:`288` - handle symlinks properly. Thanks lebedov for the patch.
+
+* Fixed :issue:`49` - pip install -U no longer reinstalls the same versions of
+  packages. Thanks iguananaut for the pull request.
+
+* Removed ``-E``/``--environment`` option and ``PIP_RESPECT_VIRTUALENV``;
+  both use a restart-in-venv mechanism that's broken, and neither one is
+  useful since every virtualenv now has pip inside it.  Replace ``pip -E
+  path/to/venv install Foo`` with ``virtualenv path/to/venv &&
+  path/to/venv/pip install Foo``.
+
+* Fixed :issue:`366` - pip throws IndexError when it calls `scraped_rel_links`
+
+* Fixed :issue:`22` - pip search should set and return a useful shell status code
+
+* Fixed :issue:`351` and :issue:`365` - added global ``--exists-action`` command line
+  option to easier script file exists conflicts, e.g. from editable
+  requirements from VCS that have a changed repo URL.
+
+
+**1.0.2 (2011-07-16)**
+
+
+* Fixed docs issues.
+* Fixed :issue:`295` - Reinstall a package when using the ``install -I`` option
+* Fixed :issue:`283` - Finds a Git tag pointing to same commit as origin/master
+* Fixed :issue:`279` - Use absolute path for path to docs in setup.py
+* Fixed :issue:`314` - Correctly handle exceptions on Python3.
+* Fixed :issue:`320` - Correctly parse ``--editable`` lines in requirements files
+
+
+**1.0.1 (2011-04-30)**
+
+
+* Start to use git-flow.
+* Fixed :issue:`274` - `find_command` should not raise AttributeError
+* Fixed :issue:`273` - respect Content-Disposition header. Thanks Bradley Ayers.
+* Fixed :issue:`233` - pathext handling on Windows.
+* Fixed :issue:`252` - svn+svn protocol.
+* Fixed :issue:`44` - multiple CLI searches.
+* Fixed :issue:`266` - current working directory when running setup.py clean.
+
+
+**1.0 (2011-04-04)**
+
+
+* Added Python 3 support! Huge thanks to Vinay Sajip, Vitaly Babiy, Kelsey
+  Hightower, and Alex Gronholm, among others.
+
+* Download progress only shown on a real TTY. Thanks Alex Morega.
+
+* Fixed finding of VCS binaries to not be fooled by same-named directories.
+  Thanks Alex Morega.
+
+* Fixed uninstall of packages from system Python for users of Debian/Ubuntu
+  python-setuptools package (workaround until fixed in Debian and Ubuntu).
+
+* Added `get-pip.py <https://raw.github.com/pypa/pip/master/contrib/get-pip.py>`_
+  installer. Simply download and execute it, using the Python interpreter of
+  your choice::
+
+    $ curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py
+    $ python get-pip.py
+
+  This may have to be run as root.
+
+  .. note::
+
+      Make sure you have `distribute <http://pypi.python.org/pypi/distribute>`_
+      installed before using the installer!
+
+
+**0.8.3**
+
+
+* Moved main repository to Github: https://github.com/pypa/pip
+
+* Transferred primary maintenance from Ian to Jannis Leidel, Carl Meyer, Brian Rosner
+
+* Fixed :issue:`14` - No uninstall-on-upgrade with URL package. Thanks Oliver Tonnhofer
+
+* Fixed :issue:`163` - Egg name not properly resolved. Thanks Igor Sobreira
+
+* Fixed :issue:`178` - Non-alphabetical installation of requirements. Thanks Igor Sobreira
+
+* Fixed :issue:`199` - Documentation mentions --index instead of --index-url. Thanks Kelsey Hightower
+
+* Fixed :issue:`204` - rmtree undefined in mercurial.py. Thanks Kelsey Hightower
+
+* Fixed bug in Git vcs backend that would break during reinstallation.
+
+* Fixed bug in Mercurial vcs backend related to pip freeze and branch/tag resolution.
+
+* Fixed bug in version string parsing related to the suffix "-dev".
+
+
+**0.8.2**
+
+
+* Avoid redundant unpacking of bundles (from pwaller)
+
+* Fixed :issue:`32`, :issue:`150`, :issue:`161` - Fixed checking out the correct
+  tag/branch/commit when updating an editable Git requirement.
+
+* Fixed :issue:`49` - Added ability to install version control requirements
+  without making them editable, e.g.::
+
+    pip install git+https://github.com/pypa/pip/
+
+* Fixed :issue:`175` - Correctly locate build and source directory on macOS.
+
+* Added ``git+https://`` scheme to Git VCS backend.
+
+
+**0.8.1**
+
+
+* Added global --user flag as shortcut for --install-option="--user". From
+  Ronny Pfannschmidt.
+
+* Added support for `PyPI mirrors <http://pypi.python.org/mirrors>`_ as
+  defined in `PEP 381 <http://www.python.org/dev/peps/pep-0381/>`_, from
+  Jannis Leidel.
+
+* Fixed :issue:`138` - Git revisions ignored. Thanks John-Scott Atlakson.
+
+* Fixed :issue:`95` - Initial editable install of github package from a tag fails. Thanks John-Scott Atlakson.
+
+* Fixed :issue:`107` - Can't install if a directory in cwd has the same name as the package you're installing.
+
+* Fixed :issue:`39` - --install-option="--prefix=~/.local" ignored with -e.
+  Thanks Ronny Pfannschmidt and Wil Tan.
+
+
+**0.8**
+
+
+* Track which ``build/`` directories pip creates, never remove directories
+  it doesn't create.  From Hugo Lopes Tavares.
+
+* Pip now accepts file:// index URLs. Thanks Dave Abrahams.
+
+* Various cleanup to make test-running more consistent and less fragile.
+  Thanks Dave Abrahams.
+
+* Real Windows support (with passing tests). Thanks Dave Abrahams.
+
+* ``pip-2.7`` etc. scripts are created (Python-version specific scripts)
+
+* ``contrib/build-standalone`` script creates a runnable ``.zip`` form of
+  pip, from Jannis Leidel
+
+* Editable git repos are updated when reinstalled
+
+* Fix problem with ``--editable`` when multiple ``.egg-info/`` directories
+  are found.
+
+* A number of VCS-related fixes for ``pip freeze``, from Hugo Lopes Tavares.
+
+* Significant test framework changes, from Hugo Lopes Tavares.
+
+
+**0.7.2**
+
+
+* Set zip_safe=False to avoid problems some people are encountering where
+  pip is installed as a zip file.
+
+
+**0.7.1**
+
+
+* Fixed opening of logfile with no directory name. Thanks Alexandre Conrad.
+
+* Temporary files are consistently cleaned up, especially after
+  installing bundles, also from Alex Conrad.
+
+* Tests now require at least ScriptTest 1.0.3.
+
+
+**0.7**
+
+
+* Fixed uninstallation on Windows
+* Added ``pip search`` command.
+* Tab-complete names of installed distributions for ``pip uninstall``.
+* Support tab-completion when there is a global-option before the
+  subcommand.
+* Install header files in standard (scheme-default) location when installing
+  outside a virtualenv. Install them to a slightly more consistent
+  non-standard location inside a virtualenv (since the standard location is
+  a non-writable symlink to the global location).
+* pip now logs to a central location by default (instead of creating
+  ``pip-log.txt`` all over the place) and constantly overwrites the
+  file in question. On Unix and macOS this is ``'$HOME/.pip/pip.log'``
+  and on Windows it's ``'%HOME%\\pip\\pip.log'``. You are still able to
+  override this location with the ``$PIP_LOG_FILE`` environment variable.
+  For a complete (appended) logfile use the separate ``'--log'`` command line
+  option.
+* Fixed an issue with Git that left an editable package as a checkout of a
+  remote branch, even if the default behaviour would have been fine, too.
+* Fixed installing from a Git tag with older versions of Git.
+* Expand "~" in logfile and download cache paths.
+* Speed up installing from Mercurial repositories by cloning without
+  updating the working copy multiple times.
+* Fixed installing directly from directories (e.g.
+  ``pip install path/to/dir/``).
+* Fixed installing editable packages with ``svn+ssh`` URLs.
+* Don't print unwanted debug information when running the freeze command.
+* Create log file directory automatically. Thanks Alexandre Conrad.
+* Make test suite easier to run successfully. Thanks Dave Abrahams.
+* Fixed "pip install ." and "pip install .."; better error for directory
+  without setup.py. Thanks Alexandre Conrad.
+* Support Debian/Ubuntu "dist-packages" in zip command. Thanks duckx.
+* Fix relative --src folder. Thanks Simon Cross.
+* Handle missing VCS with an error message. Thanks Alexandre Conrad.
+* Added --no-download option to install; pairs with --no-install to separate
+  download and installation into two steps. Thanks Simon Cross.
+* Fix uninstalling from requirements file containing -f, -i, or
+  --extra-index-url.
+* Leftover build directories are now removed. Thanks Alexandre Conrad.
+
+
+**0.6.3**
+
+
+* Fixed import error on Windows with regard to the backwards compatibility
+  package
+
+
+**0.6.2**
+
+
+* Fixed uninstall when /tmp is on a different filesystem.
+
+* Fixed uninstallation of distributions with namespace packages.
+
+
+**0.6.1**
+
+
+* Added support for the ``https`` and ``http-static`` schemes to the
+  Mercurial and ``ftp`` scheme to the Bazaar backend.
+
+* Fixed uninstallation of scripts installed with easy_install.
+
+* Fixed an issue in the package finder that could result in an
+  infinite loop while looking for links.
+
+* Fixed issue with ``pip bundle`` and local files (which weren't being
+  copied into the bundle), from Whit Morriss.
+
+
+**0.6**
+
+
+* Add ``pip uninstall`` and uninstall-before upgrade (from Carl
+  Meyer).
+
+* Extended configurability with config files and environment variables.
+
+* Allow packages to be upgraded, e.g., ``pip install Package==0.1``
+  then ``pip install Package==0.2``.
+
+* Allow installing/upgrading to Package==dev (fix "Source version does not
+  match target version" errors).
+
+* Added command and option completion for bash and zsh.
+
+* Extended integration with virtualenv by providing an option to
+  automatically use an active virtualenv and an option to warn if no active
+  virtualenv is found.
+
+* Fixed a bug with pip install --download and editable packages, where
+  directories were being set with 0000 permissions, now defaults to 755.
+
+* Fixed uninstallation of easy_installed console_scripts.
+
+* Fixed uninstallation on macOS Framework layout installs
+
+* Fixed bug preventing uninstall of editables with source outside venv.
+
+* Creates download cache directory if not existing.
+
+
+**0.5.1**
+
+
+* Fixed a couple little bugs, with git and with extensions.
+
+
+**0.5**
+
+
+* Added ability to override the default log file name (``pip-log.txt``)
+  with the environmental variable ``$PIP_LOG_FILE``.
+
+* Made the freeze command print installed packages to stdout instead of
+  writing them to a file. Use simple redirection (e.g.
+  ``pip freeze > stable-req.txt``) to get a file with requirements.
+
+* Fixed problem with freezing editable packages from a Git repository.
+
+* Added support for base URLs using ``<base href='...'>`` when parsing
+  HTML pages.
+
+* Fixed installing of non-editable packages from version control systems.
+
+* Fixed issue with Bazaar's bzr+ssh scheme.
+
+* Added --download-dir option to the install command to retrieve package
+  archives. If given an editable package it will create an archive of it.
+
+* Added ability to pass local file and directory paths to ``--find-links``,
+  e.g. ``--find-links=file:///path/to/my/private/archive``
+
+* Reduced the amount of console log messages when fetching a page to find a
+  distribution was problematic. The full messages can be found in pip-log.txt.
+
+* Added ``--no-deps`` option to install ignore package dependencies
+
+* Added ``--no-index`` option to ignore the package index (PyPI) temporarily
+
+* Fixed installing editable packages from Git branches.
+
+* Fixes freezing of editable packages from Mercurial repositories.
+
+* Fixed handling read-only attributes of build files, e.g. of Subversion and
+  Bazaar on Windows.
+
+* When downloading a file from a redirect, use the redirected
+  location's extension to guess the compression (happens specifically
+  when redirecting to a bitbucket.org tip.gz file).
+
+* Editable freeze URLs now always use revision hash/id rather than tip or
+  branch names which could move.
+
+* Fixed comparison of repo URLs so incidental differences such as
+  presence/absence of final slashes or quoted/unquoted special
+  characters don't trigger "ignore/switch/wipe/backup" choice.
+
+* Fixed handling of attempt to checkout editable install to a
+  non-empty, non-repo directory.
+
+
+**0.4**
+
+
+* Make ``-e`` work better with local hg repositories
+
+* Construct PyPI URLs the exact way easy_install constructs URLs (you
+  might notice this if you use a custom index that is
+  slash-sensitive).
+
+* Improvements on Windows (from `Ionel Maries Cristian
+  <http://ionelmc.wordpress.com/>`_).
+
+* Fixed problem with not being able to install private git repositories.
+
+* Make ``pip zip`` zip all its arguments, not just the first.
+
+* Fix some filename issues on Windows.
+
+* Allow the ``-i`` and ``--extra-index-url`` options in requirements
+  files.
+
+* Fix the way bundle components are unpacked and moved around, to make
+  bundles work.
+
+* Adds ``-s`` option to allow the access to the global site-packages if a
+  virtualenv is to be created.
+
+* Fixed support for Subversion 1.6.
+
+
+**0.3.1**
+
+
+* Improved virtualenv restart and various path/cleanup problems on win32.
+
+* Fixed a regression with installing from svn repositories (when not
+  using ``-e``).
+
+* Fixes when installing editable packages that put their source in a
+  subdirectory (like ``src/``).
+
+* Improve ``pip -h``
+
+
+**0.3**
+
+
+* Added support for editable packages created from Git, Mercurial and Bazaar
+  repositories and ability to freeze them. Refactored support for version
+  control systems.
+
+* Do not use ``sys.exit()`` from inside the code, instead use a
+  return.  This will make it easier to invoke programmatically.
+
+* Put the install record in ``Package.egg-info/installed-files.txt``
+  (previously they went in
+  ``site-packages/install-record-Package.txt``).
+
+* Fix a problem with ``pip freeze`` not including ``-e svn+`` when an
+  svn structure is peculiar.
+
+* Allow ``pip -E`` to work with a virtualenv that uses a different
+  version of Python than the parent environment.
+
+* Fixed Win32 virtualenv (``-E``) option.
+
+* Search the links passed in with ``-f`` for packages.
+
+* Detect zip files, even when the file doesn't have a ``.zip``
+  extension and it is served with the wrong Content-Type.
+
+* Installing editable from existing source now works, like ``pip
+  install -e some/path/`` will install the package in ``some/path/``.
+  Most importantly, anything that package requires will also be
+  installed by pip.
+
+* Add a ``--path`` option to ``pip un/zip``, so you can avoid zipping
+  files that are outside of where you expect.
+
+* Add ``--simulate`` option to ``pip zip``.
+
+
+**0.2.1**
+
+
+* Fixed small problem that prevented using ``pip.py`` without actually
+  installing pip.
+
+* Fixed ``--upgrade``, which would download and appear to install
+  upgraded packages, but actually just reinstall the existing package.
+
+* Fixed Windows problem with putting the install record in the right
+  place, and generating the ``pip`` script with Setuptools.
+
+* Download links that include embedded spaces or other unsafe
+  characters (those characters get %-encoded).
+
+* Fixed use of URLs in requirement files, and problems with some blank
+  lines.
+
+* Turn some tar file errors into warnings.
+
+
+**0.2**
+
+
+* Renamed to ``pip``, and to install you now do ``pip install
+  PACKAGE``
+
+* Added command ``pip zip PACKAGE`` and ``pip unzip PACKAGE``.  This
+  is particularly intended for Google App Engine to manage libraries
+  to stay under the 1000-file limit.
+
+* Some fixes to bundles, especially editable packages and when
+  creating a bundle using unnamed packages (like just an svn
+  repository without ``#egg=Package``).
+
+
+**0.1.4**
+
+
+* Added an option ``--install-option`` to pass options to pass
+  arguments to ``setup.py install``
+
+* ``.svn/`` directories are no longer included in bundles, as these
+  directories are specific to a version of svn -- if you build a
+  bundle on a system with svn 1.5, you can't use the checkout on a
+  system with svn 1.4.  Instead a file ``svn-checkout.txt`` is
+  included that notes the original location and revision, and the
+  command you can use to turn it back into an svn checkout.  (Probably
+  unpacking the bundle should, maybe optionally, recreate this
+  information -- but that is not currently implemented, and it would
+  require network access.)
+
+* Avoid ambiguities over project name case, where for instance
+  MyPackage and mypackage would be considered different packages.
+  This in particular caused problems on Macs, where ``MyPackage/`` and
+  ``mypackage/`` are the same directory.
+
+* Added support for an environmental variable
+  ``$PIP_DOWNLOAD_CACHE`` which will cache package downloads, so
+  future installations won't require large downloads.  Network access
+  is still required, but just some downloads will be avoided when
+  using this.
+
+
+**0.1.3**
+
+
+* Always use ``svn checkout`` (not ``export``) so that
+  ``tag_svn_revision`` settings give the revision of the package.
+
+* Don't update checkouts that came from ``.pybundle`` files.
+
+
+**0.1.2**
+
+
+* Improve error text when there are errors fetching HTML pages when
+  seeking packages.
+
+* Improve bundles: include empty directories, make them work with
+  editable packages.
+
+* If you use ``-E env`` and the environment ``env/`` doesn't exist, a
+  new virtual environment will be created.
+
+* Fix ``dependency_links`` for finding packages.
+
+
+**0.1.1**
+
+
+* Fixed a NameError exception when running pip outside of a
+  virtualenv environment.
+
+* Added HTTP proxy support (from Prabhu Ramachandran)
+
+* Fixed use of ``hashlib.md5`` on python2.5+ (also from Prabhu
+  Ramachandran)
+
+
+**0.1**
+
+
+* Initial release
diff --git a/vendor/pip-9.0.3/LICENSE.txt b/vendor/pip-9.0.3/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f63eac3d66793724218d428c6d156284ffe02b07
--- /dev/null
+++ b/vendor/pip-9.0.3/LICENSE.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2008-2016 The pip developers (see AUTHORS.txt file)
+
+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.
diff --git a/vendor/pip-9.0.3/MANIFEST.in b/vendor/pip-9.0.3/MANIFEST.in
new file mode 100644
index 0000000000000000000000000000000000000000..3dac128eab541d29cebdd0269481f63530aebf1a
--- /dev/null
+++ b/vendor/pip-9.0.3/MANIFEST.in
@@ -0,0 +1,25 @@
+include AUTHORS.txt
+include LICENSE.txt
+include CHANGES.txt
+include README.rst
+include pip/_vendor/README.rst
+include pip/_vendor/vendor.txt
+
+exclude .coveragerc
+exclude .mailmap
+exclude .travis.yml
+exclude .landscape.yml
+exclude pip/_vendor/Makefile
+exclude tox.ini
+exclude dev-requirements.txt
+exclude appveyor.yml
+
+recursive-include pip/_vendor *.pem
+recursive-include docs Makefile *.rst *.py *.bat
+
+prune .github
+prune .travis
+prune docs/_build
+prune contrib
+prune tasks
+prune tests
diff --git a/vendor/pip-9.0.3/PKG-INFO b/vendor/pip-9.0.3/PKG-INFO
new file mode 100644
index 0000000000000000000000000000000000000000..aca2a4f2444cfd01732740e367c306f972d863a8
--- /dev/null
+++ b/vendor/pip-9.0.3/PKG-INFO
@@ -0,0 +1,62 @@
+Metadata-Version: 2.1
+Name: pip
+Version: 9.0.3
+Summary: The PyPA recommended tool for installing Python packages.
+Home-page: https://pip.pypa.io/
+Author: The pip developers
+Author-email: python-virtualenv@groups.google.com
+License: MIT
+Description: pip
+        ===
+        
+        The `PyPA recommended
+        <https://packaging.python.org/en/latest/current/>`_
+        tool for installing Python packages.
+        
+        * `Installation <https://pip.pypa.io/en/stable/installing.html>`_
+        * `Documentation <https://pip.pypa.io/>`_
+        * `Changelog <https://pip.pypa.io/en/stable/news.html>`_
+        * `Github Page <https://github.com/pypa/pip>`_
+        * `Issue Tracking <https://github.com/pypa/pip/issues>`_
+        * `User mailing list <http://groups.google.com/group/python-virtualenv>`_
+        * `Dev mailing list <http://groups.google.com/group/pypa-dev>`_
+        * User IRC: #pypa on Freenode.
+        * Dev IRC: #pypa-dev on Freenode.
+        
+        
+        .. image:: https://img.shields.io/pypi/v/pip.svg
+           :target: https://pypi.python.org/pypi/pip
+        
+        .. image:: https://img.shields.io/travis/pypa/pip/master.svg
+           :target: http://travis-ci.org/pypa/pip
+        
+        .. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg
+           :target: https://ci.appveyor.com/project/pypa/pip/history
+        
+        .. image:: https://readthedocs.org/projects/pip/badge/?version=stable
+           :target: https://pip.pypa.io/en/stable
+        
+        Code of Conduct
+        ---------------
+        
+        Everyone interacting in the pip project's codebases, issue trackers, chat
+        rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.
+        
+        .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
+        
+Keywords: easy_install distutils setuptools egg virtualenv
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Topic :: Software Development :: Build Tools
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Requires-Python: >=2.6,!=3.0.*,!=3.1.*,!=3.2.*
+Provides-Extra: testing
diff --git a/vendor/pip-9.0.3/README.rst b/vendor/pip-9.0.3/README.rst
new file mode 100644
index 0000000000000000000000000000000000000000..da9a1f0a46b0a21e89ff3dd682db6175e982fcff
--- /dev/null
+++ b/vendor/pip-9.0.3/README.rst
@@ -0,0 +1,37 @@
+pip
+===
+
+The `PyPA recommended
+<https://packaging.python.org/en/latest/current/>`_
+tool for installing Python packages.
+
+* `Installation <https://pip.pypa.io/en/stable/installing.html>`_
+* `Documentation <https://pip.pypa.io/>`_
+* `Changelog <https://pip.pypa.io/en/stable/news.html>`_
+* `Github Page <https://github.com/pypa/pip>`_
+* `Issue Tracking <https://github.com/pypa/pip/issues>`_
+* `User mailing list <http://groups.google.com/group/python-virtualenv>`_
+* `Dev mailing list <http://groups.google.com/group/pypa-dev>`_
+* User IRC: #pypa on Freenode.
+* Dev IRC: #pypa-dev on Freenode.
+
+
+.. image:: https://img.shields.io/pypi/v/pip.svg
+   :target: https://pypi.python.org/pypi/pip
+
+.. image:: https://img.shields.io/travis/pypa/pip/master.svg
+   :target: http://travis-ci.org/pypa/pip
+
+.. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg
+   :target: https://ci.appveyor.com/project/pypa/pip/history
+
+.. image:: https://readthedocs.org/projects/pip/badge/?version=stable
+   :target: https://pip.pypa.io/en/stable
+
+Code of Conduct
+---------------
+
+Everyone interacting in the pip project's codebases, issue trackers, chat
+rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.
+
+.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
diff --git a/vendor/pip-9.0.3/docs/Makefile b/vendor/pip-9.0.3/docs/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..9f08edea7e7d87ae2c2efa0ded3ce3d6ea1216f2
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/Makefile
@@ -0,0 +1,177 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+BUILDDIR      = _build
+
+# User-friendly check for sphinx-build
+ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
+$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
+endif
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+# the i18n builder cannot share the environment and doctrees with the others
+I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
+
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html       to make standalone HTML files"
+	@echo "  dirhtml    to make HTML files named index.html in directories"
+	@echo "  singlehtml to make a single large HTML file"
+	@echo "  pickle     to make pickle files"
+	@echo "  json       to make JSON files"
+	@echo "  htmlhelp   to make HTML files and a HTML help project"
+	@echo "  qthelp     to make HTML files and a qthelp project"
+	@echo "  devhelp    to make HTML files and a Devhelp project"
+	@echo "  epub       to make an epub"
+	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
+	@echo "  latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
+	@echo "  text       to make text files"
+	@echo "  man        to make manual pages"
+	@echo "  texinfo    to make Texinfo files"
+	@echo "  info       to make Texinfo files and run them through makeinfo"
+	@echo "  gettext    to make PO message catalogs"
+	@echo "  changes    to make an overview of all changed/added/deprecated items"
+	@echo "  xml        to make Docutils-native XML files"
+	@echo "  pseudoxml  to make pseudoxml-XML files for display purposes"
+	@echo "  linkcheck  to check all external links for integrity"
+	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+	rm -rf $(BUILDDIR)/*
+
+html:
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+	@echo
+	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+	@echo
+	@echo "Build finished; now you can process the pickle files."
+
+json:
+	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+	@echo
+	@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+	@echo
+	@echo "Build finished; now you can run HTML Help Workshop with the" \
+	      ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+	@echo
+	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
+	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/pip-installer.qhcp"
+	@echo "To view the help file:"
+	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/pip-installer.qhc"
+
+devhelp:
+	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+	@echo
+	@echo "Build finished."
+	@echo "To view the help file:"
+	@echo "# mkdir -p $$HOME/.local/share/devhelp/pip-installer"
+	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/pip-installer"
+	@echo "# devhelp"
+
+epub:
+	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+	@echo
+	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+	@echo "Run \`make' in that directory to run these through (pdf)latex" \
+	      "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through pdflatex..."
+	$(MAKE) -C $(BUILDDIR)/latex all-pdf
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+latexpdfja:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through platex and dvipdfmx..."
+	$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+	@echo
+	@echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+	@echo
+	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+texinfo:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo
+	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
+	@echo "Run \`make' in that directory to run these through makeinfo" \
+	      "(use \`make info' here to do that automatically)."
+
+info:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo "Running Texinfo files through makeinfo..."
+	make -C $(BUILDDIR)/texinfo info
+	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
+
+gettext:
+	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
+	@echo
+	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
+
+changes:
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+	@echo
+	@echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/doctest/output.txt."
+
+xml:
+	$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
+	@echo
+	@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
+
+pseudoxml:
+	$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
+	@echo
+	@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
diff --git a/vendor/pip-9.0.3/docs/__init__.py b/vendor/pip-9.0.3/docs/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..b430650996dc684e811f6bf82bfe15152212a686
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/__init__.py
@@ -0,0 +1 @@
+# docs module
diff --git a/vendor/pip-9.0.3/docs/conf.py b/vendor/pip-9.0.3/docs/conf.py
new file mode 100644
index 0000000000000000000000000000000000000000..3a55481b6429242a8fbb4d8b3dea1d279274142f
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/conf.py
@@ -0,0 +1,227 @@
+# -*- coding: utf-8 -*-
+#
+# pip documentation build configuration file, created by
+# sphinx-quickstart on Tue Apr 22 22:08:49 2008
+#
+# This file is execfile()d with the current directory set to its containing dir
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import os
+import sys
+
+on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+sys.path.insert(0, os.path.abspath(os.pardir))
+# sys.path.append(os.path.join(os.path.dirname(__file__), '../'))
+
+# -- General configuration ----------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+# extensions = ['sphinx.ext.autodoc']
+extensions = ['sphinx.ext.extlinks', 'docs.pipext', 'sphinx.ext.intersphinx']
+
+# intersphinx
+intersphinx_cache_limit = 0
+intersphinx_mapping = {
+    'pypug': ('https://packaging.python.org/en/latest/', None),
+    'pypa': ('https://www.pypa.io/en/latest/', None),
+}
+
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = []
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+# source_encoding = 'utf-8'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = 'pip'
+copyright = '2008-2016, PyPA'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+try:
+    from pip import __version__
+    # The short X.Y version.
+    version = '.'.join(__version__.split('.')[:2])
+    # The full version, including alpha/beta/rc tags.
+    release = __version__
+except ImportError:
+    version = release = 'dev'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+# language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+# today = ''
+# Else, today_fmt is used as the format for a strftime call.
+today_fmt = '%B %d, %Y'
+
+# List of documents that shouldn't be included in the build.
+# unused_docs = []
+
+# List of directories, relative to source directory, that shouldn't be searched
+# for source files.
+exclude_trees = ['build']
+
+# The reST default role (used for this markup: `text`) to use for all documents
+# default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+# add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+# add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+# show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+# modindex_common_prefix = []
+
+extlinks = {
+    'issue': ('https://github.com/pypa/pip/issues/%s', '#'),
+    'pull': ('https://github.com/pypa/pip/pull/%s', 'PR #'),
+}
+
+# -- Options for HTML output --------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  Major themes that come with
+# Sphinx are currently 'default' and 'sphinxdoc'.
+html_theme = 'default'
+if not on_rtd:
+    try:
+        import sphinx_rtd_theme
+        html_theme = 'sphinx_rtd_theme'
+        html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
+    except ImportError:
+        pass
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+# html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+# html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+# html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+# html_logo = '_static/piplogo.png'
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+# html_favicon = 'favicon.png'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = []
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+html_use_smartypants = False
+
+# Custom sidebar templates, maps document names to template names.
+# html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+# html_additional_pages = {}
+
+# If false, no module index is generated.
+html_use_modindex = False
+
+# If false, no index is generated.
+html_use_index = False
+
+# If true, the index is split into individual pages for each letter.
+# html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+html_show_sourcelink = False
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+# html_use_opensearch = ''
+
+# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
+# html_file_suffix = ''
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'pipdocs'
+
+
+# -- Options for LaTeX output -------------------------------------------------
+
+# The paper size ('letter' or 'a4').
+# latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+# latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual])
+latex_documents = [
+    (
+        'index',
+        'pip.tex',
+        u'pip Documentation',
+        u'The pip developers',
+        'manual',
+    ),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+# latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+# latex_use_parts = False
+
+# Additional stuff for the LaTeX preamble.
+# latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+# latex_appendices = []
+
+# If false, no module index is generated.
+# latex_use_modindex = True
diff --git a/vendor/pip-9.0.3/docs/configuration.rst b/vendor/pip-9.0.3/docs/configuration.rst
new file mode 100644
index 0000000000000000000000000000000000000000..3af24de3b7a42bd6fe8f7ec5ff688eef59846e96
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/configuration.rst
@@ -0,0 +1,6 @@
+:orphan:
+
+Configuration
+=============
+
+This content is now covered in the :doc:`User Guide <user_guide>`
diff --git a/vendor/pip-9.0.3/docs/cookbook.rst b/vendor/pip-9.0.3/docs/cookbook.rst
new file mode 100644
index 0000000000000000000000000000000000000000..83d42a608f430ef5ec85eee99d55db4852340223
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/cookbook.rst
@@ -0,0 +1,7 @@
+:orphan:
+
+============
+Cookbook
+============
+
+This content is now covered in the :doc:`User Guide <user_guide>`
diff --git a/vendor/pip-9.0.3/docs/development.rst b/vendor/pip-9.0.3/docs/development.rst
new file mode 100644
index 0000000000000000000000000000000000000000..52daef6ab1866e32c6c7fa4e4a3f8e0f128fea81
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/development.rst
@@ -0,0 +1,127 @@
+===========
+Development
+===========
+
+Pull Requests
+=============
+
+- Submit Pull Requests against the `master` branch.
+- Provide a good description of what you're doing and why.
+- Provide tests that cover your changes and try to run the tests locally first.
+
+**Example**. Assuming you set up GitHub account, forked pip repository from
+https://github.com/pypa/pip to your own page via web interface, and your
+fork is located at https://github.com/yourname/pip
+
+::
+
+  $ git clone git@github.com:pypa/pip.git
+  $ cd pip
+  # ...
+  $ git diff
+  $ git add <modified> ...
+  $ git status
+  $ git commit
+
+You may reference relevant issues in commit messages (like #1259) to
+make GitHub link issues and commits together, and with phrase like
+"fixes #1259" you can even close relevant issues automatically. Now
+push the changes to your fork::
+
+  $ git push git@github.com:yourname/pip.git
+
+Open Pull Requests page at https://github.com/yourname/pip/pulls and
+click "New pull request". That's it.
+
+
+Automated Testing
+=================
+
+All pull requests and merges to 'master' branch are tested in `Travis <https://travis-ci.org/>`_
+based on our `.travis.yml file <https://github.com/pypa/pip/blob/master/.travis.yml>`_.
+
+Usually, a link to your specific travis build appears in pull requests, but if not,
+you can find it on our `travis pull requests page <https://travis-ci.org/pypa/pip/pull_requests>`_
+
+The only way to trigger Travis to run again for a pull request, is to submit another change to the pull branch.
+
+We also have Jenkins CI that runs regularly for certain python versions on windows and centos.
+
+Running tests
+=============
+
+OS Requirements: subversion, bazaar, git, and mercurial.
+
+Python Requirements: tox or pytest, virtualenv, scripttest, and mock
+
+Ways to run the tests locally:
+
+::
+
+ $ tox -e py33           # The preferred way to run the tests, can use pyNN to
+                         # run for a particular version or leave off the -e to
+                         # run for all versions.
+ $ python setup.py test  # Using the setuptools test plugin
+ $ py.test               # Using py.test directly
+ $ tox                   # Using tox against pip's tox.ini
+
+If you are missing one of the VCS tools, you can tell ``py.test`` to skip it:
+
+::
+
+ $ py.test -k 'not bzr'
+ $ py.test -k 'not svn'
+
+
+Getting Involved
+================
+
+The pip project welcomes help in the following ways:
+
+- Making Pull Requests for code, tests, or docs.
+- Commenting on open issues and pull requests.
+- Helping to answer questions on the mailing list.
+
+If you want to become an official maintainer, start by helping out.
+
+Later, when you think you're ready, get in touch with one of the maintainers,
+and they will initiate a vote.
+
+
+Release Process
+===============
+
+#. On the current pip ``master`` branch, generate a new ``AUTHORS.txt`` by
+   running ``invoke generate.authors`` and commit the results.
+#. On the current pip ``master`` branch, make a new commit which bumps the
+   version in ``pip/__init__.py`` to the release version and adjust the
+   ``CHANGES.txt`` file to reflect the current date.
+#. Create a signed tag of the ``master`` branch of the form ``X.Y.Z`` using the
+   command ``git tag -s X.Y.Z``.
+#. Checkout the tag using ``git checkout X.Y.Z`` and create the distribution
+   files using ``python setup.py sdist bdist_wheel``.
+#. Upload the distribution files to PyPI using twine
+   (``twine upload -s dist/*``). The upload should include GPG signatures of
+   the distribution files.
+#. Push all of the changes.
+#. Regenerate the ``get-pip.py`` script by running
+   ``invoke generate.installer`` in the get-pip repository, and committing the
+   results.
+
+
+Creating a Bugfix Release
+=========================
+
+Sometimes we need to release a bugfix release of the form ``X.Y.Z+1``. In order
+to create one of these the changes should already be merged into the
+``master`` branch.
+
+#. Create a new ``release/X.Y.Z+1`` branch off of the ``X.Y.Z`` tag using the
+   command ``git checkout -b release/X.Y.Z+1 X.Y.Z``.
+#. Cherry pick the fixed commits off of the ``master`` branch, fixing any
+   conflicts and moving any changelog entries from the development version's
+   changelog section to the ``X.Y.Z+1`` section.
+#. Push the ``release/X.Y.Z+1`` branch to github and submit a PR for it against
+   the ``master`` branch and wait for the tests to run.
+#. Once tests run, merge the ``release/X.Y.Z+1`` branch into master, and follow
+   the above release process starting with step 4.
diff --git a/vendor/pip-9.0.3/docs/index.rst b/vendor/pip-9.0.3/docs/index.rst
new file mode 100644
index 0000000000000000000000000000000000000000..ce08561fd47388fadab7f19acb419cabc3bb79e4
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/index.rst
@@ -0,0 +1,22 @@
+pip
+===
+
+`User list <http://groups.google.com/group/python-virtualenv>`_ |
+`Dev list <http://groups.google.com/group/pypa-dev>`_ |
+`Github <https://github.com/pypa/pip>`_ |
+`PyPI <https://pypi.python.org/pypi/pip/>`_ |
+User IRC: #pypa |
+Dev IRC: #pypa-dev
+
+The `PyPA recommended <https://packaging.python.org/en/latest/current/>`_ tool
+for installing Python packages.
+
+.. toctree::
+   :maxdepth: 2
+
+   quickstart
+   installing
+   user_guide
+   reference/index
+   development
+   news
diff --git a/vendor/pip-9.0.3/docs/installing.rst b/vendor/pip-9.0.3/docs/installing.rst
new file mode 100644
index 0000000000000000000000000000000000000000..cad3f2caec961c7bd746bbd455d77a97aa5312e4
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/installing.rst
@@ -0,0 +1,138 @@
+.. _`Installation`:
+
+Installation
+============
+
+Do I need to install pip?
+-------------------------
+
+pip is already installed if you're using Python 2 >=2.7.9 or Python 3 >=3.4
+binaries downloaded from `python.org <https://www.python.org>`_, but you'll
+need to :ref:`upgrade pip <Upgrading pip>`.
+
+Additionally, pip will already be installed if you're working in a :ref:`Virtual
+Environment <pypug:Creating and using Virtual Environments>` created by
+:ref:`pypug:virtualenv` or :ref:`pyvenv <pypug:venv>`.
+
+
+.. _`get-pip`:
+
+Installing with get-pip.py
+--------------------------
+
+To install pip, securely download `get-pip.py
+<https://bootstrap.pypa.io/get-pip.py>`_. [2]_
+
+Then run the following:
+
+::
+
+ python get-pip.py
+
+
+.. warning::
+
+   Be cautious if you're using a Python install that's managed by your operating
+   system or another package manager. get-pip.py does not coordinate with
+   those tools, and may leave your system in an inconsistent state.
+
+get-pip.py will also install :ref:`pypug:setuptools` [3]_ and :ref:`pypug:wheel`,
+if they're not already. :ref:`pypug:setuptools` is required to install
+:term:`source distributions <pypug:Source Distribution (or "sdist")>`.  Both are
+required to be able to build a :ref:`Wheel cache` (which improves installation
+speed), although neither are required to install pre-built :term:`wheels
+<pypug:Wheel>`.
+
+.. note::
+
+   The get-pip.py script is supported on the same python version as pip.
+   For the now unsupported Python 3.2, an alternate script is available
+   `here <https://bootstrap.pypa.io/3.2/get-pip.py>`_.
+
+
+get-pip.py options
+~~~~~~~~~~~~~~~~~~~
+
+.. option:: --no-setuptools
+
+    If set, don't attempt to install :ref:`pypug:setuptools`
+
+.. option:: --no-wheel
+
+    If set, don't attempt to install :ref:`pypug:wheel`
+
+
+Additionally, ``get-pip.py`` supports using the :ref:`pip install options <pip
+install Options>` and the :ref:`general options <General Options>`. Below are
+some examples:
+
+Install from local copies of pip and setuptools::
+
+  python get-pip.py --no-index --find-links=/local/copies
+
+Install to the user site [4]_::
+
+  python get-pip.py --user
+
+Install behind a proxy::
+
+  python get-pip.py --proxy="[user:passwd@]proxy.server:port"
+
+
+Using Linux Package Managers
+----------------------------
+
+See :ref:`pypug:Installing pip/setuptools/wheel with Linux Package Managers` in
+the `Python Packaging User Guide
+<https://packaging.python.org/en/latest/current/>`_.
+
+.. _`Upgrading pip`:
+
+Upgrading pip
+-------------
+
+On Linux or macOS:
+
+::
+
+ pip install -U pip
+
+
+On Windows [5]_:
+
+::
+
+ python -m pip install -U pip
+
+
+Python and OS Compatibility
+---------------------------
+
+pip works with CPython versions 2.6, 2.7, 3.3, 3.4, 3.5 and also pypy.
+
+This means pip works on the latest patch version of each of these minor versions
+(i.e. 2.6.9 for 2.6, etc).
+Previous patch versions are supported on a best effort approach.
+
+pip works on Unix/Linux, macOS, and Windows.
+
+
+----
+
+.. [1] For Python 2, see https://docs.python.org/2/installing, and for Python3,
+       see https://docs.python.org/3/installing.
+
+.. [2] "Secure" in this context means using a modern browser or a
+       tool like `curl` that verifies SSL certificates when downloading from
+       https URLs.
+
+.. [3] Beginning with pip v1.5.1, ``get-pip.py`` stopped requiring setuptools to
+       be installed first.
+
+.. [4] The pip developers are considering making ``--user`` the default for all
+       installs, including ``get-pip.py`` installs of pip, but at this time,
+       ``--user`` installs for pip itself, should not be considered to be fully
+       tested or endorsed. For discussion, see `Issue 1668
+       <https://github.com/pypa/pip/issues/1668>`_.
+
+.. [5] https://github.com/pypa/pip/issues/1299
diff --git a/vendor/pip-9.0.3/docs/logic.rst b/vendor/pip-9.0.3/docs/logic.rst
new file mode 100644
index 0000000000000000000000000000000000000000..0c27d8ce5a4aeac897d36cac9dd66134dffce45e
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/logic.rst
@@ -0,0 +1,8 @@
+:orphan:
+
+================
+Internal Details
+================
+
+This content is now covered in the :doc:`Reference Guide <reference/index>`
+
diff --git a/vendor/pip-9.0.3/docs/make.bat b/vendor/pip-9.0.3/docs/make.bat
new file mode 100644
index 0000000000000000000000000000000000000000..65726733056f7e13c05a4229e684e4597461de60
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/make.bat
@@ -0,0 +1,253 @@
+@ECHO OFF
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+	set SPHINXBUILD=sphinx-build
+)
+set BUILDDIR=_build
+set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
+set I18NSPHINXOPTS=%SPHINXOPTS% .
+if NOT "%PAPER%" == "" (
+	set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
+	set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
+)
+
+if "%1" == "" goto help
+
+if "%1" == "help" (
+	:help
+	echo.Please use `make ^<target^>` where ^<target^> is one of
+	echo.  html       to make standalone HTML files
+	echo.  dirhtml    to make HTML files named index.html in directories
+	echo.  singlehtml to make a single large HTML file
+	echo.  pickle     to make pickle files
+	echo.  json       to make JSON files
+	echo.  htmlhelp   to make HTML files and a HTML help project
+	echo.  qthelp     to make HTML files and a qthelp project
+	echo.  devhelp    to make HTML files and a Devhelp project
+	echo.  epub       to make an epub
+	echo.  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter
+	echo.  text       to make text files
+	echo.  man        to make manual pages
+	echo.  texinfo    to make Texinfo files
+	echo.  gettext    to make PO message catalogs
+	echo.  changes    to make an overview over all changed/added/deprecated items
+	echo.  xml        to make Docutils-native XML files
+	echo.  pseudoxml  to make pseudoxml-XML files for display purposes
+	echo.  linkcheck  to check all external links for integrity
+	echo.  doctest    to run all doctests embedded in the documentation if enabled
+	goto end
+)
+
+if "%1" == "clean" (
+	for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
+	del /q /s %BUILDDIR%\*
+	goto end
+)
+
+
+REM Check if sphinx-build is available and fallback to Python version if any
+%SPHINXBUILD% 2> nul
+if errorlevel 9009 goto sphinx_python
+goto sphinx_ok
+
+:sphinx_python
+
+set SPHINXBUILD=python -m sphinx.__init__
+%SPHINXBUILD% 2> nul
+if errorlevel 9009 (
+	echo.
+	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+	echo.installed, then set the SPHINXBUILD environment variable to point
+	echo.to the full path of the 'sphinx-build' executable. Alternatively you
+	echo.may add the Sphinx directory to PATH.
+	echo.
+	echo.If you don't have Sphinx installed, grab it from
+	echo.http://sphinx-doc.org/
+	exit /b 1
+)
+
+:sphinx_ok
+
+
+if "%1" == "html" (
+	%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/html.
+	goto end
+)
+
+if "%1" == "dirhtml" (
+	%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
+	goto end
+)
+
+if "%1" == "singlehtml" (
+	%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
+	goto end
+)
+
+if "%1" == "pickle" (
+	%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can process the pickle files.
+	goto end
+)
+
+if "%1" == "json" (
+	%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can process the JSON files.
+	goto end
+)
+
+if "%1" == "htmlhelp" (
+	%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can run HTML Help Workshop with the ^
+.hhp project file in %BUILDDIR%/htmlhelp.
+	goto end
+)
+
+if "%1" == "qthelp" (
+	%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can run "qcollectiongenerator" with the ^
+.qhcp project file in %BUILDDIR%/qthelp, like this:
+	echo.^> qcollectiongenerator %BUILDDIR%\qthelp\pip-installer.qhcp
+	echo.To view the help file:
+	echo.^> assistant -collectionFile %BUILDDIR%\qthelp\pip-installer.ghc
+	goto end
+)
+
+if "%1" == "devhelp" (
+	%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished.
+	goto end
+)
+
+if "%1" == "epub" (
+	%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The epub file is in %BUILDDIR%/epub.
+	goto end
+)
+
+if "%1" == "latex" (
+	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
+	goto end
+)
+
+if "%1" == "latexpdf" (
+	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+	cd %BUILDDIR%/latex
+	make all-pdf
+	cd %BUILDDIR%/..
+	echo.
+	echo.Build finished; the PDF files are in %BUILDDIR%/latex.
+	goto end
+)
+
+if "%1" == "latexpdfja" (
+	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+	cd %BUILDDIR%/latex
+	make all-pdf-ja
+	cd %BUILDDIR%/..
+	echo.
+	echo.Build finished; the PDF files are in %BUILDDIR%/latex.
+	goto end
+)
+
+if "%1" == "text" (
+	%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The text files are in %BUILDDIR%/text.
+	goto end
+)
+
+if "%1" == "man" (
+	%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The manual pages are in %BUILDDIR%/man.
+	goto end
+)
+
+if "%1" == "texinfo" (
+	%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
+	goto end
+)
+
+if "%1" == "gettext" (
+	%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
+	goto end
+)
+
+if "%1" == "changes" (
+	%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.The overview file is in %BUILDDIR%/changes.
+	goto end
+)
+
+if "%1" == "linkcheck" (
+	%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Link check complete; look for any errors in the above output ^
+or in %BUILDDIR%/linkcheck/output.txt.
+	goto end
+)
+
+if "%1" == "doctest" (
+	%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Testing of doctests in the sources finished, look at the ^
+results in %BUILDDIR%/doctest/output.txt.
+	goto end
+)
+
+if "%1" == "xml" (
+	%SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The XML files are in %BUILDDIR%/xml.
+	goto end
+)
+
+if "%1" == "pseudoxml" (
+	%SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.
+	goto end
+)
+
+:end
diff --git a/vendor/pip-9.0.3/docs/news.rst b/vendor/pip-9.0.3/docs/news.rst
new file mode 100644
index 0000000000000000000000000000000000000000..f3291119f7cea643c8f4487b388e5b9824680463
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/news.rst
@@ -0,0 +1,5 @@
+=============
+Release Notes
+=============
+
+.. include:: ../CHANGES.txt
diff --git a/vendor/pip-9.0.3/docs/pipext.py b/vendor/pip-9.0.3/docs/pipext.py
new file mode 100644
index 0000000000000000000000000000000000000000..2bcd244e0dcd5b16b523294096ff37054b55b743
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/pipext.py
@@ -0,0 +1,108 @@
+"""pip sphinx extensions"""
+
+import optparse
+import sys
+from docutils import nodes
+from docutils.parsers import rst
+from docutils.statemachine import ViewList
+from textwrap import dedent
+from pip.commands import commands_dict as commands
+from pip import cmdoptions
+from pip.utils import get_prog
+
+
+class PipCommandUsage(rst.Directive):
+    required_arguments = 1
+
+    def run(self):
+        cmd = commands[self.arguments[0]]
+        prog = '%s %s' % (get_prog(), cmd.name)
+        usage = dedent(cmd.usage.replace('%prog', prog))
+        node = nodes.literal_block(usage, usage)
+        return [node]
+
+
+class PipCommandDescription(rst.Directive):
+    required_arguments = 1
+
+    def run(self):
+        node = nodes.paragraph()
+        node.document = self.state.document
+        desc = ViewList()
+        description = dedent(commands[self.arguments[0]].__doc__)
+        for line in description.split('\n'):
+            desc.append(line, "")
+        self.state.nested_parse(desc, 0, node)
+        return [node]
+
+
+class PipOptions(rst.Directive):
+
+    def _format_option(self, option, cmd_name=None):
+        if cmd_name:
+            bookmark_line = ".. _`%s_%s`:" % (cmd_name, option._long_opts[0])
+        else:
+            bookmark_line = ".. _`%s`:" % option._long_opts[0]
+        line = ".. option:: "
+        if option._short_opts:
+            line += option._short_opts[0]
+        if option._short_opts and option._long_opts:
+            line += ", %s" % option._long_opts[0]
+        elif option._long_opts:
+            line += option._long_opts[0]
+        if option.takes_value():
+            metavar = option.metavar or option.dest.lower()
+            line += " <%s>" % metavar.lower()
+        # fix defaults
+        opt_help = option.help.replace('%default', str(option.default))
+        # fix paths with sys.prefix
+        opt_help = opt_help.replace(sys.prefix, "<sys.prefix>")
+        return [bookmark_line, "", line, "", "    %s" % opt_help, ""]
+
+    def _format_options(self, options, cmd_name=None):
+        for option in options:
+            if option.help == optparse.SUPPRESS_HELP:
+                continue
+            for line in self._format_option(option, cmd_name):
+                self.view_list.append(line, "")
+
+    def run(self):
+        node = nodes.paragraph()
+        node.document = self.state.document
+        self.view_list = ViewList()
+        self.process_options()
+        self.state.nested_parse(self.view_list, 0, node)
+        return [node]
+
+
+class PipGeneralOptions(PipOptions):
+    def process_options(self):
+        self._format_options(
+            [o() for o in cmdoptions.general_group['options']]
+        )
+
+
+class PipIndexOptions(PipOptions):
+    def process_options(self):
+        self._format_options(
+            [o() for o in cmdoptions.index_group['options']]
+        )
+
+
+class PipCommandOptions(PipOptions):
+    required_arguments = 1
+
+    def process_options(self):
+        cmd = commands[self.arguments[0]]()
+        self._format_options(
+            cmd.parser.option_groups[0].option_list,
+            cmd_name=cmd.name,
+        )
+
+
+def setup(app):
+    app.add_directive('pip-command-usage', PipCommandUsage)
+    app.add_directive('pip-command-description', PipCommandDescription)
+    app.add_directive('pip-command-options', PipCommandOptions)
+    app.add_directive('pip-general-options', PipGeneralOptions)
+    app.add_directive('pip-index-options', PipIndexOptions)
diff --git a/vendor/pip-9.0.3/docs/quickstart.rst b/vendor/pip-9.0.3/docs/quickstart.rst
new file mode 100644
index 0000000000000000000000000000000000000000..efd6d3486308ea469003dd88bde7126c39ee3ffd
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/quickstart.rst
@@ -0,0 +1,65 @@
+Quickstart
+==========
+
+First, :doc:`Install pip <installing>`.
+
+Install a package from `PyPI`_:
+
+::
+
+  $ pip install SomePackage
+    [...]
+    Successfully installed SomePackage
+
+Install a package already downloaded from `PyPI`_ or got elsewhere.
+This is useful if the target machine does not have a network connection:
+
+::
+
+  $ pip install SomePackage-1.0-py2.py3-none-any.whl
+    [...]
+    Successfully installed SomePackage
+
+Show what files were installed:
+
+::
+
+  $ pip show --files SomePackage
+    Name: SomePackage
+    Version: 1.0
+    Location: /my/env/lib/pythonx.x/site-packages
+    Files:
+     ../somepackage/__init__.py
+     [...]
+
+List what packages are outdated:
+
+::
+
+  $ pip list --outdated
+    SomePackage (Current: 1.0 Latest: 2.0)
+
+Upgrade a package:
+
+::
+
+  $ pip install --upgrade SomePackage
+    [...]
+    Found existing installation: SomePackage 1.0
+    Uninstalling SomePackage:
+      Successfully uninstalled SomePackage
+    Running setup.py install for SomePackage
+    Successfully installed SomePackage
+
+Uninstall a package:
+
+::
+
+  $ pip uninstall SomePackage
+    Uninstalling SomePackage:
+      /my/env/lib/pythonx.x/site-packages/somepackage
+    Proceed (y/n)? y
+    Successfully uninstalled SomePackage
+
+
+.. _PyPI: http://pypi.python.org/pypi/
diff --git a/vendor/pip-9.0.3/docs/reference/index.rst b/vendor/pip-9.0.3/docs/reference/index.rst
new file mode 100644
index 0000000000000000000000000000000000000000..cb83554b30ea69ca40e18284a046b2e8fc0a65cf
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/reference/index.rst
@@ -0,0 +1,17 @@
+===============
+Reference Guide
+===============
+
+.. toctree::
+   :maxdepth: 2
+
+   pip
+   pip_install
+   pip_download
+   pip_uninstall
+   pip_freeze
+   pip_list
+   pip_show
+   pip_search
+   pip_wheel
+   pip_hash
diff --git a/vendor/pip-9.0.3/docs/reference/pip.rst b/vendor/pip-9.0.3/docs/reference/pip.rst
new file mode 100644
index 0000000000000000000000000000000000000000..d14e6db095ca5ad5d498e0836d2d94c706064bdc
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/reference/pip.rst
@@ -0,0 +1,130 @@
+pip
+---
+
+.. contents::
+
+Usage
+*****
+
+::
+
+ pip <command> [options]
+
+
+Description
+***********
+
+
+.. _`Logging`:
+
+Logging
+=======
+
+Console logging
+~~~~~~~~~~~~~~~
+
+pip offers :ref:`-v, --verbose <--verbose>` and :ref:`-q, --quiet <--quiet>`
+to control the console log level.
+
+
+.. _`FileLogging`:
+
+File logging
+~~~~~~~~~~~~
+
+pip offers the :ref:`--log <--log>` option for specifying a file where a maximum
+verbosity log will be kept.  This option is empty by default. This log appends
+to previous logging.
+
+Like all pip options, ``--log`` can also be set as an environment variable, or
+placed into the pip config file.  See the :ref:`Configuration` section.
+
+.. _`exists-action`:
+
+--exists-action option
+======================
+
+This option specifies default behavior when path already exists.
+Possible cases: downloading files or checking out repositories for installation,
+creating archives. If ``--exists-action`` is not defined, pip will prompt
+when decision is needed.
+
+*(s)witch*
+    Only relevant to VCS checkout. Attempt to switch the checkout
+    to the appropriate url and/or revision.
+*(i)gnore*
+    Abort current operation (e.g. don't copy file, don't create archive,
+    don't modify a checkout).
+*(w)ipe*
+    Delete the file or VCS checkout before trying to create, download, or checkout a new one.
+*(b)ackup*
+    Rename the file or checkout to ``{name}{'.bak' * n}``, where n is some number
+    of ``.bak`` extensions, such that the file didn't exist at some point.
+    So the most recent backup will be the one with the largest number after ``.bak``.
+*(a)abort*
+    Abort pip and return non-zero exit status.
+
+.. _`build-interface`:
+
+Build System Interface
+======================
+
+Pip builds packages by invoking the build system. Presently, the only supported
+build system is ``setuptools``, but future developments to the Python packaging
+infrastructure are expected to include support for other build systems.  As
+well as package building, the build system is also invoked to install packages
+direct from source.
+
+The interface to the build system is via the ``setup.py`` command line script -
+all build actions are defined in terms of the specific ``setup.py`` command
+line that will be run to invoke the required action.
+
+Setuptools Injection
+~~~~~~~~~~~~~~~~~~~~
+
+As noted above, the supported build system is ``setuptools``. However, not all
+packages use ``setuptools`` in their build scripts. To support projects that
+use "pure ``distutils``", pip injects ``setuptools`` into ``sys.modules``
+before invoking ``setup.py``. The injection should be transparent to
+``distutils``-based projects, but 3rd party build tools wishing to provide a
+``setup.py`` emulating the commands pip requires may need to be aware that it
+takes place.
+
+Future Developments
+~~~~~~~~~~~~~~~~~~~
+
+`PEP426`_ notes that the intention is to add hooks to project metadata in
+version 2.1 of the metadata spec, to explicitly define how to build a project
+from its source. Once this version of the metadata spec is final, pip will
+migrate to using that interface. At that point, the ``setup.py`` interface
+documented here will be retained solely for legacy purposes, until projects
+have migrated.
+
+Specifically, applications should *not* expect to rely on there being any form
+of backward compatibility guarantees around the ``setup.py`` interface.
+
+.. _PEP426: http://www.python.org/dev/peps/pep-0426/#metabuild-system
+
+Build Options
+~~~~~~~~~~~~~
+
+The ``--global-option`` and ``--build-option`` arguments to the ``pip install``
+and ``pip wheel`` inject additional arguments into the ``setup.py`` command
+(``--build-option`` is only available in ``pip wheel``).  These arguments are
+included in the command as follows::
+
+    python setup.py <global_options> BUILD COMMAND <build_options>
+
+The options are passed unmodified, and presently offer direct access to the
+distutils command line. Use of ``--global-option`` and ``--build-option``
+should be considered as build system dependent, and may not be supported in the
+current form if support for alternative build systems is added to pip.
+
+
+.. _`General Options`:
+
+General Options
+***************
+
+.. pip-general-options::
+
diff --git a/vendor/pip-9.0.3/docs/reference/pip_download.rst b/vendor/pip-9.0.3/docs/reference/pip_download.rst
new file mode 100644
index 0000000000000000000000000000000000000000..153282cce8c740528aa33d11078314e8422b2bdf
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/reference/pip_download.rst
@@ -0,0 +1,120 @@
+
+.. _`pip download`:
+
+pip download
+------------
+
+.. contents::
+
+Usage
+*****
+
+.. pip-command-usage:: download
+
+
+Description
+***********
+
+.. pip-command-description:: download
+
+
+Overview
+++++++++
+``pip download`` replaces the ``--download`` option to ``pip install``,
+which is now deprecated and will be removed in pip 10.
+
+``pip download`` does the same resolution and downloading as ``pip install``,
+but instead of installing the dependencies, it collects the downloaded
+distributions into the directory provided (defaulting to the current
+directory). This directory can later be passed as the value to ``pip install
+--find-links`` to facilitate offline or locked down package installation.
+
+``pip download`` with the ``--platform``, ``--python-version``,
+``--implementation``, and ``--abi`` options provides the ability to fetch
+dependencies for an interpreter and system other than the ones that pip is
+running on. ``--only-binary=:all:`` is required when using any of these
+options. It is important to note that these options all default to the
+current system/interpreter, and not to the most restrictive constraints (e.g.
+platform any, abi none, etc). To avoid fetching dependencies that happen to
+match the constraint of the current interpreter (but not your target one), it
+is recommended to specify all of these options if you are specifying one of
+them. Generic dependencies (e.g. universal wheels, or dependencies with no
+platform, abi, or implementation constraints) will still match an over-
+constrained download requirement.
+
+
+
+Options
+*******
+
+.. pip-command-options:: download
+
+.. pip-index-options::
+
+
+Examples
+********
+
+#. Download a package and all of its dependencies
+
+    ::
+
+      $ pip download SomePackage
+      $ pip download -d . SomePackage  # equivalent to above
+      $ pip download --no-index --find-links=/tmp/wheelhouse -d /tmp/otherwheelhouse SomePackage
+
+#. Download a package and all of its dependencies with OSX specific interpreter constraints.
+    This forces OSX 10.10 or lower compatibility. Since OSX deps are forward compatible,
+    this will also match ``macosx-10_9_x86_64``, ``macosx-10_8_x86_64``, ``macosx-10_8_intel``,
+    etc.
+    It will also match deps with platform ``any``. Also force the interpreter version to ``27``
+    (or more generic, i.e. ``2``) and implementation to ``cp`` (or more generic, i.e. ``py``).
+
+    ::
+
+      $ pip download \
+          --only-binary=:all: \
+          --platform macosx-10_10_x86_64 \
+          --python-version 27 \
+          --implementation cp \
+          SomePackage
+
+#. Download a package and its dependencies with linux specific constraints.
+    Force the interpreter to be any minor version of py3k, and only accept
+    ``cp34m`` or ``none`` as the abi.
+
+    ::
+
+      $ pip download \
+          --only-binary=:all: \
+          --platform linux_x86_64 \
+          --python-version 3 \
+          --implementation cp \
+          --abi cp34m \
+          SomePackage
+
+#. Force platform, implementation, and abi agnostic deps.
+
+    ::
+
+      $ pip download \
+          --only-binary=:all: \
+          --platform any \
+          --python-version 3 \
+          --implementation py \
+          --abi none \
+          SomePackage
+
+#. Even when overconstrained, this will still correctly fetch the pip universal wheel.
+
+    ::
+
+      $ pip download \
+          --only-binary=:all: \
+          --platform linux_x86_64 \
+          --python-version 33 \
+          --implementation cp \
+          --abi cp34m \
+          pip>=8
+      $ ls pip-8.1.1-py2.py3-none-any.whl
+      pip-8.1.1-py2.py3-none-any.whl
diff --git a/vendor/pip-9.0.3/docs/reference/pip_freeze.rst b/vendor/pip-9.0.3/docs/reference/pip_freeze.rst
new file mode 100644
index 0000000000000000000000000000000000000000..c13bc00f3b6b083b85491d395059ac0293c7f35b
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/reference/pip_freeze.rst
@@ -0,0 +1,47 @@
+
+.. _`pip freeze`:
+
+pip freeze
+-----------
+
+.. contents::
+
+Usage
+*****
+
+.. pip-command-usage:: freeze
+
+
+Description
+***********
+
+.. pip-command-description:: freeze
+
+
+Options
+*******
+
+.. pip-command-options:: freeze
+
+
+Examples
+********
+
+#. Generate output suitable for a requirements file.
+
+    ::
+
+     $ pip freeze
+     docutils==0.11
+     Jinja2==2.7.2
+     MarkupSafe==0.19
+     Pygments==1.6
+     Sphinx==1.2.2
+
+
+#. Generate a requirements file and then install from it in another environment.
+
+    ::
+
+     $ env1/bin/pip freeze > requirements.txt
+     $ env2/bin/pip install -r requirements.txt
diff --git a/vendor/pip-9.0.3/docs/reference/pip_hash.rst b/vendor/pip-9.0.3/docs/reference/pip_hash.rst
new file mode 100644
index 0000000000000000000000000000000000000000..72052bc22dc6ac5b34f5a29be838b84f2bbf4e5e
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/reference/pip_hash.rst
@@ -0,0 +1,49 @@
+.. _`pip hash`:
+
+pip hash
+------------
+
+.. contents::
+
+Usage
+*****
+
+.. pip-command-usage:: hash
+
+
+Description
+***********
+
+.. pip-command-description:: hash
+
+
+Overview
+++++++++
+``pip hash`` is a convenient way to get a hash digest for use with
+:ref:`hash-checking mode`, especially for packages with multiple archives. The
+error message from ``pip install --require-hashes ...`` will give you one
+hash, but, if there are multiple archives (like source and binary ones), you
+will need to manually download and compute a hash for the others. Otherwise, a
+spurious hash mismatch could occur when :ref:`pip install` is passed a
+different set of options, like :ref:`--no-binary <install_--no-binary>`.
+
+
+Options
+*******
+
+.. pip-command-options:: hash
+
+
+Example
+********
+
+Compute the hash of a downloaded archive::
+
+    $ pip download SomePackage
+        Collecting SomePackage
+          Downloading SomePackage-2.2.tar.gz
+          Saved ./pip_downloads/SomePackage-2.2.tar.gz
+        Successfully downloaded SomePackage
+    $ pip hash ./pip_downloads/SomePackage-2.2.tar.gz
+        ./pip_downloads/SomePackage-2.2.tar.gz:
+        --hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
diff --git a/vendor/pip-9.0.3/docs/reference/pip_install.rst b/vendor/pip-9.0.3/docs/reference/pip_install.rst
new file mode 100644
index 0000000000000000000000000000000000000000..fbc42becee2f6e9ea4bc29231e4a373517a2a93d
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/reference/pip_install.rst
@@ -0,0 +1,840 @@
+.. _`pip install`:
+
+pip install
+-----------
+
+.. contents::
+
+Usage
+*****
+
+.. pip-command-usage:: install
+
+Description
+***********
+
+.. pip-command-description:: install
+
+
+Overview
+++++++++
+
+Pip install has several stages:
+
+1. Identify the base requirements. The user supplied arguments are processed
+   here.
+2. Resolve dependencies. What will be installed is determined here.
+3. Build wheels. All the dependencies that can be are built into wheels.
+4. Install the packages (and uninstall anything being upgraded/replaced).
+
+Argument Handling
++++++++++++++++++
+
+When looking at the items to be installed, pip checks what type of item
+each is, in the following order:
+
+1. Project or archive URL.
+2. Local directory (which must contain a ``setup.py``, or pip will report
+   an error).
+3. Local file (a sdist or wheel format archive, following the naming
+   conventions for those formats).
+4. A requirement, as specified in PEP 440.
+
+Each item identified is added to the set of requirements to be satisfied by
+the install.
+
+Working Out the Name and Version
+++++++++++++++++++++++++++++++++
+
+For each candidate item, pip needs to know the project name and version. For
+wheels (identified by the ``.whl`` file extension) this can be obtained from
+the filename, as per the Wheel spec. For local directories, or explicitly
+specified sdist files, the ``setup.py egg_info`` command is used to determine
+the project metadata. For sdists located via an index, the filename is parsed
+for the name and project version (this is in theory slightly less reliable
+than using the ``egg_info`` command, but avoids downloading and processing
+unnecessary numbers of files).
+
+Any URL may use the ``#egg=name`` syntax (see :ref:`VCS Support`) to
+explicitly state the project name.
+
+Satisfying Requirements
++++++++++++++++++++++++
+
+Once pip has the set of requirements to satisfy, it chooses which version of
+each requirement to install using the simple rule that the latest version that
+satisfies the given constraints will be installed (but see :ref:`here <Pre Release Versions>`
+for an exception regarding pre-release versions). Where more than one source of
+the chosen version is available, it is assumed that any source is acceptable
+(as otherwise the versions would differ).
+
+Installation Order
+++++++++++++++++++
+
+As of v6.1.0, pip installs dependencies before their dependents, i.e. in
+"topological order".  This is the only commitment pip currently makes related
+to order.  While it may be coincidentally true that pip will install things in
+the order of the install arguments or in the order of the items in a
+requirements file, this is not a promise.
+
+In the event of a dependency cycle (aka "circular dependency"), the current
+implementation (which might possibly change later) has it such that the first
+encountered member of the cycle is installed last.
+
+For instance, if quux depends on foo which depends on bar which depends on baz,
+which depends on foo::
+
+    pip install quux
+    ...
+    Installing collected packages baz, bar, foo, quux
+
+    pip install bar
+    ...
+    Installing collected packages foo, baz, bar
+
+
+Prior to v6.1.0, pip made no commitments about install order.
+
+The decision to install topologically is based on the principle that
+installations should proceed in a way that leaves the environment usable at each
+step. This has two main practical benefits:
+
+1. Concurrent use of the environment during the install is more likely to work.
+2. A failed install is less likely to leave a broken environment.  Although pip
+   would like to support failure rollbacks eventually, in the mean time, this is
+   an improvement.
+
+Although the new install order is not intended to replace (and does not replace)
+the use of ``setup_requires`` to declare build dependencies, it may help certain
+projects install from sdist (that might previously fail) that fit the following
+profile:
+
+1. They have build dependencies that are also declared as install dependencies
+   using ``install_requires``.
+2. ``python setup.py egg_info`` works without their build dependencies being
+   installed.
+3. For whatever reason, they don't or won't declare their build dependencies using
+   ``setup_requires``.
+
+
+.. _`Requirements File Format`:
+
+Requirements File Format
+++++++++++++++++++++++++
+
+Each line of the requirements file indicates something to be installed,
+and like arguments to :ref:`pip install`, the following forms are supported::
+
+    [[--option]...]
+    <requirement specifier> [; markers] [[--option]...]
+    <archive url/path>
+    [-e] <local project path>
+    [-e] <vcs project url>
+
+For details on requirement specifiers, see :ref:`Requirement Specifiers`.
+
+See the :ref:`pip install Examples<pip install Examples>` for examples of all these forms.
+
+A line that begins with ``#`` is treated as a comment and ignored. Whitespace
+followed by a ``#`` causes the ``#`` and the remainder of the line to be
+treated as a comment.
+
+A line ending in an unescaped ``\`` is treated as a line continuation
+and the newline following it is effectively ignored.
+
+Comments are stripped *before* line continuations are processed.
+
+The following options are supported:
+
+  *  :ref:`-i, --index-url <--index-url>`
+  *  :ref:`--extra-index-url <--extra-index-url>`
+  *  :ref:`--no-index <--no-index>`
+  *  :ref:`-f, --find-links <--find-links>`
+  *  :ref:`--no-binary <install_--no-binary>`
+  *  :ref:`--only-binary <install_--only-binary>`
+  *  :ref:`--require-hashes <--require-hashes>`
+
+For example, to specify :ref:`--no-index <--no-index>` and 2 :ref:`--find-links <--find-links>` locations:
+
+::
+
+--no-index
+--find-links /my/local/archives
+--find-links http://some.archives.com/archives
+
+
+If you wish, you can refer to other requirements files, like this::
+
+    -r more_requirements.txt
+
+You can also refer to :ref:`constraints files <Constraints Files>`, like this::
+
+    -c some_constraints.txt
+
+.. _`Example Requirements File`:
+
+Example Requirements File
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Use ``pip install -r example-requirements.txt`` to install::
+
+    #
+    ####### example-requirements.txt #######
+    #
+    ###### Requirements without Version Specifiers ######
+    nose
+    nose-cov
+    beautifulsoup4
+    #
+    ###### Requirements with Version Specifiers ######
+    #   See https://www.python.org/dev/peps/pep-0440/#version-specifiers
+    docopt == 0.6.1             # Version Matching. Must be version 0.6.1
+    keyring >= 4.1.1            # Minimum version 4.1.1
+    coverage != 3.5             # Version Exclusion. Anything except version 3.5
+    Mopidy-Dirble ~= 1.1        # Compatible release. Same as >= 1.1, == 1.*
+    #
+    ###### Refer to other requirements files ######
+    -r other-requirements.txt
+    #
+    #
+    ###### A particular file ######
+    ./downloads/numpy-1.9.2-cp34-none-win32.whl
+    http://wxpython.org/Phoenix/snapshot-builds/wxPython_Phoenix-3.0.3.dev1820+49a8884-cp34-none-win_amd64.whl
+    #
+    ###### Additional Requirements without Version Specifiers ######
+    #   Same as 1st section, just here to show that you can put things in any order.
+    rejected
+    green
+    #
+
+.. _`Requirement Specifiers`:
+
+Requirement Specifiers
+++++++++++++++++++++++
+
+pip supports installing from a package index using a :term:`requirement
+specifier <pypug:Requirement Specifier>`. Generally speaking, a requirement
+specifier is composed of a project name followed by optional :term:`version
+specifiers <pypug:Version Specifier>`.  `PEP508`_ contains a full specification
+of the format of a requirement (``pip`` does not support the ``url_req`` form
+of specifier at this time).
+
+Some examples:
+
+ ::
+
+  SomeProject
+  SomeProject == 1.3
+  SomeProject >=1.2,<.2.0
+  SomeProject[foo, bar]
+  SomeProject~=1.4.2
+
+Since version 6.0, pip also supports specifiers containing `environment markers
+<https://www.python.org/dev/peps/pep-0426/#environment-markers>`_ like so:
+
+ ::
+
+  SomeProject ==5.4 ; python_version < '2.7'
+  SomeProject; sys_platform == 'win32'
+
+Environment markers are supported in the command line and in requirements files.
+
+.. note::
+
+   Use quotes around specifiers in the shell when using ``>``, ``<``, or when
+   using environment markers. Don't use quotes in requirement files. [1]_
+
+
+.. _`Per-requirement Overrides`:
+
+Per-requirement Overrides
++++++++++++++++++++++++++
+
+Since version 7.0 pip supports controlling the command line options given to
+``setup.py`` via requirements files. This disables the use of wheels (cached or
+otherwise) for that package, as ``setup.py`` does not exist for wheels.
+
+The ``--global-option`` and ``--install-option`` options are used to pass
+options to ``setup.py``. For example:
+
+ ::
+
+    FooProject >= 1.2 --global-option="--no-user-cfg" \
+                      --install-option="--prefix='/usr/local'" \
+                      --install-option="--no-compile"
+
+The above translates roughly into running FooProject's ``setup.py``
+script as:
+
+ ::
+
+   python setup.py --no-user-cfg install --prefix='/usr/local' --no-compile
+
+Note that the only way of giving more than one option to ``setup.py``
+is through multiple ``--global-option`` and ``--install-option``
+options, as shown in the example above. The value of each option is
+passed as a single argument to the ``setup.py`` script. Therefore, a
+line such as the following is invalid and would result in an
+installation error.
+
+::
+
+   # Invalid. Please use '--install-option' twice as shown above.
+   FooProject >= 1.2 --install-option="--prefix=/usr/local --no-compile"
+
+
+.. _`Pre Release Versions`:
+
+Pre-release Versions
+++++++++++++++++++++
+
+Starting with v1.4, pip will only install stable versions as specified by
+`PEP426`_ by default. If a version cannot be parsed as a compliant `PEP426`_
+version then it is assumed to be a pre-release.
+
+If a Requirement specifier includes a pre-release or development version
+(e.g. ``>=0.0.dev0``) then pip will allow pre-release and development versions
+for that requirement. This does not include the != flag.
+
+The ``pip install`` command also supports a :ref:`--pre <install_--pre>` flag
+that will enable installing pre-releases and development releases.
+
+
+.. _PEP426: http://www.python.org/dev/peps/pep-0426
+
+
+.. _`VCS Support`:
+
+VCS Support
++++++++++++
+
+pip supports installing from Git, Mercurial, Subversion and Bazaar, and detects
+the type of VCS using url prefixes: "git+", "hg+", "bzr+", "svn+".
+
+pip requires a working VCS command on your path: git, hg, svn, or bzr.
+
+VCS projects can be installed in :ref:`editable mode <editable-installs>` (using
+the :ref:`--editable <install_--editable>` option) or not.
+
+* For editable installs, the clone location by default is "<venv
+  path>/src/SomeProject" in virtual environments, and "<cwd>/src/SomeProject"
+  for global installs.  The :ref:`--src <install_--src>` option can be used to
+  modify this location.
+* For non-editable installs, the project is built locally in a temp dir and then
+  installed normally. Note that if a satisfactory version of the package is
+  already installed, the VCS source will not overwrite it without an `--upgrade`
+  flag. VCS requirements pin the package version (specified in the `setup.py`
+  file) of the target commit, not necessarily the commit itself.
+
+The "project name" component of the url suffix "egg=<project name>-<version>"
+is used by pip in its dependency logic to identify the project prior
+to pip downloading and analyzing the metadata.  The optional "version"
+component of the egg name is not functionally important.  It merely
+provides a human-readable clue as to what version is in use. For projects
+where setup.py is not in the root of project, "subdirectory" component
+is used. Value of "subdirectory" component should be a path starting from root
+of the project to where setup.py is located.
+
+So if your repository layout is:
+
+    - pkg_dir/
+
+      - setup.py  # setup.py for package ``pkg``
+      - some_module.py
+    - other_dir/
+
+      - some_file
+    - some_other_file
+
+You'll need to use ``pip install -e vcs+protocol://repo_url/#egg=pkg&subdirectory=pkg_dir``.
+
+
+Git
+~~~
+
+pip currently supports cloning over ``git``, ``git+http``, ``git+https``,
+``git+ssh``, ``git+git`` and ``git+file``:
+
+Here are the supported forms::
+
+    [-e] git://git.myproject.org/MyProject#egg=MyProject
+    [-e] git+http://git.myproject.org/MyProject#egg=MyProject
+    [-e] git+https://git.myproject.org/MyProject#egg=MyProject
+    [-e] git+ssh://git.myproject.org/MyProject#egg=MyProject
+    [-e] git+git://git.myproject.org/MyProject#egg=MyProject
+    [-e] git+file://git.myproject.org/MyProject#egg=MyProject
+    -e git+git@git.myproject.org:MyProject#egg=MyProject
+
+Passing branch names, a commit hash or a tag name is possible like so::
+
+    [-e] git://git.myproject.org/MyProject.git@master#egg=MyProject
+    [-e] git://git.myproject.org/MyProject.git@v1.0#egg=MyProject
+    [-e] git://git.myproject.org/MyProject.git@da39a3ee5e6b4b0d3255bfef95601890afd80709#egg=MyProject
+
+Mercurial
+~~~~~~~~~
+
+The supported schemes are: ``hg+http``, ``hg+https``,
+``hg+static-http`` and ``hg+ssh``.
+
+Here are the supported forms::
+
+    [-e] hg+http://hg.myproject.org/MyProject#egg=MyProject
+    [-e] hg+https://hg.myproject.org/MyProject#egg=MyProject
+    [-e] hg+ssh://hg.myproject.org/MyProject#egg=MyProject
+
+You can also specify a revision number, a revision hash, a tag name or a local
+branch name like so::
+
+    [-e] hg+http://hg.myproject.org/MyProject@da39a3ee5e6b#egg=MyProject
+    [-e] hg+http://hg.myproject.org/MyProject@2019#egg=MyProject
+    [-e] hg+http://hg.myproject.org/MyProject@v1.0#egg=MyProject
+    [-e] hg+http://hg.myproject.org/MyProject@special_feature#egg=MyProject
+
+Subversion
+~~~~~~~~~~
+
+pip supports the URL schemes ``svn``, ``svn+svn``, ``svn+http``, ``svn+https``, ``svn+ssh``.
+
+You can also give specific revisions to an SVN URL, like so::
+
+    [-e] svn+svn://svn.myproject.org/svn/MyProject#egg=MyProject
+    [-e] svn+http://svn.myproject.org/svn/MyProject/trunk@2019#egg=MyProject
+
+which will check out revision 2019.  ``@{20080101}`` would also check
+out the revision from 2008-01-01. You can only check out specific
+revisions using ``-e svn+...``.
+
+Bazaar
+~~~~~~
+
+pip supports Bazaar using the ``bzr+http``, ``bzr+https``, ``bzr+ssh``,
+``bzr+sftp``, ``bzr+ftp`` and ``bzr+lp`` schemes.
+
+Here are the supported forms::
+
+    [-e] bzr+http://bzr.myproject.org/MyProject/trunk#egg=MyProject
+    [-e] bzr+sftp://user@myproject.org/MyProject/trunk#egg=MyProject
+    [-e] bzr+ssh://user@myproject.org/MyProject/trunk#egg=MyProject
+    [-e] bzr+ftp://user@myproject.org/MyProject/trunk#egg=MyProject
+    [-e] bzr+lp:MyProject#egg=MyProject
+
+Tags or revisions can be installed like so::
+
+    [-e] bzr+https://bzr.myproject.org/MyProject/trunk@2019#egg=MyProject
+    [-e] bzr+http://bzr.myproject.org/MyProject/trunk@v1.0#egg=MyProject
+
+
+Finding Packages
+++++++++++++++++
+
+pip searches for packages on `PyPI`_ using the
+`http simple interface <http://pypi.python.org/simple>`_,
+which is documented `here <https://setuptools.readthedocs.io/en/latest/easy_install.html#package-index-api>`_
+and `there <http://www.python.org/dev/peps/pep-0301/>`_
+
+pip offers a number of Package Index Options for modifying how packages are found.
+
+pip looks for packages in a number of places, on PyPI (if not disabled via
+```--no-index```), in the local filesystem, and in any additional repositories
+specified via ```--find-links``` or ```--index-url```. There is no ordering in
+the locations that are searched, rather they are all checked, and the "best"
+match for the requirements (in terms of version number - see `PEP440`_ for
+details) is selected.
+
+See the :ref:`pip install Examples<pip install Examples>`.
+
+
+.. _`SSL Certificate Verification`:
+
+SSL Certificate Verification
+++++++++++++++++++++++++++++
+
+Starting with v1.3, pip provides SSL certificate verification over https, to
+prevent man-in-the-middle attacks against PyPI downloads.
+
+
+.. _`Caching`:
+
+Caching
++++++++
+
+Starting with v6.0, pip provides an on-by-default cache which functions
+similarly to that of a web browser. While the cache is on by default and is
+designed do the right thing by default you can disable the cache and always
+access PyPI by utilizing the ``--no-cache-dir`` option.
+
+When making any HTTP request pip will first check its local cache to determine
+if it has a suitable response stored for that request which has not expired. If
+it does then it simply returns that response and doesn't make the request.
+
+If it has a response stored, but it has expired, then it will attempt to make a
+conditional request to refresh the cache which will either return an empty
+response telling pip to simply use the cached item (and refresh the expiration
+timer) or it will return a whole new response which pip can then store in the
+cache.
+
+When storing items in the cache, pip will respect the ``CacheControl`` header
+if it exists, or it will fall back to the ``Expires`` header if that exists.
+This allows pip to function as a browser would, and allows the index server
+to communicate to pip how long it is reasonable to cache any particular item.
+
+While this cache attempts to minimize network activity, it does not prevent
+network access altogether. If you want a local install solution that
+circumvents accessing PyPI, see :ref:`Installing from local packages`.
+
+The default location for the cache directory depends on the Operating System:
+
+Unix
+  :file:`~/.cache/pip` and it respects the ``XDG_CACHE_HOME`` directory.
+macOS
+  :file:`~/Library/Caches/pip`.
+Windows
+  :file:`<CSIDL_LOCAL_APPDATA>\\pip\\Cache`
+
+
+.. _`Wheel cache`:
+
+Wheel Cache
+~~~~~~~~~~~
+
+Pip will read from the subdirectory ``wheels`` within the pip cache directory
+and use any packages found there. This is disabled via the same
+``--no-cache-dir`` option that disables the HTTP cache. The internal structure
+of that is not part of the pip API. As of 7.0, pip makes a subdirectory for
+each sdist that wheels are built from and places the resulting wheels inside.
+
+Pip attempts to choose the best wheels from those built in preference to
+building a new wheel. Note that this means when a package has both optional
+C extensions and builds `py` tagged wheels when the C extension can't be built
+that pip will not attempt to build a better wheel for Pythons that would have
+supported it, once any generic wheel is built. To correct this, make sure that
+the wheels are built with Python specific tags - e.g. pp on Pypy.
+
+When no wheels are found for an sdist, pip will attempt to build a wheel
+automatically and insert it into the wheel cache.
+
+
+.. _`hash-checking mode`:
+
+Hash-Checking Mode
+++++++++++++++++++
+
+Since version 8.0, pip can check downloaded package archives against local
+hashes to protect against remote tampering. To verify a package against one or
+more hashes, add them to the end of the line::
+
+    FooProject == 1.2 --hash=sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 \
+                      --hash=sha256:486ea46224d1bb4fb680f34f7c9ad96a8f24ec88be73ea8e5a6c65260e9cb8a7
+
+(The ability to use multiple hashes is important when a package has both
+binary and source distributions or when it offers binary distributions for a
+variety of platforms.)
+
+The recommended hash algorithm at the moment is sha256, but stronger ones are
+allowed, including all those supported by ``hashlib``. However, weaker ones
+such as md5, sha1, and sha224 are excluded to avoid giving a false sense of
+security.
+
+Hash verification is an all-or-nothing proposition. Specifying a ``--hash``
+against any requirement not only checks that hash but also activates a global
+*hash-checking mode*, which imposes several other security restrictions:
+
+* Hashes are required for all requirements. This is because a partially-hashed
+  requirements file is of little use and thus likely an error: a malicious
+  actor could slip bad code into the installation via one of the unhashed
+  requirements. Note that hashes embedded in URL-style requirements via the
+  ``#md5=...`` syntax suffice to satisfy this rule (regardless of hash
+  strength, for legacy reasons), though you should use a stronger
+  hash like sha256 whenever possible.
+* Hashes are required for all dependencies. An error results if there is a
+  dependency that is not spelled out and hashed in the requirements file.
+* Requirements that take the form of project names (rather than URLs or local
+  filesystem paths) must be pinned to a specific version using ``==``. This
+  prevents a surprising hash mismatch upon the release of a new version
+  that matches the requirement specifier.
+* ``--egg`` is disallowed, because it delegates installation of dependencies
+  to setuptools, giving up pip's ability to enforce any of the above.
+
+.. _`--require-hashes`:
+
+Hash-checking mode can be forced on with the ``--require-hashes`` command-line
+option::
+
+    $ pip install --require-hashes -r requirements.txt
+        ...
+        Hashes are required in --require-hashes mode (implicitly on when a hash is
+        specified for any package). These requirements were missing hashes,
+        leaving them open to tampering. These are the hashes the downloaded
+        archives actually had. You can add lines like these to your requirements
+        files to prevent tampering.
+            pyelasticsearch==1.0 --hash=sha256:44ddfb1225054d7d6b1d02e9338e7d4809be94edbe9929a2ec0807d38df993fa
+            more-itertools==2.2 --hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
+
+This can be useful in deploy scripts, to ensure that the author of the
+requirements file provided hashes. It is also a convenient way to bootstrap
+your list of hashes, since it shows the hashes of the packages it fetched. It
+fetches only the preferred archive for each package, so you may still need to
+add hashes for alternatives archives using :ref:`pip hash`: for instance if
+there is both a binary and a source distribution.
+
+The :ref:`wheel cache <Wheel cache>` is disabled in hash-checking mode to
+prevent spurious hash mismatch errors. These would otherwise occur while
+installing sdists that had already been automatically built into cached wheels:
+those wheels would be selected for installation, but their hashes would not
+match the sdist ones from the requirements file. A further complication is that
+locally built wheels are nondeterministic: contemporary modification times make
+their way into the archive, making hashes unpredictable across machines and
+cache flushes. Compilation of C code adds further nondeterminism, as many
+compilers include random-seeded values in their output. However, wheels fetched
+from index servers are the same every time. They land in pip's HTTP cache, not
+its wheel cache, and are used normally in hash-checking mode. The only downside
+of having the wheel cache disabled is thus extra build time for sdists, and
+this can be solved by making sure pre-built wheels are available from the index
+server.
+
+Hash-checking mode also works with :ref:`pip download` and :ref:`pip wheel`. A
+:ref:`comparison of hash-checking mode with other repeatability strategies
+<Repeatability>` is available in the User Guide.
+
+.. warning::
+    Beware of the ``setup_requires`` keyword arg in :file:`setup.py`. The
+    (rare) packages that use it will cause those dependencies to be downloaded
+    by setuptools directly, skipping pip's hash-checking. If you need to use
+    such a package, see :ref:`Controlling
+    setup_requires<controlling-setup-requires>`.
+
+.. warning::
+    Be careful not to nullify all your security work when you install your
+    actual project by using setuptools directly: for example, by calling
+    ``python setup.py install``, ``python setup.py develop``, or
+    ``easy_install``. Setuptools will happily go out and download, unchecked,
+    anything you missed in your requirements file—and it’s easy to miss things
+    as your project evolves. To be safe, install your project using pip and
+    :ref:`--no-deps <install_--no-deps>`.
+
+    Instead of ``python setup.py develop``, use... ::
+
+        pip install --no-deps -e .
+
+    Instead of ``python setup.py install``, use... ::
+
+        pip install --no-deps .
+
+
+Hashes from PyPI
+~~~~~~~~~~~~~~~~
+
+PyPI provides an MD5 hash in the fragment portion of each package download URL,
+like ``#md5=123...``, which pip checks as a protection against download
+corruption. Other hash algorithms that have guaranteed support from ``hashlib``
+are also supported here: sha1, sha224, sha384, sha256, and sha512. Since this
+hash originates remotely, it is not a useful guard against tampering and thus
+does not satisfy the ``--require-hashes`` demand that every package have a
+local hash.
+
+
+.. _`editable-installs`:
+
+"Editable" Installs
++++++++++++++++++++
+
+"Editable" installs are fundamentally `"setuptools develop mode"
+<https://setuptools.readthedocs.io/en/latest/setuptools.html#development-mode>`_
+installs.
+
+You can install local projects or VCS projects in "editable" mode::
+
+$ pip install -e path/to/SomeProject
+$ pip install -e git+http://repo/my_project.git#egg=SomeProject
+
+(See the :ref:`VCS Support` section above for more information on VCS-related syntax.)
+
+For local projects, the "SomeProject.egg-info" directory is created relative to
+the project path.  This is one advantage over just using ``setup.py develop``,
+which creates the "egg-info" directly relative the current working directory.
+
+
+.. _`controlling-setup-requires`:
+
+Controlling setup_requires
+++++++++++++++++++++++++++
+
+Setuptools offers the ``setup_requires`` `setup() keyword
+<https://setuptools.readthedocs.io/en/latest/setuptools.html#new-and-changed-setup-keywords>`_
+for specifying dependencies that need to be present in order for the `setup.py`
+script to run.  Internally, Setuptools uses ``easy_install`` to fulfill these
+dependencies.
+
+pip has no way to control how these dependencies are located.  None of the
+Package Index Options have an effect.
+
+The solution is to configure a "system" or "personal" `Distutils configuration
+file
+<http://docs.python.org/2/install/index.html#distutils-configuration-files>`_ to
+manage the fulfillment.
+
+For example, to have the dependency located at an alternate index, add this:
+
+::
+
+  [easy_install]
+  index_url = https://my.index-mirror.com
+
+To have the dependency located from a local directory and not crawl PyPI, add this:
+
+::
+
+  [easy_install]
+  allow_hosts = ''
+  find_links = file:///path/to/local/archives/
+
+
+Build System Interface
+++++++++++++++++++++++
+
+In order for pip to install a package from source, ``setup.py`` must implement
+the following commands::
+
+    setup.py egg_info [--egg-base XXX]
+    setup.py install --record XXX [--single-version-externally-managed] [--root XXX] [--compile|--no-compile] [--install-headers XXX]
+
+The ``egg_info`` command should create egg metadata for the package, as
+described in the setuptools documentation at
+https://setuptools.readthedocs.io/en/latest/setuptools.html#egg-info-create-egg-metadata-and-set-build-tags
+
+The ``install`` command should implement the complete process of installing the
+package to the target directory XXX.
+
+To install a package in "editable" mode (``pip install -e``), ``setup.py`` must
+implement the following command::
+
+    setup.py develop --no-deps
+
+This should implement the complete process of installing the package in
+"editable" mode.
+
+All packages will be attempted to built into wheels::
+
+    setup.py bdist_wheel -d XXX
+
+One further ``setup.py`` command is invoked by ``pip install``::
+
+    setup.py clean
+
+This command is invoked to clean up temporary commands from the build. (TODO:
+Investigate in more detail when this command is required).
+
+No other build system commands are invoked by the ``pip install`` command.
+
+Installing a package from a wheel does not invoke the build system at all.
+
+.. _PyPI: http://pypi.python.org/pypi/
+.. _setuptools extras: https://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies
+
+
+
+.. _`pip install Options`:
+
+Options
+*******
+
+.. pip-command-options:: install
+
+.. pip-index-options::
+
+
+.. _`pip install Examples`:
+
+Examples
+********
+
+#. Install `SomePackage` and its dependencies from `PyPI`_ using :ref:`Requirement Specifiers`
+
+    ::
+
+      $ pip install SomePackage            # latest version
+      $ pip install SomePackage==1.0.4     # specific version
+      $ pip install 'SomePackage>=1.0.4'     # minimum version
+
+
+#. Install a list of requirements specified in a file.  See the :ref:`Requirements files <Requirements Files>`.
+
+    ::
+
+      $ pip install -r requirements.txt
+
+
+#. Upgrade an already installed `SomePackage` to the latest from PyPI.
+
+    ::
+
+      $ pip install --upgrade SomePackage
+
+
+#. Install a local project in "editable" mode. See the section on :ref:`Editable Installs <editable-installs>`.
+
+    ::
+
+      $ pip install -e .                     # project in current directory
+      $ pip install -e path/to/project       # project in another directory
+
+
+#. Install a project from VCS in "editable" mode. See the sections on :ref:`VCS Support <VCS Support>` and :ref:`Editable Installs <editable-installs>`.
+
+    ::
+
+      $ pip install -e git+https://git.repo/some_pkg.git#egg=SomePackage          # from git
+      $ pip install -e hg+https://hg.repo/some_pkg.git#egg=SomePackage            # from mercurial
+      $ pip install -e svn+svn://svn.repo/some_pkg/trunk/#egg=SomePackage         # from svn
+      $ pip install -e git+https://git.repo/some_pkg.git@feature#egg=SomePackage  # from 'feature' branch
+      $ pip install -e "git+https://git.repo/some_repo.git#egg=subdir&subdirectory=subdir_path" # install a python package from a repo subdirectory
+
+#. Install a package with `setuptools extras`_.
+
+    ::
+
+      $ pip install SomePackage[PDF]
+      $ pip install git+https://git.repo/some_pkg.git#egg=SomePackage[PDF]
+      $ pip install SomePackage[PDF]==3.0
+      $ pip install -e .[PDF]==3.0  # editable project in current directory
+
+
+#. Install a particular source archive file.
+
+    ::
+
+      $ pip install ./downloads/SomePackage-1.0.4.tar.gz
+      $ pip install http://my.package.repo/SomePackage-1.0.4.zip
+
+
+#. Install from alternative package repositories.
+
+   Install from a different index, and not `PyPI`_ ::
+
+     $ pip install --index-url http://my.package.repo/simple/ SomePackage
+
+   Search an additional index during install, in addition to `PyPI`_ ::
+
+     $ pip install --extra-index-url http://my.package.repo/simple SomePackage
+
+   Install from a local flat directory containing archives (and don't scan indexes)::
+
+     $ pip install --no-index --find-links=file:///local/dir/ SomePackage
+     $ pip install --no-index --find-links=/local/dir/ SomePackage
+     $ pip install --no-index --find-links=relative/dir/ SomePackage
+
+
+#. Find pre-release and development versions, in addition to stable versions.  By default, pip only finds stable versions.
+
+    ::
+
+      $ pip install --pre SomePackage
+
+----
+
+.. [1] This is true with the exception that pip v7.0 and v7.0.1 required quotes
+       around specifiers containing environment markers in requirement files.
+
+.. _PEP440: http://www.python.org/dev/peps/pep-0440
+.. _PEP508: http://www.python.org/dev/peps/pep-0508
diff --git a/vendor/pip-9.0.3/docs/reference/pip_list.rst b/vendor/pip-9.0.3/docs/reference/pip_list.rst
new file mode 100644
index 0000000000000000000000000000000000000000..c459b7a3bb11cb7629466ca7bfd1831a3b8cd453
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/reference/pip_list.rst
@@ -0,0 +1,102 @@
+.. _`pip list`:
+
+pip list
+---------
+
+.. contents::
+
+Usage
+*****
+
+.. pip-command-usage:: list
+
+Description
+***********
+
+.. pip-command-description:: list
+
+Options
+*******
+
+.. pip-command-options:: list
+
+.. pip-index-options::
+
+
+Examples
+********
+
+#. List installed packages.
+
+    ::
+
+     $ pip list
+     docutils (0.10)
+     Jinja2 (2.7.2)
+     MarkupSafe (0.18)
+     Pygments (1.6)
+     Sphinx (1.2.1)
+
+#. List outdated packages (excluding editables), and the latest version available.
+
+    ::
+
+     $ pip list --outdated
+     docutils (Current: 0.10 Latest: 0.11)
+     Sphinx (Current: 1.2.1 Latest: 1.2.2)
+
+#. List installed packages with column formatting.
+
+    ::
+
+     $ pip list --format columns
+     Package Version
+     ------- -------
+     docopt  0.6.2
+     idlex   1.13
+     jedi    0.9.0
+
+#. List outdated packages with column formatting.
+
+    ::
+
+     $ pip list -o --format columns
+     Package    Version Latest Type
+     ---------- ------- ------ -----
+     retry      0.8.1   0.9.1  wheel
+     setuptools 20.6.7  21.0.0 wheel
+
+#. List packages that are not dependencies of other packages. Can be combined with
+   other options.
+
+    ::
+
+     $ pip list --outdated --not-required
+     docutils (Current: 0.10 Latest: 0.11)
+
+#. Use legacy formatting
+
+    ::
+
+     $ pip list --format=legacy
+     colorama (0.3.7)
+     docopt (0.6.2)
+     idlex (1.13)
+     jedi (0.9.0)
+
+#. Use json formatting
+
+    ::
+
+     $ pip list --format=json
+     [{'name': 'colorama', 'version': '0.3.7'}, {'name': 'docopt', 'version': '0.6.2'}, ...
+
+#. Use freeze formatting
+
+    ::
+
+     $ pip list --format=freeze
+     colorama==0.3.7
+     docopt==0.6.2
+     idlex==1.13
+     jedi==0.9.0
diff --git a/vendor/pip-9.0.3/docs/reference/pip_search.rst b/vendor/pip-9.0.3/docs/reference/pip_search.rst
new file mode 100644
index 0000000000000000000000000000000000000000..1332c99f781e8b5f8f7c5f29d8719d48d005ddfb
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/reference/pip_search.rst
@@ -0,0 +1,34 @@
+.. _`pip search`:
+
+pip search
+----------
+
+.. contents::
+
+Usage
+*****
+
+.. pip-command-usage:: search
+
+
+Description
+***********
+
+.. pip-command-description:: search
+
+Options
+*******
+
+.. pip-command-options:: search
+
+
+Examples
+********
+
+#. Search for "peppercorn"
+
+    ::
+
+     $ pip search peppercorn
+     pepperedform    - Helpers for using peppercorn with formprocess.
+     peppercorn      - A library for converting a token stream into [...]
diff --git a/vendor/pip-9.0.3/docs/reference/pip_show.rst b/vendor/pip-9.0.3/docs/reference/pip_show.rst
new file mode 100644
index 0000000000000000000000000000000000000000..6c9aa84aae40eaface77fee70b33edb0c32b6c97
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/reference/pip_show.rst
@@ -0,0 +1,86 @@
+.. _`pip show`:
+
+pip show
+--------
+
+.. contents::
+
+
+Usage
+*****
+
+.. pip-command-usage:: show
+
+
+Description
+***********
+
+.. pip-command-description:: show
+
+
+Options
+*******
+
+.. pip-command-options:: show
+
+
+Examples
+********
+
+#. Show information about a package:
+
+    ::
+
+      $ pip show sphinx
+      Name: Sphinx
+      Version: 1.4.5
+      Summary: Python documentation generator
+      Home-page: http://sphinx-doc.org/
+      Author: Georg Brandl
+      Author-email: georg@python.org
+      License: BSD
+      Location: /my/env/lib/python2.7/site-packages
+      Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
+
+#. Show all information about a package
+
+    ::
+
+      $ pip show --verbose sphinx
+      Name: Sphinx
+      Version: 1.4.5
+      Summary: Python documentation generator
+      Home-page: http://sphinx-doc.org/
+      Author: Georg Brandl
+      Author-email: georg@python.org
+      License: BSD
+      Location: /my/env/lib/python2.7/site-packages
+      Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
+      Metadata-Version: 2.0
+      Installer:
+      Classifiers:
+        Development Status :: 5 - Production/Stable
+        Environment :: Console
+        Environment :: Web Environment
+        Intended Audience :: Developers
+        Intended Audience :: Education
+        License :: OSI Approved :: BSD License
+        Operating System :: OS Independent
+        Programming Language :: Python
+        Programming Language :: Python :: 2
+        Programming Language :: Python :: 3
+        Framework :: Sphinx
+        Framework :: Sphinx :: Extension
+        Framework :: Sphinx :: Theme
+        Topic :: Documentation
+        Topic :: Documentation :: Sphinx
+        Topic :: Text Processing
+        Topic :: Utilities
+      Entry-points:
+        [console_scripts]
+        sphinx-apidoc = sphinx.apidoc:main
+        sphinx-autogen = sphinx.ext.autosummary.generate:main
+        sphinx-build = sphinx:main
+        sphinx-quickstart = sphinx.quickstart:main
+        [distutils.commands]
+        build_sphinx = sphinx.setup_command:BuildDoc
diff --git a/vendor/pip-9.0.3/docs/reference/pip_uninstall.rst b/vendor/pip-9.0.3/docs/reference/pip_uninstall.rst
new file mode 100644
index 0000000000000000000000000000000000000000..f9a97589eb5edeb2d167ff63647e732880f5e924
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/reference/pip_uninstall.rst
@@ -0,0 +1,37 @@
+.. _`pip uninstall`:
+
+pip uninstall
+-------------
+
+.. contents::
+
+Usage
+*****
+
+.. pip-command-usage:: uninstall
+
+Description
+***********
+
+.. pip-command-description:: uninstall
+
+Options
+*******
+
+.. pip-command-options:: uninstall
+
+
+Examples
+********
+
+#. Uninstall a package.
+
+  ::
+
+    $ pip uninstall simplejson
+    Uninstalling simplejson:
+      /home/me/env/lib/python2.7/site-packages/simplejson
+      /home/me/env/lib/python2.7/site-packages/simplejson-2.2.1-py2.7.egg-info
+    Proceed (y/n)? y
+      Successfully uninstalled simplejson
+
diff --git a/vendor/pip-9.0.3/docs/reference/pip_wheel.rst b/vendor/pip-9.0.3/docs/reference/pip_wheel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..75ae51a21fb1d5441318152e6e9e6128b1550aeb
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/reference/pip_wheel.rst
@@ -0,0 +1,73 @@
+
+.. _`pip wheel`:
+
+pip wheel
+---------
+
+.. contents::
+
+Usage
+*****
+
+.. pip-command-usage:: wheel
+
+
+Description
+***********
+
+.. pip-command-description:: wheel
+
+
+Build System Interface
+++++++++++++++++++++++
+
+In order for pip to build a wheel, ``setup.py`` must implement the
+``bdist_wheel`` command with the following syntax::
+
+    python setup.py bdist_wheel -d TARGET
+
+This command must create a wheel compatible with the invoking Python
+interpreter, and save that wheel in the directory TARGET.
+
+No other build system commands are invoked by the ``pip wheel`` command.
+
+Customising the build
+~~~~~~~~~~~~~~~~~~~~~
+
+It is possible using ``--global-option`` to include additional build commands
+with their arguments in the ``setup.py`` command. This is currently the only
+way to influence the building of C extensions from the command line. For
+example::
+
+    pip wheel --global-option bdist_ext --global-option -DFOO wheel
+
+will result in a build command of
+
+::
+
+    setup.py bdist_ext -DFOO bdist_wheel -d TARGET
+
+which passes a preprocessor symbol to the extension build.
+
+Such usage is considered highly build-system specific and more an accident of
+the current implementation than a supported interface.
+
+
+
+Options
+*******
+
+.. pip-command-options:: wheel
+
+.. pip-index-options::
+
+
+Examples
+********
+
+#. Build wheels for a requirement (and all its dependencies), and then install
+
+    ::
+
+      $ pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
+      $ pip install --no-index --find-links=/tmp/wheelhouse SomePackage
diff --git a/vendor/pip-9.0.3/docs/usage.rst b/vendor/pip-9.0.3/docs/usage.rst
new file mode 100644
index 0000000000000000000000000000000000000000..20c2b29ec39b5d9d619be6e6d32d0161a3a6f48c
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/usage.rst
@@ -0,0 +1,7 @@
+:orphan:
+
+==========
+Usage
+==========
+
+The "Usage" section is now covered in the :doc:`Reference Guide <reference/index>`
diff --git a/vendor/pip-9.0.3/docs/user_guide.rst b/vendor/pip-9.0.3/docs/user_guide.rst
new file mode 100644
index 0000000000000000000000000000000000000000..7d7fb86faed2744aaa1ad8220d9ad4a54d61fc18
--- /dev/null
+++ b/vendor/pip-9.0.3/docs/user_guide.rst
@@ -0,0 +1,677 @@
+==========
+User Guide
+==========
+
+.. contents::
+
+Installing Packages
+*******************
+
+pip supports installing from `PyPI`_, version control, local projects, and
+directly from distribution files.
+
+
+The most common scenario is to install from `PyPI`_ using :ref:`Requirement
+Specifiers`
+
+  ::
+
+  $ pip install SomePackage            # latest version
+  $ pip install SomePackage==1.0.4     # specific version
+  $ pip install 'SomePackage>=1.0.4'     # minimum version
+
+
+For more information and examples, see the :ref:`pip install` reference.
+
+.. _PyPI: http://pypi.python.org/pypi
+
+
+.. _`Requirements Files`:
+
+Requirements Files
+******************
+
+"Requirements files" are files containing a list of items to be
+installed using :ref:`pip install` like so:
+
+ ::
+
+   pip install -r requirements.txt
+
+
+Details on the format of the files are here: :ref:`Requirements File Format`.
+
+Logically, a Requirements file is just a list of :ref:`pip install` arguments
+placed in a file. Note that you should not rely on the items in the file being
+installed by pip in any particular order.
+
+In practice, there are 4 common uses of Requirements files:
+
+1. Requirements files are used to hold the result from :ref:`pip freeze` for the
+   purpose of achieving :ref:`repeatable installations <Repeatability>`.  In
+   this case, your requirement file contains a pinned version of everything that
+   was installed when `pip freeze` was run.
+
+   ::
+
+     pip freeze > requirements.txt
+     pip install -r requirements.txt
+
+2. Requirements files are used to force pip to properly resolve dependencies.
+   As it is now, pip `doesn't have true dependency resolution
+   <https://github.com/pypa/pip/issues/988>`_, but instead simply uses the first
+   specification it finds for a project. E.g if `pkg1` requires `pkg3>=1.0` and
+   `pkg2` requires `pkg3>=1.0,<=2.0`, and if `pkg1` is resolved first, pip will
+   only use `pkg3>=1.0`, and could easily end up installing a version of `pkg3`
+   that conflicts with the needs of `pkg2`.  To solve this problem, you can
+   place `pkg3>=1.0,<=2.0` (i.e. the correct specification) into your
+   requirements file directly along with the other top level requirements. Like
+   so:
+
+   ::
+
+     pkg1
+     pkg2
+     pkg3>=1.0,<=2.0
+
+3. Requirements files are used to force pip to install an alternate version of a
+   sub-dependency.  For example, suppose `ProjectA` in your requirements file
+   requires `ProjectB`, but the latest version (v1.3) has a bug, you can force
+   pip to accept earlier versions like so:
+
+   ::
+
+     ProjectA
+     ProjectB<1.3
+
+4. Requirements files are used to override a dependency with a local patch that
+   lives in version control.  For example, suppose a dependency,
+   `SomeDependency` from PyPI has a bug, and you can't wait for an upstream fix.
+   You could clone/copy the src, make the fix, and place it in VCS with the tag
+   `sometag`.  You'd reference it in your requirements file with a line like so:
+
+   ::
+
+     git+https://myvcs.com/some_dependency@sometag#egg=SomeDependency
+
+   If `SomeDependency` was previously a top-level requirement in your
+   requirements file, then **replace** that line with the new line. If
+   `SomeDependency` is a sub-dependency, then **add** the new line.
+
+
+It's important to be clear that pip determines package dependencies using
+`install_requires metadata
+<https://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-dependencies>`_,
+not by discovering `requirements.txt` files embedded in projects.
+
+See also:
+
+* :ref:`Requirements File Format`
+* :ref:`pip freeze`
+* `"setup.py vs requirements.txt" (an article by Donald Stufft)
+  <https://caremad.io/2013/07/setup-vs-requirement/>`_
+
+
+.. _`Constraints Files`:
+
+Constraints Files
+*****************
+
+Constraints files are requirements files that only control which version of a
+requirement is installed, not whether it is installed or not. Their syntax and
+contents is nearly identical to :ref:`Requirements Files`. There is one key
+difference: Including a package in a constraints file does not trigger
+installation of the package.
+
+Use a constraints file like so:
+
+ ::
+
+   pip install -c constraints.txt
+
+Constraints files are used for exactly the same reason as requirements files
+when you don't know exactly what things you want to install. For instance, say
+that the "helloworld" package doesn't work in your environment, so you have a
+local patched version. Some things you install depend on "helloworld", and some
+don't.
+
+One way to ensure that the patched version is used consistently is to
+manually audit the dependencies of everything you install, and if "helloworld"
+is present, write a requirements file to use when installing that thing.
+
+Constraints files offer a better way: write a single constraints file for your
+organisation and use that everywhere. If the thing being installed requires
+"helloworld" to be installed, your fixed version specified in your constraints
+file will be used.
+
+Constraints file support was added in pip 7.1.
+
+.. _`Installing from Wheels`:
+
+Installing from Wheels
+**********************
+
+"Wheel" is a built, archive format that can greatly speed installation compared
+to building and installing from source archives. For more information, see the
+`Wheel docs <https://wheel.readthedocs.io>`_ ,
+`PEP427 <http://www.python.org/dev/peps/pep-0427>`_, and
+`PEP425 <http://www.python.org/dev/peps/pep-0425>`_
+
+Pip prefers Wheels where they are available. To disable this, use the
+:ref:`--no-binary <install_--no-binary>` flag for :ref:`pip install`.
+
+If no satisfactory wheels are found, pip will default to finding source archives.
+
+
+To install directly from a wheel archive:
+
+::
+
+ pip install SomePackage-1.0-py2.py3-none-any.whl
+
+
+For the cases where wheels are not available, pip offers :ref:`pip wheel` as a
+convenience, to build wheels for all your requirements and dependencies.
+
+:ref:`pip wheel` requires the `wheel package
+<https://pypi.python.org/pypi/wheel>`_ to be installed, which provides the
+"bdist_wheel" setuptools extension that it uses.
+
+To build wheels for your requirements and all their dependencies to a local directory:
+
+::
+
+ pip install wheel
+ pip wheel --wheel-dir=/local/wheels -r requirements.txt
+
+
+And *then* to install those requirements just using your local directory of wheels (and not from PyPI):
+
+::
+
+ pip install --no-index --find-links=/local/wheels -r requirements.txt
+
+
+Uninstalling Packages
+*********************
+
+pip is able to uninstall most packages like so:
+
+::
+
+ $ pip uninstall SomePackage
+
+pip also performs an automatic uninstall of an old version of a package
+before upgrading to a newer version.
+
+For more information and examples, see the :ref:`pip uninstall` reference.
+
+
+Listing Packages
+****************
+
+To list installed packages:
+
+::
+
+  $ pip list
+  docutils (0.9.1)
+  Jinja2 (2.6)
+  Pygments (1.5)
+  Sphinx (1.1.2)
+
+To list outdated packages, and show the latest version available:
+
+::
+
+  $ pip list --outdated
+  docutils (Current: 0.9.1 Latest: 0.10)
+  Sphinx (Current: 1.1.2 Latest: 1.1.3)
+
+
+To show details about an installed package:
+
+::
+
+  $ pip show sphinx
+  ---
+  Name: Sphinx
+  Version: 1.1.3
+  Location: /my/env/lib/pythonx.x/site-packages
+  Requires: Pygments, Jinja2, docutils
+
+
+For more information and examples, see the :ref:`pip list` and :ref:`pip show`
+reference pages.
+
+
+Searching for Packages
+**********************
+
+pip can search `PyPI`_ for packages using the ``pip search``
+command::
+
+    $ pip search "query"
+
+The query will be used to search the names and summaries of all
+packages.
+
+For more information and examples, see the :ref:`pip search` reference.
+
+.. _`Configuration`:
+
+Configuration
+*************
+
+.. _config-file:
+
+Config file
+------------
+
+pip allows you to set all command line option defaults in a standard ini
+style config file.
+
+The names and locations of the configuration files vary slightly across
+platforms. You may have per-user, per-virtualenv or site-wide (shared amongst
+all users) configuration:
+
+**Per-user**:
+
+* On Unix the default configuration file is: :file:`$HOME/.config/pip/pip.conf`
+  which respects the ``XDG_CONFIG_HOME`` environment variable.
+* On macOS the configuration file is
+  :file:`$HOME/Library/Application Support/pip/pip.conf`.
+* On Windows the configuration file is :file:`%APPDATA%\\pip\\pip.ini`.
+
+There are also a legacy per-user configuration file which is also respected,
+these are located at:
+
+* On Unix and macOS the configuration file is: :file:`$HOME/.pip/pip.conf`
+* On Windows the configuration file is: :file:`%HOME%\\pip\\pip.ini`
+
+You can set a custom path location for this config file using the environment
+variable ``PIP_CONFIG_FILE``.
+
+**Inside a virtualenv**:
+
+* On Unix and macOS the file is :file:`$VIRTUAL_ENV/pip.conf`
+* On Windows the file is: :file:`%VIRTUAL_ENV%\\pip.ini`
+
+**Site-wide**:
+
+* On Unix the file may be located in :file:`/etc/pip.conf`. Alternatively
+  it may be in a "pip" subdirectory of any of the paths set in the
+  environment variable ``XDG_CONFIG_DIRS`` (if it exists), for example
+  :file:`/etc/xdg/pip/pip.conf`.
+* On macOS the file is: :file:`/Library/Application Support/pip/pip.conf`
+* On Windows XP the file is:
+  :file:`C:\\Documents and Settings\\All Users\\Application Data\\pip\\pip.ini`
+* On Windows 7 and later the file is hidden, but writeable at
+  :file:`C:\\ProgramData\\pip\\pip.ini`
+* Site-wide configuration is not supported on Windows Vista
+
+If multiple configuration files are found by pip then they are combined in
+the following order:
+
+1. Firstly the site-wide file is read, then
+2. The per-user file is read, and finally
+3. The virtualenv-specific file is read.
+
+Each file read overrides any values read from previous files, so if the
+global timeout is specified in both the site-wide file and the per-user file
+then the latter value is the one that will be used.
+
+The names of the settings are derived from the long command line option, e.g.
+if you want to use a different package index (``--index-url``) and set the
+HTTP timeout (``--default-timeout``) to 60 seconds your config file would
+look like this:
+
+.. code-block:: ini
+
+    [global]
+    timeout = 60
+    index-url = http://download.zope.org/ppix
+
+Each subcommand can be configured optionally in its own section so that every
+global setting with the same name will be overridden; e.g. decreasing the
+``timeout`` to ``10`` seconds when running the `freeze`
+(`Freezing Requirements <./#freezing-requirements>`_) command and using
+``60`` seconds for all other commands is possible with:
+
+.. code-block:: ini
+
+    [global]
+    timeout = 60
+
+    [freeze]
+    timeout = 10
+
+
+Boolean options like ``--ignore-installed`` or ``--no-dependencies`` can be
+set like this:
+
+.. code-block:: ini
+
+    [install]
+    ignore-installed = true
+    no-dependencies = yes
+
+To enable the boolean options ``--no-compile`` and ``--no-cache-dir``, falsy
+values have to be used:
+
+.. code-block:: ini
+
+    [global]
+    no-cache-dir = false
+
+    [install]
+    no-compile = no
+
+Appending options like ``--find-links`` can be written on multiple lines:
+
+.. code-block:: ini
+
+    [global]
+    find-links =
+        http://download.example.com
+
+    [install]
+    find-links =
+        http://mirror1.example.com
+        http://mirror2.example.com
+
+
+Environment Variables
+---------------------
+
+pip's command line options can be set with environment variables using the
+format ``PIP_<UPPER_LONG_NAME>`` . Dashes (``-``) have to be replaced with
+underscores (``_``).
+
+For example, to set the default timeout::
+
+    export PIP_DEFAULT_TIMEOUT=60
+
+This is the same as passing the option to pip directly::
+
+    pip --default-timeout=60 [...]
+
+To set options that can be set multiple times on the command line, just add
+spaces in between values. For example::
+
+    export PIP_FIND_LINKS="http://mirror1.example.com http://mirror2.example.com"
+
+is the same as calling::
+
+    pip install --find-links=http://mirror1.example.com --find-links=http://mirror2.example.com
+
+
+Config Precedence
+-----------------
+
+Command line options have precedence over environment variables, which have precedence over the config file.
+
+Within the config file, command specific sections have precedence over the global section.
+
+Examples:
+
+- ``--host=foo`` overrides ``PIP_HOST=foo``
+- ``PIP_HOST=foo`` overrides a config file with ``[global] host = foo``
+- A command specific section in the config file ``[<command>] host = bar``
+  overrides the option with same name in the ``[global]`` config file section
+
+
+Command Completion
+------------------
+
+pip comes with support for command line completion in bash, zsh and fish.
+
+To setup for bash::
+
+    $ pip completion --bash >> ~/.profile
+
+To setup for zsh::
+
+    $ pip completion --zsh >> ~/.zprofile
+
+To setup for fish::
+
+$ pip completion --fish > ~/.config/fish/completions/pip.fish
+
+Alternatively, you can use the result of the ``completion`` command
+directly with the eval function of your shell, e.g. by adding the following to your startup file::
+
+    eval "`pip completion --bash`"
+
+
+
+.. _`Installing from local packages`:
+
+Installing from local packages
+******************************
+
+In some cases, you may want to install from local packages only, with no traffic
+to PyPI.
+
+First, download the archives that fulfill your requirements::
+
+$ pip install --download DIR -r requirements.txt
+
+
+Note that ``pip install --download`` will look in your wheel cache first, before
+trying to download from PyPI.  If you've never installed your requirements
+before, you won't have a wheel cache for those items.  In that case, if some of
+your requirements don't come as wheels from PyPI, and you want wheels, then run
+this instead::
+
+$ pip wheel --wheel-dir DIR -r requirements.txt
+
+
+Then, to install from local only, you'll be using :ref:`--find-links
+<--find-links>` and :ref:`--no-index <--no-index>` like so::
+
+$ pip install --no-index --find-links=DIR -r requirements.txt
+
+
+"Only if needed" Recursive Upgrade
+**********************************
+
+``pip install --upgrade`` is currently written to perform an eager recursive
+upgrade, i.e. it upgrades all dependencies regardless of whether they still
+satisfy the new parent requirements.
+
+E.g. supposing:
+
+* `SomePackage-1.0` requires `AnotherPackage>=1.0`
+* `SomePackage-2.0` requires `AnotherPackage>=1.0` and `OneMorePackage==1.0`
+* `SomePackage-1.0` and `AnotherPackage-1.0` are currently installed
+* `SomePackage-2.0` and `AnotherPackage-2.0` are the latest versions available on PyPI.
+
+Running ``pip install --upgrade SomePackage`` would upgrade `SomePackage` *and*
+`AnotherPackage` despite `AnotherPackage` already being satisfied.
+
+pip doesn't currently have an option to do an "only if needed" recursive
+upgrade, but you can achieve it using these 2 steps::
+
+  pip install --upgrade --no-deps SomePackage
+  pip install SomePackage
+
+The first line will upgrade `SomePackage`, but not dependencies like
+`AnotherPackage`.  The 2nd line will fill in new dependencies like
+`OneMorePackage`.
+
+See :issue:`59` for a plan of making "only if needed" recursive the default
+behavior for a new ``pip upgrade`` command.
+
+
+User Installs
+*************
+
+With Python 2.6 came the `"user scheme" for installation
+<http://docs.python.org/install/index.html#alternate-installation-the-user-scheme>`_,
+which means that all Python distributions support an alternative install
+location that is specific to a user.  The default location for each OS is
+explained in the python documentation for the `site.USER_BASE
+<http://docs.python.org/library/site.html#site.USER_BASE>`_ variable.  This mode
+of installation can be turned on by specifying the :ref:`--user
+<install_--user>` option to ``pip install``.
+
+Moreover, the "user scheme" can be customized by setting the
+``PYTHONUSERBASE`` environment variable, which updates the value of ``site.USER_BASE``.
+
+To install "SomePackage" into an environment with site.USER_BASE customized to '/myappenv', do the following::
+
+    export PYTHONUSERBASE=/myappenv
+    pip install --user SomePackage
+
+
+``pip install --user`` follows four rules:
+
+#. When globally installed packages are on the python path, and they *conflict*
+   with the installation requirements, they are ignored, and *not*
+   uninstalled.
+#. When globally installed packages are on the python path, and they *satisfy*
+   the installation requirements, pip does nothing, and reports that
+   requirement is satisfied (similar to how global packages can satisfy
+   requirements when installing packages in a ``--system-site-packages``
+   virtualenv).
+#. pip will not perform a ``--user`` install in a ``--no-site-packages``
+   virtualenv (i.e. the default kind of virtualenv), due to the user site not
+   being on the python path.  The installation would be pointless.
+#. In a ``--system-site-packages`` virtualenv, pip will not install a package
+   that conflicts with a package in the virtualenv site-packages.  The --user
+   installation would lack sys.path precedence and be pointless.
+
+
+To make the rules clearer, here are some examples:
+
+
+From within a ``--no-site-packages`` virtualenv (i.e. the default kind)::
+
+  $ pip install --user SomePackage
+  Can not perform a '--user' install. User site-packages are not visible in this virtualenv.
+
+
+From within a ``--system-site-packages`` virtualenv where ``SomePackage==0.3`` is already installed in the virtualenv::
+
+  $ pip install --user SomePackage==0.4
+  Will not install to the user site because it will lack sys.path precedence
+
+
+From within a real python, where ``SomePackage`` is *not* installed globally::
+
+  $ pip install --user SomePackage
+  [...]
+  Successfully installed SomePackage
+
+
+From within a real python, where ``SomePackage`` *is* installed globally, but is *not* the latest version::
+
+  $ pip install --user SomePackage
+  [...]
+  Requirement already satisfied (use --upgrade to upgrade)
+
+  $ pip install --user --upgrade SomePackage
+  [...]
+  Successfully installed SomePackage
+
+
+From within a real python, where ``SomePackage`` *is* installed globally, and is the latest version::
+
+  $ pip install --user SomePackage
+  [...]
+  Requirement already satisfied (use --upgrade to upgrade)
+
+  $ pip install --user --upgrade SomePackage
+  [...]
+  Requirement already up-to-date: SomePackage
+
+  # force the install
+  $ pip install --user --ignore-installed SomePackage
+  [...]
+  Successfully installed SomePackage
+
+
+.. _`Repeatability`:
+
+Ensuring Repeatability
+**********************
+
+pip can achieve various levels of repeatability:
+
+Pinned Version Numbers
+----------------------
+
+Pinning the versions of your dependencies in the requirements file
+protects you from bugs or incompatibilities in newly released versions::
+
+    SomePackage == 1.2.3
+    DependencyOfSomePackage == 4.5.6
+
+Using :ref:`pip freeze` to generate the requirements file will ensure that not
+only the top-level dependencies are included but their sub-dependencies as
+well, and so on. Perform the installation using :ref:`--no-deps
+<install_--no-deps>` for an extra dose of insurance against installing
+anything not explicitly listed.
+
+This strategy is easy to implement and works across OSes and architectures.
+However, it trusts PyPI and the certificate authority chain. It
+also relies on indices and find-links locations not allowing
+packages to change without a version increase. (PyPI does protect
+against this.)
+
+Hash-checking Mode
+------------------
+
+Beyond pinning version numbers, you can add hashes against which to verify
+downloaded packages::
+
+    FooProject == 1.2 --hash=sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
+
+This protects against a compromise of PyPI or the HTTPS
+certificate chain. It also guards against a package changing
+without its version number changing (on indexes that allow this).
+This approach is a good fit for automated server deployments.
+
+Hash-checking mode is a labor-saving alternative to running a private index
+server containing approved packages: it removes the need to upload packages,
+maintain ACLs, and keep an audit trail (which a VCS gives you on the
+requirements file for free). It can also substitute for a vendor library,
+providing easier upgrades and less VCS noise. It does not, of course,
+provide the availability benefits of a private index or a vendor library.
+
+For more, see :ref:`pip install\'s discussion of hash-checking mode <hash-checking mode>`.
+
+.. _`Installation Bundle`:
+
+Installation Bundles
+--------------------
+
+Using :ref:`pip wheel`, you can bundle up all of a project's dependencies, with
+any compilation done, into a single archive. This allows installation when
+index servers are unavailable and avoids time-consuming recompilation. Create
+an archive like this::
+
+    $ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
+    $ pip wheel -r requirements.txt --wheel-dir=$tempdir
+    $ cwd=`pwd`
+    $ (cd "$tempdir"; tar -cjvf "$cwd/bundled.tar.bz2" *)
+
+You can then install from the archive like this::
+
+    $ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
+    $ (cd $tempdir; tar -xvf /path/to/bundled.tar.bz2)
+    $ pip install --force-reinstall --ignore-installed --upgrade --no-index --no-deps $tempdir/*
+
+Note that compiled packages are typically OS- and architecture-specific, so
+these archives are not necessarily portable across machines.
+
+Hash-checking mode can be used along with this method to ensure that future
+archives are built with identical packages.
+
+.. warning::
+    Finally, beware of the ``setup_requires`` keyword arg in :file:`setup.py`.
+    The (rare) packages that use it will cause those dependencies to be
+    downloaded by setuptools directly, skipping pip's protections. If you need
+    to use such a package, see :ref:`Controlling
+    setup_requires<controlling-setup-requires>`.
diff --git a/vendor/pip-9.0.3/pip.egg-info/PKG-INFO b/vendor/pip-9.0.3/pip.egg-info/PKG-INFO
new file mode 100644
index 0000000000000000000000000000000000000000..aca2a4f2444cfd01732740e367c306f972d863a8
--- /dev/null
+++ b/vendor/pip-9.0.3/pip.egg-info/PKG-INFO
@@ -0,0 +1,62 @@
+Metadata-Version: 2.1
+Name: pip
+Version: 9.0.3
+Summary: The PyPA recommended tool for installing Python packages.
+Home-page: https://pip.pypa.io/
+Author: The pip developers
+Author-email: python-virtualenv@groups.google.com
+License: MIT
+Description: pip
+        ===
+        
+        The `PyPA recommended
+        <https://packaging.python.org/en/latest/current/>`_
+        tool for installing Python packages.
+        
+        * `Installation <https://pip.pypa.io/en/stable/installing.html>`_
+        * `Documentation <https://pip.pypa.io/>`_
+        * `Changelog <https://pip.pypa.io/en/stable/news.html>`_
+        * `Github Page <https://github.com/pypa/pip>`_
+        * `Issue Tracking <https://github.com/pypa/pip/issues>`_
+        * `User mailing list <http://groups.google.com/group/python-virtualenv>`_
+        * `Dev mailing list <http://groups.google.com/group/pypa-dev>`_
+        * User IRC: #pypa on Freenode.
+        * Dev IRC: #pypa-dev on Freenode.
+        
+        
+        .. image:: https://img.shields.io/pypi/v/pip.svg
+           :target: https://pypi.python.org/pypi/pip
+        
+        .. image:: https://img.shields.io/travis/pypa/pip/master.svg
+           :target: http://travis-ci.org/pypa/pip
+        
+        .. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg
+           :target: https://ci.appveyor.com/project/pypa/pip/history
+        
+        .. image:: https://readthedocs.org/projects/pip/badge/?version=stable
+           :target: https://pip.pypa.io/en/stable
+        
+        Code of Conduct
+        ---------------
+        
+        Everyone interacting in the pip project's codebases, issue trackers, chat
+        rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.
+        
+        .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
+        
+Keywords: easy_install distutils setuptools egg virtualenv
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Topic :: Software Development :: Build Tools
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Requires-Python: >=2.6,!=3.0.*,!=3.1.*,!=3.2.*
+Provides-Extra: testing
diff --git a/vendor/pip-9.0.3/pip.egg-info/SOURCES.txt b/vendor/pip-9.0.3/pip.egg-info/SOURCES.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c8c511693088b288a035d9667a6091d1aa24e71a
--- /dev/null
+++ b/vendor/pip-9.0.3/pip.egg-info/SOURCES.txt
@@ -0,0 +1,316 @@
+AUTHORS.txt
+CHANGES.txt
+LICENSE.txt
+MANIFEST.in
+README.rst
+setup.cfg
+setup.py
+docs/Makefile
+docs/__init__.py
+docs/conf.py
+docs/configuration.rst
+docs/cookbook.rst
+docs/development.rst
+docs/index.rst
+docs/installing.rst
+docs/logic.rst
+docs/make.bat
+docs/news.rst
+docs/pipext.py
+docs/quickstart.rst
+docs/usage.rst
+docs/user_guide.rst
+docs/reference/index.rst
+docs/reference/pip.rst
+docs/reference/pip_download.rst
+docs/reference/pip_freeze.rst
+docs/reference/pip_hash.rst
+docs/reference/pip_install.rst
+docs/reference/pip_list.rst
+docs/reference/pip_search.rst
+docs/reference/pip_show.rst
+docs/reference/pip_uninstall.rst
+docs/reference/pip_wheel.rst
+pip/__init__.py
+pip/__main__.py
+pip/basecommand.py
+pip/baseparser.py
+pip/cmdoptions.py
+pip/download.py
+pip/exceptions.py
+pip/index.py
+pip/locations.py
+pip/pep425tags.py
+pip/status_codes.py
+pip/wheel.py
+pip.egg-info/PKG-INFO
+pip.egg-info/SOURCES.txt
+pip.egg-info/dependency_links.txt
+pip.egg-info/entry_points.txt
+pip.egg-info/not-zip-safe
+pip.egg-info/requires.txt
+pip.egg-info/top_level.txt
+pip/_vendor/README.rst
+pip/_vendor/__init__.py
+pip/_vendor/appdirs.py
+pip/_vendor/distro.py
+pip/_vendor/ipaddress.py
+pip/_vendor/ordereddict.py
+pip/_vendor/pyparsing.py
+pip/_vendor/re-vendor.py
+pip/_vendor/retrying.py
+pip/_vendor/six.py
+pip/_vendor/vendor.txt
+pip/_vendor/cachecontrol/__init__.py
+pip/_vendor/cachecontrol/_cmd.py
+pip/_vendor/cachecontrol/adapter.py
+pip/_vendor/cachecontrol/cache.py
+pip/_vendor/cachecontrol/compat.py
+pip/_vendor/cachecontrol/controller.py
+pip/_vendor/cachecontrol/filewrapper.py
+pip/_vendor/cachecontrol/heuristics.py
+pip/_vendor/cachecontrol/serialize.py
+pip/_vendor/cachecontrol/wrapper.py
+pip/_vendor/cachecontrol/caches/__init__.py
+pip/_vendor/cachecontrol/caches/file_cache.py
+pip/_vendor/cachecontrol/caches/redis_cache.py
+pip/_vendor/certifi/__init__.py
+pip/_vendor/certifi/__main__.py
+pip/_vendor/certifi/cacert.pem
+pip/_vendor/certifi/core.py
+pip/_vendor/chardet/__init__.py
+pip/_vendor/chardet/big5freq.py
+pip/_vendor/chardet/big5prober.py
+pip/_vendor/chardet/chardistribution.py
+pip/_vendor/chardet/charsetgroupprober.py
+pip/_vendor/chardet/charsetprober.py
+pip/_vendor/chardet/codingstatemachine.py
+pip/_vendor/chardet/compat.py
+pip/_vendor/chardet/cp949prober.py
+pip/_vendor/chardet/enums.py
+pip/_vendor/chardet/escprober.py
+pip/_vendor/chardet/escsm.py
+pip/_vendor/chardet/eucjpprober.py
+pip/_vendor/chardet/euckrfreq.py
+pip/_vendor/chardet/euckrprober.py
+pip/_vendor/chardet/euctwfreq.py
+pip/_vendor/chardet/euctwprober.py
+pip/_vendor/chardet/gb2312freq.py
+pip/_vendor/chardet/gb2312prober.py
+pip/_vendor/chardet/hebrewprober.py
+pip/_vendor/chardet/jisfreq.py
+pip/_vendor/chardet/jpcntx.py
+pip/_vendor/chardet/langbulgarianmodel.py
+pip/_vendor/chardet/langcyrillicmodel.py
+pip/_vendor/chardet/langgreekmodel.py
+pip/_vendor/chardet/langhebrewmodel.py
+pip/_vendor/chardet/langhungarianmodel.py
+pip/_vendor/chardet/langthaimodel.py
+pip/_vendor/chardet/langturkishmodel.py
+pip/_vendor/chardet/latin1prober.py
+pip/_vendor/chardet/mbcharsetprober.py
+pip/_vendor/chardet/mbcsgroupprober.py
+pip/_vendor/chardet/mbcssm.py
+pip/_vendor/chardet/sbcharsetprober.py
+pip/_vendor/chardet/sbcsgroupprober.py
+pip/_vendor/chardet/sjisprober.py
+pip/_vendor/chardet/universaldetector.py
+pip/_vendor/chardet/utf8prober.py
+pip/_vendor/chardet/version.py
+pip/_vendor/chardet/cli/__init__.py
+pip/_vendor/chardet/cli/chardetect.py
+pip/_vendor/colorama/__init__.py
+pip/_vendor/colorama/ansi.py
+pip/_vendor/colorama/ansitowin32.py
+pip/_vendor/colorama/initialise.py
+pip/_vendor/colorama/win32.py
+pip/_vendor/colorama/winterm.py
+pip/_vendor/distlib/__init__.py
+pip/_vendor/distlib/compat.py
+pip/_vendor/distlib/database.py
+pip/_vendor/distlib/index.py
+pip/_vendor/distlib/locators.py
+pip/_vendor/distlib/manifest.py
+pip/_vendor/distlib/markers.py
+pip/_vendor/distlib/metadata.py
+pip/_vendor/distlib/resources.py
+pip/_vendor/distlib/scripts.py
+pip/_vendor/distlib/t32.exe
+pip/_vendor/distlib/t64.exe
+pip/_vendor/distlib/util.py
+pip/_vendor/distlib/version.py
+pip/_vendor/distlib/w32.exe
+pip/_vendor/distlib/w64.exe
+pip/_vendor/distlib/wheel.py
+pip/_vendor/distlib/_backport/__init__.py
+pip/_vendor/distlib/_backport/misc.py
+pip/_vendor/distlib/_backport/shutil.py
+pip/_vendor/distlib/_backport/sysconfig.cfg
+pip/_vendor/distlib/_backport/sysconfig.py
+pip/_vendor/distlib/_backport/tarfile.py
+pip/_vendor/html5lib/__init__.py
+pip/_vendor/html5lib/_ihatexml.py
+pip/_vendor/html5lib/_inputstream.py
+pip/_vendor/html5lib/_tokenizer.py
+pip/_vendor/html5lib/_utils.py
+pip/_vendor/html5lib/constants.py
+pip/_vendor/html5lib/html5parser.py
+pip/_vendor/html5lib/serializer.py
+pip/_vendor/html5lib/_trie/__init__.py
+pip/_vendor/html5lib/_trie/_base.py
+pip/_vendor/html5lib/_trie/datrie.py
+pip/_vendor/html5lib/_trie/py.py
+pip/_vendor/html5lib/filters/__init__.py
+pip/_vendor/html5lib/filters/alphabeticalattributes.py
+pip/_vendor/html5lib/filters/base.py
+pip/_vendor/html5lib/filters/inject_meta_charset.py
+pip/_vendor/html5lib/filters/lint.py
+pip/_vendor/html5lib/filters/optionaltags.py
+pip/_vendor/html5lib/filters/sanitizer.py
+pip/_vendor/html5lib/filters/whitespace.py
+pip/_vendor/html5lib/treeadapters/__init__.py
+pip/_vendor/html5lib/treeadapters/genshi.py
+pip/_vendor/html5lib/treeadapters/sax.py
+pip/_vendor/html5lib/treebuilders/__init__.py
+pip/_vendor/html5lib/treebuilders/base.py
+pip/_vendor/html5lib/treebuilders/dom.py
+pip/_vendor/html5lib/treebuilders/etree.py
+pip/_vendor/html5lib/treebuilders/etree_lxml.py
+pip/_vendor/html5lib/treewalkers/__init__.py
+pip/_vendor/html5lib/treewalkers/base.py
+pip/_vendor/html5lib/treewalkers/dom.py
+pip/_vendor/html5lib/treewalkers/etree.py
+pip/_vendor/html5lib/treewalkers/etree_lxml.py
+pip/_vendor/html5lib/treewalkers/genshi.py
+pip/_vendor/idna/__init__.py
+pip/_vendor/idna/codec.py
+pip/_vendor/idna/compat.py
+pip/_vendor/idna/core.py
+pip/_vendor/idna/idnadata.py
+pip/_vendor/idna/intranges.py
+pip/_vendor/idna/package_data.py
+pip/_vendor/idna/uts46data.py
+pip/_vendor/lockfile/__init__.py
+pip/_vendor/lockfile/linklockfile.py
+pip/_vendor/lockfile/mkdirlockfile.py
+pip/_vendor/lockfile/pidlockfile.py
+pip/_vendor/lockfile/sqlitelockfile.py
+pip/_vendor/lockfile/symlinklockfile.py
+pip/_vendor/packaging/__about__.py
+pip/_vendor/packaging/__init__.py
+pip/_vendor/packaging/_compat.py
+pip/_vendor/packaging/_structures.py
+pip/_vendor/packaging/markers.py
+pip/_vendor/packaging/requirements.py
+pip/_vendor/packaging/specifiers.py
+pip/_vendor/packaging/utils.py
+pip/_vendor/packaging/version.py
+pip/_vendor/pkg_resources/__init__.py
+pip/_vendor/progress/__init__.py
+pip/_vendor/progress/bar.py
+pip/_vendor/progress/counter.py
+pip/_vendor/progress/helpers.py
+pip/_vendor/progress/spinner.py
+pip/_vendor/requests/__init__.py
+pip/_vendor/requests/__version__.py
+pip/_vendor/requests/_internal_utils.py
+pip/_vendor/requests/adapters.py
+pip/_vendor/requests/api.py
+pip/_vendor/requests/auth.py
+pip/_vendor/requests/cacert.pem
+pip/_vendor/requests/certs.py
+pip/_vendor/requests/compat.py
+pip/_vendor/requests/cookies.py
+pip/_vendor/requests/exceptions.py
+pip/_vendor/requests/help.py
+pip/_vendor/requests/hooks.py
+pip/_vendor/requests/models.py
+pip/_vendor/requests/packages.py
+pip/_vendor/requests/sessions.py
+pip/_vendor/requests/status_codes.py
+pip/_vendor/requests/structures.py
+pip/_vendor/requests/utils.py
+pip/_vendor/urllib3/__init__.py
+pip/_vendor/urllib3/_collections.py
+pip/_vendor/urllib3/connection.py
+pip/_vendor/urllib3/connectionpool.py
+pip/_vendor/urllib3/exceptions.py
+pip/_vendor/urllib3/fields.py
+pip/_vendor/urllib3/filepost.py
+pip/_vendor/urllib3/poolmanager.py
+pip/_vendor/urllib3/request.py
+pip/_vendor/urllib3/response.py
+pip/_vendor/urllib3/contrib/__init__.py
+pip/_vendor/urllib3/contrib/appengine.py
+pip/_vendor/urllib3/contrib/ntlmpool.py
+pip/_vendor/urllib3/contrib/pyopenssl.py
+pip/_vendor/urllib3/contrib/securetransport.py
+pip/_vendor/urllib3/contrib/socks.py
+pip/_vendor/urllib3/contrib/_securetransport/__init__.py
+pip/_vendor/urllib3/contrib/_securetransport/bindings.py
+pip/_vendor/urllib3/contrib/_securetransport/low_level.py
+pip/_vendor/urllib3/packages/__init__.py
+pip/_vendor/urllib3/packages/ordered_dict.py
+pip/_vendor/urllib3/packages/six.py
+pip/_vendor/urllib3/packages/backports/__init__.py
+pip/_vendor/urllib3/packages/backports/makefile.py
+pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py
+pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py
+pip/_vendor/urllib3/util/__init__.py
+pip/_vendor/urllib3/util/connection.py
+pip/_vendor/urllib3/util/request.py
+pip/_vendor/urllib3/util/response.py
+pip/_vendor/urllib3/util/retry.py
+pip/_vendor/urllib3/util/selectors.py
+pip/_vendor/urllib3/util/ssl_.py
+pip/_vendor/urllib3/util/timeout.py
+pip/_vendor/urllib3/util/url.py
+pip/_vendor/urllib3/util/wait.py
+pip/_vendor/webencodings/__init__.py
+pip/_vendor/webencodings/labels.py
+pip/_vendor/webencodings/mklabels.py
+pip/_vendor/webencodings/tests.py
+pip/_vendor/webencodings/x_user_defined.py
+pip/commands/__init__.py
+pip/commands/check.py
+pip/commands/completion.py
+pip/commands/download.py
+pip/commands/freeze.py
+pip/commands/hash.py
+pip/commands/help.py
+pip/commands/install.py
+pip/commands/list.py
+pip/commands/search.py
+pip/commands/show.py
+pip/commands/uninstall.py
+pip/commands/wheel.py
+pip/compat/__init__.py
+pip/compat/dictconfig.py
+pip/models/__init__.py
+pip/models/index.py
+pip/operations/__init__.py
+pip/operations/check.py
+pip/operations/freeze.py
+pip/req/__init__.py
+pip/req/req_file.py
+pip/req/req_install.py
+pip/req/req_set.py
+pip/req/req_uninstall.py
+pip/utils/__init__.py
+pip/utils/appdirs.py
+pip/utils/build.py
+pip/utils/deprecation.py
+pip/utils/encoding.py
+pip/utils/filesystem.py
+pip/utils/glibc.py
+pip/utils/hashes.py
+pip/utils/logging.py
+pip/utils/outdated.py
+pip/utils/packaging.py
+pip/utils/setuptools_build.py
+pip/utils/ui.py
+pip/vcs/__init__.py
+pip/vcs/bazaar.py
+pip/vcs/git.py
+pip/vcs/mercurial.py
+pip/vcs/subversion.py
\ No newline at end of file
diff --git a/vendor/pip-9.0.3/pip.egg-info/dependency_links.txt b/vendor/pip-9.0.3/pip.egg-info/dependency_links.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc
--- /dev/null
+++ b/vendor/pip-9.0.3/pip.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/vendor/pip-9.0.3/pip.egg-info/entry_points.txt b/vendor/pip-9.0.3/pip.egg-info/entry_points.txt
new file mode 100644
index 0000000000000000000000000000000000000000..879fd89648478d3b98551de10b0157007182e7cd
--- /dev/null
+++ b/vendor/pip-9.0.3/pip.egg-info/entry_points.txt
@@ -0,0 +1,5 @@
+[console_scripts]
+pip = pip:main
+pip3 = pip:main
+pip3.6 = pip:main
+
diff --git a/vendor/pip-9.0.3/pip.egg-info/not-zip-safe b/vendor/pip-9.0.3/pip.egg-info/not-zip-safe
new file mode 100644
index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc
--- /dev/null
+++ b/vendor/pip-9.0.3/pip.egg-info/not-zip-safe
@@ -0,0 +1 @@
+
diff --git a/vendor/pip-9.0.3/pip.egg-info/requires.txt b/vendor/pip-9.0.3/pip.egg-info/requires.txt
new file mode 100644
index 0000000000000000000000000000000000000000..26b980b8fa17b2daf9f8e98427da4aebd261c56e
--- /dev/null
+++ b/vendor/pip-9.0.3/pip.egg-info/requires.txt
@@ -0,0 +1,7 @@
+
+[testing]
+pytest
+virtualenv>=1.10
+scripttest>=1.3
+mock
+pretend
diff --git a/vendor/pip-9.0.3/pip.egg-info/top_level.txt b/vendor/pip-9.0.3/pip.egg-info/top_level.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a1b589e38a32041e49332e5e81c2d363dc418d68
--- /dev/null
+++ b/vendor/pip-9.0.3/pip.egg-info/top_level.txt
@@ -0,0 +1 @@
+pip
diff --git a/vendor/pip-9.0.3/pip/__init__.py b/vendor/pip-9.0.3/pip/__init__.py
new file mode 100755
index 0000000000000000000000000000000000000000..c00b284d624a375c922228fdd172b1a55a6c747e
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/__init__.py
@@ -0,0 +1,346 @@
+#!/usr/bin/env python
+from __future__ import absolute_import
+
+import locale
+import logging
+import os
+import optparse
+import warnings
+
+import sys
+import re
+
+# 2016-06-17 barry@debian.org: urllib3 1.14 added optional support for socks,
+# but if invoked (i.e. imported), it will issue a warning to stderr if socks
+# isn't available.  requests unconditionally imports urllib3's socks contrib
+# module, triggering this warning.  The warning breaks DEP-8 tests (because of
+# the stderr output) and is just plain annoying in normal usage.  I don't want
+# to add socks as yet another dependency for pip, nor do I want to allow-stder
+# in the DEP-8 tests, so just suppress the warning.  pdb tells me this has to
+# be done before the import of pip.vcs.
+from pip._vendor.urllib3.exceptions import DependencyWarning
+warnings.filterwarnings("ignore", category=DependencyWarning)  # noqa
+
+# We want to inject the use of SecureTransport as early as possible so that any
+# references or sessions or what have you are ensured to have it, however we
+# only want to do this in the case that we're running on macOS and the linked
+# OpenSSL is too old to handle TLSv1.2
+try:
+    import ssl
+except ImportError:
+    pass
+else:
+    if (sys.platform == "darwin" and
+            getattr(ssl, "OPENSSL_VERSION_NUMBER", 0) < 0x1000100f):  # OpenSSL 1.0.1
+        try:
+            from pip._vendor.urllib3.contrib import securetransport
+        except (ImportError, OSError):
+            pass
+        else:
+            securetransport.inject_into_urllib3()
+
+from pip.exceptions import InstallationError, CommandError, PipError
+from pip.utils import get_installed_distributions, get_prog
+from pip.utils import deprecation, dist_is_editable
+from pip.vcs import git, mercurial, subversion, bazaar  # noqa
+from pip.baseparser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
+from pip.commands import get_summaries, get_similar_commands
+from pip.commands import commands_dict
+from pip._vendor.urllib3.exceptions import InsecureRequestWarning
+
+
+# assignment for flake8 to be happy
+
+# This fixes a peculiarity when importing via __import__ - as we are
+# initialising the pip module, "from pip import cmdoptions" is recursive
+# and appears not to work properly in that situation.
+import pip.cmdoptions
+cmdoptions = pip.cmdoptions
+
+# The version as used in the setup.py and the docs conf.py
+__version__ = "9.0.3"
+
+
+logger = logging.getLogger(__name__)
+
+# Hide the InsecureRequestWarning from urllib3
+warnings.filterwarnings("ignore", category=InsecureRequestWarning)
+
+
+def autocomplete():
+    """Command and option completion for the main option parser (and options)
+    and its subcommands (and options).
+
+    Enable by sourcing one of the completion shell scripts (bash, zsh or fish).
+    """
+    # Don't complete if user hasn't sourced bash_completion file.
+    if 'PIP_AUTO_COMPLETE' not in os.environ:
+        return
+    cwords = os.environ['COMP_WORDS'].split()[1:]
+    cword = int(os.environ['COMP_CWORD'])
+    try:
+        current = cwords[cword - 1]
+    except IndexError:
+        current = ''
+
+    subcommands = [cmd for cmd, summary in get_summaries()]
+    options = []
+    # subcommand
+    try:
+        subcommand_name = [w for w in cwords if w in subcommands][0]
+    except IndexError:
+        subcommand_name = None
+
+    parser = create_main_parser()
+    # subcommand options
+    if subcommand_name:
+        # special case: 'help' subcommand has no options
+        if subcommand_name == 'help':
+            sys.exit(1)
+        # special case: list locally installed dists for uninstall command
+        if subcommand_name == 'uninstall' and not current.startswith('-'):
+            installed = []
+            lc = current.lower()
+            for dist in get_installed_distributions(local_only=True):
+                if dist.key.startswith(lc) and dist.key not in cwords[1:]:
+                    installed.append(dist.key)
+            # if there are no dists installed, fall back to option completion
+            if installed:
+                for dist in installed:
+                    print(dist)
+                sys.exit(1)
+
+        subcommand = commands_dict[subcommand_name]()
+        options += [(opt.get_opt_string(), opt.nargs)
+                    for opt in subcommand.parser.option_list_all
+                    if opt.help != optparse.SUPPRESS_HELP]
+
+        # filter out previously specified options from available options
+        prev_opts = [x.split('=')[0] for x in cwords[1:cword - 1]]
+        options = [(x, v) for (x, v) in options if x not in prev_opts]
+        # filter options by current input
+        options = [(k, v) for k, v in options if k.startswith(current)]
+        for option in options:
+            opt_label = option[0]
+            # append '=' to options which require args
+            if option[1]:
+                opt_label += '='
+            print(opt_label)
+    else:
+        # show main parser options only when necessary
+        if current.startswith('-') or current.startswith('--'):
+            opts = [i.option_list for i in parser.option_groups]
+            opts.append(parser.option_list)
+            opts = (o for it in opts for o in it)
+
+            subcommands += [i.get_opt_string() for i in opts
+                            if i.help != optparse.SUPPRESS_HELP]
+
+        print(' '.join([x for x in subcommands if x.startswith(current)]))
+    sys.exit(1)
+
+
+def create_main_parser():
+    parser_kw = {
+        'usage': '\n%prog <command> [options]',
+        'add_help_option': False,
+        'formatter': UpdatingDefaultsHelpFormatter(),
+        'name': 'global',
+        'prog': get_prog(),
+    }
+
+    parser = ConfigOptionParser(**parser_kw)
+    parser.disable_interspersed_args()
+
+    pip_pkg_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+    parser.version = 'pip %s from %s (python %s)' % (
+        __version__, pip_pkg_dir, sys.version[:3])
+
+    # add the general options
+    gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser)
+    parser.add_option_group(gen_opts)
+
+    parser.main = True  # so the help formatter knows
+
+    # create command listing for description
+    command_summaries = get_summaries()
+    description = [''] + ['%-27s %s' % (i, j) for i, j in command_summaries]
+    parser.description = '\n'.join(description)
+
+    return parser
+
+
+def parseopts(args):
+    parser = create_main_parser()
+
+    # Note: parser calls disable_interspersed_args(), so the result of this
+    # call is to split the initial args into the general options before the
+    # subcommand and everything else.
+    # For example:
+    #  args: ['--timeout=5', 'install', '--user', 'INITools']
+    #  general_options: ['--timeout==5']
+    #  args_else: ['install', '--user', 'INITools']
+    general_options, args_else = parser.parse_args(args)
+
+    # --version
+    if general_options.version:
+        sys.stdout.write(parser.version)
+        sys.stdout.write(os.linesep)
+        sys.exit()
+
+    # pip || pip help -> print_help()
+    if not args_else or (args_else[0] == 'help' and len(args_else) == 1):
+        parser.print_help()
+        sys.exit()
+
+    # the subcommand name
+    cmd_name = args_else[0]
+
+    if cmd_name not in commands_dict:
+        guess = get_similar_commands(cmd_name)
+
+        msg = ['unknown command "%s"' % cmd_name]
+        if guess:
+            msg.append('maybe you meant "%s"' % guess)
+
+        raise CommandError(' - '.join(msg))
+
+    # all the args without the subcommand
+    cmd_args = args[:]
+    cmd_args.remove(cmd_name)
+
+    return cmd_name, cmd_args
+
+
+def check_isolated(args):
+    isolated = False
+
+    if "--isolated" in args:
+        isolated = True
+
+    return isolated
+
+
+def main(args=None):
+    if args is None:
+        args = sys.argv[1:]
+
+    # Configure our deprecation warnings to be sent through loggers
+    deprecation.install_warning_logger()
+
+    autocomplete()
+
+    try:
+        cmd_name, cmd_args = parseopts(args)
+    except PipError as exc:
+        sys.stderr.write("ERROR: %s" % exc)
+        sys.stderr.write(os.linesep)
+        sys.exit(1)
+
+    # Needed for locale.getpreferredencoding(False) to work
+    # in pip.utils.encoding.auto_decode
+    try:
+        locale.setlocale(locale.LC_ALL, '')
+    except locale.Error as e:
+        # setlocale can apparently crash if locale are uninitialized
+        logger.debug("Ignoring error %s when setting locale", e)
+    command = commands_dict[cmd_name](isolated=check_isolated(cmd_args))
+    return command.main(cmd_args)
+
+
+# ###########################################################
+# # Writing freeze files
+
+class FrozenRequirement(object):
+
+    def __init__(self, name, req, editable, comments=()):
+        self.name = name
+        self.req = req
+        self.editable = editable
+        self.comments = comments
+
+    _rev_re = re.compile(r'-r(\d+)$')
+    _date_re = re.compile(r'-(20\d\d\d\d\d\d)$')
+
+    @classmethod
+    def from_dist(cls, dist, dependency_links):
+        location = os.path.normcase(os.path.abspath(dist.location))
+        comments = []
+        from pip.vcs import vcs, get_src_requirement
+        if dist_is_editable(dist) and vcs.get_backend_name(location):
+            editable = True
+            try:
+                req = get_src_requirement(dist, location)
+            except InstallationError as exc:
+                logger.warning(
+                    "Error when trying to get requirement for VCS system %s, "
+                    "falling back to uneditable format", exc
+                )
+                req = None
+            if req is None:
+                logger.warning(
+                    'Could not determine repository location of %s', location
+                )
+                comments.append(
+                    '## !! Could not determine repository location'
+                )
+                req = dist.as_requirement()
+                editable = False
+        else:
+            editable = False
+            req = dist.as_requirement()
+            specs = req.specs
+            assert len(specs) == 1 and specs[0][0] in ["==", "==="], \
+                'Expected 1 spec with == or ===; specs = %r; dist = %r' % \
+                (specs, dist)
+            version = specs[0][1]
+            ver_match = cls._rev_re.search(version)
+            date_match = cls._date_re.search(version)
+            if ver_match or date_match:
+                svn_backend = vcs.get_backend('svn')
+                if svn_backend:
+                    svn_location = svn_backend().get_location(
+                        dist,
+                        dependency_links,
+                    )
+                if not svn_location:
+                    logger.warning(
+                        'Warning: cannot find svn location for %s', req)
+                    comments.append(
+                        '## FIXME: could not find svn URL in dependency_links '
+                        'for this package:'
+                    )
+                else:
+                    comments.append(
+                        '# Installing as editable to satisfy requirement %s:' %
+                        req
+                    )
+                    if ver_match:
+                        rev = ver_match.group(1)
+                    else:
+                        rev = '{%s}' % date_match.group(1)
+                    editable = True
+                    req = '%s@%s#egg=%s' % (
+                        svn_location,
+                        rev,
+                        cls.egg_name(dist)
+                    )
+        return cls(dist.project_name, req, editable, comments)
+
+    @staticmethod
+    def egg_name(dist):
+        name = dist.egg_name()
+        match = re.search(r'-py\d\.\d$', name)
+        if match:
+            name = name[:match.start()]
+        return name
+
+    def __str__(self):
+        req = self.req
+        if self.editable:
+            req = '-e %s' % req
+        return '\n'.join(list(self.comments) + [str(req)]) + '\n'
+
+
+if __name__ == '__main__':
+    sys.exit(main())
diff --git a/vendor/pip-9.0.3/pip/__main__.py b/vendor/pip-9.0.3/pip/__main__.py
new file mode 100644
index 0000000000000000000000000000000000000000..5556539cb714e8ef5e7a969cc1a74f67a5a63436
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/__main__.py
@@ -0,0 +1,19 @@
+from __future__ import absolute_import
+
+import os
+import sys
+
+# If we are running from a wheel, add the wheel to sys.path
+# This allows the usage python pip-*.whl/pip install pip-*.whl
+if __package__ == '':
+    # __file__ is pip-*.whl/pip/__main__.py
+    # first dirname call strips of '/__main__.py', second strips off '/pip'
+    # Resulting path is the name of the wheel itself
+    # Add that to sys.path so we can import pip
+    path = os.path.dirname(os.path.dirname(__file__))
+    sys.path.insert(0, path)
+
+import pip  # noqa
+
+if __name__ == '__main__':
+    sys.exit(pip.main())
diff --git a/vendor/pip-9.0.3/pip/_vendor/README.rst b/vendor/pip-9.0.3/pip/_vendor/README.rst
new file mode 100644
index 0000000000000000000000000000000000000000..652a43f25b8e9dc7ec31b065623c4a2854abcf79
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/README.rst
@@ -0,0 +1,134 @@
+Policy
+======
+
+* Vendored libraries **MUST** not be modified except as required to
+  successfully vendor them.
+
+* Vendored libraries **MUST** be released copies of libraries available on
+  PyPI.
+
+* The versions of libraries vendored in pip **MUST** be reflected in
+  ``pip/_vendor/vendor.txt``.
+
+* Vendored libraries **MUST** function without any build steps such as 2to3 or
+  compilation of C code, pratically this limits to single source 2.x/3.x and
+  pure Python.
+
+* Any modifications made to libraries **MUST** be noted in
+  ``pip/_vendor/README.rst``.
+
+
+Rationale
+---------
+
+Historically pip has not had any dependencies except for setuptools itself,
+choosing instead to implement any functionality it needed to prevent needing
+a dependency. However, starting with pip 1.5 we began to replace code that was
+implemented inside of pip with reusable libraries from PyPI. This brought the
+typical benefits of reusing libraries instead of reinventing the wheel like
+higher quality and more battle tested code, centralization of bug fixes
+(particularly security sensitive ones), and better/more features for less work.
+
+However, there is several issues with having dependencies in the traditional
+way (via ``install_requires``) for pip. These issues are:
+
+* Fragility. When pip depends on another library to function then if for
+  whatever reason that library either isn't installed or an incompatible
+  version is installed then pip ceases to function. This is of course true for
+  all Python applications, however for every application *except* for pip the
+  way you fix it is by re-running pip. Obviously when pip can't run you can't
+  use pip to fix pip so you're left having to manually resolve dependencies and
+  installing them by hand.
+
+* Making other libraries uninstallable. One of pip's current dependencies is
+  the requests library, for which pip requires a fairly recent version to run.
+  If pip dependended on requests in the traditional manner then we'd end up
+  needing to either maintain compatibility with every version of requests that
+  has ever existed (and will ever exist) or some subset of the versions of
+  requests available will simply become uninstallable depending on what version
+  of pip you're using. This is again a problem that is technically true for all
+  Python applications, however the nature of pip is that you're likely to have
+  pip installed in every single environment since it is installed by default
+  in Python, in pyvenv, and in virtualenv.
+
+* Security. On the surface this is oxymoronic since traditionally vendoring
+  tends to make it harder to update a dependent library for security updates
+  and that holds true for pip. However given the *other* reasons that exist for
+  pip to avoid dependencies the alternative (and what was done historically) is
+  for pip to reinvent the wheel itself. This led to pip having implemented
+  its own HTTPS verification routines to work around the lack of ssl
+  validation in the Python standard library which ended up having similar bugs
+  to validation routine in requests/urllib3 but which had to be discovered and
+  fixed independently. By reusing the libraries, even though we're vendoring,
+  we make it easier to keep pip secure by relying on the great work of our
+  dependencies *and* making it easier to actually fix security issues by simply
+  pulling in a newer version of the dependencies.
+
+* Bootstrapping. Currently most of the popular methods of installing pip rely
+  on the fact that pip is self contained to install pip itself. These tools
+  work by bundling a copy of pip, adding it to the sys.path and then executing
+  that copy of pip. This is done instead of implementing a "mini" installer to
+  again reduce duplication, pip already knows how to install a Python package
+  and is going to be vastly more battle tested than any sort of mini installer
+  could ever possibly be.
+
+Many downstream redistributors have policies against this kind of bundling and
+instead opt to patch the software they distribute to debundle it and make it
+rely on the global versions of the software that they already have packaged
+(which may have its own patches applied to it). We (the pip team) would prefer
+it if pip was *not* debundled in this manner due to the above reasons and
+instead we would prefer it if pip would be left intact as it is now. The one
+exception to this, is it is acceptable to remove the
+``pip/_vendor/requests/cacert.pem`` file provided you ensure that the
+``ssl.get_default_verify_paths().cafile`` API returns the correct CA bundle for
+your system. This will ensure that pip will use your system provided CA bundle
+instead of the copy bundled with pip.
+
+In the longer term, if someone has a *portable* solution to the above problems,
+other than the bundling method we currently use, that doesn't add additional
+problems that are unreasonable then we would be happy to consider, and possibly
+switch to said method. This solution must function correctly across all of the
+situation that we expect pip to be used and not mandate some external mechanism
+such as OS packages.
+
+
+pkg_resources
+-------------
+
+pkg_resources has been pulled in from setuptools 28.8.0
+
+
+Modifications
+-------------
+
+* html5lib has been modified to import six from pip._vendor
+* pkg_resources has been modified to import its externs from pip._vendor
+* CacheControl has been modified to import its dependencies from pip._vendor
+* packaging has been modified to import its dependencies from pip._vendor
+* requests has been modified *not* to optionally load any C dependencies.
+* Modified distro to delay importing argparse to avoid errors on 2.6
+
+
+Debundling
+----------
+
+As mentioned in the rationale we, the pip team, would prefer it if pip was not
+debundled (other than optionally ``pip/_vendor/requests/cacert.pem``) and that
+pip was left intact. However, if you insist on doing so we have a
+semi-supported method that we do test in our CI but which requires a bit of
+extra work on your end to make it still solve the problems from above.
+
+1. Delete everything in ``pip/_vendor/`` **except** for
+   ``pip/_vendor/__init__.py``.
+
+2. Generate wheels for each of pip's dependencies (and any of their
+   dependencies) using your patched copies of these libraries. These must be
+   placed somewhere on the filesystem that pip can access, by default we will
+   assume you've placed them in ``pip/_vendor``.
+
+3. Modify ``pip/_vendor/__init__.py`` so that the ``DEBUNDLED`` variable is
+   ``True``.
+
+4. *(Optional)* If you've placed the wheels in a location other than
+   ``pip/_vendor/`` then modify ``pip/_vendor/__init__.py`` so that the
+   ``WHEEL_DIR`` variable points to the location you've placed them.
diff --git a/vendor/pip-9.0.3/pip/_vendor/__init__.py b/vendor/pip-9.0.3/pip/_vendor/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..bee5f5e6fd3b0910c9abe7893b6473e6dcb9e782
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/__init__.py
@@ -0,0 +1,107 @@
+"""
+pip._vendor is for vendoring dependencies of pip to prevent needing pip to
+depend on something external.
+
+Files inside of pip._vendor should be considered immutable and should only be
+updated to versions from upstream.
+"""
+from __future__ import absolute_import
+
+import glob
+import os.path
+import sys
+
+# Downstream redistributors which have debundled our dependencies should also
+# patch this value to be true. This will trigger the additional patching
+# to cause things like "six" to be available as pip.
+DEBUNDLED = False
+
+# By default, look in this directory for a bunch of .whl files which we will
+# add to the beginning of sys.path before attempting to import anything. This
+# is done to support downstream re-distributors like Debian and Fedora who
+# wish to create their own Wheels for our dependencies to aid in debundling.
+WHEEL_DIR = os.path.abspath(os.path.dirname(__file__))
+
+
+# Define a small helper function to alias our vendored modules to the real ones
+# if the vendored ones do not exist. This idea of this was taken from
+# https://github.com/kennethreitz/requests/pull/2567.
+def vendored(modulename):
+    vendored_name = "{0}.{1}".format(__name__, modulename)
+
+    try:
+        __import__(vendored_name, globals(), locals(), level=0)
+    except ImportError:
+        try:
+            __import__(modulename, globals(), locals(), level=0)
+        except ImportError:
+            # We can just silently allow import failures to pass here. If we
+            # got to this point it means that ``import pip._vendor.whatever``
+            # failed and so did ``import whatever``. Since we're importing this
+            # upfront in an attempt to alias imports, not erroring here will
+            # just mean we get a regular import error whenever pip *actually*
+            # tries to import one of these modules to use it, which actually
+            # gives us a better error message than we would have otherwise
+            # gotten.
+            pass
+        else:
+            sys.modules[vendored_name] = sys.modules[modulename]
+            base, head = vendored_name.rsplit(".", 1)
+            setattr(sys.modules[base], head, sys.modules[modulename])
+
+
+# If we're operating in a debundled setup, then we want to go ahead and trigger
+# the aliasing of our vendored libraries as well as looking for wheels to add
+# to our sys.path. This will cause all of this code to be a no-op typically
+# however downstream redistributors can enable it in a consistent way across
+# all platforms.
+if DEBUNDLED:
+    # Actually look inside of WHEEL_DIR to find .whl files and add them to the
+    # front of our sys.path.
+    sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path
+
+    # Actually alias all of our vendored dependencies.
+    vendored("cachecontrol")
+    vendored("colorama")
+    vendored("distlib")
+    vendored("distro")
+    vendored("html5lib")
+    vendored("lockfile")
+    vendored("six")
+    vendored("six.moves")
+    vendored("six.moves.urllib")
+    vendored("packaging")
+    vendored("packaging.version")
+    vendored("packaging.specifiers")
+    vendored("pkg_resources")
+    vendored("progress")
+    vendored("retrying")
+    vendored("requests")
+    vendored("requests.packages")
+    vendored("requests.packages.urllib3")
+    vendored("requests.packages.urllib3._collections")
+    vendored("requests.packages.urllib3.connection")
+    vendored("requests.packages.urllib3.connectionpool")
+    vendored("requests.packages.urllib3.contrib")
+    vendored("requests.packages.urllib3.contrib.ntlmpool")
+    vendored("requests.packages.urllib3.contrib.pyopenssl")
+    vendored("requests.packages.urllib3.exceptions")
+    vendored("requests.packages.urllib3.fields")
+    vendored("requests.packages.urllib3.filepost")
+    vendored("requests.packages.urllib3.packages")
+    vendored("requests.packages.urllib3.packages.ordered_dict")
+    vendored("requests.packages.urllib3.packages.six")
+    vendored("requests.packages.urllib3.packages.ssl_match_hostname")
+    vendored("requests.packages.urllib3.packages.ssl_match_hostname."
+             "_implementation")
+    vendored("requests.packages.urllib3.poolmanager")
+    vendored("requests.packages.urllib3.request")
+    vendored("requests.packages.urllib3.response")
+    vendored("requests.packages.urllib3.util")
+    vendored("requests.packages.urllib3.util.connection")
+    vendored("requests.packages.urllib3.util.request")
+    vendored("requests.packages.urllib3.util.response")
+    vendored("requests.packages.urllib3.util.retry")
+    vendored("requests.packages.urllib3.util.ssl_")
+    vendored("requests.packages.urllib3.util.timeout")
+    vendored("requests.packages.urllib3.util.url")
diff --git a/vendor/pip-9.0.3/pip/_vendor/appdirs.py b/vendor/pip-9.0.3/pip/_vendor/appdirs.py
new file mode 100644
index 0000000000000000000000000000000000000000..4b5c38bb4822675c64fcf407120e7bc71d28e78f
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/appdirs.py
@@ -0,0 +1,552 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright (c) 2005-2010 ActiveState Software Inc.
+# Copyright (c) 2013 Eddy Petrișor
+
+"""Utilities for determining application-specific dirs.
+
+See <http://github.com/ActiveState/appdirs> for details and usage.
+"""
+# Dev Notes:
+# - MSDN on where to store app data files:
+#   http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120
+# - macOS: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html
+# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
+
+__version_info__ = (1, 4, 0)
+__version__ = '.'.join(map(str, __version_info__))
+
+
+import sys
+import os
+
+PY3 = sys.version_info[0] == 3
+
+if PY3:
+    unicode = str
+
+if sys.platform.startswith('java'):
+    import platform
+    os_name = platform.java_ver()[3][0]
+    if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc.
+        system = 'win32'
+    elif os_name.startswith('Mac'): # "macOS", etc.
+        system = 'darwin'
+    else: # "Linux", "SunOS", "FreeBSD", etc.
+        # Setting this to "linux2" is not ideal, but only Windows or Mac
+        # are actually checked for and the rest of the module expects
+        # *sys.platform* style strings.
+        system = 'linux2'
+else:
+    system = sys.platform
+
+
+
+def user_data_dir(appname=None, appauthor=None, version=None, roaming=False):
+    r"""Return full path to the user-specific data dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "roaming" (boolean, default False) can be set True to use the Windows
+            roaming appdata directory. That means that for users on a Windows
+            network setup for roaming profiles, this user data will be
+            sync'd on login. See
+            <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
+            for a discussion of issues.
+
+    Typical user data directories are:
+        macOS:                  ~/Library/Application Support/<AppName>
+        Unix:                   ~/.local/share/<AppName>    # or in $XDG_DATA_HOME, if defined
+        Win XP (not roaming):   C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName>
+        Win XP (roaming):       C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>
+        Win 7  (not roaming):   C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>
+        Win 7  (roaming):       C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName>
+
+    For Unix, we follow the XDG spec and support $XDG_DATA_HOME.
+    That means, by default "~/.local/share/<AppName>".
+    """
+    if system == "win32":
+        if appauthor is None:
+            appauthor = appname
+        const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA"
+        path = os.path.normpath(_get_win_folder(const))
+        if appname:
+            if appauthor is not False:
+                path = os.path.join(path, appauthor, appname)
+            else:
+                path = os.path.join(path, appname)
+    elif system == 'darwin':
+        path = os.path.expanduser('~/Library/Application Support/')
+        if appname:
+            path = os.path.join(path, appname)
+    else:
+        path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share"))
+        if appname:
+            path = os.path.join(path, appname)
+    if appname and version:
+        path = os.path.join(path, version)
+    return path
+
+
+def site_data_dir(appname=None, appauthor=None, version=None, multipath=False):
+    """Return full path to the user-shared data dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "multipath" is an optional parameter only applicable to *nix
+            which indicates that the entire list of data dirs should be
+            returned. By default, the first item from XDG_DATA_DIRS is
+            returned, or '/usr/local/share/<AppName>',
+            if XDG_DATA_DIRS is not set
+
+    Typical user data directories are:
+        macOS:      /Library/Application Support/<AppName>
+        Unix:       /usr/local/share/<AppName> or /usr/share/<AppName>
+        Win XP:     C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName>
+        Vista:      (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.)
+        Win 7:      C:\ProgramData\<AppAuthor>\<AppName>   # Hidden, but writeable on Win 7.
+
+    For Unix, this is using the $XDG_DATA_DIRS[0] default.
+
+    WARNING: Do not use this on Windows. See the Vista-Fail note above for why.
+    """
+    if system == "win32":
+        if appauthor is None:
+            appauthor = appname
+        path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA"))
+        if appname:
+            if appauthor is not False:
+                path = os.path.join(path, appauthor, appname)
+            else:
+                path = os.path.join(path, appname)
+    elif system == 'darwin':
+        path = os.path.expanduser('/Library/Application Support')
+        if appname:
+            path = os.path.join(path, appname)
+    else:
+        # XDG default for $XDG_DATA_DIRS
+        # only first, if multipath is False
+        path = os.getenv('XDG_DATA_DIRS',
+                         os.pathsep.join(['/usr/local/share', '/usr/share']))
+        pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)]
+        if appname:
+            if version:
+                appname = os.path.join(appname, version)
+            pathlist = [os.sep.join([x, appname]) for x in pathlist]
+
+        if multipath:
+            path = os.pathsep.join(pathlist)
+        else:
+            path = pathlist[0]
+        return path
+
+    if appname and version:
+        path = os.path.join(path, version)
+    return path
+
+
+def user_config_dir(appname=None, appauthor=None, version=None, roaming=False):
+    r"""Return full path to the user-specific config dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "roaming" (boolean, default False) can be set True to use the Windows
+            roaming appdata directory. That means that for users on a Windows
+            network setup for roaming profiles, this user data will be
+            sync'd on login. See
+            <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
+            for a discussion of issues.
+
+    Typical user data directories are:
+        macOS:                  same as user_data_dir
+        Unix:                   ~/.config/<AppName>     # or in $XDG_CONFIG_HOME, if defined
+        Win *:                  same as user_data_dir
+
+    For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME.
+    That means, by deafult "~/.config/<AppName>".
+    """
+    if system in ["win32", "darwin"]:
+        path = user_data_dir(appname, appauthor, None, roaming)
+    else:
+        path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config"))
+        if appname:
+            path = os.path.join(path, appname)
+    if appname and version:
+        path = os.path.join(path, version)
+    return path
+
+
+def site_config_dir(appname=None, appauthor=None, version=None, multipath=False):
+    """Return full path to the user-shared data dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "multipath" is an optional parameter only applicable to *nix
+            which indicates that the entire list of config dirs should be
+            returned. By default, the first item from XDG_CONFIG_DIRS is
+            returned, or '/etc/xdg/<AppName>', if XDG_CONFIG_DIRS is not set
+
+    Typical user data directories are:
+        macOS:      same as site_data_dir
+        Unix:       /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> for each value in
+                    $XDG_CONFIG_DIRS
+        Win *:      same as site_data_dir
+        Vista:      (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.)
+
+    For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False
+
+    WARNING: Do not use this on Windows. See the Vista-Fail note above for why.
+    """
+    if system in ["win32", "darwin"]:
+        path = site_data_dir(appname, appauthor)
+        if appname and version:
+            path = os.path.join(path, version)
+    else:
+        # XDG default for $XDG_CONFIG_DIRS
+        # only first, if multipath is False
+        path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg')
+        pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)]
+        if appname:
+            if version:
+                appname = os.path.join(appname, version)
+            pathlist = [os.sep.join([x, appname]) for x in pathlist]
+
+        if multipath:
+            path = os.pathsep.join(pathlist)
+        else:
+            path = pathlist[0]
+    return path
+
+
+def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True):
+    r"""Return full path to the user-specific cache dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "opinion" (boolean) can be False to disable the appending of
+            "Cache" to the base app data dir for Windows. See
+            discussion below.
+
+    Typical user cache directories are:
+        macOS:      ~/Library/Caches/<AppName>
+        Unix:       ~/.cache/<AppName> (XDG default)
+        Win XP:     C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache
+        Vista:      C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Cache
+
+    On Windows the only suggestion in the MSDN docs is that local settings go in
+    the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming
+    app data dir (the default returned by `user_data_dir` above). Apps typically
+    put cache data somewhere *under* the given dir here. Some examples:
+        ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache
+        ...\Acme\SuperApp\Cache\1.0
+    OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value.
+    This can be disabled with the `opinion=False` option.
+    """
+    if system == "win32":
+        if appauthor is None:
+            appauthor = appname
+        path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA"))
+        if appname:
+            if appauthor is not False:
+                path = os.path.join(path, appauthor, appname)
+            else:
+                path = os.path.join(path, appname)
+            if opinion:
+                path = os.path.join(path, "Cache")
+    elif system == 'darwin':
+        path = os.path.expanduser('~/Library/Caches')
+        if appname:
+            path = os.path.join(path, appname)
+    else:
+        path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache'))
+        if appname:
+            path = os.path.join(path, appname)
+    if appname and version:
+        path = os.path.join(path, version)
+    return path
+
+
+def user_log_dir(appname=None, appauthor=None, version=None, opinion=True):
+    r"""Return full path to the user-specific log dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "opinion" (boolean) can be False to disable the appending of
+            "Logs" to the base app data dir for Windows, and "log" to the
+            base cache dir for Unix. See discussion below.
+
+    Typical user cache directories are:
+        macOS:      ~/Library/Logs/<AppName>
+        Unix:       ~/.cache/<AppName>/log  # or under $XDG_CACHE_HOME if defined
+        Win XP:     C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs
+        Vista:      C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Logs
+
+    On Windows the only suggestion in the MSDN docs is that local settings
+    go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in
+    examples of what some windows apps use for a logs dir.)
+
+    OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA`
+    value for Windows and appends "log" to the user cache dir for Unix.
+    This can be disabled with the `opinion=False` option.
+    """
+    if system == "darwin":
+        path = os.path.join(
+            os.path.expanduser('~/Library/Logs'),
+            appname)
+    elif system == "win32":
+        path = user_data_dir(appname, appauthor, version)
+        version = False
+        if opinion:
+            path = os.path.join(path, "Logs")
+    else:
+        path = user_cache_dir(appname, appauthor, version)
+        version = False
+        if opinion:
+            path = os.path.join(path, "log")
+    if appname and version:
+        path = os.path.join(path, version)
+    return path
+
+
+class AppDirs(object):
+    """Convenience wrapper for getting application dirs."""
+    def __init__(self, appname, appauthor=None, version=None, roaming=False,
+                 multipath=False):
+        self.appname = appname
+        self.appauthor = appauthor
+        self.version = version
+        self.roaming = roaming
+        self.multipath = multipath
+
+    @property
+    def user_data_dir(self):
+        return user_data_dir(self.appname, self.appauthor,
+                             version=self.version, roaming=self.roaming)
+
+    @property
+    def site_data_dir(self):
+        return site_data_dir(self.appname, self.appauthor,
+                             version=self.version, multipath=self.multipath)
+
+    @property
+    def user_config_dir(self):
+        return user_config_dir(self.appname, self.appauthor,
+                               version=self.version, roaming=self.roaming)
+
+    @property
+    def site_config_dir(self):
+        return site_config_dir(self.appname, self.appauthor,
+                             version=self.version, multipath=self.multipath)
+
+    @property
+    def user_cache_dir(self):
+        return user_cache_dir(self.appname, self.appauthor,
+                              version=self.version)
+
+    @property
+    def user_log_dir(self):
+        return user_log_dir(self.appname, self.appauthor,
+                            version=self.version)
+
+
+#---- internal support stuff
+
+def _get_win_folder_from_registry(csidl_name):
+    """This is a fallback technique at best. I'm not sure if using the
+    registry for this guarantees us the correct answer for all CSIDL_*
+    names.
+    """
+    import _winreg
+
+    shell_folder_name = {
+        "CSIDL_APPDATA": "AppData",
+        "CSIDL_COMMON_APPDATA": "Common AppData",
+        "CSIDL_LOCAL_APPDATA": "Local AppData",
+    }[csidl_name]
+
+    key = _winreg.OpenKey(
+        _winreg.HKEY_CURRENT_USER,
+        r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
+    )
+    dir, type = _winreg.QueryValueEx(key, shell_folder_name)
+    return dir
+
+
+def _get_win_folder_with_pywin32(csidl_name):
+    from win32com.shell import shellcon, shell
+    dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0)
+    # Try to make this a unicode path because SHGetFolderPath does
+    # not return unicode strings when there is unicode data in the
+    # path.
+    try:
+        dir = unicode(dir)
+
+        # Downgrade to short path name if have highbit chars. See
+        # <http://bugs.activestate.com/show_bug.cgi?id=85099>.
+        has_high_char = False
+        for c in dir:
+            if ord(c) > 255:
+                has_high_char = True
+                break
+        if has_high_char:
+            try:
+                import win32api
+                dir = win32api.GetShortPathName(dir)
+            except ImportError:
+                pass
+    except UnicodeError:
+        pass
+    return dir
+
+
+def _get_win_folder_with_ctypes(csidl_name):
+    import ctypes
+
+    csidl_const = {
+        "CSIDL_APPDATA": 26,
+        "CSIDL_COMMON_APPDATA": 35,
+        "CSIDL_LOCAL_APPDATA": 28,
+    }[csidl_name]
+
+    buf = ctypes.create_unicode_buffer(1024)
+    ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf)
+
+    # Downgrade to short path name if have highbit chars. See
+    # <http://bugs.activestate.com/show_bug.cgi?id=85099>.
+    has_high_char = False
+    for c in buf:
+        if ord(c) > 255:
+            has_high_char = True
+            break
+    if has_high_char:
+        buf2 = ctypes.create_unicode_buffer(1024)
+        if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024):
+            buf = buf2
+
+    return buf.value
+
+def _get_win_folder_with_jna(csidl_name):
+    import array
+    from com.sun import jna
+    from com.sun.jna.platform import win32
+
+    buf_size = win32.WinDef.MAX_PATH * 2
+    buf = array.zeros('c', buf_size)
+    shell = win32.Shell32.INSTANCE
+    shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf)
+    dir = jna.Native.toString(buf.tostring()).rstrip("\0")
+
+    # Downgrade to short path name if have highbit chars. See
+    # <http://bugs.activestate.com/show_bug.cgi?id=85099>.
+    has_high_char = False
+    for c in dir:
+        if ord(c) > 255:
+            has_high_char = True
+            break
+    if has_high_char:
+        buf = array.zeros('c', buf_size)
+        kernel = win32.Kernel32.INSTANCE
+        if kernal.GetShortPathName(dir, buf, buf_size):
+            dir = jna.Native.toString(buf.tostring()).rstrip("\0")
+
+    return dir
+
+if system == "win32":
+    try:
+        import win32com.shell
+        _get_win_folder = _get_win_folder_with_pywin32
+    except ImportError:
+        try:
+            from ctypes import windll
+            _get_win_folder = _get_win_folder_with_ctypes
+        except ImportError:
+            try:
+                import com.sun.jna
+                _get_win_folder = _get_win_folder_with_jna
+            except ImportError:
+                _get_win_folder = _get_win_folder_from_registry
+
+
+#---- self test code
+
+if __name__ == "__main__":
+    appname = "MyApp"
+    appauthor = "MyCompany"
+
+    props = ("user_data_dir", "site_data_dir",
+             "user_config_dir", "site_config_dir",
+             "user_cache_dir", "user_log_dir")
+
+    print("-- app dirs (with optional 'version')")
+    dirs = AppDirs(appname, appauthor, version="1.0")
+    for prop in props:
+        print("%s: %s" % (prop, getattr(dirs, prop)))
+
+    print("\n-- app dirs (without optional 'version')")
+    dirs = AppDirs(appname, appauthor)
+    for prop in props:
+        print("%s: %s" % (prop, getattr(dirs, prop)))
+
+    print("\n-- app dirs (without optional 'appauthor')")
+    dirs = AppDirs(appname)
+    for prop in props:
+        print("%s: %s" % (prop, getattr(dirs, prop)))
+
+    print("\n-- app dirs (with disabled 'appauthor')")
+    dirs = AppDirs(appname, appauthor=False)
+    for prop in props:
+        print("%s: %s" % (prop, getattr(dirs, prop)))
diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/__init__.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..ec9da2e374f39ce26d6c2551ec865a97ba84b93f
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/__init__.py
@@ -0,0 +1,11 @@
+"""CacheControl import Interface.
+
+Make it easy to import from cachecontrol without long namespaces.
+"""
+__author__ = 'Eric Larson'
+__email__ = 'eric@ionrock.org'
+__version__ = '0.11.7'
+
+from .wrapper import CacheControl
+from .adapter import CacheControlAdapter
+from .controller import CacheController
diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/_cmd.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/_cmd.py
new file mode 100644
index 0000000000000000000000000000000000000000..afdcc88c27ed4058b226ac68b97a57c0db117d68
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/_cmd.py
@@ -0,0 +1,60 @@
+import logging
+
+from pip._vendor import requests
+
+from pip._vendor.cachecontrol.adapter import CacheControlAdapter
+from pip._vendor.cachecontrol.cache import DictCache
+from pip._vendor.cachecontrol.controller import logger
+
+from argparse import ArgumentParser
+
+
+def setup_logging():
+    logger.setLevel(logging.DEBUG)
+    handler = logging.StreamHandler()
+    logger.addHandler(handler)
+
+
+def get_session():
+    adapter = CacheControlAdapter(
+        DictCache(),
+        cache_etags=True,
+        serializer=None,
+        heuristic=None,
+    )
+    sess = requests.Session()
+    sess.mount('http://', adapter)
+    sess.mount('https://', adapter)
+
+    sess.cache_controller = adapter.controller
+    return sess
+
+
+def get_args():
+    parser = ArgumentParser()
+    parser.add_argument('url', help='The URL to try and cache')
+    return parser.parse_args()
+
+
+def main(args=None):
+    args = get_args()
+    sess = get_session()
+
+    # Make a request to get a response
+    resp = sess.get(args.url)
+
+    # Turn on logging
+    setup_logging()
+
+    # try setting the cache
+    sess.cache_controller.cache_response(resp.request, resp.raw)
+
+    # Now try to get it
+    if sess.cache_controller.cached_request(resp.request):
+        print('Cached!')
+    else:
+        print('Not cached :(')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/adapter.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/adapter.py
new file mode 100644
index 0000000000000000000000000000000000000000..23488566b1e9650b2fb579cb1bb332e6b8b39fe3
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/adapter.py
@@ -0,0 +1,125 @@
+import types
+import functools
+
+from pip._vendor.requests.adapters import HTTPAdapter
+
+from .controller import CacheController
+from .cache import DictCache
+from .filewrapper import CallbackFileWrapper
+
+
+class CacheControlAdapter(HTTPAdapter):
+    invalidating_methods = set(['PUT', 'DELETE'])
+
+    def __init__(self, cache=None,
+                 cache_etags=True,
+                 controller_class=None,
+                 serializer=None,
+                 heuristic=None,
+                 *args, **kw):
+        super(CacheControlAdapter, self).__init__(*args, **kw)
+        self.cache = cache or DictCache()
+        self.heuristic = heuristic
+
+        controller_factory = controller_class or CacheController
+        self.controller = controller_factory(
+            self.cache,
+            cache_etags=cache_etags,
+            serializer=serializer,
+        )
+
+    def send(self, request, **kw):
+        """
+        Send a request. Use the request information to see if it
+        exists in the cache and cache the response if we need to and can.
+        """
+        if request.method == 'GET':
+            cached_response = self.controller.cached_request(request)
+            if cached_response:
+                return self.build_response(request, cached_response,
+                                           from_cache=True)
+
+            # check for etags and add headers if appropriate
+            request.headers.update(
+                self.controller.conditional_headers(request)
+            )
+
+        resp = super(CacheControlAdapter, self).send(request, **kw)
+
+        return resp
+
+    def build_response(self, request, response, from_cache=False):
+        """
+        Build a response by making a request or using the cache.
+
+        This will end up calling send and returning a potentially
+        cached response
+        """
+        if not from_cache and request.method == 'GET':
+            # Check for any heuristics that might update headers
+            # before trying to cache.
+            if self.heuristic:
+                response = self.heuristic.apply(response)
+
+            # apply any expiration heuristics
+            if response.status == 304:
+                # We must have sent an ETag request. This could mean
+                # that we've been expired already or that we simply
+                # have an etag. In either case, we want to try and
+                # update the cache if that is the case.
+                cached_response = self.controller.update_cached_response(
+                    request, response
+                )
+
+                if cached_response is not response:
+                    from_cache = True
+
+                # We are done with the server response, read a
+                # possible response body (compliant servers will
+                # not return one, but we cannot be 100% sure) and
+                # release the connection back to the pool.
+                response.read(decode_content=False)
+                response.release_conn()
+
+                response = cached_response
+
+            # We always cache the 301 responses
+            elif response.status == 301:
+                self.controller.cache_response(request, response)
+            else:
+                # Wrap the response file with a wrapper that will cache the
+                #   response when the stream has been consumed.
+                response._fp = CallbackFileWrapper(
+                    response._fp,
+                    functools.partial(
+                        self.controller.cache_response,
+                        request,
+                        response,
+                    )
+                )
+                if response.chunked:
+                    super_update_chunk_length = response._update_chunk_length
+
+                    def _update_chunk_length(self):
+                        super_update_chunk_length()
+                        if self.chunk_left == 0:
+                            self._fp._close()
+                    response._update_chunk_length = types.MethodType(_update_chunk_length, response)
+
+        resp = super(CacheControlAdapter, self).build_response(
+            request, response
+        )
+
+        # See if we should invalidate the cache.
+        if request.method in self.invalidating_methods and resp.ok:
+            cache_url = self.controller.cache_url(request.url)
+            self.cache.delete(cache_url)
+
+        # Give the request a from_cache attr to let people use it
+        resp.from_cache = from_cache
+
+        return resp
+
+    def close(self):
+        self.cache.close()
+        super(CacheControlAdapter, self).close()
diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/cache.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/cache.py
new file mode 100644
index 0000000000000000000000000000000000000000..7389a73f8c5dac9ab07b005b115168eb025b735b
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/cache.py
@@ -0,0 +1,39 @@
+"""
+The cache object API for implementing caches. The default is a thread
+safe in-memory dictionary.
+"""
+from threading import Lock
+
+
+class BaseCache(object):
+
+    def get(self, key):
+        raise NotImplemented()
+
+    def set(self, key, value):
+        raise NotImplemented()
+
+    def delete(self, key):
+        raise NotImplemented()
+
+    def close(self):
+        pass
+
+
+class DictCache(BaseCache):
+
+    def __init__(self, init_dict=None):
+        self.lock = Lock()
+        self.data = init_dict or {}
+
+    def get(self, key):
+        return self.data.get(key, None)
+
+    def set(self, key, value):
+        with self.lock:
+            self.data.update({key: value})
+
+    def delete(self, key):
+        with self.lock:
+            if key in self.data:
+                self.data.pop(key)
diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/__init__.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..f9e66a1ff7f15b3d5c6146e02340dd03bb98d87c
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/__init__.py
@@ -0,0 +1,18 @@
+from textwrap import dedent
+
+try:
+    from .file_cache import FileCache
+except ImportError:
+    notice = dedent('''
+    NOTE: In order to use the FileCache you must have
+    lockfile installed. You can install it via pip:
+      pip install lockfile
+    ''')
+    print(notice)
+
+
+try:
+    import redis
+    from .redis_cache import RedisCache
+except ImportError:
+    pass
diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/file_cache.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/file_cache.py
new file mode 100644
index 0000000000000000000000000000000000000000..b77728f0faf1581e742a9f0964f93d51bd2d6d55
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/file_cache.py
@@ -0,0 +1,116 @@
+import hashlib
+import os
+
+from pip._vendor.lockfile import LockFile
+from pip._vendor.lockfile.mkdirlockfile import MkdirLockFile
+
+from ..cache import BaseCache
+from ..controller import CacheController
+
+
+def _secure_open_write(filename, fmode):
+    # We only want to write to this file, so open it in write only mode
+    flags = os.O_WRONLY
+
+    # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only
+    #  will open *new* files.
+    # We specify this because we want to ensure that the mode we pass is the
+    # mode of the file.
+    flags |= os.O_CREAT | os.O_EXCL
+
+    # Do not follow symlinks to prevent someone from making a symlink that
+    # we follow and insecurely open a cache file.
+    if hasattr(os, "O_NOFOLLOW"):
+        flags |= os.O_NOFOLLOW
+
+    # On Windows we'll mark this file as binary
+    if hasattr(os, "O_BINARY"):
+        flags |= os.O_BINARY
+
+    # Before we open our file, we want to delete any existing file that is
+    # there
+    try:
+        os.remove(filename)
+    except (IOError, OSError):
+        # The file must not exist already, so we can just skip ahead to opening
+        pass
+
+    # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a
+    # race condition happens between the os.remove and this line, that an
+    # error will be raised. Because we utilize a lockfile this should only
+    # happen if someone is attempting to attack us.
+    fd = os.open(filename, flags, fmode)
+    try:
+        return os.fdopen(fd, "wb")
+    except:
+        # An error occurred wrapping our FD in a file object
+        os.close(fd)
+        raise
+
+
+class FileCache(BaseCache):
+    def __init__(self, directory, forever=False, filemode=0o0600,
+                 dirmode=0o0700, use_dir_lock=None, lock_class=None):
+
+        if use_dir_lock is not None and lock_class is not None:
+            raise ValueError("Cannot use use_dir_lock and lock_class together")
+
+        if use_dir_lock:
+            lock_class = MkdirLockFile
+
+        if lock_class is None:
+            lock_class = LockFile
+
+        self.directory = directory
+        self.forever = forever
+        self.filemode = filemode
+        self.dirmode = dirmode
+        self.lock_class = lock_class
+
+
+    @staticmethod
+    def encode(x):
+        return hashlib.sha224(x.encode()).hexdigest()
+
+    def _fn(self, name):
+        # NOTE: This method should not change as some may depend on it.
+        #       See: https://github.com/ionrock/cachecontrol/issues/63
+        hashed = self.encode(name)
+        parts = list(hashed[:5]) + [hashed]
+        return os.path.join(self.directory, *parts)
+
+    def get(self, key):
+        name = self._fn(key)
+        if not os.path.exists(name):
+            return None
+
+        with open(name, 'rb') as fh:
+            return fh.read()
+
+    def set(self, key, value):
+        name = self._fn(key)
+
+        # Make sure the directory exists
+        try:
+            os.makedirs(os.path.dirname(name), self.dirmode)
+        except (IOError, OSError):
+            pass
+
+        with self.lock_class(name) as lock:
+            # Write our actual file
+            with _secure_open_write(lock.path, self.filemode) as fh:
+                fh.write(value)
+
+    def delete(self, key):
+        name = self._fn(key)
+        if not self.forever:
+            os.remove(name)
+
+
+def url_to_file_path(url, filecache):
+    """Return the file cache path based on the URL.
+
+    This does not ensure the file exists!
+    """
+    key = CacheController.cache_url(url)
+    return filecache._fn(key)
diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/redis_cache.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/redis_cache.py
new file mode 100644
index 0000000000000000000000000000000000000000..9f5d55fd98c989c17039fcc8024fee3932646b57
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/redis_cache.py
@@ -0,0 +1,41 @@
+from __future__ import division
+
+from datetime import datetime
+
+
+def total_seconds(td):
+    """Python 2.6 compatability"""
+    if hasattr(td, 'total_seconds'):
+        return td.total_seconds()
+
+    ms = td.microseconds
+    secs = (td.seconds + td.days * 24 * 3600)
+    return (ms + secs * 10**6) / 10**6
+
+
+class RedisCache(object):
+
+    def __init__(self, conn):
+        self.conn = conn
+
+    def get(self, key):
+        return self.conn.get(key)
+
+    def set(self, key, value, expires=None):
+        if not expires:
+            self.conn.set(key, value)
+        else:
+            expires = expires - datetime.now()
+            self.conn.setex(key, total_seconds(expires), value)
+
+    def delete(self, key):
+        self.conn.delete(key)
+
+    def clear(self):
+        """Helper for clearing all the keys in a database. Use with
+        caution!"""
+        for key in self.conn.keys():
+            self.conn.delete(key)
+
+    def close(self):
+        self.conn.disconnect()
diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/compat.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/compat.py
new file mode 100644
index 0000000000000000000000000000000000000000..b59f1122a456e3394429e57c70e9e80d2c236607
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/compat.py
@@ -0,0 +1,20 @@
+try:
+    from urllib.parse import urljoin
+except ImportError:
+    from urlparse import urljoin
+
+
+try:
+    import cPickle as pickle
+except ImportError:
+    import pickle
+
+
+from pip._vendor.urllib3.response import HTTPResponse
+from pip._vendor.urllib3.util import is_fp_closed
+
+# Replicate some six behaviour
+try:
+    text_type = (unicode,)
+except NameError:
+    text_type = (str,)
diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/controller.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/controller.py
new file mode 100644
index 0000000000000000000000000000000000000000..5eb961f85bab3dc4a237c8635d56d202d4499d04
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/controller.py
@@ -0,0 +1,353 @@
+"""
+The httplib2 algorithms ported for use with requests.
+"""
+import logging
+import re
+import calendar
+import time
+from email.utils import parsedate_tz
+
+from pip._vendor.requests.structures import CaseInsensitiveDict
+
+from .cache import DictCache
+from .serialize import Serializer
+
+
+logger = logging.getLogger(__name__)
+
+URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?")
+
+
+def parse_uri(uri):
+    """Parses a URI using the regex given in Appendix B of RFC 3986.
+
+        (scheme, authority, path, query, fragment) = parse_uri(uri)
+    """
+    groups = URI.match(uri).groups()
+    return (groups[1], groups[3], groups[4], groups[6], groups[8])
+
+
+class CacheController(object):
+    """An interface to see if request should cached or not.
+    """
+    def __init__(self, cache=None, cache_etags=True, serializer=None):
+        self.cache = cache or DictCache()
+        self.cache_etags = cache_etags
+        self.serializer = serializer or Serializer()
+
+    @classmethod
+    def _urlnorm(cls, uri):
+        """Normalize the URL to create a safe key for the cache"""
+        (scheme, authority, path, query, fragment) = parse_uri(uri)
+        if not scheme or not authority:
+            raise Exception("Only absolute URIs are allowed. uri = %s" % uri)
+
+        scheme = scheme.lower()
+        authority = authority.lower()
+
+        if not path:
+            path = "/"
+
+        # Could do syntax based normalization of the URI before
+        # computing the digest. See Section 6.2.2 of Std 66.
+        request_uri = query and "?".join([path, query]) or path
+        defrag_uri = scheme + "://" + authority + request_uri
+
+        return defrag_uri
+
+    @classmethod
+    def cache_url(cls, uri):
+        return cls._urlnorm(uri)
+
+    def parse_cache_control(self, headers):
+        """
+        Parse the cache control headers returning a dictionary with values
+        for the different directives.
+        """
+        retval = {}
+
+        cc_header = 'cache-control'
+        if 'Cache-Control' in headers:
+            cc_header = 'Cache-Control'
+
+        if cc_header in headers:
+            parts = headers[cc_header].split(',')
+            parts_with_args = [
+                tuple([x.strip().lower() for x in part.split("=", 1)])
+                for part in parts if -1 != part.find("=")
+            ]
+            parts_wo_args = [
+                (name.strip().lower(), 1)
+                for name in parts if -1 == name.find("=")
+            ]
+            retval = dict(parts_with_args + parts_wo_args)
+        return retval
+
+    def cached_request(self, request):
+        """
+        Return a cached response if it exists in the cache, otherwise
+        return False.
+        """
+        cache_url = self.cache_url(request.url)
+        logger.debug('Looking up "%s" in the cache', cache_url)
+        cc = self.parse_cache_control(request.headers)
+
+        # Bail out if the request insists on fresh data
+        if 'no-cache' in cc:
+            logger.debug('Request header has "no-cache", cache bypassed')
+            return False
+
+        if 'max-age' in cc and cc['max-age'] == 0:
+            logger.debug('Request header has "max_age" as 0, cache bypassed')
+            return False
+
+        # Request allows serving from the cache, let's see if we find something
+        cache_data = self.cache.get(cache_url)
+        if cache_data is None:
+            logger.debug('No cache entry available')
+            return False
+
+        # Check whether it can be deserialized
+        resp = self.serializer.loads(request, cache_data)
+        if not resp:
+            logger.warning('Cache entry deserialization failed, entry ignored')
+            return False
+
+        # If we have a cached 301, return it immediately. We don't
+        # need to test our response for other headers b/c it is
+        # intrinsically "cacheable" as it is Permanent.
+        # See:
+        #   https://tools.ietf.org/html/rfc7231#section-6.4.2
+        #
+        # Client can try to refresh the value by repeating the request
+        # with cache busting headers as usual (ie no-cache).
+        if resp.status == 301:
+            msg = ('Returning cached "301 Moved Permanently" response '
+                   '(ignoring date and etag information)')
+            logger.debug(msg)
+            return resp
+
+        headers = CaseInsensitiveDict(resp.headers)
+        if not headers or 'date' not in headers:
+            if 'etag' not in headers:
+                # Without date or etag, the cached response can never be used
+                # and should be deleted.
+                logger.debug('Purging cached response: no date or etag')
+                self.cache.delete(cache_url)
+            logger.debug('Ignoring cached response: no date')
+            return False
+
+        now = time.time()
+        date = calendar.timegm(
+            parsedate_tz(headers['date'])
+        )
+        current_age = max(0, now - date)
+        logger.debug('Current age based on date: %i', current_age)
+
+        # TODO: There is an assumption that the result will be a
+        #       urllib3 response object. This may not be best since we
+        #       could probably avoid instantiating or constructing the
+        #       response until we know we need it.
+        resp_cc = self.parse_cache_control(headers)
+
+        # determine freshness
+        freshness_lifetime = 0
+
+        # Check the max-age pragma in the cache control header
+        if 'max-age' in resp_cc and resp_cc['max-age'].isdigit():
+            freshness_lifetime = int(resp_cc['max-age'])
+            logger.debug('Freshness lifetime from max-age: %i',
+                         freshness_lifetime)
+
+        # If there isn't a max-age, check for an expires header
+        elif 'expires' in headers:
+            expires = parsedate_tz(headers['expires'])
+            if expires is not None:
+                expire_time = calendar.timegm(expires) - date
+                freshness_lifetime = max(0, expire_time)
+                logger.debug("Freshness lifetime from expires: %i",
+                             freshness_lifetime)
+
+        # Determine if we are setting freshness limit in the
+        # request. Note, this overrides what was in the response.
+        if 'max-age' in cc:
+            try:
+                freshness_lifetime = int(cc['max-age'])
+                logger.debug('Freshness lifetime from request max-age: %i',
+                             freshness_lifetime)
+            except ValueError:
+                freshness_lifetime = 0
+
+        if 'min-fresh' in cc:
+            try:
+                min_fresh = int(cc['min-fresh'])
+            except ValueError:
+                min_fresh = 0
+            # adjust our current age by our min fresh
+            current_age += min_fresh
+            logger.debug('Adjusted current age from min-fresh: %i',
+                         current_age)
+
+        # Return entry if it is fresh enough
+        if freshness_lifetime > current_age:
+            logger.debug('The response is "fresh", returning cached response')
+            logger.debug('%i > %i', freshness_lifetime, current_age)
+            return resp
+
+        # we're not fresh. If we don't have an Etag, clear it out
+        if 'etag' not in headers:
+            logger.debug(
+                'The cached response is "stale" with no etag, purging'
+            )
+            self.cache.delete(cache_url)
+
+        # return the original handler
+        return False
+
+    def conditional_headers(self, request):
+        cache_url = self.cache_url(request.url)
+        resp = self.serializer.loads(request, self.cache.get(cache_url))
+        new_headers = {}
+
+        if resp:
+            headers = CaseInsensitiveDict(resp.headers)
+
+            if 'etag' in headers:
+                new_headers['If-None-Match'] = headers['ETag']
+
+            if 'last-modified' in headers:
+                new_headers['If-Modified-Since'] = headers['Last-Modified']
+
+        return new_headers
+
+    def cache_response(self, request, response, body=None):
+        """
+        Algorithm for caching requests.
+
+        This assumes a requests Response object.
+        """
+        # From httplib2: Don't cache 206's since we aren't going to
+        #                handle byte range requests
+        cacheable_status_codes = [200, 203, 300, 301]
+        if response.status not in cacheable_status_codes:
+            logger.debug(
+                'Status code %s not in %s',
+                response.status,
+                cacheable_status_codes
+            )
+            return
+
+        response_headers = CaseInsensitiveDict(response.headers)
+
+        # If we've been given a body, our response has a Content-Length, that
+        # Content-Length is valid then we can check to see if the body we've
+        # been given matches the expected size, and if it doesn't we'll just
+        # skip trying to cache it.
+        if (body is not None and
+                "content-length" in response_headers and
+                response_headers["content-length"].isdigit() and
+                int(response_headers["content-length"]) != len(body)):
+            return
+
+        cc_req = self.parse_cache_control(request.headers)
+        cc = self.parse_cache_control(response_headers)
+
+        cache_url = self.cache_url(request.url)
+        logger.debug('Updating cache with response from "%s"', cache_url)
+
+        # Delete it from the cache if we happen to have it stored there
+        no_store = False
+        if cc.get('no-store'):
+            no_store = True
+            logger.debug('Response header has "no-store"')
+        if cc_req.get('no-store'):
+            no_store = True
+            logger.debug('Request header has "no-store"')
+        if no_store and self.cache.get(cache_url):
+            logger.debug('Purging existing cache entry to honor "no-store"')
+            self.cache.delete(cache_url)
+
+        # If we've been given an etag, then keep the response
+        if self.cache_etags and 'etag' in response_headers:
+            logger.debug('Caching due to etag')
+            self.cache.set(
+                cache_url,
+                self.serializer.dumps(request, response, body=body),
+            )
+
+        # Add to the cache any 301s. We do this before looking that
+        # the Date headers.
+        elif response.status == 301:
+            logger.debug('Caching permanant redirect')
+            self.cache.set(
+                cache_url,
+                self.serializer.dumps(request, response)
+            )
+
+        # Add to the cache if the response headers demand it. If there
+        # is no date header then we can't do anything about expiring
+        # the cache.
+        elif 'date' in response_headers:
+            # cache when there is a max-age > 0
+            if cc and cc.get('max-age'):
+                if cc['max-age'].isdigit() and int(cc['max-age']) > 0:
+                    logger.debug('Caching b/c date exists and max-age > 0')
+                    self.cache.set(
+                        cache_url,
+                        self.serializer.dumps(request, response, body=body),
+                    )
+
+            # If the request can expire, it means we should cache it
+            # in the meantime.
+            elif 'expires' in response_headers:
+                if response_headers['expires']:
+                    logger.debug('Caching b/c of expires header')
+                    self.cache.set(
+                        cache_url,
+                        self.serializer.dumps(request, response, body=body),
+                    )
+
+    def update_cached_response(self, request, response):
+        """On a 304 we will get a new set of headers that we want to
+        update our cached value with, assuming we have one.
+
+        This should only ever be called when we've sent an ETag and
+        gotten a 304 as the response.
+        """
+        cache_url = self.cache_url(request.url)
+
+        cached_response = self.serializer.loads(
+            request,
+            self.cache.get(cache_url)
+        )
+
+        if not cached_response:
+            # we didn't have a cached response
+            return response
+
+        # Lets update our headers with the headers from the new request:
+        # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1
+        #
+        # The server isn't supposed to send headers that would make
+        # the cached body invalid. But... just in case, we'll be sure
+        # to strip out ones we know that might be problmatic due to
+        # typical assumptions.
+        excluded_headers = [
+            "content-length",
+        ]
+
+        cached_response.headers.update(
+            dict((k, v) for k, v in response.headers.items()
+                 if k.lower() not in excluded_headers)
+        )
+
+        # we want a 200 b/c we have content via the cache
+        cached_response.status = 200
+
+        # update our cache
+        self.cache.set(
+            cache_url,
+            self.serializer.dumps(request, cached_response),
+        )
+
+        return cached_response
diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/filewrapper.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/filewrapper.py
new file mode 100644
index 0000000000000000000000000000000000000000..f1e1ce05598cf301c855bf1a00a66bbdabcea404
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/filewrapper.py
@@ -0,0 +1,78 @@
+from io import BytesIO
+
+
+class CallbackFileWrapper(object):
+    """
+    Small wrapper around a fp object which will tee everything read into a
+    buffer, and when that file is closed it will execute a callback with the
+    contents of that buffer.
+
+    All attributes are proxied to the underlying file object.
+
+    This class uses members with a double underscore (__) leading prefix so as
+    not to accidentally shadow an attribute.
+    """
+
+    def __init__(self, fp, callback):
+        self.__buf = BytesIO()
+        self.__fp = fp
+        self.__callback = callback
+
+    def __getattr__(self, name):
+        # The vaguaries of garbage collection means that self.__fp is
+        # not always set.  By using __getattribute__ and the private
+        # name[0] allows looking up the attribute value and raising an
+        # AttributeError when it doesn't exist. This stop thigns from
+        # infinitely recursing calls to getattr in the case where
+        # self.__fp hasn't been set.
+        #
+        # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers
+        fp = self.__getattribute__('_CallbackFileWrapper__fp')
+        return getattr(fp, name)
+
+    def __is_fp_closed(self):
+        try:
+            return self.__fp.fp is None
+        except AttributeError:
+            pass
+
+        try:
+            return self.__fp.closed
+        except AttributeError:
+            pass
+
+        # We just don't cache it then.
+        # TODO: Add some logging here...
+        return False
+
+    def _close(self):
+        if self.__callback:
+            self.__callback(self.__buf.getvalue())
+
+        # We assign this to None here, because otherwise we can get into
+        # really tricky problems where the CPython interpreter dead locks
+        # because the callback is holding a reference to something which
+        # has a __del__ method. Setting this to None breaks the cycle
+        # and allows the garbage collector to do it's thing normally.
+        self.__callback = None
+
+    def read(self, amt=None):
+        data = self.__fp.read(amt)
+        self.__buf.write(data)
+        if self.__is_fp_closed():
+            self._close()
+
+        return data
+
+    def _safe_read(self, amt):
+        data = self.__fp._safe_read(amt)
+        if amt == 2 and data == b'\r\n':
+            # urllib executes this read to toss the CRLF at the end
+            # of the chunk.
+            return data
+
+        self.__buf.write(data)
+        if self.__is_fp_closed():
+            self._close()
+
+        return data
diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/heuristics.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/heuristics.py
new file mode 100644
index 0000000000000000000000000000000000000000..94715a4e7e3865792275c806d22931868953a5a2
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/heuristics.py
@@ -0,0 +1,138 @@
+import calendar
+import time
+
+from email.utils import formatdate, parsedate, parsedate_tz
+
+from datetime import datetime, timedelta
+
+TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT"
+
+
+def expire_after(delta, date=None):
+    date = date or datetime.now()
+    return date + delta
+
+
+def datetime_to_header(dt):
+    return formatdate(calendar.timegm(dt.timetuple()))
+
+
+class BaseHeuristic(object):
+
+    def warning(self, response):
+        """
+        Return a valid 1xx warning header value describing the cache
+        adjustments.
+
+        The response is provided too allow warnings like 113
+        http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need
+        to explicitly say response is over 24 hours old.
+        """
+        return '110 - "Response is Stale"'
+
+    def update_headers(self, response):
+        """Update the response headers with any new headers.
+
+        NOTE: This SHOULD always include some Warning header to
+              signify that the response was cached by the client, not
+              by way of the provided headers.
+        """
+        return {}
+
+    def apply(self, response):
+        updated_headers = self.update_headers(response)
+
+        if updated_headers:
+            response.headers.update(updated_headers)
+            warning_header_value = self.warning(response)
+            if warning_header_value is not None:
+                response.headers.update({'Warning': warning_header_value})
+
+        return response
+
+
+class OneDayCache(BaseHeuristic):
+    """
+    Cache the response by providing an expires 1 day in the
+    future.
+    """
+    def update_headers(self, response):
+        headers = {}
+
+        if 'expires' not in response.headers:
+            date = parsedate(response.headers['date'])
+            expires = expire_after(timedelta(days=1),
+                                   date=datetime(*date[:6]))
+            headers['expires'] = datetime_to_header(expires)
+            headers['cache-control'] = 'public'
+        return headers
+
+
+class ExpiresAfter(BaseHeuristic):
+    """
+    Cache **all** requests for a defined time period.
+    """
+
+    def __init__(self, **kw):
+        self.delta = timedelta(**kw)
+
+    def update_headers(self, response):
+        expires = expire_after(self.delta)
+        return {
+            'expires': datetime_to_header(expires),
+            'cache-control': 'public',
+        }
+
+    def warning(self, response):
+        tmpl = '110 - Automatically cached for %s. Response might be stale'
+        return tmpl % self.delta
+
+
+class LastModified(BaseHeuristic):
+    """
+    If there is no Expires header already, fall back on Last-Modified
+    using the heuristic from
+    http://tools.ietf.org/html/rfc7234#section-4.2.2
+    to calculate a reasonable value.
+
+    Firefox also does something like this per
+    https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ
+    http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397
+    Unlike mozilla we limit this to 24-hr.
+    """
+    cacheable_by_default_statuses = set([
+        200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501
+    ])
+
+    def update_headers(self, resp):
+        headers = resp.headers
+
+        if 'expires' in headers:
+            return {}
+
+        if 'cache-control' in headers and headers['cache-control'] != 'public':
+            return {}
+
+        if resp.status not in self.cacheable_by_default_statuses:
+            return {}
+
+        if 'date' not in headers or 'last-modified' not in headers:
+            return {}
+
+        date = calendar.timegm(parsedate_tz(headers['date']))
+        last_modified = parsedate(headers['last-modified'])
+        if date is None or last_modified is None:
+            return {}
+
+        now = time.time()
+        current_age = max(0, now - date)
+        delta = date - calendar.timegm(last_modified)
+        freshness_lifetime = max(0, min(delta / 10, 24 * 3600))
+        if freshness_lifetime <= current_age:
+            return {}
+
+        expires = date + freshness_lifetime
+        return {'expires': time.strftime(TIME_FMT, time.gmtime(expires))}
+
+    def warning(self, resp):
+        return None
diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/serialize.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/serialize.py
new file mode 100644
index 0000000000000000000000000000000000000000..8f9c589f252091687b586a6be9837303ea8d9a6a
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/serialize.py
@@ -0,0 +1,196 @@
+import base64
+import io
+import json
+import zlib
+
+from pip._vendor.requests.structures import CaseInsensitiveDict
+
+from .compat import HTTPResponse, pickle, text_type
+
+
+def _b64_encode_bytes(b):
+    return base64.b64encode(b).decode("ascii")
+
+
+def _b64_encode_str(s):
+    return _b64_encode_bytes(s.encode("utf8"))
+
+
+def _b64_encode(s):
+    if isinstance(s, text_type):
+        return _b64_encode_str(s)
+    return _b64_encode_bytes(s)
+
+
+def _b64_decode_bytes(b):
+    return base64.b64decode(b.encode("ascii"))
+
+
+def _b64_decode_str(s):
+    return _b64_decode_bytes(s).decode("utf8")
+
+
+class Serializer(object):
+
+    def dumps(self, request, response, body=None):
+        response_headers = CaseInsensitiveDict(response.headers)
+
+        if body is None:
+            body = response.read(decode_content=False)
+
+            # NOTE: 99% sure this is dead code. I'm only leaving it
+            #       here b/c I don't have a test yet to prove
+            #       it. Basically, before using
+            #       `cachecontrol.filewrapper.CallbackFileWrapper`,
+            #       this made an effort to reset the file handle. The
+            #       `CallbackFileWrapper` short circuits this code by
+            #       setting the body as the content is consumed, the
+            #       result being a `body` argument is *always* passed
+            #       into cache_response, and in turn,
+            #       `Serializer.dump`.
+            response._fp = io.BytesIO(body)
+
+        data = {
+            "response": {
+                "body": _b64_encode_bytes(body),
+                "headers": dict(
+                    (_b64_encode(k), _b64_encode(v))
+                    for k, v in response.headers.items()
+                ),
+                "status": response.status,
+                "version": response.version,
+                "reason": _b64_encode_str(response.reason),
+                "strict": response.strict,
+                "decode_content": response.decode_content,
+            },
+        }
+
+        # Construct our vary headers
+        data["vary"] = {}
+        if "vary" in response_headers:
+            varied_headers = response_headers['vary'].split(',')
+            for header in varied_headers:
+                header = header.strip()
+                data["vary"][header] = request.headers.get(header, None)
+
+        # Encode our Vary headers to ensure they can be serialized as JSON
+        data["vary"] = dict(
+            (_b64_encode(k), _b64_encode(v) if v is not None else v)
+            for k, v in data["vary"].items()
+        )
+
+        return b",".join([
+            b"cc=2",
+            zlib.compress(
+                json.dumps(
+                    data, separators=(",", ":"), sort_keys=True,
+                ).encode("utf8"),
+            ),
+        ])
+
+    def loads(self, request, data):
+        # Short circuit if we've been given an empty set of data
+        if not data:
+            return
+
+        # Determine what version of the serializer the data was serialized
+        # with
+        try:
+            ver, data = data.split(b",", 1)
+        except ValueError:
+            ver = b"cc=0"
+
+        # Make sure that our "ver" is actually a version and isn't a false
+        # positive from a , being in the data stream.
+        if ver[:3] != b"cc=":
+            data = ver + data
+            ver = b"cc=0"
+
+        # Get the version number out of the cc=N
+        ver = ver.split(b"=", 1)[-1].decode("ascii")
+
+        # Dispatch to the actual load method for the given version
+        try:
+            return getattr(self, "_loads_v{0}".format(ver))(request, data)
+        except AttributeError:
+            # This is a version we don't have a loads function for, so we'll
+            # just treat it as a miss and return None
+            return
+
+    def prepare_response(self, request, cached):
+        """Verify our vary headers match and construct a real urllib3
+        HTTPResponse object.
+        """
+        # Special case the '*' Vary value as it means we cannot actually
+        # determine if the cached response is suitable for this request.
+        if "*" in cached.get("vary", {}):
+            return
+
+        # Ensure that the Vary headers for the cached response match our
+        # request
+        for header, value in cached.get("vary", {}).items():
+            if request.headers.get(header, None) != value:
+                return
+
+        body_raw = cached["response"].pop("body")
+
+        headers = CaseInsensitiveDict(data=cached['response']['headers'])
+        if headers.get('transfer-encoding', '') == 'chunked':
+            headers.pop('transfer-encoding')
+
+        cached['response']['headers'] = headers
+
+        try:
+            body = io.BytesIO(body_raw)
+        except TypeError:
+            # This can happen if cachecontrol serialized to v1 format (pickle)
+            # using Python 2. A Python 2 str(byte string) will be unpickled as
+            # a Python 3 str (unicode string), which will cause the above to
+            # fail with:
+            #
+            #     TypeError: 'str' does not support the buffer interface
+            body = io.BytesIO(body_raw.encode('utf8'))
+
+        return HTTPResponse(
+            body=body,
+            preload_content=False,
+            **cached["response"]
+        )
+
+    def _loads_v0(self, request, data):
+        # The original legacy cache data. This doesn't contain enough
+        # information to construct everything we need, so we'll treat this as
+        # a miss.
+        return
+
+    def _loads_v1(self, request, data):
+        try:
+            cached = pickle.loads(data)
+        except ValueError:
+            return
+
+        return self.prepare_response(request, cached)
+
+    def _loads_v2(self, request, data):
+        try:
+            cached = json.loads(zlib.decompress(data).decode("utf8"))
+        except ValueError:
+            return
+
+        # We need to decode the items that we've base64 encoded
+        cached["response"]["body"] = _b64_decode_bytes(
+            cached["response"]["body"]
+        )
+        cached["response"]["headers"] = dict(
+            (_b64_decode_str(k), _b64_decode_str(v))
+            for k, v in cached["response"]["headers"].items()
+        )
+        cached["response"]["reason"] = _b64_decode_str(
+            cached["response"]["reason"],
+        )
+        cached["vary"] = dict(
+            (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v)
+            for k, v in cached["vary"].items()
+        )
+
+        return self.prepare_response(request, cached)
diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/wrapper.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/wrapper.py
new file mode 100644
index 0000000000000000000000000000000000000000..ea421aa7e712b3950fc30dff914b5240b747ce21
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/wrapper.py
@@ -0,0 +1,21 @@
+from .adapter import CacheControlAdapter
+from .cache import DictCache
+
+
+def CacheControl(sess,
+                 cache=None,
+                 cache_etags=True,
+                 serializer=None,
+                 heuristic=None):
+
+    cache = cache or DictCache()
+    adapter = CacheControlAdapter(
+        cache,
+        cache_etags=cache_etags,
+        serializer=serializer,
+        heuristic=heuristic,
+    )
+    sess.mount('http://', adapter)
+    sess.mount('https://', adapter)
+
+    return sess
diff --git a/vendor/pip-9.0.3/pip/_vendor/certifi/__init__.py b/vendor/pip-9.0.3/pip/_vendor/certifi/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..556193cefbf1f8b9b65cab70f394e28481af1fea
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/certifi/__init__.py
@@ -0,0 +1,3 @@
+from .core import where, old_where
+
+__version__ = "2018.01.18"
diff --git a/vendor/pip-9.0.3/pip/_vendor/certifi/__main__.py b/vendor/pip-9.0.3/pip/_vendor/certifi/__main__.py
new file mode 100644
index 0000000000000000000000000000000000000000..5f1da0dd0c201e8aedc1552ef82a1780eb37276d
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/certifi/__main__.py
@@ -0,0 +1,2 @@
+from certifi import where
+print(where())
diff --git a/vendor/pip-9.0.3/pip/_vendor/certifi/cacert.pem b/vendor/pip-9.0.3/pip/_vendor/certifi/cacert.pem
new file mode 100644
index 0000000000000000000000000000000000000000..101ac98fa42d9eb4b27836e122cc81d495e33c21
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/certifi/cacert.pem
@@ -0,0 +1,4433 @@
+
+# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
+# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
+# Label: "GlobalSign Root CA"
+# Serial: 4835703278459707669005204
+# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a
+# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c
+# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
+A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
+b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
+MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
+YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
+aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
+jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
+xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
+1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
+snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
+U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
+9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
+AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
+yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
+38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
+AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
+DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
+HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
+# Label: "GlobalSign Root CA - R2"
+# Serial: 4835703278459682885658125
+# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30
+# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe
+# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
+MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
+v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
+eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
+tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
+C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
+zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
+mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
+V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
+bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
+3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
+J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
+291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
+ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
+AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Label: "Verisign Class 3 Public Primary Certification Authority - G3"
+# Serial: 206684696279472310254277870180966723415
+# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09
+# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6
+# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
+N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
+KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
+kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
+CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
+Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
+imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
+2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
+DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
+F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
+TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Label: "Entrust.net Premium 2048 Secure Server CA"
+# Serial: 946069240
+# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90
+# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31
+# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
+RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
+IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
+MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
+LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
+YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
+A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
+K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
+sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
+MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
+XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
+HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
+4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
+HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
+j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
+U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
+zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
+u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
+bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
+fF6adulZkMV8gzURZVE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
+# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
+# Label: "Baltimore CyberTrust Root"
+# Serial: 33554617
+# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4
+# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74
+# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
+DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
+ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
+VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
+mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
+IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
+mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
+XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
+dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
+jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
+BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
+DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
+9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
+jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
+Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
+ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
+R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
+# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
+# Label: "AddTrust External Root"
+# Serial: 1
+# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f
+# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68
+# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
+IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
+MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
+bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
+dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
+H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
+uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
+mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
+a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
+E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
+WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
+VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
+Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
+cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
+IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
+AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
+YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
+Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
+c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
+mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
+# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
+# Label: "Entrust Root Certification Authority"
+# Serial: 1164660820
+# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4
+# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9
+# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
+Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
+KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
+NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
+NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
+ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
+BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
+Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
+4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
+KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
+rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
+94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
+sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
+gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
+kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
+vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
+O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
+AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
+9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
+eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
+0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc.
+# Subject: CN=GeoTrust Global CA O=GeoTrust Inc.
+# Label: "GeoTrust Global CA"
+# Serial: 144470
+# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5
+# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12
+# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
+R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
+9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
+fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
+iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
+1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
+MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
+ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
+uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
+Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
+tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
+PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
+hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
+5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc.
+# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc.
+# Label: "GeoTrust Universal CA"
+# Serial: 1
+# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48
+# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79
+# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0
+IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV
+VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8
+cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT
+QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh
+F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v
+c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w
+mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd
+VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX
+teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ
+f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe
+Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+
+nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB
+/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY
+MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
+9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX
+IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn
+ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z
+uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN
+Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja
+QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW
+koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9
+ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt
+DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm
+bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
+# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
+# Label: "GeoTrust Universal CA 2"
+# Serial: 1
+# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7
+# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79
+# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD
+VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1
+c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81
+WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG
+FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq
+XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL
+se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb
+KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd
+IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73
+y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt
+hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc
+QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4
+Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV
+HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ
+KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ
+L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr
+Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo
+ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY
+T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz
+GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m
+1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV
+OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH
+6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX
+QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+
+# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association
+# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association
+# Label: "Visa eCommerce Root"
+# Serial: 25952180776285836048024890241505565794
+# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02
+# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62
+# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22
+-----BEGIN CERTIFICATE-----
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr
+MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl
+cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
+bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw
+CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h
+dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l
+cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h
+2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E
+lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV
+ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq
+299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t
+vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL
+dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
+AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF
+AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR
+zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3
+LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd
+7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw
+++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
+398znM/jra6O1I7mT1GvFpLgXPYHDw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=AAA Certificate Services O=Comodo CA Limited
+# Subject: CN=AAA Certificate Services O=Comodo CA Limited
+# Label: "Comodo AAA Services root"
+# Serial: 1
+# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0
+# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49
+# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
+YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
+GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
+BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
+3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
+YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
+rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
+ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
+oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
+QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
+b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
+AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
+GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
+G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
+l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
+smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
+# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
+# Label: "QuoVadis Root CA"
+# Serial: 985026699
+# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24
+# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9
+# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC
+TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz
+MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw
+IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR
+dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp
+li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D
+rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ
+WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug
+F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU
+xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC
+Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv
+dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw
+ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl
+IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh
+c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy
+ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI
+KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T
+KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq
+y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p
+dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD
+VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL
+MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk
+fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8
+7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R
+cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y
+mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW
+xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK
+SnQ2+Q==
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 2"
+# Serial: 1289
+# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b
+# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7
+# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
+GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
+b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV
+BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
+YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa
+GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg
+Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J
+WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB
+rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp
++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1
+ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i
+Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz
+PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og
+/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH
+oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI
+yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud
+EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2
+A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL
+MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f
+BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn
+g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl
+fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K
+WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha
+B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc
+hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR
+TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD
+mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z
+ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y
+4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza
+8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 3"
+# Serial: 1478
+# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf
+# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85
+# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
+GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
+b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV
+BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
+YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM
+V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB
+4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr
+H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd
+8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv
+vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT
+mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe
+btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc
+T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt
+WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ
+c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A
+4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD
+VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG
+CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0
+aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu
+dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw
+czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G
+A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC
+TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg
+Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0
+7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem
+d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd
++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B
+4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN
+t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x
+DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57
+k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s
+zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j
+Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT
+mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK
+4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+
+# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1
+# Subject: O=SECOM Trust.net OU=Security Communication RootCA1
+# Label: "Security Communication Root CA"
+# Serial: 0
+# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a
+# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7
+# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY
+MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t
+dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5
+WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD
+VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8
+9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ
+DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9
+Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N
+QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ
+xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G
+A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T
+AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG
+kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr
+Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5
+Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU
+JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot
+RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Sonera Class2 CA O=Sonera
+# Subject: CN=Sonera Class2 CA O=Sonera
+# Label: "Sonera Class 2 Root CA"
+# Serial: 29
+# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb
+# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27
+# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP
+MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx
+MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV
+BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o
+Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt
+5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s
+3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej
+vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu
+8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw
+DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG
+MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil
+zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/
+3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD
+FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6
+Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2
+ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M
+-----END CERTIFICATE-----
+
+# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
+# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
+# Label: "XRamp Global CA Root"
+# Serial: 107108908803651509692980124233745014957
+# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1
+# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6
+# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
+gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
+MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
+UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
+NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
+dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
+dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
+38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
+KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
+DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
+qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
+JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
+PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
+BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
+jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
+eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
+vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
+IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
+i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
+O+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
+# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
+# Label: "Go Daddy Class 2 CA"
+# Serial: 0
+# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67
+# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4
+# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
+MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
+YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
+MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
+ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
+MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
+ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
+PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
+wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
+EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
+avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
+sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
+/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
+IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
+ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
+OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
+TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
+dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
+ReYNnyicsbkqWletNw+vHX/bvZ8=
+-----END CERTIFICATE-----
+
+# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
+# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
+# Label: "Starfield Class 2 CA"
+# Serial: 0
+# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24
+# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a
+# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
+MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
+U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
+NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
+ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
+ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
+DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
+8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
+X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
+K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
+1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
+A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
+zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
+YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
+bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
+DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
+L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
+eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
+VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
+WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+# Issuer: O=Government Root Certification Authority
+# Subject: O=Government Root Certification Authority
+# Label: "Taiwan GRCA"
+# Serial: 42023070807708724159991140556527066870
+# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e
+# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9
+# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/
+MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow
+PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
+AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR
+IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q
+gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy
+yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts
+F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2
+jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx
+ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC
+VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK
+YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH
+EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN
+Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud
+DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE
+MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK
+UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf
+qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK
+ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE
+JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7
+hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1
+EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm
+nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX
+udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz
+ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe
+LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl
+pYYsfPQS
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Assured ID Root CA"
+# Serial: 17154717934120587862167794914071425081
+# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72
+# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43
+# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
+b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
+cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
+JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
+mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
+VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
+AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
+AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
+BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
+pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
+dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
+fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
+NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
+H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Global Root CA"
+# Serial: 10944719598952040374951832963794454346
+# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e
+# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36
+# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
+CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
+nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
+43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
+T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
+gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
+TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
+DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
+hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
+06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
+PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
+YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert High Assurance EV Root CA"
+# Serial: 3553400076410547919724730734378100087
+# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a
+# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25
+# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
+ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
+LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
+RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
+PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
+xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
+Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
+hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
+EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
+FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
+nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
+eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
+hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
+Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
++OkuE6N36B9K
+-----END CERTIFICATE-----
+
+# Issuer: CN=Class 2 Primary CA O=Certplus
+# Subject: CN=Class 2 Primary CA O=Certplus
+# Label: "Certplus Class 2 Primary CA"
+# Serial: 177770208045934040241468760488327595043
+# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b
+# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb
+# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw
+PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz
+cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9
+MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz
+IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ
+ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR
+VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL
+kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd
+EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas
+H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0
+HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud
+DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4
+QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu
+Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/
+AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8
+yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR
+FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA
+ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB
+kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
+l7+ijrRU
+-----END CERTIFICATE-----
+
+# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co.
+# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co.
+# Label: "DST Root CA X3"
+# Serial: 91299735575339953335919266965803778155
+# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5
+# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13
+# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
+MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
+DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
+PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
+Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
+rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
+OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
+xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
+7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
+aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
+SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
+ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
+AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
+R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
+JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
+Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+
+# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG
+# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG
+# Label: "SwissSign Gold CA - G2"
+# Serial: 13492815561806991280
+# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93
+# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61
+# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
+BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln
+biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF
+MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT
+d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
+CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8
+76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+
+bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c
+6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE
+emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd
+MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt
+MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y
+MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y
+FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi
+aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM
+gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB
+qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7
+lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn
+8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6
+45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO
+UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5
+O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC
+bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv
+GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a
+77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC
+hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3
+92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp
+Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w
+ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt
+Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+
+# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG
+# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG
+# Label: "SwissSign Silver CA - G2"
+# Serial: 5700383053117599563
+# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13
+# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb
+# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5
+-----BEGIN CERTIFICATE-----
+MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE
+BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu
+IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow
+RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY
+U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv
+Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br
+YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF
+nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH
+6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt
+eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/
+c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ
+MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH
+HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf
+jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6
+5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB
+rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU
+F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c
+wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
+cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB
+AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp
+WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9
+xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ
+2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ
+IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8
+aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X
+em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR
+dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/
+OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+
+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy
+tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
+# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
+# Label: "GeoTrust Primary Certification Authority"
+# Serial: 32798226551256963324313806436981982369
+# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf
+# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96
+# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
+MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
+R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
+MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
+AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
+ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
+7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
+kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
+mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
+KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
+6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
+4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
+oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
+UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
+AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA"
+# Serial: 69529181992039203566298953787712940909
+# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12
+# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81
+# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
+qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
+BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
+NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
+LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
+A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
+W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
+3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
+6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
+Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
+NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
+r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
+DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
+YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
+/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
+LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
+jVaMaA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Class 3 Public Primary Certification Authority - G5"
+# Serial: 33037644167568058970164719475676101450
+# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c
+# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5
+# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
+ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
+nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
+t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
+SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
+BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
+rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
+NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
+BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
+BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
+MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
+p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
+5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
+WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
+4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
+hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+
+# Issuer: CN=SecureTrust CA O=SecureTrust Corporation
+# Subject: CN=SecureTrust CA O=SecureTrust Corporation
+# Label: "SecureTrust CA"
+# Serial: 17199774589125277788362757014266862032
+# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1
+# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11
+# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
+FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz
+MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv
+cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz
+Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO
+0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao
+wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj
+7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS
+8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT
+BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg
+JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC
+NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
+6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/
+3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm
+D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS
+CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Secure Global CA O=SecureTrust Corporation
+# Subject: CN=Secure Global CA O=SecureTrust Corporation
+# Label: "Secure Global CA"
+# Serial: 9751836167731051554232119481456978597
+# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de
+# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b
+# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
+GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx
+MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg
+Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ
+iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa
+/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ
+jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI
+HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7
+sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w
+gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw
+KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG
+AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
+URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO
+H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm
+I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
+iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO Certification Authority O=COMODO CA Limited
+# Label: "COMODO Certification Authority"
+# Serial: 104350513648249232941998508985834464573
+# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75
+# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b
+# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
+gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
+BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
+MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
+YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
+RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
+UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
+2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
+Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
+nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
+/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
+PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
+QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
+SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
+IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
+zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
+BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
+ZQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
+# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
+# Label: "Network Solutions Certificate Authority"
+# Serial: 116697915152937497490437556386812487904
+# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e
+# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce
+# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
+MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
+dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
+UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
+ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
+c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
+OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
+mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
+BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
+qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
+gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
+bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
+dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
+6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
+h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
+/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
+pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited
+# Label: "COMODO ECC Certification Authority"
+# Serial: 41578283867086692638256921589707938090
+# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23
+# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11
+# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
+IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
+MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
+ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
+T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
+FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
+cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
+BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
+fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
+GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed
+# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed
+# Label: "OISTE WISeKey Global Root GA CA"
+# Serial: 86718877871133159090080555911823548314
+# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93
+# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9
+# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB
+ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly
+aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
+ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w
+NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G
+A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD
+VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX
+SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR
+VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2
+w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF
+mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg
+4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9
+4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw
+EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx
+SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2
+ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8
+vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi
+Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ
+/L7fCg0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certigna O=Dhimyotis
+# Subject: CN=Certigna O=Dhimyotis
+# Label: "Certigna"
+# Serial: 18364802974209362175
+# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff
+# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97
+# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV
+BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X
+DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ
+BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4
+QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny
+gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw
+zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q
+130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2
+JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw
+ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT
+AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj
+AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG
+9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h
+bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc
+fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu
+HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w
+t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center
+# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center
+# Label: "Deutsche Telekom Root CA 2"
+# Serial: 38
+# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08
+# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf
+# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc
+MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj
+IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB
+IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE
+RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl
+U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290
+IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU
+ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC
+QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr
+rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S
+NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc
+QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH
+txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP
+BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
+AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp
+tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa
+IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl
+6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+
+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
+Cm26OWMohpLzGITY+9HPBVZkVw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc
+# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc
+# Label: "Cybertrust Global Root"
+# Serial: 4835703278459682877484360
+# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1
+# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6
+# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG
+A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh
+bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE
+ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS
+b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5
+7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS
+J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y
+HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP
+t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz
+FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY
+XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
+MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw
+hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js
+MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA
+A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj
+Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx
+XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o
+omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc
+A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
+# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
+# Label: "ePKI Root Certification Authority"
+# Serial: 28956088682735189655030529057352760477
+# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3
+# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0
+# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe
+MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0
+ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw
+IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL
+SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH
+SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh
+ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X
+DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1
+TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ
+fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA
+sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU
+WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS
+nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH
+dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip
+NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC
+AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF
+MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB
+uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl
+PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP
+JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/
+gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2
+j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6
+5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB
+o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS
+/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z
+Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE
+W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D
+hNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+# Issuer: O=certSIGN OU=certSIGN ROOT CA
+# Subject: O=certSIGN OU=certSIGN ROOT CA
+# Label: "certSIGN ROOT CA"
+# Serial: 35210227249154
+# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17
+# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b
+# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT
+AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD
+QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP
+MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do
+0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ
+UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d
+RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ
+OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv
+JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C
+AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O
+BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ
+LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY
+MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ
+44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I
+Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw
+i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN
+9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
+# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
+# Label: "GeoTrust Primary Certification Authority - G3"
+# Serial: 28809105769928564313984085209975885599
+# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05
+# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd
+# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
+mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
+MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
+BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
+BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
+hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
+5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
+JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
+DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
+huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
+HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
+AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
+zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
+kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
+SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
+spki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA - G2"
+# Serial: 71758320672825410020661621085256472406
+# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f
+# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12
+# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
+IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
+BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
+MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
+YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
+dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
+BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
+papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
+DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
+KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
+XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA - G3"
+# Serial: 127614157056681299805556476275995414779
+# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31
+# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2
+# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
+rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
+BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
+Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
+LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
+MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
+ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
+gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
+YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
+b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
+9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
+zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
+OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
+HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
+2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
+oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
+KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
+m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
+MdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
+# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
+# Label: "GeoTrust Primary Certification Authority - G2"
+# Serial: 80682863203381065782177908751794619243
+# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a
+# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0
+# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
+MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
+KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
+MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
+NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
+BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
+MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
+So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
+tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
+CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
+qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
+rD6ogRLQy7rQkgu2npaqBA+K
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Universal Root Certification Authority"
+# Serial: 85209574734084581917763752644031726877
+# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19
+# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54
+# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB
+vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
+ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX
+MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
+IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y
+IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh
+bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF
+9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH
+H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H
+LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN
+/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT
+rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw
+WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs
+exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4
+sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+
+seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz
+4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+
+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR
+lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3
+7M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Class 3 Public Primary Certification Authority - G4"
+# Serial: 63143484348153506665311985501458640051
+# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41
+# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a
+# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp
+U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg
+SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln
+biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm
+GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve
+fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ
+aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj
+aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW
+kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC
+4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga
+FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services)
+# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services)
+# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny"
+# Serial: 80544274841616
+# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88
+# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91
+# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG
+EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3
+MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl
+cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR
+dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB
+pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM
+b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm
+aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz
+IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT
+lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz
+AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5
+VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG
+ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2
+BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG
+AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M
+U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh
+bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C
++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F
+uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2
+XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
+# Label: "Staat der Nederlanden Root CA - G2"
+# Serial: 10000012
+# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a
+# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16
+# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f
+-----BEGIN CERTIFICATE-----
+MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX
+DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
+ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
+b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291
+qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp
+uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU
+Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE
+pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp
+5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M
+UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN
+GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy
+5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv
+6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK
+eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6
+B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/
+BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov
+L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG
+SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS
+CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen
+5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897
+IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK
+gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL
++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL
+vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm
+bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk
+N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC
+Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z
+ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post
+# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post
+# Label: "Hongkong Post Root CA 1"
+# Serial: 1000
+# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca
+# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58
+# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2
+-----BEGIN CERTIFICATE-----
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx
+FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg
+Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG
+A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr
+b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ
+jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn
+PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh
+ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9
+nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h
+q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED
+MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC
+mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3
+7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB
+oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs
+EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO
+fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi
+AmvZWg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
+# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
+# Label: "SecureSign RootCA11"
+# Serial: 1
+# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26
+# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3
+# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr
+MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG
+A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0
+MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp
+Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD
+QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz
+i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8
+h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV
+MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9
+UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni
+8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC
+h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD
+VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB
+AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm
+KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ
+X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr
+QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5
+pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN
+QSdJQO7e5iNEOdyhIta6A/I=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
+# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
+# Label: "Microsec e-Szigno Root CA 2009"
+# Serial: 14014712776195784473
+# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1
+# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e
+# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD
+VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0
+ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G
+CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y
+OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx
+FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp
+Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP
+kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc
+cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U
+fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7
+N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC
+xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1
++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM
+Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG
+SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h
+mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk
+ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c
+2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t
+HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
+# Label: "GlobalSign Root CA - R3"
+# Serial: 4835703278459759426209954
+# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28
+# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad
+# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
+MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
+RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
+gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
+KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
+QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
+XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
+DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
+LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
+RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
+jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
+6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
+mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
+Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
+WD9f
+-----END CERTIFICATE-----
+
+# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
+# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
+# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068"
+# Serial: 6047274297262753887
+# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3
+# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa
+# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE
+BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h
+cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy
+MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg
+Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9
+thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM
+cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG
+L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i
+NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h
+X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b
+m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy
+Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja
+EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T
+KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF
+6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh
+OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD
+VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv
+ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl
+AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF
+661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9
+am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1
+ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481
+PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS
+3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k
+SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF
+3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM
+ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g
+StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz
+Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB
+jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
+-----END CERTIFICATE-----
+
+# Issuer: CN=Izenpe.com O=IZENPE S.A.
+# Subject: CN=Izenpe.com O=IZENPE S.A.
+# Label: "Izenpe.com"
+# Serial: 917563065490389241595536686991402621
+# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73
+# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19
+# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f
+-----BEGIN CERTIFICATE-----
+MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4
+MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6
+ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD
+VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j
+b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq
+scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO
+xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H
+LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX
+uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD
+yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+
+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q
+rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN
+BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L
+hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB
+QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+
+HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu
+Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg
+QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB
+BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
+MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA
+A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb
+laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56
+awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo
+JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw
+LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT
+VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk
+LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb
+UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/
+QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+
+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls
+QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
+# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
+# Label: "Chambers of Commerce Root - 2008"
+# Serial: 11806822484801597146
+# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7
+# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c
+# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0
+-----BEGIN CERTIFICATE-----
+MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD
+VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
+IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
+MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz
+IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz
+MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj
+dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw
+EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp
+MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9
+28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq
+VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q
+DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR
+5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL
+ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a
+Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl
+UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s
++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5
+Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
+ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx
+hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV
+HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1
++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN
+YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t
+L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy
+ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt
+IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV
+HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w
+DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW
+PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF
+5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1
+glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH
+FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2
+pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD
+xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG
+tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq
+jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De
+fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
+OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ
+d0jQ
+-----END CERTIFICATE-----
+
+# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
+# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
+# Label: "Global Chambersign Root - 2008"
+# Serial: 14541511773111788494
+# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3
+# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c
+# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca
+-----BEGIN CERTIFICATE-----
+MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD
+VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
+IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
+MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
+aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx
+MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy
+cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG
+A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl
+BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI
+hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed
+KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7
+G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2
+zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4
+ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG
+HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2
+Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V
+yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e
+beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r
+6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
+wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog
+zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW
+BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr
+ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp
+ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk
+cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt
+YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC
+CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow
+KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI
+hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ
+UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz
+X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x
+fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz
+a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd
+Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd
+SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O
+AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso
+M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge
+v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
+09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
+-----END CERTIFICATE-----
+
+# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
+# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
+# Label: "Go Daddy Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01
+# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b
+# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
+EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
+ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
+NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
+EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
+AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
+E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
+/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
+DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
+GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
+tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
+AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
+FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
+WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
+9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
+gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
+2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
+4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Label: "Starfield Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96
+# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e
+# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
+ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
+MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
+aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
+Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
+nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
+HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
+Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
+dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
+HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
+CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
+sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
+4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
+8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
+mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Label: "Starfield Services Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2
+# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f
+# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
+ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
+VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
+ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
+dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
+OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
+8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
+Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
+hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
+6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
+DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
+AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
+bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
+ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
+qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
+0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
+sSi6
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Commercial O=AffirmTrust
+# Subject: CN=AffirmTrust Commercial O=AffirmTrust
+# Label: "AffirmTrust Commercial"
+# Serial: 8608355977964138876
+# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7
+# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7
+# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
+Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
+ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
+MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
+yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
+VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
+nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
+XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
+vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
+Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
+N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
+nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Networking O=AffirmTrust
+# Subject: CN=AffirmTrust Networking O=AffirmTrust
+# Label: "AffirmTrust Networking"
+# Serial: 8957382827206547757
+# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f
+# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f
+# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
+YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
+kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
+QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
+6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
+yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
+QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
+tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
+QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
+Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
+olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
+x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Premium O=AffirmTrust
+# Subject: CN=AffirmTrust Premium O=AffirmTrust
+# Label: "AffirmTrust Premium"
+# Serial: 7893706540734352110
+# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57
+# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27
+# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
+dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
+A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
+cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
+qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
+JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
+s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
+HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
+70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
+V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
+qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
+5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
+C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
+OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
+FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
+KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
+8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
+MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
+0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
+u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
+u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
+YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
+GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
+RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
+KeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust
+# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust
+# Label: "AffirmTrust Premium ECC"
+# Serial: 8401224907861490260
+# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d
+# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb
+# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
+VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
+cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
+BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
+VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
+0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
+ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
+A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
+aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
+flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Label: "Certum Trusted Network CA"
+# Serial: 279744
+# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78
+# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e
+# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM
+MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D
+ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU
+cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3
+WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg
+Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw
+IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH
+UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM
+TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU
+BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM
+kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x
+AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV
+HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y
+sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL
+I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8
+J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY
+VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
+# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
+# Label: "TWCA Root Certification Authority"
+# Serial: 1
+# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79
+# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48
+# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES
+MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU
+V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz
+WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO
+LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE
+AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH
+K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX
+RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z
+rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx
+3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq
+hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC
+MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls
+XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D
+lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn
+aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ
+YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+
+# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
+# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
+# Label: "Security Communication RootCA2"
+# Serial: 0
+# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43
+# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74
+# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl
+MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe
+U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX
+DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy
+dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj
+YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV
+OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr
+zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM
+VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ
+hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO
+ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw
+awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs
+OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
+DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF
+coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc
+okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8
+t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy
+1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/
+SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
+# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
+# Label: "Hellenic Academic and Research Institutions RootCA 2011"
+# Serial: 0
+# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9
+# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d
+# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71
+-----BEGIN CERTIFICATE-----
+MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix
+RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
+dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p
+YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw
+NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK
+EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl
+cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
+c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz
+dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ
+fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns
+bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD
+75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP
+FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV
+HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp
+5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu
+b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA
+A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p
+6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
+TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7
+dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys
+Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI
+l7WdmplNsDz4SgCbZN2fOUvRJ9e4
+-----END CERTIFICATE-----
+
+# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
+# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
+# Label: "Actalis Authentication Root CA"
+# Serial: 6271844772424770508
+# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6
+# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac
+# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66
+-----BEGIN CERTIFICATE-----
+MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE
+BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w
+MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
+IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC
+SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1
+ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv
+UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX
+4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9
+KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/
+gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb
+rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ
+51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F
+be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe
+KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F
+v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn
+fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7
+jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz
+ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
+ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL
+e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70
+jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz
+WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V
+SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j
+pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX
+X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok
+fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R
+K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU
+ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU
+LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT
+LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
+-----END CERTIFICATE-----
+
+# Issuer: O=Trustis Limited OU=Trustis FPS Root CA
+# Subject: O=Trustis Limited OU=Trustis FPS Root CA
+# Label: "Trustis FPS Root CA"
+# Serial: 36053640375399034304724988975563710553
+# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d
+# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04
+# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d
+-----BEGIN CERTIFICATE-----
+MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF
+MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL
+ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx
+MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc
+MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+
+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH
+iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj
+vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA
+0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB
+OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/
+BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E
+FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01
+GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW
+zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4
+1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE
+f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F
+jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN
+ZetX2fNXlrtIzYE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
+# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
+# Label: "Buypass Class 2 Root CA"
+# Serial: 2
+# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29
+# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99
+# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
+Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow
+TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
+HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr
+6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV
+L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91
+1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx
+MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ
+QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB
+arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr
+Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi
+FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS
+P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN
+9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP
+AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz
+uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h
+9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
+A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t
+OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo
++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7
+KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2
+DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us
+H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ
+I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7
+5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h
+3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz
+Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
+# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
+# Label: "Buypass Class 3 Root CA"
+# Serial: 2
+# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec
+# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57
+# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
+Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow
+TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
+HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y
+ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E
+N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9
+tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX
+0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c
+/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X
+KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY
+zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS
+O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D
+34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP
+K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3
+AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv
+Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj
+QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
+cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS
+IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2
+HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa
+O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv
+033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u
+dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE
+kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41
+3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD
+u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq
+4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc=
+-----END CERTIFICATE-----
+
+# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Label: "T-TeleSec GlobalRoot Class 3"
+# Serial: 1
+# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef
+# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1
+# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
+KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
+BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
+YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1
+OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
+aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
+ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN
+8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/
+RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4
+hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5
+ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM
+EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1
+A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy
+WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ
+1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30
+6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT
+91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
+e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p
+TpPDpFQUWw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus
+# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus
+# Label: "EE Certification Centre Root CA"
+# Serial: 112324828676200291871926431888494945866
+# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f
+# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7
+# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76
+-----BEGIN CERTIFICATE-----
+MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1
+MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1
+czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG
+CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy
+MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl
+ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS
+b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy
+euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO
+bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw
+WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d
+MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE
+1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/
+zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB
+BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF
+BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV
+v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG
+E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
+uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW
+iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v
+GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
+# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
+# Label: "D-TRUST Root Class 3 CA 2 2009"
+# Serial: 623603
+# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f
+# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0
+# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1
+-----BEGIN CERTIFICATE-----
+MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF
+MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD
+bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha
+ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM
+HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03
+UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42
+tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R
+ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM
+lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp
+/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G
+A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G
+A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj
+dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy
+MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl
+cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js
+L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL
+BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni
+acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
+o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K
+zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8
+PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y
+Johw1+qRzT65ysCQblrGXnRl11z+o+I=
+-----END CERTIFICATE-----
+
+# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
+# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
+# Label: "D-TRUST Root Class 3 CA 2 EV 2009"
+# Serial: 623604
+# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6
+# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83
+# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF
+MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD
+bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw
+NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV
+BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn
+ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0
+3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z
+qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR
+p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8
+HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw
+ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea
+HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw
+Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh
+c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E
+RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt
+dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku
+Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp
+3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
+nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF
+CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na
+xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX
+KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1
+-----END CERTIFICATE-----
+
+# Issuer: CN=CA Disig Root R2 O=Disig a.s.
+# Subject: CN=CA Disig Root R2 O=Disig a.s.
+# Label: "CA Disig Root R2"
+# Serial: 10572350602393338211
+# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03
+# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71
+# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV
+BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu
+MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy
+MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx
+EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw
+ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe
+NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH
+PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I
+x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe
+QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR
+yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO
+QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912
+H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ
+QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD
+i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs
+nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1
+rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI
+hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
+tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf
+GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb
+lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka
++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal
+TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i
+nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3
+gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr
+G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os
+zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x
+L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL
+-----END CERTIFICATE-----
+
+# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
+# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
+# Label: "ACCVRAIZ1"
+# Serial: 6828503384748696800
+# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02
+# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17
+# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13
+-----BEGIN CERTIFICATE-----
+MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE
+AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw
+CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ
+BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND
+VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb
+qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY
+HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo
+G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA
+lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr
+IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/
+0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH
+k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47
+4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO
+m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa
+cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl
+uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI
+KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls
+ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG
+AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
+VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT
+VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG
+CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA
+cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA
+QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA
+7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA
+cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA
+QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA
+czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu
+aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt
+aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud
+DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF
+BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp
+D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU
+JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m
+AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD
+vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms
+tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH
+7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
+I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA
+h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF
+d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H
+pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7
+-----END CERTIFICATE-----
+
+# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
+# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
+# Label: "TWCA Global Root CA"
+# Serial: 3262
+# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96
+# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65
+# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx
+EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT
+VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5
+NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT
+B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF
+10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz
+0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh
+MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH
+zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc
+46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2
+yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi
+laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP
+oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA
+BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE
+qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm
+4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL
+1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
+LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF
+H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo
+RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+
+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh
+15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW
+6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW
+nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j
+wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz
+aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy
+KwbQBM0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera
+# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera
+# Label: "TeliaSonera Root CA v1"
+# Serial: 199041966741090107964904287217786801558
+# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c
+# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37
+# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89
+-----BEGIN CERTIFICATE-----
+MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw
+NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv
+b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD
+VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2
+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F
+VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1
+7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X
+Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+
+/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs
+81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm
+dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe
+Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu
+sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4
+pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs
+slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ
+arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD
+VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG
+9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl
+dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
+0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj
+TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed
+Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7
+Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI
+OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7
+vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW
+t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn
+HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx
+SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi
+# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi
+# Label: "E-Tugra Certification Authority"
+# Serial: 7667447206703254355
+# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49
+# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39
+# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c
+-----BEGIN CERTIFICATE-----
+MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV
+BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC
+aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV
+BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1
+Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz
+MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+
+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp
+em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
+ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY
+B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH
+D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF
+Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo
+q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D
+k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH
+fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut
+dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM
+ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8
+zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
+rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX
+U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6
+Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5
+XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF
+Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR
+HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY
+GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c
+77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3
++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK
+vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6
+FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl
+yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P
+AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD
+y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d
+NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Label: "T-TeleSec GlobalRoot Class 2"
+# Serial: 1
+# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a
+# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9
+# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
+KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
+BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
+YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1
+OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
+aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
+ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd
+AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC
+FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi
+1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq
+jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ
+wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/
+WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy
+NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC
+uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw
+IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6
+g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
+9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP
+BSeOE6Fuwg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Atos TrustedRoot 2011 O=Atos
+# Subject: CN=Atos TrustedRoot 2011 O=Atos
+# Label: "Atos TrustedRoot 2011"
+# Serial: 6643877497813316402
+# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56
+# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21
+# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE
+AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG
+EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM
+FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC
+REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp
+Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM
+VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+
+SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ
+4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L
+cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi
+eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV
+HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG
+A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3
+DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j
+vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP
+DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc
+maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D
+lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv
+KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 1 G3"
+# Serial: 687049649626669250736271037606554624078720034195
+# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab
+# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67
+# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00
+MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV
+wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe
+rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341
+68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh
+4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp
+UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o
+abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc
+3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G
+KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt
+hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO
+Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt
+zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD
+ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
+MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2
+cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN
+qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5
+YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv
+b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2
+8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k
+NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj
+ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp
+q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt
+nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 2 G3"
+# Serial: 390156079458959257446133169266079962026824725800
+# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06
+# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36
+# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00
+MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf
+qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW
+n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym
+c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+
+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1
+o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j
+IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq
+IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz
+8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh
+vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l
+7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG
+cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD
+ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
+AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC
+roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga
+W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n
+lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE
++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV
+csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd
+dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg
+KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM
+HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4
+WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 3 G3"
+# Serial: 268090761170461462463995952157327242137089239581
+# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7
+# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d
+# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00
+MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR
+/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu
+FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR
+U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c
+ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR
+FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k
+A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw
+eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl
+sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp
+VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q
+A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+
+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD
+ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
+KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI
+FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv
+oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg
+u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP
+0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf
+3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl
+8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+
+DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN
+PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/
+ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Assured ID Root G2"
+# Serial: 15385348160840213938643033620894905419
+# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d
+# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f
+# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85
+-----BEGIN CERTIFICATE-----
+MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
+b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
+cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA
+n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc
+biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp
+EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA
+bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu
+YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB
+AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW
+BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI
+QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I
+0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni
+lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9
+B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv
+ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
+IhNzbM8m9Yop5w==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Assured ID Root G3"
+# Serial: 15459312981008553731928384953135426796
+# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb
+# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89
+# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2
+-----BEGIN CERTIFICATE-----
+MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw
+CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
+ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg
+RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
+Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf
+Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q
+RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD
+AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY
+JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv
+6pZjamVFkpUBtA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Global Root G2"
+# Serial: 4293743540046975378534879503202253541
+# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44
+# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4
+# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f
+-----BEGIN CERTIFICATE-----
+MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
+MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
+2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
+1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
+q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
+tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
+vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
+5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
+1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
+NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
+Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
+8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
+pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
+MrY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Global Root G3"
+# Serial: 7089244469030293291760083333884364146
+# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca
+# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e
+# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0
+-----BEGIN CERTIFICATE-----
+MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw
+CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
+ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe
+Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw
+EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
+IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF
+K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG
+fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO
+Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd
+BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx
+AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/
+oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8
+sycX
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Trusted Root G4"
+# Serial: 7451500558977370777930084869016614236
+# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49
+# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4
+# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88
+-----BEGIN CERTIFICATE-----
+MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg
+RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
+Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y
+ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If
+xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV
+ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO
+DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ
+jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/
+CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi
+EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM
+fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY
+uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK
+chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t
+9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
+ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2
+SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd
++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc
+fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa
+sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N
+cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N
+0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie
+4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI
+r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1
+/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm
+gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited
+# Label: "COMODO RSA Certification Authority"
+# Serial: 101909084537582093308941363524873193117
+# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18
+# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4
+# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34
+-----BEGIN CERTIFICATE-----
+MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB
+hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
+BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5
+MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
+EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR
+6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X
+pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC
+9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV
+/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf
+Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z
++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w
+qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah
+SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC
+u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf
+Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq
+crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
+FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB
+/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl
+wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM
+4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV
+2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna
+FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ
+CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK
+boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke
+jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL
+S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb
+QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl
+0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB
+NVOFBkpdn627G190
+-----END CERTIFICATE-----
+
+# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
+# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
+# Label: "USERTrust RSA Certification Authority"
+# Serial: 2645093764781058787591871645665788717
+# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5
+# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e
+# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2
+-----BEGIN CERTIFICATE-----
+MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
+MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
+BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
+dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
+3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
+tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
+Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
+VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
+79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
+c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
+Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
+c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
+UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
+Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
+BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
+Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
+VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
+ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
+8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
+iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
+Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
+XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
+qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
+VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
+L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
+jjxDah2nGN59PRbxYvnKkKj9
+-----END CERTIFICATE-----
+
+# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
+# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
+# Label: "USERTrust ECC Certification Authority"
+# Serial: 123013823720199481456569720443997572134
+# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1
+# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0
+# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a
+-----BEGIN CERTIFICATE-----
+MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl
+eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT
+JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx
+MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
+Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg
+VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo
+I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng
+o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G
+A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB
+zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW
+RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
+# Label: "GlobalSign ECC Root CA - R4"
+# Serial: 14367148294922964480859022125800977897474
+# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e
+# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb
+# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c
+-----BEGIN CERTIFICATE-----
+MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk
+MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH
+bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
+DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
+QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
+MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ
+FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw
+DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F
+uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX
+kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs
+ewv4n4Q=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
+# Label: "GlobalSign ECC Root CA - R5"
+# Serial: 32785792099990507226680698011560947931244
+# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08
+# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa
+# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24
+-----BEGIN CERTIFICATE-----
+MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk
+MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH
+bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
+DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
+QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
+MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc
+8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke
+hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI
+KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg
+515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO
+xwy8p2Fp8fc74SrL+SvzZpA3
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden
+# Label: "Staat der Nederlanden Root CA - G3"
+# Serial: 10003001
+# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37
+# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc
+# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28
+-----BEGIN CERTIFICATE-----
+MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX
+DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
+ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
+b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP
+cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW
+IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX
+xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy
+KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR
+9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az
+5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8
+6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7
+Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP
+bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt
+BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt
+XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF
+MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd
+INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
+U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp
+LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8
+Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp
+gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh
+/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw
+0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A
+fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq
+4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR
+1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/
+QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM
+94B7IWcnMFk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden
+# Label: "Staat der Nederlanden EV Root CA"
+# Serial: 10000013
+# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba
+# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb
+# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a
+-----BEGIN CERTIFICATE-----
+MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y
+MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg
+TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS
+b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS
+M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC
+UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d
+Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p
+rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l
+pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb
+j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC
+KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS
+/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X
+cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH
+1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP
+px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7
+MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
+eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u
+2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS
+v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC
+wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy
+CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e
+vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6
+Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa
+Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL
+eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8
+FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc
+7uzXLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
+# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
+# Label: "IdenTrust Commercial Root CA 1"
+# Serial: 13298821034946342390520003877796839426
+# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7
+# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25
+# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK
+MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu
+VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw
+MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw
+JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT
+3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU
++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp
+S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1
+bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi
+T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL
+vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK
+Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK
+dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT
+c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv
+l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N
+iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD
+ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
+6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt
+LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93
+nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3
++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK
+W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT
+AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq
+l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG
+4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ
+mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A
+7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H
+-----END CERTIFICATE-----
+
+# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust
+# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust
+# Label: "IdenTrust Public Sector Root CA 1"
+# Serial: 13298821034946342390521976156843933698
+# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba
+# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd
+# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f
+-----BEGIN CERTIFICATE-----
+MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN
+MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu
+VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN
+MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0
+MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7
+ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy
+RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS
+bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF
+/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R
+3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw
+EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy
+9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V
+GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ
+2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV
+WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD
+W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN
+AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
+t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV
+DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9
+TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G
+lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW
+mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df
+WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5
++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ
+tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA
+GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv
+8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
+# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
+# Label: "Entrust Root Certification Authority - G2"
+# Serial: 1246989352
+# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2
+# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4
+# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39
+-----BEGIN CERTIFICATE-----
+MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
+cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
+IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
+dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
+NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
+dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
+dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
+aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
+RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
+cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
+wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
+U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
+jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
+BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
+jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
+Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
+1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
+nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
+VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
+# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
+# Label: "Entrust Root Certification Authority - EC1"
+# Serial: 51543124481930649114116133369
+# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc
+# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47
+# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5
+-----BEGIN CERTIFICATE-----
+MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG
+A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3
+d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu
+dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq
+RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy
+MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD
+VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
+L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g
+Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi
+A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt
+ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH
+Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
+BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC
+R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX
+hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
+-----END CERTIFICATE-----
+
+# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority
+# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority
+# Label: "CFCA EV ROOT"
+# Serial: 407555286
+# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30
+# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83
+# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD
+TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx
+MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j
+aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP
+T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03
+sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL
+TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5
+/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp
+7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz
+EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt
+hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP
+a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot
+aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg
+TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV
+PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv
+cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL
+tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd
+BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
+ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT
+ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL
+jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS
+ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy
+P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19
+xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d
+Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN
+5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe
+/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z
+AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ
+5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
+-----END CERTIFICATE-----
+
+# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e.
+# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e.
+# Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5"
+# Serial: 156233699172481
+# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e
+# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb
+# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78
+-----BEGIN CERTIFICATE-----
+MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE
+BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn
+aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg
+QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg
+SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0
+MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD
+VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8
+dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom
+/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR
+Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3
+4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z
+5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0
+hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID
+AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX
+SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l
+VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
+URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf
+peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF
+Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW
++qtB4Uu2NQvAmxU=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903
+# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903
+# Label: "Certinomis - Root CA"
+# Serial: 1
+# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f
+# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8
+# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58
+-----BEGIN CERTIFICATE-----
+MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET
+MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb
+BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz
+MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx
+FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g
+Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2
+fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl
+LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV
+WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF
+TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb
+5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc
+CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri
+wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ
+wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG
+m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4
+F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng
+WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0
+2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF
+AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/
+0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw
+F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS
+g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj
+qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN
+h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/
+ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V
+btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj
+Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ
+8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW
+gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed
+# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed
+# Label: "OISTE WISeKey Global Root GB CA"
+# Serial: 157768595616588414422159278966750757568
+# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d
+# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed
+# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt
+MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg
+Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i
+YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x
+CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG
+b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
+bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3
+HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx
+WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX
+1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk
+u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P
+99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r
+M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB
+BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh
+cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5
+gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO
+ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf
+aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
+Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
+-----END CERTIFICATE-----
+
+# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A.
+# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A.
+# Label: "SZAFIR ROOT CA2"
+# Serial: 357043034767186914217277344587386743377558296292
+# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99
+# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de
+# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe
+-----BEGIN CERTIFICATE-----
+MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL
+BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6
+ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw
+NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L
+cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg
+Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN
+QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT
+3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw
+3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6
+3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5
+BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN
+XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
+AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF
+AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw
+8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG
+nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP
+oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy
+d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg
+LvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Label: "Certum Trusted Network CA 2"
+# Serial: 44979900017204383099463764357512596969
+# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2
+# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92
+# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04
+-----BEGIN CERTIFICATE-----
+MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB
+gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
+QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG
+A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz
+OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ
+VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3
+b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA
+DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn
+0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB
+OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE
+fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E
+Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m
+o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i
+sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW
+OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez
+Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS
+adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n
+3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ
+F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf
+CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29
+XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm
+djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/
+WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb
+AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq
+P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko
+b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj
+XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P
+5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi
+DrW5viSP
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
+# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
+# Label: "Hellenic Academic and Research Institutions RootCA 2015"
+# Serial: 0
+# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce
+# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6
+# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36
+-----BEGIN CERTIFICATE-----
+MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix
+DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k
+IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT
+N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v
+dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG
+A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh
+ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx
+QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
+dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA
+4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0
+AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10
+4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C
+ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV
+9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD
+gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6
+Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq
+NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko
+LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
+Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd
+ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I
+XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI
+M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot
+9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V
+Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea
+j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh
+X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ
+l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf
+bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4
+pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK
+e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0
+vm9qp/UsQu0yrbYhnr68
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
+# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
+# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015"
+# Serial: 0
+# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef
+# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66
+# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33
+-----BEGIN CERTIFICATE-----
+MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN
+BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
+c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl
+bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv
+b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ
+BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj
+YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5
+MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0
+dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg
+QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa
+jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi
+C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep
+lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof
+TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certplus Root CA G1 O=Certplus
+# Subject: CN=Certplus Root CA G1 O=Certplus
+# Label: "Certplus Root CA G1"
+# Serial: 1491911565779898356709731176965615564637713
+# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42
+# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66
+# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA
+MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy
+dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa
+MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy
+dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
+ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a
+iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt
+6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP
+0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f
+6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE
+EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN
+1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc
+h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT
+mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV
+4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO
+WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud
+DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd
+Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq
+hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh
+66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7
+/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS
+S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j
+2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R
+Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr
+RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy
+6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV
+V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5
+g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl
+++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certplus Root CA G2 O=Certplus
+# Subject: CN=Certplus Root CA G2 O=Certplus
+# Label: "Certplus Root CA G2"
+# Serial: 1492087096131536844209563509228951875861589
+# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31
+# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a
+# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17
+-----BEGIN CERTIFICATE-----
+MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x
+CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs
+dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x
+CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs
+dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat
+93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x
+Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P
+AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj
+FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG
+SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch
+p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal
+U5ORGpOucGpnutee5WEaXw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust
+# Subject: CN=OpenTrust Root CA G1 O=OpenTrust
+# Label: "OpenTrust Root CA G1"
+# Serial: 1492036577811947013770400127034825178844775
+# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da
+# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e
+# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4
+-----BEGIN CERTIFICATE-----
+MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA
+MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w
+ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw
+MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU
+T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b
+wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX
+/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0
+77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP
+uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx
+p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx
+Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2
+TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W
+G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw
+vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY
+EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1
+2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw
+DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E
+PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf
+gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS
+FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0
+V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P
+XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I
+i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t
+TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91
+09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky
+Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ
+AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj
+1oxx
+-----END CERTIFICATE-----
+
+# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust
+# Subject: CN=OpenTrust Root CA G2 O=OpenTrust
+# Label: "OpenTrust Root CA G2"
+# Serial: 1492012448042702096986875987676935573415441
+# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb
+# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b
+# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2
+-----BEGIN CERTIFICATE-----
+MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA
+MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w
+ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw
+MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU
+T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh
+/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e
+CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6
+1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE
+FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS
+gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X
+G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy
+YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH
+vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4
+t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/
+gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3
+5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w
+DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz
+Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0
+nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT
+RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT
+wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2
+t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa
+TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2
+o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU
+3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA
+iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f
+WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM
+S1IK
+-----END CERTIFICATE-----
+
+# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust
+# Subject: CN=OpenTrust Root CA G3 O=OpenTrust
+# Label: "OpenTrust Root CA G3"
+# Serial: 1492104908271485653071219941864171170455615
+# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24
+# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6
+# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92
+-----BEGIN CERTIFICATE-----
+MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx
+CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U
+cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow
+QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl
+blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm
+3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d
+oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G
+A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5
+DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK
+BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q
+j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx
+4nxp5V2a+EEfOzmTk51V6s2N8fvB
+-----END CERTIFICATE-----
+
+# Issuer: CN=ISRG Root X1 O=Internet Security Research Group
+# Subject: CN=ISRG Root X1 O=Internet Security Research Group
+# Label: "ISRG Root X1"
+# Serial: 172886928669790476064670243504169061120
+# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e
+# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8
+# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
+-----END CERTIFICATE-----
+
+# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM
+# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM
+# Label: "AC RAIZ FNMT-RCM"
+# Serial: 485876308206448804701554682760554759
+# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d
+# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20
+# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx
+CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ
+WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ
+BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG
+Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/
+yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf
+BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz
+WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF
+tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z
+374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC
+IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL
+mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7
+wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS
+MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2
+ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet
+UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H
+YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3
+LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
+nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1
+RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM
+LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf
+77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N
+JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm
+fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp
+6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp
+1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B
+9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok
+RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv
+uu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Amazon Root CA 1 O=Amazon
+# Subject: CN=Amazon Root CA 1 O=Amazon
+# Label: "Amazon Root CA 1"
+# Serial: 143266978916655856878034712317230054538369994
+# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6
+# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16
+# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e
+-----BEGIN CERTIFICATE-----
+MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
+ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
+b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
+MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
+b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
+ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
+9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
+IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
+VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
+93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
+jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
+A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
+U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
+N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
+o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
+5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
+rqXRfboQnoZsG4q5WTP468SQvvG5
+-----END CERTIFICATE-----
+
+# Issuer: CN=Amazon Root CA 2 O=Amazon
+# Subject: CN=Amazon Root CA 2 O=Amazon
+# Label: "Amazon Root CA 2"
+# Serial: 143266982885963551818349160658925006970653239
+# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66
+# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a
+# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF
+ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
+b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL
+MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
+b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK
+gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ
+W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg
+1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K
+8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r
+2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me
+z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR
+8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj
+mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz
+7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6
++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI
+0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB
+Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm
+UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2
+LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS
+k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl
+7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm
+btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl
+urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+
+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63
+n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE
+76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H
+9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT
+4PsJYGw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Amazon Root CA 3 O=Amazon
+# Subject: CN=Amazon Root CA 3 O=Amazon
+# Label: "Amazon Root CA 3"
+# Serial: 143266986699090766294700635381230934788665930
+# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87
+# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e
+# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4
+-----BEGIN CERTIFICATE-----
+MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5
+MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
+Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
+A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
+Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl
+ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr
+ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr
+BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM
+YyRIHN8wfdVoOw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Amazon Root CA 4 O=Amazon
+# Subject: CN=Amazon Root CA 4 O=Amazon
+# Label: "Amazon Root CA 4"
+# Serial: 143266989758080763974105200630763877849284878
+# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd
+# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be
+# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92
+-----BEGIN CERTIFICATE-----
+MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5
+MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
+Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
+A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
+Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi
+9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk
+M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB
+MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw
+CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW
+1KyLa2tJElMzrdfkviT8tQp21KW8EA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A.
+# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A.
+# Label: "LuxTrust Global Root 2"
+# Serial: 59914338225734147123941058376788110305822489521
+# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c
+# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f
+# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5
+-----BEGIN CERTIFICATE-----
+MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL
+BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV
+BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw
+MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B
+LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN
+AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F
+ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem
+hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1
+EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn
+Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4
+zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ
+96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m
+j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g
+DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+
+8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j
+X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH
+hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB
+KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0
+Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT
++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL
+BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9
+BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO
+jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9
+loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c
+qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+
+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/
+JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre
+zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf
+LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+
+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6
+oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr
+-----END CERTIFICATE-----
+
+# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM
+# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM
+# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1"
+# Serial: 1
+# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49
+# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca
+# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16
+-----BEGIN CERTIFICATE-----
+MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx
+GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp
+bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w
+KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0
+BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy
+dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG
+EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll
+IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU
+QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT
+TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg
+LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7
+a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr
+LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr
+N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X
+YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/
+iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f
+AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH
+V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
+BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
+AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf
+IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4
+lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c
+8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf
+lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.
+# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.
+# Label: "GDCA TrustAUTH R5 ROOT"
+# Serial: 9009899650740120186
+# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4
+# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4
+# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93
+-----BEGIN CERTIFICATE-----
+MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE
+BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ
+IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0
+MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV
+BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w
+HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj
+Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj
+TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u
+KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj
+qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm
+MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12
+ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP
+zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk
+L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC
+jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA
+HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC
+AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg
+p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm
+DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5
+COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry
+L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf
+JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg
+IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io
+2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV
+09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ
+XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq
+T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe
+MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Label: "TrustCor RootCert CA-1"
+# Serial: 15752444095811006489
+# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45
+# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a
+# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD
+VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk
+MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
+cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y
+IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB
+pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h
+IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG
+A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU
+cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid
+RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V
+seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme
+9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV
+EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW
+hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/
+DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw
+DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD
+ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I
+/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
+ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ
+yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts
+L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN
+zl/HHk484IkzlQsPpTLWPFp5LBk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Label: "TrustCor RootCert CA-2"
+# Serial: 2711694510199101698
+# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64
+# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0
+# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65
+-----BEGIN CERTIFICATE-----
+MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV
+BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw
+IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy
+dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig
+Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk
+MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg
+Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD
+VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy
+dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+
+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq
+1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp
+2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK
+DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape
+az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF
+3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88
+oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM
+g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3
+mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
+8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd
+BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U
+nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw
+DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX
+dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+
+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL
+/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX
+CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa
+ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW
+2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7
+N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3
+Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB
+As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp
+5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu
+1uwJ
+-----END CERTIFICATE-----
+
+# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Label: "TrustCor ECA-1"
+# Serial: 9548242946988625984
+# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c
+# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd
+# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD
+VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk
+MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
+cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y
+IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV
+BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw
+IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy
+dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig
+RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb
+3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA
+BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5
+3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou
+owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/
+wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF
+ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf
+BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/
+MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv
+civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2
+AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
+hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50
+soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI
+WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi
+tJ/X5g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation
+# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation
+# Label: "SSL.com Root Certification Authority RSA"
+# Serial: 8875640296558310041
+# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29
+# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb
+# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69
+-----BEGIN CERTIFICATE-----
+MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE
+BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK
+DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz
+OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv
+dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv
+bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN
+AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R
+xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX
+qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC
+C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3
+6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh
+/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF
+YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E
+JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc
+US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8
+ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm
++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi
+M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV
+HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G
+A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV
+cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc
+Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs
+PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/
+q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0
+cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr
+a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I
+H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y
+K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu
+nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf
+oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY
+Ic2wBlX7Jz9TkHCpBB5XJ7k=
+-----END CERTIFICATE-----
+
+# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation
+# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation
+# Label: "SSL.com Root Certification Authority ECC"
+# Serial: 8495723813297216424
+# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e
+# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a
+# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65
+-----BEGIN CERTIFICATE-----
+MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC
+VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T
+U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0
+aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz
+WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0
+b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS
+b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB
+BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI
+7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg
+CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud
+EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD
+VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T
+kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+
+gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl
+-----END CERTIFICATE-----
+
+# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation
+# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation
+# Label: "SSL.com EV Root Certification Authority RSA R2"
+# Serial: 6248227494352943350
+# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95
+# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a
+# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c
+-----BEGIN CERTIFICATE-----
+MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV
+BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE
+CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy
+dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy
+MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G
+A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD
+DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq
+M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf
+OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa
+4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9
+HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR
+aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA
+b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ
+Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV
+PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO
+pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu
+UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY
+MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
+HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4
+9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW
+s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5
+Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg
+cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM
+79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz
+/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt
+ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm
+Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK
+QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ
+w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi
+S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07
+mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
+-----END CERTIFICATE-----
+
+# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation
+# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation
+# Label: "SSL.com EV Root Certification Authority ECC"
+# Serial: 3182246526754555285
+# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90
+# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d
+# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8
+-----BEGIN CERTIFICATE-----
+MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC
+VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T
+U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx
+NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv
+dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv
+bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49
+AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA
+VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku
+WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP
+MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX
+5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ
+ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg
+h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
+-----END CERTIFICATE-----
diff --git a/vendor/pip-9.0.3/pip/_vendor/certifi/core.py b/vendor/pip-9.0.3/pip/_vendor/certifi/core.py
new file mode 100644
index 0000000000000000000000000000000000000000..eab9d1d178dc29a7ab0dd304084e130fb8a82969
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/certifi/core.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+certifi.py
+~~~~~~~~~~
+
+This module returns the installation location of cacert.pem.
+"""
+import os
+import warnings
+
+
+class DeprecatedBundleWarning(DeprecationWarning):
+    """
+    The weak security bundle is being deprecated. Please bother your service
+    provider to get them to stop using cross-signed roots.
+    """
+
+
+def where():
+    f = os.path.dirname(__file__)
+
+    return os.path.join(f, 'cacert.pem')
+
+
+def old_where():
+    warnings.warn(
+        "The weak security bundle has been removed. certifi.old_where() is now an alias "
+        "of certifi.where(). Please update your code to use certifi.where() instead. "
+        "certifi.old_where() will be removed in 2018.",
+        DeprecatedBundleWarning
+    )
+    return where()
+
+if __name__ == '__main__':
+    print(where())
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/__init__.py b/vendor/pip-9.0.3/pip/_vendor/chardet/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..0f9f820ef6e5f21042efd0e9dc18d097388d7207
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/__init__.py
@@ -0,0 +1,39 @@
+######################## BEGIN LICENSE BLOCK ########################
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+
+from .compat import PY2, PY3
+from .universaldetector import UniversalDetector
+from .version import __version__, VERSION
+
+
+def detect(byte_str):
+    """
+    Detect the encoding of the given byte string.
+
+    :param byte_str:     The byte sequence to examine.
+    :type byte_str:      ``bytes`` or ``bytearray``
+    """
+    if not isinstance(byte_str, bytearray):
+        if not isinstance(byte_str, bytes):
+            raise TypeError('Expected object of type bytes or bytearray, got: '
+                            '{0}'.format(type(byte_str)))
+        else:
+            byte_str = bytearray(byte_str)
+    detector = UniversalDetector()
+    detector.feed(byte_str)
+    return detector.close()
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/big5freq.py b/vendor/pip-9.0.3/pip/_vendor/chardet/big5freq.py
new file mode 100644
index 0000000000000000000000000000000000000000..38f32517aa8f6cf5970f7ceddd1a415289184c3e
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/big5freq.py
@@ -0,0 +1,386 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# Big5 frequency table
+# by Taiwan's Mandarin Promotion Council
+# <http://www.edu.tw:81/mandr/>
+#
+# 128  --> 0.42261
+# 256  --> 0.57851
+# 512  --> 0.74851
+# 1024 --> 0.89384
+# 2048 --> 0.97583
+#
+# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98
+# Random Distribution Ration = 512/(5401-512)=0.105
+#
+# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
+
+BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75
+
+#Char to FreqOrder table
+BIG5_TABLE_SIZE = 5376
+
+BIG5_CHAR_TO_FREQ_ORDER = (
+   1,1801,1506, 255,1431, 198,   9,  82,   6,5008, 177, 202,3681,1256,2821, 110, #   16
+3814,  33,3274, 261,  76,  44,2114,  16,2946,2187,1176, 659,3971,  26,3451,2653, #   32
+1198,3972,3350,4202, 410,2215, 302, 590, 361,1964,   8, 204,  58,4510,5009,1932, #   48
+  63,5010,5011, 317,1614,  75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, #   64
+3682,   3,  10,3973,1471,  29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, #   80
+4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947,  34,3556,3204,  64, 604, #   96
+5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337,  72, 406,5017,  80, #  112
+ 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449,  69,2987, 591, #  128
+ 179,2096, 471, 115,2035,1844,  60,  50,2988, 134, 806,1869, 734,2036,3454, 180, #  144
+ 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, #  160
+2502,  90,2716,1338, 663,  11, 906,1099,2553,  20,2441, 182, 532,1716,5019, 732, #  176
+1376,4204,1311,1420,3206,  25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, #  192
+3276, 475,1447,3683,5020, 117,  21, 656, 810,1297,2300,2334,3557,5021, 126,4205, #  208
+ 706, 456, 150, 613,4513,  71,1118,2037,4206, 145,3092,  85, 835, 486,2115,1246, #  224
+1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, #  240
+3558,3135,5023,1956,1153,4207,  83, 296,1199,3093, 192, 624,  93,5024, 822,1898, #  256
+2823,3136, 795,2065, 991,1554,1542,1592,  27,  43,2867, 859, 139,1456, 860,4514, #  272
+ 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, #  288
+3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, #  304
+1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, #  320
+5026,5027,2176,3207,3685,2682, 593, 845,1062,3277,  88,1723,2038,3978,1951, 212, #  336
+ 266, 152, 149, 468,1899,4208,4516,  77, 187,5028,3038,  37,   5,2990,5029,3979, #  352
+5030,5031,  39,2524,4517,2908,3208,2079,  55, 148,  74,4518, 545, 483,1474,1029, #  368
+1665, 217,1870,1531,3138,1104,2655,4209,  24, 172,3562, 900,3980,3563,3564,4519, #  384
+  32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683,   4,3039,3351,1427,1789, #  400
+ 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, #  416
+3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439,  38,5037,1063,5038, 794, #  432
+3982,1435,2301,  46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804,  35, 707, #  448
+ 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, #  464
+2129,1363,3689,1423, 697, 100,3094,  48,  70,1231, 495,3139,2196,5043,1294,5044, #  480
+2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, #  496
+ 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, #  512
+ 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, #  528
+3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, #  544
+1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, #  560
+1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, #  576
+1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381,   7, #  592
+2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, #  608
+ 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, #  624
+4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, #  640
+1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, #  656
+5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, #  672
+2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, #  688
+ 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, #  704
+  98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, #  720
+ 523,2789,2790,2658,5061, 141,2235,1333,  68, 176, 441, 876, 907,4220, 603,2602, #  736
+ 710, 171,3464, 404, 549,  18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, #  752
+5063,2991, 368,5064, 146, 366,  99, 871,3693,1543, 748, 807,1586,1185,  22,2263, #  768
+ 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, #  784
+1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068,  59,5069, #  800
+ 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, #  816
+ 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, #  832
+5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, #  848
+1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, #  864
+ 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, #  880
+3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, #  896
+4224,  57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, #  912
+3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, #  928
+ 279,3145,  51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, #  944
+ 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, #  960
+1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, #  976
+4227,2475,1436, 953,4228,2055,4545, 671,2400,  79,4229,2446,3285, 608, 567,2689, #  992
+3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008
+3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024
+2402,5097,5098,5099,4232,3045,   0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040
+5101, 233,4233,3697,1819,4550,4551,5102,  96,1777,1315,2083,5103, 257,5104,1810, # 1056
+3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072
+5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088
+1484,5110,1712, 127,  67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104
+2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120
+1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136
+  78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152
+1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168
+4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184
+3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200
+ 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216
+ 165, 243,4559,3703,2528, 123, 683,4239, 764,4560,  36,3998,1793, 589,2916, 816, # 1232
+ 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248
+2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264
+5122, 611,1156, 854,2386,1316,2875,   2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280
+1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296
+2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312
+1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328
+1994,5135,4564,5136,5137,2198,  13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344
+5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360
+5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376
+5149, 128,2133,  92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392
+3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408
+4567,2252,  94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424
+4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440
+2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456
+5163,2337,2068,  23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472
+3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488
+ 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504
+5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863,  41, # 1520
+5170,5171,4575,5172,1657,2338,  19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536
+1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552
+2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568
+3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584
+4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600
+5182,2692, 733,  40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616
+3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632
+4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648
+1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664
+1871,2762,3004,5187, 435,5188, 343,1108, 596,  17,1751,4579,2239,3477,3709,5189, # 1680
+4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696
+1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712
+ 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728
+1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744
+1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760
+3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776
+ 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792
+5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808
+2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824
+1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840
+1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551,  30,2268,4266, # 1856
+5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872
+ 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888
+4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904
+ 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920
+2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936
+ 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952
+1041,3005, 293,1168,  87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968
+1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984
+ 730,1515, 184,2840,  66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000
+4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016
+4021,5231,5232,1186,  15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032
+1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048
+3596,1342,1681,1718, 766,3297, 286,  89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064
+5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080
+5240,3298, 310, 313,3482,2304, 770,4278,  54,3054, 189,4611,3105,3848,4025,5241, # 2096
+1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112
+2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128
+1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144
+3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160
+2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176
+3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192
+2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208
+4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224
+4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240
+3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256
+  97,  81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272
+3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288
+ 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304
+3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320
+4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336
+3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352
+1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368
+5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384
+ 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400
+5286, 587,  14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416
+1702,1226, 102,1547,  62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432
+ 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448
+4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294,  86,1494,1730, # 2464
+4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480
+ 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496
+2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512
+2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885,  28,2695, # 2528
+3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544
+1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560
+4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576
+2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592
+1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608
+1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624
+2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640
+3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656
+1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672
+5313,3493,5314,5315,5316,3310,2698,1433,3311, 131,  95,1504,4049, 723,4303,3166, # 2688
+1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704
+4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654,  53,5320,3014,5321, # 2720
+1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736
+ 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752
+1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768
+4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784
+4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800
+2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816
+1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832
+4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848
+ 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864
+5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880
+2322,3316,5346,5347,4308,5348,4309,  84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896
+3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912
+4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928
+ 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944
+5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960
+5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976
+1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992
+4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008
+4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024
+2699,1516,3614,1121,1082,1329,3317,4073,1449,3873,  65,1128,2848,2927,2769,1590, # 3040
+3874,5370,5371,  12,2668,  45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056
+3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072
+2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088
+1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104
+4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120
+3736,1859,  91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136
+3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152
+2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168
+4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771,  61,4079,3738,1823,4080, # 3184
+5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200
+3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216
+2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232
+3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248
+1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264
+2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280
+3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296
+4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063,  56,1396,3113, # 3312
+2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328
+2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344
+5418,1076,  49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360
+1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376
+2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392
+1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408
+3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424
+4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629,  31,2851, # 3440
+2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456
+3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472
+3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488
+2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504
+4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520
+2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536
+3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552
+4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568
+5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584
+3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600
+ 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616
+1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412,  42,3119, 464,5455,2642, # 3632
+4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648
+1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664
+4701,5462,3020, 962, 588,3629, 289,3250,2644,1116,  52,5463,3067,1797,5464,5465, # 3680
+5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696
+ 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712
+5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728
+5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744
+2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760
+3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776
+2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792
+2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808
+ 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824
+1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840
+4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856
+3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872
+3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888
+ 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904
+2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920
+ 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936
+2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952
+4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968
+1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984
+4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000
+1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016
+3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032
+ 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048
+3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064
+5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080
+5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096
+3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112
+3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128
+1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144
+2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160
+5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176
+1561,2674,1452,4113,1375,5549,5550,  47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192
+1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208
+3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224
+ 919,2352,2975,2353,1270,4727,4115,  73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240
+1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256
+4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272
+5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288
+2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304
+3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320
+ 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336
+1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352
+2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368
+2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384
+5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400
+5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416
+5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432
+2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448
+2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464
+1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480
+4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496
+3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512
+3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528
+4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544
+4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560
+2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576
+2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592
+5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608
+4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624
+5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640
+4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656
+ 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672
+ 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688
+1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704
+3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720
+4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736
+1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752
+5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768
+2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784
+2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800
+3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816
+5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832
+1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848
+3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864
+5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880
+1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896
+5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912
+2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928
+3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944
+2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960
+3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976
+3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992
+3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008
+4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024
+ 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040
+2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056
+4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072
+3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088
+5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104
+1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120
+5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136
+ 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152
+1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168
+ 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184
+4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200
+1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216
+4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232
+1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248
+ 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264
+3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280
+4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296
+5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312
+ 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328
+3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344
+ 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360
+2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376
+)
+
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/big5prober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/big5prober.py
new file mode 100644
index 0000000000000000000000000000000000000000..98f9970122088c14a5830e091ca8a12fc8e4c563
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/big5prober.py
@@ -0,0 +1,47 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import Big5DistributionAnalysis
+from .mbcssm import BIG5_SM_MODEL
+
+
+class Big5Prober(MultiByteCharSetProber):
+    def __init__(self):
+        super(Big5Prober, self).__init__()
+        self.coding_sm = CodingStateMachine(BIG5_SM_MODEL)
+        self.distribution_analyzer = Big5DistributionAnalysis()
+        self.reset()
+
+    @property
+    def charset_name(self):
+        return "Big5"
+
+    @property
+    def language(self):
+        return "Chinese"
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/chardistribution.py b/vendor/pip-9.0.3/pip/_vendor/chardet/chardistribution.py
new file mode 100644
index 0000000000000000000000000000000000000000..c0395f4a45aaa5c4ba1824a81d8ef8f69b46dc60
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/chardistribution.py
@@ -0,0 +1,233 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE,
+                        EUCTW_TYPICAL_DISTRIBUTION_RATIO)
+from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE,
+                        EUCKR_TYPICAL_DISTRIBUTION_RATIO)
+from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE,
+                         GB2312_TYPICAL_DISTRIBUTION_RATIO)
+from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE,
+                       BIG5_TYPICAL_DISTRIBUTION_RATIO)
+from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE,
+                      JIS_TYPICAL_DISTRIBUTION_RATIO)
+
+
+class CharDistributionAnalysis(object):
+    ENOUGH_DATA_THRESHOLD = 1024
+    SURE_YES = 0.99
+    SURE_NO = 0.01
+    MINIMUM_DATA_THRESHOLD = 3
+
+    def __init__(self):
+        # Mapping table to get frequency order from char order (get from
+        # GetOrder())
+        self._char_to_freq_order = None
+        self._table_size = None  # Size of above table
+        # This is a constant value which varies from language to language,
+        # used in calculating confidence.  See
+        # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html
+        # for further detail.
+        self.typical_distribution_ratio = None
+        self._done = None
+        self._total_chars = None
+        self._freq_chars = None
+        self.reset()
+
+    def reset(self):
+        """reset analyser, clear any state"""
+        # If this flag is set to True, detection is done and conclusion has
+        # been made
+        self._done = False
+        self._total_chars = 0  # Total characters encountered
+        # The number of characters whose frequency order is less than 512
+        self._freq_chars = 0
+
+    def feed(self, char, char_len):
+        """feed a character with known length"""
+        if char_len == 2:
+            # we only care about 2-bytes character in our distribution analysis
+            order = self.get_order(char)
+        else:
+            order = -1
+        if order >= 0:
+            self._total_chars += 1
+            # order is valid
+            if order < self._table_size:
+                if 512 > self._char_to_freq_order[order]:
+                    self._freq_chars += 1
+
+    def get_confidence(self):
+        """return confidence based on existing data"""
+        # if we didn't receive any character in our consideration range,
+        # return negative answer
+        if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD:
+            return self.SURE_NO
+
+        if self._total_chars != self._freq_chars:
+            r = (self._freq_chars / ((self._total_chars - self._freq_chars)
+                 * self.typical_distribution_ratio))
+            if r < self.SURE_YES:
+                return r
+
+        # normalize confidence (we don't want to be 100% sure)
+        return self.SURE_YES
+
+    def got_enough_data(self):
+        # It is not necessary to receive all data to draw conclusion.
+        # For charset detection, certain amount of data is enough
+        return self._total_chars > self.ENOUGH_DATA_THRESHOLD
+
+    def get_order(self, byte_str):
+        # We do not handle characters based on the original encoding string,
+        # but convert this encoding string to a number, here called order.
+        # This allows multiple encodings of a language to share one frequency
+        # table.
+        return -1
+
+
+class EUCTWDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        super(EUCTWDistributionAnalysis, self).__init__()
+        self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER
+        self._table_size = EUCTW_TABLE_SIZE
+        self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, byte_str):
+        # for euc-TW encoding, we are interested
+        #   first  byte range: 0xc4 -- 0xfe
+        #   second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        first_char = byte_str[0]
+        if first_char >= 0xC4:
+            return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1
+        else:
+            return -1
+
+
+class EUCKRDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        super(EUCKRDistributionAnalysis, self).__init__()
+        self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER
+        self._table_size = EUCKR_TABLE_SIZE
+        self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, byte_str):
+        # for euc-KR encoding, we are interested
+        #   first  byte range: 0xb0 -- 0xfe
+        #   second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        first_char = byte_str[0]
+        if first_char >= 0xB0:
+            return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1
+        else:
+            return -1
+
+
+class GB2312DistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        super(GB2312DistributionAnalysis, self).__init__()
+        self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER
+        self._table_size = GB2312_TABLE_SIZE
+        self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, byte_str):
+        # for GB2312 encoding, we are interested
+        #  first  byte range: 0xb0 -- 0xfe
+        #  second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        first_char, second_char = byte_str[0], byte_str[1]
+        if (first_char >= 0xB0) and (second_char >= 0xA1):
+            return 94 * (first_char - 0xB0) + second_char - 0xA1
+        else:
+            return -1
+
+
+class Big5DistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        super(Big5DistributionAnalysis, self).__init__()
+        self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER
+        self._table_size = BIG5_TABLE_SIZE
+        self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, byte_str):
+        # for big5 encoding, we are interested
+        #   first  byte range: 0xa4 -- 0xfe
+        #   second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        first_char, second_char = byte_str[0], byte_str[1]
+        if first_char >= 0xA4:
+            if second_char >= 0xA1:
+                return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63
+            else:
+                return 157 * (first_char - 0xA4) + second_char - 0x40
+        else:
+            return -1
+
+
+class SJISDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        super(SJISDistributionAnalysis, self).__init__()
+        self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER
+        self._table_size = JIS_TABLE_SIZE
+        self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, byte_str):
+        # for sjis encoding, we are interested
+        #   first  byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe
+        #   second byte range: 0x40 -- 0x7e,  0x81 -- oxfe
+        # no validation needed here. State machine has done that
+        first_char, second_char = byte_str[0], byte_str[1]
+        if (first_char >= 0x81) and (first_char <= 0x9F):
+            order = 188 * (first_char - 0x81)
+        elif (first_char >= 0xE0) and (first_char <= 0xEF):
+            order = 188 * (first_char - 0xE0 + 31)
+        else:
+            return -1
+        order = order + second_char - 0x40
+        if second_char > 0x7F:
+            order = -1
+        return order
+
+
+class EUCJPDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        super(EUCJPDistributionAnalysis, self).__init__()
+        self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER
+        self._table_size = JIS_TABLE_SIZE
+        self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, byte_str):
+        # for euc-JP encoding, we are interested
+        #   first  byte range: 0xa0 -- 0xfe
+        #   second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        char = byte_str[0]
+        if char >= 0xA0:
+            return 94 * (char - 0xA1) + byte_str[1] - 0xa1
+        else:
+            return -1
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/charsetgroupprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/charsetgroupprober.py
new file mode 100644
index 0000000000000000000000000000000000000000..8b3738efd8ea1e42d196d381d2809beae7f4c649
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/charsetgroupprober.py
@@ -0,0 +1,106 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .enums import ProbingState
+from .charsetprober import CharSetProber
+
+
+class CharSetGroupProber(CharSetProber):
+    def __init__(self, lang_filter=None):
+        super(CharSetGroupProber, self).__init__(lang_filter=lang_filter)
+        self._active_num = 0
+        self.probers = []
+        self._best_guess_prober = None
+
+    def reset(self):
+        super(CharSetGroupProber, self).reset()
+        self._active_num = 0
+        for prober in self.probers:
+            if prober:
+                prober.reset()
+                prober.active = True
+                self._active_num += 1
+        self._best_guess_prober = None
+
+    @property
+    def charset_name(self):
+        if not self._best_guess_prober:
+            self.get_confidence()
+            if not self._best_guess_prober:
+                return None
+        return self._best_guess_prober.charset_name
+
+    @property
+    def language(self):
+        if not self._best_guess_prober:
+            self.get_confidence()
+            if not self._best_guess_prober:
+                return None
+        return self._best_guess_prober.language
+
+    def feed(self, byte_str):
+        for prober in self.probers:
+            if not prober:
+                continue
+            if not prober.active:
+                continue
+            state = prober.feed(byte_str)
+            if not state:
+                continue
+            if state == ProbingState.FOUND_IT:
+                self._best_guess_prober = prober
+                return self.state
+            elif state == ProbingState.NOT_ME:
+                prober.active = False
+                self._active_num -= 1
+                if self._active_num <= 0:
+                    self._state = ProbingState.NOT_ME
+                    return self.state
+        return self.state
+
+    def get_confidence(self):
+        state = self.state
+        if state == ProbingState.FOUND_IT:
+            return 0.99
+        elif state == ProbingState.NOT_ME:
+            return 0.01
+        best_conf = 0.0
+        self._best_guess_prober = None
+        for prober in self.probers:
+            if not prober:
+                continue
+            if not prober.active:
+                self.logger.debug('%s not active', prober.charset_name)
+                continue
+            conf = prober.get_confidence()
+            self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf)
+            if best_conf < conf:
+                best_conf = conf
+                self._best_guess_prober = prober
+        if not self._best_guess_prober:
+            return 0.0
+        return best_conf
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/charsetprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/charsetprober.py
new file mode 100644
index 0000000000000000000000000000000000000000..eac4e5986578636ad414648e6015e8b7e9f10432
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/charsetprober.py
@@ -0,0 +1,145 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import logging
+import re
+
+from .enums import ProbingState
+
+
+class CharSetProber(object):
+
+    SHORTCUT_THRESHOLD = 0.95
+
+    def __init__(self, lang_filter=None):
+        self._state = None
+        self.lang_filter = lang_filter
+        self.logger = logging.getLogger(__name__)
+
+    def reset(self):
+        self._state = ProbingState.DETECTING
+
+    @property
+    def charset_name(self):
+        return None
+
+    def feed(self, buf):
+        pass
+
+    @property
+    def state(self):
+        return self._state
+
+    def get_confidence(self):
+        return 0.0
+
+    @staticmethod
+    def filter_high_byte_only(buf):
+        buf = re.sub(b'([\x00-\x7F])+', b' ', buf)
+        return buf
+
+    @staticmethod
+    def filter_international_words(buf):
+        """
+        We define three types of bytes:
+        alphabet: english alphabets [a-zA-Z]
+        international: international characters [\x80-\xFF]
+        marker: everything else [^a-zA-Z\x80-\xFF]
+
+        The input buffer can be thought to contain a series of words delimited
+        by markers. This function works to filter all words that contain at
+        least one international character. All contiguous sequences of markers
+        are replaced by a single space ascii character.
+
+        This filter applies to all scripts which do not use English characters.
+        """
+        filtered = bytearray()
+
+        # This regex expression filters out only words that have at-least one
+        # international character. The word may include one marker character at
+        # the end.
+        words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?',
+                           buf)
+
+        for word in words:
+            filtered.extend(word[:-1])
+
+            # If the last character in the word is a marker, replace it with a
+            # space as markers shouldn't affect our analysis (they are used
+            # similarly across all languages and may thus have similar
+            # frequencies).
+            last_char = word[-1:]
+            if not last_char.isalpha() and last_char < b'\x80':
+                last_char = b' '
+            filtered.extend(last_char)
+
+        return filtered
+
+    @staticmethod
+    def filter_with_english_letters(buf):
+        """
+        Returns a copy of ``buf`` that retains only the sequences of English
+        alphabet and high byte characters that are not between <> characters.
+        Also retains English alphabet and high byte characters immediately
+        before occurrences of >.
+
+        This filter can be applied to all scripts which contain both English
+        characters and extended ASCII characters, but is currently only used by
+        ``Latin1Prober``.
+        """
+        filtered = bytearray()
+        in_tag = False
+        prev = 0
+
+        for curr in range(len(buf)):
+            # Slice here to get bytes instead of an int with Python 3
+            buf_char = buf[curr:curr + 1]
+            # Check if we're coming out of or entering an HTML tag
+            if buf_char == b'>':
+                in_tag = False
+            elif buf_char == b'<':
+                in_tag = True
+
+            # If current character is not extended-ASCII and not alphabetic...
+            if buf_char < b'\x80' and not buf_char.isalpha():
+                # ...and we're not in a tag
+                if curr > prev and not in_tag:
+                    # Keep everything after last non-extended-ASCII,
+                    # non-alphabetic character
+                    filtered.extend(buf[prev:curr])
+                    # Output a space to delimit stretch we kept
+                    filtered.extend(b' ')
+                prev = curr + 1
+
+        # If we're not in a tag...
+        if not in_tag:
+            # Keep everything after last non-extended-ASCII, non-alphabetic
+            # character
+            filtered.extend(buf[prev:])
+
+        return filtered
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/cli/__init__.py b/vendor/pip-9.0.3/pip/_vendor/chardet/cli/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/cli/__init__.py
@@ -0,0 +1 @@
+
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/cli/chardetect.py b/vendor/pip-9.0.3/pip/_vendor/chardet/cli/chardetect.py
new file mode 100644
index 0000000000000000000000000000000000000000..f0a4cc5d79f2b42486631f96558a47093dd6298e
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/cli/chardetect.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+"""
+Script which takes one or more file paths and reports on their detected
+encodings
+
+Example::
+
+    % chardetect somefile someotherfile
+    somefile: windows-1252 with confidence 0.5
+    someotherfile: ascii with confidence 1.0
+
+If no paths are provided, it takes its input from stdin.
+
+"""
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+import argparse
+import sys
+
+from chardet import __version__
+from chardet.compat import PY2
+from chardet.universaldetector import UniversalDetector
+
+
+def description_of(lines, name='stdin'):
+    """
+    Return a string describing the probable encoding of a file or
+    list of strings.
+
+    :param lines: The lines to get the encoding of.
+    :type lines: Iterable of bytes
+    :param name: Name of file or collection of lines
+    :type name: str
+    """
+    u = UniversalDetector()
+    for line in lines:
+        line = bytearray(line)
+        u.feed(line)
+        # shortcut out of the loop to save reading further - particularly useful if we read a BOM.
+        if u.done:
+            break
+    u.close()
+    result = u.result
+    if PY2:
+        name = name.decode(sys.getfilesystemencoding(), 'ignore')
+    if result['encoding']:
+        return '{0}: {1} with confidence {2}'.format(name, result['encoding'],
+                                                     result['confidence'])
+    else:
+        return '{0}: no result'.format(name)
+
+
+def main(argv=None):
+    """
+    Handles command line arguments and gets things started.
+
+    :param argv: List of arguments, as if specified on the command-line.
+                 If None, ``sys.argv[1:]`` is used instead.
+    :type argv: list of str
+    """
+    # Get command line arguments
+    parser = argparse.ArgumentParser(
+        description="Takes one or more file paths and reports their detected \
+                     encodings")
+    parser.add_argument('input',
+                        help='File whose encoding we would like to determine. \
+                              (default: stdin)',
+                        type=argparse.FileType('rb'), nargs='*',
+                        default=[sys.stdin if PY2 else sys.stdin.buffer])
+    parser.add_argument('--version', action='version',
+                        version='%(prog)s {0}'.format(__version__))
+    args = parser.parse_args(argv)
+
+    for f in args.input:
+        if f.isatty():
+            print("You are running chardetect interactively. Press " +
+                  "CTRL-D twice at the start of a blank line to signal the " +
+                  "end of your input. If you want help, run chardetect " +
+                  "--help\n", file=sys.stderr)
+        print(description_of(f, f.name))
+
+
+if __name__ == '__main__':
+    main()
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/codingstatemachine.py b/vendor/pip-9.0.3/pip/_vendor/chardet/codingstatemachine.py
new file mode 100644
index 0000000000000000000000000000000000000000..68fba44f14366c448f13db3cf9cf1665af2e498c
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/codingstatemachine.py
@@ -0,0 +1,88 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import logging
+
+from .enums import MachineState
+
+
+class CodingStateMachine(object):
+    """
+    A state machine to verify a byte sequence for a particular encoding. For
+    each byte the detector receives, it will feed that byte to every active
+    state machine available, one byte at a time. The state machine changes its
+    state based on its previous state and the byte it receives. There are 3
+    states in a state machine that are of interest to an auto-detector:
+
+    START state: This is the state to start with, or a legal byte sequence
+                 (i.e. a valid code point) for character has been identified.
+
+    ME state:  This indicates that the state machine identified a byte sequence
+               that is specific to the charset it is designed for and that
+               there is no other possible encoding which can contain this byte
+               sequence. This will to lead to an immediate positive answer for
+               the detector.
+
+    ERROR state: This indicates the state machine identified an illegal byte
+                 sequence for that encoding. This will lead to an immediate
+                 negative answer for this encoding. Detector will exclude this
+                 encoding from consideration from here on.
+    """
+    def __init__(self, sm):
+        self._model = sm
+        self._curr_byte_pos = 0
+        self._curr_char_len = 0
+        self._curr_state = None
+        self.logger = logging.getLogger(__name__)
+        self.reset()
+
+    def reset(self):
+        self._curr_state = MachineState.START
+
+    def next_state(self, c):
+        # for each byte we get its class
+        # if it is first byte, we also get byte length
+        byte_class = self._model['class_table'][c]
+        if self._curr_state == MachineState.START:
+            self._curr_byte_pos = 0
+            self._curr_char_len = self._model['char_len_table'][byte_class]
+        # from byte's class and state_table, we get its next state
+        curr_state = (self._curr_state * self._model['class_factor']
+                      + byte_class)
+        self._curr_state = self._model['state_table'][curr_state]
+        self._curr_byte_pos += 1
+        return self._curr_state
+
+    def get_current_charlen(self):
+        return self._curr_char_len
+
+    def get_coding_state_machine(self):
+        return self._model['name']
+
+    @property
+    def language(self):
+        return self._model['language']
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/compat.py b/vendor/pip-9.0.3/pip/_vendor/chardet/compat.py
new file mode 100644
index 0000000000000000000000000000000000000000..ddd74687c02a12ecc296ee803997a345e984bc9d
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/compat.py
@@ -0,0 +1,34 @@
+######################## BEGIN LICENSE BLOCK ########################
+# Contributor(s):
+#   Dan Blanchard
+#   Ian Cordasco
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import sys
+
+
+if sys.version_info < (3, 0):
+    PY2 = True
+    PY3 = False
+    base_str = (str, unicode)
+    text_type = unicode
+else:
+    PY2 = False
+    PY3 = True
+    base_str = (bytes, str)
+    text_type = str
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/cp949prober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/cp949prober.py
new file mode 100644
index 0000000000000000000000000000000000000000..efd793abca4bf496001a4e46a67557e5a6f16bba
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/cp949prober.py
@@ -0,0 +1,49 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .chardistribution import EUCKRDistributionAnalysis
+from .codingstatemachine import CodingStateMachine
+from .mbcharsetprober import MultiByteCharSetProber
+from .mbcssm import CP949_SM_MODEL
+
+
+class CP949Prober(MultiByteCharSetProber):
+    def __init__(self):
+        super(CP949Prober, self).__init__()
+        self.coding_sm = CodingStateMachine(CP949_SM_MODEL)
+        # NOTE: CP949 is a superset of EUC-KR, so the distribution should be
+        #       not different.
+        self.distribution_analyzer = EUCKRDistributionAnalysis()
+        self.reset()
+
+    @property
+    def charset_name(self):
+        return "CP949"
+
+    @property
+    def language(self):
+        return "Korean"
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/enums.py b/vendor/pip-9.0.3/pip/_vendor/chardet/enums.py
new file mode 100644
index 0000000000000000000000000000000000000000..04512072251c429e63ed110cdbafaf4b3cca3412
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/enums.py
@@ -0,0 +1,76 @@
+"""
+All of the Enums that are used throughout the chardet package.
+
+:author: Dan Blanchard (dan.blanchard@gmail.com)
+"""
+
+
+class InputState(object):
+    """
+    This enum represents the different states a universal detector can be in.
+    """
+    PURE_ASCII = 0
+    ESC_ASCII = 1
+    HIGH_BYTE = 2
+
+
+class LanguageFilter(object):
+    """
+    This enum represents the different language filters we can apply to a
+    ``UniversalDetector``.
+    """
+    CHINESE_SIMPLIFIED = 0x01
+    CHINESE_TRADITIONAL = 0x02
+    JAPANESE = 0x04
+    KOREAN = 0x08
+    NON_CJK = 0x10
+    ALL = 0x1F
+    CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL
+    CJK = CHINESE | JAPANESE | KOREAN
+
+
+class ProbingState(object):
+    """
+    This enum represents the different states a prober can be in.
+    """
+    DETECTING = 0
+    FOUND_IT = 1
+    NOT_ME = 2
+
+
+class MachineState(object):
+    """
+    This enum represents the different states a state machine can be in.
+    """
+    START = 0
+    ERROR = 1
+    ITS_ME = 2
+
+
+class SequenceLikelihood(object):
+    """
+    This enum represents the likelihood of a character following the previous one.
+    """
+    NEGATIVE = 0
+    UNLIKELY = 1
+    LIKELY = 2
+    POSITIVE = 3
+
+    @classmethod
+    def get_num_categories(cls):
+        """:returns: The number of likelihood categories in the enum."""
+        return 4
+
+
+class CharacterCategory(object):
+    """
+    This enum represents the different categories language models for
+    ``SingleByteCharsetProber`` put characters into.
+
+    Anything less than CONTROL is considered a letter.
+    """
+    UNDEFINED = 255
+    LINE_BREAK = 254
+    SYMBOL = 253
+    DIGIT = 252
+    CONTROL = 251
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/escprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/escprober.py
new file mode 100644
index 0000000000000000000000000000000000000000..c70493f2b131b32378612044f30173eabbfbc3f4
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/escprober.py
@@ -0,0 +1,101 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetprober import CharSetProber
+from .codingstatemachine import CodingStateMachine
+from .enums import LanguageFilter, ProbingState, MachineState
+from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL,
+                    ISO2022KR_SM_MODEL)
+
+
+class EscCharSetProber(CharSetProber):
+    """
+    This CharSetProber uses a "code scheme" approach for detecting encodings,
+    whereby easily recognizable escape or shift sequences are relied on to
+    identify these encodings.
+    """
+
+    def __init__(self, lang_filter=None):
+        super(EscCharSetProber, self).__init__(lang_filter=lang_filter)
+        self.coding_sm = []
+        if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED:
+            self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL))
+            self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL))
+        if self.lang_filter & LanguageFilter.JAPANESE:
+            self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL))
+        if self.lang_filter & LanguageFilter.KOREAN:
+            self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL))
+        self.active_sm_count = None
+        self._detected_charset = None
+        self._detected_language = None
+        self._state = None
+        self.reset()
+
+    def reset(self):
+        super(EscCharSetProber, self).reset()
+        for coding_sm in self.coding_sm:
+            if not coding_sm:
+                continue
+            coding_sm.active = True
+            coding_sm.reset()
+        self.active_sm_count = len(self.coding_sm)
+        self._detected_charset = None
+        self._detected_language = None
+
+    @property
+    def charset_name(self):
+        return self._detected_charset
+
+    @property
+    def language(self):
+        return self._detected_language
+
+    def get_confidence(self):
+        if self._detected_charset:
+            return 0.99
+        else:
+            return 0.00
+
+    def feed(self, byte_str):
+        for c in byte_str:
+            for coding_sm in self.coding_sm:
+                if not coding_sm or not coding_sm.active:
+                    continue
+                coding_state = coding_sm.next_state(c)
+                if coding_state == MachineState.ERROR:
+                    coding_sm.active = False
+                    self.active_sm_count -= 1
+                    if self.active_sm_count <= 0:
+                        self._state = ProbingState.NOT_ME
+                        return self.state
+                elif coding_state == MachineState.ITS_ME:
+                    self._state = ProbingState.FOUND_IT
+                    self._detected_charset = coding_sm.get_coding_state_machine()
+                    self._detected_language = coding_sm.language
+                    return self.state
+
+        return self.state
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/escsm.py b/vendor/pip-9.0.3/pip/_vendor/chardet/escsm.py
new file mode 100644
index 0000000000000000000000000000000000000000..0069523a04969dd920ea4b43a497162157729174
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/escsm.py
@@ -0,0 +1,246 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .enums import MachineState
+
+HZ_CLS = (
+1,0,0,0,0,0,0,0,  # 00 - 07
+0,0,0,0,0,0,0,0,  # 08 - 0f
+0,0,0,0,0,0,0,0,  # 10 - 17
+0,0,0,1,0,0,0,0,  # 18 - 1f
+0,0,0,0,0,0,0,0,  # 20 - 27
+0,0,0,0,0,0,0,0,  # 28 - 2f
+0,0,0,0,0,0,0,0,  # 30 - 37
+0,0,0,0,0,0,0,0,  # 38 - 3f
+0,0,0,0,0,0,0,0,  # 40 - 47
+0,0,0,0,0,0,0,0,  # 48 - 4f
+0,0,0,0,0,0,0,0,  # 50 - 57
+0,0,0,0,0,0,0,0,  # 58 - 5f
+0,0,0,0,0,0,0,0,  # 60 - 67
+0,0,0,0,0,0,0,0,  # 68 - 6f
+0,0,0,0,0,0,0,0,  # 70 - 77
+0,0,0,4,0,5,2,0,  # 78 - 7f
+1,1,1,1,1,1,1,1,  # 80 - 87
+1,1,1,1,1,1,1,1,  # 88 - 8f
+1,1,1,1,1,1,1,1,  # 90 - 97
+1,1,1,1,1,1,1,1,  # 98 - 9f
+1,1,1,1,1,1,1,1,  # a0 - a7
+1,1,1,1,1,1,1,1,  # a8 - af
+1,1,1,1,1,1,1,1,  # b0 - b7
+1,1,1,1,1,1,1,1,  # b8 - bf
+1,1,1,1,1,1,1,1,  # c0 - c7
+1,1,1,1,1,1,1,1,  # c8 - cf
+1,1,1,1,1,1,1,1,  # d0 - d7
+1,1,1,1,1,1,1,1,  # d8 - df
+1,1,1,1,1,1,1,1,  # e0 - e7
+1,1,1,1,1,1,1,1,  # e8 - ef
+1,1,1,1,1,1,1,1,  # f0 - f7
+1,1,1,1,1,1,1,1,  # f8 - ff
+)
+
+HZ_ST = (
+MachineState.START,MachineState.ERROR,     3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f
+MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,     4,MachineState.ERROR,# 10-17
+     5,MachineState.ERROR,     6,MachineState.ERROR,     5,     5,     4,MachineState.ERROR,# 18-1f
+     4,MachineState.ERROR,     4,     4,     4,MachineState.ERROR,     4,MachineState.ERROR,# 20-27
+     4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f
+)
+
+HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0)
+
+HZ_SM_MODEL = {'class_table': HZ_CLS,
+               'class_factor': 6,
+               'state_table': HZ_ST,
+               'char_len_table': HZ_CHAR_LEN_TABLE,
+               'name': "HZ-GB-2312",
+               'language': 'Chinese'}
+
+ISO2022CN_CLS = (
+2,0,0,0,0,0,0,0,  # 00 - 07
+0,0,0,0,0,0,0,0,  # 08 - 0f
+0,0,0,0,0,0,0,0,  # 10 - 17
+0,0,0,1,0,0,0,0,  # 18 - 1f
+0,0,0,0,0,0,0,0,  # 20 - 27
+0,3,0,0,0,0,0,0,  # 28 - 2f
+0,0,0,0,0,0,0,0,  # 30 - 37
+0,0,0,0,0,0,0,0,  # 38 - 3f
+0,0,0,4,0,0,0,0,  # 40 - 47
+0,0,0,0,0,0,0,0,  # 48 - 4f
+0,0,0,0,0,0,0,0,  # 50 - 57
+0,0,0,0,0,0,0,0,  # 58 - 5f
+0,0,0,0,0,0,0,0,  # 60 - 67
+0,0,0,0,0,0,0,0,  # 68 - 6f
+0,0,0,0,0,0,0,0,  # 70 - 77
+0,0,0,0,0,0,0,0,  # 78 - 7f
+2,2,2,2,2,2,2,2,  # 80 - 87
+2,2,2,2,2,2,2,2,  # 88 - 8f
+2,2,2,2,2,2,2,2,  # 90 - 97
+2,2,2,2,2,2,2,2,  # 98 - 9f
+2,2,2,2,2,2,2,2,  # a0 - a7
+2,2,2,2,2,2,2,2,  # a8 - af
+2,2,2,2,2,2,2,2,  # b0 - b7
+2,2,2,2,2,2,2,2,  # b8 - bf
+2,2,2,2,2,2,2,2,  # c0 - c7
+2,2,2,2,2,2,2,2,  # c8 - cf
+2,2,2,2,2,2,2,2,  # d0 - d7
+2,2,2,2,2,2,2,2,  # d8 - df
+2,2,2,2,2,2,2,2,  # e0 - e7
+2,2,2,2,2,2,2,2,  # e8 - ef
+2,2,2,2,2,2,2,2,  # f0 - f7
+2,2,2,2,2,2,2,2,  # f8 - ff
+)
+
+ISO2022CN_ST = (
+MachineState.START,     3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07
+MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f
+MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17
+MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     4,MachineState.ERROR,# 18-1f
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27
+     5,     6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f
+)
+
+ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0)
+
+ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS,
+                      'class_factor': 9,
+                      'state_table': ISO2022CN_ST,
+                      'char_len_table': ISO2022CN_CHAR_LEN_TABLE,
+                      'name': "ISO-2022-CN",
+                      'language': 'Chinese'}
+
+ISO2022JP_CLS = (
+2,0,0,0,0,0,0,0,  # 00 - 07
+0,0,0,0,0,0,2,2,  # 08 - 0f
+0,0,0,0,0,0,0,0,  # 10 - 17
+0,0,0,1,0,0,0,0,  # 18 - 1f
+0,0,0,0,7,0,0,0,  # 20 - 27
+3,0,0,0,0,0,0,0,  # 28 - 2f
+0,0,0,0,0,0,0,0,  # 30 - 37
+0,0,0,0,0,0,0,0,  # 38 - 3f
+6,0,4,0,8,0,0,0,  # 40 - 47
+0,9,5,0,0,0,0,0,  # 48 - 4f
+0,0,0,0,0,0,0,0,  # 50 - 57
+0,0,0,0,0,0,0,0,  # 58 - 5f
+0,0,0,0,0,0,0,0,  # 60 - 67
+0,0,0,0,0,0,0,0,  # 68 - 6f
+0,0,0,0,0,0,0,0,  # 70 - 77
+0,0,0,0,0,0,0,0,  # 78 - 7f
+2,2,2,2,2,2,2,2,  # 80 - 87
+2,2,2,2,2,2,2,2,  # 88 - 8f
+2,2,2,2,2,2,2,2,  # 90 - 97
+2,2,2,2,2,2,2,2,  # 98 - 9f
+2,2,2,2,2,2,2,2,  # a0 - a7
+2,2,2,2,2,2,2,2,  # a8 - af
+2,2,2,2,2,2,2,2,  # b0 - b7
+2,2,2,2,2,2,2,2,  # b8 - bf
+2,2,2,2,2,2,2,2,  # c0 - c7
+2,2,2,2,2,2,2,2,  # c8 - cf
+2,2,2,2,2,2,2,2,  # d0 - d7
+2,2,2,2,2,2,2,2,  # d8 - df
+2,2,2,2,2,2,2,2,  # e0 - e7
+2,2,2,2,2,2,2,2,  # e8 - ef
+2,2,2,2,2,2,2,2,  # f0 - f7
+2,2,2,2,2,2,2,2,  # f8 - ff
+)
+
+ISO2022JP_ST = (
+MachineState.START,     3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07
+MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17
+MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f
+MachineState.ERROR,     5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     4,MachineState.ERROR,MachineState.ERROR,# 20-27
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47
+)
+
+ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+
+ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS,
+                      'class_factor': 10,
+                      'state_table': ISO2022JP_ST,
+                      'char_len_table': ISO2022JP_CHAR_LEN_TABLE,
+                      'name': "ISO-2022-JP",
+                      'language': 'Japanese'}
+
+ISO2022KR_CLS = (
+2,0,0,0,0,0,0,0,  # 00 - 07
+0,0,0,0,0,0,0,0,  # 08 - 0f
+0,0,0,0,0,0,0,0,  # 10 - 17
+0,0,0,1,0,0,0,0,  # 18 - 1f
+0,0,0,0,3,0,0,0,  # 20 - 27
+0,4,0,0,0,0,0,0,  # 28 - 2f
+0,0,0,0,0,0,0,0,  # 30 - 37
+0,0,0,0,0,0,0,0,  # 38 - 3f
+0,0,0,5,0,0,0,0,  # 40 - 47
+0,0,0,0,0,0,0,0,  # 48 - 4f
+0,0,0,0,0,0,0,0,  # 50 - 57
+0,0,0,0,0,0,0,0,  # 58 - 5f
+0,0,0,0,0,0,0,0,  # 60 - 67
+0,0,0,0,0,0,0,0,  # 68 - 6f
+0,0,0,0,0,0,0,0,  # 70 - 77
+0,0,0,0,0,0,0,0,  # 78 - 7f
+2,2,2,2,2,2,2,2,  # 80 - 87
+2,2,2,2,2,2,2,2,  # 88 - 8f
+2,2,2,2,2,2,2,2,  # 90 - 97
+2,2,2,2,2,2,2,2,  # 98 - 9f
+2,2,2,2,2,2,2,2,  # a0 - a7
+2,2,2,2,2,2,2,2,  # a8 - af
+2,2,2,2,2,2,2,2,  # b0 - b7
+2,2,2,2,2,2,2,2,  # b8 - bf
+2,2,2,2,2,2,2,2,  # c0 - c7
+2,2,2,2,2,2,2,2,  # c8 - cf
+2,2,2,2,2,2,2,2,  # d0 - d7
+2,2,2,2,2,2,2,2,  # d8 - df
+2,2,2,2,2,2,2,2,  # e0 - e7
+2,2,2,2,2,2,2,2,  # e8 - ef
+2,2,2,2,2,2,2,2,  # f0 - f7
+2,2,2,2,2,2,2,2,  # f8 - ff
+)
+
+ISO2022KR_ST = (
+MachineState.START,     3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f
+MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     4,MachineState.ERROR,MachineState.ERROR,# 10-17
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27
+)
+
+ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0)
+
+ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS,
+                      'class_factor': 6,
+                      'state_table': ISO2022KR_ST,
+                      'char_len_table': ISO2022KR_CHAR_LEN_TABLE,
+                      'name': "ISO-2022-KR",
+                      'language': 'Korean'}
+
+
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/eucjpprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/eucjpprober.py
new file mode 100644
index 0000000000000000000000000000000000000000..20ce8f7d15bad9d48a3e0363de2286093a4a28cc
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/eucjpprober.py
@@ -0,0 +1,92 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .enums import ProbingState, MachineState
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import EUCJPDistributionAnalysis
+from .jpcntx import EUCJPContextAnalysis
+from .mbcssm import EUCJP_SM_MODEL
+
+
+class EUCJPProber(MultiByteCharSetProber):
+    def __init__(self):
+        super(EUCJPProber, self).__init__()
+        self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL)
+        self.distribution_analyzer = EUCJPDistributionAnalysis()
+        self.context_analyzer = EUCJPContextAnalysis()
+        self.reset()
+
+    def reset(self):
+        super(EUCJPProber, self).reset()
+        self.context_analyzer.reset()
+
+    @property
+    def charset_name(self):
+        return "EUC-JP"
+
+    @property
+    def language(self):
+        return "Japanese"
+
+    def feed(self, byte_str):
+        for i in range(len(byte_str)):
+            # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte
+            coding_state = self.coding_sm.next_state(byte_str[i])
+            if coding_state == MachineState.ERROR:
+                self.logger.debug('%s %s prober hit error at byte %s',
+                                  self.charset_name, self.language, i)
+                self._state = ProbingState.NOT_ME
+                break
+            elif coding_state == MachineState.ITS_ME:
+                self._state = ProbingState.FOUND_IT
+                break
+            elif coding_state == MachineState.START:
+                char_len = self.coding_sm.get_current_charlen()
+                if i == 0:
+                    self._last_char[1] = byte_str[0]
+                    self.context_analyzer.feed(self._last_char, char_len)
+                    self.distribution_analyzer.feed(self._last_char, char_len)
+                else:
+                    self.context_analyzer.feed(byte_str[i - 1:i + 1],
+                                                char_len)
+                    self.distribution_analyzer.feed(byte_str[i - 1:i + 1],
+                                                     char_len)
+
+        self._last_char[0] = byte_str[-1]
+
+        if self.state == ProbingState.DETECTING:
+            if (self.context_analyzer.got_enough_data() and
+               (self.get_confidence() > self.SHORTCUT_THRESHOLD)):
+                self._state = ProbingState.FOUND_IT
+
+        return self.state
+
+    def get_confidence(self):
+        context_conf = self.context_analyzer.get_confidence()
+        distrib_conf = self.distribution_analyzer.get_confidence()
+        return max(context_conf, distrib_conf)
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/euckrfreq.py b/vendor/pip-9.0.3/pip/_vendor/chardet/euckrfreq.py
new file mode 100644
index 0000000000000000000000000000000000000000..b68078cb9680de4cca65b1145632a37c5e751c38
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/euckrfreq.py
@@ -0,0 +1,195 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# Sampling from about 20M text materials include literature and computer technology
+
+# 128  --> 0.79
+# 256  --> 0.92
+# 512  --> 0.986
+# 1024 --> 0.99944
+# 2048 --> 0.99999
+#
+# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24
+# Random Distribution Ration = 512 / (2350-512) = 0.279.
+#
+# Typical Distribution Ratio
+
+EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0
+
+EUCKR_TABLE_SIZE = 2352
+
+# Char to FreqOrder table ,
+EUCKR_CHAR_TO_FREQ_ORDER = (
+  13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722,  87,
+1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398,
+1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488,  20,1733,1269,1734,
+ 945,1400,1735,  47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739,
+ 116, 987, 813,1401, 683,  75,1204, 145,1740,1741,1742,1743,  16, 847, 667, 622,
+ 708,1744,1745,1746, 966, 787, 304, 129,1747,  60, 820, 123, 676,1748,1749,1750,
+1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856,
+ 344,1763,1764,1765,1766,  89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205,
+ 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779,
+1780, 337, 751,1058,  28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782,  19,
+1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567,
+1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797,
+1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802,
+1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899,
+ 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818,
+1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409,
+1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697,
+1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770,
+1412,1837,1838,  39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723,
+ 544,1023,1081, 869,  91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416,
+1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300,
+ 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083,
+ 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857,
+1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871,
+ 282,  96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420,
+1421, 268,1877,1422,1878,1879,1880, 308,1881,   2, 537,1882,1883,1215,1884,1885,
+ 127, 791,1886,1273,1423,1887,  34, 336, 404, 643,1888, 571, 654, 894, 840,1889,
+   0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893,
+1894,1123,  48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317,
+1899, 694,1900, 909, 734,1424, 572, 866,1425, 691,  85, 524,1010, 543, 394, 841,
+1901,1902,1903,1026,1904,1905,1906,1907,1908,1909,  30, 451, 651, 988, 310,1910,
+1911,1426, 810,1216,  93,1912,1913,1277,1217,1914, 858, 759,  45,  58, 181, 610,
+ 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375,
+1919, 359,1920, 687,1921, 822,1922, 293,1923,1924,  40, 662, 118, 692,  29, 939,
+ 887, 640, 482, 174,1925,  69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870,
+ 217, 854,1163, 823,1927,1928,1929,1930, 834,1931,  78,1932, 859,1933,1063,1934,
+1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888,
+1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950,
+1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065,
+1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002,
+1283,1222,1960,1961,1962,1963,  36, 383, 228, 753, 247, 454,1964, 876, 678,1965,
+1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467,
+  50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285,
+ 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971,   7,
+ 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979,
+1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985,
+ 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994,
+1995, 560, 223,1287,  98,   8, 189, 650, 978,1288,1996,1437,1997,  17, 345, 250,
+ 423, 277, 234, 512, 226,  97, 289,  42, 167,1998, 201,1999,2000, 843, 836, 824,
+ 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003,
+2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008,  71,1440, 745,
+ 619, 688,2009, 829,2010,2011, 147,2012,  33, 948,2013,2014,  74, 224,2015,  61,
+ 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023,
+2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591,  52, 724, 246,2031,2032,
+2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912,
+2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224,
+ 719,1170, 959, 440, 437, 534,  84, 388, 480,1131, 159, 220, 198, 679,2044,1012,
+ 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050,
+2051,2052,2053,  59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681,
+ 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414,
+1444,2064,2065,  41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068,
+2069,1292,2070,2071,1445,2072,1446,2073,2074,  55, 588,  66,1447, 271,1092,2075,
+1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850,
+2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606,
+2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449,
+1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452,
+ 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112,
+2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121,
+2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130,
+  22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174,  73,1096, 231, 274,
+ 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139,
+2141,2142,2143,2144,  11, 374, 844,2145, 154,1232,  46,1461,2146, 838, 830, 721,
+1233, 106,2147,  90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298,
+2150,1462, 761, 565,2151, 686,2152, 649,2153,  72, 173,2154, 460, 415,2155,1463,
+2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747,
+2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177,  23, 530, 285,
+2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187,
+2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193,  10,
+2194, 613, 424,2195, 979, 108, 449, 589,  27, 172,  81,1031,  80, 774, 281, 350,
+1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201,
+2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972,
+2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219,
+2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233,
+2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242,
+2243, 521, 486, 548,2244,2245,2246,1473,1300,  53, 549, 137, 875,  76, 158,2247,
+1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178,
+1475,2249,  82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255,
+2256,  18, 450, 206,2257, 290, 292,1142,2258, 511, 162,  99, 346, 164, 735,2259,
+1476,1477,   4, 554, 343, 798,1099,2260,1100,2261,  43, 171,1303, 139, 215,2262,
+2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702,
+1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272,  67,2273,
+ 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541,
+2282,2283,2284,2285,2286,  70, 852,1071,2287,2288,2289,2290,  21,  56, 509, 117,
+ 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187,
+2294,1046,1479,2295, 340,2296,  63,1047, 230,2297,2298,1305, 763,1306, 101, 800,
+ 808, 494,2299,2300,2301, 903,2302,  37,1072,  14,   5,2303,  79, 675,2304, 312,
+2305,2306,2307,2308,2309,1480,   6,1307,2310,2311,2312,   1, 470,  35,  24, 229,
+2313, 695, 210,  86, 778,  15, 784, 592, 779,  32,  77, 855, 964,2314, 259,2315,
+ 501, 380,2316,2317,  83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484,
+2320,2321,2322,2323,2324,2325,1485,2326,2327, 128,  57,  68, 261,1048, 211, 170,
+1240,  31,2328,  51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335,
+ 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601,
+1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395,
+2351,1490,1491,  62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354,
+1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476,
+2361,2362, 332,  12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035,
+ 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498,
+2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310,
+1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389,
+2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504,
+1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505,
+2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145,
+1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624,
+ 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700,
+2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221,
+2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377,
+ 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448,
+ 915, 489,2449,1514,1184,2450,2451, 515,  64, 427, 495,2452, 583,2453, 483, 485,
+1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705,
+1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465,
+ 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471,
+2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997,
+2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486,
+ 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187,  65,2494,
+ 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771,
+ 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323,
+2499,2500,  49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491,
+  95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510,
+ 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519,
+2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532,
+2533,  25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199,
+ 704, 504, 468, 758, 657,1528, 196,  44, 839,1246, 272, 750,2543, 765, 862,2544,
+2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247,
+1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441,
+ 249,1075,2556,2557,2558, 466, 743,2559,2560,2561,  92, 514, 426, 420, 526,2562,
+2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362,
+2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583,
+2584,1532,  54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465,
+   3, 458,   9,  38,2588, 107, 110, 890, 209,  26, 737, 498,2589,1534,2590, 431,
+ 202,  88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151,
+ 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596,
+2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601,  94, 175, 197, 406,
+2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611,
+2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619,
+1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628,
+2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042,
+ 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642,  # 512, 256
+)
+
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/euckrprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/euckrprober.py
new file mode 100644
index 0000000000000000000000000000000000000000..345a060d0230ada58f769b0f6b55f43a428fc3bd
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/euckrprober.py
@@ -0,0 +1,47 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import EUCKRDistributionAnalysis
+from .mbcssm import EUCKR_SM_MODEL
+
+
+class EUCKRProber(MultiByteCharSetProber):
+    def __init__(self):
+        super(EUCKRProber, self).__init__()
+        self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL)
+        self.distribution_analyzer = EUCKRDistributionAnalysis()
+        self.reset()
+
+    @property
+    def charset_name(self):
+        return "EUC-KR"
+
+    @property
+    def language(self):
+        return "Korean"
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/euctwfreq.py b/vendor/pip-9.0.3/pip/_vendor/chardet/euctwfreq.py
new file mode 100644
index 0000000000000000000000000000000000000000..ed7a995a3aa311583efa5a47e316d4490e5f3463
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/euctwfreq.py
@@ -0,0 +1,387 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# EUCTW frequency table
+# Converted from big5 work
+# by Taiwan's Mandarin Promotion Council
+# <http:#www.edu.tw:81/mandr/>
+
+# 128  --> 0.42261
+# 256  --> 0.57851
+# 512  --> 0.74851
+# 1024 --> 0.89384
+# 2048 --> 0.97583
+#
+# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98
+# Random Distribution Ration = 512/(5401-512)=0.105
+#
+# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
+
+EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75
+
+# Char to FreqOrder table ,
+EUCTW_TABLE_SIZE = 5376
+
+EUCTW_CHAR_TO_FREQ_ORDER = (
+   1,1800,1506, 255,1431, 198,   9,  82,   6,7310, 177, 202,3615,1256,2808, 110,  # 2742
+3735,  33,3241, 261,  76,  44,2113,  16,2931,2184,1176, 659,3868,  26,3404,2643,  # 2758
+1198,3869,3313,4060, 410,2211, 302, 590, 361,1963,   8, 204,  58,4296,7311,1931,  # 2774
+  63,7312,7313, 317,1614,  75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809,  # 2790
+3616,   3,  10,3870,1471,  29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315,  # 2806
+4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932,  34,3501,3173,  64, 604,  # 2822
+7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337,  72, 406,7319,  80,  # 2838
+ 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449,  69,2969, 591,  # 2854
+ 179,2095, 471, 115,2034,1843,  60,  50,2970, 134, 806,1868, 734,2035,3407, 180,  # 2870
+ 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359,  # 2886
+2495,  90,2707,1338, 663,  11, 906,1099,2545,  20,2436, 182, 532,1716,7321, 732,  # 2902
+1376,4062,1311,1420,3175,  25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529,  # 2918
+3243, 475,1447,3617,7322, 117,  21, 656, 810,1297,2295,2329,3502,7323, 126,4063,  # 2934
+ 706, 456, 150, 613,4299,  71,1118,2036,4064, 145,3069,  85, 835, 486,2114,1246,  # 2950
+1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221,  # 2966
+3503,3110,7325,1955,1153,4065,  83, 296,1199,3070, 192, 624,  93,7326, 822,1897,  # 2982
+2810,3111, 795,2064, 991,1554,1542,1592,  27,  43,2853, 859, 139,1456, 860,4300,  # 2998
+ 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618,  # 3014
+3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228,  # 3030
+1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077,  # 3046
+7328,7329,2173,3176,3619,2673, 593, 845,1062,3244,  88,1723,2037,3875,1950, 212,  # 3062
+ 266, 152, 149, 468,1898,4066,4302,  77, 187,7330,3018,  37,   5,2972,7331,3876,  # 3078
+7332,7333,  39,2517,4303,2894,3177,2078,  55, 148,  74,4304, 545, 483,1474,1029,  # 3094
+1665, 217,1869,1531,3113,1104,2645,4067,  24, 172,3507, 900,3877,3508,3509,4305,  # 3110
+  32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674,   4,3019,3314,1427,1788,  # 3126
+ 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520,  # 3142
+3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439,  38,7339,1063,7340, 794,  # 3158
+3879,1435,2296,  46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804,  35, 707,  # 3174
+ 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409,  # 3190
+2128,1363,3623,1423, 697, 100,3071,  48,  70,1231, 495,3114,2193,7345,1294,7346,  # 3206
+2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411,  # 3222
+ 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412,  # 3238
+ 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933,  # 3254
+3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895,  # 3270
+1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369,  # 3286
+1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000,  # 3302
+1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381,   7,  # 3318
+2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313,  # 3334
+ 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513,  # 3350
+4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647,  # 3366
+1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357,  # 3382
+7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438,  # 3398
+2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978,  # 3414
+ 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210,  # 3430
+  98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642,  # 3446
+ 523,2776,2777,2648,7364, 141,2231,1333,  68, 176, 441, 876, 907,4077, 603,2592,  # 3462
+ 710, 171,3417, 404, 549,  18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320,  # 3478
+7366,2973, 368,7367, 146, 366,  99, 871,3627,1543, 748, 807,1586,1185,  22,2258,  # 3494
+ 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702,  # 3510
+1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371,  59,7372,  # 3526
+ 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836,  # 3542
+ 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629,  # 3558
+7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686,  # 3574
+1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496,  # 3590
+ 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560,  # 3606
+3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496,  # 3622
+4081,  57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082,  # 3638
+3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083,  # 3654
+ 279,3120,  51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264,  # 3670
+ 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411,  # 3686
+1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483,  # 3702
+4084,2468,1436, 953,4085,2054,4331, 671,2395,  79,4086,2441,3252, 608, 567,2680,  # 3718
+3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672,  # 3734
+3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681,  # 3750
+2397,7400,7401,7402,4089,3025,   0,7403,2469, 315, 231,2442, 301,3319,4335,2380,  # 3766
+7404, 233,4090,3631,1818,4336,4337,7405,  96,1776,1315,2082,7406, 257,7407,1809,  # 3782
+3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183,  # 3798
+7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934,  # 3814
+1484,7413,1712, 127,  67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351,  # 3830
+2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545,  # 3846
+1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358,  # 3862
+  78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338,  # 3878
+1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423,  # 3894
+4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859,  # 3910
+3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636,  # 3926
+ 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344,  # 3942
+ 165, 243,4345,3637,2521, 123, 683,4096, 764,4346,  36,3895,1792, 589,2902, 816,  # 3958
+ 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891,  # 3974
+2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662,  # 3990
+7425, 611,1156, 854,2381,1316,2861,   2, 386, 515,2904,7426,7427,3253, 868,2234,  # 4006
+1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431,  # 4022
+2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676,  # 4038
+1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437,  # 4054
+1993,7438,4350,7439,7440,2195,  13,2779,3638,2980,3124,1229,1916,7441,3756,2131,  # 4070
+7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307,  # 4086
+7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519,  # 4102
+7452, 128,2132,  92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980,  # 4118
+3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401,  # 4134
+4353,2248,  94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101,  # 4150
+1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937,  # 4166
+7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466,  # 4182
+2332,2067,  23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526,  # 4198
+7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598,  # 4214
+3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471,  # 4230
+3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863,  41,7473,  # 4246
+7474,4361,7475,1657,2333,  19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323,  # 4262
+2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416,  # 4278
+7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427,  # 4294
+ 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110,  # 4310
+4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485,  # 4326
+2683, 733,  40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428,  # 4342
+7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907,  # 4358
+3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901,  # 4374
+2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870,  # 4390
+2752,2986,7490, 435,7491, 343,1108, 596,  17,1751,4365,2235,3430,3643,7492,4366,  # 4406
+ 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031,  # 4422
+2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240,  # 4438
+1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521,  # 4454
+1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673,  # 4470
+2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260,  # 4486
+1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619,  # 4502
+7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506,  # 4518
+7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382,  # 4534
+2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324,  # 4550
+4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384,  # 4566
+1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551,  30,2263,4122,  # 4582
+7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192,  # 4598
+ 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388,  # 4614
+4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129,  # 4630
+ 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523,  # 4646
+2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692,  # 4662
+ 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915,  # 4678
+1041,2987, 293,1168,  87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219,  # 4694
+1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825,  # 4710
+ 730,1515, 184,2827,  66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975,  # 4726
+3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394,  # 4742
+3918,7535,7536,1186,  15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758,  # 4758
+1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434,  # 4774
+3541,1342,1681,1718, 766,3264, 286,  89,2946,3649,7540,1713,7541,2597,3334,2990,  # 4790
+7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335,  # 4806
+7544,3265, 310, 313,3435,2299, 770,4134,  54,3034, 189,4397,3082,3769,3922,7545,  # 4822
+1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137,  # 4838
+2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471,  # 4854
+1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555,  # 4870
+3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139,  # 4886
+2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729,  # 4902
+3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482,  # 4918
+2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652,  # 4934
+4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867,  # 4950
+4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499,  # 4966
+3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250,  # 4982
+  97,  81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830,  # 4998
+3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188,  # 5014
+ 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408,  # 5030
+3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447,  # 5046
+3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527,  # 5062
+3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932,  # 5078
+1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411,  # 5094
+7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270,  # 5110
+ 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589,  # 5126
+7590, 587,  14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591,  # 5142
+1702,1226, 102,1547,  62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756,  # 5158
+ 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145,  # 5174
+4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598,  86,1494,1730,  # 5190
+3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069,  # 5206
+ 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938,  # 5222
+2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625,  # 5238
+2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885,  28,2686,  # 5254
+3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797,  # 5270
+1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958,  # 5286
+4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528,  # 5302
+2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241,  # 5318
+1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169,  # 5334
+1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540,  # 5350
+2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342,  # 5366
+3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425,  # 5382
+1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427,  # 5398
+7617,3446,7618,7619,7620,3277,2689,1433,3278, 131,  95,1504,3946, 723,4159,3141,  # 5414
+1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949,  # 5430
+4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654,  53,7624,2996,7625,  # 5446
+1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202,  # 5462
+ 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640,  # 5478
+1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936,  # 5494
+3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955,  # 5510
+3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910,  # 5526
+2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325,  # 5542
+1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024,  # 5558
+4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340,  # 5574
+ 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918,  # 5590
+7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439,  # 5606
+2317,3283,7650,7651,4164,7652,4165,  84,4166, 112, 989,7653, 547,1059,3961, 701,  # 5622
+3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494,  # 5638
+4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285,  # 5654
+ 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077,  # 5670
+7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443,  # 5686
+7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169,  # 5702
+1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906,  # 5718
+4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968,  # 5734
+3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804,  # 5750
+2690,1516,3559,1121,1082,1329,3284,3970,1449,3794,  65,1128,2835,2913,2759,1590,  # 5766
+3795,7674,7675,  12,2658,  45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676,  # 5782
+3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680,  # 5798
+2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285,  # 5814
+1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687,  # 5830
+4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454,  # 5846
+3670,1858,  91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403,  # 5862
+3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973,  # 5878
+2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454,  # 5894
+4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761,  61,3976,3672,1822,3977,  # 5910
+7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695,  # 5926
+3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945,  # 5942
+2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460,  # 5958
+3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179,  # 5974
+1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706,  # 5990
+2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982,  # 6006
+3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183,  # 6022
+4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043,  56,1396,3090,  # 6038
+2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717,  # 6054
+2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985,  # 6070
+7722,1076,  49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184,  # 6086
+1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472,  # 6102
+2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351,  # 6118
+1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714,  # 6134
+3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404,  # 6150
+4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629,  31,2838,  # 6166
+2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620,  # 6182
+3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738,  # 6198
+3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869,  # 6214
+2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558,  # 6230
+4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107,  # 6246
+2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216,  # 6262
+3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984,  # 6278
+4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705,  # 6294
+7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687,  # 6310
+3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840,  # 6326
+ 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521,  # 6342
+1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412,  42,3096, 464,7759,2632,  # 6358
+4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295,  # 6374
+1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765,  # 6390
+4487,7766,3002, 962, 588,3574, 289,3219,2634,1116,  52,7767,3047,1796,7768,7769,  # 6406
+7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572,  # 6422
+ 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776,  # 6438
+7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911,  # 6454
+2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693,  # 6470
+1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672,  # 6486
+1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013,  # 6502
+3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816,  # 6518
+ 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010,  # 6534
+ 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175,  # 6550
+ 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473,  # 6566
+3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298,  # 6582
+2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359,  # 6598
+ 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805,  # 6614
+7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807,  # 6630
+1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810,  # 6646
+3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812,  # 6662
+7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814,  # 6678
+1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818,  # 6694
+7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821,  # 6710
+4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877,  # 6726
+1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702,  # 6742
+2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813,  # 6758
+2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503,  # 6774
+4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484,  # 6790
+ 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833,  # 6806
+ 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457,  # 6822
+3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704,  # 6838
+3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878,  # 6854
+1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508,  # 6870
+2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451,  # 6886
+7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509,  # 6902
+1561,2664,1452,4010,1375,7855,7856,  47,2959, 316,7857,1406,1591,2923,3156,7858,  # 6918
+1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428,  # 6934
+3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800,  # 6950
+ 919,2347,2960,2348,1270,4511,4012,  73,7862,7863, 647,7864,3228,2843,2255,1550,  # 6966
+1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347,  # 6982
+4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515,  # 6998
+7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665,  # 7014
+2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518,  # 7030
+3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833,  # 7046
+ 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961,  # 7062
+1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508,  # 7078
+2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482,  # 7094
+2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098,  # 7110
+7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483,  # 7126
+7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834,  # 7142
+7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904,  # 7158
+2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724,  # 7174
+2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910,  # 7190
+1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701,  # 7206
+4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062,  # 7222
+3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922,  # 7238
+3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925,  # 7254
+4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248,  # 7270
+4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487,  # 7286
+2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015,  # 7302
+2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935,  # 7318
+7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104,  # 7334
+4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580,  # 7350
+7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380,  # 7366
+2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951,  # 7382
+1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948,  # 7398
+3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488,  # 7414
+4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737,  # 7430
+2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017,  # 7446
+ 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047,  # 7462
+2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967,  # 7478
+1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385,  # 7494
+2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975,  # 7510
+2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979,  # 7526
+4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982,  # 7542
+7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306,  # 7558
+1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270,  # 7574
+3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012,  # 7590
+7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236,  # 7606
+1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550,  # 7622
+8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746,  # 7638
+2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066,  # 7654
+8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977,  # 7670
+2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009,  # 7686
+2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013,  # 7702
+8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552,  # 7718
+8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023,  # 7734
+8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143,  # 7750
+ 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278,  # 7766
+8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698,  # 7782
+4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706,  # 7798
+3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859,  # 7814
+8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344,  # 7830
+1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894,  # 7846
+8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194,  # 7862
+ 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760,  # 7878
+1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210,  # 7894
+ 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642,  # 7910
+4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013,  # 7926
+1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889,  # 7942
+4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239,  # 7958
+1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240,  # 7974
+ 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083,  # 7990
+3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088,  # 8006
+4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094,  # 8022
+8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101,  # 8038
+ 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104,  # 8054
+3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015,  # 8070
+ 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941,  # 8086
+2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118,  # 8102
+)
+
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/euctwprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/euctwprober.py
new file mode 100644
index 0000000000000000000000000000000000000000..35669cc4dd809fa4007ee67c752f1be991135e77
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/euctwprober.py
@@ -0,0 +1,46 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import EUCTWDistributionAnalysis
+from .mbcssm import EUCTW_SM_MODEL
+
+class EUCTWProber(MultiByteCharSetProber):
+    def __init__(self):
+        super(EUCTWProber, self).__init__()
+        self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL)
+        self.distribution_analyzer = EUCTWDistributionAnalysis()
+        self.reset()
+
+    @property
+    def charset_name(self):
+        return "EUC-TW"
+
+    @property
+    def language(self):
+        return "Taiwan"
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/gb2312freq.py b/vendor/pip-9.0.3/pip/_vendor/chardet/gb2312freq.py
new file mode 100644
index 0000000000000000000000000000000000000000..697837bd9a87a77fc468fd1f10dd470d01701362
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/gb2312freq.py
@@ -0,0 +1,283 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# GB2312 most frequently used character table
+#
+# Char to FreqOrder table , from hz6763
+
+# 512  --> 0.79  -- 0.79
+# 1024 --> 0.92  -- 0.13
+# 2048 --> 0.98  -- 0.06
+# 6768 --> 1.00  -- 0.02
+#
+# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79
+# Random Distribution Ration = 512 / (3755 - 512) = 0.157
+#
+# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR
+
+GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9
+
+GB2312_TABLE_SIZE = 3760
+
+GB2312_CHAR_TO_FREQ_ORDER = (
+1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205,
+2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842,
+2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409,
+ 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670,
+1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820,
+1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585,
+ 152,1687,1539, 738,1559,  59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566,
+1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850,  70,3285,2729,3534,3575,
+2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853,
+3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061,
+ 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155,
+1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406,
+ 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816,
+2534,1546,2393,2760, 737,2494,  13, 447, 245,2747,  38,2765,2129,2589,1079, 606,
+ 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023,
+2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414,
+1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513,
+3195,4115,5627,2489,2991,  24,2065,2697,1087,2719,  48,1634, 315,  68, 985,2052,
+ 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570,
+1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575,
+ 253,3099,  32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250,
+2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506,
+1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563,  26,
+3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835,
+1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686,
+2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054,
+1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894,
+ 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105,
+3777,3657, 643,2298,1148,1779, 190, 989,3544, 414,  11,2135,2063,2979,1471, 403,
+3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694,
+ 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873,
+3651, 210,  33,1608,2516, 200,1520, 415, 102,   0,3389,1287, 817,  91,3299,2940,
+ 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687,  20,1819, 121,
+1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648,
+3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992,
+2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680,  72, 842,1990, 212,1233,
+1154,1586,  75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157,
+ 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807,
+1910, 534, 529,3309,1721,1660, 274,  39,2827, 661,2670,1578, 925,3248,3815,1094,
+4278,4901,4252,  41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258,
+ 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478,
+3568, 194,5062,  15, 961,3870,1241,1192,2664,  66,5215,3260,2111,1295,1127,2152,
+3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426,  53,2909,
+ 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272,
+1272,2363, 284,1753,3679,4064,1695,  81, 815,2677,2757,2731,1386, 859, 500,4221,
+2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252,
+1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301,
+1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254,
+ 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070,
+3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461,
+3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640,  67,2360,
+4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124,
+ 296,3979,1739,1611,3684,  23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535,
+3116,  17,1074, 467,2692,2201, 387,2922,  45,1326,3055,1645,3659,2817, 958, 243,
+1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713,
+1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071,
+4046,3572,2399,1571,3281,  79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442,
+ 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946,
+ 814,4968,3487,1548,2644,1567,1285,   2, 295,2636,  97, 946,3576, 832, 141,4257,
+3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180,
+1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427,
+ 602,1525,2608,1605,1639,3175, 694,3064,  10, 465,  76,2000,4846,4208, 444,3781,
+1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724,
+2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844,  89, 937,
+ 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943,
+ 432, 445,2811, 206,4136,1472, 730, 349,  73, 397,2802,2547, 998,1637,1167, 789,
+ 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552,
+3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246,
+4996, 371,1575,2436,1621,2210, 984,4033,1734,2638,  16,4529, 663,2755,3255,1451,
+3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310,
+ 750,2058, 165,  80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860,
+2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297,
+2357, 395,3740, 137,2075, 944,4089,2584,1267,3802,  62,1533,2285, 178, 176, 780,
+2440, 201,3707, 590, 478,1560,4354,2117,1075,  30,  74,4643,4004,1635,1441,2745,
+ 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936,
+2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032,
+ 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669,  43,2523,1657,
+ 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414,
+ 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976,
+3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436,
+2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254,
+2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024,  40,3240,1536,
+1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238,
+  18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059,
+2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741,
+  90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447,
+ 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601,
+1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269,
+1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076,  46,4253,2873,1889,1894,
+ 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173,
+ 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994,
+1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956,
+2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437,
+3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154,
+2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240,
+2269,2246,1446,  36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143,
+2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634,
+3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472,
+1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906,  51, 369, 170,3541,
+1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143,
+2101,2730,2490,  82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312,
+1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414,
+3750,2289,2795, 813,3123,2610,1136,4368,   5,3391,4541,2174, 420, 429,1728, 754,
+1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424,
+1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302,
+3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739,
+ 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004,
+2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484,
+1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739,
+4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535,
+1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641,
+1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307,
+3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573,
+1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533,
+  47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965,
+ 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096,  99,
+1397,1769,2300,4428,1643,3455,1978,1757,3718,1440,  35,4879,3742,1296,4228,2280,
+ 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505,
+1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012,
+1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039,
+ 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982,
+3708, 135,2131,  87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530,
+4314,   9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392,
+3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656,
+2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220,
+2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766,
+1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535,
+3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728,
+2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338,
+1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627,
+1505,1911,1883,3526, 698,3629,3456,1833,1431, 746,  77,1261,2017,2296,1977,1885,
+ 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411,
+2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671,
+2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162,
+3192,2910,2010, 140,2395,2859,  55,1082,2012,2901, 662, 419,2081,1438, 680,2774,
+4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524,
+3399,  98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346,
+ 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040,
+3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188,
+2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280,
+1086,1974,2034, 630, 257,3338,2788,4903,1017,  86,4790, 966,2789,1995,1696,1131,
+ 259,3095,4188,1308, 179,1463,5257, 289,4107,1248,  42,3413,1725,2288, 896,1947,
+ 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970,
+3034,3310, 540,2370,1562,1288,2990, 502,4765,1147,   4,1853,2708, 207, 294,2814,
+4078,2902,2509, 684,  34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557,
+2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997,
+1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972,
+1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369,
+ 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376,
+1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196,  19, 941,3624,3480,
+3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610,
+ 955,1089,3103,1053,  96,  88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128,
+ 642,4006, 903,2539,1877,2082, 596,  29,4066,1790, 722,2157, 130, 995,1569, 769,
+1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445,  50, 625, 487,2207,
+  57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392,
+1783, 362,   8,3433,3422, 610,2793,3277,1390,1284,1654,  21,3823, 734, 367, 623,
+ 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782,
+2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650,
+ 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478,
+2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773,
+2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007,
+1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323,
+1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598,
+2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961,
+ 819,1541, 142,2284,  44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302,
+1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409,
+1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683,
+2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191,
+2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434,  92,1466,4920,2616,
+3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302,
+1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774,
+4462,  64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147,
+ 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731,
+ 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464,
+3264,2855,2722,1952,1029,2839,2467,  84,4383,2215, 820,1391,2015,2448,3672, 377,
+1948,2168, 797,2545,3536,2578,2645,  94,2874,1678, 405,1259,3071, 771, 546,1315,
+ 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928,  14,2594, 557,
+3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903,
+1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060,
+4031,2641,4067,3145,1870,  37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261,
+1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092,
+2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810,
+1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708,
+ 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658,
+1178,2639,2351,  93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871,
+3341,1618,4126,2595,2334, 603, 651,  69, 701, 268,2662,3411,2555,1380,1606, 503,
+ 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229,
+2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112,
+ 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504,
+1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389,
+1281,  52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169,  27,
+1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542,
+3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861,
+2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845,
+3891,2868,3621,2254,  58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700,
+3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469,
+3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582,
+ 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999,
+2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274,
+ 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020,
+2724,1927,2333,4440, 567,  22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601,
+  12, 974,3783,4391, 951,1412,   1,3720, 453,4608,4041, 528,1041,1027,3230,2628,
+1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040,  31,
+ 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668,
+ 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778,
+1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169,
+3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667,
+3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118,  63,2076, 314,1881,
+1348,1061, 172, 978,3515,1747, 532, 511,3970,   6, 601, 905,2699,3300,1751, 276,
+1467,3725,2668,  65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320,
+3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751,
+2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432,
+2754,  95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772,
+1985, 244,2546, 474, 495,1046,2611,1851,2061,  71,2089,1675,2590, 742,3758,2843,
+3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116,
+ 451,   3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904,
+4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652,
+1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664,
+2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078,  49,3770,
+3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283,
+3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626,
+1197,1663,4476,3127,  85,4240,2528,  25,1111,1181,3673, 407,3470,4561,2679,2713,
+ 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333,
+ 391,2963, 187,  61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062,
+2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555,
+ 931, 317,2517,3027, 325, 569, 686,2107,3084,  60,1042,1333,2794, 264,3177,4014,
+1628, 258,3712,   7,4464,1176,1043,1778, 683, 114,1975,  78,1492, 383,1886, 510,
+ 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015,
+1282,1289,4609, 697,1453,3044,2666,3611,1856,2412,  54, 719,1330, 568,3778,2459,
+1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390,
+1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238,
+1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421,  56,1908,1640,2387,2232,
+1917,1874,2477,4921, 148,  83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624,
+ 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189,
+ 852,1221,1400,1486, 882,2299,4036, 351,  28,1122, 700,6479,6480,6481,6482,6483,  #last 512
+)
+
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/gb2312prober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/gb2312prober.py
new file mode 100644
index 0000000000000000000000000000000000000000..8446d2dd959721cc86d4ae5a7699197454f3aa91
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/gb2312prober.py
@@ -0,0 +1,46 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import GB2312DistributionAnalysis
+from .mbcssm import GB2312_SM_MODEL
+
+class GB2312Prober(MultiByteCharSetProber):
+    def __init__(self):
+        super(GB2312Prober, self).__init__()
+        self.coding_sm = CodingStateMachine(GB2312_SM_MODEL)
+        self.distribution_analyzer = GB2312DistributionAnalysis()
+        self.reset()
+
+    @property
+    def charset_name(self):
+        return "GB2312"
+
+    @property
+    def language(self):
+        return "Chinese"
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/hebrewprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/hebrewprober.py
new file mode 100644
index 0000000000000000000000000000000000000000..b0e1bf49268203d1f9d14cbe73753d95dc66c8a4
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/hebrewprober.py
@@ -0,0 +1,292 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+#          Shy Shalom
+# Portions created by the Initial Developer are Copyright (C) 2005
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetprober import CharSetProber
+from .enums import ProbingState
+
+# This prober doesn't actually recognize a language or a charset.
+# It is a helper prober for the use of the Hebrew model probers
+
+### General ideas of the Hebrew charset recognition ###
+#
+# Four main charsets exist in Hebrew:
+# "ISO-8859-8" - Visual Hebrew
+# "windows-1255" - Logical Hebrew
+# "ISO-8859-8-I" - Logical Hebrew
+# "x-mac-hebrew" - ?? Logical Hebrew ??
+#
+# Both "ISO" charsets use a completely identical set of code points, whereas
+# "windows-1255" and "x-mac-hebrew" are two different proper supersets of
+# these code points. windows-1255 defines additional characters in the range
+# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific
+# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6.
+# x-mac-hebrew defines similar additional code points but with a different
+# mapping.
+#
+# As far as an average Hebrew text with no diacritics is concerned, all four
+# charsets are identical with respect to code points. Meaning that for the
+# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters
+# (including final letters).
+#
+# The dominant difference between these charsets is their directionality.
+# "Visual" directionality means that the text is ordered as if the renderer is
+# not aware of a BIDI rendering algorithm. The renderer sees the text and
+# draws it from left to right. The text itself when ordered naturally is read
+# backwards. A buffer of Visual Hebrew generally looks like so:
+# "[last word of first line spelled backwards] [whole line ordered backwards
+# and spelled backwards] [first word of first line spelled backwards]
+# [end of line] [last word of second line] ... etc' "
+# adding punctuation marks, numbers and English text to visual text is
+# naturally also "visual" and from left to right.
+#
+# "Logical" directionality means the text is ordered "naturally" according to
+# the order it is read. It is the responsibility of the renderer to display
+# the text from right to left. A BIDI algorithm is used to place general
+# punctuation marks, numbers and English text in the text.
+#
+# Texts in x-mac-hebrew are almost impossible to find on the Internet. From
+# what little evidence I could find, it seems that its general directionality
+# is Logical.
+#
+# To sum up all of the above, the Hebrew probing mechanism knows about two
+# charsets:
+# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are
+#    backwards while line order is natural. For charset recognition purposes
+#    the line order is unimportant (In fact, for this implementation, even
+#    word order is unimportant).
+# Logical Hebrew - "windows-1255" - normal, naturally ordered text.
+#
+# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be
+#    specifically identified.
+# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew
+#    that contain special punctuation marks or diacritics is displayed with
+#    some unconverted characters showing as question marks. This problem might
+#    be corrected using another model prober for x-mac-hebrew. Due to the fact
+#    that x-mac-hebrew texts are so rare, writing another model prober isn't
+#    worth the effort and performance hit.
+#
+#### The Prober ####
+#
+# The prober is divided between two SBCharSetProbers and a HebrewProber,
+# all of which are managed, created, fed data, inquired and deleted by the
+# SBCSGroupProber. The two SBCharSetProbers identify that the text is in
+# fact some kind of Hebrew, Logical or Visual. The final decision about which
+# one is it is made by the HebrewProber by combining final-letter scores
+# with the scores of the two SBCharSetProbers to produce a final answer.
+#
+# The SBCSGroupProber is responsible for stripping the original text of HTML
+# tags, English characters, numbers, low-ASCII punctuation characters, spaces
+# and new lines. It reduces any sequence of such characters to a single space.
+# The buffer fed to each prober in the SBCS group prober is pure text in
+# high-ASCII.
+# The two SBCharSetProbers (model probers) share the same language model:
+# Win1255Model.
+# The first SBCharSetProber uses the model normally as any other
+# SBCharSetProber does, to recognize windows-1255, upon which this model was
+# built. The second SBCharSetProber is told to make the pair-of-letter
+# lookup in the language model backwards. This in practice exactly simulates
+# a visual Hebrew model using the windows-1255 logical Hebrew model.
+#
+# The HebrewProber is not using any language model. All it does is look for
+# final-letter evidence suggesting the text is either logical Hebrew or visual
+# Hebrew. Disjointed from the model probers, the results of the HebrewProber
+# alone are meaningless. HebrewProber always returns 0.00 as confidence
+# since it never identifies a charset by itself. Instead, the pointer to the
+# HebrewProber is passed to the model probers as a helper "Name Prober".
+# When the Group prober receives a positive identification from any prober,
+# it asks for the name of the charset identified. If the prober queried is a
+# Hebrew model prober, the model prober forwards the call to the
+# HebrewProber to make the final decision. In the HebrewProber, the
+# decision is made according to the final-letters scores maintained and Both
+# model probers scores. The answer is returned in the form of the name of the
+# charset identified, either "windows-1255" or "ISO-8859-8".
+
+class HebrewProber(CharSetProber):
+    # windows-1255 / ISO-8859-8 code points of interest
+    FINAL_KAF = 0xea
+    NORMAL_KAF = 0xeb
+    FINAL_MEM = 0xed
+    NORMAL_MEM = 0xee
+    FINAL_NUN = 0xef
+    NORMAL_NUN = 0xf0
+    FINAL_PE = 0xf3
+    NORMAL_PE = 0xf4
+    FINAL_TSADI = 0xf5
+    NORMAL_TSADI = 0xf6
+
+    # Minimum Visual vs Logical final letter score difference.
+    # If the difference is below this, don't rely solely on the final letter score
+    # distance.
+    MIN_FINAL_CHAR_DISTANCE = 5
+
+    # Minimum Visual vs Logical model score difference.
+    # If the difference is below this, don't rely at all on the model score
+    # distance.
+    MIN_MODEL_DISTANCE = 0.01
+
+    VISUAL_HEBREW_NAME = "ISO-8859-8"
+    LOGICAL_HEBREW_NAME = "windows-1255"
+
+    def __init__(self):
+        super(HebrewProber, self).__init__()
+        self._final_char_logical_score = None
+        self._final_char_visual_score = None
+        self._prev = None
+        self._before_prev = None
+        self._logical_prober = None
+        self._visual_prober = None
+        self.reset()
+
+    def reset(self):
+        self._final_char_logical_score = 0
+        self._final_char_visual_score = 0
+        # The two last characters seen in the previous buffer,
+        # mPrev and mBeforePrev are initialized to space in order to simulate
+        # a word delimiter at the beginning of the data
+        self._prev = ' '
+        self._before_prev = ' '
+        # These probers are owned by the group prober.
+
+    def set_model_probers(self, logicalProber, visualProber):
+        self._logical_prober = logicalProber
+        self._visual_prober = visualProber
+
+    def is_final(self, c):
+        return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN,
+                     self.FINAL_PE, self.FINAL_TSADI]
+
+    def is_non_final(self, c):
+        # The normal Tsadi is not a good Non-Final letter due to words like
+        # 'lechotet' (to chat) containing an apostrophe after the tsadi. This
+        # apostrophe is converted to a space in FilterWithoutEnglishLetters
+        # causing the Non-Final tsadi to appear at an end of a word even
+        # though this is not the case in the original text.
+        # The letters Pe and Kaf rarely display a related behavior of not being
+        # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak'
+        # for example legally end with a Non-Final Pe or Kaf. However, the
+        # benefit of these letters as Non-Final letters outweighs the damage
+        # since these words are quite rare.
+        return c in [self.NORMAL_KAF, self.NORMAL_MEM,
+                     self.NORMAL_NUN, self.NORMAL_PE]
+
+    def feed(self, byte_str):
+        # Final letter analysis for logical-visual decision.
+        # Look for evidence that the received buffer is either logical Hebrew
+        # or visual Hebrew.
+        # The following cases are checked:
+        # 1) A word longer than 1 letter, ending with a final letter. This is
+        #    an indication that the text is laid out "naturally" since the
+        #    final letter really appears at the end. +1 for logical score.
+        # 2) A word longer than 1 letter, ending with a Non-Final letter. In
+        #    normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi,
+        #    should not end with the Non-Final form of that letter. Exceptions
+        #    to this rule are mentioned above in isNonFinal(). This is an
+        #    indication that the text is laid out backwards. +1 for visual
+        #    score
+        # 3) A word longer than 1 letter, starting with a final letter. Final
+        #    letters should not appear at the beginning of a word. This is an
+        #    indication that the text is laid out backwards. +1 for visual
+        #    score.
+        #
+        # The visual score and logical score are accumulated throughout the
+        # text and are finally checked against each other in GetCharSetName().
+        # No checking for final letters in the middle of words is done since
+        # that case is not an indication for either Logical or Visual text.
+        #
+        # We automatically filter out all 7-bit characters (replace them with
+        # spaces) so the word boundary detection works properly. [MAP]
+
+        if self.state == ProbingState.NOT_ME:
+            # Both model probers say it's not them. No reason to continue.
+            return ProbingState.NOT_ME
+
+        byte_str = self.filter_high_byte_only(byte_str)
+
+        for cur in byte_str:
+            if cur == ' ':
+                # We stand on a space - a word just ended
+                if self._before_prev != ' ':
+                    # next-to-last char was not a space so self._prev is not a
+                    # 1 letter word
+                    if self.is_final(self._prev):
+                        # case (1) [-2:not space][-1:final letter][cur:space]
+                        self._final_char_logical_score += 1
+                    elif self.is_non_final(self._prev):
+                        # case (2) [-2:not space][-1:Non-Final letter][
+                        #  cur:space]
+                        self._final_char_visual_score += 1
+            else:
+                # Not standing on a space
+                if ((self._before_prev == ' ') and
+                        (self.is_final(self._prev)) and (cur != ' ')):
+                    # case (3) [-2:space][-1:final letter][cur:not space]
+                    self._final_char_visual_score += 1
+            self._before_prev = self._prev
+            self._prev = cur
+
+        # Forever detecting, till the end or until both model probers return
+        # ProbingState.NOT_ME (handled above)
+        return ProbingState.DETECTING
+
+    @property
+    def charset_name(self):
+        # Make the decision: is it Logical or Visual?
+        # If the final letter score distance is dominant enough, rely on it.
+        finalsub = self._final_char_logical_score - self._final_char_visual_score
+        if finalsub >= self.MIN_FINAL_CHAR_DISTANCE:
+            return self.LOGICAL_HEBREW_NAME
+        if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE:
+            return self.VISUAL_HEBREW_NAME
+
+        # It's not dominant enough, try to rely on the model scores instead.
+        modelsub = (self._logical_prober.get_confidence()
+                    - self._visual_prober.get_confidence())
+        if modelsub > self.MIN_MODEL_DISTANCE:
+            return self.LOGICAL_HEBREW_NAME
+        if modelsub < -self.MIN_MODEL_DISTANCE:
+            return self.VISUAL_HEBREW_NAME
+
+        # Still no good, back to final letter distance, maybe it'll save the
+        # day.
+        if finalsub < 0.0:
+            return self.VISUAL_HEBREW_NAME
+
+        # (finalsub > 0 - Logical) or (don't know what to do) default to
+        # Logical.
+        return self.LOGICAL_HEBREW_NAME
+
+    @property
+    def language(self):
+        return 'Hebrew'
+
+    @property
+    def state(self):
+        # Remain active as long as any of the model probers are active.
+        if (self._logical_prober.state == ProbingState.NOT_ME) and \
+           (self._visual_prober.state == ProbingState.NOT_ME):
+            return ProbingState.NOT_ME
+        return ProbingState.DETECTING
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/jisfreq.py b/vendor/pip-9.0.3/pip/_vendor/chardet/jisfreq.py
new file mode 100644
index 0000000000000000000000000000000000000000..83fc082b545106d02622de20f2083e8a7562f96c
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/jisfreq.py
@@ -0,0 +1,325 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# Sampling from about 20M text materials include literature and computer technology
+#
+# Japanese frequency table, applied to both S-JIS and EUC-JP
+# They are sorted in order.
+
+# 128  --> 0.77094
+# 256  --> 0.85710
+# 512  --> 0.92635
+# 1024 --> 0.97130
+# 2048 --> 0.99431
+#
+# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58
+# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191
+#
+# Typical Distribution Ratio, 25% of IDR
+
+JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0
+
+# Char to FreqOrder table ,
+JIS_TABLE_SIZE = 4368
+
+JIS_CHAR_TO_FREQ_ORDER = (
+  40,   1,   6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, #   16
+3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247,  18, 179,5071, 856,1661, #   32
+1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, #   48
+2042,1061,1062,  48,  49,  44,  45, 433, 434,1040,1041, 996, 787,2997,1255,4305, #   64
+2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, #   80
+5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, #   96
+1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, #  112
+5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, #  128
+5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, #  144
+5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, #  160
+5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, #  176
+5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, #  192
+5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, #  208
+1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, #  224
+1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, #  240
+1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, #  256
+2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, #  272
+3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161,  26,3377,   2,3929,  20, #  288
+3691,  47,4100,  50,  17,  16,  35, 268,  27, 243,  42, 155,  24, 154,  29, 184, #  304
+   4,  91,  14,  92,  53, 396,  33, 289,   9,  37,  64, 620,  21,  39, 321,   5, #  320
+  12,  11,  52,  13,   3, 208, 138,   0,   7,  60, 526, 141, 151,1069, 181, 275, #  336
+1591,  83, 132,1475, 126, 331, 829,  15,  69, 160,  59,  22, 157,  55,1079, 312, #  352
+ 109,  38,  23,  25,  10,  19,  79,5195,  61, 382,1124,   8,  30,5196,5197,5198, #  368
+5199,5200,5201,5202,5203,5204,5205,5206,  89,  62,  74,  34,2416, 112, 139, 196, #  384
+ 271, 149,  84, 607, 131, 765,  46,  88, 153, 683,  76, 874, 101, 258,  57,  80, #  400
+  32, 364, 121,1508, 169,1547,  68, 235, 145,2999,  41, 360,3027,  70,  63,  31, #  416
+  43, 259, 262,1383,  99, 533, 194,  66,  93, 846, 217, 192,  56, 106,  58, 565, #  432
+ 280, 272, 311, 256, 146,  82, 308,  71, 100, 128, 214, 655, 110, 261, 104,1140, #  448
+  54,  51,  36,  87,  67,3070, 185,2618,2936,2020,  28,1066,2390,2059,5207,5208, #  464
+5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, #  480
+5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, #  496
+5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, #  512
+4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, #  528
+5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, #  544
+5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, #  560
+5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, #  576
+5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, #  592
+5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, #  608
+5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, #  624
+5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, #  640
+5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, #  656
+5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, #  672
+3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, #  688
+5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, #  704
+5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, #  720
+5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, #  736
+5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, #  752
+5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, #  768
+5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, #  784
+5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, #  800
+5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, #  816
+5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, #  832
+5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, #  848
+5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, #  864
+5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, #  880
+5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, #  896
+5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, #  912
+5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, #  928
+5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, #  944
+5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, #  960
+5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, #  976
+5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, #  992
+5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008
+5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024
+5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040
+5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056
+5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072
+5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088
+5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104
+5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120
+5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136
+5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152
+5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168
+5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184
+5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200
+5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216
+5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232
+5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248
+5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264
+5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280
+5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296
+6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312
+6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328
+6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344
+6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360
+6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376
+6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392
+6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408
+6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424
+4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440
+ 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456
+ 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472
+1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619,  65,3302,2045, # 1488
+1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504
+ 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520
+3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536
+3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552
+ 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568
+3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584
+3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600
+ 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616
+2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632
+ 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648
+3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664
+1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680
+ 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696
+1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712
+ 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728
+2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744
+2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760
+2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776
+2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792
+1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808
+1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824
+1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840
+1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856
+2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872
+1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888
+2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904
+1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920
+1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936
+1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952
+1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968
+1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984
+1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000
+ 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016
+ 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032
+1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048
+2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064
+2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080
+2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096
+3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112
+3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128
+ 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144
+3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160
+1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876,  78,2287,1482,1277, # 2176
+ 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192
+2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208
+1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224
+ 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240
+3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256
+4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272
+2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288
+1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304
+2601,1919,1078,  75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320
+1075, 292,3818,1756,2602, 317,  98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336
+ 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352
+ 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368
+1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384
+2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400
+2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416
+2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432
+3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448
+1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464
+2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480
+ 359,2291,1676,  73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496
+ 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512
+ 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528
+1209,  96, 587,2166,1032, 260,1072,2153, 173,  94, 226,3244, 819,2006,4642,4114, # 2544
+2203, 231,1744, 782,  97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560
+ 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576
+1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592
+1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608
+ 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624
+1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640
+1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656
+1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672
+ 764,2861,1853, 688,2429,1920,1462,  77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688
+2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704
+ 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720
+2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736
+3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752
+2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768
+1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784
+6147, 441, 762,1771,3447,3607,3608,1904, 840,3037,  86, 939,1385, 572,1370,2445, # 2800
+1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816
+2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832
+1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848
+ 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864
+  72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880
+3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896
+3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912
+1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928
+1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944
+1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960
+1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976
+ 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992
+ 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008
+2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024
+ 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040
+3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056
+2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072
+ 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088
+1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104
+2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120
+ 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136
+1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152
+ 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168
+4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184
+2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200
+1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216
+ 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232
+1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248
+2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264
+ 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280
+6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296
+1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312
+1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328
+2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344
+3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360
+ 914,2550,2587,  81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376
+3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392
+1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408
+ 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424
+1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440
+ 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456
+3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472
+ 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488
+2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504
+ 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520
+4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536
+2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552
+1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568
+1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584
+1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600
+ 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616
+1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632
+3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648
+1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664
+3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680
+ 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696
+ 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712
+ 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728
+2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744
+1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760
+ 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776
+1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792
+ 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808
+1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824
+ 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840
+ 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856
+ 480,2083,1774,3458, 923,2279,1350, 221,3086,  85,2233,2234,3835,1585,3010,2147, # 3872
+1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888
+1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904
+2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920
+4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936
+ 227,1351,1645,2453,2193,1421,2887, 812,2121, 634,  95,2435, 201,2312,4665,1646, # 3952
+1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968
+ 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984
+1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000
+3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016
+1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032
+2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048
+2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064
+1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080
+1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096
+2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112
+ 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128
+2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144
+1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160
+1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176
+1279,2136,1697,2335, 204, 721,2097,3838,  90,6186,2085,2505, 191,3967, 124,2148, # 4192
+1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208
+3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224
+2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240
+2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256
+ 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272
+3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288
+3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304
+1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320
+2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336
+1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352
+2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368  #last 512
+)
+
+
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/jpcntx.py b/vendor/pip-9.0.3/pip/_vendor/chardet/jpcntx.py
new file mode 100644
index 0000000000000000000000000000000000000000..20044e4bc8f5a9775d82be0ecf387ce752732507
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/jpcntx.py
@@ -0,0 +1,233 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+
+# This is hiragana 2-char sequence table, the number in each cell represents its frequency category
+jp2CharContext = (
+(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1),
+(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4),
+(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),
+(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4),
+(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4),
+(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3),
+(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3),
+(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3),
+(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4),
+(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3),
+(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4),
+(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3),
+(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5),
+(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3),
+(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5),
+(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4),
+(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4),
+(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3),
+(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3),
+(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3),
+(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5),
+(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4),
+(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5),
+(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3),
+(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4),
+(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4),
+(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4),
+(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1),
+(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0),
+(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3),
+(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0),
+(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3),
+(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3),
+(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5),
+(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4),
+(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5),
+(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3),
+(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3),
+(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3),
+(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3),
+(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4),
+(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4),
+(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2),
+(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3),
+(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3),
+(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3),
+(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3),
+(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4),
+(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3),
+(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4),
+(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3),
+(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3),
+(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4),
+(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4),
+(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3),
+(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4),
+(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4),
+(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3),
+(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4),
+(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4),
+(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4),
+(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3),
+(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2),
+(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2),
+(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3),
+(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3),
+(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5),
+(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3),
+(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4),
+(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4),
+(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1),
+(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2),
+(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3),
+(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1),
+)
+
+class JapaneseContextAnalysis(object):
+    NUM_OF_CATEGORY = 6
+    DONT_KNOW = -1
+    ENOUGH_REL_THRESHOLD = 100
+    MAX_REL_THRESHOLD = 1000
+    MINIMUM_DATA_THRESHOLD = 4
+
+    def __init__(self):
+        self._total_rel = None
+        self._rel_sample = None
+        self._need_to_skip_char_num = None
+        self._last_char_order = None
+        self._done = None
+        self.reset()
+
+    def reset(self):
+        self._total_rel = 0  # total sequence received
+        # category counters, each integer counts sequence in its category
+        self._rel_sample = [0] * self.NUM_OF_CATEGORY
+        # if last byte in current buffer is not the last byte of a character,
+        # we need to know how many bytes to skip in next buffer
+        self._need_to_skip_char_num = 0
+        self._last_char_order = -1  # The order of previous char
+        # If this flag is set to True, detection is done and conclusion has
+        # been made
+        self._done = False
+
+    def feed(self, byte_str, num_bytes):
+        if self._done:
+            return
+
+        # The buffer we got is byte oriented, and a character may span in more than one
+        # buffers. In case the last one or two byte in last buffer is not
+        # complete, we record how many byte needed to complete that character
+        # and skip these bytes here.  We can choose to record those bytes as
+        # well and analyse the character once it is complete, but since a
+        # character will not make much difference, by simply skipping
+        # this character will simply our logic and improve performance.
+        i = self._need_to_skip_char_num
+        while i < num_bytes:
+            order, char_len = self.get_order(byte_str[i:i + 2])
+            i += char_len
+            if i > num_bytes:
+                self._need_to_skip_char_num = i - num_bytes
+                self._last_char_order = -1
+            else:
+                if (order != -1) and (self._last_char_order != -1):
+                    self._total_rel += 1
+                    if self._total_rel > self.MAX_REL_THRESHOLD:
+                        self._done = True
+                        break
+                    self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1
+                self._last_char_order = order
+
+    def got_enough_data(self):
+        return self._total_rel > self.ENOUGH_REL_THRESHOLD
+
+    def get_confidence(self):
+        # This is just one way to calculate confidence. It works well for me.
+        if self._total_rel > self.MINIMUM_DATA_THRESHOLD:
+            return (self._total_rel - self._rel_sample[0]) / self._total_rel
+        else:
+            return self.DONT_KNOW
+
+    def get_order(self, byte_str):
+        return -1, 1
+
+class SJISContextAnalysis(JapaneseContextAnalysis):
+    def __init__(self):
+        super(SJISContextAnalysis, self).__init__()
+        self._charset_name = "SHIFT_JIS"
+
+    @property
+    def charset_name(self):
+        return self._charset_name
+
+    def get_order(self, byte_str):
+        if not byte_str:
+            return -1, 1
+        # find out current char's byte length
+        first_char = byte_str[0]
+        if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC):
+            char_len = 2
+            if (first_char == 0x87) or (0xFA <= first_char <= 0xFC):
+                self._charset_name = "CP932"
+        else:
+            char_len = 1
+
+        # return its order if it is hiragana
+        if len(byte_str) > 1:
+            second_char = byte_str[1]
+            if (first_char == 202) and (0x9F <= second_char <= 0xF1):
+                return second_char - 0x9F, char_len
+
+        return -1, char_len
+
+class EUCJPContextAnalysis(JapaneseContextAnalysis):
+    def get_order(self, byte_str):
+        if not byte_str:
+            return -1, 1
+        # find out current char's byte length
+        first_char = byte_str[0]
+        if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE):
+            char_len = 2
+        elif first_char == 0x8F:
+            char_len = 3
+        else:
+            char_len = 1
+
+        # return its order if it is hiragana
+        if len(byte_str) > 1:
+            second_char = byte_str[1]
+            if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3):
+                return second_char - 0xA1, char_len
+
+        return -1, char_len
+
+
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/langbulgarianmodel.py b/vendor/pip-9.0.3/pip/_vendor/chardet/langbulgarianmodel.py
new file mode 100644
index 0000000000000000000000000000000000000000..2aa4fb2e22fc3bfa26b569273c6cb18c4c415dd9
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/langbulgarianmodel.py
@@ -0,0 +1,228 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Character Mapping Table:
+# this table is modified base on win1251BulgarianCharToOrderMap, so
+# only number <64 is sure valid
+
+Latin5_BulgarianCharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82,  # 40
+110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253,  # 50
+253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71,  # 60
+116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253,  # 70
+194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,  # 80
+210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,  # 90
+ 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238,  # a0
+ 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30,  # b0
+ 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56,  # c0
+  1, 18,  9, 20, 11,  3, 23, 15,  2, 26, 12, 10, 14,  6,  4, 13,  # d0
+  7,  8,  5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16,  # e0
+ 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253,  # f0
+)
+
+win1251BulgarianCharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82,  # 40
+110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253,  # 50
+253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71,  # 60
+116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253,  # 70
+206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220,  # 80
+221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229,  # 90
+ 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240,  # a0
+ 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250,  # b0
+ 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30,  # c0
+ 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56,  # d0
+  1, 18,  9, 20, 11,  3, 23, 15,  2, 26, 12, 10, 14,  6,  4, 13,  # e0
+  7,  8,  5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16,  # f0
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 96.9392%
+# first 1024 sequences:3.0618%
+# rest  sequences:     0.2992%
+# negative sequences:  0.0020%
+BulgarianLangModel = (
+0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2,
+3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1,
+0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0,
+0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0,
+0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0,
+0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0,
+0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3,
+2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1,
+3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2,
+1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0,
+3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1,
+1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0,
+2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2,
+2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0,
+3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2,
+1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0,
+2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2,
+2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0,
+3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2,
+1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0,
+2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2,
+2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0,
+2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2,
+1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0,
+2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2,
+1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,
+3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2,
+1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0,
+3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1,
+1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0,
+2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1,
+1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0,
+2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2,
+1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,
+2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1,
+1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
+1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2,
+1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1,
+2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2,
+1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,
+2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2,
+1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1,
+0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2,
+1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1,
+1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,
+1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1,
+0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1,
+0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,
+0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0,
+1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,
+0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
+1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1,
+1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
+1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+)
+
+Latin5BulgarianModel = {
+  'char_to_order_map': Latin5_BulgarianCharToOrderMap,
+  'precedence_matrix': BulgarianLangModel,
+  'typical_positive_ratio': 0.969392,
+  'keep_english_letter': False,
+  'charset_name': "ISO-8859-5",
+  'language': 'Bulgairan',
+}
+
+Win1251BulgarianModel = {
+  'char_to_order_map': win1251BulgarianCharToOrderMap,
+  'precedence_matrix': BulgarianLangModel,
+  'typical_positive_ratio': 0.969392,
+  'keep_english_letter': False,
+  'charset_name': "windows-1251",
+  'language': 'Bulgarian',
+}
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/langcyrillicmodel.py b/vendor/pip-9.0.3/pip/_vendor/chardet/langcyrillicmodel.py
new file mode 100644
index 0000000000000000000000000000000000000000..e5f9a1fd19cca472d785bf90c6395cd11b524766
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/langcyrillicmodel.py
@@ -0,0 +1,333 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# KOI8-R language model
+# Character Mapping Table:
+KOI8R_char_to_order_map = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,  # 80
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,  # 90
+223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237,  # a0
+238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,  # b0
+ 27,  3, 21, 28, 13,  2, 39, 19, 26,  4, 23, 11,  8, 12,  5,  1,  # c0
+ 15, 16,  9,  7,  6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54,  # d0
+ 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34,  # e0
+ 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70,  # f0
+)
+
+win1251_char_to_order_map = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253,
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
+)
+
+latin5_char_to_order_map = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
+239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,
+)
+
+macCyrillic_char_to_order_map = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255,
+)
+
+IBM855_char_to_order_map = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205,
+206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70,
+  3, 37, 21, 44, 28, 58, 13, 41,  2, 48, 39, 53, 19, 46,218,219,
+220,221,222,223,224, 26, 55,  4, 42,225,226,227,228, 23, 60,229,
+230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243,
+  8, 49, 12, 38,  5, 31,  1, 34, 15,244,245,246,247, 35, 16,248,
+ 43,  9, 45,  7, 32,  6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249,
+250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255,
+)
+
+IBM866_char_to_order_map = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
+239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 97.6601%
+# first 1024 sequences: 2.3389%
+# rest  sequences:      0.1237%
+# negative sequences:   0.0009%
+RussianLangModel = (
+0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2,
+3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1,
+0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1,
+0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1,
+1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1,
+1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0,
+2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1,
+1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0,
+3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1,
+1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0,
+2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2,
+1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1,
+1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1,
+1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,
+2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1,
+1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0,
+3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2,
+1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,
+2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1,
+1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0,
+2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1,
+1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0,
+1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1,
+1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0,
+3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1,
+2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1,
+3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1,
+1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,
+1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1,
+0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
+2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1,
+1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0,
+1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,
+0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1,
+1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2,
+2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1,
+1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0,
+1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0,
+2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,
+1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,
+0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,
+2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1,
+1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1,
+1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
+0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
+0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1,
+0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,
+0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,
+0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
+1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1,
+0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,
+2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0,
+0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+)
+
+Koi8rModel = {
+  'char_to_order_map': KOI8R_char_to_order_map,
+  'precedence_matrix': RussianLangModel,
+  'typical_positive_ratio': 0.976601,
+  'keep_english_letter': False,
+  'charset_name': "KOI8-R",
+  'language': 'Russian',
+}
+
+Win1251CyrillicModel = {
+  'char_to_order_map': win1251_char_to_order_map,
+  'precedence_matrix': RussianLangModel,
+  'typical_positive_ratio': 0.976601,
+  'keep_english_letter': False,
+  'charset_name': "windows-1251",
+  'language': 'Russian',
+}
+
+Latin5CyrillicModel = {
+  'char_to_order_map': latin5_char_to_order_map,
+  'precedence_matrix': RussianLangModel,
+  'typical_positive_ratio': 0.976601,
+  'keep_english_letter': False,
+  'charset_name': "ISO-8859-5",
+  'language': 'Russian',
+}
+
+MacCyrillicModel = {
+  'char_to_order_map': macCyrillic_char_to_order_map,
+  'precedence_matrix': RussianLangModel,
+  'typical_positive_ratio': 0.976601,
+  'keep_english_letter': False,
+  'charset_name': "MacCyrillic",
+  'language': 'Russian',
+}
+
+Ibm866Model = {
+  'char_to_order_map': IBM866_char_to_order_map,
+  'precedence_matrix': RussianLangModel,
+  'typical_positive_ratio': 0.976601,
+  'keep_english_letter': False,
+  'charset_name': "IBM866",
+  'language': 'Russian',
+}
+
+Ibm855Model = {
+  'char_to_order_map': IBM855_char_to_order_map,
+  'precedence_matrix': RussianLangModel,
+  'typical_positive_ratio': 0.976601,
+  'keep_english_letter': False,
+  'charset_name': "IBM855",
+  'language': 'Russian',
+}
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/langgreekmodel.py b/vendor/pip-9.0.3/pip/_vendor/chardet/langgreekmodel.py
new file mode 100644
index 0000000000000000000000000000000000000000..533222166cca9fce442655d9f3098126f50e6140
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/langgreekmodel.py
@@ -0,0 +1,225 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Character Mapping Table:
+Latin7_char_to_order_map = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85,  # 40
+ 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253,  # 50
+253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55,  # 60
+ 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253,  # 70
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 80
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 90
+253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253,  # a0
+253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123,  # b0
+110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39,  # c0
+ 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15,  # d0
+124,  1, 29, 20, 21,  3, 32, 13, 25,  5, 11, 16, 10,  6, 30,  4,  # e0
+  9,  8, 14,  7,  2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253,  # f0
+)
+
+win1253_char_to_order_map = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85,  # 40
+ 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253,  # 50
+253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55,  # 60
+ 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253,  # 70
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 80
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 90
+253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253,  # a0
+253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123,  # b0
+110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39,  # c0
+ 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15,  # d0
+124,  1, 29, 20, 21,  3, 32, 13, 25,  5, 11, 16, 10,  6, 30,  4,  # e0
+  9,  8, 14,  7,  2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253,  # f0
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 98.2851%
+# first 1024 sequences:1.7001%
+# rest  sequences:     0.0359%
+# negative sequences:  0.0148%
+GreekLangModel = (
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0,
+3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0,
+2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0,
+0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0,
+2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0,
+2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0,
+0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0,
+2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0,
+0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0,
+3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0,
+3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0,
+2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0,
+2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0,
+0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0,
+0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0,
+0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2,
+0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0,
+0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2,
+0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0,
+0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2,
+0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2,
+0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,
+0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2,
+0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0,
+0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0,
+0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,
+0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0,
+0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2,
+0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0,
+0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2,
+0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2,
+0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,
+0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2,
+0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,
+0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1,
+0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,
+0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2,
+0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2,
+0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2,
+0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,
+0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,
+0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,
+0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0,
+0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0,
+0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+)
+
+Latin7GreekModel = {
+  'char_to_order_map': Latin7_char_to_order_map,
+  'precedence_matrix': GreekLangModel,
+  'typical_positive_ratio': 0.982851,
+  'keep_english_letter': False,
+  'charset_name': "ISO-8859-7",
+  'language': 'Greek',
+}
+
+Win1253GreekModel = {
+  'char_to_order_map': win1253_char_to_order_map,
+  'precedence_matrix': GreekLangModel,
+  'typical_positive_ratio': 0.982851,
+  'keep_english_letter': False,
+  'charset_name': "windows-1253",
+  'language': 'Greek',
+}
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/langhebrewmodel.py b/vendor/pip-9.0.3/pip/_vendor/chardet/langhebrewmodel.py
new file mode 100644
index 0000000000000000000000000000000000000000..58f4c875ec926b85256fd3866369fc8a81a14350
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/langhebrewmodel.py
@@ -0,0 +1,200 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+#          Simon Montagu
+# Portions created by the Initial Developer are Copyright (C) 2005
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#   Shoshannah Forbes - original C code (?)
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Windows-1255 language model
+# Character Mapping Table:
+WIN1255_CHAR_TO_ORDER_MAP = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85,  # 40
+ 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253,  # 50
+253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49,  # 60
+ 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253,  # 70
+124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214,
+215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221,
+ 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227,
+106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234,
+ 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237,
+238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250,
+  9,  8, 20, 16,  3,  2, 24, 14, 22,  1, 25, 15,  4, 11,  6, 23,
+ 12, 19, 13, 26, 18, 27, 21, 17,  7, 10,  5,251,252,128, 96,253,
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 98.4004%
+# first 1024 sequences: 1.5981%
+# rest  sequences:      0.087%
+# negative sequences:   0.0015%
+HEBREW_LANG_MODEL = (
+0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0,
+3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,
+1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,
+1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3,
+1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2,
+1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2,
+1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2,
+0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2,
+0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2,
+1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2,
+0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1,
+0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0,
+0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,
+0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2,
+0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2,
+0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2,
+0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2,
+0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2,
+0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1,
+0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2,
+0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2,
+0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2,
+0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2,
+0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,
+1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2,
+0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0,
+0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3,
+0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0,
+0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0,
+0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,
+0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,
+2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0,
+0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,
+0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0,
+0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1,
+1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1,
+0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1,
+2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1,
+1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1,
+2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1,
+1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1,
+2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,
+0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1,
+1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1,
+0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0,
+)
+
+Win1255HebrewModel = {
+  'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP,
+  'precedence_matrix': HEBREW_LANG_MODEL,
+  'typical_positive_ratio': 0.984004,
+  'keep_english_letter': False,
+  'charset_name': "windows-1255",
+  'language': 'Hebrew',
+}
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/langhungarianmodel.py b/vendor/pip-9.0.3/pip/_vendor/chardet/langhungarianmodel.py
new file mode 100644
index 0000000000000000000000000000000000000000..bb7c095e1ea6523bd00365384e4c662954c678a0
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/langhungarianmodel.py
@@ -0,0 +1,225 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Character Mapping Table:
+Latin2_HungarianCharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,
+ 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,
+253,  2, 18, 26, 17,  1, 27, 12, 20,  9, 22,  7,  6, 13,  4,  8,
+ 23, 67, 10,  5,  3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,
+159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,
+175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,
+191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205,
+ 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
+221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231,
+232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241,
+ 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85,
+245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253,
+)
+
+win1250HungarianCharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,
+ 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,
+253,  2, 18, 26, 17,  1, 27, 12, 20,  9, 22,  7,  6, 13,  4,  8,
+ 23, 67, 10,  5,  3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,
+161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,
+177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190,
+191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205,
+ 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
+221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231,
+232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241,
+ 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87,
+245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253,
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 94.7368%
+# first 1024 sequences:5.2623%
+# rest  sequences:     0.8894%
+# negative sequences:  0.0009%
+HungarianLangModel = (
+0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
+3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2,
+3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
+3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3,
+0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2,
+0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
+3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
+3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0,
+1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0,
+1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0,
+1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1,
+3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1,
+2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1,
+2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1,
+2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1,
+2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0,
+2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1,
+3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1,
+2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1,
+2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1,
+2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,
+1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1,
+1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1,
+3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0,
+1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1,
+1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1,
+2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1,
+2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0,
+2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1,
+3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1,
+2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1,
+1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0,
+1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
+2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1,
+2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,
+1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0,
+1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1,
+2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0,
+1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0,
+1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0,
+2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1,
+2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1,
+2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1,
+1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1,
+1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1,
+1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0,
+0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0,
+2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1,
+2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1,
+1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1,
+2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,
+1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0,
+1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0,
+2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0,
+2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1,
+2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0,
+1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,
+2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0,
+0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,
+0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
+0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
+2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
+)
+
+Latin2HungarianModel = {
+  'char_to_order_map': Latin2_HungarianCharToOrderMap,
+  'precedence_matrix': HungarianLangModel,
+  'typical_positive_ratio': 0.947368,
+  'keep_english_letter': True,
+  'charset_name': "ISO-8859-2",
+  'language': 'Hungarian',
+}
+
+Win1250HungarianModel = {
+  'char_to_order_map': win1250HungarianCharToOrderMap,
+  'precedence_matrix': HungarianLangModel,
+  'typical_positive_ratio': 0.947368,
+  'keep_english_letter': True,
+  'charset_name': "windows-1250",
+  'language': 'Hungarian',
+}
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/langthaimodel.py b/vendor/pip-9.0.3/pip/_vendor/chardet/langthaimodel.py
new file mode 100644
index 0000000000000000000000000000000000000000..15f94c2df021c9cccc761ebeec80146edbb000c9
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/langthaimodel.py
@@ -0,0 +1,199 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# The following result for thai was collected from a limited sample (1M).
+
+# Character Mapping Table:
+TIS620CharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111,  # 40
+188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253,  # 50
+253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82,  # 60
+ 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253,  # 70
+209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222,
+223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235,
+236,  5, 30,237, 24,238, 75,  8, 26, 52, 34, 51,119, 47, 58, 57,
+ 49, 53, 55, 43, 20, 19, 44, 14, 48,  3, 17, 25, 39, 62, 31, 54,
+ 45,  9, 16,  2, 61, 15,239, 12, 42, 46, 18, 21, 76,  4, 66, 63,
+ 22, 10,  1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244,
+ 11, 28, 41, 29, 33,245, 50, 37,  6,  7, 67, 77, 38, 93,246,247,
+ 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253,
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 92.6386%
+# first 1024 sequences:7.3177%
+# rest  sequences:     1.0230%
+# negative sequences:  0.0436%
+ThaiLangModel = (
+0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3,
+0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2,
+3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3,
+0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,
+3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2,
+3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1,
+3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2,
+3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1,
+3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1,
+3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,
+3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1,
+2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1,
+3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1,
+0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1,
+0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,
+3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2,
+1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0,
+3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3,
+3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0,
+1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2,
+0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
+2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3,
+0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0,
+3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1,
+2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,
+3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2,
+0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2,
+3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0,
+2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
+3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1,
+2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1,
+3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0,
+3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1,
+3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1,
+3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1,
+1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2,
+0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3,
+0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,
+3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0,
+3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1,
+1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0,
+3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1,
+3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2,
+0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0,
+0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0,
+1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1,
+1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,
+3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1,
+0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0,
+3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0,
+0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1,
+0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0,
+0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1,
+0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,
+0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0,
+0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1,
+0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,
+3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0,
+0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0,
+0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,
+3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1,
+2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,
+0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0,
+3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0,
+1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0,
+1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,
+1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+)
+
+TIS620ThaiModel = {
+  'char_to_order_map': TIS620CharToOrderMap,
+  'precedence_matrix': ThaiLangModel,
+  'typical_positive_ratio': 0.926386,
+  'keep_english_letter': False,
+  'charset_name': "TIS-620",
+  'language': 'Thai',
+}
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/langturkishmodel.py b/vendor/pip-9.0.3/pip/_vendor/chardet/langturkishmodel.py
new file mode 100644
index 0000000000000000000000000000000000000000..a427a457398de8076cdcefb5a6c391e89500bce8
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/langturkishmodel.py
@@ -0,0 +1,193 @@
+# -*- coding: utf-8 -*-
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Özgür Baskın - Turkish Language Model
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Character Mapping Table:
+Latin5_TurkishCharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42,
+ 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255,
+255,  1, 21, 28, 12,  2, 18, 27, 25,  3, 24, 10,  5, 13,  4, 15,
+ 26, 64,  7,  8,  9, 14, 32, 57, 58, 11, 22,255,255,255,255,255,
+180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,
+164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106,
+150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136,
+ 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125,
+124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119,
+ 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86,
+ 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96,
+ 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17,  6, 19,107,
+)
+
+TurkishLangModel = (
+3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3,
+3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1,
+3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3,
+3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1,
+3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3,
+3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1,
+3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2,
+2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1,
+3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2,
+2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0,
+1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1,
+2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2,
+3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1,
+3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2,
+2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1,
+3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2,
+2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,
+3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2,
+3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0,
+3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3,
+0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,
+3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1,
+0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,
+3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1,
+1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1,
+3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3,
+2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3,
+2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1,
+3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0,
+0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0,
+1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2,
+3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1,
+1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,
+3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2,
+2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0,
+0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0,
+3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1,
+0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1,
+1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,
+1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3,
+2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1,
+2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,
+0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1,
+2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0,
+3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0,
+0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1,
+1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2,
+0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1,
+3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1,
+0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0,
+3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,
+3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,
+1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2,
+2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1,
+0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0,
+3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0,
+0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0,
+0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0,
+3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0,
+0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0,
+0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0,
+3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0,
+0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1,
+3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,
+0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1,
+0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0,
+3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0,
+0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0,
+3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0,
+0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0,
+3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0,
+0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0,
+0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0,
+3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0,
+0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0,
+3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0,
+0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0,
+0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0,
+0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0,
+0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0,
+1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0,
+0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1,
+0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0,
+3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0,
+0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,
+2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,
+2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0,
+0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
+1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,
+0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+)
+
+Latin5TurkishModel = {
+  'char_to_order_map': Latin5_TurkishCharToOrderMap,
+  'precedence_matrix': TurkishLangModel,
+  'typical_positive_ratio': 0.970290,
+  'keep_english_letter': True,
+  'charset_name': "ISO-8859-9",
+  'language': 'Turkish',
+}
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/latin1prober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/latin1prober.py
new file mode 100644
index 0000000000000000000000000000000000000000..7d1e8c20fb09ddaa0254ae74cbd4425ffdc5dcdc
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/latin1prober.py
@@ -0,0 +1,145 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetprober import CharSetProber
+from .enums import ProbingState
+
+FREQ_CAT_NUM = 4
+
+UDF = 0  # undefined
+OTH = 1  # other
+ASC = 2  # ascii capital letter
+ASS = 3  # ascii small letter
+ACV = 4  # accent capital vowel
+ACO = 5  # accent capital other
+ASV = 6  # accent small vowel
+ASO = 7  # accent small other
+CLASS_NUM = 8  # total classes
+
+Latin1_CharToClass = (
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 00 - 07
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 08 - 0F
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 10 - 17
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 18 - 1F
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 20 - 27
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 28 - 2F
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 30 - 37
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 38 - 3F
+    OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 40 - 47
+    ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 48 - 4F
+    ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 50 - 57
+    ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH,   # 58 - 5F
+    OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 60 - 67
+    ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 68 - 6F
+    ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 70 - 77
+    ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH,   # 78 - 7F
+    OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH,   # 80 - 87
+    OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF,   # 88 - 8F
+    UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 90 - 97
+    OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO,   # 98 - 9F
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A0 - A7
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A8 - AF
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B0 - B7
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B8 - BF
+    ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO,   # C0 - C7
+    ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV,   # C8 - CF
+    ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH,   # D0 - D7
+    ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO,   # D8 - DF
+    ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO,   # E0 - E7
+    ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV,   # E8 - EF
+    ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH,   # F0 - F7
+    ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO,   # F8 - FF
+)
+
+# 0 : illegal
+# 1 : very unlikely
+# 2 : normal
+# 3 : very likely
+Latin1ClassModel = (
+# UDF OTH ASC ASS ACV ACO ASV ASO
+    0,  0,  0,  0,  0,  0,  0,  0,  # UDF
+    0,  3,  3,  3,  3,  3,  3,  3,  # OTH
+    0,  3,  3,  3,  3,  3,  3,  3,  # ASC
+    0,  3,  3,  3,  1,  1,  3,  3,  # ASS
+    0,  3,  3,  3,  1,  2,  1,  2,  # ACV
+    0,  3,  3,  3,  3,  3,  3,  3,  # ACO
+    0,  3,  1,  3,  1,  1,  1,  3,  # ASV
+    0,  3,  1,  3,  1,  1,  3,  3,  # ASO
+)
+
+
+class Latin1Prober(CharSetProber):
+    def __init__(self):
+        super(Latin1Prober, self).__init__()
+        self._last_char_class = None
+        self._freq_counter = None
+        self.reset()
+
+    def reset(self):
+        self._last_char_class = OTH
+        self._freq_counter = [0] * FREQ_CAT_NUM
+        CharSetProber.reset(self)
+
+    @property
+    def charset_name(self):
+        return "ISO-8859-1"
+
+    @property
+    def language(self):
+        return ""
+
+    def feed(self, byte_str):
+        byte_str = self.filter_with_english_letters(byte_str)
+        for c in byte_str:
+            char_class = Latin1_CharToClass[c]
+            freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM)
+                                    + char_class]
+            if freq == 0:
+                self._state = ProbingState.NOT_ME
+                break
+            self._freq_counter[freq] += 1
+            self._last_char_class = char_class
+
+        return self.state
+
+    def get_confidence(self):
+        if self.state == ProbingState.NOT_ME:
+            return 0.01
+
+        total = sum(self._freq_counter)
+        if total < 0.01:
+            confidence = 0.0
+        else:
+            confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0)
+                          / total)
+        if confidence < 0.0:
+            confidence = 0.0
+        # lower the confidence of latin1 so that other more accurate
+        # detector can take priority.
+        confidence = confidence * 0.73
+        return confidence
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/mbcharsetprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/mbcharsetprober.py
new file mode 100644
index 0000000000000000000000000000000000000000..6256ecfd1e2c9ac4cfa3fac359cd12dce85b759c
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/mbcharsetprober.py
@@ -0,0 +1,91 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#   Proofpoint, Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetprober import CharSetProber
+from .enums import ProbingState, MachineState
+
+
+class MultiByteCharSetProber(CharSetProber):
+    """
+    MultiByteCharSetProber
+    """
+
+    def __init__(self, lang_filter=None):
+        super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter)
+        self.distribution_analyzer = None
+        self.coding_sm = None
+        self._last_char = [0, 0]
+
+    def reset(self):
+        super(MultiByteCharSetProber, self).reset()
+        if self.coding_sm:
+            self.coding_sm.reset()
+        if self.distribution_analyzer:
+            self.distribution_analyzer.reset()
+        self._last_char = [0, 0]
+
+    @property
+    def charset_name(self):
+        raise NotImplementedError
+
+    @property
+    def language(self):
+        raise NotImplementedError
+
+    def feed(self, byte_str):
+        for i in range(len(byte_str)):
+            coding_state = self.coding_sm.next_state(byte_str[i])
+            if coding_state == MachineState.ERROR:
+                self.logger.debug('%s %s prober hit error at byte %s',
+                                  self.charset_name, self.language, i)
+                self._state = ProbingState.NOT_ME
+                break
+            elif coding_state == MachineState.ITS_ME:
+                self._state = ProbingState.FOUND_IT
+                break
+            elif coding_state == MachineState.START:
+                char_len = self.coding_sm.get_current_charlen()
+                if i == 0:
+                    self._last_char[1] = byte_str[0]
+                    self.distribution_analyzer.feed(self._last_char, char_len)
+                else:
+                    self.distribution_analyzer.feed(byte_str[i - 1:i + 1],
+                                                    char_len)
+
+        self._last_char[0] = byte_str[-1]
+
+        if self.state == ProbingState.DETECTING:
+            if (self.distribution_analyzer.got_enough_data() and
+                    (self.get_confidence() > self.SHORTCUT_THRESHOLD)):
+                self._state = ProbingState.FOUND_IT
+
+        return self.state
+
+    def get_confidence(self):
+        return self.distribution_analyzer.get_confidence()
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/mbcsgroupprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/mbcsgroupprober.py
new file mode 100644
index 0000000000000000000000000000000000000000..530abe75e0c00cbfcb2a310d872866f320977d0a
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/mbcsgroupprober.py
@@ -0,0 +1,54 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#   Proofpoint, Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetgroupprober import CharSetGroupProber
+from .utf8prober import UTF8Prober
+from .sjisprober import SJISProber
+from .eucjpprober import EUCJPProber
+from .gb2312prober import GB2312Prober
+from .euckrprober import EUCKRProber
+from .cp949prober import CP949Prober
+from .big5prober import Big5Prober
+from .euctwprober import EUCTWProber
+
+
+class MBCSGroupProber(CharSetGroupProber):
+    def __init__(self, lang_filter=None):
+        super(MBCSGroupProber, self).__init__(lang_filter=lang_filter)
+        self.probers = [
+            UTF8Prober(),
+            SJISProber(),
+            EUCJPProber(),
+            GB2312Prober(),
+            EUCKRProber(),
+            CP949Prober(),
+            Big5Prober(),
+            EUCTWProber()
+        ]
+        self.reset()
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/mbcssm.py b/vendor/pip-9.0.3/pip/_vendor/chardet/mbcssm.py
new file mode 100644
index 0000000000000000000000000000000000000000..8360d0f284ef394f2980b5bb89548e234385cdf1
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/mbcssm.py
@@ -0,0 +1,572 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .enums import MachineState
+
+# BIG5
+
+BIG5_CLS = (
+    1,1,1,1,1,1,1,1,  # 00 - 07    #allow 0x00 as legal value
+    1,1,1,1,1,1,0,0,  # 08 - 0f
+    1,1,1,1,1,1,1,1,  # 10 - 17
+    1,1,1,0,1,1,1,1,  # 18 - 1f
+    1,1,1,1,1,1,1,1,  # 20 - 27
+    1,1,1,1,1,1,1,1,  # 28 - 2f
+    1,1,1,1,1,1,1,1,  # 30 - 37
+    1,1,1,1,1,1,1,1,  # 38 - 3f
+    2,2,2,2,2,2,2,2,  # 40 - 47
+    2,2,2,2,2,2,2,2,  # 48 - 4f
+    2,2,2,2,2,2,2,2,  # 50 - 57
+    2,2,2,2,2,2,2,2,  # 58 - 5f
+    2,2,2,2,2,2,2,2,  # 60 - 67
+    2,2,2,2,2,2,2,2,  # 68 - 6f
+    2,2,2,2,2,2,2,2,  # 70 - 77
+    2,2,2,2,2,2,2,1,  # 78 - 7f
+    4,4,4,4,4,4,4,4,  # 80 - 87
+    4,4,4,4,4,4,4,4,  # 88 - 8f
+    4,4,4,4,4,4,4,4,  # 90 - 97
+    4,4,4,4,4,4,4,4,  # 98 - 9f
+    4,3,3,3,3,3,3,3,  # a0 - a7
+    3,3,3,3,3,3,3,3,  # a8 - af
+    3,3,3,3,3,3,3,3,  # b0 - b7
+    3,3,3,3,3,3,3,3,  # b8 - bf
+    3,3,3,3,3,3,3,3,  # c0 - c7
+    3,3,3,3,3,3,3,3,  # c8 - cf
+    3,3,3,3,3,3,3,3,  # d0 - d7
+    3,3,3,3,3,3,3,3,  # d8 - df
+    3,3,3,3,3,3,3,3,  # e0 - e7
+    3,3,3,3,3,3,3,3,  # e8 - ef
+    3,3,3,3,3,3,3,3,  # f0 - f7
+    3,3,3,3,3,3,3,0  # f8 - ff
+)
+
+BIG5_ST = (
+    MachineState.ERROR,MachineState.START,MachineState.START,     3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
+    MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f
+    MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17
+)
+
+BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0)
+
+BIG5_SM_MODEL = {'class_table': BIG5_CLS,
+                 'class_factor': 5,
+                 'state_table': BIG5_ST,
+                 'char_len_table': BIG5_CHAR_LEN_TABLE,
+                 'name': 'Big5'}
+
+# CP949
+
+CP949_CLS  = (
+    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,  # 00 - 0f
+    1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1,  # 10 - 1f
+    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,  # 20 - 2f
+    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,  # 30 - 3f
+    1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,  # 40 - 4f
+    4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1,  # 50 - 5f
+    1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,  # 60 - 6f
+    5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1,  # 70 - 7f
+    0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,  # 80 - 8f
+    6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,  # 90 - 9f
+    6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8,  # a0 - af
+    7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,  # b0 - bf
+    7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2,  # c0 - cf
+    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,  # d0 - df
+    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,  # e0 - ef
+    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0,  # f0 - ff
+)
+
+CP949_ST = (
+#cls=    0      1      2      3      4      5      6      7      8      9  # previous state =
+    MachineState.ERROR,MachineState.START,     3,MachineState.ERROR,MachineState.START,MachineState.START,     4,     5,MachineState.ERROR,     6, # MachineState.START
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR
+    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME
+    MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3
+    MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4
+    MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5
+    MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6
+)
+
+CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2)
+
+CP949_SM_MODEL = {'class_table': CP949_CLS,
+                  'class_factor': 10,
+                  'state_table': CP949_ST,
+                  'char_len_table': CP949_CHAR_LEN_TABLE,
+                  'name': 'CP949'}
+
+# EUC-JP
+
+EUCJP_CLS = (
+    4,4,4,4,4,4,4,4,  # 00 - 07
+    4,4,4,4,4,4,5,5,  # 08 - 0f
+    4,4,4,4,4,4,4,4,  # 10 - 17
+    4,4,4,5,4,4,4,4,  # 18 - 1f
+    4,4,4,4,4,4,4,4,  # 20 - 27
+    4,4,4,4,4,4,4,4,  # 28 - 2f
+    4,4,4,4,4,4,4,4,  # 30 - 37
+    4,4,4,4,4,4,4,4,  # 38 - 3f
+    4,4,4,4,4,4,4,4,  # 40 - 47
+    4,4,4,4,4,4,4,4,  # 48 - 4f
+    4,4,4,4,4,4,4,4,  # 50 - 57
+    4,4,4,4,4,4,4,4,  # 58 - 5f
+    4,4,4,4,4,4,4,4,  # 60 - 67
+    4,4,4,4,4,4,4,4,  # 68 - 6f
+    4,4,4,4,4,4,4,4,  # 70 - 77
+    4,4,4,4,4,4,4,4,  # 78 - 7f
+    5,5,5,5,5,5,5,5,  # 80 - 87
+    5,5,5,5,5,5,1,3,  # 88 - 8f
+    5,5,5,5,5,5,5,5,  # 90 - 97
+    5,5,5,5,5,5,5,5,  # 98 - 9f
+    5,2,2,2,2,2,2,2,  # a0 - a7
+    2,2,2,2,2,2,2,2,  # a8 - af
+    2,2,2,2,2,2,2,2,  # b0 - b7
+    2,2,2,2,2,2,2,2,  # b8 - bf
+    2,2,2,2,2,2,2,2,  # c0 - c7
+    2,2,2,2,2,2,2,2,  # c8 - cf
+    2,2,2,2,2,2,2,2,  # d0 - d7
+    2,2,2,2,2,2,2,2,  # d8 - df
+    0,0,0,0,0,0,0,0,  # e0 - e7
+    0,0,0,0,0,0,0,0,  # e8 - ef
+    0,0,0,0,0,0,0,0,  # f0 - f7
+    0,0,0,0,0,0,0,5  # f8 - ff
+)
+
+EUCJP_ST = (
+          3,     4,     3,     5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
+     MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
+     MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17
+     MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     3,MachineState.ERROR,#18-1f
+          3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27
+)
+
+EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0)
+
+EUCJP_SM_MODEL = {'class_table': EUCJP_CLS,
+                  'class_factor': 6,
+                  'state_table': EUCJP_ST,
+                  'char_len_table': EUCJP_CHAR_LEN_TABLE,
+                  'name': 'EUC-JP'}
+
+# EUC-KR
+
+EUCKR_CLS  = (
+    1,1,1,1,1,1,1,1,  # 00 - 07
+    1,1,1,1,1,1,0,0,  # 08 - 0f
+    1,1,1,1,1,1,1,1,  # 10 - 17
+    1,1,1,0,1,1,1,1,  # 18 - 1f
+    1,1,1,1,1,1,1,1,  # 20 - 27
+    1,1,1,1,1,1,1,1,  # 28 - 2f
+    1,1,1,1,1,1,1,1,  # 30 - 37
+    1,1,1,1,1,1,1,1,  # 38 - 3f
+    1,1,1,1,1,1,1,1,  # 40 - 47
+    1,1,1,1,1,1,1,1,  # 48 - 4f
+    1,1,1,1,1,1,1,1,  # 50 - 57
+    1,1,1,1,1,1,1,1,  # 58 - 5f
+    1,1,1,1,1,1,1,1,  # 60 - 67
+    1,1,1,1,1,1,1,1,  # 68 - 6f
+    1,1,1,1,1,1,1,1,  # 70 - 77
+    1,1,1,1,1,1,1,1,  # 78 - 7f
+    0,0,0,0,0,0,0,0,  # 80 - 87
+    0,0,0,0,0,0,0,0,  # 88 - 8f
+    0,0,0,0,0,0,0,0,  # 90 - 97
+    0,0,0,0,0,0,0,0,  # 98 - 9f
+    0,2,2,2,2,2,2,2,  # a0 - a7
+    2,2,2,2,2,3,3,3,  # a8 - af
+    2,2,2,2,2,2,2,2,  # b0 - b7
+    2,2,2,2,2,2,2,2,  # b8 - bf
+    2,2,2,2,2,2,2,2,  # c0 - c7
+    2,3,2,2,2,2,2,2,  # c8 - cf
+    2,2,2,2,2,2,2,2,  # d0 - d7
+    2,2,2,2,2,2,2,2,  # d8 - df
+    2,2,2,2,2,2,2,2,  # e0 - e7
+    2,2,2,2,2,2,2,2,  # e8 - ef
+    2,2,2,2,2,2,2,2,  # f0 - f7
+    2,2,2,2,2,2,2,0   # f8 - ff
+)
+
+EUCKR_ST = (
+    MachineState.ERROR,MachineState.START,     3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
+    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f
+)
+
+EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0)
+
+EUCKR_SM_MODEL = {'class_table': EUCKR_CLS,
+                'class_factor': 4,
+                'state_table': EUCKR_ST,
+                'char_len_table': EUCKR_CHAR_LEN_TABLE,
+                'name': 'EUC-KR'}
+
+# EUC-TW
+
+EUCTW_CLS = (
+    2,2,2,2,2,2,2,2,  # 00 - 07
+    2,2,2,2,2,2,0,0,  # 08 - 0f
+    2,2,2,2,2,2,2,2,  # 10 - 17
+    2,2,2,0,2,2,2,2,  # 18 - 1f
+    2,2,2,2,2,2,2,2,  # 20 - 27
+    2,2,2,2,2,2,2,2,  # 28 - 2f
+    2,2,2,2,2,2,2,2,  # 30 - 37
+    2,2,2,2,2,2,2,2,  # 38 - 3f
+    2,2,2,2,2,2,2,2,  # 40 - 47
+    2,2,2,2,2,2,2,2,  # 48 - 4f
+    2,2,2,2,2,2,2,2,  # 50 - 57
+    2,2,2,2,2,2,2,2,  # 58 - 5f
+    2,2,2,2,2,2,2,2,  # 60 - 67
+    2,2,2,2,2,2,2,2,  # 68 - 6f
+    2,2,2,2,2,2,2,2,  # 70 - 77
+    2,2,2,2,2,2,2,2,  # 78 - 7f
+    0,0,0,0,0,0,0,0,  # 80 - 87
+    0,0,0,0,0,0,6,0,  # 88 - 8f
+    0,0,0,0,0,0,0,0,  # 90 - 97
+    0,0,0,0,0,0,0,0,  # 98 - 9f
+    0,3,4,4,4,4,4,4,  # a0 - a7
+    5,5,1,1,1,1,1,1,  # a8 - af
+    1,1,1,1,1,1,1,1,  # b0 - b7
+    1,1,1,1,1,1,1,1,  # b8 - bf
+    1,1,3,1,3,3,3,3,  # c0 - c7
+    3,3,3,3,3,3,3,3,  # c8 - cf
+    3,3,3,3,3,3,3,3,  # d0 - d7
+    3,3,3,3,3,3,3,3,  # d8 - df
+    3,3,3,3,3,3,3,3,  # e0 - e7
+    3,3,3,3,3,3,3,3,  # e8 - ef
+    3,3,3,3,3,3,3,3,  # f0 - f7
+    3,3,3,3,3,3,3,0   # f8 - ff
+)
+
+EUCTW_ST = (
+    MachineState.ERROR,MachineState.ERROR,MachineState.START,     3,     3,     3,     4,MachineState.ERROR,#00-07
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
+    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17
+    MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
+         5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27
+    MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f
+)
+
+EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3)
+
+EUCTW_SM_MODEL = {'class_table': EUCTW_CLS,
+                'class_factor': 7,
+                'state_table': EUCTW_ST,
+                'char_len_table': EUCTW_CHAR_LEN_TABLE,
+                'name': 'x-euc-tw'}
+
+# GB2312
+
+GB2312_CLS = (
+    1,1,1,1,1,1,1,1,  # 00 - 07
+    1,1,1,1,1,1,0,0,  # 08 - 0f
+    1,1,1,1,1,1,1,1,  # 10 - 17
+    1,1,1,0,1,1,1,1,  # 18 - 1f
+    1,1,1,1,1,1,1,1,  # 20 - 27
+    1,1,1,1,1,1,1,1,  # 28 - 2f
+    3,3,3,3,3,3,3,3,  # 30 - 37
+    3,3,1,1,1,1,1,1,  # 38 - 3f
+    2,2,2,2,2,2,2,2,  # 40 - 47
+    2,2,2,2,2,2,2,2,  # 48 - 4f
+    2,2,2,2,2,2,2,2,  # 50 - 57
+    2,2,2,2,2,2,2,2,  # 58 - 5f
+    2,2,2,2,2,2,2,2,  # 60 - 67
+    2,2,2,2,2,2,2,2,  # 68 - 6f
+    2,2,2,2,2,2,2,2,  # 70 - 77
+    2,2,2,2,2,2,2,4,  # 78 - 7f
+    5,6,6,6,6,6,6,6,  # 80 - 87
+    6,6,6,6,6,6,6,6,  # 88 - 8f
+    6,6,6,6,6,6,6,6,  # 90 - 97
+    6,6,6,6,6,6,6,6,  # 98 - 9f
+    6,6,6,6,6,6,6,6,  # a0 - a7
+    6,6,6,6,6,6,6,6,  # a8 - af
+    6,6,6,6,6,6,6,6,  # b0 - b7
+    6,6,6,6,6,6,6,6,  # b8 - bf
+    6,6,6,6,6,6,6,6,  # c0 - c7
+    6,6,6,6,6,6,6,6,  # c8 - cf
+    6,6,6,6,6,6,6,6,  # d0 - d7
+    6,6,6,6,6,6,6,6,  # d8 - df
+    6,6,6,6,6,6,6,6,  # e0 - e7
+    6,6,6,6,6,6,6,6,  # e8 - ef
+    6,6,6,6,6,6,6,6,  # f0 - f7
+    6,6,6,6,6,6,6,0   # f8 - ff
+)
+
+GB2312_ST = (
+    MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,     3,MachineState.ERROR,#00-07
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
+    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17
+         4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
+    MachineState.ERROR,MachineState.ERROR,     5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27
+    MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f
+)
+
+# To be accurate, the length of class 6 can be either 2 or 4.
+# But it is not necessary to discriminate between the two since
+# it is used for frequency analysis only, and we are validating
+# each code range there as well. So it is safe to set it to be
+# 2 here.
+GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2)
+
+GB2312_SM_MODEL = {'class_table': GB2312_CLS,
+                   'class_factor': 7,
+                   'state_table': GB2312_ST,
+                   'char_len_table': GB2312_CHAR_LEN_TABLE,
+                   'name': 'GB2312'}
+
+# Shift_JIS
+
+SJIS_CLS = (
+    1,1,1,1,1,1,1,1,  # 00 - 07
+    1,1,1,1,1,1,0,0,  # 08 - 0f
+    1,1,1,1,1,1,1,1,  # 10 - 17
+    1,1,1,0,1,1,1,1,  # 18 - 1f
+    1,1,1,1,1,1,1,1,  # 20 - 27
+    1,1,1,1,1,1,1,1,  # 28 - 2f
+    1,1,1,1,1,1,1,1,  # 30 - 37
+    1,1,1,1,1,1,1,1,  # 38 - 3f
+    2,2,2,2,2,2,2,2,  # 40 - 47
+    2,2,2,2,2,2,2,2,  # 48 - 4f
+    2,2,2,2,2,2,2,2,  # 50 - 57
+    2,2,2,2,2,2,2,2,  # 58 - 5f
+    2,2,2,2,2,2,2,2,  # 60 - 67
+    2,2,2,2,2,2,2,2,  # 68 - 6f
+    2,2,2,2,2,2,2,2,  # 70 - 77
+    2,2,2,2,2,2,2,1,  # 78 - 7f
+    3,3,3,3,3,2,2,3,  # 80 - 87
+    3,3,3,3,3,3,3,3,  # 88 - 8f
+    3,3,3,3,3,3,3,3,  # 90 - 97
+    3,3,3,3,3,3,3,3,  # 98 - 9f
+    #0xa0 is illegal in sjis encoding, but some pages does
+    #contain such byte. We need to be more error forgiven.
+    2,2,2,2,2,2,2,2,  # a0 - a7
+    2,2,2,2,2,2,2,2,  # a8 - af
+    2,2,2,2,2,2,2,2,  # b0 - b7
+    2,2,2,2,2,2,2,2,  # b8 - bf
+    2,2,2,2,2,2,2,2,  # c0 - c7
+    2,2,2,2,2,2,2,2,  # c8 - cf
+    2,2,2,2,2,2,2,2,  # d0 - d7
+    2,2,2,2,2,2,2,2,  # d8 - df
+    3,3,3,3,3,3,3,3,  # e0 - e7
+    3,3,3,3,3,4,4,4,  # e8 - ef
+    3,3,3,3,3,3,3,3,  # f0 - f7
+    3,3,3,3,3,0,0,0)  # f8 - ff
+
+
+SJIS_ST = (
+    MachineState.ERROR,MachineState.START,MachineState.START,     3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
+    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17
+)
+
+SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0)
+
+SJIS_SM_MODEL = {'class_table': SJIS_CLS,
+               'class_factor': 6,
+               'state_table': SJIS_ST,
+               'char_len_table': SJIS_CHAR_LEN_TABLE,
+               'name': 'Shift_JIS'}
+
+# UCS2-BE
+
+UCS2BE_CLS = (
+    0,0,0,0,0,0,0,0,  # 00 - 07
+    0,0,1,0,0,2,0,0,  # 08 - 0f
+    0,0,0,0,0,0,0,0,  # 10 - 17
+    0,0,0,3,0,0,0,0,  # 18 - 1f
+    0,0,0,0,0,0,0,0,  # 20 - 27
+    0,3,3,3,3,3,0,0,  # 28 - 2f
+    0,0,0,0,0,0,0,0,  # 30 - 37
+    0,0,0,0,0,0,0,0,  # 38 - 3f
+    0,0,0,0,0,0,0,0,  # 40 - 47
+    0,0,0,0,0,0,0,0,  # 48 - 4f
+    0,0,0,0,0,0,0,0,  # 50 - 57
+    0,0,0,0,0,0,0,0,  # 58 - 5f
+    0,0,0,0,0,0,0,0,  # 60 - 67
+    0,0,0,0,0,0,0,0,  # 68 - 6f
+    0,0,0,0,0,0,0,0,  # 70 - 77
+    0,0,0,0,0,0,0,0,  # 78 - 7f
+    0,0,0,0,0,0,0,0,  # 80 - 87
+    0,0,0,0,0,0,0,0,  # 88 - 8f
+    0,0,0,0,0,0,0,0,  # 90 - 97
+    0,0,0,0,0,0,0,0,  # 98 - 9f
+    0,0,0,0,0,0,0,0,  # a0 - a7
+    0,0,0,0,0,0,0,0,  # a8 - af
+    0,0,0,0,0,0,0,0,  # b0 - b7
+    0,0,0,0,0,0,0,0,  # b8 - bf
+    0,0,0,0,0,0,0,0,  # c0 - c7
+    0,0,0,0,0,0,0,0,  # c8 - cf
+    0,0,0,0,0,0,0,0,  # d0 - d7
+    0,0,0,0,0,0,0,0,  # d8 - df
+    0,0,0,0,0,0,0,0,  # e0 - e7
+    0,0,0,0,0,0,0,0,  # e8 - ef
+    0,0,0,0,0,0,0,0,  # f0 - f7
+    0,0,0,0,0,0,4,5   # f8 - ff
+)
+
+UCS2BE_ST  = (
+          5,     7,     7,MachineState.ERROR,     4,     3,MachineState.ERROR,MachineState.ERROR,#00-07
+     MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
+     MachineState.ITS_ME,MachineState.ITS_ME,     6,     6,     6,     6,MachineState.ERROR,MachineState.ERROR,#10-17
+          6,     6,     6,     6,     6,MachineState.ITS_ME,     6,     6,#18-1f
+          6,     6,     6,     6,     5,     7,     7,MachineState.ERROR,#20-27
+          5,     8,     6,     6,MachineState.ERROR,     6,     6,     6,#28-2f
+          6,     6,     6,     6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37
+)
+
+UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2)
+
+UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS,
+                   'class_factor': 6,
+                   'state_table': UCS2BE_ST,
+                   'char_len_table': UCS2BE_CHAR_LEN_TABLE,
+                   'name': 'UTF-16BE'}
+
+# UCS2-LE
+
+UCS2LE_CLS = (
+    0,0,0,0,0,0,0,0,  # 00 - 07
+    0,0,1,0,0,2,0,0,  # 08 - 0f
+    0,0,0,0,0,0,0,0,  # 10 - 17
+    0,0,0,3,0,0,0,0,  # 18 - 1f
+    0,0,0,0,0,0,0,0,  # 20 - 27
+    0,3,3,3,3,3,0,0,  # 28 - 2f
+    0,0,0,0,0,0,0,0,  # 30 - 37
+    0,0,0,0,0,0,0,0,  # 38 - 3f
+    0,0,0,0,0,0,0,0,  # 40 - 47
+    0,0,0,0,0,0,0,0,  # 48 - 4f
+    0,0,0,0,0,0,0,0,  # 50 - 57
+    0,0,0,0,0,0,0,0,  # 58 - 5f
+    0,0,0,0,0,0,0,0,  # 60 - 67
+    0,0,0,0,0,0,0,0,  # 68 - 6f
+    0,0,0,0,0,0,0,0,  # 70 - 77
+    0,0,0,0,0,0,0,0,  # 78 - 7f
+    0,0,0,0,0,0,0,0,  # 80 - 87
+    0,0,0,0,0,0,0,0,  # 88 - 8f
+    0,0,0,0,0,0,0,0,  # 90 - 97
+    0,0,0,0,0,0,0,0,  # 98 - 9f
+    0,0,0,0,0,0,0,0,  # a0 - a7
+    0,0,0,0,0,0,0,0,  # a8 - af
+    0,0,0,0,0,0,0,0,  # b0 - b7
+    0,0,0,0,0,0,0,0,  # b8 - bf
+    0,0,0,0,0,0,0,0,  # c0 - c7
+    0,0,0,0,0,0,0,0,  # c8 - cf
+    0,0,0,0,0,0,0,0,  # d0 - d7
+    0,0,0,0,0,0,0,0,  # d8 - df
+    0,0,0,0,0,0,0,0,  # e0 - e7
+    0,0,0,0,0,0,0,0,  # e8 - ef
+    0,0,0,0,0,0,0,0,  # f0 - f7
+    0,0,0,0,0,0,4,5   # f8 - ff
+)
+
+UCS2LE_ST = (
+          6,     6,     7,     6,     4,     3,MachineState.ERROR,MachineState.ERROR,#00-07
+     MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
+     MachineState.ITS_ME,MachineState.ITS_ME,     5,     5,     5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17
+          5,     5,     5,MachineState.ERROR,     5,MachineState.ERROR,     6,     6,#18-1f
+          7,     6,     8,     8,     5,     5,     5,MachineState.ERROR,#20-27
+          5,     5,     5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     5,     5,#28-2f
+          5,     5,     5,MachineState.ERROR,     5,MachineState.ERROR,MachineState.START,MachineState.START #30-37
+)
+
+UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2)
+
+UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS,
+                 'class_factor': 6,
+                 'state_table': UCS2LE_ST,
+                 'char_len_table': UCS2LE_CHAR_LEN_TABLE,
+                 'name': 'UTF-16LE'}
+
+# UTF-8
+
+UTF8_CLS = (
+    1,1,1,1,1,1,1,1,  # 00 - 07  #allow 0x00 as a legal value
+    1,1,1,1,1,1,0,0,  # 08 - 0f
+    1,1,1,1,1,1,1,1,  # 10 - 17
+    1,1,1,0,1,1,1,1,  # 18 - 1f
+    1,1,1,1,1,1,1,1,  # 20 - 27
+    1,1,1,1,1,1,1,1,  # 28 - 2f
+    1,1,1,1,1,1,1,1,  # 30 - 37
+    1,1,1,1,1,1,1,1,  # 38 - 3f
+    1,1,1,1,1,1,1,1,  # 40 - 47
+    1,1,1,1,1,1,1,1,  # 48 - 4f
+    1,1,1,1,1,1,1,1,  # 50 - 57
+    1,1,1,1,1,1,1,1,  # 58 - 5f
+    1,1,1,1,1,1,1,1,  # 60 - 67
+    1,1,1,1,1,1,1,1,  # 68 - 6f
+    1,1,1,1,1,1,1,1,  # 70 - 77
+    1,1,1,1,1,1,1,1,  # 78 - 7f
+    2,2,2,2,3,3,3,3,  # 80 - 87
+    4,4,4,4,4,4,4,4,  # 88 - 8f
+    4,4,4,4,4,4,4,4,  # 90 - 97
+    4,4,4,4,4,4,4,4,  # 98 - 9f
+    5,5,5,5,5,5,5,5,  # a0 - a7
+    5,5,5,5,5,5,5,5,  # a8 - af
+    5,5,5,5,5,5,5,5,  # b0 - b7
+    5,5,5,5,5,5,5,5,  # b8 - bf
+    0,0,6,6,6,6,6,6,  # c0 - c7
+    6,6,6,6,6,6,6,6,  # c8 - cf
+    6,6,6,6,6,6,6,6,  # d0 - d7
+    6,6,6,6,6,6,6,6,  # d8 - df
+    7,8,8,8,8,8,8,8,  # e0 - e7
+    8,8,8,8,8,9,8,8,  # e8 - ef
+    10,11,11,11,11,11,11,11,  # f0 - f7
+    12,13,13,13,14,15,0,0    # f8 - ff
+)
+
+UTF8_ST = (
+    MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     12,   10,#00-07
+         9,     11,     8,     7,     6,     5,     4,    3,#08-0f
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
+    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27
+    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f
+    MachineState.ERROR,MachineState.ERROR,     5,     5,     5,     5,MachineState.ERROR,MachineState.ERROR,#30-37
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     5,     5,     5,MachineState.ERROR,MachineState.ERROR,#40-47
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f
+    MachineState.ERROR,MachineState.ERROR,     7,     7,     7,     7,MachineState.ERROR,MachineState.ERROR,#50-57
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     7,     7,MachineState.ERROR,MachineState.ERROR,#60-67
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f
+    MachineState.ERROR,MachineState.ERROR,     9,     9,     9,     9,MachineState.ERROR,MachineState.ERROR,#70-77
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     9,MachineState.ERROR,MachineState.ERROR,#80-87
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f
+    MachineState.ERROR,MachineState.ERROR,    12,    12,    12,    12,MachineState.ERROR,MachineState.ERROR,#90-97
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,    12,MachineState.ERROR,MachineState.ERROR,#a0-a7
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af
+    MachineState.ERROR,MachineState.ERROR,    12,    12,    12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf
+    MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf
+)
+
+UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6)
+
+UTF8_SM_MODEL = {'class_table': UTF8_CLS,
+                 'class_factor': 16,
+                 'state_table': UTF8_ST,
+                 'char_len_table': UTF8_CHAR_LEN_TABLE,
+                 'name': 'UTF-8'}
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/sbcharsetprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/sbcharsetprober.py
new file mode 100644
index 0000000000000000000000000000000000000000..0adb51de5a210aa36849cd149ed0f4ae424fce42
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/sbcharsetprober.py
@@ -0,0 +1,132 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetprober import CharSetProber
+from .enums import CharacterCategory, ProbingState, SequenceLikelihood
+
+
+class SingleByteCharSetProber(CharSetProber):
+    SAMPLE_SIZE = 64
+    SB_ENOUGH_REL_THRESHOLD = 1024  #  0.25 * SAMPLE_SIZE^2
+    POSITIVE_SHORTCUT_THRESHOLD = 0.95
+    NEGATIVE_SHORTCUT_THRESHOLD = 0.05
+
+    def __init__(self, model, reversed=False, name_prober=None):
+        super(SingleByteCharSetProber, self).__init__()
+        self._model = model
+        # TRUE if we need to reverse every pair in the model lookup
+        self._reversed = reversed
+        # Optional auxiliary prober for name decision
+        self._name_prober = name_prober
+        self._last_order = None
+        self._seq_counters = None
+        self._total_seqs = None
+        self._total_char = None
+        self._freq_char = None
+        self.reset()
+
+    def reset(self):
+        super(SingleByteCharSetProber, self).reset()
+        # char order of last character
+        self._last_order = 255
+        self._seq_counters = [0] * SequenceLikelihood.get_num_categories()
+        self._total_seqs = 0
+        self._total_char = 0
+        # characters that fall in our sampling range
+        self._freq_char = 0
+
+    @property
+    def charset_name(self):
+        if self._name_prober:
+            return self._name_prober.charset_name
+        else:
+            return self._model['charset_name']
+
+    @property
+    def language(self):
+        if self._name_prober:
+            return self._name_prober.language
+        else:
+            return self._model.get('language')
+
+    def feed(self, byte_str):
+        if not self._model['keep_english_letter']:
+            byte_str = self.filter_international_words(byte_str)
+        if not byte_str:
+            return self.state
+        char_to_order_map = self._model['char_to_order_map']
+        for i, c in enumerate(byte_str):
+            # XXX: Order is in range 1-64, so one would think we want 0-63 here,
+            #      but that leads to 27 more test failures than before.
+            order = char_to_order_map[c]
+            # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but
+            #      CharacterCategory.SYMBOL is actually 253, so we use CONTROL
+            #      to make it closer to the original intent. The only difference
+            #      is whether or not we count digits and control characters for
+            #      _total_char purposes.
+            if order < CharacterCategory.CONTROL:
+                self._total_char += 1
+            if order < self.SAMPLE_SIZE:
+                self._freq_char += 1
+                if self._last_order < self.SAMPLE_SIZE:
+                    self._total_seqs += 1
+                    if not self._reversed:
+                        i = (self._last_order * self.SAMPLE_SIZE) + order
+                        model = self._model['precedence_matrix'][i]
+                    else:  # reverse the order of the letters in the lookup
+                        i = (order * self.SAMPLE_SIZE) + self._last_order
+                        model = self._model['precedence_matrix'][i]
+                    self._seq_counters[model] += 1
+            self._last_order = order
+
+        charset_name = self._model['charset_name']
+        if self.state == ProbingState.DETECTING:
+            if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD:
+                confidence = self.get_confidence()
+                if confidence > self.POSITIVE_SHORTCUT_THRESHOLD:
+                    self.logger.debug('%s confidence = %s, we have a winner',
+                                      charset_name, confidence)
+                    self._state = ProbingState.FOUND_IT
+                elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD:
+                    self.logger.debug('%s confidence = %s, below negative '
+                                      'shortcut threshhold %s', charset_name,
+                                      confidence,
+                                      self.NEGATIVE_SHORTCUT_THRESHOLD)
+                    self._state = ProbingState.NOT_ME
+
+        return self.state
+
+    def get_confidence(self):
+        r = 0.01
+        if self._total_seqs > 0:
+            r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) /
+                 self._total_seqs / self._model['typical_positive_ratio'])
+            r = r * self._freq_char / self._total_char
+            if r >= 1.0:
+                r = 0.99
+        return r
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/sbcsgroupprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/sbcsgroupprober.py
new file mode 100644
index 0000000000000000000000000000000000000000..98e95dc1a3cbc65e97bc726ab7000955132719dd
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/sbcsgroupprober.py
@@ -0,0 +1,73 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetgroupprober import CharSetGroupProber
+from .sbcharsetprober import SingleByteCharSetProber
+from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel,
+                                Latin5CyrillicModel, MacCyrillicModel,
+                                Ibm866Model, Ibm855Model)
+from .langgreekmodel import Latin7GreekModel, Win1253GreekModel
+from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel
+# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel
+from .langthaimodel import TIS620ThaiModel
+from .langhebrewmodel import Win1255HebrewModel
+from .hebrewprober import HebrewProber
+from .langturkishmodel import Latin5TurkishModel
+
+
+class SBCSGroupProber(CharSetGroupProber):
+    def __init__(self):
+        super(SBCSGroupProber, self).__init__()
+        self.probers = [
+            SingleByteCharSetProber(Win1251CyrillicModel),
+            SingleByteCharSetProber(Koi8rModel),
+            SingleByteCharSetProber(Latin5CyrillicModel),
+            SingleByteCharSetProber(MacCyrillicModel),
+            SingleByteCharSetProber(Ibm866Model),
+            SingleByteCharSetProber(Ibm855Model),
+            SingleByteCharSetProber(Latin7GreekModel),
+            SingleByteCharSetProber(Win1253GreekModel),
+            SingleByteCharSetProber(Latin5BulgarianModel),
+            SingleByteCharSetProber(Win1251BulgarianModel),
+            # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250)
+            #       after we retrain model.
+            # SingleByteCharSetProber(Latin2HungarianModel),
+            # SingleByteCharSetProber(Win1250HungarianModel),
+            SingleByteCharSetProber(TIS620ThaiModel),
+            SingleByteCharSetProber(Latin5TurkishModel),
+        ]
+        hebrew_prober = HebrewProber()
+        logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel,
+                                                        False, hebrew_prober)
+        visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True,
+                                                       hebrew_prober)
+        hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober)
+        self.probers.extend([hebrew_prober, logical_hebrew_prober,
+                             visual_hebrew_prober])
+
+        self.reset()
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/sjisprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/sjisprober.py
new file mode 100644
index 0000000000000000000000000000000000000000..9e29623bdc54a7c6d11bcc167d71bb44cc9be39d
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/sjisprober.py
@@ -0,0 +1,92 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import SJISDistributionAnalysis
+from .jpcntx import SJISContextAnalysis
+from .mbcssm import SJIS_SM_MODEL
+from .enums import ProbingState, MachineState
+
+
+class SJISProber(MultiByteCharSetProber):
+    def __init__(self):
+        super(SJISProber, self).__init__()
+        self.coding_sm = CodingStateMachine(SJIS_SM_MODEL)
+        self.distribution_analyzer = SJISDistributionAnalysis()
+        self.context_analyzer = SJISContextAnalysis()
+        self.reset()
+
+    def reset(self):
+        super(SJISProber, self).reset()
+        self.context_analyzer.reset()
+
+    @property
+    def charset_name(self):
+        return self.context_analyzer.charset_name
+
+    @property
+    def language(self):
+        return "Japanese"
+
+    def feed(self, byte_str):
+        for i in range(len(byte_str)):
+            coding_state = self.coding_sm.next_state(byte_str[i])
+            if coding_state == MachineState.ERROR:
+                self.logger.debug('%s %s prober hit error at byte %s',
+                                  self.charset_name, self.language, i)
+                self._state = ProbingState.NOT_ME
+                break
+            elif coding_state == MachineState.ITS_ME:
+                self._state = ProbingState.FOUND_IT
+                break
+            elif coding_state == MachineState.START:
+                char_len = self.coding_sm.get_current_charlen()
+                if i == 0:
+                    self._last_char[1] = byte_str[0]
+                    self.context_analyzer.feed(self._last_char[2 - char_len:],
+                                               char_len)
+                    self.distribution_analyzer.feed(self._last_char, char_len)
+                else:
+                    self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3
+                                                        - char_len], char_len)
+                    self.distribution_analyzer.feed(byte_str[i - 1:i + 1],
+                                                    char_len)
+
+        self._last_char[0] = byte_str[-1]
+
+        if self.state == ProbingState.DETECTING:
+            if (self.context_analyzer.got_enough_data() and
+               (self.get_confidence() > self.SHORTCUT_THRESHOLD)):
+                self._state = ProbingState.FOUND_IT
+
+        return self.state
+
+    def get_confidence(self):
+        context_conf = self.context_analyzer.get_confidence()
+        distrib_conf = self.distribution_analyzer.get_confidence()
+        return max(context_conf, distrib_conf)
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/universaldetector.py b/vendor/pip-9.0.3/pip/_vendor/chardet/universaldetector.py
new file mode 100644
index 0000000000000000000000000000000000000000..7b4e92d6158527736e3d14d6f725edada8f94b00
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/universaldetector.py
@@ -0,0 +1,286 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+"""
+Module containing the UniversalDetector detector class, which is the primary
+class a user of ``chardet`` should use.
+
+:author: Mark Pilgrim (initial port to Python)
+:author: Shy Shalom (original C code)
+:author: Dan Blanchard (major refactoring for 3.0)
+:author: Ian Cordasco
+"""
+
+
+import codecs
+import logging
+import re
+
+from .charsetgroupprober import CharSetGroupProber
+from .enums import InputState, LanguageFilter, ProbingState
+from .escprober import EscCharSetProber
+from .latin1prober import Latin1Prober
+from .mbcsgroupprober import MBCSGroupProber
+from .sbcsgroupprober import SBCSGroupProber
+
+
+class UniversalDetector(object):
+    """
+    The ``UniversalDetector`` class underlies the ``chardet.detect`` function
+    and coordinates all of the different charset probers.
+
+    To get a ``dict`` containing an encoding and its confidence, you can simply
+    run:
+
+    .. code::
+
+            u = UniversalDetector()
+            u.feed(some_bytes)
+            u.close()
+            detected = u.result
+
+    """
+
+    MINIMUM_THRESHOLD = 0.20
+    HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]')
+    ESC_DETECTOR = re.compile(b'(\033|~{)')
+    WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]')
+    ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252',
+                   'iso-8859-2': 'Windows-1250',
+                   'iso-8859-5': 'Windows-1251',
+                   'iso-8859-6': 'Windows-1256',
+                   'iso-8859-7': 'Windows-1253',
+                   'iso-8859-8': 'Windows-1255',
+                   'iso-8859-9': 'Windows-1254',
+                   'iso-8859-13': 'Windows-1257'}
+
+    def __init__(self, lang_filter=LanguageFilter.ALL):
+        self._esc_charset_prober = None
+        self._charset_probers = []
+        self.result = None
+        self.done = None
+        self._got_data = None
+        self._input_state = None
+        self._last_char = None
+        self.lang_filter = lang_filter
+        self.logger = logging.getLogger(__name__)
+        self._has_win_bytes = None
+        self.reset()
+
+    def reset(self):
+        """
+        Reset the UniversalDetector and all of its probers back to their
+        initial states.  This is called by ``__init__``, so you only need to
+        call this directly in between analyses of different documents.
+        """
+        self.result = {'encoding': None, 'confidence': 0.0, 'language': None}
+        self.done = False
+        self._got_data = False
+        self._has_win_bytes = False
+        self._input_state = InputState.PURE_ASCII
+        self._last_char = b''
+        if self._esc_charset_prober:
+            self._esc_charset_prober.reset()
+        for prober in self._charset_probers:
+            prober.reset()
+
+    def feed(self, byte_str):
+        """
+        Takes a chunk of a document and feeds it through all of the relevant
+        charset probers.
+
+        After calling ``feed``, you can check the value of the ``done``
+        attribute to see if you need to continue feeding the
+        ``UniversalDetector`` more data, or if it has made a prediction
+        (in the ``result`` attribute).
+
+        .. note::
+           You should always call ``close`` when you're done feeding in your
+           document if ``done`` is not already ``True``.
+        """
+        if self.done:
+            return
+
+        if not len(byte_str):
+            return
+
+        if not isinstance(byte_str, bytearray):
+            byte_str = bytearray(byte_str)
+
+        # First check for known BOMs, since these are guaranteed to be correct
+        if not self._got_data:
+            # If the data starts with BOM, we know it is UTF
+            if byte_str.startswith(codecs.BOM_UTF8):
+                # EF BB BF  UTF-8 with BOM
+                self.result = {'encoding': "UTF-8-SIG",
+                               'confidence': 1.0,
+                               'language': ''}
+            elif byte_str.startswith((codecs.BOM_UTF32_LE,
+                                      codecs.BOM_UTF32_BE)):
+                # FF FE 00 00  UTF-32, little-endian BOM
+                # 00 00 FE FF  UTF-32, big-endian BOM
+                self.result = {'encoding': "UTF-32",
+                               'confidence': 1.0,
+                               'language': ''}
+            elif byte_str.startswith(b'\xFE\xFF\x00\x00'):
+                # FE FF 00 00  UCS-4, unusual octet order BOM (3412)
+                self.result = {'encoding': "X-ISO-10646-UCS-4-3412",
+                               'confidence': 1.0,
+                               'language': ''}
+            elif byte_str.startswith(b'\x00\x00\xFF\xFE'):
+                # 00 00 FF FE  UCS-4, unusual octet order BOM (2143)
+                self.result = {'encoding': "X-ISO-10646-UCS-4-2143",
+                               'confidence': 1.0,
+                               'language': ''}
+            elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)):
+                # FF FE  UTF-16, little endian BOM
+                # FE FF  UTF-16, big endian BOM
+                self.result = {'encoding': "UTF-16",
+                               'confidence': 1.0,
+                               'language': ''}
+
+            self._got_data = True
+            if self.result['encoding'] is not None:
+                self.done = True
+                return
+
+        # If none of those matched and we've only see ASCII so far, check
+        # for high bytes and escape sequences
+        if self._input_state == InputState.PURE_ASCII:
+            if self.HIGH_BYTE_DETECTOR.search(byte_str):
+                self._input_state = InputState.HIGH_BYTE
+            elif self._input_state == InputState.PURE_ASCII and \
+                    self.ESC_DETECTOR.search(self._last_char + byte_str):
+                self._input_state = InputState.ESC_ASCII
+
+        self._last_char = byte_str[-1:]
+
+        # If we've seen escape sequences, use the EscCharSetProber, which
+        # uses a simple state machine to check for known escape sequences in
+        # HZ and ISO-2022 encodings, since those are the only encodings that
+        # use such sequences.
+        if self._input_state == InputState.ESC_ASCII:
+            if not self._esc_charset_prober:
+                self._esc_charset_prober = EscCharSetProber(self.lang_filter)
+            if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT:
+                self.result = {'encoding':
+                               self._esc_charset_prober.charset_name,
+                               'confidence':
+                               self._esc_charset_prober.get_confidence(),
+                               'language':
+                               self._esc_charset_prober.language}
+                self.done = True
+        # If we've seen high bytes (i.e., those with values greater than 127),
+        # we need to do more complicated checks using all our multi-byte and
+        # single-byte probers that are left.  The single-byte probers
+        # use character bigram distributions to determine the encoding, whereas
+        # the multi-byte probers use a combination of character unigram and
+        # bigram distributions.
+        elif self._input_state == InputState.HIGH_BYTE:
+            if not self._charset_probers:
+                self._charset_probers = [MBCSGroupProber(self.lang_filter)]
+                # If we're checking non-CJK encodings, use single-byte prober
+                if self.lang_filter & LanguageFilter.NON_CJK:
+                    self._charset_probers.append(SBCSGroupProber())
+                self._charset_probers.append(Latin1Prober())
+            for prober in self._charset_probers:
+                if prober.feed(byte_str) == ProbingState.FOUND_IT:
+                    self.result = {'encoding': prober.charset_name,
+                                   'confidence': prober.get_confidence(),
+                                   'language': prober.language}
+                    self.done = True
+                    break
+            if self.WIN_BYTE_DETECTOR.search(byte_str):
+                self._has_win_bytes = True
+
+    def close(self):
+        """
+        Stop analyzing the current document and come up with a final
+        prediction.
+
+        :returns:  The ``result`` attribute, a ``dict`` with the keys
+                   `encoding`, `confidence`, and `language`.
+        """
+        # Don't bother with checks if we're already done
+        if self.done:
+            return self.result
+        self.done = True
+
+        if not self._got_data:
+            self.logger.debug('no data received!')
+
+        # Default to ASCII if it is all we've seen so far
+        elif self._input_state == InputState.PURE_ASCII:
+            self.result = {'encoding': 'ascii',
+                           'confidence': 1.0,
+                           'language': ''}
+
+        # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD
+        elif self._input_state == InputState.HIGH_BYTE:
+            prober_confidence = None
+            max_prober_confidence = 0.0
+            max_prober = None
+            for prober in self._charset_probers:
+                if not prober:
+                    continue
+                prober_confidence = prober.get_confidence()
+                if prober_confidence > max_prober_confidence:
+                    max_prober_confidence = prober_confidence
+                    max_prober = prober
+            if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD):
+                charset_name = max_prober.charset_name
+                lower_charset_name = max_prober.charset_name.lower()
+                confidence = max_prober.get_confidence()
+                # Use Windows encoding name instead of ISO-8859 if we saw any
+                # extra Windows-specific bytes
+                if lower_charset_name.startswith('iso-8859'):
+                    if self._has_win_bytes:
+                        charset_name = self.ISO_WIN_MAP.get(lower_charset_name,
+                                                            charset_name)
+                self.result = {'encoding': charset_name,
+                               'confidence': confidence,
+                               'language': max_prober.language}
+
+        # Log all prober confidences if none met MINIMUM_THRESHOLD
+        if self.logger.getEffectiveLevel() == logging.DEBUG:
+            if self.result['encoding'] is None:
+                self.logger.debug('no probers hit minimum threshold')
+                for group_prober in self._charset_probers:
+                    if not group_prober:
+                        continue
+                    if isinstance(group_prober, CharSetGroupProber):
+                        for prober in group_prober.probers:
+                            self.logger.debug('%s %s confidence = %s',
+                                              prober.charset_name,
+                                              prober.language,
+                                              prober.get_confidence())
+                    else:
+                        self.logger.debug('%s %s confidence = %s',
+                                          prober.charset_name,
+                                          prober.language,
+                                          prober.get_confidence())
+        return self.result
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/utf8prober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/utf8prober.py
new file mode 100644
index 0000000000000000000000000000000000000000..6c3196cc2d7e46e6756580267f5643c6f7b448dd
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/utf8prober.py
@@ -0,0 +1,82 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetprober import CharSetProber
+from .enums import ProbingState, MachineState
+from .codingstatemachine import CodingStateMachine
+from .mbcssm import UTF8_SM_MODEL
+
+
+
+class UTF8Prober(CharSetProber):
+    ONE_CHAR_PROB = 0.5
+
+    def __init__(self):
+        super(UTF8Prober, self).__init__()
+        self.coding_sm = CodingStateMachine(UTF8_SM_MODEL)
+        self._num_mb_chars = None
+        self.reset()
+
+    def reset(self):
+        super(UTF8Prober, self).reset()
+        self.coding_sm.reset()
+        self._num_mb_chars = 0
+
+    @property
+    def charset_name(self):
+        return "utf-8"
+
+    @property
+    def language(self):
+        return ""
+
+    def feed(self, byte_str):
+        for c in byte_str:
+            coding_state = self.coding_sm.next_state(c)
+            if coding_state == MachineState.ERROR:
+                self._state = ProbingState.NOT_ME
+                break
+            elif coding_state == MachineState.ITS_ME:
+                self._state = ProbingState.FOUND_IT
+                break
+            elif coding_state == MachineState.START:
+                if self.coding_sm.get_current_charlen() >= 2:
+                    self._num_mb_chars += 1
+
+        if self.state == ProbingState.DETECTING:
+            if self.get_confidence() > self.SHORTCUT_THRESHOLD:
+                self._state = ProbingState.FOUND_IT
+
+        return self.state
+
+    def get_confidence(self):
+        unlike = 0.99
+        if self._num_mb_chars < 6:
+            unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars
+            return 1.0 - unlike
+        else:
+            return unlike
diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/version.py b/vendor/pip-9.0.3/pip/_vendor/chardet/version.py
new file mode 100644
index 0000000000000000000000000000000000000000..bb2a34a70ea760ad1f58979acfc8fa466e30c511
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/chardet/version.py
@@ -0,0 +1,9 @@
+"""
+This module exists only to simplify retrieving the version number of chardet
+from within setup.py and from chardet subpackages.
+
+:author: Dan Blanchard (dan.blanchard@gmail.com)
+"""
+
+__version__ = "3.0.4"
+VERSION = __version__.split('.')
diff --git a/vendor/pip-9.0.3/pip/_vendor/colorama/__init__.py b/vendor/pip-9.0.3/pip/_vendor/colorama/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..670e6b3970b77529fd65f002a1afda6d28873cce
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/colorama/__init__.py
@@ -0,0 +1,7 @@
+# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
+from .initialise import init, deinit, reinit, colorama_text
+from .ansi import Fore, Back, Style, Cursor
+from .ansitowin32 import AnsiToWin32
+
+__version__ = '0.3.7'
+
diff --git a/vendor/pip-9.0.3/pip/_vendor/colorama/ansi.py b/vendor/pip-9.0.3/pip/_vendor/colorama/ansi.py
new file mode 100644
index 0000000000000000000000000000000000000000..78776588db9410924d8e4af0922fbc3960a37624
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/colorama/ansi.py
@@ -0,0 +1,102 @@
+# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
+'''
+This module generates ANSI character codes to printing colors to terminals.
+See: http://en.wikipedia.org/wiki/ANSI_escape_code
+'''
+
+CSI = '\033['
+OSC = '\033]'
+BEL = '\007'
+
+
+def code_to_chars(code):
+    return CSI + str(code) + 'm'
+
+def set_title(title):
+    return OSC + '2;' + title + BEL
+
+def clear_screen(mode=2):
+    return CSI + str(mode) + 'J'
+
+def clear_line(mode=2):
+    return CSI + str(mode) + 'K'
+
+
+class AnsiCodes(object):
+    def __init__(self):
+        # the subclasses declare class attributes which are numbers.
+        # Upon instantiation we define instance attributes, which are the same
+        # as the class attributes but wrapped with the ANSI escape sequence
+        for name in dir(self):
+            if not name.startswith('_'):
+                value = getattr(self, name)
+                setattr(self, name, code_to_chars(value))
+
+
+class AnsiCursor(object):
+    def UP(self, n=1):
+        return CSI + str(n) + 'A'
+    def DOWN(self, n=1):
+        return CSI + str(n) + 'B'
+    def FORWARD(self, n=1):
+        return CSI + str(n) + 'C'
+    def BACK(self, n=1):
+        return CSI + str(n) + 'D'
+    def POS(self, x=1, y=1):
+        return CSI + str(y) + ';' + str(x) + 'H'
+
+
+class AnsiFore(AnsiCodes):
+    BLACK           = 30
+    RED             = 31
+    GREEN           = 32
+    YELLOW          = 33
+    BLUE            = 34
+    MAGENTA         = 35
+    CYAN            = 36
+    WHITE           = 37
+    RESET           = 39
+
+    # These are fairly well supported, but not part of the standard.
+    LIGHTBLACK_EX   = 90
+    LIGHTRED_EX     = 91
+    LIGHTGREEN_EX   = 92
+    LIGHTYELLOW_EX  = 93
+    LIGHTBLUE_EX    = 94
+    LIGHTMAGENTA_EX = 95
+    LIGHTCYAN_EX    = 96
+    LIGHTWHITE_EX   = 97
+
+
+class AnsiBack(AnsiCodes):
+    BLACK           = 40
+    RED             = 41
+    GREEN           = 42
+    YELLOW          = 43
+    BLUE            = 44
+    MAGENTA         = 45
+    CYAN            = 46
+    WHITE           = 47
+    RESET           = 49
+
+    # These are fairly well supported, but not part of the standard.
+    LIGHTBLACK_EX   = 100
+    LIGHTRED_EX     = 101
+    LIGHTGREEN_EX   = 102
+    LIGHTYELLOW_EX  = 103
+    LIGHTBLUE_EX    = 104
+    LIGHTMAGENTA_EX = 105
+    LIGHTCYAN_EX    = 106
+    LIGHTWHITE_EX   = 107
+
+
+class AnsiStyle(AnsiCodes):
+    BRIGHT    = 1
+    DIM       = 2
+    NORMAL    = 22
+    RESET_ALL = 0
+
+Fore   = AnsiFore()
+Back   = AnsiBack()
+Style  = AnsiStyle()
+Cursor = AnsiCursor()
diff --git a/vendor/pip-9.0.3/pip/_vendor/colorama/ansitowin32.py b/vendor/pip-9.0.3/pip/_vendor/colorama/ansitowin32.py
new file mode 100644
index 0000000000000000000000000000000000000000..b7ff6f2136eec3530563c0fedf226b4b00c52d9d
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/colorama/ansitowin32.py
@@ -0,0 +1,236 @@
+# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
+import re
+import sys
+import os
+
+from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style
+from .winterm import WinTerm, WinColor, WinStyle
+from .win32 import windll, winapi_test
+
+
+winterm = None
+if windll is not None:
+    winterm = WinTerm()
+
+
+def is_stream_closed(stream):
+    return not hasattr(stream, 'closed') or stream.closed
+
+
+def is_a_tty(stream):
+    return hasattr(stream, 'isatty') and stream.isatty()
+
+
+class StreamWrapper(object):
+    '''
+    Wraps a stream (such as stdout), acting as a transparent proxy for all
+    attribute access apart from method 'write()', which is delegated to our
+    Converter instance.
+    '''
+    def __init__(self, wrapped, converter):
+        # double-underscore everything to prevent clashes with names of
+        # attributes on the wrapped stream object.
+        self.__wrapped = wrapped
+        self.__convertor = converter
+
+    def __getattr__(self, name):
+        return getattr(self.__wrapped, name)
+
+    def write(self, text):
+        self.__convertor.write(text)
+
+
+class AnsiToWin32(object):
+    '''
+    Implements a 'write()' method which, on Windows, will strip ANSI character
+    sequences from the text, and if outputting to a tty, will convert them into
+    win32 function calls.
+    '''
+    ANSI_CSI_RE = re.compile('\001?\033\[((?:\d|;)*)([a-zA-Z])\002?')     # Control Sequence Introducer
+    ANSI_OSC_RE = re.compile('\001?\033\]((?:.|;)*?)(\x07)\002?')         # Operating System Command
+
+    def __init__(self, wrapped, convert=None, strip=None, autoreset=False):
+        # The wrapped stream (normally sys.stdout or sys.stderr)
+        self.wrapped = wrapped
+
+        # should we reset colors to defaults after every .write()
+        self.autoreset = autoreset
+
+        # create the proxy wrapping our output stream
+        self.stream = StreamWrapper(wrapped, self)
+
+        on_windows = os.name == 'nt'
+        # We test if the WinAPI works, because even if we are on Windows
+        # we may be using a terminal that doesn't support the WinAPI
+        # (e.g. Cygwin Terminal). In this case it's up to the terminal
+        # to support the ANSI codes.
+        conversion_supported = on_windows and winapi_test()
+
+        # should we strip ANSI sequences from our output?
+        if strip is None:
+            strip = conversion_supported or (not is_stream_closed(wrapped) and not is_a_tty(wrapped))
+        self.strip = strip
+
+        # should we should convert ANSI sequences into win32 calls?
+        if convert is None:
+            convert = conversion_supported and not is_stream_closed(wrapped) and is_a_tty(wrapped)
+        self.convert = convert
+
+        # dict of ansi codes to win32 functions and parameters
+        self.win32_calls = self.get_win32_calls()
+
+        # are we wrapping stderr?
+        self.on_stderr = self.wrapped is sys.stderr
+
+    def should_wrap(self):
+        '''
+        True if this class is actually needed. If false, then the output
+        stream will not be affected, nor will win32 calls be issued, so
+        wrapping stdout is not actually required. This will generally be
+        False on non-Windows platforms, unless optional functionality like
+        autoreset has been requested using kwargs to init()
+        '''
+        return self.convert or self.strip or self.autoreset
+
+    def get_win32_calls(self):
+        if self.convert and winterm:
+            return {
+                AnsiStyle.RESET_ALL: (winterm.reset_all, ),
+                AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT),
+                AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL),
+                AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL),
+                AnsiFore.BLACK: (winterm.fore, WinColor.BLACK),
+                AnsiFore.RED: (winterm.fore, WinColor.RED),
+                AnsiFore.GREEN: (winterm.fore, WinColor.GREEN),
+                AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW),
+                AnsiFore.BLUE: (winterm.fore, WinColor.BLUE),
+                AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA),
+                AnsiFore.CYAN: (winterm.fore, WinColor.CYAN),
+                AnsiFore.WHITE: (winterm.fore, WinColor.GREY),
+                AnsiFore.RESET: (winterm.fore, ),
+                AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True),
+                AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True),
+                AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True),
+                AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True),
+                AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True),
+                AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True),
+                AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True),
+                AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True),
+                AnsiBack.BLACK: (winterm.back, WinColor.BLACK),
+                AnsiBack.RED: (winterm.back, WinColor.RED),
+                AnsiBack.GREEN: (winterm.back, WinColor.GREEN),
+                AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW),
+                AnsiBack.BLUE: (winterm.back, WinColor.BLUE),
+                AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA),
+                AnsiBack.CYAN: (winterm.back, WinColor.CYAN),
+                AnsiBack.WHITE: (winterm.back, WinColor.GREY),
+                AnsiBack.RESET: (winterm.back, ),
+                AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True),
+                AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True),
+                AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True),
+                AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True),
+                AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True),
+                AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True),
+                AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True),
+                AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True),
+            }
+        return dict()
+
+    def write(self, text):
+        if self.strip or self.convert:
+            self.write_and_convert(text)
+        else:
+            self.wrapped.write(text)
+            self.wrapped.flush()
+        if self.autoreset:
+            self.reset_all()
+
+
+    def reset_all(self):
+        if self.convert:
+            self.call_win32('m', (0,))
+        elif not self.strip and not is_stream_closed(self.wrapped):
+            self.wrapped.write(Style.RESET_ALL)
+
+
+    def write_and_convert(self, text):
+        '''
+        Write the given text to our wrapped stream, stripping any ANSI
+        sequences from the text, and optionally converting them into win32
+        calls.
+        '''
+        cursor = 0
+        text = self.convert_osc(text)
+        for match in self.ANSI_CSI_RE.finditer(text):
+            start, end = match.span()
+            self.write_plain_text(text, cursor, start)
+            self.convert_ansi(*match.groups())
+            cursor = end
+        self.write_plain_text(text, cursor, len(text))
+
+
+    def write_plain_text(self, text, start, end):
+        if start < end:
+            self.wrapped.write(text[start:end])
+            self.wrapped.flush()
+
+
+    def convert_ansi(self, paramstring, command):
+        if self.convert:
+            params = self.extract_params(command, paramstring)
+            self.call_win32(command, params)
+
+
+    def extract_params(self, command, paramstring):
+        if command in 'Hf':
+            params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';'))
+            while len(params) < 2:
+                # defaults:
+                params = params + (1,)
+        else:
+            params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0)
+            if len(params) == 0:
+                # defaults:
+                if command in 'JKm':
+                    params = (0,)
+                elif command in 'ABCD':
+                    params = (1,)
+
+        return params
+
+
+    def call_win32(self, command, params):
+        if command == 'm':
+            for param in params:
+                if param in self.win32_calls:
+                    func_args = self.win32_calls[param]
+                    func = func_args[0]
+                    args = func_args[1:]
+                    kwargs = dict(on_stderr=self.on_stderr)
+                    func(*args, **kwargs)
+        elif command in 'J':
+            winterm.erase_screen(params[0], on_stderr=self.on_stderr)
+        elif command in 'K':
+            winterm.erase_line(params[0], on_stderr=self.on_stderr)
+        elif command in 'Hf':     # cursor position - absolute
+            winterm.set_cursor_position(params, on_stderr=self.on_stderr)
+        elif command in 'ABCD':   # cursor position - relative
+            n = params[0]
+            # A - up, B - down, C - forward, D - back
+            x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command]
+            winterm.cursor_adjust(x, y, on_stderr=self.on_stderr)
+
+
+    def convert_osc(self, text):
+        for match in self.ANSI_OSC_RE.finditer(text):
+            start, end = match.span()
+            text = text[:start] + text[end:]
+            paramstring, command = match.groups()
+            if command in '\x07':       # \x07 = BEL
+                params = paramstring.split(";")
+                # 0 - change title and icon (we will only change title)
+                # 1 - change icon (we don't support this)
+                # 2 - change title
+                if params[0] in '02':
+                    winterm.set_title(params[1])
+        return text
diff --git a/vendor/pip-9.0.3/pip/_vendor/colorama/initialise.py b/vendor/pip-9.0.3/pip/_vendor/colorama/initialise.py
new file mode 100644
index 0000000000000000000000000000000000000000..834962a35f76f903c56bf921605b7fe3938088a4
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/colorama/initialise.py
@@ -0,0 +1,82 @@
+# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
+import atexit
+import contextlib
+import sys
+
+from .ansitowin32 import AnsiToWin32
+
+
+orig_stdout = None
+orig_stderr = None
+
+wrapped_stdout = None
+wrapped_stderr = None
+
+atexit_done = False
+
+
+def reset_all():
+    if AnsiToWin32 is not None:    # Issue #74: objects might become None at exit
+        AnsiToWin32(orig_stdout).reset_all()
+
+
+def init(autoreset=False, convert=None, strip=None, wrap=True):
+
+    if not wrap and any([autoreset, convert, strip]):
+        raise ValueError('wrap=False conflicts with any other arg=True')
+
+    global wrapped_stdout, wrapped_stderr
+    global orig_stdout, orig_stderr
+
+    orig_stdout = sys.stdout
+    orig_stderr = sys.stderr
+
+    if sys.stdout is None:
+        wrapped_stdout = None
+    else:
+        sys.stdout = wrapped_stdout = \
+            wrap_stream(orig_stdout, convert, strip, autoreset, wrap)
+    if sys.stderr is None:
+        wrapped_stderr = None
+    else:
+        sys.stderr = wrapped_stderr = \
+            wrap_stream(orig_stderr, convert, strip, autoreset, wrap)
+
+    global atexit_done
+    if not atexit_done:
+        atexit.register(reset_all)
+        atexit_done = True
+
+
+def deinit():
+    if orig_stdout is not None:
+        sys.stdout = orig_stdout
+    if orig_stderr is not None:
+        sys.stderr = orig_stderr
+
+
+@contextlib.contextmanager
+def colorama_text(*args, **kwargs):
+    init(*args, **kwargs)
+    try:
+        yield
+    finally:
+        deinit()
+
+
+def reinit():
+    if wrapped_stdout is not None:
+        sys.stdout = wrapped_stdout
+    if wrapped_stderr is not None:
+        sys.stderr = wrapped_stderr
+
+
+def wrap_stream(stream, convert, strip, autoreset, wrap):
+    if wrap:
+        wrapper = AnsiToWin32(stream,
+            convert=convert, strip=strip, autoreset=autoreset)
+        if wrapper.should_wrap():
+            stream = wrapper.stream
+    return stream
+
+
diff --git a/vendor/pip-9.0.3/pip/_vendor/colorama/win32.py b/vendor/pip-9.0.3/pip/_vendor/colorama/win32.py
new file mode 100644
index 0000000000000000000000000000000000000000..3d1d2f2d91867ecd8663a2870fededa15b2b9c89
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/colorama/win32.py
@@ -0,0 +1,154 @@
+# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
+
+# from winbase.h
+STDOUT = -11
+STDERR = -12
+
+try:
+    import ctypes
+    from ctypes import LibraryLoader
+    windll = LibraryLoader(ctypes.WinDLL)
+    from ctypes import wintypes
+except (AttributeError, ImportError):
+    windll = None
+    SetConsoleTextAttribute = lambda *_: None
+    winapi_test = lambda *_: None
+else:
+    from ctypes import byref, Structure, c_char, POINTER
+
+    COORD = wintypes._COORD
+
+    class CONSOLE_SCREEN_BUFFER_INFO(Structure):
+        """struct in wincon.h."""
+        _fields_ = [
+            ("dwSize", COORD),
+            ("dwCursorPosition", COORD),
+            ("wAttributes", wintypes.WORD),
+            ("srWindow", wintypes.SMALL_RECT),
+            ("dwMaximumWindowSize", COORD),
+        ]
+        def __str__(self):
+            return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % (
+                self.dwSize.Y, self.dwSize.X
+                , self.dwCursorPosition.Y, self.dwCursorPosition.X
+                , self.wAttributes
+                , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right
+                , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X
+            )
+
+    _GetStdHandle = windll.kernel32.GetStdHandle
+    _GetStdHandle.argtypes = [
+        wintypes.DWORD,
+    ]
+    _GetStdHandle.restype = wintypes.HANDLE
+
+    _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo
+    _GetConsoleScreenBufferInfo.argtypes = [
+        wintypes.HANDLE,
+        POINTER(CONSOLE_SCREEN_BUFFER_INFO),
+    ]
+    _GetConsoleScreenBufferInfo.restype = wintypes.BOOL
+
+    _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute
+    _SetConsoleTextAttribute.argtypes = [
+        wintypes.HANDLE,
+        wintypes.WORD,
+    ]
+    _SetConsoleTextAttribute.restype = wintypes.BOOL
+
+    _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition
+    _SetConsoleCursorPosition.argtypes = [
+        wintypes.HANDLE,
+        COORD,
+    ]
+    _SetConsoleCursorPosition.restype = wintypes.BOOL
+
+    _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA
+    _FillConsoleOutputCharacterA.argtypes = [
+        wintypes.HANDLE,
+        c_char,
+        wintypes.DWORD,
+        COORD,
+        POINTER(wintypes.DWORD),
+    ]
+    _FillConsoleOutputCharacterA.restype = wintypes.BOOL
+
+    _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute
+    _FillConsoleOutputAttribute.argtypes = [
+        wintypes.HANDLE,
+        wintypes.WORD,
+        wintypes.DWORD,
+        COORD,
+        POINTER(wintypes.DWORD),
+    ]
+    _FillConsoleOutputAttribute.restype = wintypes.BOOL
+
+    _SetConsoleTitleW = windll.kernel32.SetConsoleTitleA
+    _SetConsoleTitleW.argtypes = [
+        wintypes.LPCSTR
+    ]
+    _SetConsoleTitleW.restype = wintypes.BOOL
+
+    handles = {
+        STDOUT: _GetStdHandle(STDOUT),
+        STDERR: _GetStdHandle(STDERR),
+    }
+
+    def winapi_test():
+        handle = handles[STDOUT]
+        csbi = CONSOLE_SCREEN_BUFFER_INFO()
+        success = _GetConsoleScreenBufferInfo(
+            handle, byref(csbi))
+        return bool(success)
+
+    def GetConsoleScreenBufferInfo(stream_id=STDOUT):
+        handle = handles[stream_id]
+        csbi = CONSOLE_SCREEN_BUFFER_INFO()
+        success = _GetConsoleScreenBufferInfo(
+            handle, byref(csbi))
+        return csbi
+
+    def SetConsoleTextAttribute(stream_id, attrs):
+        handle = handles[stream_id]
+        return _SetConsoleTextAttribute(handle, attrs)
+
+    def SetConsoleCursorPosition(stream_id, position, adjust=True):
+        position = COORD(*position)
+        # If the position is out of range, do nothing.
+        if position.Y <= 0 or position.X <= 0:
+            return
+        # Adjust for Windows' SetConsoleCursorPosition:
+        #    1. being 0-based, while ANSI is 1-based.
+        #    2. expecting (x,y), while ANSI uses (y,x).
+        adjusted_position = COORD(position.Y - 1, position.X - 1)
+        if adjust:
+            # Adjust for viewport's scroll position
+            sr = GetConsoleScreenBufferInfo(STDOUT).srWindow
+            adjusted_position.Y += sr.Top
+            adjusted_position.X += sr.Left
+        # Resume normal processing
+        handle = handles[stream_id]
+        return _SetConsoleCursorPosition(handle, adjusted_position)
+
+    def FillConsoleOutputCharacter(stream_id, char, length, start):
+        handle = handles[stream_id]
+        char = c_char(char.encode())
+        length = wintypes.DWORD(length)
+        num_written = wintypes.DWORD(0)
+        # Note that this is hard-coded for ANSI (vs wide) bytes.
+        success = _FillConsoleOutputCharacterA(
+            handle, char, length, start, byref(num_written))
+        return num_written.value
+
+    def FillConsoleOutputAttribute(stream_id, attr, length, start):
+        ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )'''
+        handle = handles[stream_id]
+        attribute = wintypes.WORD(attr)
+        length = wintypes.DWORD(length)
+        num_written = wintypes.DWORD(0)
+        # Note that this is hard-coded for ANSI (vs wide) bytes.
+        return _FillConsoleOutputAttribute(
+            handle, attribute, length, start, byref(num_written))
+
+    def SetConsoleTitle(title):
+        return _SetConsoleTitleW(title)
diff --git a/vendor/pip-9.0.3/pip/_vendor/colorama/winterm.py b/vendor/pip-9.0.3/pip/_vendor/colorama/winterm.py
new file mode 100644
index 0000000000000000000000000000000000000000..60309d3c07aa4c1a66388d0d2530e7086d46f091
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/colorama/winterm.py
@@ -0,0 +1,162 @@
+# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
+from . import win32
+
+
+# from wincon.h
+class WinColor(object):
+    BLACK   = 0
+    BLUE    = 1
+    GREEN   = 2
+    CYAN    = 3
+    RED     = 4
+    MAGENTA = 5
+    YELLOW  = 6
+    GREY    = 7
+
+# from wincon.h
+class WinStyle(object):
+    NORMAL              = 0x00 # dim text, dim background
+    BRIGHT              = 0x08 # bright text, dim background
+    BRIGHT_BACKGROUND   = 0x80 # dim text, bright background
+
+class WinTerm(object):
+
+    def __init__(self):
+        self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes
+        self.set_attrs(self._default)
+        self._default_fore = self._fore
+        self._default_back = self._back
+        self._default_style = self._style
+        # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style.
+        # So that LIGHT_EX colors and BRIGHT style do not clobber each other,
+        # we track them separately, since LIGHT_EX is overwritten by Fore/Back
+        # and BRIGHT is overwritten by Style codes.
+        self._light = 0
+
+    def get_attrs(self):
+        return self._fore + self._back * 16 + (self._style | self._light)
+
+    def set_attrs(self, value):
+        self._fore = value & 7
+        self._back = (value >> 4) & 7
+        self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND)
+
+    def reset_all(self, on_stderr=None):
+        self.set_attrs(self._default)
+        self.set_console(attrs=self._default)
+
+    def fore(self, fore=None, light=False, on_stderr=False):
+        if fore is None:
+            fore = self._default_fore
+        self._fore = fore
+        # Emulate LIGHT_EX with BRIGHT Style
+        if light:
+            self._light |= WinStyle.BRIGHT
+        else:
+            self._light &= ~WinStyle.BRIGHT
+        self.set_console(on_stderr=on_stderr)
+
+    def back(self, back=None, light=False, on_stderr=False):
+        if back is None:
+            back = self._default_back
+        self._back = back
+        # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style
+        if light:
+            self._light |= WinStyle.BRIGHT_BACKGROUND
+        else:
+            self._light &= ~WinStyle.BRIGHT_BACKGROUND
+        self.set_console(on_stderr=on_stderr)
+
+    def style(self, style=None, on_stderr=False):
+        if style is None:
+            style = self._default_style
+        self._style = style
+        self.set_console(on_stderr=on_stderr)
+
+    def set_console(self, attrs=None, on_stderr=False):
+        if attrs is None:
+            attrs = self.get_attrs()
+        handle = win32.STDOUT
+        if on_stderr:
+            handle = win32.STDERR
+        win32.SetConsoleTextAttribute(handle, attrs)
+
+    def get_position(self, handle):
+        position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition
+        # Because Windows coordinates are 0-based,
+        # and win32.SetConsoleCursorPosition expects 1-based.
+        position.X += 1
+        position.Y += 1
+        return position
+
+    def set_cursor_position(self, position=None, on_stderr=False):
+        if position is None:
+            # I'm not currently tracking the position, so there is no default.
+            # position = self.get_position()
+            return
+        handle = win32.STDOUT
+        if on_stderr:
+            handle = win32.STDERR
+        win32.SetConsoleCursorPosition(handle, position)
+
+    def cursor_adjust(self, x, y, on_stderr=False):
+        handle = win32.STDOUT
+        if on_stderr:
+            handle = win32.STDERR
+        position = self.get_position(handle)
+        adjusted_position = (position.Y + y, position.X + x)
+        win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False)
+
+    def erase_screen(self, mode=0, on_stderr=False):
+        # 0 should clear from the cursor to the end of the screen.
+        # 1 should clear from the cursor to the beginning of the screen.
+        # 2 should clear the entire screen, and move cursor to (1,1)
+        handle = win32.STDOUT
+        if on_stderr:
+            handle = win32.STDERR
+        csbi = win32.GetConsoleScreenBufferInfo(handle)
+        # get the number of character cells in the current buffer
+        cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y
+        # get number of character cells before current cursor position
+        cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X
+        if mode == 0:
+            from_coord = csbi.dwCursorPosition
+            cells_to_erase = cells_in_screen - cells_before_cursor
+        if mode == 1:
+            from_coord = win32.COORD(0, 0)
+            cells_to_erase = cells_before_cursor
+        elif mode == 2:
+            from_coord = win32.COORD(0, 0)
+            cells_to_erase = cells_in_screen
+        # fill the entire screen with blanks
+        win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord)
+        # now set the buffer's attributes accordingly
+        win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord)
+        if mode == 2:
+            # put the cursor where needed
+            win32.SetConsoleCursorPosition(handle, (1, 1))
+
+    def erase_line(self, mode=0, on_stderr=False):
+        # 0 should clear from the cursor to the end of the line.
+        # 1 should clear from the cursor to the beginning of the line.
+        # 2 should clear the entire line.
+        handle = win32.STDOUT
+        if on_stderr:
+            handle = win32.STDERR
+        csbi = win32.GetConsoleScreenBufferInfo(handle)
+        if mode == 0:
+            from_coord = csbi.dwCursorPosition
+            cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X
+        if mode == 1:
+            from_coord = win32.COORD(0, csbi.dwCursorPosition.Y)
+            cells_to_erase = csbi.dwCursorPosition.X
+        elif mode == 2:
+            from_coord = win32.COORD(0, csbi.dwCursorPosition.Y)
+            cells_to_erase = csbi.dwSize.X
+        # fill the entire screen with blanks
+        win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord)
+        # now set the buffer's attributes accordingly
+        win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord)
+
+    def set_title(self, title):
+        win32.SetConsoleTitle(title)
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/__init__.py b/vendor/pip-9.0.3/pip/_vendor/distlib/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..d186b0a36c3004781c6d058f6999901c44f12c74
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/__init__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012-2016 Vinay Sajip.
+# Licensed to the Python Software Foundation under a contributor agreement.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+import logging
+
+__version__ = '0.2.4'
+
+class DistlibException(Exception):
+    pass
+
+try:
+    from logging import NullHandler
+except ImportError: # pragma: no cover
+    class NullHandler(logging.Handler):
+        def handle(self, record): pass
+        def emit(self, record): pass
+        def createLock(self): self.lock = None
+
+logger = logging.getLogger(__name__)
+logger.addHandler(NullHandler())
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/__init__.py b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..f7dbf4c9aa8314816f9bcbe5357146369ee71391
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/__init__.py
@@ -0,0 +1,6 @@
+"""Modules copied from Python 3 standard libraries, for internal use only.
+
+Individual classes and functions are found in d2._backport.misc.  Intended
+usage is to always import things missing from 3.1 from that module: the
+built-in/stdlib objects will be used if found.
+"""
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/misc.py b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/misc.py
new file mode 100644
index 0000000000000000000000000000000000000000..cfb318d34f761cde906d8b02dde3f9329688b8c6
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/misc.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012 The Python Software Foundation.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+"""Backports for individual classes and functions."""
+
+import os
+import sys
+
+__all__ = ['cache_from_source', 'callable', 'fsencode']
+
+
+try:
+    from imp import cache_from_source
+except ImportError:
+    def cache_from_source(py_file, debug=__debug__):
+        ext = debug and 'c' or 'o'
+        return py_file + ext
+
+
+try:
+    callable = callable
+except NameError:
+    from collections import Callable
+
+    def callable(obj):
+        return isinstance(obj, Callable)
+
+
+try:
+    fsencode = os.fsencode
+except AttributeError:
+    def fsencode(filename):
+        if isinstance(filename, bytes):
+            return filename
+        elif isinstance(filename, str):
+            return filename.encode(sys.getfilesystemencoding())
+        else:
+            raise TypeError("expect bytes or str, not %s" %
+                            type(filename).__name__)
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/shutil.py b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/shutil.py
new file mode 100644
index 0000000000000000000000000000000000000000..159e49ee8c2aa698aea9a191db91a14716187324
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/shutil.py
@@ -0,0 +1,761 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012 The Python Software Foundation.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+"""Utility functions for copying and archiving files and directory trees.
+
+XXX The functions here don't copy the resource fork or other metadata on Mac.
+
+"""
+
+import os
+import sys
+import stat
+from os.path import abspath
+import fnmatch
+import collections
+import errno
+from . import tarfile
+
+try:
+    import bz2
+    _BZ2_SUPPORTED = True
+except ImportError:
+    _BZ2_SUPPORTED = False
+
+try:
+    from pwd import getpwnam
+except ImportError:
+    getpwnam = None
+
+try:
+    from grp import getgrnam
+except ImportError:
+    getgrnam = None
+
+__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2",
+           "copytree", "move", "rmtree", "Error", "SpecialFileError",
+           "ExecError", "make_archive", "get_archive_formats",
+           "register_archive_format", "unregister_archive_format",
+           "get_unpack_formats", "register_unpack_format",
+           "unregister_unpack_format", "unpack_archive", "ignore_patterns"]
+
+class Error(EnvironmentError):
+    pass
+
+class SpecialFileError(EnvironmentError):
+    """Raised when trying to do a kind of operation (e.g. copying) which is
+    not supported on a special file (e.g. a named pipe)"""
+
+class ExecError(EnvironmentError):
+    """Raised when a command could not be executed"""
+
+class ReadError(EnvironmentError):
+    """Raised when an archive cannot be read"""
+
+class RegistryError(Exception):
+    """Raised when a registry operation with the archiving
+    and unpacking registries fails"""
+
+
+try:
+    WindowsError
+except NameError:
+    WindowsError = None
+
+def copyfileobj(fsrc, fdst, length=16*1024):
+    """copy data from file-like object fsrc to file-like object fdst"""
+    while 1:
+        buf = fsrc.read(length)
+        if not buf:
+            break
+        fdst.write(buf)
+
+def _samefile(src, dst):
+    # Macintosh, Unix.
+    if hasattr(os.path, 'samefile'):
+        try:
+            return os.path.samefile(src, dst)
+        except OSError:
+            return False
+
+    # All other platforms: check for same pathname.
+    return (os.path.normcase(os.path.abspath(src)) ==
+            os.path.normcase(os.path.abspath(dst)))
+
+def copyfile(src, dst):
+    """Copy data from src to dst"""
+    if _samefile(src, dst):
+        raise Error("`%s` and `%s` are the same file" % (src, dst))
+
+    for fn in [src, dst]:
+        try:
+            st = os.stat(fn)
+        except OSError:
+            # File most likely does not exist
+            pass
+        else:
+            # XXX What about other special files? (sockets, devices...)
+            if stat.S_ISFIFO(st.st_mode):
+                raise SpecialFileError("`%s` is a named pipe" % fn)
+
+    with open(src, 'rb') as fsrc:
+        with open(dst, 'wb') as fdst:
+            copyfileobj(fsrc, fdst)
+
+def copymode(src, dst):
+    """Copy mode bits from src to dst"""
+    if hasattr(os, 'chmod'):
+        st = os.stat(src)
+        mode = stat.S_IMODE(st.st_mode)
+        os.chmod(dst, mode)
+
+def copystat(src, dst):
+    """Copy all stat info (mode bits, atime, mtime, flags) from src to dst"""
+    st = os.stat(src)
+    mode = stat.S_IMODE(st.st_mode)
+    if hasattr(os, 'utime'):
+        os.utime(dst, (st.st_atime, st.st_mtime))
+    if hasattr(os, 'chmod'):
+        os.chmod(dst, mode)
+    if hasattr(os, 'chflags') and hasattr(st, 'st_flags'):
+        try:
+            os.chflags(dst, st.st_flags)
+        except OSError as why:
+            if (not hasattr(errno, 'EOPNOTSUPP') or
+                why.errno != errno.EOPNOTSUPP):
+                raise
+
+def copy(src, dst):
+    """Copy data and mode bits ("cp src dst").
+
+    The destination may be a directory.
+
+    """
+    if os.path.isdir(dst):
+        dst = os.path.join(dst, os.path.basename(src))
+    copyfile(src, dst)
+    copymode(src, dst)
+
+def copy2(src, dst):
+    """Copy data and all stat info ("cp -p src dst").
+
+    The destination may be a directory.
+
+    """
+    if os.path.isdir(dst):
+        dst = os.path.join(dst, os.path.basename(src))
+    copyfile(src, dst)
+    copystat(src, dst)
+
+def ignore_patterns(*patterns):
+    """Function that can be used as copytree() ignore parameter.
+
+    Patterns is a sequence of glob-style patterns
+    that are used to exclude files"""
+    def _ignore_patterns(path, names):
+        ignored_names = []
+        for pattern in patterns:
+            ignored_names.extend(fnmatch.filter(names, pattern))
+        return set(ignored_names)
+    return _ignore_patterns
+
+def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,
+             ignore_dangling_symlinks=False):
+    """Recursively copy a directory tree.
+
+    The destination directory must not already exist.
+    If exception(s) occur, an Error is raised with a list of reasons.
+
+    If the optional symlinks flag is true, symbolic links in the
+    source tree result in symbolic links in the destination tree; if
+    it is false, the contents of the files pointed to by symbolic
+    links are copied. If the file pointed by the symlink doesn't
+    exist, an exception will be added in the list of errors raised in
+    an Error exception at the end of the copy process.
+
+    You can set the optional ignore_dangling_symlinks flag to true if you
+    want to silence this exception. Notice that this has no effect on
+    platforms that don't support os.symlink.
+
+    The optional ignore argument is a callable. If given, it
+    is called with the `src` parameter, which is the directory
+    being visited by copytree(), and `names` which is the list of
+    `src` contents, as returned by os.listdir():
+
+        callable(src, names) -> ignored_names
+
+    Since copytree() is called recursively, the callable will be
+    called once for each directory that is copied. It returns a
+    list of names relative to the `src` directory that should
+    not be copied.
+
+    The optional copy_function argument is a callable that will be used
+    to copy each file. It will be called with the source path and the
+    destination path as arguments. By default, copy2() is used, but any
+    function that supports the same signature (like copy()) can be used.
+
+    """
+    names = os.listdir(src)
+    if ignore is not None:
+        ignored_names = ignore(src, names)
+    else:
+        ignored_names = set()
+
+    os.makedirs(dst)
+    errors = []
+    for name in names:
+        if name in ignored_names:
+            continue
+        srcname = os.path.join(src, name)
+        dstname = os.path.join(dst, name)
+        try:
+            if os.path.islink(srcname):
+                linkto = os.readlink(srcname)
+                if symlinks:
+                    os.symlink(linkto, dstname)
+                else:
+                    # ignore dangling symlink if the flag is on
+                    if not os.path.exists(linkto) and ignore_dangling_symlinks:
+                        continue
+                    # otherwise let the copy occurs. copy2 will raise an error
+                    copy_function(srcname, dstname)
+            elif os.path.isdir(srcname):
+                copytree(srcname, dstname, symlinks, ignore, copy_function)
+            else:
+                # Will raise a SpecialFileError for unsupported file types
+                copy_function(srcname, dstname)
+        # catch the Error from the recursive copytree so that we can
+        # continue with other files
+        except Error as err:
+            errors.extend(err.args[0])
+        except EnvironmentError as why:
+            errors.append((srcname, dstname, str(why)))
+    try:
+        copystat(src, dst)
+    except OSError as why:
+        if WindowsError is not None and isinstance(why, WindowsError):
+            # Copying file access times may fail on Windows
+            pass
+        else:
+            errors.extend((src, dst, str(why)))
+    if errors:
+        raise Error(errors)
+
+def rmtree(path, ignore_errors=False, onerror=None):
+    """Recursively delete a directory tree.
+
+    If ignore_errors is set, errors are ignored; otherwise, if onerror
+    is set, it is called to handle the error with arguments (func,
+    path, exc_info) where func is os.listdir, os.remove, or os.rmdir;
+    path is the argument to that function that caused it to fail; and
+    exc_info is a tuple returned by sys.exc_info().  If ignore_errors
+    is false and onerror is None, an exception is raised.
+
+    """
+    if ignore_errors:
+        def onerror(*args):
+            pass
+    elif onerror is None:
+        def onerror(*args):
+            raise
+    try:
+        if os.path.islink(path):
+            # symlinks to directories are forbidden, see bug #1669
+            raise OSError("Cannot call rmtree on a symbolic link")
+    except OSError:
+        onerror(os.path.islink, path, sys.exc_info())
+        # can't continue even if onerror hook returns
+        return
+    names = []
+    try:
+        names = os.listdir(path)
+    except os.error:
+        onerror(os.listdir, path, sys.exc_info())
+    for name in names:
+        fullname = os.path.join(path, name)
+        try:
+            mode = os.lstat(fullname).st_mode
+        except os.error:
+            mode = 0
+        if stat.S_ISDIR(mode):
+            rmtree(fullname, ignore_errors, onerror)
+        else:
+            try:
+                os.remove(fullname)
+            except os.error:
+                onerror(os.remove, fullname, sys.exc_info())
+    try:
+        os.rmdir(path)
+    except os.error:
+        onerror(os.rmdir, path, sys.exc_info())
+
+
+def _basename(path):
+    # A basename() variant which first strips the trailing slash, if present.
+    # Thus we always get the last component of the path, even for directories.
+    return os.path.basename(path.rstrip(os.path.sep))
+
+def move(src, dst):
+    """Recursively move a file or directory to another location. This is
+    similar to the Unix "mv" command.
+
+    If the destination is a directory or a symlink to a directory, the source
+    is moved inside the directory. The destination path must not already
+    exist.
+
+    If the destination already exists but is not a directory, it may be
+    overwritten depending on os.rename() semantics.
+
+    If the destination is on our current filesystem, then rename() is used.
+    Otherwise, src is copied to the destination and then removed.
+    A lot more could be done here...  A look at a mv.c shows a lot of
+    the issues this implementation glosses over.
+
+    """
+    real_dst = dst
+    if os.path.isdir(dst):
+        if _samefile(src, dst):
+            # We might be on a case insensitive filesystem,
+            # perform the rename anyway.
+            os.rename(src, dst)
+            return
+
+        real_dst = os.path.join(dst, _basename(src))
+        if os.path.exists(real_dst):
+            raise Error("Destination path '%s' already exists" % real_dst)
+    try:
+        os.rename(src, real_dst)
+    except OSError:
+        if os.path.isdir(src):
+            if _destinsrc(src, dst):
+                raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst))
+            copytree(src, real_dst, symlinks=True)
+            rmtree(src)
+        else:
+            copy2(src, real_dst)
+            os.unlink(src)
+
+def _destinsrc(src, dst):
+    src = abspath(src)
+    dst = abspath(dst)
+    if not src.endswith(os.path.sep):
+        src += os.path.sep
+    if not dst.endswith(os.path.sep):
+        dst += os.path.sep
+    return dst.startswith(src)
+
+def _get_gid(name):
+    """Returns a gid, given a group name."""
+    if getgrnam is None or name is None:
+        return None
+    try:
+        result = getgrnam(name)
+    except KeyError:
+        result = None
+    if result is not None:
+        return result[2]
+    return None
+
+def _get_uid(name):
+    """Returns an uid, given a user name."""
+    if getpwnam is None or name is None:
+        return None
+    try:
+        result = getpwnam(name)
+    except KeyError:
+        result = None
+    if result is not None:
+        return result[2]
+    return None
+
+def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0,
+                  owner=None, group=None, logger=None):
+    """Create a (possibly compressed) tar file from all the files under
+    'base_dir'.
+
+    'compress' must be "gzip" (the default), "bzip2", or None.
+
+    'owner' and 'group' can be used to define an owner and a group for the
+    archive that is being built. If not provided, the current owner and group
+    will be used.
+
+    The output tar file will be named 'base_name' +  ".tar", possibly plus
+    the appropriate compression extension (".gz", or ".bz2").
+
+    Returns the output filename.
+    """
+    tar_compression = {'gzip': 'gz', None: ''}
+    compress_ext = {'gzip': '.gz'}
+
+    if _BZ2_SUPPORTED:
+        tar_compression['bzip2'] = 'bz2'
+        compress_ext['bzip2'] = '.bz2'
+
+    # flags for compression program, each element of list will be an argument
+    if compress is not None and compress not in compress_ext:
+        raise ValueError("bad value for 'compress', or compression format not "
+                         "supported : {0}".format(compress))
+
+    archive_name = base_name + '.tar' + compress_ext.get(compress, '')
+    archive_dir = os.path.dirname(archive_name)
+
+    if not os.path.exists(archive_dir):
+        if logger is not None:
+            logger.info("creating %s", archive_dir)
+        if not dry_run:
+            os.makedirs(archive_dir)
+
+    # creating the tarball
+    if logger is not None:
+        logger.info('Creating tar archive')
+
+    uid = _get_uid(owner)
+    gid = _get_gid(group)
+
+    def _set_uid_gid(tarinfo):
+        if gid is not None:
+            tarinfo.gid = gid
+            tarinfo.gname = group
+        if uid is not None:
+            tarinfo.uid = uid
+            tarinfo.uname = owner
+        return tarinfo
+
+    if not dry_run:
+        tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress])
+        try:
+            tar.add(base_dir, filter=_set_uid_gid)
+        finally:
+            tar.close()
+
+    return archive_name
+
+def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False):
+    # XXX see if we want to keep an external call here
+    if verbose:
+        zipoptions = "-r"
+    else:
+        zipoptions = "-rq"
+    from distutils.errors import DistutilsExecError
+    from distutils.spawn import spawn
+    try:
+        spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run)
+    except DistutilsExecError:
+        # XXX really should distinguish between "couldn't find
+        # external 'zip' command" and "zip failed".
+        raise ExecError("unable to create zip file '%s': "
+            "could neither import the 'zipfile' module nor "
+            "find a standalone zip utility") % zip_filename
+
+def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None):
+    """Create a zip file from all the files under 'base_dir'.
+
+    The output zip file will be named 'base_name' + ".zip".  Uses either the
+    "zipfile" Python module (if available) or the InfoZIP "zip" utility
+    (if installed and found on the default search path).  If neither tool is
+    available, raises ExecError.  Returns the name of the output zip
+    file.
+    """
+    zip_filename = base_name + ".zip"
+    archive_dir = os.path.dirname(base_name)
+
+    if not os.path.exists(archive_dir):
+        if logger is not None:
+            logger.info("creating %s", archive_dir)
+        if not dry_run:
+            os.makedirs(archive_dir)
+
+    # If zipfile module is not available, try spawning an external 'zip'
+    # command.
+    try:
+        import zipfile
+    except ImportError:
+        zipfile = None
+
+    if zipfile is None:
+        _call_external_zip(base_dir, zip_filename, verbose, dry_run)
+    else:
+        if logger is not None:
+            logger.info("creating '%s' and adding '%s' to it",
+                        zip_filename, base_dir)
+
+        if not dry_run:
+            zip = zipfile.ZipFile(zip_filename, "w",
+                                  compression=zipfile.ZIP_DEFLATED)
+
+            for dirpath, dirnames, filenames in os.walk(base_dir):
+                for name in filenames:
+                    path = os.path.normpath(os.path.join(dirpath, name))
+                    if os.path.isfile(path):
+                        zip.write(path, path)
+                        if logger is not None:
+                            logger.info("adding '%s'", path)
+            zip.close()
+
+    return zip_filename
+
+_ARCHIVE_FORMATS = {
+    'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"),
+    'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"),
+    'tar':   (_make_tarball, [('compress', None)], "uncompressed tar file"),
+    'zip':   (_make_zipfile, [], "ZIP file"),
+    }
+
+if _BZ2_SUPPORTED:
+    _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')],
+                                "bzip2'ed tar-file")
+
+def get_archive_formats():
+    """Returns a list of supported formats for archiving and unarchiving.
+
+    Each element of the returned sequence is a tuple (name, description)
+    """
+    formats = [(name, registry[2]) for name, registry in
+               _ARCHIVE_FORMATS.items()]
+    formats.sort()
+    return formats
+
+def register_archive_format(name, function, extra_args=None, description=''):
+    """Registers an archive format.
+
+    name is the name of the format. function is the callable that will be
+    used to create archives. If provided, extra_args is a sequence of
+    (name, value) tuples that will be passed as arguments to the callable.
+    description can be provided to describe the format, and will be returned
+    by the get_archive_formats() function.
+    """
+    if extra_args is None:
+        extra_args = []
+    if not isinstance(function, collections.Callable):
+        raise TypeError('The %s object is not callable' % function)
+    if not isinstance(extra_args, (tuple, list)):
+        raise TypeError('extra_args needs to be a sequence')
+    for element in extra_args:
+        if not isinstance(element, (tuple, list)) or len(element) !=2:
+            raise TypeError('extra_args elements are : (arg_name, value)')
+
+    _ARCHIVE_FORMATS[name] = (function, extra_args, description)
+
+def unregister_archive_format(name):
+    del _ARCHIVE_FORMATS[name]
+
+def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0,
+                 dry_run=0, owner=None, group=None, logger=None):
+    """Create an archive file (eg. zip or tar).
+
+    'base_name' is the name of the file to create, minus any format-specific
+    extension; 'format' is the archive format: one of "zip", "tar", "bztar"
+    or "gztar".
+
+    'root_dir' is a directory that will be the root directory of the
+    archive; ie. we typically chdir into 'root_dir' before creating the
+    archive.  'base_dir' is the directory where we start archiving from;
+    ie. 'base_dir' will be the common prefix of all files and
+    directories in the archive.  'root_dir' and 'base_dir' both default
+    to the current directory.  Returns the name of the archive file.
+
+    'owner' and 'group' are used when creating a tar archive. By default,
+    uses the current owner and group.
+    """
+    save_cwd = os.getcwd()
+    if root_dir is not None:
+        if logger is not None:
+            logger.debug("changing into '%s'", root_dir)
+        base_name = os.path.abspath(base_name)
+        if not dry_run:
+            os.chdir(root_dir)
+
+    if base_dir is None:
+        base_dir = os.curdir
+
+    kwargs = {'dry_run': dry_run, 'logger': logger}
+
+    try:
+        format_info = _ARCHIVE_FORMATS[format]
+    except KeyError:
+        raise ValueError("unknown archive format '%s'" % format)
+
+    func = format_info[0]
+    for arg, val in format_info[1]:
+        kwargs[arg] = val
+
+    if format != 'zip':
+        kwargs['owner'] = owner
+        kwargs['group'] = group
+
+    try:
+        filename = func(base_name, base_dir, **kwargs)
+    finally:
+        if root_dir is not None:
+            if logger is not None:
+                logger.debug("changing back to '%s'", save_cwd)
+            os.chdir(save_cwd)
+
+    return filename
+
+
+def get_unpack_formats():
+    """Returns a list of supported formats for unpacking.
+
+    Each element of the returned sequence is a tuple
+    (name, extensions, description)
+    """
+    formats = [(name, info[0], info[3]) for name, info in
+               _UNPACK_FORMATS.items()]
+    formats.sort()
+    return formats
+
+def _check_unpack_options(extensions, function, extra_args):
+    """Checks what gets registered as an unpacker."""
+    # first make sure no other unpacker is registered for this extension
+    existing_extensions = {}
+    for name, info in _UNPACK_FORMATS.items():
+        for ext in info[0]:
+            existing_extensions[ext] = name
+
+    for extension in extensions:
+        if extension in existing_extensions:
+            msg = '%s is already registered for "%s"'
+            raise RegistryError(msg % (extension,
+                                       existing_extensions[extension]))
+
+    if not isinstance(function, collections.Callable):
+        raise TypeError('The registered function must be a callable')
+
+
+def register_unpack_format(name, extensions, function, extra_args=None,
+                           description=''):
+    """Registers an unpack format.
+
+    `name` is the name of the format. `extensions` is a list of extensions
+    corresponding to the format.
+
+    `function` is the callable that will be
+    used to unpack archives. The callable will receive archives to unpack.
+    If it's unable to handle an archive, it needs to raise a ReadError
+    exception.
+
+    If provided, `extra_args` is a sequence of
+    (name, value) tuples that will be passed as arguments to the callable.
+    description can be provided to describe the format, and will be returned
+    by the get_unpack_formats() function.
+    """
+    if extra_args is None:
+        extra_args = []
+    _check_unpack_options(extensions, function, extra_args)
+    _UNPACK_FORMATS[name] = extensions, function, extra_args, description
+
+def unregister_unpack_format(name):
+    """Removes the pack format from the registry."""
+    del _UNPACK_FORMATS[name]
+
+def _ensure_directory(path):
+    """Ensure that the parent directory of `path` exists"""
+    dirname = os.path.dirname(path)
+    if not os.path.isdir(dirname):
+        os.makedirs(dirname)
+
+def _unpack_zipfile(filename, extract_dir):
+    """Unpack zip `filename` to `extract_dir`
+    """
+    try:
+        import zipfile
+    except ImportError:
+        raise ReadError('zlib not supported, cannot unpack this archive.')
+
+    if not zipfile.is_zipfile(filename):
+        raise ReadError("%s is not a zip file" % filename)
+
+    zip = zipfile.ZipFile(filename)
+    try:
+        for info in zip.infolist():
+            name = info.filename
+
+            # don't extract absolute paths or ones with .. in them
+            if name.startswith('/') or '..' in name:
+                continue
+
+            target = os.path.join(extract_dir, *name.split('/'))
+            if not target:
+                continue
+
+            _ensure_directory(target)
+            if not name.endswith('/'):
+                # file
+                data = zip.read(info.filename)
+                f = open(target, 'wb')
+                try:
+                    f.write(data)
+                finally:
+                    f.close()
+                    del data
+    finally:
+        zip.close()
+
+def _unpack_tarfile(filename, extract_dir):
+    """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir`
+    """
+    try:
+        tarobj = tarfile.open(filename)
+    except tarfile.TarError:
+        raise ReadError(
+            "%s is not a compressed or uncompressed tar file" % filename)
+    try:
+        tarobj.extractall(extract_dir)
+    finally:
+        tarobj.close()
+
+_UNPACK_FORMATS = {
+    'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"),
+    'tar':   (['.tar'], _unpack_tarfile, [], "uncompressed tar file"),
+    'zip':   (['.zip'], _unpack_zipfile, [], "ZIP file")
+    }
+
+if _BZ2_SUPPORTED:
+    _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [],
+                                "bzip2'ed tar-file")
+
+def _find_unpack_format(filename):
+    for name, info in _UNPACK_FORMATS.items():
+        for extension in info[0]:
+            if filename.endswith(extension):
+                return name
+    return None
+
+def unpack_archive(filename, extract_dir=None, format=None):
+    """Unpack an archive.
+
+    `filename` is the name of the archive.
+
+    `extract_dir` is the name of the target directory, where the archive
+    is unpacked. If not provided, the current working directory is used.
+
+    `format` is the archive format: one of "zip", "tar", or "gztar". Or any
+    other registered format. If not provided, unpack_archive will use the
+    filename extension and see if an unpacker was registered for that
+    extension.
+
+    In case none is found, a ValueError is raised.
+    """
+    if extract_dir is None:
+        extract_dir = os.getcwd()
+
+    if format is not None:
+        try:
+            format_info = _UNPACK_FORMATS[format]
+        except KeyError:
+            raise ValueError("Unknown unpack format '{0}'".format(format))
+
+        func = format_info[1]
+        func(filename, extract_dir, **dict(format_info[2]))
+    else:
+        # we need to look at the registered unpackers supported extensions
+        format = _find_unpack_format(filename)
+        if format is None:
+            raise ReadError("Unknown archive format '{0}'".format(filename))
+
+        func = _UNPACK_FORMATS[format][1]
+        kwargs = dict(_UNPACK_FORMATS[format][2])
+        func(filename, extract_dir, **kwargs)
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/sysconfig.cfg b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/sysconfig.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..1746bd01c1ad915b728ab58b4668c82b2bd578e1
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/sysconfig.cfg
@@ -0,0 +1,84 @@
+[posix_prefix]
+# Configuration directories.  Some of these come straight out of the
+# configure script.  They are for implementing the other variables, not to
+# be used directly in [resource_locations].
+confdir = /etc
+datadir = /usr/share
+libdir = /usr/lib
+statedir = /var
+# User resource directory
+local = ~/.local/{distribution.name}
+
+stdlib = {base}/lib/python{py_version_short}
+platstdlib = {platbase}/lib/python{py_version_short}
+purelib = {base}/lib/python{py_version_short}/site-packages
+platlib = {platbase}/lib/python{py_version_short}/site-packages
+include = {base}/include/python{py_version_short}{abiflags}
+platinclude = {platbase}/include/python{py_version_short}{abiflags}
+data = {base}
+
+[posix_home]
+stdlib = {base}/lib/python
+platstdlib = {base}/lib/python
+purelib = {base}/lib/python
+platlib = {base}/lib/python
+include = {base}/include/python
+platinclude = {base}/include/python
+scripts = {base}/bin
+data = {base}
+
+[nt]
+stdlib = {base}/Lib
+platstdlib = {base}/Lib
+purelib = {base}/Lib/site-packages
+platlib = {base}/Lib/site-packages
+include = {base}/Include
+platinclude = {base}/Include
+scripts = {base}/Scripts
+data = {base}
+
+[os2]
+stdlib = {base}/Lib
+platstdlib = {base}/Lib
+purelib = {base}/Lib/site-packages
+platlib = {base}/Lib/site-packages
+include = {base}/Include
+platinclude = {base}/Include
+scripts = {base}/Scripts
+data = {base}
+
+[os2_home]
+stdlib = {userbase}/lib/python{py_version_short}
+platstdlib = {userbase}/lib/python{py_version_short}
+purelib = {userbase}/lib/python{py_version_short}/site-packages
+platlib = {userbase}/lib/python{py_version_short}/site-packages
+include = {userbase}/include/python{py_version_short}
+scripts = {userbase}/bin
+data = {userbase}
+
+[nt_user]
+stdlib = {userbase}/Python{py_version_nodot}
+platstdlib = {userbase}/Python{py_version_nodot}
+purelib = {userbase}/Python{py_version_nodot}/site-packages
+platlib = {userbase}/Python{py_version_nodot}/site-packages
+include = {userbase}/Python{py_version_nodot}/Include
+scripts = {userbase}/Scripts
+data = {userbase}
+
+[posix_user]
+stdlib = {userbase}/lib/python{py_version_short}
+platstdlib = {userbase}/lib/python{py_version_short}
+purelib = {userbase}/lib/python{py_version_short}/site-packages
+platlib = {userbase}/lib/python{py_version_short}/site-packages
+include = {userbase}/include/python{py_version_short}
+scripts = {userbase}/bin
+data = {userbase}
+
+[osx_framework_user]
+stdlib = {userbase}/lib/python
+platstdlib = {userbase}/lib/python
+purelib = {userbase}/lib/python/site-packages
+platlib = {userbase}/lib/python/site-packages
+include = {userbase}/include
+scripts = {userbase}/bin
+data = {userbase}
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/sysconfig.py b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/sysconfig.py
new file mode 100644
index 0000000000000000000000000000000000000000..ec28480a656c9d286563bf21e3b02216756165f6
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/sysconfig.py
@@ -0,0 +1,788 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012 The Python Software Foundation.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+"""Access to Python's configuration information."""
+
+import codecs
+import os
+import re
+import sys
+from os.path import pardir, realpath
+try:
+    import configparser
+except ImportError:
+    import ConfigParser as configparser
+
+
+__all__ = [
+    'get_config_h_filename',
+    'get_config_var',
+    'get_config_vars',
+    'get_makefile_filename',
+    'get_path',
+    'get_path_names',
+    'get_paths',
+    'get_platform',
+    'get_python_version',
+    'get_scheme_names',
+    'parse_config_h',
+]
+
+
+def _safe_realpath(path):
+    try:
+        return realpath(path)
+    except OSError:
+        return path
+
+
+if sys.executable:
+    _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable))
+else:
+    # sys.executable can be empty if argv[0] has been changed and Python is
+    # unable to retrieve the real program name
+    _PROJECT_BASE = _safe_realpath(os.getcwd())
+
+if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower():
+    _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir))
+# PC/VS7.1
+if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower():
+    _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir))
+# PC/AMD64
+if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower():
+    _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir))
+
+
+def is_python_build():
+    for fn in ("Setup.dist", "Setup.local"):
+        if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)):
+            return True
+    return False
+
+_PYTHON_BUILD = is_python_build()
+
+_cfg_read = False
+
+def _ensure_cfg_read():
+    global _cfg_read
+    if not _cfg_read:
+        from ..resources import finder
+        backport_package = __name__.rsplit('.', 1)[0]
+        _finder = finder(backport_package)
+        _cfgfile = _finder.find('sysconfig.cfg')
+        assert _cfgfile, 'sysconfig.cfg exists'
+        with _cfgfile.as_stream() as s:
+            _SCHEMES.readfp(s)
+        if _PYTHON_BUILD:
+            for scheme in ('posix_prefix', 'posix_home'):
+                _SCHEMES.set(scheme, 'include', '{srcdir}/Include')
+                _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.')
+
+        _cfg_read = True
+
+
+_SCHEMES = configparser.RawConfigParser()
+_VAR_REPL = re.compile(r'\{([^{]*?)\}')
+
+def _expand_globals(config):
+    _ensure_cfg_read()
+    if config.has_section('globals'):
+        globals = config.items('globals')
+    else:
+        globals = tuple()
+
+    sections = config.sections()
+    for section in sections:
+        if section == 'globals':
+            continue
+        for option, value in globals:
+            if config.has_option(section, option):
+                continue
+            config.set(section, option, value)
+    config.remove_section('globals')
+
+    # now expanding local variables defined in the cfg file
+    #
+    for section in config.sections():
+        variables = dict(config.items(section))
+
+        def _replacer(matchobj):
+            name = matchobj.group(1)
+            if name in variables:
+                return variables[name]
+            return matchobj.group(0)
+
+        for option, value in config.items(section):
+            config.set(section, option, _VAR_REPL.sub(_replacer, value))
+
+#_expand_globals(_SCHEMES)
+
+ # FIXME don't rely on sys.version here, its format is an implementation detail
+ # of CPython, use sys.version_info or sys.hexversion
+_PY_VERSION = sys.version.split()[0]
+_PY_VERSION_SHORT = sys.version[:3]
+_PY_VERSION_SHORT_NO_DOT = _PY_VERSION[0] + _PY_VERSION[2]
+_PREFIX = os.path.normpath(sys.prefix)
+_EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
+_CONFIG_VARS = None
+_USER_BASE = None
+
+
+def _subst_vars(path, local_vars):
+    """In the string `path`, replace tokens like {some.thing} with the
+    corresponding value from the map `local_vars`.
+
+    If there is no corresponding value, leave the token unchanged.
+    """
+    def _replacer(matchobj):
+        name = matchobj.group(1)
+        if name in local_vars:
+            return local_vars[name]
+        elif name in os.environ:
+            return os.environ[name]
+        return matchobj.group(0)
+    return _VAR_REPL.sub(_replacer, path)
+
+
+def _extend_dict(target_dict, other_dict):
+    target_keys = target_dict.keys()
+    for key, value in other_dict.items():
+        if key in target_keys:
+            continue
+        target_dict[key] = value
+
+
+def _expand_vars(scheme, vars):
+    res = {}
+    if vars is None:
+        vars = {}
+    _extend_dict(vars, get_config_vars())
+
+    for key, value in _SCHEMES.items(scheme):
+        if os.name in ('posix', 'nt'):
+            value = os.path.expanduser(value)
+        res[key] = os.path.normpath(_subst_vars(value, vars))
+    return res
+
+
+def format_value(value, vars):
+    def _replacer(matchobj):
+        name = matchobj.group(1)
+        if name in vars:
+            return vars[name]
+        return matchobj.group(0)
+    return _VAR_REPL.sub(_replacer, value)
+
+
+def _get_default_scheme():
+    if os.name == 'posix':
+        # the default scheme for posix is posix_prefix
+        return 'posix_prefix'
+    return os.name
+
+
+def _getuserbase():
+    env_base = os.environ.get("PYTHONUSERBASE", None)
+
+    def joinuser(*args):
+        return os.path.expanduser(os.path.join(*args))
+
+    # what about 'os2emx', 'riscos' ?
+    if os.name == "nt":
+        base = os.environ.get("APPDATA") or "~"
+        if env_base:
+            return env_base
+        else:
+            return joinuser(base, "Python")
+
+    if sys.platform == "darwin":
+        framework = get_config_var("PYTHONFRAMEWORK")
+        if framework:
+            if env_base:
+                return env_base
+            else:
+                return joinuser("~", "Library", framework, "%d.%d" %
+                                sys.version_info[:2])
+
+    if env_base:
+        return env_base
+    else:
+        return joinuser("~", ".local")
+
+
+def _parse_makefile(filename, vars=None):
+    """Parse a Makefile-style file.
+
+    A dictionary containing name/value pairs is returned.  If an
+    optional dictionary is passed in as the second argument, it is
+    used instead of a new dictionary.
+    """
+    # Regexes needed for parsing Makefile (and similar syntaxes,
+    # like old-style Setup files).
+    _variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)")
+    _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
+    _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")
+
+    if vars is None:
+        vars = {}
+    done = {}
+    notdone = {}
+
+    with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f:
+        lines = f.readlines()
+
+    for line in lines:
+        if line.startswith('#') or line.strip() == '':
+            continue
+        m = _variable_rx.match(line)
+        if m:
+            n, v = m.group(1, 2)
+            v = v.strip()
+            # `$$' is a literal `$' in make
+            tmpv = v.replace('$$', '')
+
+            if "$" in tmpv:
+                notdone[n] = v
+            else:
+                try:
+                    v = int(v)
+                except ValueError:
+                    # insert literal `$'
+                    done[n] = v.replace('$$', '$')
+                else:
+                    done[n] = v
+
+    # do variable interpolation here
+    variables = list(notdone.keys())
+
+    # Variables with a 'PY_' prefix in the makefile. These need to
+    # be made available without that prefix through sysconfig.
+    # Special care is needed to ensure that variable expansion works, even
+    # if the expansion uses the name without a prefix.
+    renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS')
+
+    while len(variables) > 0:
+        for name in tuple(variables):
+            value = notdone[name]
+            m = _findvar1_rx.search(value) or _findvar2_rx.search(value)
+            if m is not None:
+                n = m.group(1)
+                found = True
+                if n in done:
+                    item = str(done[n])
+                elif n in notdone:
+                    # get it on a subsequent round
+                    found = False
+                elif n in os.environ:
+                    # do it like make: fall back to environment
+                    item = os.environ[n]
+
+                elif n in renamed_variables:
+                    if (name.startswith('PY_') and
+                        name[3:] in renamed_variables):
+                        item = ""
+
+                    elif 'PY_' + n in notdone:
+                        found = False
+
+                    else:
+                        item = str(done['PY_' + n])
+
+                else:
+                    done[n] = item = ""
+
+                if found:
+                    after = value[m.end():]
+                    value = value[:m.start()] + item + after
+                    if "$" in after:
+                        notdone[name] = value
+                    else:
+                        try:
+                            value = int(value)
+                        except ValueError:
+                            done[name] = value.strip()
+                        else:
+                            done[name] = value
+                        variables.remove(name)
+
+                        if (name.startswith('PY_') and
+                            name[3:] in renamed_variables):
+
+                            name = name[3:]
+                            if name not in done:
+                                done[name] = value
+
+            else:
+                # bogus variable reference (e.g. "prefix=$/opt/python");
+                # just drop it since we can't deal
+                done[name] = value
+                variables.remove(name)
+
+    # strip spurious spaces
+    for k, v in done.items():
+        if isinstance(v, str):
+            done[k] = v.strip()
+
+    # save the results in the global dictionary
+    vars.update(done)
+    return vars
+
+
+def get_makefile_filename():
+    """Return the path of the Makefile."""
+    if _PYTHON_BUILD:
+        return os.path.join(_PROJECT_BASE, "Makefile")
+    if hasattr(sys, 'abiflags'):
+        config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags)
+    else:
+        config_dir_name = 'config'
+    return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile')
+
+
+def _init_posix(vars):
+    """Initialize the module as appropriate for POSIX systems."""
+    # load the installed Makefile:
+    makefile = get_makefile_filename()
+    try:
+        _parse_makefile(makefile, vars)
+    except IOError as e:
+        msg = "invalid Python installation: unable to open %s" % makefile
+        if hasattr(e, "strerror"):
+            msg = msg + " (%s)" % e.strerror
+        raise IOError(msg)
+    # load the installed pyconfig.h:
+    config_h = get_config_h_filename()
+    try:
+        with open(config_h) as f:
+            parse_config_h(f, vars)
+    except IOError as e:
+        msg = "invalid Python installation: unable to open %s" % config_h
+        if hasattr(e, "strerror"):
+            msg = msg + " (%s)" % e.strerror
+        raise IOError(msg)
+    # On AIX, there are wrong paths to the linker scripts in the Makefile
+    # -- these paths are relative to the Python source, but when installed
+    # the scripts are in another directory.
+    if _PYTHON_BUILD:
+        vars['LDSHARED'] = vars['BLDSHARED']
+
+
+def _init_non_posix(vars):
+    """Initialize the module as appropriate for NT"""
+    # set basic install directories
+    vars['LIBDEST'] = get_path('stdlib')
+    vars['BINLIBDEST'] = get_path('platstdlib')
+    vars['INCLUDEPY'] = get_path('include')
+    vars['SO'] = '.pyd'
+    vars['EXE'] = '.exe'
+    vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT
+    vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable))
+
+#
+# public APIs
+#
+
+
+def parse_config_h(fp, vars=None):
+    """Parse a config.h-style file.
+
+    A dictionary containing name/value pairs is returned.  If an
+    optional dictionary is passed in as the second argument, it is
+    used instead of a new dictionary.
+    """
+    if vars is None:
+        vars = {}
+    define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n")
+    undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n")
+
+    while True:
+        line = fp.readline()
+        if not line:
+            break
+        m = define_rx.match(line)
+        if m:
+            n, v = m.group(1, 2)
+            try:
+                v = int(v)
+            except ValueError:
+                pass
+            vars[n] = v
+        else:
+            m = undef_rx.match(line)
+            if m:
+                vars[m.group(1)] = 0
+    return vars
+
+
+def get_config_h_filename():
+    """Return the path of pyconfig.h."""
+    if _PYTHON_BUILD:
+        if os.name == "nt":
+            inc_dir = os.path.join(_PROJECT_BASE, "PC")
+        else:
+            inc_dir = _PROJECT_BASE
+    else:
+        inc_dir = get_path('platinclude')
+    return os.path.join(inc_dir, 'pyconfig.h')
+
+
+def get_scheme_names():
+    """Return a tuple containing the schemes names."""
+    return tuple(sorted(_SCHEMES.sections()))
+
+
+def get_path_names():
+    """Return a tuple containing the paths names."""
+    # xxx see if we want a static list
+    return _SCHEMES.options('posix_prefix')
+
+
+def get_paths(scheme=_get_default_scheme(), vars=None, expand=True):
+    """Return a mapping containing an install scheme.
+
+    ``scheme`` is the install scheme name. If not provided, it will
+    return the default scheme for the current platform.
+    """
+    _ensure_cfg_read()
+    if expand:
+        return _expand_vars(scheme, vars)
+    else:
+        return dict(_SCHEMES.items(scheme))
+
+
+def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True):
+    """Return a path corresponding to the scheme.
+
+    ``scheme`` is the install scheme name.
+    """
+    return get_paths(scheme, vars, expand)[name]
+
+
+def get_config_vars(*args):
+    """With no arguments, return a dictionary of all configuration
+    variables relevant for the current platform.
+
+    On Unix, this means every variable defined in Python's installed Makefile;
+    On Windows and Mac OS it's a much smaller set.
+
+    With arguments, return a list of values that result from looking up
+    each argument in the configuration variable dictionary.
+    """
+    global _CONFIG_VARS
+    if _CONFIG_VARS is None:
+        _CONFIG_VARS = {}
+        # Normalized versions of prefix and exec_prefix are handy to have;
+        # in fact, these are the standard versions used most places in the
+        # distutils2 module.
+        _CONFIG_VARS['prefix'] = _PREFIX
+        _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX
+        _CONFIG_VARS['py_version'] = _PY_VERSION
+        _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT
+        _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2]
+        _CONFIG_VARS['base'] = _PREFIX
+        _CONFIG_VARS['platbase'] = _EXEC_PREFIX
+        _CONFIG_VARS['projectbase'] = _PROJECT_BASE
+        try:
+            _CONFIG_VARS['abiflags'] = sys.abiflags
+        except AttributeError:
+            # sys.abiflags may not be defined on all platforms.
+            _CONFIG_VARS['abiflags'] = ''
+
+        if os.name in ('nt', 'os2'):
+            _init_non_posix(_CONFIG_VARS)
+        if os.name == 'posix':
+            _init_posix(_CONFIG_VARS)
+        # Setting 'userbase' is done below the call to the
+        # init function to enable using 'get_config_var' in
+        # the init-function.
+        if sys.version >= '2.6':
+            _CONFIG_VARS['userbase'] = _getuserbase()
+
+        if 'srcdir' not in _CONFIG_VARS:
+            _CONFIG_VARS['srcdir'] = _PROJECT_BASE
+        else:
+            _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir'])
+
+        # Convert srcdir into an absolute path if it appears necessary.
+        # Normally it is relative to the build directory.  However, during
+        # testing, for example, we might be running a non-installed python
+        # from a different directory.
+        if _PYTHON_BUILD and os.name == "posix":
+            base = _PROJECT_BASE
+            try:
+                cwd = os.getcwd()
+            except OSError:
+                cwd = None
+            if (not os.path.isabs(_CONFIG_VARS['srcdir']) and
+                base != cwd):
+                # srcdir is relative and we are not in the same directory
+                # as the executable. Assume executable is in the build
+                # directory and make srcdir absolute.
+                srcdir = os.path.join(base, _CONFIG_VARS['srcdir'])
+                _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir)
+
+        if sys.platform == 'darwin':
+            kernel_version = os.uname()[2]  # Kernel version (8.4.3)
+            major_version = int(kernel_version.split('.')[0])
+
+            if major_version < 8:
+                # On macOS before 10.4, check if -arch and -isysroot
+                # are in CFLAGS or LDFLAGS and remove them if they are.
+                # This is needed when building extensions on a 10.3 system
+                # using a universal build of python.
+                for key in ('LDFLAGS', 'BASECFLAGS',
+                        # a number of derived variables. These need to be
+                        # patched up as well.
+                        'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
+                    flags = _CONFIG_VARS[key]
+                    flags = re.sub('-arch\s+\w+\s', ' ', flags)
+                    flags = re.sub('-isysroot [^ \t]*', ' ', flags)
+                    _CONFIG_VARS[key] = flags
+            else:
+                # Allow the user to override the architecture flags using
+                # an environment variable.
+                # NOTE: This name was introduced by Apple in OSX 10.5 and
+                # is used by several scripting languages distributed with
+                # that OS release.
+                if 'ARCHFLAGS' in os.environ:
+                    arch = os.environ['ARCHFLAGS']
+                    for key in ('LDFLAGS', 'BASECFLAGS',
+                        # a number of derived variables. These need to be
+                        # patched up as well.
+                        'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
+
+                        flags = _CONFIG_VARS[key]
+                        flags = re.sub('-arch\s+\w+\s', ' ', flags)
+                        flags = flags + ' ' + arch
+                        _CONFIG_VARS[key] = flags
+
+                # If we're on OSX 10.5 or later and the user tries to
+                # compiles an extension using an SDK that is not present
+                # on the current machine it is better to not use an SDK
+                # than to fail.
+                #
+                # The major usecase for this is users using a Python.org
+                # binary installer  on OSX 10.6: that installer uses
+                # the 10.4u SDK, but that SDK is not installed by default
+                # when you install Xcode.
+                #
+                CFLAGS = _CONFIG_VARS.get('CFLAGS', '')
+                m = re.search('-isysroot\s+(\S+)', CFLAGS)
+                if m is not None:
+                    sdk = m.group(1)
+                    if not os.path.exists(sdk):
+                        for key in ('LDFLAGS', 'BASECFLAGS',
+                             # a number of derived variables. These need to be
+                             # patched up as well.
+                            'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
+
+                            flags = _CONFIG_VARS[key]
+                            flags = re.sub('-isysroot\s+\S+(\s|$)', ' ', flags)
+                            _CONFIG_VARS[key] = flags
+
+    if args:
+        vals = []
+        for name in args:
+            vals.append(_CONFIG_VARS.get(name))
+        return vals
+    else:
+        return _CONFIG_VARS
+
+
+def get_config_var(name):
+    """Return the value of a single variable using the dictionary returned by
+    'get_config_vars()'.
+
+    Equivalent to get_config_vars().get(name)
+    """
+    return get_config_vars().get(name)
+
+
+def get_platform():
+    """Return a string that identifies the current platform.
+
+    This is used mainly to distinguish platform-specific build directories and
+    platform-specific built distributions.  Typically includes the OS name
+    and version and the architecture (as supplied by 'os.uname()'),
+    although the exact information included depends on the OS; eg. for IRIX
+    the architecture isn't particularly important (IRIX only runs on SGI
+    hardware), but for Linux the kernel version isn't particularly
+    important.
+
+    Examples of returned values:
+       linux-i586
+       linux-alpha (?)
+       solaris-2.6-sun4u
+       irix-5.3
+       irix64-6.2
+
+    Windows will return one of:
+       win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc)
+       win-ia64 (64bit Windows on Itanium)
+       win32 (all others - specifically, sys.platform is returned)
+
+    For other non-POSIX platforms, currently just returns 'sys.platform'.
+    """
+    if os.name == 'nt':
+        # sniff sys.version for architecture.
+        prefix = " bit ("
+        i = sys.version.find(prefix)
+        if i == -1:
+            return sys.platform
+        j = sys.version.find(")", i)
+        look = sys.version[i+len(prefix):j].lower()
+        if look == 'amd64':
+            return 'win-amd64'
+        if look == 'itanium':
+            return 'win-ia64'
+        return sys.platform
+
+    if os.name != "posix" or not hasattr(os, 'uname'):
+        # XXX what about the architecture? NT is Intel or Alpha,
+        # Mac OS is M68k or PPC, etc.
+        return sys.platform
+
+    # Try to distinguish various flavours of Unix
+    osname, host, release, version, machine = os.uname()
+
+    # Convert the OS name to lowercase, remove '/' characters
+    # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh")
+    osname = osname.lower().replace('/', '')
+    machine = machine.replace(' ', '_')
+    machine = machine.replace('/', '-')
+
+    if osname[:5] == "linux":
+        # At least on Linux/Intel, 'machine' is the processor --
+        # i386, etc.
+        # XXX what about Alpha, SPARC, etc?
+        return  "%s-%s" % (osname, machine)
+    elif osname[:5] == "sunos":
+        if release[0] >= "5":           # SunOS 5 == Solaris 2
+            osname = "solaris"
+            release = "%d.%s" % (int(release[0]) - 3, release[2:])
+        # fall through to standard osname-release-machine representation
+    elif osname[:4] == "irix":              # could be "irix64"!
+        return "%s-%s" % (osname, release)
+    elif osname[:3] == "aix":
+        return "%s-%s.%s" % (osname, version, release)
+    elif osname[:6] == "cygwin":
+        osname = "cygwin"
+        rel_re = re.compile(r'[\d.]+')
+        m = rel_re.match(release)
+        if m:
+            release = m.group()
+    elif osname[:6] == "darwin":
+        #
+        # For our purposes, we'll assume that the system version from
+        # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set
+        # to. This makes the compatibility story a bit more sane because the
+        # machine is going to compile and link as if it were
+        # MACOSX_DEPLOYMENT_TARGET.
+        cfgvars = get_config_vars()
+        macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET')
+
+        if True:
+            # Always calculate the release of the running machine,
+            # needed to determine if we can build fat binaries or not.
+
+            macrelease = macver
+            # Get the system version. Reading this plist is a documented
+            # way to get the system version (see the documentation for
+            # the Gestalt Manager)
+            try:
+                f = open('/System/Library/CoreServices/SystemVersion.plist')
+            except IOError:
+                # We're on a plain darwin box, fall back to the default
+                # behaviour.
+                pass
+            else:
+                try:
+                    m = re.search(r'<key>ProductUserVisibleVersion</key>\s*'
+                                  r'<string>(.*?)</string>', f.read())
+                finally:
+                    f.close()
+                if m is not None:
+                    macrelease = '.'.join(m.group(1).split('.')[:2])
+                # else: fall back to the default behaviour
+
+        if not macver:
+            macver = macrelease
+
+        if macver:
+            release = macver
+            osname = "macosx"
+
+            if ((macrelease + '.') >= '10.4.' and
+                '-arch' in get_config_vars().get('CFLAGS', '').strip()):
+                # The universal build will build fat binaries, but not on
+                # systems before 10.4
+                #
+                # Try to detect 4-way universal builds, those have machine-type
+                # 'universal' instead of 'fat'.
+
+                machine = 'fat'
+                cflags = get_config_vars().get('CFLAGS')
+
+                archs = re.findall('-arch\s+(\S+)', cflags)
+                archs = tuple(sorted(set(archs)))
+
+                if len(archs) == 1:
+                    machine = archs[0]
+                elif archs == ('i386', 'ppc'):
+                    machine = 'fat'
+                elif archs == ('i386', 'x86_64'):
+                    machine = 'intel'
+                elif archs == ('i386', 'ppc', 'x86_64'):
+                    machine = 'fat3'
+                elif archs == ('ppc64', 'x86_64'):
+                    machine = 'fat64'
+                elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'):
+                    machine = 'universal'
+                else:
+                    raise ValueError(
+                       "Don't know machine value for archs=%r" % (archs,))
+
+            elif machine == 'i386':
+                # On OSX the machine type returned by uname is always the
+                # 32-bit variant, even if the executable architecture is
+                # the 64-bit variant
+                if sys.maxsize >= 2**32:
+                    machine = 'x86_64'
+
+            elif machine in ('PowerPC', 'Power_Macintosh'):
+                # Pick a sane name for the PPC architecture.
+                # See 'i386' case
+                if sys.maxsize >= 2**32:
+                    machine = 'ppc64'
+                else:
+                    machine = 'ppc'
+
+    return "%s-%s-%s" % (osname, release, machine)
+
+
+def get_python_version():
+    return _PY_VERSION_SHORT
+
+
+def _print_dict(title, data):
+    for index, (key, value) in enumerate(sorted(data.items())):
+        if index == 0:
+            print('%s: ' % (title))
+        print('\t%s = "%s"' % (key, value))
+
+
+def _main():
+    """Display all information sysconfig detains."""
+    print('Platform: "%s"' % get_platform())
+    print('Python version: "%s"' % get_python_version())
+    print('Current installation scheme: "%s"' % _get_default_scheme())
+    print()
+    _print_dict('Paths', get_paths())
+    print()
+    _print_dict('Variables', get_config_vars())
+
+
+if __name__ == '__main__':
+    _main()
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/tarfile.py b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/tarfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..d66d8566374be661085213468bce338c6a747702
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/tarfile.py
@@ -0,0 +1,2607 @@
+#-------------------------------------------------------------------
+# tarfile.py
+#-------------------------------------------------------------------
+# Copyright (C) 2002 Lars Gustaebel <lars@gustaebel.de>
+# All rights reserved.
+#
+# 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.
+#
+from __future__ import print_function
+
+"""Read from and write to tar format archives.
+"""
+
+__version__ = "$Revision$"
+
+version     = "0.9.0"
+__author__  = "Lars Gust\u00e4bel (lars@gustaebel.de)"
+__date__    = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $"
+__cvsid__   = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $"
+__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend."
+
+#---------
+# Imports
+#---------
+import sys
+import os
+import stat
+import errno
+import time
+import struct
+import copy
+import re
+
+try:
+    import grp, pwd
+except ImportError:
+    grp = pwd = None
+
+# os.symlink on Windows prior to 6.0 raises NotImplementedError
+symlink_exception = (AttributeError, NotImplementedError)
+try:
+    # WindowsError (1314) will be raised if the caller does not hold the
+    # SeCreateSymbolicLinkPrivilege privilege
+    symlink_exception += (WindowsError,)
+except NameError:
+    pass
+
+# from tarfile import *
+__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"]
+
+if sys.version_info[0] < 3:
+    import __builtin__ as builtins
+else:
+    import builtins
+
+_open = builtins.open   # Since 'open' is TarFile.open
+
+#---------------------------------------------------------
+# tar constants
+#---------------------------------------------------------
+NUL = b"\0"                     # the null character
+BLOCKSIZE = 512                 # length of processing blocks
+RECORDSIZE = BLOCKSIZE * 20     # length of records
+GNU_MAGIC = b"ustar  \0"        # magic gnu tar string
+POSIX_MAGIC = b"ustar\x0000"    # magic posix tar string
+
+LENGTH_NAME = 100               # maximum length of a filename
+LENGTH_LINK = 100               # maximum length of a linkname
+LENGTH_PREFIX = 155             # maximum length of the prefix field
+
+REGTYPE = b"0"                  # regular file
+AREGTYPE = b"\0"                # regular file
+LNKTYPE = b"1"                  # link (inside tarfile)
+SYMTYPE = b"2"                  # symbolic link
+CHRTYPE = b"3"                  # character special device
+BLKTYPE = b"4"                  # block special device
+DIRTYPE = b"5"                  # directory
+FIFOTYPE = b"6"                 # fifo special device
+CONTTYPE = b"7"                 # contiguous file
+
+GNUTYPE_LONGNAME = b"L"         # GNU tar longname
+GNUTYPE_LONGLINK = b"K"         # GNU tar longlink
+GNUTYPE_SPARSE = b"S"           # GNU tar sparse file
+
+XHDTYPE = b"x"                  # POSIX.1-2001 extended header
+XGLTYPE = b"g"                  # POSIX.1-2001 global header
+SOLARIS_XHDTYPE = b"X"          # Solaris extended header
+
+USTAR_FORMAT = 0                # POSIX.1-1988 (ustar) format
+GNU_FORMAT = 1                  # GNU tar format
+PAX_FORMAT = 2                  # POSIX.1-2001 (pax) format
+DEFAULT_FORMAT = GNU_FORMAT
+
+#---------------------------------------------------------
+# tarfile constants
+#---------------------------------------------------------
+# File types that tarfile supports:
+SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE,
+                   SYMTYPE, DIRTYPE, FIFOTYPE,
+                   CONTTYPE, CHRTYPE, BLKTYPE,
+                   GNUTYPE_LONGNAME, GNUTYPE_LONGLINK,
+                   GNUTYPE_SPARSE)
+
+# File types that will be treated as a regular file.
+REGULAR_TYPES = (REGTYPE, AREGTYPE,
+                 CONTTYPE, GNUTYPE_SPARSE)
+
+# File types that are part of the GNU tar format.
+GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK,
+             GNUTYPE_SPARSE)
+
+# Fields from a pax header that override a TarInfo attribute.
+PAX_FIELDS = ("path", "linkpath", "size", "mtime",
+              "uid", "gid", "uname", "gname")
+
+# Fields from a pax header that are affected by hdrcharset.
+PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname"))
+
+# Fields in a pax header that are numbers, all other fields
+# are treated as strings.
+PAX_NUMBER_FIELDS = {
+    "atime": float,
+    "ctime": float,
+    "mtime": float,
+    "uid": int,
+    "gid": int,
+    "size": int
+}
+
+#---------------------------------------------------------
+# Bits used in the mode field, values in octal.
+#---------------------------------------------------------
+S_IFLNK = 0o120000        # symbolic link
+S_IFREG = 0o100000        # regular file
+S_IFBLK = 0o060000        # block device
+S_IFDIR = 0o040000        # directory
+S_IFCHR = 0o020000        # character device
+S_IFIFO = 0o010000        # fifo
+
+TSUID   = 0o4000          # set UID on execution
+TSGID   = 0o2000          # set GID on execution
+TSVTX   = 0o1000          # reserved
+
+TUREAD  = 0o400           # read by owner
+TUWRITE = 0o200           # write by owner
+TUEXEC  = 0o100           # execute/search by owner
+TGREAD  = 0o040           # read by group
+TGWRITE = 0o020           # write by group
+TGEXEC  = 0o010           # execute/search by group
+TOREAD  = 0o004           # read by other
+TOWRITE = 0o002           # write by other
+TOEXEC  = 0o001           # execute/search by other
+
+#---------------------------------------------------------
+# initialization
+#---------------------------------------------------------
+if os.name in ("nt", "ce"):
+    ENCODING = "utf-8"
+else:
+    ENCODING = sys.getfilesystemencoding()
+
+#---------------------------------------------------------
+# Some useful functions
+#---------------------------------------------------------
+
+def stn(s, length, encoding, errors):
+    """Convert a string to a null-terminated bytes object.
+    """
+    s = s.encode(encoding, errors)
+    return s[:length] + (length - len(s)) * NUL
+
+def nts(s, encoding, errors):
+    """Convert a null-terminated bytes object to a string.
+    """
+    p = s.find(b"\0")
+    if p != -1:
+        s = s[:p]
+    return s.decode(encoding, errors)
+
+def nti(s):
+    """Convert a number field to a python number.
+    """
+    # There are two possible encodings for a number field, see
+    # itn() below.
+    if s[0] != chr(0o200):
+        try:
+            n = int(nts(s, "ascii", "strict") or "0", 8)
+        except ValueError:
+            raise InvalidHeaderError("invalid header")
+    else:
+        n = 0
+        for i in range(len(s) - 1):
+            n <<= 8
+            n += ord(s[i + 1])
+    return n
+
+def itn(n, digits=8, format=DEFAULT_FORMAT):
+    """Convert a python number to a number field.
+    """
+    # POSIX 1003.1-1988 requires numbers to be encoded as a string of
+    # octal digits followed by a null-byte, this allows values up to
+    # (8**(digits-1))-1. GNU tar allows storing numbers greater than
+    # that if necessary. A leading 0o200 byte indicates this particular
+    # encoding, the following digits-1 bytes are a big-endian
+    # representation. This allows values up to (256**(digits-1))-1.
+    if 0 <= n < 8 ** (digits - 1):
+        s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL
+    else:
+        if format != GNU_FORMAT or n >= 256 ** (digits - 1):
+            raise ValueError("overflow in number field")
+
+        if n < 0:
+            # XXX We mimic GNU tar's behaviour with negative numbers,
+            # this could raise OverflowError.
+            n = struct.unpack("L", struct.pack("l", n))[0]
+
+        s = bytearray()
+        for i in range(digits - 1):
+            s.insert(0, n & 0o377)
+            n >>= 8
+        s.insert(0, 0o200)
+    return s
+
+def calc_chksums(buf):
+    """Calculate the checksum for a member's header by summing up all
+       characters except for the chksum field which is treated as if
+       it was filled with spaces. According to the GNU tar sources,
+       some tars (Sun and NeXT) calculate chksum with signed char,
+       which will be different if there are chars in the buffer with
+       the high bit set. So we calculate two checksums, unsigned and
+       signed.
+    """
+    unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512]))
+    signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512]))
+    return unsigned_chksum, signed_chksum
+
+def copyfileobj(src, dst, length=None):
+    """Copy length bytes from fileobj src to fileobj dst.
+       If length is None, copy the entire content.
+    """
+    if length == 0:
+        return
+    if length is None:
+        while True:
+            buf = src.read(16*1024)
+            if not buf:
+                break
+            dst.write(buf)
+        return
+
+    BUFSIZE = 16 * 1024
+    blocks, remainder = divmod(length, BUFSIZE)
+    for b in range(blocks):
+        buf = src.read(BUFSIZE)
+        if len(buf) < BUFSIZE:
+            raise IOError("end of file reached")
+        dst.write(buf)
+
+    if remainder != 0:
+        buf = src.read(remainder)
+        if len(buf) < remainder:
+            raise IOError("end of file reached")
+        dst.write(buf)
+    return
+
+filemode_table = (
+    ((S_IFLNK,      "l"),
+     (S_IFREG,      "-"),
+     (S_IFBLK,      "b"),
+     (S_IFDIR,      "d"),
+     (S_IFCHR,      "c"),
+     (S_IFIFO,      "p")),
+
+    ((TUREAD,       "r"),),
+    ((TUWRITE,      "w"),),
+    ((TUEXEC|TSUID, "s"),
+     (TSUID,        "S"),
+     (TUEXEC,       "x")),
+
+    ((TGREAD,       "r"),),
+    ((TGWRITE,      "w"),),
+    ((TGEXEC|TSGID, "s"),
+     (TSGID,        "S"),
+     (TGEXEC,       "x")),
+
+    ((TOREAD,       "r"),),
+    ((TOWRITE,      "w"),),
+    ((TOEXEC|TSVTX, "t"),
+     (TSVTX,        "T"),
+     (TOEXEC,       "x"))
+)
+
+def filemode(mode):
+    """Convert a file's mode to a string of the form
+       -rwxrwxrwx.
+       Used by TarFile.list()
+    """
+    perm = []
+    for table in filemode_table:
+        for bit, char in table:
+            if mode & bit == bit:
+                perm.append(char)
+                break
+        else:
+            perm.append("-")
+    return "".join(perm)
+
+class TarError(Exception):
+    """Base exception."""
+    pass
+class ExtractError(TarError):
+    """General exception for extract errors."""
+    pass
+class ReadError(TarError):
+    """Exception for unreadable tar archives."""
+    pass
+class CompressionError(TarError):
+    """Exception for unavailable compression methods."""
+    pass
+class StreamError(TarError):
+    """Exception for unsupported operations on stream-like TarFiles."""
+    pass
+class HeaderError(TarError):
+    """Base exception for header errors."""
+    pass
+class EmptyHeaderError(HeaderError):
+    """Exception for empty headers."""
+    pass
+class TruncatedHeaderError(HeaderError):
+    """Exception for truncated headers."""
+    pass
+class EOFHeaderError(HeaderError):
+    """Exception for end of file headers."""
+    pass
+class InvalidHeaderError(HeaderError):
+    """Exception for invalid headers."""
+    pass
+class SubsequentHeaderError(HeaderError):
+    """Exception for missing and invalid extended headers."""
+    pass
+
+#---------------------------
+# internal stream interface
+#---------------------------
+class _LowLevelFile(object):
+    """Low-level file object. Supports reading and writing.
+       It is used instead of a regular file object for streaming
+       access.
+    """
+
+    def __init__(self, name, mode):
+        mode = {
+            "r": os.O_RDONLY,
+            "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC,
+        }[mode]
+        if hasattr(os, "O_BINARY"):
+            mode |= os.O_BINARY
+        self.fd = os.open(name, mode, 0o666)
+
+    def close(self):
+        os.close(self.fd)
+
+    def read(self, size):
+        return os.read(self.fd, size)
+
+    def write(self, s):
+        os.write(self.fd, s)
+
+class _Stream(object):
+    """Class that serves as an adapter between TarFile and
+       a stream-like object.  The stream-like object only
+       needs to have a read() or write() method and is accessed
+       blockwise.  Use of gzip or bzip2 compression is possible.
+       A stream-like object could be for example: sys.stdin,
+       sys.stdout, a socket, a tape device etc.
+
+       _Stream is intended to be used only internally.
+    """
+
+    def __init__(self, name, mode, comptype, fileobj, bufsize):
+        """Construct a _Stream object.
+        """
+        self._extfileobj = True
+        if fileobj is None:
+            fileobj = _LowLevelFile(name, mode)
+            self._extfileobj = False
+
+        if comptype == '*':
+            # Enable transparent compression detection for the
+            # stream interface
+            fileobj = _StreamProxy(fileobj)
+            comptype = fileobj.getcomptype()
+
+        self.name     = name or ""
+        self.mode     = mode
+        self.comptype = comptype
+        self.fileobj  = fileobj
+        self.bufsize  = bufsize
+        self.buf      = b""
+        self.pos      = 0
+        self.closed   = False
+
+        try:
+            if comptype == "gz":
+                try:
+                    import zlib
+                except ImportError:
+                    raise CompressionError("zlib module is not available")
+                self.zlib = zlib
+                self.crc = zlib.crc32(b"")
+                if mode == "r":
+                    self._init_read_gz()
+                else:
+                    self._init_write_gz()
+
+            if comptype == "bz2":
+                try:
+                    import bz2
+                except ImportError:
+                    raise CompressionError("bz2 module is not available")
+                if mode == "r":
+                    self.dbuf = b""
+                    self.cmp = bz2.BZ2Decompressor()
+                else:
+                    self.cmp = bz2.BZ2Compressor()
+        except:
+            if not self._extfileobj:
+                self.fileobj.close()
+            self.closed = True
+            raise
+
+    def __del__(self):
+        if hasattr(self, "closed") and not self.closed:
+            self.close()
+
+    def _init_write_gz(self):
+        """Initialize for writing with gzip compression.
+        """
+        self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED,
+                                            -self.zlib.MAX_WBITS,
+                                            self.zlib.DEF_MEM_LEVEL,
+                                            0)
+        timestamp = struct.pack("<L", int(time.time()))
+        self.__write(b"\037\213\010\010" + timestamp + b"\002\377")
+        if self.name.endswith(".gz"):
+            self.name = self.name[:-3]
+        # RFC1952 says we must use ISO-8859-1 for the FNAME field.
+        self.__write(self.name.encode("iso-8859-1", "replace") + NUL)
+
+    def write(self, s):
+        """Write string s to the stream.
+        """
+        if self.comptype == "gz":
+            self.crc = self.zlib.crc32(s, self.crc)
+        self.pos += len(s)
+        if self.comptype != "tar":
+            s = self.cmp.compress(s)
+        self.__write(s)
+
+    def __write(self, s):
+        """Write string s to the stream if a whole new block
+           is ready to be written.
+        """
+        self.buf += s
+        while len(self.buf) > self.bufsize:
+            self.fileobj.write(self.buf[:self.bufsize])
+            self.buf = self.buf[self.bufsize:]
+
+    def close(self):
+        """Close the _Stream object. No operation should be
+           done on it afterwards.
+        """
+        if self.closed:
+            return
+
+        if self.mode == "w" and self.comptype != "tar":
+            self.buf += self.cmp.flush()
+
+        if self.mode == "w" and self.buf:
+            self.fileobj.write(self.buf)
+            self.buf = b""
+            if self.comptype == "gz":
+                # The native zlib crc is an unsigned 32-bit integer, but
+                # the Python wrapper implicitly casts that to a signed C
+                # long.  So, on a 32-bit box self.crc may "look negative",
+                # while the same crc on a 64-bit box may "look positive".
+                # To avoid irksome warnings from the `struct` module, force
+                # it to look positive on all boxes.
+                self.fileobj.write(struct.pack("<L", self.crc & 0xffffffff))
+                self.fileobj.write(struct.pack("<L", self.pos & 0xffffFFFF))
+
+        if not self._extfileobj:
+            self.fileobj.close()
+
+        self.closed = True
+
+    def _init_read_gz(self):
+        """Initialize for reading a gzip compressed fileobj.
+        """
+        self.cmp = self.zlib.decompressobj(-self.zlib.MAX_WBITS)
+        self.dbuf = b""
+
+        # taken from gzip.GzipFile with some alterations
+        if self.__read(2) != b"\037\213":
+            raise ReadError("not a gzip file")
+        if self.__read(1) != b"\010":
+            raise CompressionError("unsupported compression method")
+
+        flag = ord(self.__read(1))
+        self.__read(6)
+
+        if flag & 4:
+            xlen = ord(self.__read(1)) + 256 * ord(self.__read(1))
+            self.read(xlen)
+        if flag & 8:
+            while True:
+                s = self.__read(1)
+                if not s or s == NUL:
+                    break
+        if flag & 16:
+            while True:
+                s = self.__read(1)
+                if not s or s == NUL:
+                    break
+        if flag & 2:
+            self.__read(2)
+
+    def tell(self):
+        """Return the stream's file pointer position.
+        """
+        return self.pos
+
+    def seek(self, pos=0):
+        """Set the stream's file pointer to pos. Negative seeking
+           is forbidden.
+        """
+        if pos - self.pos >= 0:
+            blocks, remainder = divmod(pos - self.pos, self.bufsize)
+            for i in range(blocks):
+                self.read(self.bufsize)
+            self.read(remainder)
+        else:
+            raise StreamError("seeking backwards is not allowed")
+        return self.pos
+
+    def read(self, size=None):
+        """Return the next size number of bytes from the stream.
+           If size is not defined, return all bytes of the stream
+           up to EOF.
+        """
+        if size is None:
+            t = []
+            while True:
+                buf = self._read(self.bufsize)
+                if not buf:
+                    break
+                t.append(buf)
+            buf = "".join(t)
+        else:
+            buf = self._read(size)
+        self.pos += len(buf)
+        return buf
+
+    def _read(self, size):
+        """Return size bytes from the stream.
+        """
+        if self.comptype == "tar":
+            return self.__read(size)
+
+        c = len(self.dbuf)
+        while c < size:
+            buf = self.__read(self.bufsize)
+            if not buf:
+                break
+            try:
+                buf = self.cmp.decompress(buf)
+            except IOError:
+                raise ReadError("invalid compressed data")
+            self.dbuf += buf
+            c += len(buf)
+        buf = self.dbuf[:size]
+        self.dbuf = self.dbuf[size:]
+        return buf
+
+    def __read(self, size):
+        """Return size bytes from stream. If internal buffer is empty,
+           read another block from the stream.
+        """
+        c = len(self.buf)
+        while c < size:
+            buf = self.fileobj.read(self.bufsize)
+            if not buf:
+                break
+            self.buf += buf
+            c += len(buf)
+        buf = self.buf[:size]
+        self.buf = self.buf[size:]
+        return buf
+# class _Stream
+
+class _StreamProxy(object):
+    """Small proxy class that enables transparent compression
+       detection for the Stream interface (mode 'r|*').
+    """
+
+    def __init__(self, fileobj):
+        self.fileobj = fileobj
+        self.buf = self.fileobj.read(BLOCKSIZE)
+
+    def read(self, size):
+        self.read = self.fileobj.read
+        return self.buf
+
+    def getcomptype(self):
+        if self.buf.startswith(b"\037\213\010"):
+            return "gz"
+        if self.buf.startswith(b"BZh91"):
+            return "bz2"
+        return "tar"
+
+    def close(self):
+        self.fileobj.close()
+# class StreamProxy
+
+class _BZ2Proxy(object):
+    """Small proxy class that enables external file object
+       support for "r:bz2" and "w:bz2" modes. This is actually
+       a workaround for a limitation in bz2 module's BZ2File
+       class which (unlike gzip.GzipFile) has no support for
+       a file object argument.
+    """
+
+    blocksize = 16 * 1024
+
+    def __init__(self, fileobj, mode):
+        self.fileobj = fileobj
+        self.mode = mode
+        self.name = getattr(self.fileobj, "name", None)
+        self.init()
+
+    def init(self):
+        import bz2
+        self.pos = 0
+        if self.mode == "r":
+            self.bz2obj = bz2.BZ2Decompressor()
+            self.fileobj.seek(0)
+            self.buf = b""
+        else:
+            self.bz2obj = bz2.BZ2Compressor()
+
+    def read(self, size):
+        x = len(self.buf)
+        while x < size:
+            raw = self.fileobj.read(self.blocksize)
+            if not raw:
+                break
+            data = self.bz2obj.decompress(raw)
+            self.buf += data
+            x += len(data)
+
+        buf = self.buf[:size]
+        self.buf = self.buf[size:]
+        self.pos += len(buf)
+        return buf
+
+    def seek(self, pos):
+        if pos < self.pos:
+            self.init()
+        self.read(pos - self.pos)
+
+    def tell(self):
+        return self.pos
+
+    def write(self, data):
+        self.pos += len(data)
+        raw = self.bz2obj.compress(data)
+        self.fileobj.write(raw)
+
+    def close(self):
+        if self.mode == "w":
+            raw = self.bz2obj.flush()
+            self.fileobj.write(raw)
+# class _BZ2Proxy
+
+#------------------------
+# Extraction file object
+#------------------------
+class _FileInFile(object):
+    """A thin wrapper around an existing file object that
+       provides a part of its data as an individual file
+       object.
+    """
+
+    def __init__(self, fileobj, offset, size, blockinfo=None):
+        self.fileobj = fileobj
+        self.offset = offset
+        self.size = size
+        self.position = 0
+
+        if blockinfo is None:
+            blockinfo = [(0, size)]
+
+        # Construct a map with data and zero blocks.
+        self.map_index = 0
+        self.map = []
+        lastpos = 0
+        realpos = self.offset
+        for offset, size in blockinfo:
+            if offset > lastpos:
+                self.map.append((False, lastpos, offset, None))
+            self.map.append((True, offset, offset + size, realpos))
+            realpos += size
+            lastpos = offset + size
+        if lastpos < self.size:
+            self.map.append((False, lastpos, self.size, None))
+
+    def seekable(self):
+        if not hasattr(self.fileobj, "seekable"):
+            # XXX gzip.GzipFile and bz2.BZ2File
+            return True
+        return self.fileobj.seekable()
+
+    def tell(self):
+        """Return the current file position.
+        """
+        return self.position
+
+    def seek(self, position):
+        """Seek to a position in the file.
+        """
+        self.position = position
+
+    def read(self, size=None):
+        """Read data from the file.
+        """
+        if size is None:
+            size = self.size - self.position
+        else:
+            size = min(size, self.size - self.position)
+
+        buf = b""
+        while size > 0:
+            while True:
+                data, start, stop, offset = self.map[self.map_index]
+                if start <= self.position < stop:
+                    break
+                else:
+                    self.map_index += 1
+                    if self.map_index == len(self.map):
+                        self.map_index = 0
+            length = min(size, stop - self.position)
+            if data:
+                self.fileobj.seek(offset + (self.position - start))
+                buf += self.fileobj.read(length)
+            else:
+                buf += NUL * length
+            size -= length
+            self.position += length
+        return buf
+#class _FileInFile
+
+
+class ExFileObject(object):
+    """File-like object for reading an archive member.
+       Is returned by TarFile.extractfile().
+    """
+    blocksize = 1024
+
+    def __init__(self, tarfile, tarinfo):
+        self.fileobj = _FileInFile(tarfile.fileobj,
+                                   tarinfo.offset_data,
+                                   tarinfo.size,
+                                   tarinfo.sparse)
+        self.name = tarinfo.name
+        self.mode = "r"
+        self.closed = False
+        self.size = tarinfo.size
+
+        self.position = 0
+        self.buffer = b""
+
+    def readable(self):
+        return True
+
+    def writable(self):
+        return False
+
+    def seekable(self):
+        return self.fileobj.seekable()
+
+    def read(self, size=None):
+        """Read at most size bytes from the file. If size is not
+           present or None, read all data until EOF is reached.
+        """
+        if self.closed:
+            raise ValueError("I/O operation on closed file")
+
+        buf = b""
+        if self.buffer:
+            if size is None:
+                buf = self.buffer
+                self.buffer = b""
+            else:
+                buf = self.buffer[:size]
+                self.buffer = self.buffer[size:]
+
+        if size is None:
+            buf += self.fileobj.read()
+        else:
+            buf += self.fileobj.read(size - len(buf))
+
+        self.position += len(buf)
+        return buf
+
+    # XXX TextIOWrapper uses the read1() method.
+    read1 = read
+
+    def readline(self, size=-1):
+        """Read one entire line from the file. If size is present
+           and non-negative, return a string with at most that
+           size, which may be an incomplete line.
+        """
+        if self.closed:
+            raise ValueError("I/O operation on closed file")
+
+        pos = self.buffer.find(b"\n") + 1
+        if pos == 0:
+            # no newline found.
+            while True:
+                buf = self.fileobj.read(self.blocksize)
+                self.buffer += buf
+                if not buf or b"\n" in buf:
+                    pos = self.buffer.find(b"\n") + 1
+                    if pos == 0:
+                        # no newline found.
+                        pos = len(self.buffer)
+                    break
+
+        if size != -1:
+            pos = min(size, pos)
+
+        buf = self.buffer[:pos]
+        self.buffer = self.buffer[pos:]
+        self.position += len(buf)
+        return buf
+
+    def readlines(self):
+        """Return a list with all remaining lines.
+        """
+        result = []
+        while True:
+            line = self.readline()
+            if not line: break
+            result.append(line)
+        return result
+
+    def tell(self):
+        """Return the current file position.
+        """
+        if self.closed:
+            raise ValueError("I/O operation on closed file")
+
+        return self.position
+
+    def seek(self, pos, whence=os.SEEK_SET):
+        """Seek to a position in the file.
+        """
+        if self.closed:
+            raise ValueError("I/O operation on closed file")
+
+        if whence == os.SEEK_SET:
+            self.position = min(max(pos, 0), self.size)
+        elif whence == os.SEEK_CUR:
+            if pos < 0:
+                self.position = max(self.position + pos, 0)
+            else:
+                self.position = min(self.position + pos, self.size)
+        elif whence == os.SEEK_END:
+            self.position = max(min(self.size + pos, self.size), 0)
+        else:
+            raise ValueError("Invalid argument")
+
+        self.buffer = b""
+        self.fileobj.seek(self.position)
+
+    def close(self):
+        """Close the file object.
+        """
+        self.closed = True
+
+    def __iter__(self):
+        """Get an iterator over the file's lines.
+        """
+        while True:
+            line = self.readline()
+            if not line:
+                break
+            yield line
+#class ExFileObject
+
+#------------------
+# Exported Classes
+#------------------
+class TarInfo(object):
+    """Informational class which holds the details about an
+       archive member given by a tar header block.
+       TarInfo objects are returned by TarFile.getmember(),
+       TarFile.getmembers() and TarFile.gettarinfo() and are
+       usually created internally.
+    """
+
+    __slots__ = ("name", "mode", "uid", "gid", "size", "mtime",
+                 "chksum", "type", "linkname", "uname", "gname",
+                 "devmajor", "devminor",
+                 "offset", "offset_data", "pax_headers", "sparse",
+                 "tarfile", "_sparse_structs", "_link_target")
+
+    def __init__(self, name=""):
+        """Construct a TarInfo object. name is the optional name
+           of the member.
+        """
+        self.name = name        # member name
+        self.mode = 0o644       # file permissions
+        self.uid = 0            # user id
+        self.gid = 0            # group id
+        self.size = 0           # file size
+        self.mtime = 0          # modification time
+        self.chksum = 0         # header checksum
+        self.type = REGTYPE     # member type
+        self.linkname = ""      # link name
+        self.uname = ""         # user name
+        self.gname = ""         # group name
+        self.devmajor = 0       # device major number
+        self.devminor = 0       # device minor number
+
+        self.offset = 0         # the tar header starts here
+        self.offset_data = 0    # the file's data starts here
+
+        self.sparse = None      # sparse member information
+        self.pax_headers = {}   # pax header information
+
+    # In pax headers the "name" and "linkname" field are called
+    # "path" and "linkpath".
+    def _getpath(self):
+        return self.name
+    def _setpath(self, name):
+        self.name = name
+    path = property(_getpath, _setpath)
+
+    def _getlinkpath(self):
+        return self.linkname
+    def _setlinkpath(self, linkname):
+        self.linkname = linkname
+    linkpath = property(_getlinkpath, _setlinkpath)
+
+    def __repr__(self):
+        return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self))
+
+    def get_info(self):
+        """Return the TarInfo's attributes as a dictionary.
+        """
+        info = {
+            "name":     self.name,
+            "mode":     self.mode & 0o7777,
+            "uid":      self.uid,
+            "gid":      self.gid,
+            "size":     self.size,
+            "mtime":    self.mtime,
+            "chksum":   self.chksum,
+            "type":     self.type,
+            "linkname": self.linkname,
+            "uname":    self.uname,
+            "gname":    self.gname,
+            "devmajor": self.devmajor,
+            "devminor": self.devminor
+        }
+
+        if info["type"] == DIRTYPE and not info["name"].endswith("/"):
+            info["name"] += "/"
+
+        return info
+
+    def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"):
+        """Return a tar header as a string of 512 byte blocks.
+        """
+        info = self.get_info()
+
+        if format == USTAR_FORMAT:
+            return self.create_ustar_header(info, encoding, errors)
+        elif format == GNU_FORMAT:
+            return self.create_gnu_header(info, encoding, errors)
+        elif format == PAX_FORMAT:
+            return self.create_pax_header(info, encoding)
+        else:
+            raise ValueError("invalid format")
+
+    def create_ustar_header(self, info, encoding, errors):
+        """Return the object as a ustar header block.
+        """
+        info["magic"] = POSIX_MAGIC
+
+        if len(info["linkname"]) > LENGTH_LINK:
+            raise ValueError("linkname is too long")
+
+        if len(info["name"]) > LENGTH_NAME:
+            info["prefix"], info["name"] = self._posix_split_name(info["name"])
+
+        return self._create_header(info, USTAR_FORMAT, encoding, errors)
+
+    def create_gnu_header(self, info, encoding, errors):
+        """Return the object as a GNU header block sequence.
+        """
+        info["magic"] = GNU_MAGIC
+
+        buf = b""
+        if len(info["linkname"]) > LENGTH_LINK:
+            buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors)
+
+        if len(info["name"]) > LENGTH_NAME:
+            buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors)
+
+        return buf + self._create_header(info, GNU_FORMAT, encoding, errors)
+
+    def create_pax_header(self, info, encoding):
+        """Return the object as a ustar header block. If it cannot be
+           represented this way, prepend a pax extended header sequence
+           with supplement information.
+        """
+        info["magic"] = POSIX_MAGIC
+        pax_headers = self.pax_headers.copy()
+
+        # Test string fields for values that exceed the field length or cannot
+        # be represented in ASCII encoding.
+        for name, hname, length in (
+                ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK),
+                ("uname", "uname", 32), ("gname", "gname", 32)):
+
+            if hname in pax_headers:
+                # The pax header has priority.
+                continue
+
+            # Try to encode the string as ASCII.
+            try:
+                info[name].encode("ascii", "strict")
+            except UnicodeEncodeError:
+                pax_headers[hname] = info[name]
+                continue
+
+            if len(info[name]) > length:
+                pax_headers[hname] = info[name]
+
+        # Test number fields for values that exceed the field limit or values
+        # that like to be stored as float.
+        for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)):
+            if name in pax_headers:
+                # The pax header has priority. Avoid overflow.
+                info[name] = 0
+                continue
+
+            val = info[name]
+            if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float):
+                pax_headers[name] = str(val)
+                info[name] = 0
+
+        # Create a pax extended header if necessary.
+        if pax_headers:
+            buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding)
+        else:
+            buf = b""
+
+        return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace")
+
+    @classmethod
+    def create_pax_global_header(cls, pax_headers):
+        """Return the object as a pax global header block sequence.
+        """
+        return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8")
+
+    def _posix_split_name(self, name):
+        """Split a name longer than 100 chars into a prefix
+           and a name part.
+        """
+        prefix = name[:LENGTH_PREFIX + 1]
+        while prefix and prefix[-1] != "/":
+            prefix = prefix[:-1]
+
+        name = name[len(prefix):]
+        prefix = prefix[:-1]
+
+        if not prefix or len(name) > LENGTH_NAME:
+            raise ValueError("name is too long")
+        return prefix, name
+
+    @staticmethod
+    def _create_header(info, format, encoding, errors):
+        """Return a header block. info is a dictionary with file
+           information, format must be one of the *_FORMAT constants.
+        """
+        parts = [
+            stn(info.get("name", ""), 100, encoding, errors),
+            itn(info.get("mode", 0) & 0o7777, 8, format),
+            itn(info.get("uid", 0), 8, format),
+            itn(info.get("gid", 0), 8, format),
+            itn(info.get("size", 0), 12, format),
+            itn(info.get("mtime", 0), 12, format),
+            b"        ", # checksum field
+            info.get("type", REGTYPE),
+            stn(info.get("linkname", ""), 100, encoding, errors),
+            info.get("magic", POSIX_MAGIC),
+            stn(info.get("uname", ""), 32, encoding, errors),
+            stn(info.get("gname", ""), 32, encoding, errors),
+            itn(info.get("devmajor", 0), 8, format),
+            itn(info.get("devminor", 0), 8, format),
+            stn(info.get("prefix", ""), 155, encoding, errors)
+        ]
+
+        buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts))
+        chksum = calc_chksums(buf[-BLOCKSIZE:])[0]
+        buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:]
+        return buf
+
+    @staticmethod
+    def _create_payload(payload):
+        """Return the string payload filled with zero bytes
+           up to the next 512 byte border.
+        """
+        blocks, remainder = divmod(len(payload), BLOCKSIZE)
+        if remainder > 0:
+            payload += (BLOCKSIZE - remainder) * NUL
+        return payload
+
+    @classmethod
+    def _create_gnu_long_header(cls, name, type, encoding, errors):
+        """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence
+           for name.
+        """
+        name = name.encode(encoding, errors) + NUL
+
+        info = {}
+        info["name"] = "././@LongLink"
+        info["type"] = type
+        info["size"] = len(name)
+        info["magic"] = GNU_MAGIC
+
+        # create extended header + name blocks.
+        return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \
+                cls._create_payload(name)
+
+    @classmethod
+    def _create_pax_generic_header(cls, pax_headers, type, encoding):
+        """Return a POSIX.1-2008 extended or global header sequence
+           that contains a list of keyword, value pairs. The values
+           must be strings.
+        """
+        # Check if one of the fields contains surrogate characters and thereby
+        # forces hdrcharset=BINARY, see _proc_pax() for more information.
+        binary = False
+        for keyword, value in pax_headers.items():
+            try:
+                value.encode("utf8", "strict")
+            except UnicodeEncodeError:
+                binary = True
+                break
+
+        records = b""
+        if binary:
+            # Put the hdrcharset field at the beginning of the header.
+            records += b"21 hdrcharset=BINARY\n"
+
+        for keyword, value in pax_headers.items():
+            keyword = keyword.encode("utf8")
+            if binary:
+                # Try to restore the original byte representation of `value'.
+                # Needless to say, that the encoding must match the string.
+                value = value.encode(encoding, "surrogateescape")
+            else:
+                value = value.encode("utf8")
+
+            l = len(keyword) + len(value) + 3   # ' ' + '=' + '\n'
+            n = p = 0
+            while True:
+                n = l + len(str(p))
+                if n == p:
+                    break
+                p = n
+            records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n"
+
+        # We use a hardcoded "././@PaxHeader" name like star does
+        # instead of the one that POSIX recommends.
+        info = {}
+        info["name"] = "././@PaxHeader"
+        info["type"] = type
+        info["size"] = len(records)
+        info["magic"] = POSIX_MAGIC
+
+        # Create pax header + record blocks.
+        return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \
+                cls._create_payload(records)
+
+    @classmethod
+    def frombuf(cls, buf, encoding, errors):
+        """Construct a TarInfo object from a 512 byte bytes object.
+        """
+        if len(buf) == 0:
+            raise EmptyHeaderError("empty header")
+        if len(buf) != BLOCKSIZE:
+            raise TruncatedHeaderError("truncated header")
+        if buf.count(NUL) == BLOCKSIZE:
+            raise EOFHeaderError("end of file header")
+
+        chksum = nti(buf[148:156])
+        if chksum not in calc_chksums(buf):
+            raise InvalidHeaderError("bad checksum")
+
+        obj = cls()
+        obj.name = nts(buf[0:100], encoding, errors)
+        obj.mode = nti(buf[100:108])
+        obj.uid = nti(buf[108:116])
+        obj.gid = nti(buf[116:124])
+        obj.size = nti(buf[124:136])
+        obj.mtime = nti(buf[136:148])
+        obj.chksum = chksum
+        obj.type = buf[156:157]
+        obj.linkname = nts(buf[157:257], encoding, errors)
+        obj.uname = nts(buf[265:297], encoding, errors)
+        obj.gname = nts(buf[297:329], encoding, errors)
+        obj.devmajor = nti(buf[329:337])
+        obj.devminor = nti(buf[337:345])
+        prefix = nts(buf[345:500], encoding, errors)
+
+        # Old V7 tar format represents a directory as a regular
+        # file with a trailing slash.
+        if obj.type == AREGTYPE and obj.name.endswith("/"):
+            obj.type = DIRTYPE
+
+        # The old GNU sparse format occupies some of the unused
+        # space in the buffer for up to 4 sparse structures.
+        # Save the them for later processing in _proc_sparse().
+        if obj.type == GNUTYPE_SPARSE:
+            pos = 386
+            structs = []
+            for i in range(4):
+                try:
+                    offset = nti(buf[pos:pos + 12])
+                    numbytes = nti(buf[pos + 12:pos + 24])
+                except ValueError:
+                    break
+                structs.append((offset, numbytes))
+                pos += 24
+            isextended = bool(buf[482])
+            origsize = nti(buf[483:495])
+            obj._sparse_structs = (structs, isextended, origsize)
+
+        # Remove redundant slashes from directories.
+        if obj.isdir():
+            obj.name = obj.name.rstrip("/")
+
+        # Reconstruct a ustar longname.
+        if prefix and obj.type not in GNU_TYPES:
+            obj.name = prefix + "/" + obj.name
+        return obj
+
+    @classmethod
+    def fromtarfile(cls, tarfile):
+        """Return the next TarInfo object from TarFile object
+           tarfile.
+        """
+        buf = tarfile.fileobj.read(BLOCKSIZE)
+        obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors)
+        obj.offset = tarfile.fileobj.tell() - BLOCKSIZE
+        return obj._proc_member(tarfile)
+
+    #--------------------------------------------------------------------------
+    # The following are methods that are called depending on the type of a
+    # member. The entry point is _proc_member() which can be overridden in a
+    # subclass to add custom _proc_*() methods. A _proc_*() method MUST
+    # implement the following
+    # operations:
+    # 1. Set self.offset_data to the position where the data blocks begin,
+    #    if there is data that follows.
+    # 2. Set tarfile.offset to the position where the next member's header will
+    #    begin.
+    # 3. Return self or another valid TarInfo object.
+    def _proc_member(self, tarfile):
+        """Choose the right processing method depending on
+           the type and call it.
+        """
+        if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK):
+            return self._proc_gnulong(tarfile)
+        elif self.type == GNUTYPE_SPARSE:
+            return self._proc_sparse(tarfile)
+        elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE):
+            return self._proc_pax(tarfile)
+        else:
+            return self._proc_builtin(tarfile)
+
+    def _proc_builtin(self, tarfile):
+        """Process a builtin type or an unknown type which
+           will be treated as a regular file.
+        """
+        self.offset_data = tarfile.fileobj.tell()
+        offset = self.offset_data
+        if self.isreg() or self.type not in SUPPORTED_TYPES:
+            # Skip the following data blocks.
+            offset += self._block(self.size)
+        tarfile.offset = offset
+
+        # Patch the TarInfo object with saved global
+        # header information.
+        self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors)
+
+        return self
+
+    def _proc_gnulong(self, tarfile):
+        """Process the blocks that hold a GNU longname
+           or longlink member.
+        """
+        buf = tarfile.fileobj.read(self._block(self.size))
+
+        # Fetch the next header and process it.
+        try:
+            next = self.fromtarfile(tarfile)
+        except HeaderError:
+            raise SubsequentHeaderError("missing or bad subsequent header")
+
+        # Patch the TarInfo object from the next header with
+        # the longname information.
+        next.offset = self.offset
+        if self.type == GNUTYPE_LONGNAME:
+            next.name = nts(buf, tarfile.encoding, tarfile.errors)
+        elif self.type == GNUTYPE_LONGLINK:
+            next.linkname = nts(buf, tarfile.encoding, tarfile.errors)
+
+        return next
+
+    def _proc_sparse(self, tarfile):
+        """Process a GNU sparse header plus extra headers.
+        """
+        # We already collected some sparse structures in frombuf().
+        structs, isextended, origsize = self._sparse_structs
+        del self._sparse_structs
+
+        # Collect sparse structures from extended header blocks.
+        while isextended:
+            buf = tarfile.fileobj.read(BLOCKSIZE)
+            pos = 0
+            for i in range(21):
+                try:
+                    offset = nti(buf[pos:pos + 12])
+                    numbytes = nti(buf[pos + 12:pos + 24])
+                except ValueError:
+                    break
+                if offset and numbytes:
+                    structs.append((offset, numbytes))
+                pos += 24
+            isextended = bool(buf[504])
+        self.sparse = structs
+
+        self.offset_data = tarfile.fileobj.tell()
+        tarfile.offset = self.offset_data + self._block(self.size)
+        self.size = origsize
+        return self
+
+    def _proc_pax(self, tarfile):
+        """Process an extended or global header as described in
+           POSIX.1-2008.
+        """
+        # Read the header information.
+        buf = tarfile.fileobj.read(self._block(self.size))
+
+        # A pax header stores supplemental information for either
+        # the following file (extended) or all following files
+        # (global).
+        if self.type == XGLTYPE:
+            pax_headers = tarfile.pax_headers
+        else:
+            pax_headers = tarfile.pax_headers.copy()
+
+        # Check if the pax header contains a hdrcharset field. This tells us
+        # the encoding of the path, linkpath, uname and gname fields. Normally,
+        # these fields are UTF-8 encoded but since POSIX.1-2008 tar
+        # implementations are allowed to store them as raw binary strings if
+        # the translation to UTF-8 fails.
+        match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf)
+        if match is not None:
+            pax_headers["hdrcharset"] = match.group(1).decode("utf8")
+
+        # For the time being, we don't care about anything other than "BINARY".
+        # The only other value that is currently allowed by the standard is
+        # "ISO-IR 10646 2000 UTF-8" in other words UTF-8.
+        hdrcharset = pax_headers.get("hdrcharset")
+        if hdrcharset == "BINARY":
+            encoding = tarfile.encoding
+        else:
+            encoding = "utf8"
+
+        # Parse pax header information. A record looks like that:
+        # "%d %s=%s\n" % (length, keyword, value). length is the size
+        # of the complete record including the length field itself and
+        # the newline. keyword and value are both UTF-8 encoded strings.
+        regex = re.compile(br"(\d+) ([^=]+)=")
+        pos = 0
+        while True:
+            match = regex.match(buf, pos)
+            if not match:
+                break
+
+            length, keyword = match.groups()
+            length = int(length)
+            value = buf[match.end(2) + 1:match.start(1) + length - 1]
+
+            # Normally, we could just use "utf8" as the encoding and "strict"
+            # as the error handler, but we better not take the risk. For
+            # example, GNU tar <= 1.23 is known to store filenames it cannot
+            # translate to UTF-8 as raw strings (unfortunately without a
+            # hdrcharset=BINARY header).
+            # We first try the strict standard encoding, and if that fails we
+            # fall back on the user's encoding and error handler.
+            keyword = self._decode_pax_field(keyword, "utf8", "utf8",
+                    tarfile.errors)
+            if keyword in PAX_NAME_FIELDS:
+                value = self._decode_pax_field(value, encoding, tarfile.encoding,
+                        tarfile.errors)
+            else:
+                value = self._decode_pax_field(value, "utf8", "utf8",
+                        tarfile.errors)
+
+            pax_headers[keyword] = value
+            pos += length
+
+        # Fetch the next header.
+        try:
+            next = self.fromtarfile(tarfile)
+        except HeaderError:
+            raise SubsequentHeaderError("missing or bad subsequent header")
+
+        # Process GNU sparse information.
+        if "GNU.sparse.map" in pax_headers:
+            # GNU extended sparse format version 0.1.
+            self._proc_gnusparse_01(next, pax_headers)
+
+        elif "GNU.sparse.size" in pax_headers:
+            # GNU extended sparse format version 0.0.
+            self._proc_gnusparse_00(next, pax_headers, buf)
+
+        elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0":
+            # GNU extended sparse format version 1.0.
+            self._proc_gnusparse_10(next, pax_headers, tarfile)
+
+        if self.type in (XHDTYPE, SOLARIS_XHDTYPE):
+            # Patch the TarInfo object with the extended header info.
+            next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors)
+            next.offset = self.offset
+
+            if "size" in pax_headers:
+                # If the extended header replaces the size field,
+                # we need to recalculate the offset where the next
+                # header starts.
+                offset = next.offset_data
+                if next.isreg() or next.type not in SUPPORTED_TYPES:
+                    offset += next._block(next.size)
+                tarfile.offset = offset
+
+        return next
+
+    def _proc_gnusparse_00(self, next, pax_headers, buf):
+        """Process a GNU tar extended sparse header, version 0.0.
+        """
+        offsets = []
+        for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf):
+            offsets.append(int(match.group(1)))
+        numbytes = []
+        for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf):
+            numbytes.append(int(match.group(1)))
+        next.sparse = list(zip(offsets, numbytes))
+
+    def _proc_gnusparse_01(self, next, pax_headers):
+        """Process a GNU tar extended sparse header, version 0.1.
+        """
+        sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")]
+        next.sparse = list(zip(sparse[::2], sparse[1::2]))
+
+    def _proc_gnusparse_10(self, next, pax_headers, tarfile):
+        """Process a GNU tar extended sparse header, version 1.0.
+        """
+        fields = None
+        sparse = []
+        buf = tarfile.fileobj.read(BLOCKSIZE)
+        fields, buf = buf.split(b"\n", 1)
+        fields = int(fields)
+        while len(sparse) < fields * 2:
+            if b"\n" not in buf:
+                buf += tarfile.fileobj.read(BLOCKSIZE)
+            number, buf = buf.split(b"\n", 1)
+            sparse.append(int(number))
+        next.offset_data = tarfile.fileobj.tell()
+        next.sparse = list(zip(sparse[::2], sparse[1::2]))
+
+    def _apply_pax_info(self, pax_headers, encoding, errors):
+        """Replace fields with supplemental information from a previous
+           pax extended or global header.
+        """
+        for keyword, value in pax_headers.items():
+            if keyword == "GNU.sparse.name":
+                setattr(self, "path", value)
+            elif keyword == "GNU.sparse.size":
+                setattr(self, "size", int(value))
+            elif keyword == "GNU.sparse.realsize":
+                setattr(self, "size", int(value))
+            elif keyword in PAX_FIELDS:
+                if keyword in PAX_NUMBER_FIELDS:
+                    try:
+                        value = PAX_NUMBER_FIELDS[keyword](value)
+                    except ValueError:
+                        value = 0
+                if keyword == "path":
+                    value = value.rstrip("/")
+                setattr(self, keyword, value)
+
+        self.pax_headers = pax_headers.copy()
+
+    def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors):
+        """Decode a single field from a pax record.
+        """
+        try:
+            return value.decode(encoding, "strict")
+        except UnicodeDecodeError:
+            return value.decode(fallback_encoding, fallback_errors)
+
+    def _block(self, count):
+        """Round up a byte count by BLOCKSIZE and return it,
+           e.g. _block(834) => 1024.
+        """
+        blocks, remainder = divmod(count, BLOCKSIZE)
+        if remainder:
+            blocks += 1
+        return blocks * BLOCKSIZE
+
+    def isreg(self):
+        return self.type in REGULAR_TYPES
+    def isfile(self):
+        return self.isreg()
+    def isdir(self):
+        return self.type == DIRTYPE
+    def issym(self):
+        return self.type == SYMTYPE
+    def islnk(self):
+        return self.type == LNKTYPE
+    def ischr(self):
+        return self.type == CHRTYPE
+    def isblk(self):
+        return self.type == BLKTYPE
+    def isfifo(self):
+        return self.type == FIFOTYPE
+    def issparse(self):
+        return self.sparse is not None
+    def isdev(self):
+        return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE)
+# class TarInfo
+
+class TarFile(object):
+    """The TarFile Class provides an interface to tar archives.
+    """
+
+    debug = 0                   # May be set from 0 (no msgs) to 3 (all msgs)
+
+    dereference = False         # If true, add content of linked file to the
+                                # tar file, else the link.
+
+    ignore_zeros = False        # If true, skips empty or invalid blocks and
+                                # continues processing.
+
+    errorlevel = 1              # If 0, fatal errors only appear in debug
+                                # messages (if debug >= 0). If > 0, errors
+                                # are passed to the caller as exceptions.
+
+    format = DEFAULT_FORMAT     # The format to use when creating an archive.
+
+    encoding = ENCODING         # Encoding for 8-bit character strings.
+
+    errors = None               # Error handler for unicode conversion.
+
+    tarinfo = TarInfo           # The default TarInfo class to use.
+
+    fileobject = ExFileObject   # The default ExFileObject class to use.
+
+    def __init__(self, name=None, mode="r", fileobj=None, format=None,
+            tarinfo=None, dereference=None, ignore_zeros=None, encoding=None,
+            errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None):
+        """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to
+           read from an existing archive, 'a' to append data to an existing
+           file or 'w' to create a new file overwriting an existing one. `mode'
+           defaults to 'r'.
+           If `fileobj' is given, it is used for reading or writing data. If it
+           can be determined, `mode' is overridden by `fileobj's mode.
+           `fileobj' is not closed, when TarFile is closed.
+        """
+        if len(mode) > 1 or mode not in "raw":
+            raise ValueError("mode must be 'r', 'a' or 'w'")
+        self.mode = mode
+        self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode]
+
+        if not fileobj:
+            if self.mode == "a" and not os.path.exists(name):
+                # Create nonexistent files in append mode.
+                self.mode = "w"
+                self._mode = "wb"
+            fileobj = bltn_open(name, self._mode)
+            self._extfileobj = False
+        else:
+            if name is None and hasattr(fileobj, "name"):
+                name = fileobj.name
+            if hasattr(fileobj, "mode"):
+                self._mode = fileobj.mode
+            self._extfileobj = True
+        self.name = os.path.abspath(name) if name else None
+        self.fileobj = fileobj
+
+        # Init attributes.
+        if format is not None:
+            self.format = format
+        if tarinfo is not None:
+            self.tarinfo = tarinfo
+        if dereference is not None:
+            self.dereference = dereference
+        if ignore_zeros is not None:
+            self.ignore_zeros = ignore_zeros
+        if encoding is not None:
+            self.encoding = encoding
+        self.errors = errors
+
+        if pax_headers is not None and self.format == PAX_FORMAT:
+            self.pax_headers = pax_headers
+        else:
+            self.pax_headers = {}
+
+        if debug is not None:
+            self.debug = debug
+        if errorlevel is not None:
+            self.errorlevel = errorlevel
+
+        # Init datastructures.
+        self.closed = False
+        self.members = []       # list of members as TarInfo objects
+        self._loaded = False    # flag if all members have been read
+        self.offset = self.fileobj.tell()
+                                # current position in the archive file
+        self.inodes = {}        # dictionary caching the inodes of
+                                # archive members already added
+
+        try:
+            if self.mode == "r":
+                self.firstmember = None
+                self.firstmember = self.next()
+
+            if self.mode == "a":
+                # Move to the end of the archive,
+                # before the first empty block.
+                while True:
+                    self.fileobj.seek(self.offset)
+                    try:
+                        tarinfo = self.tarinfo.fromtarfile(self)
+                        self.members.append(tarinfo)
+                    except EOFHeaderError:
+                        self.fileobj.seek(self.offset)
+                        break
+                    except HeaderError as e:
+                        raise ReadError(str(e))
+
+            if self.mode in "aw":
+                self._loaded = True
+
+                if self.pax_headers:
+                    buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy())
+                    self.fileobj.write(buf)
+                    self.offset += len(buf)
+        except:
+            if not self._extfileobj:
+                self.fileobj.close()
+            self.closed = True
+            raise
+
+    #--------------------------------------------------------------------------
+    # Below are the classmethods which act as alternate constructors to the
+    # TarFile class. The open() method is the only one that is needed for
+    # public use; it is the "super"-constructor and is able to select an
+    # adequate "sub"-constructor for a particular compression using the mapping
+    # from OPEN_METH.
+    #
+    # This concept allows one to subclass TarFile without losing the comfort of
+    # the super-constructor. A sub-constructor is registered and made available
+    # by adding it to the mapping in OPEN_METH.
+
+    @classmethod
+    def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs):
+        """Open a tar archive for reading, writing or appending. Return
+           an appropriate TarFile class.
+
+           mode:
+           'r' or 'r:*' open for reading with transparent compression
+           'r:'         open for reading exclusively uncompressed
+           'r:gz'       open for reading with gzip compression
+           'r:bz2'      open for reading with bzip2 compression
+           'a' or 'a:'  open for appending, creating the file if necessary
+           'w' or 'w:'  open for writing without compression
+           'w:gz'       open for writing with gzip compression
+           'w:bz2'      open for writing with bzip2 compression
+
+           'r|*'        open a stream of tar blocks with transparent compression
+           'r|'         open an uncompressed stream of tar blocks for reading
+           'r|gz'       open a gzip compressed stream of tar blocks
+           'r|bz2'      open a bzip2 compressed stream of tar blocks
+           'w|'         open an uncompressed stream for writing
+           'w|gz'       open a gzip compressed stream for writing
+           'w|bz2'      open a bzip2 compressed stream for writing
+        """
+
+        if not name and not fileobj:
+            raise ValueError("nothing to open")
+
+        if mode in ("r", "r:*"):
+            # Find out which *open() is appropriate for opening the file.
+            for comptype in cls.OPEN_METH:
+                func = getattr(cls, cls.OPEN_METH[comptype])
+                if fileobj is not None:
+                    saved_pos = fileobj.tell()
+                try:
+                    return func(name, "r", fileobj, **kwargs)
+                except (ReadError, CompressionError) as e:
+                    if fileobj is not None:
+                        fileobj.seek(saved_pos)
+                    continue
+            raise ReadError("file could not be opened successfully")
+
+        elif ":" in mode:
+            filemode, comptype = mode.split(":", 1)
+            filemode = filemode or "r"
+            comptype = comptype or "tar"
+
+            # Select the *open() function according to
+            # given compression.
+            if comptype in cls.OPEN_METH:
+                func = getattr(cls, cls.OPEN_METH[comptype])
+            else:
+                raise CompressionError("unknown compression type %r" % comptype)
+            return func(name, filemode, fileobj, **kwargs)
+
+        elif "|" in mode:
+            filemode, comptype = mode.split("|", 1)
+            filemode = filemode or "r"
+            comptype = comptype or "tar"
+
+            if filemode not in "rw":
+                raise ValueError("mode must be 'r' or 'w'")
+
+            stream = _Stream(name, filemode, comptype, fileobj, bufsize)
+            try:
+                t = cls(name, filemode, stream, **kwargs)
+            except:
+                stream.close()
+                raise
+            t._extfileobj = False
+            return t
+
+        elif mode in "aw":
+            return cls.taropen(name, mode, fileobj, **kwargs)
+
+        raise ValueError("undiscernible mode")
+
+    @classmethod
+    def taropen(cls, name, mode="r", fileobj=None, **kwargs):
+        """Open uncompressed tar archive name for reading or writing.
+        """
+        if len(mode) > 1 or mode not in "raw":
+            raise ValueError("mode must be 'r', 'a' or 'w'")
+        return cls(name, mode, fileobj, **kwargs)
+
+    @classmethod
+    def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
+        """Open gzip compressed tar archive name for reading or writing.
+           Appending is not allowed.
+        """
+        if len(mode) > 1 or mode not in "rw":
+            raise ValueError("mode must be 'r' or 'w'")
+
+        try:
+            import gzip
+            gzip.GzipFile
+        except (ImportError, AttributeError):
+            raise CompressionError("gzip module is not available")
+
+        extfileobj = fileobj is not None
+        try:
+            fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj)
+            t = cls.taropen(name, mode, fileobj, **kwargs)
+        except IOError:
+            if not extfileobj and fileobj is not None:
+                fileobj.close()
+            if fileobj is None:
+                raise
+            raise ReadError("not a gzip file")
+        except:
+            if not extfileobj and fileobj is not None:
+                fileobj.close()
+            raise
+        t._extfileobj = extfileobj
+        return t
+
+    @classmethod
+    def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
+        """Open bzip2 compressed tar archive name for reading or writing.
+           Appending is not allowed.
+        """
+        if len(mode) > 1 or mode not in "rw":
+            raise ValueError("mode must be 'r' or 'w'.")
+
+        try:
+            import bz2
+        except ImportError:
+            raise CompressionError("bz2 module is not available")
+
+        if fileobj is not None:
+            fileobj = _BZ2Proxy(fileobj, mode)
+        else:
+            fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel)
+
+        try:
+            t = cls.taropen(name, mode, fileobj, **kwargs)
+        except (IOError, EOFError):
+            fileobj.close()
+            raise ReadError("not a bzip2 file")
+        t._extfileobj = False
+        return t
+
+    # All *open() methods are registered here.
+    OPEN_METH = {
+        "tar": "taropen",   # uncompressed tar
+        "gz":  "gzopen",    # gzip compressed tar
+        "bz2": "bz2open"    # bzip2 compressed tar
+    }
+
+    #--------------------------------------------------------------------------
+    # The public methods which TarFile provides:
+
+    def close(self):
+        """Close the TarFile. In write-mode, two finishing zero blocks are
+           appended to the archive.
+        """
+        if self.closed:
+            return
+
+        if self.mode in "aw":
+            self.fileobj.write(NUL * (BLOCKSIZE * 2))
+            self.offset += (BLOCKSIZE * 2)
+            # fill up the end with zero-blocks
+            # (like option -b20 for tar does)
+            blocks, remainder = divmod(self.offset, RECORDSIZE)
+            if remainder > 0:
+                self.fileobj.write(NUL * (RECORDSIZE - remainder))
+
+        if not self._extfileobj:
+            self.fileobj.close()
+        self.closed = True
+
+    def getmember(self, name):
+        """Return a TarInfo object for member `name'. If `name' can not be
+           found in the archive, KeyError is raised. If a member occurs more
+           than once in the archive, its last occurrence is assumed to be the
+           most up-to-date version.
+        """
+        tarinfo = self._getmember(name)
+        if tarinfo is None:
+            raise KeyError("filename %r not found" % name)
+        return tarinfo
+
+    def getmembers(self):
+        """Return the members of the archive as a list of TarInfo objects. The
+           list has the same order as the members in the archive.
+        """
+        self._check()
+        if not self._loaded:    # if we want to obtain a list of
+            self._load()        # all members, we first have to
+                                # scan the whole archive.
+        return self.members
+
+    def getnames(self):
+        """Return the members of the archive as a list of their names. It has
+           the same order as the list returned by getmembers().
+        """
+        return [tarinfo.name for tarinfo in self.getmembers()]
+
+    def gettarinfo(self, name=None, arcname=None, fileobj=None):
+        """Create a TarInfo object for either the file `name' or the file
+           object `fileobj' (using os.fstat on its file descriptor). You can
+           modify some of the TarInfo's attributes before you add it using
+           addfile(). If given, `arcname' specifies an alternative name for the
+           file in the archive.
+        """
+        self._check("aw")
+
+        # When fileobj is given, replace name by
+        # fileobj's real name.
+        if fileobj is not None:
+            name = fileobj.name
+
+        # Building the name of the member in the archive.
+        # Backward slashes are converted to forward slashes,
+        # Absolute paths are turned to relative paths.
+        if arcname is None:
+            arcname = name
+        drv, arcname = os.path.splitdrive(arcname)
+        arcname = arcname.replace(os.sep, "/")
+        arcname = arcname.lstrip("/")
+
+        # Now, fill the TarInfo object with
+        # information specific for the file.
+        tarinfo = self.tarinfo()
+        tarinfo.tarfile = self
+
+        # Use os.stat or os.lstat, depending on platform
+        # and if symlinks shall be resolved.
+        if fileobj is None:
+            if hasattr(os, "lstat") and not self.dereference:
+                statres = os.lstat(name)
+            else:
+                statres = os.stat(name)
+        else:
+            statres = os.fstat(fileobj.fileno())
+        linkname = ""
+
+        stmd = statres.st_mode
+        if stat.S_ISREG(stmd):
+            inode = (statres.st_ino, statres.st_dev)
+            if not self.dereference and statres.st_nlink > 1 and \
+                    inode in self.inodes and arcname != self.inodes[inode]:
+                # Is it a hardlink to an already
+                # archived file?
+                type = LNKTYPE
+                linkname = self.inodes[inode]
+            else:
+                # The inode is added only if its valid.
+                # For win32 it is always 0.
+                type = REGTYPE
+                if inode[0]:
+                    self.inodes[inode] = arcname
+        elif stat.S_ISDIR(stmd):
+            type = DIRTYPE
+        elif stat.S_ISFIFO(stmd):
+            type = FIFOTYPE
+        elif stat.S_ISLNK(stmd):
+            type = SYMTYPE
+            linkname = os.readlink(name)
+        elif stat.S_ISCHR(stmd):
+            type = CHRTYPE
+        elif stat.S_ISBLK(stmd):
+            type = BLKTYPE
+        else:
+            return None
+
+        # Fill the TarInfo object with all
+        # information we can get.
+        tarinfo.name = arcname
+        tarinfo.mode = stmd
+        tarinfo.uid = statres.st_uid
+        tarinfo.gid = statres.st_gid
+        if type == REGTYPE:
+            tarinfo.size = statres.st_size
+        else:
+            tarinfo.size = 0
+        tarinfo.mtime = statres.st_mtime
+        tarinfo.type = type
+        tarinfo.linkname = linkname
+        if pwd:
+            try:
+                tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0]
+            except KeyError:
+                pass
+        if grp:
+            try:
+                tarinfo.gname = grp.getgrgid(tarinfo.gid)[0]
+            except KeyError:
+                pass
+
+        if type in (CHRTYPE, BLKTYPE):
+            if hasattr(os, "major") and hasattr(os, "minor"):
+                tarinfo.devmajor = os.major(statres.st_rdev)
+                tarinfo.devminor = os.minor(statres.st_rdev)
+        return tarinfo
+
+    def list(self, verbose=True):
+        """Print a table of contents to sys.stdout. If `verbose' is False, only
+           the names of the members are printed. If it is True, an `ls -l'-like
+           output is produced.
+        """
+        self._check()
+
+        for tarinfo in self:
+            if verbose:
+                print(filemode(tarinfo.mode), end=' ')
+                print("%s/%s" % (tarinfo.uname or tarinfo.uid,
+                                 tarinfo.gname or tarinfo.gid), end=' ')
+                if tarinfo.ischr() or tarinfo.isblk():
+                    print("%10s" % ("%d,%d" \
+                                    % (tarinfo.devmajor, tarinfo.devminor)), end=' ')
+                else:
+                    print("%10d" % tarinfo.size, end=' ')
+                print("%d-%02d-%02d %02d:%02d:%02d" \
+                      % time.localtime(tarinfo.mtime)[:6], end=' ')
+
+            print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ')
+
+            if verbose:
+                if tarinfo.issym():
+                    print("->", tarinfo.linkname, end=' ')
+                if tarinfo.islnk():
+                    print("link to", tarinfo.linkname, end=' ')
+            print()
+
+    def add(self, name, arcname=None, recursive=True, exclude=None, filter=None):
+        """Add the file `name' to the archive. `name' may be any type of file
+           (directory, fifo, symbolic link, etc.). If given, `arcname'
+           specifies an alternative name for the file in the archive.
+           Directories are added recursively by default. This can be avoided by
+           setting `recursive' to False. `exclude' is a function that should
+           return True for each filename to be excluded. `filter' is a function
+           that expects a TarInfo object argument and returns the changed
+           TarInfo object, if it returns None the TarInfo object will be
+           excluded from the archive.
+        """
+        self._check("aw")
+
+        if arcname is None:
+            arcname = name
+
+        # Exclude pathnames.
+        if exclude is not None:
+            import warnings
+            warnings.warn("use the filter argument instead",
+                    DeprecationWarning, 2)
+            if exclude(name):
+                self._dbg(2, "tarfile: Excluded %r" % name)
+                return
+
+        # Skip if somebody tries to archive the archive...
+        if self.name is not None and os.path.abspath(name) == self.name:
+            self._dbg(2, "tarfile: Skipped %r" % name)
+            return
+
+        self._dbg(1, name)
+
+        # Create a TarInfo object from the file.
+        tarinfo = self.gettarinfo(name, arcname)
+
+        if tarinfo is None:
+            self._dbg(1, "tarfile: Unsupported type %r" % name)
+            return
+
+        # Change or exclude the TarInfo object.
+        if filter is not None:
+            tarinfo = filter(tarinfo)
+            if tarinfo is None:
+                self._dbg(2, "tarfile: Excluded %r" % name)
+                return
+
+        # Append the tar header and data to the archive.
+        if tarinfo.isreg():
+            f = bltn_open(name, "rb")
+            self.addfile(tarinfo, f)
+            f.close()
+
+        elif tarinfo.isdir():
+            self.addfile(tarinfo)
+            if recursive:
+                for f in os.listdir(name):
+                    self.add(os.path.join(name, f), os.path.join(arcname, f),
+                            recursive, exclude, filter=filter)
+
+        else:
+            self.addfile(tarinfo)
+
+    def addfile(self, tarinfo, fileobj=None):
+        """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is
+           given, tarinfo.size bytes are read from it and added to the archive.
+           You can create TarInfo objects using gettarinfo().
+           On Windows platforms, `fileobj' should always be opened with mode
+           'rb' to avoid irritation about the file size.
+        """
+        self._check("aw")
+
+        tarinfo = copy.copy(tarinfo)
+
+        buf = tarinfo.tobuf(self.format, self.encoding, self.errors)
+        self.fileobj.write(buf)
+        self.offset += len(buf)
+
+        # If there's data to follow, append it.
+        if fileobj is not None:
+            copyfileobj(fileobj, self.fileobj, tarinfo.size)
+            blocks, remainder = divmod(tarinfo.size, BLOCKSIZE)
+            if remainder > 0:
+                self.fileobj.write(NUL * (BLOCKSIZE - remainder))
+                blocks += 1
+            self.offset += blocks * BLOCKSIZE
+
+        self.members.append(tarinfo)
+
+    def extractall(self, path=".", members=None):
+        """Extract all members from the archive to the current working
+           directory and set owner, modification time and permissions on
+           directories afterwards. `path' specifies a different directory
+           to extract to. `members' is optional and must be a subset of the
+           list returned by getmembers().
+        """
+        directories = []
+
+        if members is None:
+            members = self
+
+        for tarinfo in members:
+            if tarinfo.isdir():
+                # Extract directories with a safe mode.
+                directories.append(tarinfo)
+                tarinfo = copy.copy(tarinfo)
+                tarinfo.mode = 0o700
+            # Do not set_attrs directories, as we will do that further down
+            self.extract(tarinfo, path, set_attrs=not tarinfo.isdir())
+
+        # Reverse sort directories.
+        directories.sort(key=lambda a: a.name)
+        directories.reverse()
+
+        # Set correct owner, mtime and filemode on directories.
+        for tarinfo in directories:
+            dirpath = os.path.join(path, tarinfo.name)
+            try:
+                self.chown(tarinfo, dirpath)
+                self.utime(tarinfo, dirpath)
+                self.chmod(tarinfo, dirpath)
+            except ExtractError as e:
+                if self.errorlevel > 1:
+                    raise
+                else:
+                    self._dbg(1, "tarfile: %s" % e)
+
+    def extract(self, member, path="", set_attrs=True):
+        """Extract a member from the archive to the current working directory,
+           using its full name. Its file information is extracted as accurately
+           as possible. `member' may be a filename or a TarInfo object. You can
+           specify a different directory using `path'. File attributes (owner,
+           mtime, mode) are set unless `set_attrs' is False.
+        """
+        self._check("r")
+
+        if isinstance(member, str):
+            tarinfo = self.getmember(member)
+        else:
+            tarinfo = member
+
+        # Prepare the link target for makelink().
+        if tarinfo.islnk():
+            tarinfo._link_target = os.path.join(path, tarinfo.linkname)
+
+        try:
+            self._extract_member(tarinfo, os.path.join(path, tarinfo.name),
+                                 set_attrs=set_attrs)
+        except EnvironmentError as e:
+            if self.errorlevel > 0:
+                raise
+            else:
+                if e.filename is None:
+                    self._dbg(1, "tarfile: %s" % e.strerror)
+                else:
+                    self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename))
+        except ExtractError as e:
+            if self.errorlevel > 1:
+                raise
+            else:
+                self._dbg(1, "tarfile: %s" % e)
+
+    def extractfile(self, member):
+        """Extract a member from the archive as a file object. `member' may be
+           a filename or a TarInfo object. If `member' is a regular file, a
+           file-like object is returned. If `member' is a link, a file-like
+           object is constructed from the link's target. If `member' is none of
+           the above, None is returned.
+           The file-like object is read-only and provides the following
+           methods: read(), readline(), readlines(), seek() and tell()
+        """
+        self._check("r")
+
+        if isinstance(member, str):
+            tarinfo = self.getmember(member)
+        else:
+            tarinfo = member
+
+        if tarinfo.isreg():
+            return self.fileobject(self, tarinfo)
+
+        elif tarinfo.type not in SUPPORTED_TYPES:
+            # If a member's type is unknown, it is treated as a
+            # regular file.
+            return self.fileobject(self, tarinfo)
+
+        elif tarinfo.islnk() or tarinfo.issym():
+            if isinstance(self.fileobj, _Stream):
+                # A small but ugly workaround for the case that someone tries
+                # to extract a (sym)link as a file-object from a non-seekable
+                # stream of tar blocks.
+                raise StreamError("cannot extract (sym)link as file object")
+            else:
+                # A (sym)link's file object is its target's file object.
+                return self.extractfile(self._find_link_target(tarinfo))
+        else:
+            # If there's no data associated with the member (directory, chrdev,
+            # blkdev, etc.), return None instead of a file object.
+            return None
+
+    def _extract_member(self, tarinfo, targetpath, set_attrs=True):
+        """Extract the TarInfo object tarinfo to a physical
+           file called targetpath.
+        """
+        # Fetch the TarInfo object for the given name
+        # and build the destination pathname, replacing
+        # forward slashes to platform specific separators.
+        targetpath = targetpath.rstrip("/")
+        targetpath = targetpath.replace("/", os.sep)
+
+        # Create all upper directories.
+        upperdirs = os.path.dirname(targetpath)
+        if upperdirs and not os.path.exists(upperdirs):
+            # Create directories that are not part of the archive with
+            # default permissions.
+            os.makedirs(upperdirs)
+
+        if tarinfo.islnk() or tarinfo.issym():
+            self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname))
+        else:
+            self._dbg(1, tarinfo.name)
+
+        if tarinfo.isreg():
+            self.makefile(tarinfo, targetpath)
+        elif tarinfo.isdir():
+            self.makedir(tarinfo, targetpath)
+        elif tarinfo.isfifo():
+            self.makefifo(tarinfo, targetpath)
+        elif tarinfo.ischr() or tarinfo.isblk():
+            self.makedev(tarinfo, targetpath)
+        elif tarinfo.islnk() or tarinfo.issym():
+            self.makelink(tarinfo, targetpath)
+        elif tarinfo.type not in SUPPORTED_TYPES:
+            self.makeunknown(tarinfo, targetpath)
+        else:
+            self.makefile(tarinfo, targetpath)
+
+        if set_attrs:
+            self.chown(tarinfo, targetpath)
+            if not tarinfo.issym():
+                self.chmod(tarinfo, targetpath)
+                self.utime(tarinfo, targetpath)
+
+    #--------------------------------------------------------------------------
+    # Below are the different file methods. They are called via
+    # _extract_member() when extract() is called. They can be replaced in a
+    # subclass to implement other functionality.
+
+    def makedir(self, tarinfo, targetpath):
+        """Make a directory called targetpath.
+        """
+        try:
+            # Use a safe mode for the directory, the real mode is set
+            # later in _extract_member().
+            os.mkdir(targetpath, 0o700)
+        except EnvironmentError as e:
+            if e.errno != errno.EEXIST:
+                raise
+
+    def makefile(self, tarinfo, targetpath):
+        """Make a file called targetpath.
+        """
+        source = self.fileobj
+        source.seek(tarinfo.offset_data)
+        target = bltn_open(targetpath, "wb")
+        if tarinfo.sparse is not None:
+            for offset, size in tarinfo.sparse:
+                target.seek(offset)
+                copyfileobj(source, target, size)
+        else:
+            copyfileobj(source, target, tarinfo.size)
+        target.seek(tarinfo.size)
+        target.truncate()
+        target.close()
+
+    def makeunknown(self, tarinfo, targetpath):
+        """Make a file from a TarInfo object with an unknown type
+           at targetpath.
+        """
+        self.makefile(tarinfo, targetpath)
+        self._dbg(1, "tarfile: Unknown file type %r, " \
+                     "extracted as regular file." % tarinfo.type)
+
+    def makefifo(self, tarinfo, targetpath):
+        """Make a fifo called targetpath.
+        """
+        if hasattr(os, "mkfifo"):
+            os.mkfifo(targetpath)
+        else:
+            raise ExtractError("fifo not supported by system")
+
+    def makedev(self, tarinfo, targetpath):
+        """Make a character or block device called targetpath.
+        """
+        if not hasattr(os, "mknod") or not hasattr(os, "makedev"):
+            raise ExtractError("special devices not supported by system")
+
+        mode = tarinfo.mode
+        if tarinfo.isblk():
+            mode |= stat.S_IFBLK
+        else:
+            mode |= stat.S_IFCHR
+
+        os.mknod(targetpath, mode,
+                 os.makedev(tarinfo.devmajor, tarinfo.devminor))
+
+    def makelink(self, tarinfo, targetpath):
+        """Make a (symbolic) link called targetpath. If it cannot be created
+          (platform limitation), we try to make a copy of the referenced file
+          instead of a link.
+        """
+        try:
+            # For systems that support symbolic and hard links.
+            if tarinfo.issym():
+                os.symlink(tarinfo.linkname, targetpath)
+            else:
+                # See extract().
+                if os.path.exists(tarinfo._link_target):
+                    os.link(tarinfo._link_target, targetpath)
+                else:
+                    self._extract_member(self._find_link_target(tarinfo),
+                                         targetpath)
+        except symlink_exception:
+            if tarinfo.issym():
+                linkpath = os.path.join(os.path.dirname(tarinfo.name),
+                                        tarinfo.linkname)
+            else:
+                linkpath = tarinfo.linkname
+        else:
+            try:
+                self._extract_member(self._find_link_target(tarinfo),
+                                     targetpath)
+            except KeyError:
+                raise ExtractError("unable to resolve link inside archive")
+
+    def chown(self, tarinfo, targetpath):
+        """Set owner of targetpath according to tarinfo.
+        """
+        if pwd and hasattr(os, "geteuid") and os.geteuid() == 0:
+            # We have to be root to do so.
+            try:
+                g = grp.getgrnam(tarinfo.gname)[2]
+            except KeyError:
+                g = tarinfo.gid
+            try:
+                u = pwd.getpwnam(tarinfo.uname)[2]
+            except KeyError:
+                u = tarinfo.uid
+            try:
+                if tarinfo.issym() and hasattr(os, "lchown"):
+                    os.lchown(targetpath, u, g)
+                else:
+                    if sys.platform != "os2emx":
+                        os.chown(targetpath, u, g)
+            except EnvironmentError as e:
+                raise ExtractError("could not change owner")
+
+    def chmod(self, tarinfo, targetpath):
+        """Set file permissions of targetpath according to tarinfo.
+        """
+        if hasattr(os, 'chmod'):
+            try:
+                os.chmod(targetpath, tarinfo.mode)
+            except EnvironmentError as e:
+                raise ExtractError("could not change mode")
+
+    def utime(self, tarinfo, targetpath):
+        """Set modification time of targetpath according to tarinfo.
+        """
+        if not hasattr(os, 'utime'):
+            return
+        try:
+            os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime))
+        except EnvironmentError as e:
+            raise ExtractError("could not change modification time")
+
+    #--------------------------------------------------------------------------
+    def next(self):
+        """Return the next member of the archive as a TarInfo object, when
+           TarFile is opened for reading. Return None if there is no more
+           available.
+        """
+        self._check("ra")
+        if self.firstmember is not None:
+            m = self.firstmember
+            self.firstmember = None
+            return m
+
+        # Read the next block.
+        self.fileobj.seek(self.offset)
+        tarinfo = None
+        while True:
+            try:
+                tarinfo = self.tarinfo.fromtarfile(self)
+            except EOFHeaderError as e:
+                if self.ignore_zeros:
+                    self._dbg(2, "0x%X: %s" % (self.offset, e))
+                    self.offset += BLOCKSIZE
+                    continue
+            except InvalidHeaderError as e:
+                if self.ignore_zeros:
+                    self._dbg(2, "0x%X: %s" % (self.offset, e))
+                    self.offset += BLOCKSIZE
+                    continue
+                elif self.offset == 0:
+                    raise ReadError(str(e))
+            except EmptyHeaderError:
+                if self.offset == 0:
+                    raise ReadError("empty file")
+            except TruncatedHeaderError as e:
+                if self.offset == 0:
+                    raise ReadError(str(e))
+            except SubsequentHeaderError as e:
+                raise ReadError(str(e))
+            break
+
+        if tarinfo is not None:
+            self.members.append(tarinfo)
+        else:
+            self._loaded = True
+
+        return tarinfo
+
+    #--------------------------------------------------------------------------
+    # Little helper methods:
+
+    def _getmember(self, name, tarinfo=None, normalize=False):
+        """Find an archive member by name from bottom to top.
+           If tarinfo is given, it is used as the starting point.
+        """
+        # Ensure that all members have been loaded.
+        members = self.getmembers()
+
+        # Limit the member search list up to tarinfo.
+        if tarinfo is not None:
+            members = members[:members.index(tarinfo)]
+
+        if normalize:
+            name = os.path.normpath(name)
+
+        for member in reversed(members):
+            if normalize:
+                member_name = os.path.normpath(member.name)
+            else:
+                member_name = member.name
+
+            if name == member_name:
+                return member
+
+    def _load(self):
+        """Read through the entire archive file and look for readable
+           members.
+        """
+        while True:
+            tarinfo = self.next()
+            if tarinfo is None:
+                break
+        self._loaded = True
+
+    def _check(self, mode=None):
+        """Check if TarFile is still open, and if the operation's mode
+           corresponds to TarFile's mode.
+        """
+        if self.closed:
+            raise IOError("%s is closed" % self.__class__.__name__)
+        if mode is not None and self.mode not in mode:
+            raise IOError("bad operation for mode %r" % self.mode)
+
+    def _find_link_target(self, tarinfo):
+        """Find the target member of a symlink or hardlink member in the
+           archive.
+        """
+        if tarinfo.issym():
+            # Always search the entire archive.
+            linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname
+            limit = None
+        else:
+            # Search the archive before the link, because a hard link is
+            # just a reference to an already archived file.
+            linkname = tarinfo.linkname
+            limit = tarinfo
+
+        member = self._getmember(linkname, tarinfo=limit, normalize=True)
+        if member is None:
+            raise KeyError("linkname %r not found" % linkname)
+        return member
+
+    def __iter__(self):
+        """Provide an iterator object.
+        """
+        if self._loaded:
+            return iter(self.members)
+        else:
+            return TarIter(self)
+
+    def _dbg(self, level, msg):
+        """Write debugging output to sys.stderr.
+        """
+        if level <= self.debug:
+            print(msg, file=sys.stderr)
+
+    def __enter__(self):
+        self._check()
+        return self
+
+    def __exit__(self, type, value, traceback):
+        if type is None:
+            self.close()
+        else:
+            # An exception occurred. We must not call close() because
+            # it would try to write end-of-archive blocks and padding.
+            if not self._extfileobj:
+                self.fileobj.close()
+            self.closed = True
+# class TarFile
+
+class TarIter(object):
+    """Iterator Class.
+
+       for tarinfo in TarFile(...):
+           suite...
+    """
+
+    def __init__(self, tarfile):
+        """Construct a TarIter object.
+        """
+        self.tarfile = tarfile
+        self.index = 0
+    def __iter__(self):
+        """Return iterator object.
+        """
+        return self
+
+    def __next__(self):
+        """Return the next item using TarFile's next() method.
+           When all members have been read, set TarFile as _loaded.
+        """
+        # Fix for SF #1100429: Under rare circumstances it can
+        # happen that getmembers() is called during iteration,
+        # which will cause TarIter to stop prematurely.
+        if not self.tarfile._loaded:
+            tarinfo = self.tarfile.next()
+            if not tarinfo:
+                self.tarfile._loaded = True
+                raise StopIteration
+        else:
+            try:
+                tarinfo = self.tarfile.members[self.index]
+            except IndexError:
+                raise StopIteration
+        self.index += 1
+        return tarinfo
+
+    next = __next__ # for Python 2.x
+
+#--------------------
+# exported functions
+#--------------------
+def is_tarfile(name):
+    """Return True if name points to a tar archive that we
+       are able to handle, else return False.
+    """
+    try:
+        t = open(name)
+        t.close()
+        return True
+    except TarError:
+        return False
+
+bltn_open = open
+open = TarFile.open
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/compat.py b/vendor/pip-9.0.3/pip/_vendor/distlib/compat.py
new file mode 100644
index 0000000000000000000000000000000000000000..2b198dd57dd57270f4415ebfe0ebe0ba1a99d761
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/compat.py
@@ -0,0 +1,1111 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-2016 Vinay Sajip.
+# Licensed to the Python Software Foundation under a contributor agreement.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+from __future__ import absolute_import
+
+import os
+import re
+import sys
+
+try:
+    import ssl
+except ImportError:
+    ssl = None
+
+if sys.version_info[0] < 3:  # pragma: no cover
+    from StringIO import StringIO
+    string_types = basestring,
+    text_type = unicode
+    from types import FileType as file_type
+    import __builtin__ as builtins
+    import ConfigParser as configparser
+    from ._backport import shutil
+    from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit
+    from urllib import (urlretrieve, quote as _quote, unquote, url2pathname,
+                        pathname2url, ContentTooShortError, splittype)
+
+    def quote(s):
+        if isinstance(s, unicode):
+            s = s.encode('utf-8')
+        return _quote(s)
+
+    import urllib2
+    from urllib2 import (Request, urlopen, URLError, HTTPError,
+                         HTTPBasicAuthHandler, HTTPPasswordMgr,
+                         HTTPHandler, HTTPRedirectHandler,
+                         build_opener)
+    if ssl:
+        from urllib2 import HTTPSHandler
+    import httplib
+    import xmlrpclib
+    import Queue as queue
+    from HTMLParser import HTMLParser
+    import htmlentitydefs
+    raw_input = raw_input
+    from itertools import ifilter as filter
+    from itertools import ifilterfalse as filterfalse
+
+    _userprog = None
+    def splituser(host):
+        """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'."""
+        global _userprog
+        if _userprog is None:
+            import re
+            _userprog = re.compile('^(.*)@(.*)$')
+
+        match = _userprog.match(host)
+        if match: return match.group(1, 2)
+        return None, host
+
+else:  # pragma: no cover
+    from io import StringIO
+    string_types = str,
+    text_type = str
+    from io import TextIOWrapper as file_type
+    import builtins
+    import configparser
+    import shutil
+    from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote,
+                              unquote, urlsplit, urlunsplit, splittype)
+    from urllib.request import (urlopen, urlretrieve, Request, url2pathname,
+                                pathname2url,
+                                HTTPBasicAuthHandler, HTTPPasswordMgr,
+                                HTTPHandler, HTTPRedirectHandler,
+                                build_opener)
+    if ssl:
+        from urllib.request import HTTPSHandler
+    from urllib.error import HTTPError, URLError, ContentTooShortError
+    import http.client as httplib
+    import urllib.request as urllib2
+    import xmlrpc.client as xmlrpclib
+    import queue
+    from html.parser import HTMLParser
+    import html.entities as htmlentitydefs
+    raw_input = input
+    from itertools import filterfalse
+    filter = filter
+
+try:
+    from ssl import match_hostname, CertificateError
+except ImportError: # pragma: no cover
+    class CertificateError(ValueError):
+        pass
+
+
+    def _dnsname_match(dn, hostname, max_wildcards=1):
+        """Matching according to RFC 6125, section 6.4.3
+
+        http://tools.ietf.org/html/rfc6125#section-6.4.3
+        """
+        pats = []
+        if not dn:
+            return False
+
+        parts = dn.split('.')
+        leftmost, remainder = parts[0], parts[1:]
+
+        wildcards = leftmost.count('*')
+        if wildcards > max_wildcards:
+            # Issue #17980: avoid denials of service by refusing more
+            # than one wildcard per fragment.  A survey of established
+            # policy among SSL implementations showed it to be a
+            # reasonable choice.
+            raise CertificateError(
+                "too many wildcards in certificate DNS name: " + repr(dn))
+
+        # speed up common case w/o wildcards
+        if not wildcards:
+            return dn.lower() == hostname.lower()
+
+        # RFC 6125, section 6.4.3, subitem 1.
+        # The client SHOULD NOT attempt to match a presented identifier in which
+        # the wildcard character comprises a label other than the left-most label.
+        if leftmost == '*':
+            # When '*' is a fragment by itself, it matches a non-empty dotless
+            # fragment.
+            pats.append('[^.]+')
+        elif leftmost.startswith('xn--') or hostname.startswith('xn--'):
+            # RFC 6125, section 6.4.3, subitem 3.
+            # The client SHOULD NOT attempt to match a presented identifier
+            # where the wildcard character is embedded within an A-label or
+            # U-label of an internationalized domain name.
+            pats.append(re.escape(leftmost))
+        else:
+            # Otherwise, '*' matches any dotless string, e.g. www*
+            pats.append(re.escape(leftmost).replace(r'\*', '[^.]*'))
+
+        # add the remaining fragments, ignore any wildcards
+        for frag in remainder:
+            pats.append(re.escape(frag))
+
+        pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
+        return pat.match(hostname)
+
+
+    def match_hostname(cert, hostname):
+        """Verify that *cert* (in decoded format as returned by
+        SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
+        rules are followed, but IP addresses are not accepted for *hostname*.
+
+        CertificateError is raised on failure. On success, the function
+        returns nothing.
+        """
+        if not cert:
+            raise ValueError("empty or no certificate, match_hostname needs a "
+                             "SSL socket or SSL context with either "
+                             "CERT_OPTIONAL or CERT_REQUIRED")
+        dnsnames = []
+        san = cert.get('subjectAltName', ())
+        for key, value in san:
+            if key == 'DNS':
+                if _dnsname_match(value, hostname):
+                    return
+                dnsnames.append(value)
+        if not dnsnames:
+            # The subject is only checked when there is no dNSName entry
+            # in subjectAltName
+            for sub in cert.get('subject', ()):
+                for key, value in sub:
+                    # XXX according to RFC 2818, the most specific Common Name
+                    # must be used.
+                    if key == 'commonName':
+                        if _dnsname_match(value, hostname):
+                            return
+                        dnsnames.append(value)
+        if len(dnsnames) > 1:
+            raise CertificateError("hostname %r "
+                "doesn't match either of %s"
+                % (hostname, ', '.join(map(repr, dnsnames))))
+        elif len(dnsnames) == 1:
+            raise CertificateError("hostname %r "
+                "doesn't match %r"
+                % (hostname, dnsnames[0]))
+        else:
+            raise CertificateError("no appropriate commonName or "
+                "subjectAltName fields were found")
+
+
+try:
+    from types import SimpleNamespace as Container
+except ImportError:  # pragma: no cover
+    class Container(object):
+        """
+        A generic container for when multiple values need to be returned
+        """
+        def __init__(self, **kwargs):
+            self.__dict__.update(kwargs)
+
+
+try:
+    from shutil import which
+except ImportError:  # pragma: no cover
+    # Implementation from Python 3.3
+    def which(cmd, mode=os.F_OK | os.X_OK, path=None):
+        """Given a command, mode, and a PATH string, return the path which
+        conforms to the given mode on the PATH, or None if there is no such
+        file.
+
+        `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result
+        of os.environ.get("PATH"), or can be overridden with a custom search
+        path.
+
+        """
+        # Check that a given file can be accessed with the correct mode.
+        # Additionally check that `file` is not a directory, as on Windows
+        # directories pass the os.access check.
+        def _access_check(fn, mode):
+            return (os.path.exists(fn) and os.access(fn, mode)
+                    and not os.path.isdir(fn))
+
+        # If we're given a path with a directory part, look it up directly rather
+        # than referring to PATH directories. This includes checking relative to the
+        # current directory, e.g. ./script
+        if os.path.dirname(cmd):
+            if _access_check(cmd, mode):
+                return cmd
+            return None
+
+        if path is None:
+            path = os.environ.get("PATH", os.defpath)
+        if not path:
+            return None
+        path = path.split(os.pathsep)
+
+        if sys.platform == "win32":
+            # The current directory takes precedence on Windows.
+            if not os.curdir in path:
+                path.insert(0, os.curdir)
+
+            # PATHEXT is necessary to check on Windows.
+            pathext = os.environ.get("PATHEXT", "").split(os.pathsep)
+            # See if the given file matches any of the expected path extensions.
+            # This will allow us to short circuit when given "python.exe".
+            # If it does match, only test that one, otherwise we have to try
+            # others.
+            if any(cmd.lower().endswith(ext.lower()) for ext in pathext):
+                files = [cmd]
+            else:
+                files = [cmd + ext for ext in pathext]
+        else:
+            # On other platforms you don't have things like PATHEXT to tell you
+            # what file suffixes are executable, so just pass on cmd as-is.
+            files = [cmd]
+
+        seen = set()
+        for dir in path:
+            normdir = os.path.normcase(dir)
+            if not normdir in seen:
+                seen.add(normdir)
+                for thefile in files:
+                    name = os.path.join(dir, thefile)
+                    if _access_check(name, mode):
+                        return name
+        return None
+
+
+# ZipFile is a context manager in 2.7, but not in 2.6
+
+from zipfile import ZipFile as BaseZipFile
+
+if hasattr(BaseZipFile, '__enter__'):  # pragma: no cover
+    ZipFile = BaseZipFile
+else:
+    from zipfile import ZipExtFile as BaseZipExtFile
+
+    class ZipExtFile(BaseZipExtFile):
+        def __init__(self, base):
+            self.__dict__.update(base.__dict__)
+
+        def __enter__(self):
+            return self
+
+        def __exit__(self, *exc_info):
+            self.close()
+            # return None, so if an exception occurred, it will propagate
+
+    class ZipFile(BaseZipFile):
+        def __enter__(self):
+            return self
+
+        def __exit__(self, *exc_info):
+            self.close()
+            # return None, so if an exception occurred, it will propagate
+
+        def open(self, *args, **kwargs):
+            base = BaseZipFile.open(self, *args, **kwargs)
+            return ZipExtFile(base)
+
+try:
+    from platform import python_implementation
+except ImportError: # pragma: no cover
+    def python_implementation():
+        """Return a string identifying the Python implementation."""
+        if 'PyPy' in sys.version:
+            return 'PyPy'
+        if os.name == 'java':
+            return 'Jython'
+        if sys.version.startswith('IronPython'):
+            return 'IronPython'
+        return 'CPython'
+
+try:
+    import sysconfig
+except ImportError: # pragma: no cover
+    from ._backport import sysconfig
+
+try:
+    callable = callable
+except NameError:   # pragma: no cover
+    from collections import Callable
+
+    def callable(obj):
+        return isinstance(obj, Callable)
+
+
+try:
+    fsencode = os.fsencode
+    fsdecode = os.fsdecode
+except AttributeError:  # pragma: no cover
+    _fsencoding = sys.getfilesystemencoding()
+    if _fsencoding == 'mbcs':
+        _fserrors = 'strict'
+    else:
+        _fserrors = 'surrogateescape'
+
+    def fsencode(filename):
+        if isinstance(filename, bytes):
+            return filename
+        elif isinstance(filename, text_type):
+            return filename.encode(_fsencoding, _fserrors)
+        else:
+            raise TypeError("expect bytes or str, not %s" %
+                            type(filename).__name__)
+
+    def fsdecode(filename):
+        if isinstance(filename, text_type):
+            return filename
+        elif isinstance(filename, bytes):
+            return filename.decode(_fsencoding, _fserrors)
+        else:
+            raise TypeError("expect bytes or str, not %s" %
+                            type(filename).__name__)
+
+try:
+    from tokenize import detect_encoding
+except ImportError: # pragma: no cover
+    from codecs import BOM_UTF8, lookup
+    import re
+
+    cookie_re = re.compile("coding[:=]\s*([-\w.]+)")
+
+    def _get_normal_name(orig_enc):
+        """Imitates get_normal_name in tokenizer.c."""
+        # Only care about the first 12 characters.
+        enc = orig_enc[:12].lower().replace("_", "-")
+        if enc == "utf-8" or enc.startswith("utf-8-"):
+            return "utf-8"
+        if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \
+           enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")):
+            return "iso-8859-1"
+        return orig_enc
+
+    def detect_encoding(readline):
+        """
+        The detect_encoding() function is used to detect the encoding that should
+        be used to decode a Python source file.  It requires one argument, readline,
+        in the same way as the tokenize() generator.
+
+        It will call readline a maximum of twice, and return the encoding used
+        (as a string) and a list of any lines (left as bytes) it has read in.
+
+        It detects the encoding from the presence of a utf-8 bom or an encoding
+        cookie as specified in pep-0263.  If both a bom and a cookie are present,
+        but disagree, a SyntaxError will be raised.  If the encoding cookie is an
+        invalid charset, raise a SyntaxError.  Note that if a utf-8 bom is found,
+        'utf-8-sig' is returned.
+
+        If no encoding is specified, then the default of 'utf-8' will be returned.
+        """
+        try:
+            filename = readline.__self__.name
+        except AttributeError:
+            filename = None
+        bom_found = False
+        encoding = None
+        default = 'utf-8'
+        def read_or_stop():
+            try:
+                return readline()
+            except StopIteration:
+                return b''
+
+        def find_cookie(line):
+            try:
+                # Decode as UTF-8. Either the line is an encoding declaration,
+                # in which case it should be pure ASCII, or it must be UTF-8
+                # per default encoding.
+                line_string = line.decode('utf-8')
+            except UnicodeDecodeError:
+                msg = "invalid or missing encoding declaration"
+                if filename is not None:
+                    msg = '{} for {!r}'.format(msg, filename)
+                raise SyntaxError(msg)
+
+            matches = cookie_re.findall(line_string)
+            if not matches:
+                return None
+            encoding = _get_normal_name(matches[0])
+            try:
+                codec = lookup(encoding)
+            except LookupError:
+                # This behaviour mimics the Python interpreter
+                if filename is None:
+                    msg = "unknown encoding: " + encoding
+                else:
+                    msg = "unknown encoding for {!r}: {}".format(filename,
+                            encoding)
+                raise SyntaxError(msg)
+
+            if bom_found:
+                if codec.name != 'utf-8':
+                    # This behaviour mimics the Python interpreter
+                    if filename is None:
+                        msg = 'encoding problem: utf-8'
+                    else:
+                        msg = 'encoding problem for {!r}: utf-8'.format(filename)
+                    raise SyntaxError(msg)
+                encoding += '-sig'
+            return encoding
+
+        first = read_or_stop()
+        if first.startswith(BOM_UTF8):
+            bom_found = True
+            first = first[3:]
+            default = 'utf-8-sig'
+        if not first:
+            return default, []
+
+        encoding = find_cookie(first)
+        if encoding:
+            return encoding, [first]
+
+        second = read_or_stop()
+        if not second:
+            return default, [first]
+
+        encoding = find_cookie(second)
+        if encoding:
+            return encoding, [first, second]
+
+        return default, [first, second]
+
+# For converting & <-> &amp; etc.
+try:
+    from html import escape
+except ImportError:
+    from cgi import escape
+if sys.version_info[:2] < (3, 4):
+    unescape = HTMLParser().unescape
+else:
+    from html import unescape
+
+try:
+    from collections import ChainMap
+except ImportError: # pragma: no cover
+    from collections import MutableMapping
+
+    try:
+        from reprlib import recursive_repr as _recursive_repr
+    except ImportError:
+        def _recursive_repr(fillvalue='...'):
+            '''
+            Decorator to make a repr function return fillvalue for a recursive
+            call
+            '''
+
+            def decorating_function(user_function):
+                repr_running = set()
+
+                def wrapper(self):
+                    key = id(self), get_ident()
+                    if key in repr_running:
+                        return fillvalue
+                    repr_running.add(key)
+                    try:
+                        result = user_function(self)
+                    finally:
+                        repr_running.discard(key)
+                    return result
+
+                # Can't use functools.wraps() here because of bootstrap issues
+                wrapper.__module__ = getattr(user_function, '__module__')
+                wrapper.__doc__ = getattr(user_function, '__doc__')
+                wrapper.__name__ = getattr(user_function, '__name__')
+                wrapper.__annotations__ = getattr(user_function, '__annotations__', {})
+                return wrapper
+
+            return decorating_function
+
+    class ChainMap(MutableMapping):
+        ''' A ChainMap groups multiple dicts (or other mappings) together
+        to create a single, updateable view.
+
+        The underlying mappings are stored in a list.  That list is public and can
+        accessed or updated using the *maps* attribute.  There is no other state.
+
+        Lookups search the underlying mappings successively until a key is found.
+        In contrast, writes, updates, and deletions only operate on the first
+        mapping.
+
+        '''
+
+        def __init__(self, *maps):
+            '''Initialize a ChainMap by setting *maps* to the given mappings.
+            If no mappings are provided, a single empty dictionary is used.
+
+            '''
+            self.maps = list(maps) or [{}]          # always at least one map
+
+        def __missing__(self, key):
+            raise KeyError(key)
+
+        def __getitem__(self, key):
+            for mapping in self.maps:
+                try:
+                    return mapping[key]             # can't use 'key in mapping' with defaultdict
+                except KeyError:
+                    pass
+            return self.__missing__(key)            # support subclasses that define __missing__
+
+        def get(self, key, default=None):
+            return self[key] if key in self else default
+
+        def __len__(self):
+            return len(set().union(*self.maps))     # reuses stored hash values if possible
+
+        def __iter__(self):
+            return iter(set().union(*self.maps))
+
+        def __contains__(self, key):
+            return any(key in m for m in self.maps)
+
+        def __bool__(self):
+            return any(self.maps)
+
+        @_recursive_repr()
+        def __repr__(self):
+            return '{0.__class__.__name__}({1})'.format(
+                self, ', '.join(map(repr, self.maps)))
+
+        @classmethod
+        def fromkeys(cls, iterable, *args):
+            'Create a ChainMap with a single dict created from the iterable.'
+            return cls(dict.fromkeys(iterable, *args))
+
+        def copy(self):
+            'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]'
+            return self.__class__(self.maps[0].copy(), *self.maps[1:])
+
+        __copy__ = copy
+
+        def new_child(self):                        # like Django's Context.push()
+            'New ChainMap with a new dict followed by all previous maps.'
+            return self.__class__({}, *self.maps)
+
+        @property
+        def parents(self):                          # like Django's Context.pop()
+            'New ChainMap from maps[1:].'
+            return self.__class__(*self.maps[1:])
+
+        def __setitem__(self, key, value):
+            self.maps[0][key] = value
+
+        def __delitem__(self, key):
+            try:
+                del self.maps[0][key]
+            except KeyError:
+                raise KeyError('Key not found in the first mapping: {!r}'.format(key))
+
+        def popitem(self):
+            'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.'
+            try:
+                return self.maps[0].popitem()
+            except KeyError:
+                raise KeyError('No keys found in the first mapping.')
+
+        def pop(self, key, *args):
+            'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].'
+            try:
+                return self.maps[0].pop(key, *args)
+            except KeyError:
+                raise KeyError('Key not found in the first mapping: {!r}'.format(key))
+
+        def clear(self):
+            'Clear maps[0], leaving maps[1:] intact.'
+            self.maps[0].clear()
+
+try:
+    from imp import cache_from_source
+except ImportError: # pragma: no cover
+    def cache_from_source(path, debug_override=None):
+        assert path.endswith('.py')
+        if debug_override is None:
+            debug_override = __debug__
+        if debug_override:
+            suffix = 'c'
+        else:
+            suffix = 'o'
+        return path + suffix
+
+try:
+    from collections import OrderedDict
+except ImportError: # pragma: no cover
+## {{{ http://code.activestate.com/recipes/576693/ (r9)
+# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy.
+# Passes Python2.7's test suite and incorporates all the latest updates.
+    try:
+        from thread import get_ident as _get_ident
+    except ImportError:
+        from dummy_thread import get_ident as _get_ident
+
+    try:
+        from _abcoll import KeysView, ValuesView, ItemsView
+    except ImportError:
+        pass
+
+
+    class OrderedDict(dict):
+        'Dictionary that remembers insertion order'
+        # An inherited dict maps keys to values.
+        # The inherited dict provides __getitem__, __len__, __contains__, and get.
+        # The remaining methods are order-aware.
+        # Big-O running times for all methods are the same as for regular dictionaries.
+
+        # The internal self.__map dictionary maps keys to links in a doubly linked list.
+        # The circular doubly linked list starts and ends with a sentinel element.
+        # The sentinel element never gets deleted (this simplifies the algorithm).
+        # Each link is stored as a list of length three:  [PREV, NEXT, KEY].
+
+        def __init__(self, *args, **kwds):
+            '''Initialize an ordered dictionary.  Signature is the same as for
+            regular dictionaries, but keyword arguments are not recommended
+            because their insertion order is arbitrary.
+
+            '''
+            if len(args) > 1:
+                raise TypeError('expected at most 1 arguments, got %d' % len(args))
+            try:
+                self.__root
+            except AttributeError:
+                self.__root = root = []                     # sentinel node
+                root[:] = [root, root, None]
+                self.__map = {}
+            self.__update(*args, **kwds)
+
+        def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
+            'od.__setitem__(i, y) <==> od[i]=y'
+            # Setting a new item creates a new link which goes at the end of the linked
+            # list, and the inherited dictionary is updated with the new key/value pair.
+            if key not in self:
+                root = self.__root
+                last = root[0]
+                last[1] = root[0] = self.__map[key] = [last, root, key]
+            dict_setitem(self, key, value)
+
+        def __delitem__(self, key, dict_delitem=dict.__delitem__):
+            'od.__delitem__(y) <==> del od[y]'
+            # Deleting an existing item uses self.__map to find the link which is
+            # then removed by updating the links in the predecessor and successor nodes.
+            dict_delitem(self, key)
+            link_prev, link_next, key = self.__map.pop(key)
+            link_prev[1] = link_next
+            link_next[0] = link_prev
+
+        def __iter__(self):
+            'od.__iter__() <==> iter(od)'
+            root = self.__root
+            curr = root[1]
+            while curr is not root:
+                yield curr[2]
+                curr = curr[1]
+
+        def __reversed__(self):
+            'od.__reversed__() <==> reversed(od)'
+            root = self.__root
+            curr = root[0]
+            while curr is not root:
+                yield curr[2]
+                curr = curr[0]
+
+        def clear(self):
+            'od.clear() -> None.  Remove all items from od.'
+            try:
+                for node in self.__map.itervalues():
+                    del node[:]
+                root = self.__root
+                root[:] = [root, root, None]
+                self.__map.clear()
+            except AttributeError:
+                pass
+            dict.clear(self)
+
+        def popitem(self, last=True):
+            '''od.popitem() -> (k, v), return and remove a (key, value) pair.
+            Pairs are returned in LIFO order if last is true or FIFO order if false.
+
+            '''
+            if not self:
+                raise KeyError('dictionary is empty')
+            root = self.__root
+            if last:
+                link = root[0]
+                link_prev = link[0]
+                link_prev[1] = root
+                root[0] = link_prev
+            else:
+                link = root[1]
+                link_next = link[1]
+                root[1] = link_next
+                link_next[0] = root
+            key = link[2]
+            del self.__map[key]
+            value = dict.pop(self, key)
+            return key, value
+
+        # -- the following methods do not depend on the internal structure --
+
+        def keys(self):
+            'od.keys() -> list of keys in od'
+            return list(self)
+
+        def values(self):
+            'od.values() -> list of values in od'
+            return [self[key] for key in self]
+
+        def items(self):
+            'od.items() -> list of (key, value) pairs in od'
+            return [(key, self[key]) for key in self]
+
+        def iterkeys(self):
+            'od.iterkeys() -> an iterator over the keys in od'
+            return iter(self)
+
+        def itervalues(self):
+            'od.itervalues -> an iterator over the values in od'
+            for k in self:
+                yield self[k]
+
+        def iteritems(self):
+            'od.iteritems -> an iterator over the (key, value) items in od'
+            for k in self:
+                yield (k, self[k])
+
+        def update(*args, **kwds):
+            '''od.update(E, **F) -> None.  Update od from dict/iterable E and F.
+
+            If E is a dict instance, does:           for k in E: od[k] = E[k]
+            If E has a .keys() method, does:         for k in E.keys(): od[k] = E[k]
+            Or if E is an iterable of items, does:   for k, v in E: od[k] = v
+            In either case, this is followed by:     for k, v in F.items(): od[k] = v
+
+            '''
+            if len(args) > 2:
+                raise TypeError('update() takes at most 2 positional '
+                                'arguments (%d given)' % (len(args),))
+            elif not args:
+                raise TypeError('update() takes at least 1 argument (0 given)')
+            self = args[0]
+            # Make progressively weaker assumptions about "other"
+            other = ()
+            if len(args) == 2:
+                other = args[1]
+            if isinstance(other, dict):
+                for key in other:
+                    self[key] = other[key]
+            elif hasattr(other, 'keys'):
+                for key in other.keys():
+                    self[key] = other[key]
+            else:
+                for key, value in other:
+                    self[key] = value
+            for key, value in kwds.items():
+                self[key] = value
+
+        __update = update  # let subclasses override update without breaking __init__
+
+        __marker = object()
+
+        def pop(self, key, default=__marker):
+            '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value.
+            If key is not found, d is returned if given, otherwise KeyError is raised.
+
+            '''
+            if key in self:
+                result = self[key]
+                del self[key]
+                return result
+            if default is self.__marker:
+                raise KeyError(key)
+            return default
+
+        def setdefault(self, key, default=None):
+            'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'
+            if key in self:
+                return self[key]
+            self[key] = default
+            return default
+
+        def __repr__(self, _repr_running=None):
+            'od.__repr__() <==> repr(od)'
+            if not _repr_running: _repr_running = {}
+            call_key = id(self), _get_ident()
+            if call_key in _repr_running:
+                return '...'
+            _repr_running[call_key] = 1
+            try:
+                if not self:
+                    return '%s()' % (self.__class__.__name__,)
+                return '%s(%r)' % (self.__class__.__name__, self.items())
+            finally:
+                del _repr_running[call_key]
+
+        def __reduce__(self):
+            'Return state information for pickling'
+            items = [[k, self[k]] for k in self]
+            inst_dict = vars(self).copy()
+            for k in vars(OrderedDict()):
+                inst_dict.pop(k, None)
+            if inst_dict:
+                return (self.__class__, (items,), inst_dict)
+            return self.__class__, (items,)
+
+        def copy(self):
+            'od.copy() -> a shallow copy of od'
+            return self.__class__(self)
+
+        @classmethod
+        def fromkeys(cls, iterable, value=None):
+            '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
+            and values equal to v (which defaults to None).
+
+            '''
+            d = cls()
+            for key in iterable:
+                d[key] = value
+            return d
+
+        def __eq__(self, other):
+            '''od.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
+            while comparison to a regular mapping is order-insensitive.
+
+            '''
+            if isinstance(other, OrderedDict):
+                return len(self)==len(other) and self.items() == other.items()
+            return dict.__eq__(self, other)
+
+        def __ne__(self, other):
+            return not self == other
+
+        # -- the following methods are only used in Python 2.7 --
+
+        def viewkeys(self):
+            "od.viewkeys() -> a set-like object providing a view on od's keys"
+            return KeysView(self)
+
+        def viewvalues(self):
+            "od.viewvalues() -> an object providing a view on od's values"
+            return ValuesView(self)
+
+        def viewitems(self):
+            "od.viewitems() -> a set-like object providing a view on od's items"
+            return ItemsView(self)
+
+try:
+    from logging.config import BaseConfigurator, valid_ident
+except ImportError: # pragma: no cover
+    IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I)
+
+
+    def valid_ident(s):
+        m = IDENTIFIER.match(s)
+        if not m:
+            raise ValueError('Not a valid Python identifier: %r' % s)
+        return True
+
+
+    # The ConvertingXXX classes are wrappers around standard Python containers,
+    # and they serve to convert any suitable values in the container. The
+    # conversion converts base dicts, lists and tuples to their wrapped
+    # equivalents, whereas strings which match a conversion format are converted
+    # appropriately.
+    #
+    # Each wrapper should have a configurator attribute holding the actual
+    # configurator to use for conversion.
+
+    class ConvertingDict(dict):
+        """A converting dictionary wrapper."""
+
+        def __getitem__(self, key):
+            value = dict.__getitem__(self, key)
+            result = self.configurator.convert(value)
+            #If the converted value is different, save for next time
+            if value is not result:
+                self[key] = result
+                if type(result) in (ConvertingDict, ConvertingList,
+                                    ConvertingTuple):
+                    result.parent = self
+                    result.key = key
+            return result
+
+        def get(self, key, default=None):
+            value = dict.get(self, key, default)
+            result = self.configurator.convert(value)
+            #If the converted value is different, save for next time
+            if value is not result:
+                self[key] = result
+                if type(result) in (ConvertingDict, ConvertingList,
+                                    ConvertingTuple):
+                    result.parent = self
+                    result.key = key
+            return result
+
+    def pop(self, key, default=None):
+        value = dict.pop(self, key, default)
+        result = self.configurator.convert(value)
+        if value is not result:
+            if type(result) in (ConvertingDict, ConvertingList,
+                                ConvertingTuple):
+                result.parent = self
+                result.key = key
+        return result
+
+    class ConvertingList(list):
+        """A converting list wrapper."""
+        def __getitem__(self, key):
+            value = list.__getitem__(self, key)
+            result = self.configurator.convert(value)
+            #If the converted value is different, save for next time
+            if value is not result:
+                self[key] = result
+                if type(result) in (ConvertingDict, ConvertingList,
+                                    ConvertingTuple):
+                    result.parent = self
+                    result.key = key
+            return result
+
+        def pop(self, idx=-1):
+            value = list.pop(self, idx)
+            result = self.configurator.convert(value)
+            if value is not result:
+                if type(result) in (ConvertingDict, ConvertingList,
+                                    ConvertingTuple):
+                    result.parent = self
+            return result
+
+    class ConvertingTuple(tuple):
+        """A converting tuple wrapper."""
+        def __getitem__(self, key):
+            value = tuple.__getitem__(self, key)
+            result = self.configurator.convert(value)
+            if value is not result:
+                if type(result) in (ConvertingDict, ConvertingList,
+                                    ConvertingTuple):
+                    result.parent = self
+                    result.key = key
+            return result
+
+    class BaseConfigurator(object):
+        """
+        The configurator base class which defines some useful defaults.
+        """
+
+        CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$')
+
+        WORD_PATTERN = re.compile(r'^\s*(\w+)\s*')
+        DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*')
+        INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*')
+        DIGIT_PATTERN = re.compile(r'^\d+$')
+
+        value_converters = {
+            'ext' : 'ext_convert',
+            'cfg' : 'cfg_convert',
+        }
+
+        # We might want to use a different one, e.g. importlib
+        importer = staticmethod(__import__)
+
+        def __init__(self, config):
+            self.config = ConvertingDict(config)
+            self.config.configurator = self
+
+        def resolve(self, s):
+            """
+            Resolve strings to objects using standard import and attribute
+            syntax.
+            """
+            name = s.split('.')
+            used = name.pop(0)
+            try:
+                found = self.importer(used)
+                for frag in name:
+                    used += '.' + frag
+                    try:
+                        found = getattr(found, frag)
+                    except AttributeError:
+                        self.importer(used)
+                        found = getattr(found, frag)
+                return found
+            except ImportError:
+                e, tb = sys.exc_info()[1:]
+                v = ValueError('Cannot resolve %r: %s' % (s, e))
+                v.__cause__, v.__traceback__ = e, tb
+                raise v
+
+        def ext_convert(self, value):
+            """Default converter for the ext:// protocol."""
+            return self.resolve(value)
+
+        def cfg_convert(self, value):
+            """Default converter for the cfg:// protocol."""
+            rest = value
+            m = self.WORD_PATTERN.match(rest)
+            if m is None:
+                raise ValueError("Unable to convert %r" % value)
+            else:
+                rest = rest[m.end():]
+                d = self.config[m.groups()[0]]
+                #print d, rest
+                while rest:
+                    m = self.DOT_PATTERN.match(rest)
+                    if m:
+                        d = d[m.groups()[0]]
+                    else:
+                        m = self.INDEX_PATTERN.match(rest)
+                        if m:
+                            idx = m.groups()[0]
+                            if not self.DIGIT_PATTERN.match(idx):
+                                d = d[idx]
+                            else:
+                                try:
+                                    n = int(idx) # try as number first (most likely)
+                                    d = d[n]
+                                except TypeError:
+                                    d = d[idx]
+                    if m:
+                        rest = rest[m.end():]
+                    else:
+                        raise ValueError('Unable to convert '
+                                         '%r at %r' % (value, rest))
+            #rest should be empty
+            return d
+
+        def convert(self, value):
+            """
+            Convert values to an appropriate type. dicts, lists and tuples are
+            replaced by their converting alternatives. Strings are checked to
+            see if they have a conversion format and are converted if they do.
+            """
+            if not isinstance(value, ConvertingDict) and isinstance(value, dict):
+                value = ConvertingDict(value)
+                value.configurator = self
+            elif not isinstance(value, ConvertingList) and isinstance(value, list):
+                value = ConvertingList(value)
+                value.configurator = self
+            elif not isinstance(value, ConvertingTuple) and\
+                     isinstance(value, tuple):
+                value = ConvertingTuple(value)
+                value.configurator = self
+            elif isinstance(value, string_types):
+                m = self.CONVERT_PATTERN.match(value)
+                if m:
+                    d = m.groupdict()
+                    prefix = d['prefix']
+                    converter = self.value_converters.get(prefix, None)
+                    if converter:
+                        suffix = d['suffix']
+                        converter = getattr(self, converter)
+                        value = converter(suffix)
+            return value
+
+        def configure_custom(self, config):
+            """Configure an object with a user-supplied factory."""
+            c = config.pop('()')
+            if not callable(c):
+                c = self.resolve(c)
+            props = config.pop('.', None)
+            # Check for valid identifiers
+            kwargs = dict([(k, config[k]) for k in config if valid_ident(k)])
+            result = c(**kwargs)
+            if props:
+                for name, value in props.items():
+                    setattr(result, name, value)
+            return result
+
+        def as_tuple(self, value):
+            """Utility function which converts lists to tuples."""
+            if isinstance(value, list):
+                value = tuple(value)
+            return value
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/database.py b/vendor/pip-9.0.3/pip/_vendor/distlib/database.py
new file mode 100644
index 0000000000000000000000000000000000000000..c31442640894a3170990a31101e1df1c225a872d
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/database.py
@@ -0,0 +1,1312 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012-2016 The Python Software Foundation.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+"""PEP 376 implementation."""
+
+from __future__ import unicode_literals
+
+import base64
+import codecs
+import contextlib
+import hashlib
+import logging
+import os
+import posixpath
+import sys
+import zipimport
+
+from . import DistlibException, resources
+from .compat import StringIO
+from .version import get_scheme, UnsupportedVersionError
+from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME
+from .util import (parse_requirement, cached_property, parse_name_and_version,
+                   read_exports, write_exports, CSVReader, CSVWriter)
+
+
+__all__ = ['Distribution', 'BaseInstalledDistribution',
+           'InstalledDistribution', 'EggInfoDistribution',
+           'DistributionPath']
+
+
+logger = logging.getLogger(__name__)
+
+EXPORTS_FILENAME = 'pydist-exports.json'
+COMMANDS_FILENAME = 'pydist-commands.json'
+
+DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED',
+              'RESOURCES', EXPORTS_FILENAME, 'SHARED')
+
+DISTINFO_EXT = '.dist-info'
+
+
+class _Cache(object):
+    """
+    A simple cache mapping names and .dist-info paths to distributions
+    """
+    def __init__(self):
+        """
+        Initialise an instance. There is normally one for each DistributionPath.
+        """
+        self.name = {}
+        self.path = {}
+        self.generated = False
+
+    def clear(self):
+        """
+        Clear the cache, setting it to its initial state.
+        """
+        self.name.clear()
+        self.path.clear()
+        self.generated = False
+
+    def add(self, dist):
+        """
+        Add a distribution to the cache.
+        :param dist: The distribution to add.
+        """
+        if dist.path not in self.path:
+            self.path[dist.path] = dist
+            self.name.setdefault(dist.key, []).append(dist)
+
+
+class DistributionPath(object):
+    """
+    Represents a set of distributions installed on a path (typically sys.path).
+    """
+    def __init__(self, path=None, include_egg=False):
+        """
+        Create an instance from a path, optionally including legacy (distutils/
+        setuptools/distribute) distributions.
+        :param path: The path to use, as a list of directories. If not specified,
+                     sys.path is used.
+        :param include_egg: If True, this instance will look for and return legacy
+                            distributions as well as those based on PEP 376.
+        """
+        if path is None:
+            path = sys.path
+        self.path = path
+        self._include_dist = True
+        self._include_egg = include_egg
+
+        self._cache = _Cache()
+        self._cache_egg = _Cache()
+        self._cache_enabled = True
+        self._scheme = get_scheme('default')
+
+    def _get_cache_enabled(self):
+        return self._cache_enabled
+
+    def _set_cache_enabled(self, value):
+        self._cache_enabled = value
+
+    cache_enabled = property(_get_cache_enabled, _set_cache_enabled)
+
+    def clear_cache(self):
+        """
+        Clears the internal cache.
+        """
+        self._cache.clear()
+        self._cache_egg.clear()
+
+
+    def _yield_distributions(self):
+        """
+        Yield .dist-info and/or .egg(-info) distributions.
+        """
+        # We need to check if we've seen some resources already, because on
+        # some Linux systems (e.g. some Debian/Ubuntu variants) there are
+        # symlinks which alias other files in the environment.
+        seen = set()
+        for path in self.path:
+            finder = resources.finder_for_path(path)
+            if finder is None:
+                continue
+            r = finder.find('')
+            if not r or not r.is_container:
+                continue
+            rset = sorted(r.resources)
+            for entry in rset:
+                r = finder.find(entry)
+                if not r or r.path in seen:
+                    continue
+                if self._include_dist and entry.endswith(DISTINFO_EXT):
+                    possible_filenames = [METADATA_FILENAME, WHEEL_METADATA_FILENAME]
+                    for metadata_filename in possible_filenames:
+                        metadata_path = posixpath.join(entry, metadata_filename)
+                        pydist = finder.find(metadata_path)
+                        if pydist:
+                            break
+                    else:
+                        continue
+
+                    with contextlib.closing(pydist.as_stream()) as stream:
+                        metadata = Metadata(fileobj=stream, scheme='legacy')
+                    logger.debug('Found %s', r.path)
+                    seen.add(r.path)
+                    yield new_dist_class(r.path, metadata=metadata,
+                                         env=self)
+                elif self._include_egg and entry.endswith(('.egg-info',
+                                                          '.egg')):
+                    logger.debug('Found %s', r.path)
+                    seen.add(r.path)
+                    yield old_dist_class(r.path, self)
+
+    def _generate_cache(self):
+        """
+        Scan the path for distributions and populate the cache with
+        those that are found.
+        """
+        gen_dist = not self._cache.generated
+        gen_egg = self._include_egg and not self._cache_egg.generated
+        if gen_dist or gen_egg:
+            for dist in self._yield_distributions():
+                if isinstance(dist, InstalledDistribution):
+                    self._cache.add(dist)
+                else:
+                    self._cache_egg.add(dist)
+
+            if gen_dist:
+                self._cache.generated = True
+            if gen_egg:
+                self._cache_egg.generated = True
+
+    @classmethod
+    def distinfo_dirname(cls, name, version):
+        """
+        The *name* and *version* parameters are converted into their
+        filename-escaped form, i.e. any ``'-'`` characters are replaced
+        with ``'_'`` other than the one in ``'dist-info'`` and the one
+        separating the name from the version number.
+
+        :parameter name: is converted to a standard distribution name by replacing
+                         any runs of non- alphanumeric characters with a single
+                         ``'-'``.
+        :type name: string
+        :parameter version: is converted to a standard version string. Spaces
+                            become dots, and all other non-alphanumeric characters
+                            (except dots) become dashes, with runs of multiple
+                            dashes condensed to a single dash.
+        :type version: string
+        :returns: directory name
+        :rtype: string"""
+        name = name.replace('-', '_')
+        return '-'.join([name, version]) + DISTINFO_EXT
+
+    def get_distributions(self):
+        """
+        Provides an iterator that looks for distributions and returns
+        :class:`InstalledDistribution` or
+        :class:`EggInfoDistribution` instances for each one of them.
+
+        :rtype: iterator of :class:`InstalledDistribution` and
+                :class:`EggInfoDistribution` instances
+        """
+        if not self._cache_enabled:
+            for dist in self._yield_distributions():
+                yield dist
+        else:
+            self._generate_cache()
+
+            for dist in self._cache.path.values():
+                yield dist
+
+            if self._include_egg:
+                for dist in self._cache_egg.path.values():
+                    yield dist
+
+    def get_distribution(self, name):
+        """
+        Looks for a named distribution on the path.
+
+        This function only returns the first result found, as no more than one
+        value is expected. If nothing is found, ``None`` is returned.
+
+        :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution`
+                or ``None``
+        """
+        result = None
+        name = name.lower()
+        if not self._cache_enabled:
+            for dist in self._yield_distributions():
+                if dist.key == name:
+                    result = dist
+                    break
+        else:
+            self._generate_cache()
+
+            if name in self._cache.name:
+                result = self._cache.name[name][0]
+            elif self._include_egg and name in self._cache_egg.name:
+                result = self._cache_egg.name[name][0]
+        return result
+
+    def provides_distribution(self, name, version=None):
+        """
+        Iterates over all distributions to find which distributions provide *name*.
+        If a *version* is provided, it will be used to filter the results.
+
+        This function only returns the first result found, since no more than
+        one values are expected. If the directory is not found, returns ``None``.
+
+        :parameter version: a version specifier that indicates the version
+                            required, conforming to the format in ``PEP-345``
+
+        :type name: string
+        :type version: string
+        """
+        matcher = None
+        if not version is None:
+            try:
+                matcher = self._scheme.matcher('%s (%s)' % (name, version))
+            except ValueError:
+                raise DistlibException('invalid name or version: %r, %r' %
+                                      (name, version))
+
+        for dist in self.get_distributions():
+            provided = dist.provides
+
+            for p in provided:
+                p_name, p_ver = parse_name_and_version(p)
+                if matcher is None:
+                    if p_name == name:
+                        yield dist
+                        break
+                else:
+                    if p_name == name and matcher.match(p_ver):
+                        yield dist
+                        break
+
+    def get_file_path(self, name, relative_path):
+        """
+        Return the path to a resource file.
+        """
+        dist = self.get_distribution(name)
+        if dist is None:
+            raise LookupError('no distribution named %r found' % name)
+        return dist.get_resource_path(relative_path)
+
+    def get_exported_entries(self, category, name=None):
+        """
+        Return all of the exported entries in a particular category.
+
+        :param category: The category to search for entries.
+        :param name: If specified, only entries with that name are returned.
+        """
+        for dist in self.get_distributions():
+            r = dist.exports
+            if category in r:
+                d = r[category]
+                if name is not None:
+                    if name in d:
+                        yield d[name]
+                else:
+                    for v in d.values():
+                        yield v
+
+
+class Distribution(object):
+    """
+    A base class for distributions, whether installed or from indexes.
+    Either way, it must have some metadata, so that's all that's needed
+    for construction.
+    """
+
+    build_time_dependency = False
+    """
+    Set to True if it's known to be only a build-time dependency (i.e.
+    not needed after installation).
+    """
+
+    requested = False
+    """A boolean that indicates whether the ``REQUESTED`` metadata file is
+    present (in other words, whether the package was installed by user
+    request or it was installed as a dependency)."""
+
+    def __init__(self, metadata):
+        """
+        Initialise an instance.
+        :param metadata: The instance of :class:`Metadata` describing this
+        distribution.
+        """
+        self.metadata = metadata
+        self.name = metadata.name
+        self.key = self.name.lower()    # for case-insensitive comparisons
+        self.version = metadata.version
+        self.locator = None
+        self.digest = None
+        self.extras = None      # additional features requested
+        self.context = None     # environment marker overrides
+        self.download_urls = set()
+        self.digests = {}
+
+    @property
+    def source_url(self):
+        """
+        The source archive download URL for this distribution.
+        """
+        return self.metadata.source_url
+
+    download_url = source_url   # Backward compatibility
+
+    @property
+    def name_and_version(self):
+        """
+        A utility property which displays the name and version in parentheses.
+        """
+        return '%s (%s)' % (self.name, self.version)
+
+    @property
+    def provides(self):
+        """
+        A set of distribution names and versions provided by this distribution.
+        :return: A set of "name (version)" strings.
+        """
+        plist = self.metadata.provides
+        s = '%s (%s)' % (self.name, self.version)
+        if s not in plist:
+            plist.append(s)
+        return plist
+
+    def _get_requirements(self, req_attr):
+        md = self.metadata
+        logger.debug('Getting requirements from metadata %r', md.todict())
+        reqts = getattr(md, req_attr)
+        return set(md.get_requirements(reqts, extras=self.extras,
+                                       env=self.context))
+
+    @property
+    def run_requires(self):
+        return self._get_requirements('run_requires')
+
+    @property
+    def meta_requires(self):
+        return self._get_requirements('meta_requires')
+
+    @property
+    def build_requires(self):
+        return self._get_requirements('build_requires')
+
+    @property
+    def test_requires(self):
+        return self._get_requirements('test_requires')
+
+    @property
+    def dev_requires(self):
+        return self._get_requirements('dev_requires')
+
+    def matches_requirement(self, req):
+        """
+        Say if this instance matches (fulfills) a requirement.
+        :param req: The requirement to match.
+        :rtype req: str
+        :return: True if it matches, else False.
+        """
+        # Requirement may contain extras - parse to lose those
+        # from what's passed to the matcher
+        r = parse_requirement(req)
+        scheme = get_scheme(self.metadata.scheme)
+        try:
+            matcher = scheme.matcher(r.requirement)
+        except UnsupportedVersionError:
+            # XXX compat-mode if cannot read the version
+            logger.warning('could not read version %r - using name only',
+                           req)
+            name = req.split()[0]
+            matcher = scheme.matcher(name)
+
+        name = matcher.key   # case-insensitive
+
+        result = False
+        for p in self.provides:
+            p_name, p_ver = parse_name_and_version(p)
+            if p_name != name:
+                continue
+            try:
+                result = matcher.match(p_ver)
+                break
+            except UnsupportedVersionError:
+                pass
+        return result
+
+    def __repr__(self):
+        """
+        Return a textual representation of this instance,
+        """
+        if self.source_url:
+            suffix = ' [%s]' % self.source_url
+        else:
+            suffix = ''
+        return '<Distribution %s (%s)%s>' % (self.name, self.version, suffix)
+
+    def __eq__(self, other):
+        """
+        See if this distribution is the same as another.
+        :param other: The distribution to compare with. To be equal to one
+                      another. distributions must have the same type, name,
+                      version and source_url.
+        :return: True if it is the same, else False.
+        """
+        if type(other) is not type(self):
+            result = False
+        else:
+            result = (self.name == other.name and
+                      self.version == other.version and
+                      self.source_url == other.source_url)
+        return result
+
+    def __hash__(self):
+        """
+        Compute hash in a way which matches the equality test.
+        """
+        return hash(self.name) + hash(self.version) + hash(self.source_url)
+
+
+class BaseInstalledDistribution(Distribution):
+    """
+    This is the base class for installed distributions (whether PEP 376 or
+    legacy).
+    """
+
+    hasher = None
+
+    def __init__(self, metadata, path, env=None):
+        """
+        Initialise an instance.
+        :param metadata: An instance of :class:`Metadata` which describes the
+                         distribution. This will normally have been initialised
+                         from a metadata file in the ``path``.
+        :param path:     The path of the ``.dist-info`` or ``.egg-info``
+                         directory for the distribution.
+        :param env:      This is normally the :class:`DistributionPath`
+                         instance where this distribution was found.
+        """
+        super(BaseInstalledDistribution, self).__init__(metadata)
+        self.path = path
+        self.dist_path = env
+
+    def get_hash(self, data, hasher=None):
+        """
+        Get the hash of some data, using a particular hash algorithm, if
+        specified.
+
+        :param data: The data to be hashed.
+        :type data: bytes
+        :param hasher: The name of a hash implementation, supported by hashlib,
+                       or ``None``. Examples of valid values are ``'sha1'``,
+                       ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and
+                       ``'sha512'``. If no hasher is specified, the ``hasher``
+                       attribute of the :class:`InstalledDistribution` instance
+                       is used. If the hasher is determined to be ``None``, MD5
+                       is used as the hashing algorithm.
+        :returns: The hash of the data. If a hasher was explicitly specified,
+                  the returned hash will be prefixed with the specified hasher
+                  followed by '='.
+        :rtype: str
+        """
+        if hasher is None:
+            hasher = self.hasher
+        if hasher is None:
+            hasher = hashlib.md5
+            prefix = ''
+        else:
+            hasher = getattr(hashlib, hasher)
+            prefix = '%s=' % self.hasher
+        digest = hasher(data).digest()
+        digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii')
+        return '%s%s' % (prefix, digest)
+
+
+class InstalledDistribution(BaseInstalledDistribution):
+    """
+    Created with the *path* of the ``.dist-info`` directory provided to the
+    constructor. It reads the metadata contained in ``pydist.json`` when it is
+    instantiated., or uses a passed in Metadata instance (useful for when
+    dry-run mode is being used).
+    """
+
+    hasher = 'sha256'
+
+    def __init__(self, path, metadata=None, env=None):
+        self.finder = finder = resources.finder_for_path(path)
+        if finder is None:
+            import pdb; pdb.set_trace ()
+        if env and env._cache_enabled and path in env._cache.path:
+            metadata = env._cache.path[path].metadata
+        elif metadata is None:
+            r = finder.find(METADATA_FILENAME)
+            # Temporary - for Wheel 0.23 support
+            if r is None:
+                r = finder.find(WHEEL_METADATA_FILENAME)
+            # Temporary - for legacy support
+            if r is None:
+                r = finder.find('METADATA')
+            if r is None:
+                raise ValueError('no %s found in %s' % (METADATA_FILENAME,
+                                                        path))
+            with contextlib.closing(r.as_stream()) as stream:
+                metadata = Metadata(fileobj=stream, scheme='legacy')
+
+        super(InstalledDistribution, self).__init__(metadata, path, env)
+
+        if env and env._cache_enabled:
+            env._cache.add(self)
+
+        try:
+            r = finder.find('REQUESTED')
+        except AttributeError:
+            import pdb; pdb.set_trace ()
+        self.requested = r is not None
+
+    def __repr__(self):
+        return '<InstalledDistribution %r %s at %r>' % (
+            self.name, self.version, self.path)
+
+    def __str__(self):
+        return "%s %s" % (self.name, self.version)
+
+    def _get_records(self):
+        """
+        Get the list of installed files for the distribution
+        :return: A list of tuples of path, hash and size. Note that hash and
+                 size might be ``None`` for some entries. The path is exactly
+                 as stored in the file (which is as in PEP 376).
+        """
+        results = []
+        r = self.get_distinfo_resource('RECORD')
+        with contextlib.closing(r.as_stream()) as stream:
+            with CSVReader(stream=stream) as record_reader:
+                # Base location is parent dir of .dist-info dir
+                #base_location = os.path.dirname(self.path)
+                #base_location = os.path.abspath(base_location)
+                for row in record_reader:
+                    missing = [None for i in range(len(row), 3)]
+                    path, checksum, size = row + missing
+                    #if not os.path.isabs(path):
+                    #    path = path.replace('/', os.sep)
+                    #    path = os.path.join(base_location, path)
+                    results.append((path, checksum, size))
+        return results
+
+    @cached_property
+    def exports(self):
+        """
+        Return the information exported by this distribution.
+        :return: A dictionary of exports, mapping an export category to a dict
+                 of :class:`ExportEntry` instances describing the individual
+                 export entries, and keyed by name.
+        """
+        result = {}
+        r = self.get_distinfo_resource(EXPORTS_FILENAME)
+        if r:
+            result = self.read_exports()
+        return result
+
+    def read_exports(self):
+        """
+        Read exports data from a file in .ini format.
+
+        :return: A dictionary of exports, mapping an export category to a list
+                 of :class:`ExportEntry` instances describing the individual
+                 export entries.
+        """
+        result = {}
+        r = self.get_distinfo_resource(EXPORTS_FILENAME)
+        if r:
+            with contextlib.closing(r.as_stream()) as stream:
+                result = read_exports(stream)
+        return result
+
+    def write_exports(self, exports):
+        """
+        Write a dictionary of exports to a file in .ini format.
+        :param exports: A dictionary of exports, mapping an export category to
+                        a list of :class:`ExportEntry` instances describing the
+                        individual export entries.
+        """
+        rf = self.get_distinfo_file(EXPORTS_FILENAME)
+        with open(rf, 'w') as f:
+            write_exports(exports, f)
+
+    def get_resource_path(self, relative_path):
+        """
+        NOTE: This API may change in the future.
+
+        Return the absolute path to a resource file with the given relative
+        path.
+
+        :param relative_path: The path, relative to .dist-info, of the resource
+                              of interest.
+        :return: The absolute path where the resource is to be found.
+        """
+        r = self.get_distinfo_resource('RESOURCES')
+        with contextlib.closing(r.as_stream()) as stream:
+            with CSVReader(stream=stream) as resources_reader:
+                for relative, destination in resources_reader:
+                    if relative == relative_path:
+                        return destination
+        raise KeyError('no resource file with relative path %r '
+                       'is installed' % relative_path)
+
+    def list_installed_files(self):
+        """
+        Iterates over the ``RECORD`` entries and returns a tuple
+        ``(path, hash, size)`` for each line.
+
+        :returns: iterator of (path, hash, size)
+        """
+        for result in self._get_records():
+            yield result
+
+    def write_installed_files(self, paths, prefix, dry_run=False):
+        """
+        Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any
+        existing ``RECORD`` file is silently overwritten.
+
+        prefix is used to determine when to write absolute paths.
+        """
+        prefix = os.path.join(prefix, '')
+        base = os.path.dirname(self.path)
+        base_under_prefix = base.startswith(prefix)
+        base = os.path.join(base, '')
+        record_path = self.get_distinfo_file('RECORD')
+        logger.info('creating %s', record_path)
+        if dry_run:
+            return None
+        with CSVWriter(record_path) as writer:
+            for path in paths:
+                if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')):
+                    # do not put size and hash, as in PEP-376
+                    hash_value = size = ''
+                else:
+                    size = '%d' % os.path.getsize(path)
+                    with open(path, 'rb') as fp:
+                        hash_value = self.get_hash(fp.read())
+                if path.startswith(base) or (base_under_prefix and
+                                             path.startswith(prefix)):
+                    path = os.path.relpath(path, base)
+                writer.writerow((path, hash_value, size))
+
+            # add the RECORD file itself
+            if record_path.startswith(base):
+                record_path = os.path.relpath(record_path, base)
+            writer.writerow((record_path, '', ''))
+        return record_path
+
+    def check_installed_files(self):
+        """
+        Checks that the hashes and sizes of the files in ``RECORD`` are
+        matched by the files themselves. Returns a (possibly empty) list of
+        mismatches. Each entry in the mismatch list will be a tuple consisting
+        of the path, 'exists', 'size' or 'hash' according to what didn't match
+        (existence is checked first, then size, then hash), the expected
+        value and the actual value.
+        """
+        mismatches = []
+        base = os.path.dirname(self.path)
+        record_path = self.get_distinfo_file('RECORD')
+        for path, hash_value, size in self.list_installed_files():
+            if not os.path.isabs(path):
+                path = os.path.join(base, path)
+            if path == record_path:
+                continue
+            if not os.path.exists(path):
+                mismatches.append((path, 'exists', True, False))
+            elif os.path.isfile(path):
+                actual_size = str(os.path.getsize(path))
+                if size and actual_size != size:
+                    mismatches.append((path, 'size', size, actual_size))
+                elif hash_value:
+                    if '=' in hash_value:
+                        hasher = hash_value.split('=', 1)[0]
+                    else:
+                        hasher = None
+
+                    with open(path, 'rb') as f:
+                        actual_hash = self.get_hash(f.read(), hasher)
+                        if actual_hash != hash_value:
+                            mismatches.append((path, 'hash', hash_value, actual_hash))
+        return mismatches
+
+    @cached_property
+    def shared_locations(self):
+        """
+        A dictionary of shared locations whose keys are in the set 'prefix',
+        'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'.
+        The corresponding value is the absolute path of that category for
+        this distribution, and takes into account any paths selected by the
+        user at installation time (e.g. via command-line arguments). In the
+        case of the 'namespace' key, this would be a list of absolute paths
+        for the roots of namespace packages in this distribution.
+
+        The first time this property is accessed, the relevant information is
+        read from the SHARED file in the .dist-info directory.
+        """
+        result = {}
+        shared_path = os.path.join(self.path, 'SHARED')
+        if os.path.isfile(shared_path):
+            with codecs.open(shared_path, 'r', encoding='utf-8') as f:
+                lines = f.read().splitlines()
+            for line in lines:
+                key, value = line.split('=', 1)
+                if key == 'namespace':
+                    result.setdefault(key, []).append(value)
+                else:
+                    result[key] = value
+        return result
+
+    def write_shared_locations(self, paths, dry_run=False):
+        """
+        Write shared location information to the SHARED file in .dist-info.
+        :param paths: A dictionary as described in the documentation for
+        :meth:`shared_locations`.
+        :param dry_run: If True, the action is logged but no file is actually
+                        written.
+        :return: The path of the file written to.
+        """
+        shared_path = os.path.join(self.path, 'SHARED')
+        logger.info('creating %s', shared_path)
+        if dry_run:
+            return None
+        lines = []
+        for key in ('prefix', 'lib', 'headers', 'scripts', 'data'):
+            path = paths[key]
+            if os.path.isdir(paths[key]):
+                lines.append('%s=%s' % (key,  path))
+        for ns in paths.get('namespace', ()):
+            lines.append('namespace=%s' % ns)
+
+        with codecs.open(shared_path, 'w', encoding='utf-8') as f:
+            f.write('\n'.join(lines))
+        return shared_path
+
+    def get_distinfo_resource(self, path):
+        if path not in DIST_FILES:
+            raise DistlibException('invalid path for a dist-info file: '
+                                   '%r at %r' % (path, self.path))
+        finder = resources.finder_for_path(self.path)
+        if finder is None:
+            raise DistlibException('Unable to get a finder for %s' % self.path)
+        return finder.find(path)
+
+    def get_distinfo_file(self, path):
+        """
+        Returns a path located under the ``.dist-info`` directory. Returns a
+        string representing the path.
+
+        :parameter path: a ``'/'``-separated path relative to the
+                         ``.dist-info`` directory or an absolute path;
+                         If *path* is an absolute path and doesn't start
+                         with the ``.dist-info`` directory path,
+                         a :class:`DistlibException` is raised
+        :type path: str
+        :rtype: str
+        """
+        # Check if it is an absolute path  # XXX use relpath, add tests
+        if path.find(os.sep) >= 0:
+            # it's an absolute path?
+            distinfo_dirname, path = path.split(os.sep)[-2:]
+            if distinfo_dirname != self.path.split(os.sep)[-1]:
+                raise DistlibException(
+                    'dist-info file %r does not belong to the %r %s '
+                    'distribution' % (path, self.name, self.version))
+
+        # The file must be relative
+        if path not in DIST_FILES:
+            raise DistlibException('invalid path for a dist-info file: '
+                                   '%r at %r' % (path, self.path))
+
+        return os.path.join(self.path, path)
+
+    def list_distinfo_files(self):
+        """
+        Iterates over the ``RECORD`` entries and returns paths for each line if
+        the path is pointing to a file located in the ``.dist-info`` directory
+        or one of its subdirectories.
+
+        :returns: iterator of paths
+        """
+        base = os.path.dirname(self.path)
+        for path, checksum, size in self._get_records():
+            # XXX add separator or use real relpath algo
+            if not os.path.isabs(path):
+                path = os.path.join(base, path)
+            if path.startswith(self.path):
+                yield path
+
+    def __eq__(self, other):
+        return (isinstance(other, InstalledDistribution) and
+                self.path == other.path)
+
+    # See http://docs.python.org/reference/datamodel#object.__hash__
+    __hash__ = object.__hash__
+
+
+class EggInfoDistribution(BaseInstalledDistribution):
+    """Created with the *path* of the ``.egg-info`` directory or file provided
+    to the constructor. It reads the metadata contained in the file itself, or
+    if the given path happens to be a directory, the metadata is read from the
+    file ``PKG-INFO`` under that directory."""
+
+    requested = True    # as we have no way of knowing, assume it was
+    shared_locations = {}
+
+    def __init__(self, path, env=None):
+        def set_name_and_version(s, n, v):
+            s.name = n
+            s.key = n.lower()   # for case-insensitive comparisons
+            s.version = v
+
+        self.path = path
+        self.dist_path = env
+        if env and env._cache_enabled and path in env._cache_egg.path:
+            metadata = env._cache_egg.path[path].metadata
+            set_name_and_version(self, metadata.name, metadata.version)
+        else:
+            metadata = self._get_metadata(path)
+
+            # Need to be set before caching
+            set_name_and_version(self, metadata.name, metadata.version)
+
+            if env and env._cache_enabled:
+                env._cache_egg.add(self)
+        super(EggInfoDistribution, self).__init__(metadata, path, env)
+
+    def _get_metadata(self, path):
+        requires = None
+
+        def parse_requires_data(data):
+            """Create a list of dependencies from a requires.txt file.
+
+            *data*: the contents of a setuptools-produced requires.txt file.
+            """
+            reqs = []
+            lines = data.splitlines()
+            for line in lines:
+                line = line.strip()
+                if line.startswith('['):
+                    logger.warning('Unexpected line: quitting requirement scan: %r',
+                                   line)
+                    break
+                r = parse_requirement(line)
+                if not r:
+                    logger.warning('Not recognised as a requirement: %r', line)
+                    continue
+                if r.extras:
+                    logger.warning('extra requirements in requires.txt are '
+                                   'not supported')
+                if not r.constraints:
+                    reqs.append(r.name)
+                else:
+                    cons = ', '.join('%s%s' % c for c in r.constraints)
+                    reqs.append('%s (%s)' % (r.name, cons))
+            return reqs
+
+        def parse_requires_path(req_path):
+            """Create a list of dependencies from a requires.txt file.
+
+            *req_path*: the path to a setuptools-produced requires.txt file.
+            """
+
+            reqs = []
+            try:
+                with codecs.open(req_path, 'r', 'utf-8') as fp:
+                    reqs = parse_requires_data(fp.read())
+            except IOError:
+                pass
+            return reqs
+
+        if path.endswith('.egg'):
+            if os.path.isdir(path):
+                meta_path = os.path.join(path, 'EGG-INFO', 'PKG-INFO')
+                metadata = Metadata(path=meta_path, scheme='legacy')
+                req_path = os.path.join(path, 'EGG-INFO', 'requires.txt')
+                requires = parse_requires_path(req_path)
+            else:
+                # FIXME handle the case where zipfile is not available
+                zipf = zipimport.zipimporter(path)
+                fileobj = StringIO(
+                    zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8'))
+                metadata = Metadata(fileobj=fileobj, scheme='legacy')
+                try:
+                    data = zipf.get_data('EGG-INFO/requires.txt')
+                    requires = parse_requires_data(data.decode('utf-8'))
+                except IOError:
+                    requires = None
+        elif path.endswith('.egg-info'):
+            if os.path.isdir(path):
+                req_path = os.path.join(path, 'requires.txt')
+                requires = parse_requires_path(req_path)
+                path = os.path.join(path, 'PKG-INFO')
+            metadata = Metadata(path=path, scheme='legacy')
+        else:
+            raise DistlibException('path must end with .egg-info or .egg, '
+                                   'got %r' % path)
+
+        if requires:
+            metadata.add_requirements(requires)
+        return metadata
+
+    def __repr__(self):
+        return '<EggInfoDistribution %r %s at %r>' % (
+            self.name, self.version, self.path)
+
+    def __str__(self):
+        return "%s %s" % (self.name, self.version)
+
+    def check_installed_files(self):
+        """
+        Checks that the hashes and sizes of the files in ``RECORD`` are
+        matched by the files themselves. Returns a (possibly empty) list of
+        mismatches. Each entry in the mismatch list will be a tuple consisting
+        of the path, 'exists', 'size' or 'hash' according to what didn't match
+        (existence is checked first, then size, then hash), the expected
+        value and the actual value.
+        """
+        mismatches = []
+        record_path = os.path.join(self.path, 'installed-files.txt')
+        if os.path.exists(record_path):
+            for path, _, _ in self.list_installed_files():
+                if path == record_path:
+                    continue
+                if not os.path.exists(path):
+                    mismatches.append((path, 'exists', True, False))
+        return mismatches
+
+    def list_installed_files(self):
+        """
+        Iterates over the ``installed-files.txt`` entries and returns a tuple
+        ``(path, hash, size)`` for each line.
+
+        :returns: a list of (path, hash, size)
+        """
+
+        def _md5(path):
+            f = open(path, 'rb')
+            try:
+                content = f.read()
+            finally:
+                f.close()
+            return hashlib.md5(content).hexdigest()
+
+        def _size(path):
+            return os.stat(path).st_size
+
+        record_path = os.path.join(self.path, 'installed-files.txt')
+        result = []
+        if os.path.exists(record_path):
+            with codecs.open(record_path, 'r', encoding='utf-8') as f:
+                for line in f:
+                    line = line.strip()
+                    p = os.path.normpath(os.path.join(self.path, line))
+                    # "./" is present as a marker between installed files
+                    # and installation metadata files
+                    if not os.path.exists(p):
+                        logger.warning('Non-existent file: %s', p)
+                        if p.endswith(('.pyc', '.pyo')):
+                            continue
+                        #otherwise fall through and fail
+                    if not os.path.isdir(p):
+                        result.append((p, _md5(p), _size(p)))
+            result.append((record_path, None, None))
+        return result
+
+    def list_distinfo_files(self, absolute=False):
+        """
+        Iterates over the ``installed-files.txt`` entries and returns paths for
+        each line if the path is pointing to a file located in the
+        ``.egg-info`` directory or one of its subdirectories.
+
+        :parameter absolute: If *absolute* is ``True``, each returned path is
+                          transformed into a local absolute path. Otherwise the
+                          raw value from ``installed-files.txt`` is returned.
+        :type absolute: boolean
+        :returns: iterator of paths
+        """
+        record_path = os.path.join(self.path, 'installed-files.txt')
+        skip = True
+        with codecs.open(record_path, 'r', encoding='utf-8') as f:
+            for line in f:
+                line = line.strip()
+                if line == './':
+                    skip = False
+                    continue
+                if not skip:
+                    p = os.path.normpath(os.path.join(self.path, line))
+                    if p.startswith(self.path):
+                        if absolute:
+                            yield p
+                        else:
+                            yield line
+
+    def __eq__(self, other):
+        return (isinstance(other, EggInfoDistribution) and
+                self.path == other.path)
+
+    # See http://docs.python.org/reference/datamodel#object.__hash__
+    __hash__ = object.__hash__
+
+new_dist_class = InstalledDistribution
+old_dist_class = EggInfoDistribution
+
+
+class DependencyGraph(object):
+    """
+    Represents a dependency graph between distributions.
+
+    The dependency relationships are stored in an ``adjacency_list`` that maps
+    distributions to a list of ``(other, label)`` tuples where  ``other``
+    is a distribution and the edge is labeled with ``label`` (i.e. the version
+    specifier, if such was provided). Also, for more efficient traversal, for
+    every distribution ``x``, a list of predecessors is kept in
+    ``reverse_list[x]``. An edge from distribution ``a`` to
+    distribution ``b`` means that ``a`` depends on ``b``. If any missing
+    dependencies are found, they are stored in ``missing``, which is a
+    dictionary that maps distributions to a list of requirements that were not
+    provided by any other distributions.
+    """
+
+    def __init__(self):
+        self.adjacency_list = {}
+        self.reverse_list = {}
+        self.missing = {}
+
+    def add_distribution(self, distribution):
+        """Add the *distribution* to the graph.
+
+        :type distribution: :class:`distutils2.database.InstalledDistribution`
+                            or :class:`distutils2.database.EggInfoDistribution`
+        """
+        self.adjacency_list[distribution] = []
+        self.reverse_list[distribution] = []
+        #self.missing[distribution] = []
+
+    def add_edge(self, x, y, label=None):
+        """Add an edge from distribution *x* to distribution *y* with the given
+        *label*.
+
+        :type x: :class:`distutils2.database.InstalledDistribution` or
+                 :class:`distutils2.database.EggInfoDistribution`
+        :type y: :class:`distutils2.database.InstalledDistribution` or
+                 :class:`distutils2.database.EggInfoDistribution`
+        :type label: ``str`` or ``None``
+        """
+        self.adjacency_list[x].append((y, label))
+        # multiple edges are allowed, so be careful
+        if x not in self.reverse_list[y]:
+            self.reverse_list[y].append(x)
+
+    def add_missing(self, distribution, requirement):
+        """
+        Add a missing *requirement* for the given *distribution*.
+
+        :type distribution: :class:`distutils2.database.InstalledDistribution`
+                            or :class:`distutils2.database.EggInfoDistribution`
+        :type requirement: ``str``
+        """
+        logger.debug('%s missing %r', distribution, requirement)
+        self.missing.setdefault(distribution, []).append(requirement)
+
+    def _repr_dist(self, dist):
+        return '%s %s' % (dist.name, dist.version)
+
+    def repr_node(self, dist, level=1):
+        """Prints only a subgraph"""
+        output = [self._repr_dist(dist)]
+        for other, label in self.adjacency_list[dist]:
+            dist = self._repr_dist(other)
+            if label is not None:
+                dist = '%s [%s]' % (dist, label)
+            output.append('    ' * level + str(dist))
+            suboutput = self.repr_node(other, level + 1)
+            subs = suboutput.split('\n')
+            output.extend(subs[1:])
+        return '\n'.join(output)
+
+    def to_dot(self, f, skip_disconnected=True):
+        """Writes a DOT output for the graph to the provided file *f*.
+
+        If *skip_disconnected* is set to ``True``, then all distributions
+        that are not dependent on any other distribution are skipped.
+
+        :type f: has to support ``file``-like operations
+        :type skip_disconnected: ``bool``
+        """
+        disconnected = []
+
+        f.write("digraph dependencies {\n")
+        for dist, adjs in self.adjacency_list.items():
+            if len(adjs) == 0 and not skip_disconnected:
+                disconnected.append(dist)
+            for other, label in adjs:
+                if not label is None:
+                    f.write('"%s" -> "%s" [label="%s"]\n' %
+                            (dist.name, other.name, label))
+                else:
+                    f.write('"%s" -> "%s"\n' % (dist.name, other.name))
+        if not skip_disconnected and len(disconnected) > 0:
+            f.write('subgraph disconnected {\n')
+            f.write('label = "Disconnected"\n')
+            f.write('bgcolor = red\n')
+
+            for dist in disconnected:
+                f.write('"%s"' % dist.name)
+                f.write('\n')
+            f.write('}\n')
+        f.write('}\n')
+
+    def topological_sort(self):
+        """
+        Perform a topological sort of the graph.
+        :return: A tuple, the first element of which is a topologically sorted
+                 list of distributions, and the second element of which is a
+                 list of distributions that cannot be sorted because they have
+                 circular dependencies and so form a cycle.
+        """
+        result = []
+        # Make a shallow copy of the adjacency list
+        alist = {}
+        for k, v in self.adjacency_list.items():
+            alist[k] = v[:]
+        while True:
+            # See what we can remove in this run
+            to_remove = []
+            for k, v in list(alist.items())[:]:
+                if not v:
+                    to_remove.append(k)
+                    del alist[k]
+            if not to_remove:
+                # What's left in alist (if anything) is a cycle.
+                break
+            # Remove from the adjacency list of others
+            for k, v in alist.items():
+                alist[k] = [(d, r) for d, r in v if d not in to_remove]
+            logger.debug('Moving to result: %s',
+                         ['%s (%s)' % (d.name, d.version) for d in to_remove])
+            result.extend(to_remove)
+        return result, list(alist.keys())
+
+    def __repr__(self):
+        """Representation of the graph"""
+        output = []
+        for dist, adjs in self.adjacency_list.items():
+            output.append(self.repr_node(dist))
+        return '\n'.join(output)
+
+
+def make_graph(dists, scheme='default'):
+    """Makes a dependency graph from the given distributions.
+
+    :parameter dists: a list of distributions
+    :type dists: list of :class:`distutils2.database.InstalledDistribution` and
+                 :class:`distutils2.database.EggInfoDistribution` instances
+    :rtype: a :class:`DependencyGraph` instance
+    """
+    scheme = get_scheme(scheme)
+    graph = DependencyGraph()
+    provided = {}  # maps names to lists of (version, dist) tuples
+
+    # first, build the graph and find out what's provided
+    for dist in dists:
+        graph.add_distribution(dist)
+
+        for p in dist.provides:
+            name, version = parse_name_and_version(p)
+            logger.debug('Add to provided: %s, %s, %s', name, version, dist)
+            provided.setdefault(name, []).append((version, dist))
+
+    # now make the edges
+    for dist in dists:
+        requires = (dist.run_requires | dist.meta_requires |
+                    dist.build_requires | dist.dev_requires)
+        for req in requires:
+            try:
+                matcher = scheme.matcher(req)
+            except UnsupportedVersionError:
+                # XXX compat-mode if cannot read the version
+                logger.warning('could not read version %r - using name only',
+                               req)
+                name = req.split()[0]
+                matcher = scheme.matcher(name)
+
+            name = matcher.key   # case-insensitive
+
+            matched = False
+            if name in provided:
+                for version, provider in provided[name]:
+                    try:
+                        match = matcher.match(version)
+                    except UnsupportedVersionError:
+                        match = False
+
+                    if match:
+                        graph.add_edge(dist, provider, req)
+                        matched = True
+                        break
+            if not matched:
+                graph.add_missing(dist, req)
+    return graph
+
+
+def get_dependent_dists(dists, dist):
+    """Recursively generate a list of distributions from *dists* that are
+    dependent on *dist*.
+
+    :param dists: a list of distributions
+    :param dist: a distribution, member of *dists* for which we are interested
+    """
+    if dist not in dists:
+        raise DistlibException('given distribution %r is not a member '
+                               'of the list' % dist.name)
+    graph = make_graph(dists)
+
+    dep = [dist]  # dependent distributions
+    todo = graph.reverse_list[dist]  # list of nodes we should inspect
+
+    while todo:
+        d = todo.pop()
+        dep.append(d)
+        for succ in graph.reverse_list[d]:
+            if succ not in dep:
+                todo.append(succ)
+
+    dep.pop(0)  # remove dist from dep, was there to prevent infinite loops
+    return dep
+
+
+def get_required_dists(dists, dist):
+    """Recursively generate a list of distributions from *dists* that are
+    required by *dist*.
+
+    :param dists: a list of distributions
+    :param dist: a distribution, member of *dists* for which we are interested
+    """
+    if dist not in dists:
+        raise DistlibException('given distribution %r is not a member '
+                               'of the list' % dist.name)
+    graph = make_graph(dists)
+
+    req = []  # required distributions
+    todo = graph.adjacency_list[dist]  # list of nodes we should inspect
+
+    while todo:
+        d = todo.pop()[0]
+        req.append(d)
+        for pred in graph.adjacency_list[d]:
+            if pred not in req:
+                todo.append(pred)
+
+    return req
+
+
+def make_dist(name, version, **kwargs):
+    """
+    A convenience method for making a dist given just a name and version.
+    """
+    summary = kwargs.pop('summary', 'Placeholder for summary')
+    md = Metadata(**kwargs)
+    md.name = name
+    md.version = version
+    md.summary = summary or 'Placeholder for summary'
+    return Distribution(md)
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/index.py b/vendor/pip-9.0.3/pip/_vendor/distlib/index.py
new file mode 100644
index 0000000000000000000000000000000000000000..6803dd283fd5ba94b93c3e45871827223252ec2d
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/index.py
@@ -0,0 +1,515 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013 Vinay Sajip.
+# Licensed to the Python Software Foundation under a contributor agreement.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+import hashlib
+import logging
+import os
+import shutil
+import subprocess
+import tempfile
+try:
+    from threading import Thread
+except ImportError:
+    from dummy_threading import Thread
+
+from . import DistlibException
+from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr,
+                     urlparse, build_opener, string_types)
+from .util import cached_property, zip_dir, ServerProxy
+
+logger = logging.getLogger(__name__)
+
+DEFAULT_INDEX = 'https://pypi.python.org/pypi'
+DEFAULT_REALM = 'pypi'
+
+class PackageIndex(object):
+    """
+    This class represents a package index compatible with PyPI, the Python
+    Package Index.
+    """
+
+    boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$'
+
+    def __init__(self, url=None):
+        """
+        Initialise an instance.
+
+        :param url: The URL of the index. If not specified, the URL for PyPI is
+                    used.
+        """
+        self.url = url or DEFAULT_INDEX
+        self.read_configuration()
+        scheme, netloc, path, params, query, frag = urlparse(self.url)
+        if params or query or frag or scheme not in ('http', 'https'):
+            raise DistlibException('invalid repository: %s' % self.url)
+        self.password_handler = None
+        self.ssl_verifier = None
+        self.gpg = None
+        self.gpg_home = None
+        self.rpc_proxy = None
+        with open(os.devnull, 'w') as sink:
+            # Use gpg by default rather than gpg2, as gpg2 insists on
+            # prompting for passwords
+            for s in ('gpg', 'gpg2'):
+                try:
+                    rc = subprocess.check_call([s, '--version'], stdout=sink,
+                                               stderr=sink)
+                    if rc == 0:
+                        self.gpg = s
+                        break
+                except OSError:
+                    pass
+
+    def _get_pypirc_command(self):
+        """
+        Get the distutils command for interacting with PyPI configurations.
+        :return: the command.
+        """
+        from distutils.core import Distribution
+        from distutils.config import PyPIRCCommand
+        d = Distribution()
+        return PyPIRCCommand(d)
+
+    def read_configuration(self):
+        """
+        Read the PyPI access configuration as supported by distutils, getting
+        PyPI to do the actual work. This populates ``username``, ``password``,
+        ``realm`` and ``url`` attributes from the configuration.
+        """
+        # get distutils to do the work
+        c = self._get_pypirc_command()
+        c.repository = self.url
+        cfg = c._read_pypirc()
+        self.username = cfg.get('username')
+        self.password = cfg.get('password')
+        self.realm = cfg.get('realm', 'pypi')
+        self.url = cfg.get('repository', self.url)
+
+    def save_configuration(self):
+        """
+        Save the PyPI access configuration. You must have set ``username`` and
+        ``password`` attributes before calling this method.
+
+        Again, distutils is used to do the actual work.
+        """
+        self.check_credentials()
+        # get distutils to do the work
+        c = self._get_pypirc_command()
+        c._store_pypirc(self.username, self.password)
+
+    def check_credentials(self):
+        """
+        Check that ``username`` and ``password`` have been set, and raise an
+        exception if not.
+        """
+        if self.username is None or self.password is None:
+            raise DistlibException('username and password must be set')
+        pm = HTTPPasswordMgr()
+        _, netloc, _, _, _, _ = urlparse(self.url)
+        pm.add_password(self.realm, netloc, self.username, self.password)
+        self.password_handler = HTTPBasicAuthHandler(pm)
+
+    def register(self, metadata):
+        """
+        Register a distribution on PyPI, using the provided metadata.
+
+        :param metadata: A :class:`Metadata` instance defining at least a name
+                         and version number for the distribution to be
+                         registered.
+        :return: The HTTP response received from PyPI upon submission of the
+                request.
+        """
+        self.check_credentials()
+        metadata.validate()
+        d = metadata.todict()
+        d[':action'] = 'verify'
+        request = self.encode_request(d.items(), [])
+        response = self.send_request(request)
+        d[':action'] = 'submit'
+        request = self.encode_request(d.items(), [])
+        return self.send_request(request)
+
+    def _reader(self, name, stream, outbuf):
+        """
+        Thread runner for reading lines of from a subprocess into a buffer.
+
+        :param name: The logical name of the stream (used for logging only).
+        :param stream: The stream to read from. This will typically a pipe
+                       connected to the output stream of a subprocess.
+        :param outbuf: The list to append the read lines to.
+        """
+        while True:
+            s = stream.readline()
+            if not s:
+                break
+            s = s.decode('utf-8').rstrip()
+            outbuf.append(s)
+            logger.debug('%s: %s' % (name, s))
+        stream.close()
+
+    def get_sign_command(self, filename, signer, sign_password,
+                         keystore=None):
+        """
+        Return a suitable command for signing a file.
+
+        :param filename: The pathname to the file to be signed.
+        :param signer: The identifier of the signer of the file.
+        :param sign_password: The passphrase for the signer's
+                              private key used for signing.
+        :param keystore: The path to a directory which contains the keys
+                         used in verification. If not specified, the
+                         instance's ``gpg_home`` attribute is used instead.
+        :return: The signing command as a list suitable to be
+                 passed to :class:`subprocess.Popen`.
+        """
+        cmd = [self.gpg, '--status-fd', '2', '--no-tty']
+        if keystore is None:
+            keystore = self.gpg_home
+        if keystore:
+            cmd.extend(['--homedir', keystore])
+        if sign_password is not None:
+            cmd.extend(['--batch', '--passphrase-fd', '0'])
+        td = tempfile.mkdtemp()
+        sf = os.path.join(td, os.path.basename(filename) + '.asc')
+        cmd.extend(['--detach-sign', '--armor', '--local-user',
+                    signer, '--output', sf, filename])
+        logger.debug('invoking: %s', ' '.join(cmd))
+        return cmd, sf
+
+    def run_command(self, cmd, input_data=None):
+        """
+        Run a command in a child process , passing it any input data specified.
+
+        :param cmd: The command to run.
+        :param input_data: If specified, this must be a byte string containing
+                           data to be sent to the child process.
+        :return: A tuple consisting of the subprocess' exit code, a list of
+                 lines read from the subprocess' ``stdout``, and a list of
+                 lines read from the subprocess' ``stderr``.
+        """
+        kwargs = {
+            'stdout': subprocess.PIPE,
+            'stderr': subprocess.PIPE,
+        }
+        if input_data is not None:
+            kwargs['stdin'] = subprocess.PIPE
+        stdout = []
+        stderr = []
+        p = subprocess.Popen(cmd, **kwargs)
+        # We don't use communicate() here because we may need to
+        # get clever with interacting with the command
+        t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout))
+        t1.start()
+        t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr))
+        t2.start()
+        if input_data is not None:
+            p.stdin.write(input_data)
+            p.stdin.close()
+
+        p.wait()
+        t1.join()
+        t2.join()
+        return p.returncode, stdout, stderr
+
+    def sign_file(self, filename, signer, sign_password, keystore=None):
+        """
+        Sign a file.
+
+        :param filename: The pathname to the file to be signed.
+        :param signer: The identifier of the signer of the file.
+        :param sign_password: The passphrase for the signer's
+                              private key used for signing.
+        :param keystore: The path to a directory which contains the keys
+                         used in signing. If not specified, the instance's
+                         ``gpg_home`` attribute is used instead.
+        :return: The absolute pathname of the file where the signature is
+                 stored.
+        """
+        cmd, sig_file = self.get_sign_command(filename, signer, sign_password,
+                                              keystore)
+        rc, stdout, stderr = self.run_command(cmd,
+                                              sign_password.encode('utf-8'))
+        if rc != 0:
+            raise DistlibException('sign command failed with error '
+                                   'code %s' % rc)
+        return sig_file
+
+    def upload_file(self, metadata, filename, signer=None, sign_password=None,
+                    filetype='sdist', pyversion='source', keystore=None):
+        """
+        Upload a release file to the index.
+
+        :param metadata: A :class:`Metadata` instance defining at least a name
+                         and version number for the file to be uploaded.
+        :param filename: The pathname of the file to be uploaded.
+        :param signer: The identifier of the signer of the file.
+        :param sign_password: The passphrase for the signer's
+                              private key used for signing.
+        :param filetype: The type of the file being uploaded. This is the
+                        distutils command which produced that file, e.g.
+                        ``sdist`` or ``bdist_wheel``.
+        :param pyversion: The version of Python which the release relates
+                          to. For code compatible with any Python, this would
+                          be ``source``, otherwise it would be e.g. ``3.2``.
+        :param keystore: The path to a directory which contains the keys
+                         used in signing. If not specified, the instance's
+                         ``gpg_home`` attribute is used instead.
+        :return: The HTTP response received from PyPI upon submission of the
+                request.
+        """
+        self.check_credentials()
+        if not os.path.exists(filename):
+            raise DistlibException('not found: %s' % filename)
+        metadata.validate()
+        d = metadata.todict()
+        sig_file = None
+        if signer:
+            if not self.gpg:
+                logger.warning('no signing program available - not signed')
+            else:
+                sig_file = self.sign_file(filename, signer, sign_password,
+                                          keystore)
+        with open(filename, 'rb') as f:
+            file_data = f.read()
+        md5_digest = hashlib.md5(file_data).hexdigest()
+        sha256_digest = hashlib.sha256(file_data).hexdigest()
+        d.update({
+            ':action': 'file_upload',
+            'protocol_version': '1',
+            'filetype': filetype,
+            'pyversion': pyversion,
+            'md5_digest': md5_digest,
+            'sha256_digest': sha256_digest,
+        })
+        files = [('content', os.path.basename(filename), file_data)]
+        if sig_file:
+            with open(sig_file, 'rb') as f:
+                sig_data = f.read()
+            files.append(('gpg_signature', os.path.basename(sig_file),
+                         sig_data))
+            shutil.rmtree(os.path.dirname(sig_file))
+        request = self.encode_request(d.items(), files)
+        return self.send_request(request)
+
+    def upload_documentation(self, metadata, doc_dir):
+        """
+        Upload documentation to the index.
+
+        :param metadata: A :class:`Metadata` instance defining at least a name
+                         and version number for the documentation to be
+                         uploaded.
+        :param doc_dir: The pathname of the directory which contains the
+                        documentation. This should be the directory that
+                        contains the ``index.html`` for the documentation.
+        :return: The HTTP response received from PyPI upon submission of the
+                request.
+        """
+        self.check_credentials()
+        if not os.path.isdir(doc_dir):
+            raise DistlibException('not a directory: %r' % doc_dir)
+        fn = os.path.join(doc_dir, 'index.html')
+        if not os.path.exists(fn):
+            raise DistlibException('not found: %r' % fn)
+        metadata.validate()
+        name, version = metadata.name, metadata.version
+        zip_data = zip_dir(doc_dir).getvalue()
+        fields = [(':action', 'doc_upload'),
+                  ('name', name), ('version', version)]
+        files = [('content', name, zip_data)]
+        request = self.encode_request(fields, files)
+        return self.send_request(request)
+
+    def get_verify_command(self, signature_filename, data_filename,
+                           keystore=None):
+        """
+        Return a suitable command for verifying a file.
+
+        :param signature_filename: The pathname to the file containing the
+                                   signature.
+        :param data_filename: The pathname to the file containing the
+                              signed data.
+        :param keystore: The path to a directory which contains the keys
+                         used in verification. If not specified, the
+                         instance's ``gpg_home`` attribute is used instead.
+        :return: The verifying command as a list suitable to be
+                 passed to :class:`subprocess.Popen`.
+        """
+        cmd = [self.gpg, '--status-fd', '2', '--no-tty']
+        if keystore is None:
+            keystore = self.gpg_home
+        if keystore:
+            cmd.extend(['--homedir', keystore])
+        cmd.extend(['--verify', signature_filename, data_filename])
+        logger.debug('invoking: %s', ' '.join(cmd))
+        return cmd
+
+    def verify_signature(self, signature_filename, data_filename,
+                         keystore=None):
+        """
+        Verify a signature for a file.
+
+        :param signature_filename: The pathname to the file containing the
+                                   signature.
+        :param data_filename: The pathname to the file containing the
+                              signed data.
+        :param keystore: The path to a directory which contains the keys
+                         used in verification. If not specified, the
+                         instance's ``gpg_home`` attribute is used instead.
+        :return: True if the signature was verified, else False.
+        """
+        if not self.gpg:
+            raise DistlibException('verification unavailable because gpg '
+                                   'unavailable')
+        cmd = self.get_verify_command(signature_filename, data_filename,
+                                      keystore)
+        rc, stdout, stderr = self.run_command(cmd)
+        if rc not in (0, 1):
+            raise DistlibException('verify command failed with error '
+                             'code %s' % rc)
+        return rc == 0
+
+    def download_file(self, url, destfile, digest=None, reporthook=None):
+        """
+        This is a convenience method for downloading a file from an URL.
+        Normally, this will be a file from the index, though currently
+        no check is made for this (i.e. a file can be downloaded from
+        anywhere).
+
+        The method is just like the :func:`urlretrieve` function in the
+        standard library, except that it allows digest computation to be
+        done during download and checking that the downloaded data
+        matched any expected value.
+
+        :param url: The URL of the file to be downloaded (assumed to be
+                    available via an HTTP GET request).
+        :param destfile: The pathname where the downloaded file is to be
+                         saved.
+        :param digest: If specified, this must be a (hasher, value)
+                       tuple, where hasher is the algorithm used (e.g.
+                       ``'md5'``) and ``value`` is the expected value.
+        :param reporthook: The same as for :func:`urlretrieve` in the
+                           standard library.
+        """
+        if digest is None:
+            digester = None
+            logger.debug('No digest specified')
+        else:
+            if isinstance(digest, (list, tuple)):
+                hasher, digest = digest
+            else:
+                hasher = 'md5'
+            digester = getattr(hashlib, hasher)()
+            logger.debug('Digest specified: %s' % digest)
+        # The following code is equivalent to urlretrieve.
+        # We need to do it this way so that we can compute the
+        # digest of the file as we go.
+        with open(destfile, 'wb') as dfp:
+            # addinfourl is not a context manager on 2.x
+            # so we have to use try/finally
+            sfp = self.send_request(Request(url))
+            try:
+                headers = sfp.info()
+                blocksize = 8192
+                size = -1
+                read = 0
+                blocknum = 0
+                if "content-length" in headers:
+                    size = int(headers["Content-Length"])
+                if reporthook:
+                    reporthook(blocknum, blocksize, size)
+                while True:
+                    block = sfp.read(blocksize)
+                    if not block:
+                        break
+                    read += len(block)
+                    dfp.write(block)
+                    if digester:
+                        digester.update(block)
+                    blocknum += 1
+                    if reporthook:
+                        reporthook(blocknum, blocksize, size)
+            finally:
+                sfp.close()
+
+        # check that we got the whole file, if we can
+        if size >= 0 and read < size:
+            raise DistlibException(
+                'retrieval incomplete: got only %d out of %d bytes'
+                % (read, size))
+        # if we have a digest, it must match.
+        if digester:
+            actual = digester.hexdigest()
+            if digest != actual:
+                raise DistlibException('%s digest mismatch for %s: expected '
+                                       '%s, got %s' % (hasher, destfile,
+                                                       digest, actual))
+            logger.debug('Digest verified: %s', digest)
+
+    def send_request(self, req):
+        """
+        Send a standard library :class:`Request` to PyPI and return its
+        response.
+
+        :param req: The request to send.
+        :return: The HTTP response from PyPI (a standard library HTTPResponse).
+        """
+        handlers = []
+        if self.password_handler:
+            handlers.append(self.password_handler)
+        if self.ssl_verifier:
+            handlers.append(self.ssl_verifier)
+        opener = build_opener(*handlers)
+        return opener.open(req)
+
+    def encode_request(self, fields, files):
+        """
+        Encode fields and files for posting to an HTTP server.
+
+        :param fields: The fields to send as a list of (fieldname, value)
+                       tuples.
+        :param files: The files to send as a list of (fieldname, filename,
+                      file_bytes) tuple.
+        """
+        # Adapted from packaging, which in turn was adapted from
+        # http://code.activestate.com/recipes/146306
+
+        parts = []
+        boundary = self.boundary
+        for k, values in fields:
+            if not isinstance(values, (list, tuple)):
+                values = [values]
+
+            for v in values:
+                parts.extend((
+                    b'--' + boundary,
+                    ('Content-Disposition: form-data; name="%s"' %
+                     k).encode('utf-8'),
+                    b'',
+                    v.encode('utf-8')))
+        for key, filename, value in files:
+            parts.extend((
+                b'--' + boundary,
+                ('Content-Disposition: form-data; name="%s"; filename="%s"' %
+                 (key, filename)).encode('utf-8'),
+                b'',
+                value))
+
+        parts.extend((b'--' + boundary + b'--', b''))
+
+        body = b'\r\n'.join(parts)
+        ct = b'multipart/form-data; boundary=' + boundary
+        headers = {
+            'Content-type': ct,
+            'Content-length': str(len(body))
+        }
+        return Request(self.url, body, headers)
+
+    def search(self, terms, operator=None):
+        if isinstance(terms, string_types):
+            terms = {'name': terms}
+        if self.rpc_proxy is None:
+            self.rpc_proxy = ServerProxy(self.url, timeout=3.0)
+        return self.rpc_proxy.search(terms, operator or 'and')
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/locators.py b/vendor/pip-9.0.3/pip/_vendor/distlib/locators.py
new file mode 100644
index 0000000000000000000000000000000000000000..14789ef5d6167caea2e280328cd0b4bae74fe4ee
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/locators.py
@@ -0,0 +1,1283 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012-2015 Vinay Sajip.
+# Licensed to the Python Software Foundation under a contributor agreement.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+
+import gzip
+from io import BytesIO
+import json
+import logging
+import os
+import posixpath
+import re
+try:
+    import threading
+except ImportError:  # pragma: no cover
+    import dummy_threading as threading
+import zlib
+
+from . import DistlibException
+from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url,
+                     queue, quote, unescape, string_types, build_opener,
+                     HTTPRedirectHandler as BaseRedirectHandler, text_type,
+                     Request, HTTPError, URLError)
+from .database import Distribution, DistributionPath, make_dist
+from .metadata import Metadata
+from .util import (cached_property, parse_credentials, ensure_slash,
+                   split_filename, get_project_data, parse_requirement,
+                   parse_name_and_version, ServerProxy, normalize_name)
+from .version import get_scheme, UnsupportedVersionError
+from .wheel import Wheel, is_compatible
+
+logger = logging.getLogger(__name__)
+
+HASHER_HASH = re.compile('^(\w+)=([a-f0-9]+)')
+CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I)
+HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml')
+DEFAULT_INDEX = 'https://pypi.python.org/pypi'
+
+def get_all_distribution_names(url=None):
+    """
+    Return all distribution names known by an index.
+    :param url: The URL of the index.
+    :return: A list of all known distribution names.
+    """
+    if url is None:
+        url = DEFAULT_INDEX
+    client = ServerProxy(url, timeout=3.0)
+    return client.list_packages()
+
+class RedirectHandler(BaseRedirectHandler):
+    """
+    A class to work around a bug in some Python 3.2.x releases.
+    """
+    # There's a bug in the base version for some 3.2.x
+    # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header
+    # returns e.g. /abc, it bails because it says the scheme ''
+    # is bogus, when actually it should use the request's
+    # URL for the scheme. See Python issue #13696.
+    def http_error_302(self, req, fp, code, msg, headers):
+        # Some servers (incorrectly) return multiple Location headers
+        # (so probably same goes for URI).  Use first header.
+        newurl = None
+        for key in ('location', 'uri'):
+            if key in headers:
+                newurl = headers[key]
+                break
+        if newurl is None:
+            return
+        urlparts = urlparse(newurl)
+        if urlparts.scheme == '':
+            newurl = urljoin(req.get_full_url(), newurl)
+            if hasattr(headers, 'replace_header'):
+                headers.replace_header(key, newurl)
+            else:
+                headers[key] = newurl
+        return BaseRedirectHandler.http_error_302(self, req, fp, code, msg,
+                                                  headers)
+
+    http_error_301 = http_error_303 = http_error_307 = http_error_302
+
+class Locator(object):
+    """
+    A base class for locators - things that locate distributions.
+    """
+    source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz')
+    binary_extensions = ('.egg', '.exe', '.whl')
+    excluded_extensions = ('.pdf',)
+
+    # A list of tags indicating which wheels you want to match. The default
+    # value of None matches against the tags compatible with the running
+    # Python. If you want to match other values, set wheel_tags on a locator
+    # instance to a list of tuples (pyver, abi, arch) which you want to match.
+    wheel_tags = None
+
+    downloadable_extensions = source_extensions + ('.whl',)
+
+    def __init__(self, scheme='default'):
+        """
+        Initialise an instance.
+        :param scheme: Because locators look for most recent versions, they
+                       need to know the version scheme to use. This specifies
+                       the current PEP-recommended scheme - use ``'legacy'``
+                       if you need to support existing distributions on PyPI.
+        """
+        self._cache = {}
+        self.scheme = scheme
+        # Because of bugs in some of the handlers on some of the platforms,
+        # we use our own opener rather than just using urlopen.
+        self.opener = build_opener(RedirectHandler())
+        # If get_project() is called from locate(), the matcher instance
+        # is set from the requirement passed to locate(). See issue #18 for
+        # why this can be useful to know.
+        self.matcher = None
+        self.errors = queue.Queue()
+
+    def get_errors(self):
+        """
+        Return any errors which have occurred.
+        """
+        result = []
+        while not self.errors.empty():  # pragma: no cover
+            try:
+                e = self.errors.get(False)
+                result.append(e)
+            except self.errors.Empty:
+                continue
+            self.errors.task_done()
+        return result
+
+    def clear_errors(self):
+        """
+        Clear any errors which may have been logged.
+        """
+        # Just get the errors and throw them away
+        self.get_errors()
+
+    def clear_cache(self):
+        self._cache.clear()
+
+    def _get_scheme(self):
+        return self._scheme
+
+    def _set_scheme(self, value):
+        self._scheme = value
+
+    scheme = property(_get_scheme, _set_scheme)
+
+    def _get_project(self, name):
+        """
+        For a given project, get a dictionary mapping available versions to Distribution
+        instances.
+
+        This should be implemented in subclasses.
+
+        If called from a locate() request, self.matcher will be set to a
+        matcher for the requirement to satisfy, otherwise it will be None.
+        """
+        raise NotImplementedError('Please implement in the subclass')
+
+    def get_distribution_names(self):
+        """
+        Return all the distribution names known to this locator.
+        """
+        raise NotImplementedError('Please implement in the subclass')
+
+    def get_project(self, name):
+        """
+        For a given project, get a dictionary mapping available versions to Distribution
+        instances.
+
+        This calls _get_project to do all the work, and just implements a caching layer on top.
+        """
+        if self._cache is None:
+            result = self._get_project(name)
+        elif name in self._cache:
+            result = self._cache[name]
+        else:
+            self.clear_errors()
+            result = self._get_project(name)
+            self._cache[name] = result
+        return result
+
+    def score_url(self, url):
+        """
+        Give an url a score which can be used to choose preferred URLs
+        for a given project release.
+        """
+        t = urlparse(url)
+        basename = posixpath.basename(t.path)
+        compatible = True
+        is_wheel = basename.endswith('.whl')
+        if is_wheel:
+            compatible = is_compatible(Wheel(basename), self.wheel_tags)
+        return (t.scheme != 'https', 'pypi.python.org' in t.netloc,
+                is_wheel, compatible, basename)
+
+    def prefer_url(self, url1, url2):
+        """
+        Choose one of two URLs where both are candidates for distribution
+        archives for the same version of a distribution (for example,
+        .tar.gz vs. zip).
+
+        The current implementation favours https:// URLs over http://, archives
+        from PyPI over those from other locations, wheel compatibility (if a
+        wheel) and then the archive name.
+        """
+        result = url2
+        if url1:
+            s1 = self.score_url(url1)
+            s2 = self.score_url(url2)
+            if s1 > s2:
+                result = url1
+            if result != url2:
+                logger.debug('Not replacing %r with %r', url1, url2)
+            else:
+                logger.debug('Replacing %r with %r', url1, url2)
+        return result
+
+    def split_filename(self, filename, project_name):
+        """
+        Attempt to split a filename in project name, version and Python version.
+        """
+        return split_filename(filename, project_name)
+
+    def convert_url_to_download_info(self, url, project_name):
+        """
+        See if a URL is a candidate for a download URL for a project (the URL
+        has typically been scraped from an HTML page).
+
+        If it is, a dictionary is returned with keys "name", "version",
+        "filename" and "url"; otherwise, None is returned.
+        """
+        def same_project(name1, name2):
+            return normalize_name(name1) == normalize_name(name2)
+
+        result = None
+        scheme, netloc, path, params, query, frag = urlparse(url)
+        if frag.lower().startswith('egg='):
+            logger.debug('%s: version hint in fragment: %r',
+                         project_name, frag)
+        m = HASHER_HASH.match(frag)
+        if m:
+            algo, digest = m.groups()
+        else:
+            algo, digest = None, None
+        origpath = path
+        if path and path[-1] == '/':
+            path = path[:-1]
+        if path.endswith('.whl'):
+            try:
+                wheel = Wheel(path)
+                if is_compatible(wheel, self.wheel_tags):
+                    if project_name is None:
+                        include = True
+                    else:
+                        include = same_project(wheel.name, project_name)
+                    if include:
+                        result = {
+                            'name': wheel.name,
+                            'version': wheel.version,
+                            'filename': wheel.filename,
+                            'url': urlunparse((scheme, netloc, origpath,
+                                               params, query, '')),
+                            'python-version': ', '.join(
+                                ['.'.join(list(v[2:])) for v in wheel.pyver]),
+                        }
+            except Exception as e:  # pragma: no cover
+                logger.warning('invalid path for wheel: %s', path)
+        elif path.endswith(self.downloadable_extensions):
+            path = filename = posixpath.basename(path)
+            for ext in self.downloadable_extensions:
+                if path.endswith(ext):
+                    path = path[:-len(ext)]
+                    t = self.split_filename(path, project_name)
+                    if not t:
+                        logger.debug('No match for project/version: %s', path)
+                    else:
+                        name, version, pyver = t
+                        if not project_name or same_project(project_name, name):
+                            result = {
+                                'name': name,
+                                'version': version,
+                                'filename': filename,
+                                'url': urlunparse((scheme, netloc, origpath,
+                                                   params, query, '')),
+                                #'packagetype': 'sdist',
+                            }
+                            if pyver:
+                                result['python-version'] = pyver
+                    break
+        if result and algo:
+            result['%s_digest' % algo] = digest
+        return result
+
+    def _get_digest(self, info):
+        """
+        Get a digest from a dictionary by looking at keys of the form
+        'algo_digest'.
+
+        Returns a 2-tuple (algo, digest) if found, else None. Currently
+        looks only for SHA256, then MD5.
+        """
+        result = None
+        for algo in ('sha256', 'md5'):
+            key = '%s_digest' % algo
+            if key in info:
+                result = (algo, info[key])
+                break
+        return result
+
+    def _update_version_data(self, result, info):
+        """
+        Update a result dictionary (the final result from _get_project) with a
+        dictionary for a specific version, which typically holds information
+        gleaned from a filename or URL for an archive for the distribution.
+        """
+        name = info.pop('name')
+        version = info.pop('version')
+        if version in result:
+            dist = result[version]
+            md = dist.metadata
+        else:
+            dist = make_dist(name, version, scheme=self.scheme)
+            md = dist.metadata
+        dist.digest = digest = self._get_digest(info)
+        url = info['url']
+        result['digests'][url] = digest
+        if md.source_url != info['url']:
+            md.source_url = self.prefer_url(md.source_url, url)
+            result['urls'].setdefault(version, set()).add(url)
+        dist.locator = self
+        result[version] = dist
+
+    def locate(self, requirement, prereleases=False):
+        """
+        Find the most recent distribution which matches the given
+        requirement.
+
+        :param requirement: A requirement of the form 'foo (1.0)' or perhaps
+                            'foo (>= 1.0, < 2.0, != 1.3)'
+        :param prereleases: If ``True``, allow pre-release versions
+                            to be located. Otherwise, pre-release versions
+                            are not returned.
+        :return: A :class:`Distribution` instance, or ``None`` if no such
+                 distribution could be located.
+        """
+        result = None
+        r = parse_requirement(requirement)
+        if r is None:
+            raise DistlibException('Not a valid requirement: %r' % requirement)
+        scheme = get_scheme(self.scheme)
+        self.matcher = matcher = scheme.matcher(r.requirement)
+        logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__)
+        versions = self.get_project(r.name)
+        if len(versions) > 2:   # urls and digests keys are present
+            # sometimes, versions are invalid
+            slist = []
+            vcls = matcher.version_class
+            for k in versions:
+                if k in ('urls', 'digests'):
+                    continue
+                try:
+                    if not matcher.match(k):
+                        logger.debug('%s did not match %r', matcher, k)
+                    else:
+                        if prereleases or not vcls(k).is_prerelease:
+                            slist.append(k)
+                        else:
+                            logger.debug('skipping pre-release '
+                                         'version %s of %s', k, matcher.name)
+                except Exception:  # pragma: no cover
+                    logger.warning('error matching %s with %r', matcher, k)
+                    pass # slist.append(k)
+            if len(slist) > 1:
+                slist = sorted(slist, key=scheme.key)
+            if slist:
+                logger.debug('sorted list: %s', slist)
+                version = slist[-1]
+                result = versions[version]
+        if result:
+            if r.extras:
+                result.extras = r.extras
+            result.download_urls = versions.get('urls', {}).get(version, set())
+            d = {}
+            sd = versions.get('digests', {})
+            for url in result.download_urls:
+                if url in sd:
+                    d[url] = sd[url]
+            result.digests = d
+        self.matcher = None
+        return result
+
+
+class PyPIRPCLocator(Locator):
+    """
+    This locator uses XML-RPC to locate distributions. It therefore
+    cannot be used with simple mirrors (that only mirror file content).
+    """
+    def __init__(self, url, **kwargs):
+        """
+        Initialise an instance.
+
+        :param url: The URL to use for XML-RPC.
+        :param kwargs: Passed to the superclass constructor.
+        """
+        super(PyPIRPCLocator, self).__init__(**kwargs)
+        self.base_url = url
+        self.client = ServerProxy(url, timeout=3.0)
+
+    def get_distribution_names(self):
+        """
+        Return all the distribution names known to this locator.
+        """
+        return set(self.client.list_packages())
+
+    def _get_project(self, name):
+        result = {'urls': {}, 'digests': {}}
+        versions = self.client.package_releases(name, True)
+        for v in versions:
+            urls = self.client.release_urls(name, v)
+            data = self.client.release_data(name, v)
+            metadata = Metadata(scheme=self.scheme)
+            metadata.name = data['name']
+            metadata.version = data['version']
+            metadata.license = data.get('license')
+            metadata.keywords = data.get('keywords', [])
+            metadata.summary = data.get('summary')
+            dist = Distribution(metadata)
+            if urls:
+                info = urls[0]
+                metadata.source_url = info['url']
+                dist.digest = self._get_digest(info)
+                dist.locator = self
+                result[v] = dist
+                for info in urls:
+                    url = info['url']
+                    digest = self._get_digest(info)
+                    result['urls'].setdefault(v, set()).add(url)
+                    result['digests'][url] = digest
+        return result
+
+class PyPIJSONLocator(Locator):
+    """
+    This locator uses PyPI's JSON interface. It's very limited in functionality
+    and probably not worth using.
+    """
+    def __init__(self, url, **kwargs):
+        super(PyPIJSONLocator, self).__init__(**kwargs)
+        self.base_url = ensure_slash(url)
+
+    def get_distribution_names(self):
+        """
+        Return all the distribution names known to this locator.
+        """
+        raise NotImplementedError('Not available from this locator')
+
+    def _get_project(self, name):
+        result = {'urls': {}, 'digests': {}}
+        url = urljoin(self.base_url, '%s/json' % quote(name))
+        try:
+            resp = self.opener.open(url)
+            data = resp.read().decode() # for now
+            d = json.loads(data)
+            md = Metadata(scheme=self.scheme)
+            data = d['info']
+            md.name = data['name']
+            md.version = data['version']
+            md.license = data.get('license')
+            md.keywords = data.get('keywords', [])
+            md.summary = data.get('summary')
+            dist = Distribution(md)
+            dist.locator = self
+            urls = d['urls']
+            result[md.version] = dist
+            for info in d['urls']:
+                url = info['url']
+                dist.download_urls.add(url)
+                dist.digests[url] = self._get_digest(info)
+                result['urls'].setdefault(md.version, set()).add(url)
+                result['digests'][url] = self._get_digest(info)
+            # Now get other releases
+            for version, infos in d['releases'].items():
+                if version == md.version:
+                    continue    # already done
+                omd = Metadata(scheme=self.scheme)
+                omd.name = md.name
+                omd.version = version
+                odist = Distribution(omd)
+                odist.locator = self
+                result[version] = odist
+                for info in infos:
+                    url = info['url']
+                    odist.download_urls.add(url)
+                    odist.digests[url] = self._get_digest(info)
+                    result['urls'].setdefault(version, set()).add(url)
+                    result['digests'][url] = self._get_digest(info)
+#            for info in urls:
+#                md.source_url = info['url']
+#                dist.digest = self._get_digest(info)
+#                dist.locator = self
+#                for info in urls:
+#                    url = info['url']
+#                    result['urls'].setdefault(md.version, set()).add(url)
+#                    result['digests'][url] = self._get_digest(info)
+        except Exception as e:
+            self.errors.put(text_type(e))
+            logger.exception('JSON fetch failed: %s', e)
+        return result
+
+
+class Page(object):
+    """
+    This class represents a scraped HTML page.
+    """
+    # The following slightly hairy-looking regex just looks for the contents of
+    # an anchor link, which has an attribute "href" either immediately preceded
+    # or immediately followed by a "rel" attribute. The attribute values can be
+    # declared with double quotes, single quotes or no quotes - which leads to
+    # the length of the expression.
+    _href = re.compile("""
+(rel\s*=\s*(?:"(?P<rel1>[^"]*)"|'(?P<rel2>[^']*)'|(?P<rel3>[^>\s\n]*))\s+)?
+href\s*=\s*(?:"(?P<url1>[^"]*)"|'(?P<url2>[^']*)'|(?P<url3>[^>\s\n]*))
+(\s+rel\s*=\s*(?:"(?P<rel4>[^"]*)"|'(?P<rel5>[^']*)'|(?P<rel6>[^>\s\n]*)))?
+""", re.I | re.S | re.X)
+    _base = re.compile(r"""<base\s+href\s*=\s*['"]?([^'">]+)""", re.I | re.S)
+
+    def __init__(self, data, url):
+        """
+        Initialise an instance with the Unicode page contents and the URL they
+        came from.
+        """
+        self.data = data
+        self.base_url = self.url = url
+        m = self._base.search(self.data)
+        if m:
+            self.base_url = m.group(1)
+
+    _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I)
+
+    @cached_property
+    def links(self):
+        """
+        Return the URLs of all the links on a page together with information
+        about their "rel" attribute, for determining which ones to treat as
+        downloads and which ones to queue for further scraping.
+        """
+        def clean(url):
+            "Tidy up an URL."
+            scheme, netloc, path, params, query, frag = urlparse(url)
+            return urlunparse((scheme, netloc, quote(path),
+                               params, query, frag))
+
+        result = set()
+        for match in self._href.finditer(self.data):
+            d = match.groupdict('')
+            rel = (d['rel1'] or d['rel2'] or d['rel3'] or
+                   d['rel4'] or d['rel5'] or d['rel6'])
+            url = d['url1'] or d['url2'] or d['url3']
+            url = urljoin(self.base_url, url)
+            url = unescape(url)
+            url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url)
+            result.add((url, rel))
+        # We sort the result, hoping to bring the most recent versions
+        # to the front
+        result = sorted(result, key=lambda t: t[0], reverse=True)
+        return result
+
+
+class SimpleScrapingLocator(Locator):
+    """
+    A locator which scrapes HTML pages to locate downloads for a distribution.
+    This runs multiple threads to do the I/O; performance is at least as good
+    as pip's PackageFinder, which works in an analogous fashion.
+    """
+
+    # These are used to deal with various Content-Encoding schemes.
+    decoders = {
+        'deflate': zlib.decompress,
+        'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(),
+        'none': lambda b: b,
+    }
+
+    def __init__(self, url, timeout=None, num_workers=10, **kwargs):
+        """
+        Initialise an instance.
+        :param url: The root URL to use for scraping.
+        :param timeout: The timeout, in seconds, to be applied to requests.
+                        This defaults to ``None`` (no timeout specified).
+        :param num_workers: The number of worker threads you want to do I/O,
+                            This defaults to 10.
+        :param kwargs: Passed to the superclass.
+        """
+        super(SimpleScrapingLocator, self).__init__(**kwargs)
+        self.base_url = ensure_slash(url)
+        self.timeout = timeout
+        self._page_cache = {}
+        self._seen = set()
+        self._to_fetch = queue.Queue()
+        self._bad_hosts = set()
+        self.skip_externals = False
+        self.num_workers = num_workers
+        self._lock = threading.RLock()
+        # See issue #45: we need to be resilient when the locator is used
+        # in a thread, e.g. with concurrent.futures. We can't use self._lock
+        # as it is for coordinating our internal threads - the ones created
+        # in _prepare_threads.
+        self._gplock = threading.RLock()
+
+    def _prepare_threads(self):
+        """
+        Threads are created only when get_project is called, and terminate
+        before it returns. They are there primarily to parallelise I/O (i.e.
+        fetching web pages).
+        """
+        self._threads = []
+        for i in range(self.num_workers):
+            t = threading.Thread(target=self._fetch)
+            t.setDaemon(True)
+            t.start()
+            self._threads.append(t)
+
+    def _wait_threads(self):
+        """
+        Tell all the threads to terminate (by sending a sentinel value) and
+        wait for them to do so.
+        """
+        # Note that you need two loops, since you can't say which
+        # thread will get each sentinel
+        for t in self._threads:
+            self._to_fetch.put(None)    # sentinel
+        for t in self._threads:
+            t.join()
+        self._threads = []
+
+    def _get_project(self, name):
+        result = {'urls': {}, 'digests': {}}
+        with self._gplock:
+            self.result = result
+            self.project_name = name
+            url = urljoin(self.base_url, '%s/' % quote(name))
+            self._seen.clear()
+            self._page_cache.clear()
+            self._prepare_threads()
+            try:
+                logger.debug('Queueing %s', url)
+                self._to_fetch.put(url)
+                self._to_fetch.join()
+            finally:
+                self._wait_threads()
+            del self.result
+        return result
+
+    platform_dependent = re.compile(r'\b(linux-(i\d86|x86_64|arm\w+)|'
+                                    r'win(32|-amd64)|macosx-?\d+)\b', re.I)
+
+    def _is_platform_dependent(self, url):
+        """
+        Does an URL refer to a platform-specific download?
+        """
+        return self.platform_dependent.search(url)
+
+    def _process_download(self, url):
+        """
+        See if an URL is a suitable download for a project.
+
+        If it is, register information in the result dictionary (for
+        _get_project) about the specific version it's for.
+
+        Note that the return value isn't actually used other than as a boolean
+        value.
+        """
+        if self._is_platform_dependent(url):
+            info = None
+        else:
+            info = self.convert_url_to_download_info(url, self.project_name)
+        logger.debug('process_download: %s -> %s', url, info)
+        if info:
+            with self._lock:    # needed because self.result is shared
+                self._update_version_data(self.result, info)
+        return info
+
+    def _should_queue(self, link, referrer, rel):
+        """
+        Determine whether a link URL from a referring page and with a
+        particular "rel" attribute should be queued for scraping.
+        """
+        scheme, netloc, path, _, _, _ = urlparse(link)
+        if path.endswith(self.source_extensions + self.binary_extensions +
+                         self.excluded_extensions):
+            result = False
+        elif self.skip_externals and not link.startswith(self.base_url):
+            result = False
+        elif not referrer.startswith(self.base_url):
+            result = False
+        elif rel not in ('homepage', 'download'):
+            result = False
+        elif scheme not in ('http', 'https', 'ftp'):
+            result = False
+        elif self._is_platform_dependent(link):
+            result = False
+        else:
+            host = netloc.split(':', 1)[0]
+            if host.lower() == 'localhost':
+                result = False
+            else:
+                result = True
+        logger.debug('should_queue: %s (%s) from %s -> %s', link, rel,
+                     referrer, result)
+        return result
+
+    def _fetch(self):
+        """
+        Get a URL to fetch from the work queue, get the HTML page, examine its
+        links for download candidates and candidates for further scraping.
+
+        This is a handy method to run in a thread.
+        """
+        while True:
+            url = self._to_fetch.get()
+            try:
+                if url:
+                    page = self.get_page(url)
+                    if page is None:    # e.g. after an error
+                        continue
+                    for link, rel in page.links:
+                        if link not in self._seen:
+                            self._seen.add(link)
+                            if (not self._process_download(link) and
+                                self._should_queue(link, url, rel)):
+                                logger.debug('Queueing %s from %s', link, url)
+                                self._to_fetch.put(link)
+            except Exception as e:  # pragma: no cover
+                self.errors.put(text_type(e))
+            finally:
+                # always do this, to avoid hangs :-)
+                self._to_fetch.task_done()
+            if not url:
+                #logger.debug('Sentinel seen, quitting.')
+                break
+
+    def get_page(self, url):
+        """
+        Get the HTML for an URL, possibly from an in-memory cache.
+
+        XXX TODO Note: this cache is never actually cleared. It's assumed that
+        the data won't get stale over the lifetime of a locator instance (not
+        necessarily true for the default_locator).
+        """
+        # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api
+        scheme, netloc, path, _, _, _ = urlparse(url)
+        if scheme == 'file' and os.path.isdir(url2pathname(path)):
+            url = urljoin(ensure_slash(url), 'index.html')
+
+        if url in self._page_cache:
+            result = self._page_cache[url]
+            logger.debug('Returning %s from cache: %s', url, result)
+        else:
+            host = netloc.split(':', 1)[0]
+            result = None
+            if host in self._bad_hosts:
+                logger.debug('Skipping %s due to bad host %s', url, host)
+            else:
+                req = Request(url, headers={'Accept-encoding': 'identity'})
+                try:
+                    logger.debug('Fetching %s', url)
+                    resp = self.opener.open(req, timeout=self.timeout)
+                    logger.debug('Fetched %s', url)
+                    headers = resp.info()
+                    content_type = headers.get('Content-Type', '')
+                    if HTML_CONTENT_TYPE.match(content_type):
+                        final_url = resp.geturl()
+                        data = resp.read()
+                        encoding = headers.get('Content-Encoding')
+                        if encoding:
+                            decoder = self.decoders[encoding]   # fail if not found
+                            data = decoder(data)
+                        encoding = 'utf-8'
+                        m = CHARSET.search(content_type)
+                        if m:
+                            encoding = m.group(1)
+                        try:
+                            data = data.decode(encoding)
+                        except UnicodeError:  # pragma: no cover
+                            data = data.decode('latin-1')    # fallback
+                        result = Page(data, final_url)
+                        self._page_cache[final_url] = result
+                except HTTPError as e:
+                    if e.code != 404:
+                        logger.exception('Fetch failed: %s: %s', url, e)
+                except URLError as e:  # pragma: no cover
+                    logger.exception('Fetch failed: %s: %s', url, e)
+                    with self._lock:
+                        self._bad_hosts.add(host)
+                except Exception as e:  # pragma: no cover
+                    logger.exception('Fetch failed: %s: %s', url, e)
+                finally:
+                    self._page_cache[url] = result   # even if None (failure)
+        return result
+
+    _distname_re = re.compile('<a href=[^>]*>([^<]+)<')
+
+    def get_distribution_names(self):
+        """
+        Return all the distribution names known to this locator.
+        """
+        result = set()
+        page = self.get_page(self.base_url)
+        if not page:
+            raise DistlibException('Unable to get %s' % self.base_url)
+        for match in self._distname_re.finditer(page.data):
+            result.add(match.group(1))
+        return result
+
+class DirectoryLocator(Locator):
+    """
+    This class locates distributions in a directory tree.
+    """
+
+    def __init__(self, path, **kwargs):
+        """
+        Initialise an instance.
+        :param path: The root of the directory tree to search.
+        :param kwargs: Passed to the superclass constructor,
+                       except for:
+                       * recursive - if True (the default), subdirectories are
+                         recursed into. If False, only the top-level directory
+                         is searched,
+        """
+        self.recursive = kwargs.pop('recursive', True)
+        super(DirectoryLocator, self).__init__(**kwargs)
+        path = os.path.abspath(path)
+        if not os.path.isdir(path):  # pragma: no cover
+            raise DistlibException('Not a directory: %r' % path)
+        self.base_dir = path
+
+    def should_include(self, filename, parent):
+        """
+        Should a filename be considered as a candidate for a distribution
+        archive? As well as the filename, the directory which contains it
+        is provided, though not used by the current implementation.
+        """
+        return filename.endswith(self.downloadable_extensions)
+
+    def _get_project(self, name):
+        result = {'urls': {}, 'digests': {}}
+        for root, dirs, files in os.walk(self.base_dir):
+            for fn in files:
+                if self.should_include(fn, root):
+                    fn = os.path.join(root, fn)
+                    url = urlunparse(('file', '',
+                                      pathname2url(os.path.abspath(fn)),
+                                      '', '', ''))
+                    info = self.convert_url_to_download_info(url, name)
+                    if info:
+                        self._update_version_data(result, info)
+            if not self.recursive:
+                break
+        return result
+
+    def get_distribution_names(self):
+        """
+        Return all the distribution names known to this locator.
+        """
+        result = set()
+        for root, dirs, files in os.walk(self.base_dir):
+            for fn in files:
+                if self.should_include(fn, root):
+                    fn = os.path.join(root, fn)
+                    url = urlunparse(('file', '',
+                                      pathname2url(os.path.abspath(fn)),
+                                      '', '', ''))
+                    info = self.convert_url_to_download_info(url, None)
+                    if info:
+                        result.add(info['name'])
+            if not self.recursive:
+                break
+        return result
+
+class JSONLocator(Locator):
+    """
+    This locator uses special extended metadata (not available on PyPI) and is
+    the basis of performant dependency resolution in distlib. Other locators
+    require archive downloads before dependencies can be determined! As you
+    might imagine, that can be slow.
+    """
+    def get_distribution_names(self):
+        """
+        Return all the distribution names known to this locator.
+        """
+        raise NotImplementedError('Not available from this locator')
+
+    def _get_project(self, name):
+        result = {'urls': {}, 'digests': {}}
+        data = get_project_data(name)
+        if data:
+            for info in data.get('files', []):
+                if info['ptype'] != 'sdist' or info['pyversion'] != 'source':
+                    continue
+                # We don't store summary in project metadata as it makes
+                # the data bigger for no benefit during dependency
+                # resolution
+                dist = make_dist(data['name'], info['version'],
+                                 summary=data.get('summary',
+                                                  'Placeholder for summary'),
+                                 scheme=self.scheme)
+                md = dist.metadata
+                md.source_url = info['url']
+                # TODO SHA256 digest
+                if 'digest' in info and info['digest']:
+                    dist.digest = ('md5', info['digest'])
+                md.dependencies = info.get('requirements', {})
+                dist.exports = info.get('exports', {})
+                result[dist.version] = dist
+                result['urls'].setdefault(dist.version, set()).add(info['url'])
+        return result
+
+class DistPathLocator(Locator):
+    """
+    This locator finds installed distributions in a path. It can be useful for
+    adding to an :class:`AggregatingLocator`.
+    """
+    def __init__(self, distpath, **kwargs):
+        """
+        Initialise an instance.
+
+        :param distpath: A :class:`DistributionPath` instance to search.
+        """
+        super(DistPathLocator, self).__init__(**kwargs)
+        assert isinstance(distpath, DistributionPath)
+        self.distpath = distpath
+
+    def _get_project(self, name):
+        dist = self.distpath.get_distribution(name)
+        if dist is None:
+            result = {'urls': {}, 'digests': {}}
+        else:
+            result = {
+                dist.version: dist,
+                'urls': {dist.version: set([dist.source_url])},
+                'digests': {dist.version: set([None])}
+            }
+        return result
+
+
+class AggregatingLocator(Locator):
+    """
+    This class allows you to chain and/or merge a list of locators.
+    """
+    def __init__(self, *locators, **kwargs):
+        """
+        Initialise an instance.
+
+        :param locators: The list of locators to search.
+        :param kwargs: Passed to the superclass constructor,
+                       except for:
+                       * merge - if False (the default), the first successful
+                         search from any of the locators is returned. If True,
+                         the results from all locators are merged (this can be
+                         slow).
+        """
+        self.merge = kwargs.pop('merge', False)
+        self.locators = locators
+        super(AggregatingLocator, self).__init__(**kwargs)
+
+    def clear_cache(self):
+        super(AggregatingLocator, self).clear_cache()
+        for locator in self.locators:
+            locator.clear_cache()
+
+    def _set_scheme(self, value):
+        self._scheme = value
+        for locator in self.locators:
+            locator.scheme = value
+
+    scheme = property(Locator.scheme.fget, _set_scheme)
+
+    def _get_project(self, name):
+        result = {}
+        for locator in self.locators:
+            d = locator.get_project(name)
+            if d:
+                if self.merge:
+                    files = result.get('urls', {})
+                    digests = result.get('digests', {})
+                    # next line could overwrite result['urls'], result['digests']
+                    result.update(d)
+                    df = result.get('urls')
+                    if files and df:
+                        for k, v in files.items():
+                            if k in df:
+                                df[k] |= v
+                            else:
+                                df[k] = v
+                    dd = result.get('digests')
+                    if digests and dd:
+                        dd.update(digests)
+                else:
+                    # See issue #18. If any dists are found and we're looking
+                    # for specific constraints, we only return something if
+                    # a match is found. For example, if a DirectoryLocator
+                    # returns just foo (1.0) while we're looking for
+                    # foo (>= 2.0), we'll pretend there was nothing there so
+                    # that subsequent locators can be queried. Otherwise we
+                    # would just return foo (1.0) which would then lead to a
+                    # failure to find foo (>= 2.0), because other locators
+                    # weren't searched. Note that this only matters when
+                    # merge=False.
+                    if self.matcher is None:
+                        found = True
+                    else:
+                        found = False
+                        for k in d:
+                            if self.matcher.match(k):
+                                found = True
+                                break
+                    if found:
+                        result = d
+                        break
+        return result
+
+    def get_distribution_names(self):
+        """
+        Return all the distribution names known to this locator.
+        """
+        result = set()
+        for locator in self.locators:
+            try:
+                result |= locator.get_distribution_names()
+            except NotImplementedError:
+                pass
+        return result
+
+
+# We use a legacy scheme simply because most of the dists on PyPI use legacy
+# versions which don't conform to PEP 426 / PEP 440.
+default_locator = AggregatingLocator(
+                    JSONLocator(),
+                    SimpleScrapingLocator('https://pypi.python.org/simple/',
+                                          timeout=3.0),
+                    scheme='legacy')
+
+locate = default_locator.locate
+
+NAME_VERSION_RE = re.compile(r'(?P<name>[\w-]+)\s*'
+                             r'\(\s*(==\s*)?(?P<ver>[^)]+)\)$')
+
+class DependencyFinder(object):
+    """
+    Locate dependencies for distributions.
+    """
+
+    def __init__(self, locator=None):
+        """
+        Initialise an instance, using the specified locator
+        to locate distributions.
+        """
+        self.locator = locator or default_locator
+        self.scheme = get_scheme(self.locator.scheme)
+
+    def add_distribution(self, dist):
+        """
+        Add a distribution to the finder. This will update internal information
+        about who provides what.
+        :param dist: The distribution to add.
+        """
+        logger.debug('adding distribution %s', dist)
+        name = dist.key
+        self.dists_by_name[name] = dist
+        self.dists[(name, dist.version)] = dist
+        for p in dist.provides:
+            name, version = parse_name_and_version(p)
+            logger.debug('Add to provided: %s, %s, %s', name, version, dist)
+            self.provided.setdefault(name, set()).add((version, dist))
+
+    def remove_distribution(self, dist):
+        """
+        Remove a distribution from the finder. This will update internal
+        information about who provides what.
+        :param dist: The distribution to remove.
+        """
+        logger.debug('removing distribution %s', dist)
+        name = dist.key
+        del self.dists_by_name[name]
+        del self.dists[(name, dist.version)]
+        for p in dist.provides:
+            name, version = parse_name_and_version(p)
+            logger.debug('Remove from provided: %s, %s, %s', name, version, dist)
+            s = self.provided[name]
+            s.remove((version, dist))
+            if not s:
+                del self.provided[name]
+
+    def get_matcher(self, reqt):
+        """
+        Get a version matcher for a requirement.
+        :param reqt: The requirement
+        :type reqt: str
+        :return: A version matcher (an instance of
+                 :class:`distlib.version.Matcher`).
+        """
+        try:
+            matcher = self.scheme.matcher(reqt)
+        except UnsupportedVersionError:  # pragma: no cover
+            # XXX compat-mode if cannot read the version
+            name = reqt.split()[0]
+            matcher = self.scheme.matcher(name)
+        return matcher
+
+    def find_providers(self, reqt):
+        """
+        Find the distributions which can fulfill a requirement.
+
+        :param reqt: The requirement.
+         :type reqt: str
+        :return: A set of distribution which can fulfill the requirement.
+        """
+        matcher = self.get_matcher(reqt)
+        name = matcher.key   # case-insensitive
+        result = set()
+        provided = self.provided
+        if name in provided:
+            for version, provider in provided[name]:
+                try:
+                    match = matcher.match(version)
+                except UnsupportedVersionError:
+                    match = False
+
+                if match:
+                    result.add(provider)
+                    break
+        return result
+
+    def try_to_replace(self, provider, other, problems):
+        """
+        Attempt to replace one provider with another. This is typically used
+        when resolving dependencies from multiple sources, e.g. A requires
+        (B >= 1.0) while C requires (B >= 1.1).
+
+        For successful replacement, ``provider`` must meet all the requirements
+        which ``other`` fulfills.
+
+        :param provider: The provider we are trying to replace with.
+        :param other: The provider we're trying to replace.
+        :param problems: If False is returned, this will contain what
+                         problems prevented replacement. This is currently
+                         a tuple of the literal string 'cantreplace',
+                         ``provider``, ``other``  and the set of requirements
+                         that ``provider`` couldn't fulfill.
+        :return: True if we can replace ``other`` with ``provider``, else
+                 False.
+        """
+        rlist = self.reqts[other]
+        unmatched = set()
+        for s in rlist:
+            matcher = self.get_matcher(s)
+            if not matcher.match(provider.version):
+                unmatched.add(s)
+        if unmatched:
+            # can't replace other with provider
+            problems.add(('cantreplace', provider, other,
+                          frozenset(unmatched)))
+            result = False
+        else:
+            # can replace other with provider
+            self.remove_distribution(other)
+            del self.reqts[other]
+            for s in rlist:
+                self.reqts.setdefault(provider, set()).add(s)
+            self.add_distribution(provider)
+            result = True
+        return result
+
+    def find(self, requirement, meta_extras=None, prereleases=False):
+        """
+        Find a distribution and all distributions it depends on.
+
+        :param requirement: The requirement specifying the distribution to
+                            find, or a Distribution instance.
+        :param meta_extras: A list of meta extras such as :test:, :build: and
+                            so on.
+        :param prereleases: If ``True``, allow pre-release versions to be
+                            returned - otherwise, don't return prereleases
+                            unless they're all that's available.
+
+        Return a set of :class:`Distribution` instances and a set of
+        problems.
+
+        The distributions returned should be such that they have the
+        :attr:`required` attribute set to ``True`` if they were
+        from the ``requirement`` passed to ``find()``, and they have the
+        :attr:`build_time_dependency` attribute set to ``True`` unless they
+        are post-installation dependencies of the ``requirement``.
+
+        The problems should be a tuple consisting of the string
+        ``'unsatisfied'`` and the requirement which couldn't be satisfied
+        by any distribution known to the locator.
+        """
+
+        self.provided = {}
+        self.dists = {}
+        self.dists_by_name = {}
+        self.reqts = {}
+
+        meta_extras = set(meta_extras or [])
+        if ':*:' in meta_extras:
+            meta_extras.remove(':*:')
+            # :meta: and :run: are implicitly included
+            meta_extras |= set([':test:', ':build:', ':dev:'])
+
+        if isinstance(requirement, Distribution):
+            dist = odist = requirement
+            logger.debug('passed %s as requirement', odist)
+        else:
+            dist = odist = self.locator.locate(requirement,
+                                               prereleases=prereleases)
+            if dist is None:
+                raise DistlibException('Unable to locate %r' % requirement)
+            logger.debug('located %s', odist)
+        dist.requested = True
+        problems = set()
+        todo = set([dist])
+        install_dists = set([odist])
+        while todo:
+            dist = todo.pop()
+            name = dist.key     # case-insensitive
+            if name not in self.dists_by_name:
+                self.add_distribution(dist)
+            else:
+                #import pdb; pdb.set_trace()
+                other = self.dists_by_name[name]
+                if other != dist:
+                    self.try_to_replace(dist, other, problems)
+
+            ireqts = dist.run_requires | dist.meta_requires
+            sreqts = dist.build_requires
+            ereqts = set()
+            if dist in install_dists:
+                for key in ('test', 'build', 'dev'):
+                    e = ':%s:' % key
+                    if e in meta_extras:
+                        ereqts |= getattr(dist, '%s_requires' % key)
+            all_reqts = ireqts | sreqts | ereqts
+            for r in all_reqts:
+                providers = self.find_providers(r)
+                if not providers:
+                    logger.debug('No providers found for %r', r)
+                    provider = self.locator.locate(r, prereleases=prereleases)
+                    # If no provider is found and we didn't consider
+                    # prereleases, consider them now.
+                    if provider is None and not prereleases:
+                        provider = self.locator.locate(r, prereleases=True)
+                    if provider is None:
+                        logger.debug('Cannot satisfy %r', r)
+                        problems.add(('unsatisfied', r))
+                    else:
+                        n, v = provider.key, provider.version
+                        if (n, v) not in self.dists:
+                            todo.add(provider)
+                        providers.add(provider)
+                        if r in ireqts and dist in install_dists:
+                            install_dists.add(provider)
+                            logger.debug('Adding %s to install_dists',
+                                         provider.name_and_version)
+                for p in providers:
+                    name = p.key
+                    if name not in self.dists_by_name:
+                        self.reqts.setdefault(p, set()).add(r)
+                    else:
+                        other = self.dists_by_name[name]
+                        if other != p:
+                            # see if other can be replaced by p
+                            self.try_to_replace(p, other, problems)
+
+        dists = set(self.dists.values())
+        for dist in dists:
+            dist.build_time_dependency = dist not in install_dists
+            if dist.build_time_dependency:
+                logger.debug('%s is a build-time dependency only.',
+                             dist.name_and_version)
+        logger.debug('find done for %s', odist)
+        return dists, problems
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/manifest.py b/vendor/pip-9.0.3/pip/_vendor/distlib/manifest.py
new file mode 100644
index 0000000000000000000000000000000000000000..9f0336453c8d01a6e250b37c7468435b71d555a1
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/manifest.py
@@ -0,0 +1,393 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012-2013 Python Software Foundation.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+"""
+Class representing the list of files in a distribution.
+
+Equivalent to distutils.filelist, but fixes some problems.
+"""
+import fnmatch
+import logging
+import os
+import re
+import sys
+
+from . import DistlibException
+from .compat import fsdecode
+from .util import convert_path
+
+
+__all__ = ['Manifest']
+
+logger = logging.getLogger(__name__)
+
+# a \ followed by some spaces + EOL
+_COLLAPSE_PATTERN = re.compile('\\\w*\n', re.M)
+_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S)
+
+#
+# Due to the different results returned by fnmatch.translate, we need
+# to do slightly different processing for Python 2.7 and 3.2 ... this needed
+# to be brought in for Python 3.6 onwards.
+#
+_PYTHON_VERSION = sys.version_info[:2]
+
+class Manifest(object):
+    """A list of files built by on exploring the filesystem and filtered by
+    applying various patterns to what we find there.
+    """
+
+    def __init__(self, base=None):
+        """
+        Initialise an instance.
+
+        :param base: The base directory to explore under.
+        """
+        self.base = os.path.abspath(os.path.normpath(base or os.getcwd()))
+        self.prefix = self.base + os.sep
+        self.allfiles = None
+        self.files = set()
+
+    #
+    # Public API
+    #
+
+    def findall(self):
+        """Find all files under the base and set ``allfiles`` to the absolute
+        pathnames of files found.
+        """
+        from stat import S_ISREG, S_ISDIR, S_ISLNK
+
+        self.allfiles = allfiles = []
+        root = self.base
+        stack = [root]
+        pop = stack.pop
+        push = stack.append
+
+        while stack:
+            root = pop()
+            names = os.listdir(root)
+
+            for name in names:
+                fullname = os.path.join(root, name)
+
+                # Avoid excess stat calls -- just one will do, thank you!
+                stat = os.stat(fullname)
+                mode = stat.st_mode
+                if S_ISREG(mode):
+                    allfiles.append(fsdecode(fullname))
+                elif S_ISDIR(mode) and not S_ISLNK(mode):
+                    push(fullname)
+
+    def add(self, item):
+        """
+        Add a file to the manifest.
+
+        :param item: The pathname to add. This can be relative to the base.
+        """
+        if not item.startswith(self.prefix):
+            item = os.path.join(self.base, item)
+        self.files.add(os.path.normpath(item))
+
+    def add_many(self, items):
+        """
+        Add a list of files to the manifest.
+
+        :param items: The pathnames to add. These can be relative to the base.
+        """
+        for item in items:
+            self.add(item)
+
+    def sorted(self, wantdirs=False):
+        """
+        Return sorted files in directory order
+        """
+
+        def add_dir(dirs, d):
+            dirs.add(d)
+            logger.debug('add_dir added %s', d)
+            if d != self.base:
+                parent, _ = os.path.split(d)
+                assert parent not in ('', '/')
+                add_dir(dirs, parent)
+
+        result = set(self.files)    # make a copy!
+        if wantdirs:
+            dirs = set()
+            for f in result:
+                add_dir(dirs, os.path.dirname(f))
+            result |= dirs
+        return [os.path.join(*path_tuple) for path_tuple in
+                sorted(os.path.split(path) for path in result)]
+
+    def clear(self):
+        """Clear all collected files."""
+        self.files = set()
+        self.allfiles = []
+
+    def process_directive(self, directive):
+        """
+        Process a directive which either adds some files from ``allfiles`` to
+        ``files``, or removes some files from ``files``.
+
+        :param directive: The directive to process. This should be in a format
+                     compatible with distutils ``MANIFEST.in`` files:
+
+                     http://docs.python.org/distutils/sourcedist.html#commands
+        """
+        # Parse the line: split it up, make sure the right number of words
+        # is there, and return the relevant words.  'action' is always
+        # defined: it's the first word of the line.  Which of the other
+        # three are defined depends on the action; it'll be either
+        # patterns, (dir and patterns), or (dirpattern).
+        action, patterns, thedir, dirpattern = self._parse_directive(directive)
+
+        # OK, now we know that the action is valid and we have the
+        # right number of words on the line for that action -- so we
+        # can proceed with minimal error-checking.
+        if action == 'include':
+            for pattern in patterns:
+                if not self._include_pattern(pattern, anchor=True):
+                    logger.warning('no files found matching %r', pattern)
+
+        elif action == 'exclude':
+            for pattern in patterns:
+                found = self._exclude_pattern(pattern, anchor=True)
+                #if not found:
+                #    logger.warning('no previously-included files '
+                #                   'found matching %r', pattern)
+
+        elif action == 'global-include':
+            for pattern in patterns:
+                if not self._include_pattern(pattern, anchor=False):
+                    logger.warning('no files found matching %r '
+                                   'anywhere in distribution', pattern)
+
+        elif action == 'global-exclude':
+            for pattern in patterns:
+                found = self._exclude_pattern(pattern, anchor=False)
+                #if not found:
+                #    logger.warning('no previously-included files '
+                #                   'matching %r found anywhere in '
+                #                   'distribution', pattern)
+
+        elif action == 'recursive-include':
+            for pattern in patterns:
+                if not self._include_pattern(pattern, prefix=thedir):
+                    logger.warning('no files found matching %r '
+                                   'under directory %r', pattern, thedir)
+
+        elif action == 'recursive-exclude':
+            for pattern in patterns:
+                found = self._exclude_pattern(pattern, prefix=thedir)
+                #if not found:
+                #    logger.warning('no previously-included files '
+                #                   'matching %r found under directory %r',
+                #                   pattern, thedir)
+
+        elif action == 'graft':
+            if not self._include_pattern(None, prefix=dirpattern):
+                logger.warning('no directories found matching %r',
+                               dirpattern)
+
+        elif action == 'prune':
+            if not self._exclude_pattern(None, prefix=dirpattern):
+                logger.warning('no previously-included directories found '
+                               'matching %r', dirpattern)
+        else:   # pragma: no cover
+            # This should never happen, as it should be caught in
+            # _parse_template_line
+            raise DistlibException(
+                'invalid action %r' % action)
+
+    #
+    # Private API
+    #
+
+    def _parse_directive(self, directive):
+        """
+        Validate a directive.
+        :param directive: The directive to validate.
+        :return: A tuple of action, patterns, thedir, dir_patterns
+        """
+        words = directive.split()
+        if len(words) == 1 and words[0] not in ('include', 'exclude',
+                                                'global-include',
+                                                'global-exclude',
+                                                'recursive-include',
+                                                'recursive-exclude',
+                                                'graft', 'prune'):
+            # no action given, let's use the default 'include'
+            words.insert(0, 'include')
+
+        action = words[0]
+        patterns = thedir = dir_pattern = None
+
+        if action in ('include', 'exclude',
+                      'global-include', 'global-exclude'):
+            if len(words) < 2:
+                raise DistlibException(
+                    '%r expects <pattern1> <pattern2> ...' % action)
+
+            patterns = [convert_path(word) for word in words[1:]]
+
+        elif action in ('recursive-include', 'recursive-exclude'):
+            if len(words) < 3:
+                raise DistlibException(
+                    '%r expects <dir> <pattern1> <pattern2> ...' % action)
+
+            thedir = convert_path(words[1])
+            patterns = [convert_path(word) for word in words[2:]]
+
+        elif action in ('graft', 'prune'):
+            if len(words) != 2:
+                raise DistlibException(
+                    '%r expects a single <dir_pattern>' % action)
+
+            dir_pattern = convert_path(words[1])
+
+        else:
+            raise DistlibException('unknown action %r' % action)
+
+        return action, patterns, thedir, dir_pattern
+
+    def _include_pattern(self, pattern, anchor=True, prefix=None,
+                         is_regex=False):
+        """Select strings (presumably filenames) from 'self.files' that
+        match 'pattern', a Unix-style wildcard (glob) pattern.
+
+        Patterns are not quite the same as implemented by the 'fnmatch'
+        module: '*' and '?'  match non-special characters, where "special"
+        is platform-dependent: slash on Unix; colon, slash, and backslash on
+        DOS/Windows; and colon on Mac OS.
+
+        If 'anchor' is true (the default), then the pattern match is more
+        stringent: "*.py" will match "foo.py" but not "foo/bar.py".  If
+        'anchor' is false, both of these will match.
+
+        If 'prefix' is supplied, then only filenames starting with 'prefix'
+        (itself a pattern) and ending with 'pattern', with anything in between
+        them, will match.  'anchor' is ignored in this case.
+
+        If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and
+        'pattern' is assumed to be either a string containing a regex or a
+        regex object -- no translation is done, the regex is just compiled
+        and used as-is.
+
+        Selected strings will be added to self.files.
+
+        Return True if files are found.
+        """
+        # XXX docstring lying about what the special chars are?
+        found = False
+        pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex)
+
+        # delayed loading of allfiles list
+        if self.allfiles is None:
+            self.findall()
+
+        for name in self.allfiles:
+            if pattern_re.search(name):
+                self.files.add(name)
+                found = True
+        return found
+
+    def _exclude_pattern(self, pattern, anchor=True, prefix=None,
+                         is_regex=False):
+        """Remove strings (presumably filenames) from 'files' that match
+        'pattern'.
+
+        Other parameters are the same as for 'include_pattern()', above.
+        The list 'self.files' is modified in place. Return True if files are
+        found.
+
+        This API is public to allow e.g. exclusion of SCM subdirs, e.g. when
+        packaging source distributions
+        """
+        found = False
+        pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex)
+        for f in list(self.files):
+            if pattern_re.search(f):
+                self.files.remove(f)
+                found = True
+        return found
+
+    def _translate_pattern(self, pattern, anchor=True, prefix=None,
+                           is_regex=False):
+        """Translate a shell-like wildcard pattern to a compiled regular
+        expression.
+
+        Return the compiled regex.  If 'is_regex' true,
+        then 'pattern' is directly compiled to a regex (if it's a string)
+        or just returned as-is (assumes it's a regex object).
+        """
+        if is_regex:
+            if isinstance(pattern, str):
+                return re.compile(pattern)
+            else:
+                return pattern
+
+        if _PYTHON_VERSION > (3, 2):
+            # ditch start and end characters
+            start, _, end = self._glob_to_re('_').partition('_')
+
+        if pattern:
+            pattern_re = self._glob_to_re(pattern)
+            if _PYTHON_VERSION > (3, 2):
+                assert pattern_re.startswith(start) and pattern_re.endswith(end)
+        else:
+            pattern_re = ''
+
+        base = re.escape(os.path.join(self.base, ''))
+        if prefix is not None:
+            # ditch end of pattern character
+            if _PYTHON_VERSION <= (3, 2):
+                empty_pattern = self._glob_to_re('')
+                prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)]
+            else:
+                prefix_re = self._glob_to_re(prefix)
+                assert prefix_re.startswith(start) and prefix_re.endswith(end)
+                prefix_re = prefix_re[len(start): len(prefix_re) - len(end)]
+            sep = os.sep
+            if os.sep == '\\':
+                sep = r'\\'
+            if _PYTHON_VERSION <= (3, 2):
+                pattern_re = '^' + base + sep.join((prefix_re,
+                                                    '.*' + pattern_re))
+            else:
+                pattern_re = pattern_re[len(start): len(pattern_re) - len(end)]
+                pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep,
+                                                  pattern_re, end)
+        else:  # no prefix -- respect anchor flag
+            if anchor:
+                if _PYTHON_VERSION <= (3, 2):
+                    pattern_re = '^' + base + pattern_re
+                else:
+                    pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):])
+
+        return re.compile(pattern_re)
+
+    def _glob_to_re(self, pattern):
+        """Translate a shell-like glob pattern to a regular expression.
+
+        Return a string containing the regex.  Differs from
+        'fnmatch.translate()' in that '*' does not match "special characters"
+        (which are platform-specific).
+        """
+        pattern_re = fnmatch.translate(pattern)
+
+        # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which
+        # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix,
+        # and by extension they shouldn't match such "special characters" under
+        # any OS.  So change all non-escaped dots in the RE to match any
+        # character except the special characters (currently: just os.sep).
+        sep = os.sep
+        if os.sep == '\\':
+            # we're using a regex to manipulate a regex, so we need
+            # to escape the backslash twice
+            sep = r'\\\\'
+        escaped = r'\1[^%s]' % sep
+        pattern_re = re.sub(r'((?<!\\)(\\\\)*)\.', escaped, pattern_re)
+        return pattern_re
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/markers.py b/vendor/pip-9.0.3/pip/_vendor/distlib/markers.py
new file mode 100644
index 0000000000000000000000000000000000000000..afb19c62e02f7a24e971351e0a8c2ccb08d382cb
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/markers.py
@@ -0,0 +1,190 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012-2013 Vinay Sajip.
+# Licensed to the Python Software Foundation under a contributor agreement.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+"""Parser for the environment markers micro-language defined in PEP 345."""
+
+import ast
+import os
+import sys
+import platform
+
+from .compat import python_implementation, string_types
+from .util import in_venv
+
+__all__ = ['interpret']
+
+
+class Evaluator(object):
+    """
+    A limited evaluator for Python expressions.
+    """
+
+    operators = {
+        'eq': lambda x, y: x == y,
+        'gt': lambda x, y: x > y,
+        'gte': lambda x, y: x >= y,
+        'in': lambda x, y: x in y,
+        'lt': lambda x, y: x < y,
+        'lte': lambda x, y: x <= y,
+        'not': lambda x: not x,
+        'noteq': lambda x, y: x != y,
+        'notin': lambda x, y: x not in y,
+    }
+
+    allowed_values = {
+        'sys_platform': sys.platform,
+        'python_version': '%s.%s' % sys.version_info[:2],
+        # parsing sys.platform is not reliable, but there is no other
+        # way to get e.g. 2.7.2+, and the PEP is defined with sys.version
+        'python_full_version': sys.version.split(' ', 1)[0],
+        'os_name': os.name,
+        'platform_in_venv': str(in_venv()),
+        'platform_release': platform.release(),
+        'platform_version': platform.version(),
+        'platform_machine': platform.machine(),
+        'platform_python_implementation': python_implementation(),
+    }
+
+    def __init__(self, context=None):
+        """
+        Initialise an instance.
+
+        :param context: If specified, names are looked up in this mapping.
+        """
+        self.context = context or {}
+        self.source = None
+
+    def get_fragment(self, offset):
+        """
+        Get the part of the source which is causing a problem.
+        """
+        fragment_len = 10
+        s = '%r' % (self.source[offset:offset + fragment_len])
+        if offset + fragment_len < len(self.source):
+            s += '...'
+        return s
+
+    def get_handler(self, node_type):
+        """
+        Get a handler for the specified AST node type.
+        """
+        return getattr(self, 'do_%s' % node_type, None)
+
+    def evaluate(self, node, filename=None):
+        """
+        Evaluate a source string or node, using ``filename`` when
+        displaying errors.
+        """
+        if isinstance(node, string_types):
+            self.source = node
+            kwargs = {'mode': 'eval'}
+            if filename:
+                kwargs['filename'] = filename
+            try:
+                node = ast.parse(node, **kwargs)
+            except SyntaxError as e:
+                s = self.get_fragment(e.offset)
+                raise SyntaxError('syntax error %s' % s)
+        node_type = node.__class__.__name__.lower()
+        handler = self.get_handler(node_type)
+        if handler is None:
+            if self.source is None:
+                s = '(source not available)'
+            else:
+                s = self.get_fragment(node.col_offset)
+            raise SyntaxError("don't know how to evaluate %r %s" % (
+                node_type, s))
+        return handler(node)
+
+    def get_attr_key(self, node):
+        assert isinstance(node, ast.Attribute), 'attribute node expected'
+        return '%s.%s' % (node.value.id, node.attr)
+
+    def do_attribute(self, node):
+        if not isinstance(node.value, ast.Name):
+            valid = False
+        else:
+            key = self.get_attr_key(node)
+            valid = key in self.context or key in self.allowed_values
+        if not valid:
+            raise SyntaxError('invalid expression: %s' % key)
+        if key in self.context:
+            result = self.context[key]
+        else:
+            result = self.allowed_values[key]
+        return result
+
+    def do_boolop(self, node):
+        result = self.evaluate(node.values[0])
+        is_or = node.op.__class__ is ast.Or
+        is_and = node.op.__class__ is ast.And
+        assert is_or or is_and
+        if (is_and and result) or (is_or and not result):
+            for n in node.values[1:]:
+                result = self.evaluate(n)
+                if (is_or and result) or (is_and and not result):
+                    break
+        return result
+
+    def do_compare(self, node):
+        def sanity_check(lhsnode, rhsnode):
+            valid = True
+            if isinstance(lhsnode, ast.Str) and isinstance(rhsnode, ast.Str):
+                valid = False
+            #elif (isinstance(lhsnode, ast.Attribute)
+            #      and isinstance(rhsnode, ast.Attribute)):
+            #    klhs = self.get_attr_key(lhsnode)
+            #    krhs = self.get_attr_key(rhsnode)
+            #    valid = klhs != krhs
+            if not valid:
+                s = self.get_fragment(node.col_offset)
+                raise SyntaxError('Invalid comparison: %s' % s)
+
+        lhsnode = node.left
+        lhs = self.evaluate(lhsnode)
+        result = True
+        for op, rhsnode in zip(node.ops, node.comparators):
+            sanity_check(lhsnode, rhsnode)
+            op = op.__class__.__name__.lower()
+            if op not in self.operators:
+                raise SyntaxError('unsupported operation: %r' % op)
+            rhs = self.evaluate(rhsnode)
+            result = self.operators[op](lhs, rhs)
+            if not result:
+                break
+            lhs = rhs
+            lhsnode = rhsnode
+        return result
+
+    def do_expression(self, node):
+        return self.evaluate(node.body)
+
+    def do_name(self, node):
+        valid = False
+        if node.id in self.context:
+            valid = True
+            result = self.context[node.id]
+        elif node.id in self.allowed_values:
+            valid = True
+            result = self.allowed_values[node.id]
+        if not valid:
+            raise SyntaxError('invalid expression: %s' % node.id)
+        return result
+
+    def do_str(self, node):
+        return node.s
+
+
+def interpret(marker, execution_context=None):
+    """
+    Interpret a marker and return a result depending on environment.
+
+    :param marker: The marker to interpret.
+    :type marker: str
+    :param execution_context: The context used for name lookup.
+    :type execution_context: mapping
+    """
+    return Evaluator(execution_context).evaluate(marker.strip())
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/metadata.py b/vendor/pip-9.0.3/pip/_vendor/distlib/metadata.py
new file mode 100644
index 0000000000000000000000000000000000000000..75bfd68ec78bd9112f699b4509491a9cf747f622
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/metadata.py
@@ -0,0 +1,1068 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012 The Python Software Foundation.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+"""Implementation of the Metadata for Python packages PEPs.
+
+Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental).
+"""
+from __future__ import unicode_literals
+
+import codecs
+from email import message_from_file
+import json
+import logging
+import re
+
+
+from . import DistlibException, __version__
+from .compat import StringIO, string_types, text_type
+from .markers import interpret
+from .util import extract_by_key, get_extras
+from .version import get_scheme, PEP440_VERSION_RE
+
+logger = logging.getLogger(__name__)
+
+
+class MetadataMissingError(DistlibException):
+    """A required metadata is missing"""
+
+
+class MetadataConflictError(DistlibException):
+    """Attempt to read or write metadata fields that are conflictual."""
+
+
+class MetadataUnrecognizedVersionError(DistlibException):
+    """Unknown metadata version number."""
+
+
+class MetadataInvalidError(DistlibException):
+    """A metadata value is invalid"""
+
+# public API of this module
+__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION']
+
+# Encoding used for the PKG-INFO files
+PKG_INFO_ENCODING = 'utf-8'
+
+# preferred version. Hopefully will be changed
+# to 1.2 once PEP 345 is supported everywhere
+PKG_INFO_PREFERRED_VERSION = '1.1'
+
+_LINE_PREFIX_1_2 = re.compile('\n       \|')
+_LINE_PREFIX_PRE_1_2 = re.compile('\n        ')
+_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
+               'Summary', 'Description',
+               'Keywords', 'Home-page', 'Author', 'Author-email',
+               'License')
+
+_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
+               'Supported-Platform', 'Summary', 'Description',
+               'Keywords', 'Home-page', 'Author', 'Author-email',
+               'License', 'Classifier', 'Download-URL', 'Obsoletes',
+               'Provides', 'Requires')
+
+_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier',
+                'Download-URL')
+
+_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
+               'Supported-Platform', 'Summary', 'Description',
+               'Keywords', 'Home-page', 'Author', 'Author-email',
+               'Maintainer', 'Maintainer-email', 'License',
+               'Classifier', 'Download-URL', 'Obsoletes-Dist',
+               'Project-URL', 'Provides-Dist', 'Requires-Dist',
+               'Requires-Python', 'Requires-External')
+
+_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python',
+                'Obsoletes-Dist', 'Requires-External', 'Maintainer',
+                'Maintainer-email', 'Project-URL')
+
+_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
+               'Supported-Platform', 'Summary', 'Description',
+               'Keywords', 'Home-page', 'Author', 'Author-email',
+               'Maintainer', 'Maintainer-email', 'License',
+               'Classifier', 'Download-URL', 'Obsoletes-Dist',
+               'Project-URL', 'Provides-Dist', 'Requires-Dist',
+               'Requires-Python', 'Requires-External', 'Private-Version',
+               'Obsoleted-By', 'Setup-Requires-Dist', 'Extension',
+               'Provides-Extra')
+
+_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By',
+                'Setup-Requires-Dist', 'Extension')
+
+_ALL_FIELDS = set()
+_ALL_FIELDS.update(_241_FIELDS)
+_ALL_FIELDS.update(_314_FIELDS)
+_ALL_FIELDS.update(_345_FIELDS)
+_ALL_FIELDS.update(_426_FIELDS)
+
+EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''')
+
+
+def _version2fieldlist(version):
+    if version == '1.0':
+        return _241_FIELDS
+    elif version == '1.1':
+        return _314_FIELDS
+    elif version == '1.2':
+        return _345_FIELDS
+    elif version == '2.0':
+        return _426_FIELDS
+    raise MetadataUnrecognizedVersionError(version)
+
+
+def _best_version(fields):
+    """Detect the best version depending on the fields used."""
+    def _has_marker(keys, markers):
+        for marker in markers:
+            if marker in keys:
+                return True
+        return False
+
+    keys = []
+    for key, value in fields.items():
+        if value in ([], 'UNKNOWN', None):
+            continue
+        keys.append(key)
+
+    possible_versions = ['1.0', '1.1', '1.2', '2.0']
+
+    # first let's try to see if a field is not part of one of the version
+    for key in keys:
+        if key not in _241_FIELDS and '1.0' in possible_versions:
+            possible_versions.remove('1.0')
+        if key not in _314_FIELDS and '1.1' in possible_versions:
+            possible_versions.remove('1.1')
+        if key not in _345_FIELDS and '1.2' in possible_versions:
+            possible_versions.remove('1.2')
+        if key not in _426_FIELDS and '2.0' in possible_versions:
+            possible_versions.remove('2.0')
+
+    # possible_version contains qualified versions
+    if len(possible_versions) == 1:
+        return possible_versions[0]   # found !
+    elif len(possible_versions) == 0:
+        raise MetadataConflictError('Unknown metadata set')
+
+    # let's see if one unique marker is found
+    is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS)
+    is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS)
+    is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS)
+    if int(is_1_1) + int(is_1_2) + int(is_2_0) > 1:
+        raise MetadataConflictError('You used incompatible 1.1/1.2/2.0 fields')
+
+    # we have the choice, 1.0, or 1.2, or 2.0
+    #   - 1.0 has a broken Summary field but works with all tools
+    #   - 1.1 is to avoid
+    #   - 1.2 fixes Summary but has little adoption
+    #   - 2.0 adds more features and is very new
+    if not is_1_1 and not is_1_2 and not is_2_0:
+        # we couldn't find any specific marker
+        if PKG_INFO_PREFERRED_VERSION in possible_versions:
+            return PKG_INFO_PREFERRED_VERSION
+    if is_1_1:
+        return '1.1'
+    if is_1_2:
+        return '1.2'
+
+    return '2.0'
+
+_ATTR2FIELD = {
+    'metadata_version': 'Metadata-Version',
+    'name': 'Name',
+    'version': 'Version',
+    'platform': 'Platform',
+    'supported_platform': 'Supported-Platform',
+    'summary': 'Summary',
+    'description': 'Description',
+    'keywords': 'Keywords',
+    'home_page': 'Home-page',
+    'author': 'Author',
+    'author_email': 'Author-email',
+    'maintainer': 'Maintainer',
+    'maintainer_email': 'Maintainer-email',
+    'license': 'License',
+    'classifier': 'Classifier',
+    'download_url': 'Download-URL',
+    'obsoletes_dist': 'Obsoletes-Dist',
+    'provides_dist': 'Provides-Dist',
+    'requires_dist': 'Requires-Dist',
+    'setup_requires_dist': 'Setup-Requires-Dist',
+    'requires_python': 'Requires-Python',
+    'requires_external': 'Requires-External',
+    'requires': 'Requires',
+    'provides': 'Provides',
+    'obsoletes': 'Obsoletes',
+    'project_url': 'Project-URL',
+    'private_version': 'Private-Version',
+    'obsoleted_by': 'Obsoleted-By',
+    'extension': 'Extension',
+    'provides_extra': 'Provides-Extra',
+}
+
+_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist')
+_VERSIONS_FIELDS = ('Requires-Python',)
+_VERSION_FIELDS = ('Version',)
+_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes',
+               'Requires', 'Provides', 'Obsoletes-Dist',
+               'Provides-Dist', 'Requires-Dist', 'Requires-External',
+               'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist',
+               'Provides-Extra', 'Extension')
+_LISTTUPLEFIELDS = ('Project-URL',)
+
+_ELEMENTSFIELD = ('Keywords',)
+
+_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description')
+
+_MISSING = object()
+
+_FILESAFE = re.compile('[^A-Za-z0-9.]+')
+
+
+def _get_name_and_version(name, version, for_filename=False):
+    """Return the distribution name with version.
+
+    If for_filename is true, return a filename-escaped form."""
+    if for_filename:
+        # For both name and version any runs of non-alphanumeric or '.'
+        # characters are replaced with a single '-'.  Additionally any
+        # spaces in the version string become '.'
+        name = _FILESAFE.sub('-', name)
+        version = _FILESAFE.sub('-', version.replace(' ', '.'))
+    return '%s-%s' % (name, version)
+
+
+class LegacyMetadata(object):
+    """The legacy metadata of a release.
+
+    Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can
+    instantiate the class with one of these arguments (or none):
+    - *path*, the path to a metadata file
+    - *fileobj* give a file-like object with metadata as content
+    - *mapping* is a dict-like object
+    - *scheme* is a version scheme name
+    """
+    # TODO document the mapping API and UNKNOWN default key
+
+    def __init__(self, path=None, fileobj=None, mapping=None,
+                 scheme='default'):
+        if [path, fileobj, mapping].count(None) < 2:
+            raise TypeError('path, fileobj and mapping are exclusive')
+        self._fields = {}
+        self.requires_files = []
+        self._dependencies = None
+        self.scheme = scheme
+        if path is not None:
+            self.read(path)
+        elif fileobj is not None:
+            self.read_file(fileobj)
+        elif mapping is not None:
+            self.update(mapping)
+            self.set_metadata_version()
+
+    def set_metadata_version(self):
+        self._fields['Metadata-Version'] = _best_version(self._fields)
+
+    def _write_field(self, fileobj, name, value):
+        fileobj.write('%s: %s\n' % (name, value))
+
+    def __getitem__(self, name):
+        return self.get(name)
+
+    def __setitem__(self, name, value):
+        return self.set(name, value)
+
+    def __delitem__(self, name):
+        field_name = self._convert_name(name)
+        try:
+            del self._fields[field_name]
+        except KeyError:
+            raise KeyError(name)
+
+    def __contains__(self, name):
+        return (name in self._fields or
+                self._convert_name(name) in self._fields)
+
+    def _convert_name(self, name):
+        if name in _ALL_FIELDS:
+            return name
+        name = name.replace('-', '_').lower()
+        return _ATTR2FIELD.get(name, name)
+
+    def _default_value(self, name):
+        if name in _LISTFIELDS or name in _ELEMENTSFIELD:
+            return []
+        return 'UNKNOWN'
+
+    def _remove_line_prefix(self, value):
+        if self.metadata_version in ('1.0', '1.1'):
+            return _LINE_PREFIX_PRE_1_2.sub('\n', value)
+        else:
+            return _LINE_PREFIX_1_2.sub('\n', value)
+
+    def __getattr__(self, name):
+        if name in _ATTR2FIELD:
+            return self[name]
+        raise AttributeError(name)
+
+    #
+    # Public API
+    #
+
+#    dependencies = property(_get_dependencies, _set_dependencies)
+
+    def get_fullname(self, filesafe=False):
+        """Return the distribution name with version.
+
+        If filesafe is true, return a filename-escaped form."""
+        return _get_name_and_version(self['Name'], self['Version'], filesafe)
+
+    def is_field(self, name):
+        """return True if name is a valid metadata key"""
+        name = self._convert_name(name)
+        return name in _ALL_FIELDS
+
+    def is_multi_field(self, name):
+        name = self._convert_name(name)
+        return name in _LISTFIELDS
+
+    def read(self, filepath):
+        """Read the metadata values from a file path."""
+        fp = codecs.open(filepath, 'r', encoding='utf-8')
+        try:
+            self.read_file(fp)
+        finally:
+            fp.close()
+
+    def read_file(self, fileob):
+        """Read the metadata values from a file object."""
+        msg = message_from_file(fileob)
+        self._fields['Metadata-Version'] = msg['metadata-version']
+
+        # When reading, get all the fields we can
+        for field in _ALL_FIELDS:
+            if field not in msg:
+                continue
+            if field in _LISTFIELDS:
+                # we can have multiple lines
+                values = msg.get_all(field)
+                if field in _LISTTUPLEFIELDS and values is not None:
+                    values = [tuple(value.split(',')) for value in values]
+                self.set(field, values)
+            else:
+                # single line
+                value = msg[field]
+                if value is not None and value != 'UNKNOWN':
+                    self.set(field, value)
+        self.set_metadata_version()
+
+    def write(self, filepath, skip_unknown=False):
+        """Write the metadata fields to filepath."""
+        fp = codecs.open(filepath, 'w', encoding='utf-8')
+        try:
+            self.write_file(fp, skip_unknown)
+        finally:
+            fp.close()
+
+    def write_file(self, fileobject, skip_unknown=False):
+        """Write the PKG-INFO format data to a file object."""
+        self.set_metadata_version()
+
+        for field in _version2fieldlist(self['Metadata-Version']):
+            values = self.get(field)
+            if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']):
+                continue
+            if field in _ELEMENTSFIELD:
+                self._write_field(fileobject, field, ','.join(values))
+                continue
+            if field not in _LISTFIELDS:
+                if field == 'Description':
+                    if self.metadata_version in ('1.0', '1.1'):
+                        values = values.replace('\n', '\n        ')
+                    else:
+                        values = values.replace('\n', '\n       |')
+                values = [values]
+
+            if field in _LISTTUPLEFIELDS:
+                values = [','.join(value) for value in values]
+
+            for value in values:
+                self._write_field(fileobject, field, value)
+
+    def update(self, other=None, **kwargs):
+        """Set metadata values from the given iterable `other` and kwargs.
+
+        Behavior is like `dict.update`: If `other` has a ``keys`` method,
+        they are looped over and ``self[key]`` is assigned ``other[key]``.
+        Else, ``other`` is an iterable of ``(key, value)`` iterables.
+
+        Keys that don't match a metadata field or that have an empty value are
+        dropped.
+        """
+        def _set(key, value):
+            if key in _ATTR2FIELD and value:
+                self.set(self._convert_name(key), value)
+
+        if not other:
+            # other is None or empty container
+            pass
+        elif hasattr(other, 'keys'):
+            for k in other.keys():
+                _set(k, other[k])
+        else:
+            for k, v in other:
+                _set(k, v)
+
+        if kwargs:
+            for k, v in kwargs.items():
+                _set(k, v)
+
+    def set(self, name, value):
+        """Control then set a metadata field."""
+        name = self._convert_name(name)
+
+        if ((name in _ELEMENTSFIELD or name == 'Platform') and
+            not isinstance(value, (list, tuple))):
+            if isinstance(value, string_types):
+                value = [v.strip() for v in value.split(',')]
+            else:
+                value = []
+        elif (name in _LISTFIELDS and
+              not isinstance(value, (list, tuple))):
+            if isinstance(value, string_types):
+                value = [value]
+            else:
+                value = []
+
+        if logger.isEnabledFor(logging.WARNING):
+            project_name = self['Name']
+
+            scheme = get_scheme(self.scheme)
+            if name in _PREDICATE_FIELDS and value is not None:
+                for v in value:
+                    # check that the values are valid
+                    if not scheme.is_valid_matcher(v.split(';')[0]):
+                        logger.warning(
+                            "'%s': '%s' is not valid (field '%s')",
+                            project_name, v, name)
+            # FIXME this rejects UNKNOWN, is that right?
+            elif name in _VERSIONS_FIELDS and value is not None:
+                if not scheme.is_valid_constraint_list(value):
+                    logger.warning("'%s': '%s' is not a valid version (field '%s')",
+                                   project_name, value, name)
+            elif name in _VERSION_FIELDS and value is not None:
+                if not scheme.is_valid_version(value):
+                    logger.warning("'%s': '%s' is not a valid version (field '%s')",
+                                   project_name, value, name)
+
+        if name in _UNICODEFIELDS:
+            if name == 'Description':
+                value = self._remove_line_prefix(value)
+
+        self._fields[name] = value
+
+    def get(self, name, default=_MISSING):
+        """Get a metadata field."""
+        name = self._convert_name(name)
+        if name not in self._fields:
+            if default is _MISSING:
+                default = self._default_value(name)
+            return default
+        if name in _UNICODEFIELDS:
+            value = self._fields[name]
+            return value
+        elif name in _LISTFIELDS:
+            value = self._fields[name]
+            if value is None:
+                return []
+            res = []
+            for val in value:
+                if name not in _LISTTUPLEFIELDS:
+                    res.append(val)
+                else:
+                    # That's for Project-URL
+                    res.append((val[0], val[1]))
+            return res
+
+        elif name in _ELEMENTSFIELD:
+            value = self._fields[name]
+            if isinstance(value, string_types):
+                return value.split(',')
+        return self._fields[name]
+
+    def check(self, strict=False):
+        """Check if the metadata is compliant. If strict is True then raise if
+        no Name or Version are provided"""
+        self.set_metadata_version()
+
+        # XXX should check the versions (if the file was loaded)
+        missing, warnings = [], []
+
+        for attr in ('Name', 'Version'):  # required by PEP 345
+            if attr not in self:
+                missing.append(attr)
+
+        if strict and missing != []:
+            msg = 'missing required metadata: %s' % ', '.join(missing)
+            raise MetadataMissingError(msg)
+
+        for attr in ('Home-page', 'Author'):
+            if attr not in self:
+                missing.append(attr)
+
+        # checking metadata 1.2 (XXX needs to check 1.1, 1.0)
+        if self['Metadata-Version'] != '1.2':
+            return missing, warnings
+
+        scheme = get_scheme(self.scheme)
+
+        def are_valid_constraints(value):
+            for v in value:
+                if not scheme.is_valid_matcher(v.split(';')[0]):
+                    return False
+            return True
+
+        for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints),
+                                   (_VERSIONS_FIELDS,
+                                    scheme.is_valid_constraint_list),
+                                   (_VERSION_FIELDS,
+                                    scheme.is_valid_version)):
+            for field in fields:
+                value = self.get(field, None)
+                if value is not None and not controller(value):
+                    warnings.append("Wrong value for '%s': %s" % (field, value))
+
+        return missing, warnings
+
+    def todict(self, skip_missing=False):
+        """Return fields as a dict.
+
+        Field names will be converted to use the underscore-lowercase style
+        instead of hyphen-mixed case (i.e. home_page instead of Home-page).
+        """
+        self.set_metadata_version()
+
+        mapping_1_0 = (
+            ('metadata_version', 'Metadata-Version'),
+            ('name', 'Name'),
+            ('version', 'Version'),
+            ('summary', 'Summary'),
+            ('home_page', 'Home-page'),
+            ('author', 'Author'),
+            ('author_email', 'Author-email'),
+            ('license', 'License'),
+            ('description', 'Description'),
+            ('keywords', 'Keywords'),
+            ('platform', 'Platform'),
+            ('classifiers', 'Classifier'),
+            ('download_url', 'Download-URL'),
+        )
+
+        data = {}
+        for key, field_name in mapping_1_0:
+            if not skip_missing or field_name in self._fields:
+                data[key] = self[field_name]
+
+        if self['Metadata-Version'] == '1.2':
+            mapping_1_2 = (
+                ('requires_dist', 'Requires-Dist'),
+                ('requires_python', 'Requires-Python'),
+                ('requires_external', 'Requires-External'),
+                ('provides_dist', 'Provides-Dist'),
+                ('obsoletes_dist', 'Obsoletes-Dist'),
+                ('project_url', 'Project-URL'),
+                ('maintainer', 'Maintainer'),
+                ('maintainer_email', 'Maintainer-email'),
+            )
+            for key, field_name in mapping_1_2:
+                if not skip_missing or field_name in self._fields:
+                    if key != 'project_url':
+                        data[key] = self[field_name]
+                    else:
+                        data[key] = [','.join(u) for u in self[field_name]]
+
+        elif self['Metadata-Version'] == '1.1':
+            mapping_1_1 = (
+                ('provides', 'Provides'),
+                ('requires', 'Requires'),
+                ('obsoletes', 'Obsoletes'),
+            )
+            for key, field_name in mapping_1_1:
+                if not skip_missing or field_name in self._fields:
+                    data[key] = self[field_name]
+
+        return data
+
+    def add_requirements(self, requirements):
+        if self['Metadata-Version'] == '1.1':
+            # we can't have 1.1 metadata *and* Setuptools requires
+            for field in ('Obsoletes', 'Requires', 'Provides'):
+                if field in self:
+                    del self[field]
+        self['Requires-Dist'] += requirements
+
+    # Mapping API
+    # TODO could add iter* variants
+
+    def keys(self):
+        return list(_version2fieldlist(self['Metadata-Version']))
+
+    def __iter__(self):
+        for key in self.keys():
+            yield key
+
+    def values(self):
+        return [self[key] for key in self.keys()]
+
+    def items(self):
+        return [(key, self[key]) for key in self.keys()]
+
+    def __repr__(self):
+        return '<%s %s %s>' % (self.__class__.__name__, self.name,
+                               self.version)
+
+
+METADATA_FILENAME = 'pydist.json'
+WHEEL_METADATA_FILENAME = 'metadata.json'
+
+
+class Metadata(object):
+    """
+    The metadata of a release. This implementation uses 2.0 (JSON)
+    metadata where possible. If not possible, it wraps a LegacyMetadata
+    instance which handles the key-value metadata format.
+    """
+
+    METADATA_VERSION_MATCHER = re.compile('^\d+(\.\d+)*$')
+
+    NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I)
+
+    VERSION_MATCHER = PEP440_VERSION_RE
+
+    SUMMARY_MATCHER = re.compile('.{1,2047}')
+
+    METADATA_VERSION = '2.0'
+
+    GENERATOR = 'distlib (%s)' % __version__
+
+    MANDATORY_KEYS = {
+        'name': (),
+        'version': (),
+        'summary': ('legacy',),
+    }
+
+    INDEX_KEYS = ('name version license summary description author '
+                  'author_email keywords platform home_page classifiers '
+                  'download_url')
+
+    DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires '
+                       'dev_requires provides meta_requires obsoleted_by '
+                       'supports_environments')
+
+    SYNTAX_VALIDATORS = {
+        'metadata_version': (METADATA_VERSION_MATCHER, ()),
+        'name': (NAME_MATCHER, ('legacy',)),
+        'version': (VERSION_MATCHER, ('legacy',)),
+        'summary': (SUMMARY_MATCHER, ('legacy',)),
+    }
+
+    __slots__ = ('_legacy', '_data', 'scheme')
+
+    def __init__(self, path=None, fileobj=None, mapping=None,
+                 scheme='default'):
+        if [path, fileobj, mapping].count(None) < 2:
+            raise TypeError('path, fileobj and mapping are exclusive')
+        self._legacy = None
+        self._data = None
+        self.scheme = scheme
+        #import pdb; pdb.set_trace()
+        if mapping is not None:
+            try:
+                self._validate_mapping(mapping, scheme)
+                self._data = mapping
+            except MetadataUnrecognizedVersionError:
+                self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme)
+                self.validate()
+        else:
+            data = None
+            if path:
+                with open(path, 'rb') as f:
+                    data = f.read()
+            elif fileobj:
+                data = fileobj.read()
+            if data is None:
+                # Initialised with no args - to be added
+                self._data = {
+                    'metadata_version': self.METADATA_VERSION,
+                    'generator': self.GENERATOR,
+                }
+            else:
+                if not isinstance(data, text_type):
+                    data = data.decode('utf-8')
+                try:
+                    self._data = json.loads(data)
+                    self._validate_mapping(self._data, scheme)
+                except ValueError:
+                    # Note: MetadataUnrecognizedVersionError does not
+                    # inherit from ValueError (it's a DistlibException,
+                    # which should not inherit from ValueError).
+                    # The ValueError comes from the json.load - if that
+                    # succeeds and we get a validation error, we want
+                    # that to propagate
+                    self._legacy = LegacyMetadata(fileobj=StringIO(data),
+                                                  scheme=scheme)
+                    self.validate()
+
+    common_keys = set(('name', 'version', 'license', 'keywords', 'summary'))
+
+    none_list = (None, list)
+    none_dict = (None, dict)
+
+    mapped_keys = {
+        'run_requires': ('Requires-Dist', list),
+        'build_requires': ('Setup-Requires-Dist', list),
+        'dev_requires': none_list,
+        'test_requires': none_list,
+        'meta_requires': none_list,
+        'extras': ('Provides-Extra', list),
+        'modules': none_list,
+        'namespaces': none_list,
+        'exports': none_dict,
+        'commands': none_dict,
+        'classifiers': ('Classifier', list),
+        'source_url': ('Download-URL', None),
+        'metadata_version': ('Metadata-Version', None),
+    }
+
+    del none_list, none_dict
+
+    def __getattribute__(self, key):
+        common = object.__getattribute__(self, 'common_keys')
+        mapped = object.__getattribute__(self, 'mapped_keys')
+        if key in mapped:
+            lk, maker = mapped[key]
+            if self._legacy:
+                if lk is None:
+                    result = None if maker is None else maker()
+                else:
+                    result = self._legacy.get(lk)
+            else:
+                value = None if maker is None else maker()
+                if key not in ('commands', 'exports', 'modules', 'namespaces',
+                               'classifiers'):
+                    result = self._data.get(key, value)
+                else:
+                    # special cases for PEP 459
+                    sentinel = object()
+                    result = sentinel
+                    d = self._data.get('extensions')
+                    if d:
+                        if key == 'commands':
+                            result = d.get('python.commands', value)
+                        elif key == 'classifiers':
+                            d = d.get('python.details')
+                            if d:
+                                result = d.get(key, value)
+                        else:
+                            d = d.get('python.exports')
+                            if not d:
+                                d = self._data.get('python.exports')
+                            if d:
+                                result = d.get(key, value)
+                    if result is sentinel:
+                        result = value
+        elif key not in common:
+            result = object.__getattribute__(self, key)
+        elif self._legacy:
+            result = self._legacy.get(key)
+        else:
+            result = self._data.get(key)
+        return result
+
+    def _validate_value(self, key, value, scheme=None):
+        if key in self.SYNTAX_VALIDATORS:
+            pattern, exclusions = self.SYNTAX_VALIDATORS[key]
+            if (scheme or self.scheme) not in exclusions:
+                m = pattern.match(value)
+                if not m:
+                    raise MetadataInvalidError("'%s' is an invalid value for "
+                                               "the '%s' property" % (value,
+                                                                    key))
+
+    def __setattr__(self, key, value):
+        self._validate_value(key, value)
+        common = object.__getattribute__(self, 'common_keys')
+        mapped = object.__getattribute__(self, 'mapped_keys')
+        if key in mapped:
+            lk, _ = mapped[key]
+            if self._legacy:
+                if lk is None:
+                    raise NotImplementedError
+                self._legacy[lk] = value
+            elif key not in ('commands', 'exports', 'modules', 'namespaces',
+                             'classifiers'):
+                self._data[key] = value
+            else:
+                # special cases for PEP 459
+                d = self._data.setdefault('extensions', {})
+                if key == 'commands':
+                    d['python.commands'] = value
+                elif key == 'classifiers':
+                    d = d.setdefault('python.details', {})
+                    d[key] = value
+                else:
+                    d = d.setdefault('python.exports', {})
+                    d[key] = value
+        elif key not in common:
+            object.__setattr__(self, key, value)
+        else:
+            if key == 'keywords':
+                if isinstance(value, string_types):
+                    value = value.strip()
+                    if value:
+                        value = value.split()
+                    else:
+                        value = []
+            if self._legacy:
+                self._legacy[key] = value
+            else:
+                self._data[key] = value
+
+    @property
+    def name_and_version(self):
+        return _get_name_and_version(self.name, self.version, True)
+
+    @property
+    def provides(self):
+        if self._legacy:
+            result = self._legacy['Provides-Dist']
+        else:
+            result = self._data.setdefault('provides', [])
+        s = '%s (%s)' % (self.name, self.version)
+        if s not in result:
+            result.append(s)
+        return result
+
+    @provides.setter
+    def provides(self, value):
+        if self._legacy:
+            self._legacy['Provides-Dist'] = value
+        else:
+            self._data['provides'] = value
+
+    def get_requirements(self, reqts, extras=None, env=None):
+        """
+        Base method to get dependencies, given a set of extras
+        to satisfy and an optional environment context.
+        :param reqts: A list of sometimes-wanted dependencies,
+                      perhaps dependent on extras and environment.
+        :param extras: A list of optional components being requested.
+        :param env: An optional environment for marker evaluation.
+        """
+        if self._legacy:
+            result = reqts
+        else:
+            result = []
+            extras = get_extras(extras or [], self.extras)
+            for d in reqts:
+                if 'extra' not in d and 'environment' not in d:
+                    # unconditional
+                    include = True
+                else:
+                    if 'extra' not in d:
+                        # Not extra-dependent - only environment-dependent
+                        include = True
+                    else:
+                        include = d.get('extra') in extras
+                    if include:
+                        # Not excluded because of extras, check environment
+                        marker = d.get('environment')
+                        if marker:
+                            include = interpret(marker, env)
+                if include:
+                    result.extend(d['requires'])
+            for key in ('build', 'dev', 'test'):
+                e = ':%s:' % key
+                if e in extras:
+                    extras.remove(e)
+                    # A recursive call, but it should terminate since 'test'
+                    # has been removed from the extras
+                    reqts = self._data.get('%s_requires' % key, [])
+                    result.extend(self.get_requirements(reqts, extras=extras,
+                                                        env=env))
+        return result
+
+    @property
+    def dictionary(self):
+        if self._legacy:
+            return self._from_legacy()
+        return self._data
+
+    @property
+    def dependencies(self):
+        if self._legacy:
+            raise NotImplementedError
+        else:
+            return extract_by_key(self._data, self.DEPENDENCY_KEYS)
+
+    @dependencies.setter
+    def dependencies(self, value):
+        if self._legacy:
+            raise NotImplementedError
+        else:
+            self._data.update(value)
+
+    def _validate_mapping(self, mapping, scheme):
+        if mapping.get('metadata_version') != self.METADATA_VERSION:
+            raise MetadataUnrecognizedVersionError()
+        missing = []
+        for key, exclusions in self.MANDATORY_KEYS.items():
+            if key not in mapping:
+                if scheme not in exclusions:
+                    missing.append(key)
+        if missing:
+            msg = 'Missing metadata items: %s' % ', '.join(missing)
+            raise MetadataMissingError(msg)
+        for k, v in mapping.items():
+            self._validate_value(k, v, scheme)
+
+    def validate(self):
+        if self._legacy:
+            missing, warnings = self._legacy.check(True)
+            if missing or warnings:
+                logger.warning('Metadata: missing: %s, warnings: %s',
+                               missing, warnings)
+        else:
+            self._validate_mapping(self._data, self.scheme)
+
+    def todict(self):
+        if self._legacy:
+            return self._legacy.todict(True)
+        else:
+            result = extract_by_key(self._data, self.INDEX_KEYS)
+            return result
+
+    def _from_legacy(self):
+        assert self._legacy and not self._data
+        result = {
+            'metadata_version': self.METADATA_VERSION,
+            'generator': self.GENERATOR,
+        }
+        lmd = self._legacy.todict(True)     # skip missing ones
+        for k in ('name', 'version', 'license', 'summary', 'description',
+                  'classifier'):
+            if k in lmd:
+                if k == 'classifier':
+                    nk = 'classifiers'
+                else:
+                    nk = k
+                result[nk] = lmd[k]
+        kw = lmd.get('Keywords', [])
+        if kw == ['']:
+            kw = []
+        result['keywords'] = kw
+        keys = (('requires_dist', 'run_requires'),
+                ('setup_requires_dist', 'build_requires'))
+        for ok, nk in keys:
+            if ok in lmd and lmd[ok]:
+                result[nk] = [{'requires': lmd[ok]}]
+        result['provides'] = self.provides
+        author = {}
+        maintainer = {}
+        return result
+
+    LEGACY_MAPPING = {
+        'name': 'Name',
+        'version': 'Version',
+        'license': 'License',
+        'summary': 'Summary',
+        'description': 'Description',
+        'classifiers': 'Classifier',
+    }
+
+    def _to_legacy(self):
+        def process_entries(entries):
+            reqts = set()
+            for e in entries:
+                extra = e.get('extra')
+                env = e.get('environment')
+                rlist = e['requires']
+                for r in rlist:
+                    if not env and not extra:
+                        reqts.add(r)
+                    else:
+                        marker = ''
+                        if extra:
+                            marker = 'extra == "%s"' % extra
+                        if env:
+                            if marker:
+                                marker = '(%s) and %s' % (env, marker)
+                            else:
+                                marker = env
+                        reqts.add(';'.join((r, marker)))
+            return reqts
+
+        assert self._data and not self._legacy
+        result = LegacyMetadata()
+        nmd = self._data
+        for nk, ok in self.LEGACY_MAPPING.items():
+            if nk in nmd:
+                result[ok] = nmd[nk]
+        r1 = process_entries(self.run_requires + self.meta_requires)
+        r2 = process_entries(self.build_requires + self.dev_requires)
+        if self.extras:
+            result['Provides-Extra'] = sorted(self.extras)
+        result['Requires-Dist'] = sorted(r1)
+        result['Setup-Requires-Dist'] = sorted(r2)
+        # TODO: other fields such as contacts
+        return result
+
+    def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True):
+        if [path, fileobj].count(None) != 1:
+            raise ValueError('Exactly one of path and fileobj is needed')
+        self.validate()
+        if legacy:
+            if self._legacy:
+                legacy_md = self._legacy
+            else:
+                legacy_md = self._to_legacy()
+            if path:
+                legacy_md.write(path, skip_unknown=skip_unknown)
+            else:
+                legacy_md.write_file(fileobj, skip_unknown=skip_unknown)
+        else:
+            if self._legacy:
+                d = self._from_legacy()
+            else:
+                d = self._data
+            if fileobj:
+                json.dump(d, fileobj, ensure_ascii=True, indent=2,
+                          sort_keys=True)
+            else:
+                with codecs.open(path, 'w', 'utf-8') as f:
+                    json.dump(d, f, ensure_ascii=True, indent=2,
+                              sort_keys=True)
+
+    def add_requirements(self, requirements):
+        if self._legacy:
+            self._legacy.add_requirements(requirements)
+        else:
+            run_requires = self._data.setdefault('run_requires', [])
+            always = None
+            for entry in run_requires:
+                if 'environment' not in entry and 'extra' not in entry:
+                    always = entry
+                    break
+            if always is None:
+                always = { 'requires': requirements }
+                run_requires.insert(0, always)
+            else:
+                rset = set(always['requires']) | set(requirements)
+                always['requires'] = sorted(rset)
+
+    def __repr__(self):
+        name = self.name or '(no name)'
+        version = self.version or 'no version'
+        return '<%s %s %s (%s)>' % (self.__class__.__name__,
+                                    self.metadata_version, name, version)
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/resources.py b/vendor/pip-9.0.3/pip/_vendor/distlib/resources.py
new file mode 100644
index 0000000000000000000000000000000000000000..f07cde2591e9879850514049df777a86f92c387e
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/resources.py
@@ -0,0 +1,355 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-2016 Vinay Sajip.
+# Licensed to the Python Software Foundation under a contributor agreement.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+from __future__ import unicode_literals
+
+import bisect
+import io
+import logging
+import os
+import pkgutil
+import shutil
+import sys
+import types
+import zipimport
+
+from . import DistlibException
+from .util import cached_property, get_cache_base, path_to_cache_dir, Cache
+
+logger = logging.getLogger(__name__)
+
+
+cache = None    # created when needed
+
+
+class ResourceCache(Cache):
+    def __init__(self, base=None):
+        if base is None:
+            # Use native string to avoid issues on 2.x: see Python #20140.
+            base = os.path.join(get_cache_base(), str('resource-cache'))
+        super(ResourceCache, self).__init__(base)
+
+    def is_stale(self, resource, path):
+        """
+        Is the cache stale for the given resource?
+
+        :param resource: The :class:`Resource` being cached.
+        :param path: The path of the resource in the cache.
+        :return: True if the cache is stale.
+        """
+        # Cache invalidation is a hard problem :-)
+        return True
+
+    def get(self, resource):
+        """
+        Get a resource into the cache,
+
+        :param resource: A :class:`Resource` instance.
+        :return: The pathname of the resource in the cache.
+        """
+        prefix, path = resource.finder.get_cache_info(resource)
+        if prefix is None:
+            result = path
+        else:
+            result = os.path.join(self.base, self.prefix_to_dir(prefix), path)
+            dirname = os.path.dirname(result)
+            if not os.path.isdir(dirname):
+                os.makedirs(dirname)
+            if not os.path.exists(result):
+                stale = True
+            else:
+                stale = self.is_stale(resource, path)
+            if stale:
+                # write the bytes of the resource to the cache location
+                with open(result, 'wb') as f:
+                    f.write(resource.bytes)
+        return result
+
+
+class ResourceBase(object):
+    def __init__(self, finder, name):
+        self.finder = finder
+        self.name = name
+
+
+class Resource(ResourceBase):
+    """
+    A class representing an in-package resource, such as a data file. This is
+    not normally instantiated by user code, but rather by a
+    :class:`ResourceFinder` which manages the resource.
+    """
+    is_container = False        # Backwards compatibility
+
+    def as_stream(self):
+        """
+        Get the resource as a stream.
+
+        This is not a property to make it obvious that it returns a new stream
+        each time.
+        """
+        return self.finder.get_stream(self)
+
+    @cached_property
+    def file_path(self):
+        global cache
+        if cache is None:
+            cache = ResourceCache()
+        return cache.get(self)
+
+    @cached_property
+    def bytes(self):
+        return self.finder.get_bytes(self)
+
+    @cached_property
+    def size(self):
+        return self.finder.get_size(self)
+
+
+class ResourceContainer(ResourceBase):
+    is_container = True     # Backwards compatibility
+
+    @cached_property
+    def resources(self):
+        return self.finder.get_resources(self)
+
+
+class ResourceFinder(object):
+    """
+    Resource finder for file system resources.
+    """
+
+    if sys.platform.startswith('java'):
+        skipped_extensions = ('.pyc', '.pyo', '.class')
+    else:
+        skipped_extensions = ('.pyc', '.pyo')
+
+    def __init__(self, module):
+        self.module = module
+        self.loader = getattr(module, '__loader__', None)
+        self.base = os.path.dirname(getattr(module, '__file__', ''))
+
+    def _adjust_path(self, path):
+        return os.path.realpath(path)
+
+    def _make_path(self, resource_name):
+        # Issue #50: need to preserve type of path on Python 2.x
+        # like os.path._get_sep
+        if isinstance(resource_name, bytes):    # should only happen on 2.x
+            sep = b'/'
+        else:
+            sep = '/'
+        parts = resource_name.split(sep)
+        parts.insert(0, self.base)
+        result = os.path.join(*parts)
+        return self._adjust_path(result)
+
+    def _find(self, path):
+        return os.path.exists(path)
+
+    def get_cache_info(self, resource):
+        return None, resource.path
+
+    def find(self, resource_name):
+        path = self._make_path(resource_name)
+        if not self._find(path):
+            result = None
+        else:
+            if self._is_directory(path):
+                result = ResourceContainer(self, resource_name)
+            else:
+                result = Resource(self, resource_name)
+            result.path = path
+        return result
+
+    def get_stream(self, resource):
+        return open(resource.path, 'rb')
+
+    def get_bytes(self, resource):
+        with open(resource.path, 'rb') as f:
+            return f.read()
+
+    def get_size(self, resource):
+        return os.path.getsize(resource.path)
+
+    def get_resources(self, resource):
+        def allowed(f):
+            return (f != '__pycache__' and not
+                    f.endswith(self.skipped_extensions))
+        return set([f for f in os.listdir(resource.path) if allowed(f)])
+
+    def is_container(self, resource):
+        return self._is_directory(resource.path)
+
+    _is_directory = staticmethod(os.path.isdir)
+
+    def iterator(self, resource_name):
+        resource = self.find(resource_name)
+        if resource is not None:
+            todo = [resource]
+            while todo:
+                resource = todo.pop(0)
+                yield resource
+                if resource.is_container:
+                    rname = resource.name
+                    for name in resource.resources:
+                        if not rname:
+                            new_name = name
+                        else:
+                            new_name = '/'.join([rname, name])
+                        child = self.find(new_name)
+                        if child.is_container:
+                            todo.append(child)
+                        else:
+                            yield child
+
+
+class ZipResourceFinder(ResourceFinder):
+    """
+    Resource finder for resources in .zip files.
+    """
+    def __init__(self, module):
+        super(ZipResourceFinder, self).__init__(module)
+        archive = self.loader.archive
+        self.prefix_len = 1 + len(archive)
+        # PyPy doesn't have a _files attr on zipimporter, and you can't set one
+        if hasattr(self.loader, '_files'):
+            self._files = self.loader._files
+        else:
+            self._files = zipimport._zip_directory_cache[archive]
+        self.index = sorted(self._files)
+
+    def _adjust_path(self, path):
+        return path
+
+    def _find(self, path):
+        path = path[self.prefix_len:]
+        if path in self._files:
+            result = True
+        else:
+            if path and path[-1] != os.sep:
+                path = path + os.sep
+            i = bisect.bisect(self.index, path)
+            try:
+                result = self.index[i].startswith(path)
+            except IndexError:
+                result = False
+        if not result:
+            logger.debug('_find failed: %r %r', path, self.loader.prefix)
+        else:
+            logger.debug('_find worked: %r %r', path, self.loader.prefix)
+        return result
+
+    def get_cache_info(self, resource):
+        prefix = self.loader.archive
+        path = resource.path[1 + len(prefix):]
+        return prefix, path
+
+    def get_bytes(self, resource):
+        return self.loader.get_data(resource.path)
+
+    def get_stream(self, resource):
+        return io.BytesIO(self.get_bytes(resource))
+
+    def get_size(self, resource):
+        path = resource.path[self.prefix_len:]
+        return self._files[path][3]
+
+    def get_resources(self, resource):
+        path = resource.path[self.prefix_len:]
+        if path and path[-1] != os.sep:
+            path += os.sep
+        plen = len(path)
+        result = set()
+        i = bisect.bisect(self.index, path)
+        while i < len(self.index):
+            if not self.index[i].startswith(path):
+                break
+            s = self.index[i][plen:]
+            result.add(s.split(os.sep, 1)[0])   # only immediate children
+            i += 1
+        return result
+
+    def _is_directory(self, path):
+        path = path[self.prefix_len:]
+        if path and path[-1] != os.sep:
+            path += os.sep
+        i = bisect.bisect(self.index, path)
+        try:
+            result = self.index[i].startswith(path)
+        except IndexError:
+            result = False
+        return result
+
+_finder_registry = {
+    type(None): ResourceFinder,
+    zipimport.zipimporter: ZipResourceFinder
+}
+
+try:
+    # In Python 3.6, _frozen_importlib -> _frozen_importlib_external
+    try:
+        import _frozen_importlib_external as _fi
+    except ImportError:
+        import _frozen_importlib as _fi
+    _finder_registry[_fi.SourceFileLoader] = ResourceFinder
+    _finder_registry[_fi.FileFinder] = ResourceFinder
+    del _fi
+except (ImportError, AttributeError):
+    pass
+
+
+def register_finder(loader, finder_maker):
+    _finder_registry[type(loader)] = finder_maker
+
+_finder_cache = {}
+
+
+def finder(package):
+    """
+    Return a resource finder for a package.
+    :param package: The name of the package.
+    :return: A :class:`ResourceFinder` instance for the package.
+    """
+    if package in _finder_cache:
+        result = _finder_cache[package]
+    else:
+        if package not in sys.modules:
+            __import__(package)
+        module = sys.modules[package]
+        path = getattr(module, '__path__', None)
+        if path is None:
+            raise DistlibException('You cannot get a finder for a module, '
+                                   'only for a package')
+        loader = getattr(module, '__loader__', None)
+        finder_maker = _finder_registry.get(type(loader))
+        if finder_maker is None:
+            raise DistlibException('Unable to locate finder for %r' % package)
+        result = finder_maker(module)
+        _finder_cache[package] = result
+    return result
+
+
+_dummy_module = types.ModuleType(str('__dummy__'))
+
+
+def finder_for_path(path):
+    """
+    Return a resource finder for a path, which should represent a container.
+
+    :param path: The path.
+    :return: A :class:`ResourceFinder` instance for the path.
+    """
+    result = None
+    # calls any path hooks, gets importer into cache
+    pkgutil.get_importer(path)
+    loader = sys.path_importer_cache.get(path)
+    finder = _finder_registry.get(type(loader))
+    if finder:
+        module = _dummy_module
+        module.__file__ = os.path.join(path, '')
+        module.__loader__ = loader
+        result = finder(module)
+    return result
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/scripts.py b/vendor/pip-9.0.3/pip/_vendor/distlib/scripts.py
new file mode 100644
index 0000000000000000000000000000000000000000..792fc2e1fb1f668024516b52a424a45bd123be04
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/scripts.py
@@ -0,0 +1,384 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-2015 Vinay Sajip.
+# Licensed to the Python Software Foundation under a contributor agreement.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+from io import BytesIO
+import logging
+import os
+import re
+import struct
+import sys
+
+from .compat import sysconfig, detect_encoding, ZipFile
+from .resources import finder
+from .util import (FileOperator, get_export_entry, convert_path,
+                   get_executable, in_venv)
+
+logger = logging.getLogger(__name__)
+
+_DEFAULT_MANIFEST = '''
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+ <assemblyIdentity version="1.0.0.0"
+ processorArchitecture="X86"
+ name="%s"
+ type="win32"/>
+
+ <!-- Identify the application security requirements. -->
+ <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+ <security>
+ <requestedPrivileges>
+ <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
+ </requestedPrivileges>
+ </security>
+ </trustInfo>
+</assembly>'''.strip()
+
+# check if Python is called on the first line with this expression
+FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$')
+SCRIPT_TEMPLATE = '''# -*- coding: utf-8 -*-
+if __name__ == '__main__':
+    import sys, re
+
+    def _resolve(module, func):
+        __import__(module)
+        mod = sys.modules[module]
+        parts = func.split('.')
+        result = getattr(mod, parts.pop(0))
+        for p in parts:
+            result = getattr(result, p)
+        return result
+
+    try:
+        sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
+
+        func = _resolve('%(module)s', '%(func)s')
+        rc = func() # None interpreted as 0
+    except Exception as e:  # only supporting Python >= 2.6
+        sys.stderr.write('%%s\\n' %% e)
+        rc = 1
+    sys.exit(rc)
+'''
+
+
+def _enquote_executable(executable):
+    if ' ' in executable:
+        # make sure we quote only the executable in case of env
+        # for example /usr/bin/env "/dir with spaces/bin/jython"
+        # instead of "/usr/bin/env /dir with spaces/bin/jython"
+        # otherwise whole
+        if executable.startswith('/usr/bin/env '):
+            env, _executable = executable.split(' ', 1)
+            if ' ' in _executable and not _executable.startswith('"'):
+                executable = '%s "%s"' % (env, _executable)
+        else:
+            if not executable.startswith('"'):
+                executable = '"%s"' % executable
+    return executable
+
+
+class ScriptMaker(object):
+    """
+    A class to copy or create scripts from source scripts or callable
+    specifications.
+    """
+    script_template = SCRIPT_TEMPLATE
+
+    executable = None  # for shebangs
+
+    def __init__(self, source_dir, target_dir, add_launchers=True,
+                 dry_run=False, fileop=None):
+        self.source_dir = source_dir
+        self.target_dir = target_dir
+        self.add_launchers = add_launchers
+        self.force = False
+        self.clobber = False
+        # It only makes sense to set mode bits on POSIX.
+        self.set_mode = (os.name == 'posix') or (os.name == 'java' and
+                                                 os._name == 'posix')
+        self.variants = set(('', 'X.Y'))
+        self._fileop = fileop or FileOperator(dry_run)
+
+        self._is_nt = os.name == 'nt' or (
+            os.name == 'java' and os._name == 'nt')
+
+    def _get_alternate_executable(self, executable, options):
+        if options.get('gui', False) and self._is_nt:  # pragma: no cover
+            dn, fn = os.path.split(executable)
+            fn = fn.replace('python', 'pythonw')
+            executable = os.path.join(dn, fn)
+        return executable
+
+    if sys.platform.startswith('java'):  # pragma: no cover
+        def _is_shell(self, executable):
+            """
+            Determine if the specified executable is a script
+            (contains a #! line)
+            """
+            try:
+                with open(executable) as fp:
+                    return fp.read(2) == '#!'
+            except (OSError, IOError):
+                logger.warning('Failed to open %s', executable)
+                return False
+
+        def _fix_jython_executable(self, executable):
+            if self._is_shell(executable):
+                # Workaround for Jython is not needed on Linux systems.
+                import java
+
+                if java.lang.System.getProperty('os.name') == 'Linux':
+                    return executable
+            elif executable.lower().endswith('jython.exe'):
+                # Use wrapper exe for Jython on Windows
+                return executable
+            return '/usr/bin/env %s' % executable
+
+    def _get_shebang(self, encoding, post_interp=b'', options=None):
+        enquote = True
+        if self.executable:
+            executable = self.executable
+            enquote = False     # assume this will be taken care of
+        elif not sysconfig.is_python_build():
+            executable = get_executable()
+        elif in_venv():  # pragma: no cover
+            executable = os.path.join(sysconfig.get_path('scripts'),
+                            'python%s' % sysconfig.get_config_var('EXE'))
+        else:  # pragma: no cover
+            executable = os.path.join(
+                sysconfig.get_config_var('BINDIR'),
+               'python%s%s' % (sysconfig.get_config_var('VERSION'),
+                               sysconfig.get_config_var('EXE')))
+        if options:
+            executable = self._get_alternate_executable(executable, options)
+
+        if sys.platform.startswith('java'):  # pragma: no cover
+            executable = self._fix_jython_executable(executable)
+        # Normalise case for Windows
+        executable = os.path.normcase(executable)
+        # If the user didn't specify an executable, it may be necessary to
+        # cater for executable paths with spaces (not uncommon on Windows)
+        if enquote:
+            executable = _enquote_executable(executable)
+        # Issue #51: don't use fsencode, since we later try to
+        # check that the shebang is decodable using utf-8.
+        executable = executable.encode('utf-8')
+        # in case of IronPython, play safe and enable frames support
+        if (sys.platform == 'cli' and '-X:Frames' not in post_interp
+            and '-X:FullFrames' not in post_interp):  # pragma: no cover
+            post_interp += b' -X:Frames'
+        shebang = b'#!' + executable + post_interp + b'\n'
+        # Python parser starts to read a script using UTF-8 until
+        # it gets a #coding:xxx cookie. The shebang has to be the
+        # first line of a file, the #coding:xxx cookie cannot be
+        # written before. So the shebang has to be decodable from
+        # UTF-8.
+        try:
+            shebang.decode('utf-8')
+        except UnicodeDecodeError:  # pragma: no cover
+            raise ValueError(
+                'The shebang (%r) is not decodable from utf-8' % shebang)
+        # If the script is encoded to a custom encoding (use a
+        # #coding:xxx cookie), the shebang has to be decodable from
+        # the script encoding too.
+        if encoding != 'utf-8':
+            try:
+                shebang.decode(encoding)
+            except UnicodeDecodeError:  # pragma: no cover
+                raise ValueError(
+                    'The shebang (%r) is not decodable '
+                    'from the script encoding (%r)' % (shebang, encoding))
+        return shebang
+
+    def _get_script_text(self, entry):
+        return self.script_template % dict(module=entry.prefix,
+                                           func=entry.suffix)
+
+    manifest = _DEFAULT_MANIFEST
+
+    def get_manifest(self, exename):
+        base = os.path.basename(exename)
+        return self.manifest % base
+
+    def _write_script(self, names, shebang, script_bytes, filenames, ext):
+        use_launcher = self.add_launchers and self._is_nt
+        linesep = os.linesep.encode('utf-8')
+        if not use_launcher:
+            script_bytes = shebang + linesep + script_bytes
+        else:  # pragma: no cover
+            if ext == 'py':
+                launcher = self._get_launcher('t')
+            else:
+                launcher = self._get_launcher('w')
+            stream = BytesIO()
+            with ZipFile(stream, 'w') as zf:
+                zf.writestr('__main__.py', script_bytes)
+            zip_data = stream.getvalue()
+            script_bytes = launcher + shebang + linesep + zip_data
+        for name in names:
+            outname = os.path.join(self.target_dir, name)
+            if use_launcher:  # pragma: no cover
+                n, e = os.path.splitext(outname)
+                if e.startswith('.py'):
+                    outname = n
+                outname = '%s.exe' % outname
+                try:
+                    self._fileop.write_binary_file(outname, script_bytes)
+                except Exception:
+                    # Failed writing an executable - it might be in use.
+                    logger.warning('Failed to write executable - trying to '
+                                   'use .deleteme logic')
+                    dfname = '%s.deleteme' % outname
+                    if os.path.exists(dfname):
+                        os.remove(dfname)       # Not allowed to fail here
+                    os.rename(outname, dfname)  # nor here
+                    self._fileop.write_binary_file(outname, script_bytes)
+                    logger.debug('Able to replace executable using '
+                                 '.deleteme logic')
+                    try:
+                        os.remove(dfname)
+                    except Exception:
+                        pass    # still in use - ignore error
+            else:
+                if self._is_nt and not outname.endswith('.' + ext):  # pragma: no cover
+                    outname = '%s.%s' % (outname, ext)
+                if os.path.exists(outname) and not self.clobber:
+                    logger.warning('Skipping existing file %s', outname)
+                    continue
+                self._fileop.write_binary_file(outname, script_bytes)
+                if self.set_mode:
+                    self._fileop.set_executable_mode([outname])
+            filenames.append(outname)
+
+    def _make_script(self, entry, filenames, options=None):
+        post_interp = b''
+        if options:
+            args = options.get('interpreter_args', [])
+            if args:
+                args = ' %s' % ' '.join(args)
+                post_interp = args.encode('utf-8')
+        shebang = self._get_shebang('utf-8', post_interp, options=options)
+        script = self._get_script_text(entry).encode('utf-8')
+        name = entry.name
+        scriptnames = set()
+        if '' in self.variants:
+            scriptnames.add(name)
+        if 'X' in self.variants:
+            scriptnames.add('%s%s' % (name, sys.version[0]))
+        if 'X.Y' in self.variants:
+            scriptnames.add('%s-%s' % (name, sys.version[:3]))
+        if options and options.get('gui', False):
+            ext = 'pyw'
+        else:
+            ext = 'py'
+        self._write_script(scriptnames, shebang, script, filenames, ext)
+
+    def _copy_script(self, script, filenames):
+        adjust = False
+        script = os.path.join(self.source_dir, convert_path(script))
+        outname = os.path.join(self.target_dir, os.path.basename(script))
+        if not self.force and not self._fileop.newer(script, outname):
+            logger.debug('not copying %s (up-to-date)', script)
+            return
+
+        # Always open the file, but ignore failures in dry-run mode --
+        # that way, we'll get accurate feedback if we can read the
+        # script.
+        try:
+            f = open(script, 'rb')
+        except IOError:  # pragma: no cover
+            if not self.dry_run:
+                raise
+            f = None
+        else:
+            first_line = f.readline()
+            if not first_line:  # pragma: no cover
+                logger.warning('%s: %s is an empty file (skipping)',
+                               self.get_command_name(),  script)
+                return
+
+            match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n'))
+            if match:
+                adjust = True
+                post_interp = match.group(1) or b''
+
+        if not adjust:
+            if f:
+                f.close()
+            self._fileop.copy_file(script, outname)
+            if self.set_mode:
+                self._fileop.set_executable_mode([outname])
+            filenames.append(outname)
+        else:
+            logger.info('copying and adjusting %s -> %s', script,
+                        self.target_dir)
+            if not self._fileop.dry_run:
+                encoding, lines = detect_encoding(f.readline)
+                f.seek(0)
+                shebang = self._get_shebang(encoding, post_interp)
+                if b'pythonw' in first_line:  # pragma: no cover
+                    ext = 'pyw'
+                else:
+                    ext = 'py'
+                n = os.path.basename(outname)
+                self._write_script([n], shebang, f.read(), filenames, ext)
+            if f:
+                f.close()
+
+    @property
+    def dry_run(self):
+        return self._fileop.dry_run
+
+    @dry_run.setter
+    def dry_run(self, value):
+        self._fileop.dry_run = value
+
+    if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'):  # pragma: no cover
+        # Executable launcher support.
+        # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/
+
+        def _get_launcher(self, kind):
+            if struct.calcsize('P') == 8:   # 64-bit
+                bits = '64'
+            else:
+                bits = '32'
+            name = '%s%s.exe' % (kind, bits)
+            # Issue 31: don't hardcode an absolute package name, but
+            # determine it relative to the current package
+            distlib_package = __name__.rsplit('.', 1)[0]
+            result = finder(distlib_package).find(name).bytes
+            return result
+
+    # Public API follows
+
+    def make(self, specification, options=None):
+        """
+        Make a script.
+
+        :param specification: The specification, which is either a valid export
+                              entry specification (to make a script from a
+                              callable) or a filename (to make a script by
+                              copying from a source location).
+        :param options: A dictionary of options controlling script generation.
+        :return: A list of all absolute pathnames written to.
+        """
+        filenames = []
+        entry = get_export_entry(specification)
+        if entry is None:
+            self._copy_script(specification, filenames)
+        else:
+            self._make_script(entry, filenames, options=options)
+        return filenames
+
+    def make_multiple(self, specifications, options=None):
+        """
+        Take a list of specifications and make scripts from them,
+        :param specifications: A list of specifications.
+        :return: A list of all absolute pathnames written to,
+        """
+        filenames = []
+        for specification in specifications:
+            filenames.extend(self.make(specification, options))
+        return filenames
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/t32.exe b/vendor/pip-9.0.3/pip/_vendor/distlib/t32.exe
new file mode 100644
index 0000000000000000000000000000000000000000..836211d848ec0ba46667d33cfade3348888062ae
Binary files /dev/null and b/vendor/pip-9.0.3/pip/_vendor/distlib/t32.exe differ
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/t64.exe b/vendor/pip-9.0.3/pip/_vendor/distlib/t64.exe
new file mode 100644
index 0000000000000000000000000000000000000000..a401b59d602d4823e0a69138a0268f0bfbec3de2
Binary files /dev/null and b/vendor/pip-9.0.3/pip/_vendor/distlib/t64.exe differ
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/util.py b/vendor/pip-9.0.3/pip/_vendor/distlib/util.py
new file mode 100644
index 0000000000000000000000000000000000000000..aadc87435d51ac74e6af16046ec12f2f1f2f51b0
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/util.py
@@ -0,0 +1,1611 @@
+#
+# Copyright (C) 2012-2016 The Python Software Foundation.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+import codecs
+from collections import deque
+import contextlib
+import csv
+from glob import iglob as std_iglob
+import io
+import json
+import logging
+import os
+import py_compile
+import re
+import shutil
+import socket
+try:
+    import ssl
+except ImportError:  # pragma: no cover
+    ssl = None
+import subprocess
+import sys
+import tarfile
+import tempfile
+import textwrap
+
+try:
+    import threading
+except ImportError:  # pragma: no cover
+    import dummy_threading as threading
+import time
+
+from . import DistlibException
+from .compat import (string_types, text_type, shutil, raw_input, StringIO,
+                     cache_from_source, urlopen, urljoin, httplib, xmlrpclib,
+                     splittype, HTTPHandler, BaseConfigurator, valid_ident,
+                     Container, configparser, URLError, ZipFile, fsdecode,
+                     unquote)
+
+logger = logging.getLogger(__name__)
+
+#
+# Requirement parsing code for name + optional constraints + optional extras
+#
+# e.g. 'foo >= 1.2, < 2.0 [bar, baz]'
+#
+# The regex can seem a bit hairy, so we build it up out of smaller pieces
+# which are manageable.
+#
+
+COMMA = r'\s*,\s*'
+COMMA_RE = re.compile(COMMA)
+
+IDENT = r'(\w|[.-])+'
+EXTRA_IDENT = r'(\*|:(\*|\w+):|' + IDENT + ')'
+VERSPEC = IDENT + r'\*?'
+
+RELOP = '([<>=!~]=)|[<>]'
+
+#
+# The first relop is optional - if absent, will be taken as '~='
+#
+BARE_CONSTRAINTS = ('(' + RELOP + r')?\s*(' + VERSPEC + ')(' + COMMA + '(' +
+                    RELOP + r')\s*(' + VERSPEC + '))*')
+
+DIRECT_REF = '(from\s+(?P<diref>.*))'
+
+#
+# Either the bare constraints or the bare constraints in parentheses
+#
+CONSTRAINTS = (r'\(\s*(?P<c1>' + BARE_CONSTRAINTS + '|' + DIRECT_REF +
+               r')\s*\)|(?P<c2>' + BARE_CONSTRAINTS + '\s*)')
+
+EXTRA_LIST = EXTRA_IDENT + '(' + COMMA + EXTRA_IDENT + ')*'
+EXTRAS = r'\[\s*(?P<ex>' + EXTRA_LIST + r')?\s*\]'
+REQUIREMENT = ('(?P<dn>'  + IDENT + r')\s*(' + EXTRAS + r'\s*)?(\s*' +
+               CONSTRAINTS + ')?$')
+REQUIREMENT_RE = re.compile(REQUIREMENT)
+
+#
+# Used to scan through the constraints
+#
+RELOP_IDENT = '(?P<op>' + RELOP + r')\s*(?P<vn>' + VERSPEC + ')'
+RELOP_IDENT_RE = re.compile(RELOP_IDENT)
+
+def parse_requirement(s):
+
+    def get_constraint(m):
+        d = m.groupdict()
+        return d['op'], d['vn']
+
+    result = None
+    m = REQUIREMENT_RE.match(s)
+    if m:
+        d = m.groupdict()
+        name = d['dn']
+        cons = d['c1'] or d['c2']
+        if not d['diref']:
+            url = None
+        else:
+            # direct reference
+            cons = None
+            url = d['diref'].strip()
+        if not cons:
+            cons = None
+            constr = ''
+            rs = d['dn']
+        else:
+            if cons[0] not in '<>!=':
+                cons = '~=' + cons
+            iterator = RELOP_IDENT_RE.finditer(cons)
+            cons = [get_constraint(m) for m in iterator]
+            rs = '%s (%s)' % (name, ', '.join(['%s %s' % con for con in cons]))
+        if not d['ex']:
+            extras = None
+        else:
+            extras = COMMA_RE.split(d['ex'])
+        result = Container(name=name, constraints=cons, extras=extras,
+                           requirement=rs, source=s, url=url)
+    return result
+
+
+def get_resources_dests(resources_root, rules):
+    """Find destinations for resources files"""
+
+    def get_rel_path(base, path):
+        # normalizes and returns a lstripped-/-separated path
+        base = base.replace(os.path.sep, '/')
+        path = path.replace(os.path.sep, '/')
+        assert path.startswith(base)
+        return path[len(base):].lstrip('/')
+
+
+    destinations = {}
+    for base, suffix, dest in rules:
+        prefix = os.path.join(resources_root, base)
+        for abs_base in iglob(prefix):
+            abs_glob = os.path.join(abs_base, suffix)
+            for abs_path in iglob(abs_glob):
+                resource_file = get_rel_path(resources_root, abs_path)
+                if dest is None:  # remove the entry if it was here
+                    destinations.pop(resource_file, None)
+                else:
+                    rel_path = get_rel_path(abs_base, abs_path)
+                    rel_dest = dest.replace(os.path.sep, '/').rstrip('/')
+                    destinations[resource_file] = rel_dest + '/' + rel_path
+    return destinations
+
+
+def in_venv():
+    if hasattr(sys, 'real_prefix'):
+        # virtualenv venvs
+        result = True
+    else:
+        # PEP 405 venvs
+        result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix)
+    return result
+
+
+def get_executable():
+# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as
+# changes to the stub launcher mean that sys.executable always points
+# to the stub on macOS
+#    if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__'
+#                                     in os.environ):
+#        result =  os.environ['__PYVENV_LAUNCHER__']
+#    else:
+#        result = sys.executable
+#    return result
+    result = os.path.normcase(sys.executable)
+    if not isinstance(result, text_type):
+        result = fsdecode(result)
+    return result
+
+
+def proceed(prompt, allowed_chars, error_prompt=None, default=None):
+    p = prompt
+    while True:
+        s = raw_input(p)
+        p = prompt
+        if not s and default:
+            s = default
+        if s:
+            c = s[0].lower()
+            if c in allowed_chars:
+                break
+            if error_prompt:
+                p = '%c: %s\n%s' % (c, error_prompt, prompt)
+    return c
+
+
+def extract_by_key(d, keys):
+    if isinstance(keys, string_types):
+        keys = keys.split()
+    result = {}
+    for key in keys:
+        if key in d:
+            result[key] = d[key]
+    return result
+
+def read_exports(stream):
+    if sys.version_info[0] >= 3:
+        # needs to be a text stream
+        stream = codecs.getreader('utf-8')(stream)
+    # Try to load as JSON, falling back on legacy format
+    data = stream.read()
+    stream = StringIO(data)
+    try:
+        jdata = json.load(stream)
+        result = jdata['extensions']['python.exports']['exports']
+        for group, entries in result.items():
+            for k, v in entries.items():
+                s = '%s = %s' % (k, v)
+                entry = get_export_entry(s)
+                assert entry is not None
+                entries[k] = entry
+        return result
+    except Exception:
+        stream.seek(0, 0)
+
+    def read_stream(cp, stream):
+        if hasattr(cp, 'read_file'):
+            cp.read_file(stream)
+        else:
+            cp.readfp(stream)
+
+    cp = configparser.ConfigParser()
+    try:
+        read_stream(cp, stream)
+    except configparser.MissingSectionHeaderError:
+        stream.close()
+        data = textwrap.dedent(data)
+        stream = StringIO(data)
+        read_stream(cp, stream)
+
+    result = {}
+    for key in cp.sections():
+        result[key] = entries = {}
+        for name, value in cp.items(key):
+            s = '%s = %s' % (name, value)
+            entry = get_export_entry(s)
+            assert entry is not None
+            #entry.dist = self
+            entries[name] = entry
+    return result
+
+
+def write_exports(exports, stream):
+    if sys.version_info[0] >= 3:
+        # needs to be a text stream
+        stream = codecs.getwriter('utf-8')(stream)
+    cp = configparser.ConfigParser()
+    for k, v in exports.items():
+        # TODO check k, v for valid values
+        cp.add_section(k)
+        for entry in v.values():
+            if entry.suffix is None:
+                s = entry.prefix
+            else:
+                s = '%s:%s' % (entry.prefix, entry.suffix)
+            if entry.flags:
+                s = '%s [%s]' % (s, ', '.join(entry.flags))
+            cp.set(k, entry.name, s)
+    cp.write(stream)
+
+
+@contextlib.contextmanager
+def tempdir():
+    td = tempfile.mkdtemp()
+    try:
+        yield td
+    finally:
+        shutil.rmtree(td)
+
+@contextlib.contextmanager
+def chdir(d):
+    cwd = os.getcwd()
+    try:
+        os.chdir(d)
+        yield
+    finally:
+        os.chdir(cwd)
+
+
+@contextlib.contextmanager
+def socket_timeout(seconds=15):
+    cto = socket.getdefaulttimeout()
+    try:
+        socket.setdefaulttimeout(seconds)
+        yield
+    finally:
+        socket.setdefaulttimeout(cto)
+
+
+class cached_property(object):
+    def __init__(self, func):
+        self.func = func
+        #for attr in ('__name__', '__module__', '__doc__'):
+        #    setattr(self, attr, getattr(func, attr, None))
+
+    def __get__(self, obj, cls=None):
+        if obj is None:
+            return self
+        value = self.func(obj)
+        object.__setattr__(obj, self.func.__name__, value)
+        #obj.__dict__[self.func.__name__] = value = self.func(obj)
+        return value
+
+def convert_path(pathname):
+    """Return 'pathname' as a name that will work on the native filesystem.
+
+    The path is split on '/' and put back together again using the current
+    directory separator.  Needed because filenames in the setup script are
+    always supplied in Unix style, and have to be converted to the local
+    convention before we can actually use them in the filesystem.  Raises
+    ValueError on non-Unix-ish systems if 'pathname' either starts or
+    ends with a slash.
+    """
+    if os.sep == '/':
+        return pathname
+    if not pathname:
+        return pathname
+    if pathname[0] == '/':
+        raise ValueError("path '%s' cannot be absolute" % pathname)
+    if pathname[-1] == '/':
+        raise ValueError("path '%s' cannot end with '/'" % pathname)
+
+    paths = pathname.split('/')
+    while os.curdir in paths:
+        paths.remove(os.curdir)
+    if not paths:
+        return os.curdir
+    return os.path.join(*paths)
+
+
+class FileOperator(object):
+    def __init__(self, dry_run=False):
+        self.dry_run = dry_run
+        self.ensured = set()
+        self._init_record()
+
+    def _init_record(self):
+        self.record = False
+        self.files_written = set()
+        self.dirs_created = set()
+
+    def record_as_written(self, path):
+        if self.record:
+            self.files_written.add(path)
+
+    def newer(self, source, target):
+        """Tell if the target is newer than the source.
+
+        Returns true if 'source' exists and is more recently modified than
+        'target', or if 'source' exists and 'target' doesn't.
+
+        Returns false if both exist and 'target' is the same age or younger
+        than 'source'. Raise PackagingFileError if 'source' does not exist.
+
+        Note that this test is not very accurate: files created in the same
+        second will have the same "age".
+        """
+        if not os.path.exists(source):
+            raise DistlibException("file '%r' does not exist" %
+                                   os.path.abspath(source))
+        if not os.path.exists(target):
+            return True
+
+        return os.stat(source).st_mtime > os.stat(target).st_mtime
+
+    def copy_file(self, infile, outfile, check=True):
+        """Copy a file respecting dry-run and force flags.
+        """
+        self.ensure_dir(os.path.dirname(outfile))
+        logger.info('Copying %s to %s', infile, outfile)
+        if not self.dry_run:
+            msg = None
+            if check:
+                if os.path.islink(outfile):
+                    msg = '%s is a symlink' % outfile
+                elif os.path.exists(outfile) and not os.path.isfile(outfile):
+                    msg = '%s is a non-regular file' % outfile
+            if msg:
+                raise ValueError(msg + ' which would be overwritten')
+            shutil.copyfile(infile, outfile)
+        self.record_as_written(outfile)
+
+    def copy_stream(self, instream, outfile, encoding=None):
+        assert not os.path.isdir(outfile)
+        self.ensure_dir(os.path.dirname(outfile))
+        logger.info('Copying stream %s to %s', instream, outfile)
+        if not self.dry_run:
+            if encoding is None:
+                outstream = open(outfile, 'wb')
+            else:
+                outstream = codecs.open(outfile, 'w', encoding=encoding)
+            try:
+                shutil.copyfileobj(instream, outstream)
+            finally:
+                outstream.close()
+        self.record_as_written(outfile)
+
+    def write_binary_file(self, path, data):
+        self.ensure_dir(os.path.dirname(path))
+        if not self.dry_run:
+            with open(path, 'wb') as f:
+                f.write(data)
+        self.record_as_written(path)
+
+    def write_text_file(self, path, data, encoding):
+        self.ensure_dir(os.path.dirname(path))
+        if not self.dry_run:
+            with open(path, 'wb') as f:
+                f.write(data.encode(encoding))
+        self.record_as_written(path)
+
+    def set_mode(self, bits, mask, files):
+        if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'):
+            # Set the executable bits (owner, group, and world) on
+            # all the files specified.
+            for f in files:
+                if self.dry_run:
+                    logger.info("changing mode of %s", f)
+                else:
+                    mode = (os.stat(f).st_mode | bits) & mask
+                    logger.info("changing mode of %s to %o", f, mode)
+                    os.chmod(f, mode)
+
+    set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f)
+
+    def ensure_dir(self, path):
+        path = os.path.abspath(path)
+        if path not in self.ensured and not os.path.exists(path):
+            self.ensured.add(path)
+            d, f = os.path.split(path)
+            self.ensure_dir(d)
+            logger.info('Creating %s' % path)
+            if not self.dry_run:
+                os.mkdir(path)
+            if self.record:
+                self.dirs_created.add(path)
+
+    def byte_compile(self, path, optimize=False, force=False, prefix=None):
+        dpath = cache_from_source(path, not optimize)
+        logger.info('Byte-compiling %s to %s', path, dpath)
+        if not self.dry_run:
+            if force or self.newer(path, dpath):
+                if not prefix:
+                    diagpath = None
+                else:
+                    assert path.startswith(prefix)
+                    diagpath = path[len(prefix):]
+            py_compile.compile(path, dpath, diagpath, True)     # raise error
+        self.record_as_written(dpath)
+        return dpath
+
+    def ensure_removed(self, path):
+        if os.path.exists(path):
+            if os.path.isdir(path) and not os.path.islink(path):
+                logger.debug('Removing directory tree at %s', path)
+                if not self.dry_run:
+                    shutil.rmtree(path)
+                if self.record:
+                    if path in self.dirs_created:
+                        self.dirs_created.remove(path)
+            else:
+                if os.path.islink(path):
+                    s = 'link'
+                else:
+                    s = 'file'
+                logger.debug('Removing %s %s', s, path)
+                if not self.dry_run:
+                    os.remove(path)
+                if self.record:
+                    if path in self.files_written:
+                        self.files_written.remove(path)
+
+    def is_writable(self, path):
+        result = False
+        while not result:
+            if os.path.exists(path):
+                result = os.access(path, os.W_OK)
+                break
+            parent = os.path.dirname(path)
+            if parent == path:
+                break
+            path = parent
+        return result
+
+    def commit(self):
+        """
+        Commit recorded changes, turn off recording, return
+        changes.
+        """
+        assert self.record
+        result = self.files_written, self.dirs_created
+        self._init_record()
+        return result
+
+    def rollback(self):
+        if not self.dry_run:
+            for f in list(self.files_written):
+                if os.path.exists(f):
+                    os.remove(f)
+            # dirs should all be empty now, except perhaps for
+            # __pycache__ subdirs
+            # reverse so that subdirs appear before their parents
+            dirs = sorted(self.dirs_created, reverse=True)
+            for d in dirs:
+                flist = os.listdir(d)
+                if flist:
+                    assert flist == ['__pycache__']
+                    sd = os.path.join(d, flist[0])
+                    os.rmdir(sd)
+                os.rmdir(d)     # should fail if non-empty
+        self._init_record()
+
+def resolve(module_name, dotted_path):
+    if module_name in sys.modules:
+        mod = sys.modules[module_name]
+    else:
+        mod = __import__(module_name)
+    if dotted_path is None:
+        result = mod
+    else:
+        parts = dotted_path.split('.')
+        result = getattr(mod, parts.pop(0))
+        for p in parts:
+            result = getattr(result, p)
+    return result
+
+
+class ExportEntry(object):
+    def __init__(self, name, prefix, suffix, flags):
+        self.name = name
+        self.prefix = prefix
+        self.suffix = suffix
+        self.flags = flags
+
+    @cached_property
+    def value(self):
+        return resolve(self.prefix, self.suffix)
+
+    def __repr__(self):  # pragma: no cover
+        return '<ExportEntry %s = %s:%s %s>' % (self.name, self.prefix,
+                                                self.suffix, self.flags)
+
+    def __eq__(self, other):
+        if not isinstance(other, ExportEntry):
+            result = False
+        else:
+            result = (self.name == other.name and
+                      self.prefix == other.prefix and
+                      self.suffix == other.suffix and
+                      self.flags == other.flags)
+        return result
+
+    __hash__ = object.__hash__
+
+
+ENTRY_RE = re.compile(r'''(?P<name>(\w|[-.+])+)
+                      \s*=\s*(?P<callable>(\w+)([:\.]\w+)*)
+                      \s*(\[\s*(?P<flags>\w+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])?
+                      ''', re.VERBOSE)
+
+def get_export_entry(specification):
+    m = ENTRY_RE.search(specification)
+    if not m:
+        result = None
+        if '[' in specification or ']' in specification:
+            raise DistlibException("Invalid specification "
+                                   "'%s'" % specification)
+    else:
+        d = m.groupdict()
+        name = d['name']
+        path = d['callable']
+        colons = path.count(':')
+        if colons == 0:
+            prefix, suffix = path, None
+        else:
+            if colons != 1:
+                raise DistlibException("Invalid specification "
+                                       "'%s'" % specification)
+            prefix, suffix = path.split(':')
+        flags = d['flags']
+        if flags is None:
+            if '[' in specification or ']' in specification:
+                raise DistlibException("Invalid specification "
+                                       "'%s'" % specification)
+            flags = []
+        else:
+            flags = [f.strip() for f in flags.split(',')]
+        result = ExportEntry(name, prefix, suffix, flags)
+    return result
+
+
+def get_cache_base(suffix=None):
+    """
+    Return the default base location for distlib caches. If the directory does
+    not exist, it is created. Use the suffix provided for the base directory,
+    and default to '.distlib' if it isn't provided.
+
+    On Windows, if LOCALAPPDATA is defined in the environment, then it is
+    assumed to be a directory, and will be the parent directory of the result.
+    On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home
+    directory - using os.expanduser('~') - will be the parent directory of
+    the result.
+
+    The result is just the directory '.distlib' in the parent directory as
+    determined above, or with the name specified with ``suffix``.
+    """
+    if suffix is None:
+        suffix = '.distlib'
+    if os.name == 'nt' and 'LOCALAPPDATA' in os.environ:
+        result = os.path.expandvars('$localappdata')
+    else:
+        # Assume posix, or old Windows
+        result = os.path.expanduser('~')
+    # we use 'isdir' instead of 'exists', because we want to
+    # fail if there's a file with that name
+    if os.path.isdir(result):
+        usable = os.access(result, os.W_OK)
+        if not usable:
+            logger.warning('Directory exists but is not writable: %s', result)
+    else:
+        try:
+            os.makedirs(result)
+            usable = True
+        except OSError:
+            logger.warning('Unable to create %s', result, exc_info=True)
+            usable = False
+    if not usable:
+        result = tempfile.mkdtemp()
+        logger.warning('Default location unusable, using %s', result)
+    return os.path.join(result, suffix)
+
+
+def path_to_cache_dir(path):
+    """
+    Convert an absolute path to a directory name for use in a cache.
+
+    The algorithm used is:
+
+    #. On Windows, any ``':'`` in the drive is replaced with ``'---'``.
+    #. Any occurrence of ``os.sep`` is replaced with ``'--'``.
+    #. ``'.cache'`` is appended.
+    """
+    d, p = os.path.splitdrive(os.path.abspath(path))
+    if d:
+        d = d.replace(':', '---')
+    p = p.replace(os.sep, '--')
+    return d + p + '.cache'
+
+
+def ensure_slash(s):
+    if not s.endswith('/'):
+        return s + '/'
+    return s
+
+
+def parse_credentials(netloc):
+    username = password = None
+    if '@' in netloc:
+        prefix, netloc = netloc.split('@', 1)
+        if ':' not in prefix:
+            username = prefix
+        else:
+            username, password = prefix.split(':', 1)
+    return username, password, netloc
+
+
+def get_process_umask():
+    result = os.umask(0o22)
+    os.umask(result)
+    return result
+
+def is_string_sequence(seq):
+    result = True
+    i = None
+    for i, s in enumerate(seq):
+        if not isinstance(s, string_types):
+            result = False
+            break
+    assert i is not None
+    return result
+
+PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-'
+                                      '([a-z0-9_.+-]+)', re.I)
+PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)')
+
+
+def split_filename(filename, project_name=None):
+    """
+    Extract name, version, python version from a filename (no extension)
+
+    Return name, version, pyver or None
+    """
+    result = None
+    pyver = None
+    filename = unquote(filename).replace(' ', '-')
+    m = PYTHON_VERSION.search(filename)
+    if m:
+        pyver = m.group(1)
+        filename = filename[:m.start()]
+    if project_name and len(filename) > len(project_name) + 1:
+        m = re.match(re.escape(project_name) + r'\b', filename)
+        if m:
+            n = m.end()
+            result = filename[:n], filename[n + 1:], pyver
+    if result is None:
+        m = PROJECT_NAME_AND_VERSION.match(filename)
+        if m:
+            result = m.group(1), m.group(3), pyver
+    return result
+
+# Allow spaces in name because of legacy dists like "Twisted Core"
+NAME_VERSION_RE = re.compile(r'(?P<name>[\w .-]+)\s*'
+                             r'\(\s*(?P<ver>[^\s)]+)\)$')
+
+def parse_name_and_version(p):
+    """
+    A utility method used to get name and version from a string.
+
+    From e.g. a Provides-Dist value.
+
+    :param p: A value in a form 'foo (1.0)'
+    :return: The name and version as a tuple.
+    """
+    m = NAME_VERSION_RE.match(p)
+    if not m:
+        raise DistlibException('Ill-formed name/version string: \'%s\'' % p)
+    d = m.groupdict()
+    return d['name'].strip().lower(), d['ver']
+
+def get_extras(requested, available):
+    result = set()
+    requested = set(requested or [])
+    available = set(available or [])
+    if '*' in requested:
+        requested.remove('*')
+        result |= available
+    for r in requested:
+        if r == '-':
+            result.add(r)
+        elif r.startswith('-'):
+            unwanted = r[1:]
+            if unwanted not in available:
+                logger.warning('undeclared extra: %s' % unwanted)
+            if unwanted in result:
+                result.remove(unwanted)
+        else:
+            if r not in available:
+                logger.warning('undeclared extra: %s' % r)
+            result.add(r)
+    return result
+#
+# Extended metadata functionality
+#
+
+def _get_external_data(url):
+    result = {}
+    try:
+        # urlopen might fail if it runs into redirections,
+        # because of Python issue #13696. Fixed in locators
+        # using a custom redirect handler.
+        resp = urlopen(url)
+        headers = resp.info()
+        ct = headers.get('Content-Type')
+        if not ct.startswith('application/json'):
+            logger.debug('Unexpected response for JSON request: %s', ct)
+        else:
+            reader = codecs.getreader('utf-8')(resp)
+            #data = reader.read().decode('utf-8')
+            #result = json.loads(data)
+            result = json.load(reader)
+    except Exception as e:
+        logger.exception('Failed to get external data for %s: %s', url, e)
+    return result
+
+_external_data_base_url = 'https://www.red-dove.com/pypi/projects/'
+
+def get_project_data(name):
+    url = '%s/%s/project.json' % (name[0].upper(), name)
+    url = urljoin(_external_data_base_url, url)
+    result = _get_external_data(url)
+    return result
+
+def get_package_data(name, version):
+    url = '%s/%s/package-%s.json' % (name[0].upper(), name, version)
+    url = urljoin(_external_data_base_url, url)
+    return _get_external_data(url)
+
+
+class Cache(object):
+    """
+    A class implementing a cache for resources that need to live in the file system
+    e.g. shared libraries. This class was moved from resources to here because it
+    could be used by other modules, e.g. the wheel module.
+    """
+
+    def __init__(self, base):
+        """
+        Initialise an instance.
+
+        :param base: The base directory where the cache should be located.
+        """
+        # we use 'isdir' instead of 'exists', because we want to
+        # fail if there's a file with that name
+        if not os.path.isdir(base):  # pragma: no cover
+            os.makedirs(base)
+        if (os.stat(base).st_mode & 0o77) != 0:
+            logger.warning('Directory \'%s\' is not private', base)
+        self.base = os.path.abspath(os.path.normpath(base))
+
+    def prefix_to_dir(self, prefix):
+        """
+        Converts a resource prefix to a directory name in the cache.
+        """
+        return path_to_cache_dir(prefix)
+
+    def clear(self):
+        """
+        Clear the cache.
+        """
+        not_removed = []
+        for fn in os.listdir(self.base):
+            fn = os.path.join(self.base, fn)
+            try:
+                if os.path.islink(fn) or os.path.isfile(fn):
+                    os.remove(fn)
+                elif os.path.isdir(fn):
+                    shutil.rmtree(fn)
+            except Exception:
+                not_removed.append(fn)
+        return not_removed
+
+
+class EventMixin(object):
+    """
+    A very simple publish/subscribe system.
+    """
+    def __init__(self):
+        self._subscribers = {}
+
+    def add(self, event, subscriber, append=True):
+        """
+        Add a subscriber for an event.
+
+        :param event: The name of an event.
+        :param subscriber: The subscriber to be added (and called when the
+                           event is published).
+        :param append: Whether to append or prepend the subscriber to an
+                       existing subscriber list for the event.
+        """
+        subs = self._subscribers
+        if event not in subs:
+            subs[event] = deque([subscriber])
+        else:
+            sq = subs[event]
+            if append:
+                sq.append(subscriber)
+            else:
+                sq.appendleft(subscriber)
+
+    def remove(self, event, subscriber):
+        """
+        Remove a subscriber for an event.
+
+        :param event: The name of an event.
+        :param subscriber: The subscriber to be removed.
+        """
+        subs = self._subscribers
+        if event not in subs:
+            raise ValueError('No subscribers: %r' % event)
+        subs[event].remove(subscriber)
+
+    def get_subscribers(self, event):
+        """
+        Return an iterator for the subscribers for an event.
+        :param event: The event to return subscribers for.
+        """
+        return iter(self._subscribers.get(event, ()))
+
+    def publish(self, event, *args, **kwargs):
+        """
+        Publish a event and return a list of values returned by its
+        subscribers.
+
+        :param event: The event to publish.
+        :param args: The positional arguments to pass to the event's
+                     subscribers.
+        :param kwargs: The keyword arguments to pass to the event's
+                       subscribers.
+        """
+        result = []
+        for subscriber in self.get_subscribers(event):
+            try:
+                value = subscriber(event, *args, **kwargs)
+            except Exception:
+                logger.exception('Exception during event publication')
+                value = None
+            result.append(value)
+        logger.debug('publish %s: args = %s, kwargs = %s, result = %s',
+                     event, args, kwargs, result)
+        return result
+
+#
+# Simple sequencing
+#
+class Sequencer(object):
+    def __init__(self):
+        self._preds = {}
+        self._succs = {}
+        self._nodes = set()     # nodes with no preds/succs
+
+    def add_node(self, node):
+        self._nodes.add(node)
+
+    def remove_node(self, node, edges=False):
+        if node in self._nodes:
+            self._nodes.remove(node)
+        if edges:
+            for p in set(self._preds.get(node, ())):
+                self.remove(p, node)
+            for s in set(self._succs.get(node, ())):
+                self.remove(node, s)
+            # Remove empties
+            for k, v in list(self._preds.items()):
+                if not v:
+                    del self._preds[k]
+            for k, v in list(self._succs.items()):
+                if not v:
+                    del self._succs[k]
+
+    def add(self, pred, succ):
+        assert pred != succ
+        self._preds.setdefault(succ, set()).add(pred)
+        self._succs.setdefault(pred, set()).add(succ)
+
+    def remove(self, pred, succ):
+        assert pred != succ
+        try:
+            preds = self._preds[succ]
+            succs = self._succs[pred]
+        except KeyError:  # pragma: no cover
+            raise ValueError('%r not a successor of anything' % succ)
+        try:
+            preds.remove(pred)
+            succs.remove(succ)
+        except KeyError:  # pragma: no cover
+            raise ValueError('%r not a successor of %r' % (succ, pred))
+
+    def is_step(self, step):
+        return (step in self._preds or step in self._succs or
+                step in self._nodes)
+
+    def get_steps(self, final):
+        if not self.is_step(final):
+            raise ValueError('Unknown: %r' % final)
+        result = []
+        todo = []
+        seen = set()
+        todo.append(final)
+        while todo:
+            step = todo.pop(0)
+            if step in seen:
+                # if a step was already seen,
+                # move it to the end (so it will appear earlier
+                # when reversed on return) ... but not for the
+                # final step, as that would be confusing for
+                # users
+                if step != final:
+                    result.remove(step)
+                    result.append(step)
+            else:
+                seen.add(step)
+                result.append(step)
+                preds = self._preds.get(step, ())
+                todo.extend(preds)
+        return reversed(result)
+
+    @property
+    def strong_connections(self):
+        #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm
+        index_counter = [0]
+        stack = []
+        lowlinks = {}
+        index = {}
+        result = []
+
+        graph = self._succs
+
+        def strongconnect(node):
+            # set the depth index for this node to the smallest unused index
+            index[node] = index_counter[0]
+            lowlinks[node] = index_counter[0]
+            index_counter[0] += 1
+            stack.append(node)
+
+            # Consider successors
+            try:
+                successors = graph[node]
+            except Exception:
+                successors = []
+            for successor in successors:
+                if successor not in lowlinks:
+                    # Successor has not yet been visited
+                    strongconnect(successor)
+                    lowlinks[node] = min(lowlinks[node],lowlinks[successor])
+                elif successor in stack:
+                    # the successor is in the stack and hence in the current
+                    # strongly connected component (SCC)
+                    lowlinks[node] = min(lowlinks[node],index[successor])
+
+            # If `node` is a root node, pop the stack and generate an SCC
+            if lowlinks[node] == index[node]:
+                connected_component = []
+
+                while True:
+                    successor = stack.pop()
+                    connected_component.append(successor)
+                    if successor == node: break
+                component = tuple(connected_component)
+                # storing the result
+                result.append(component)
+
+        for node in graph:
+            if node not in lowlinks:
+                strongconnect(node)
+
+        return result
+
+    @property
+    def dot(self):
+        result = ['digraph G {']
+        for succ in self._preds:
+            preds = self._preds[succ]
+            for pred in preds:
+                result.append('  %s -> %s;' % (pred, succ))
+        for node in self._nodes:
+            result.append('  %s;' % node)
+        result.append('}')
+        return '\n'.join(result)
+
+#
+# Unarchiving functionality for zip, tar, tgz, tbz, whl
+#
+
+ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip',
+                      '.tgz', '.tbz', '.whl')
+
+def unarchive(archive_filename, dest_dir, format=None, check=True):
+
+    def check_path(path):
+        if not isinstance(path, text_type):
+            path = path.decode('utf-8')
+        p = os.path.abspath(os.path.join(dest_dir, path))
+        if not p.startswith(dest_dir) or p[plen] != os.sep:
+            raise ValueError('path outside destination: %r' % p)
+
+    dest_dir = os.path.abspath(dest_dir)
+    plen = len(dest_dir)
+    archive = None
+    if format is None:
+        if archive_filename.endswith(('.zip', '.whl')):
+            format = 'zip'
+        elif archive_filename.endswith(('.tar.gz', '.tgz')):
+            format = 'tgz'
+            mode = 'r:gz'
+        elif archive_filename.endswith(('.tar.bz2', '.tbz')):
+            format = 'tbz'
+            mode = 'r:bz2'
+        elif archive_filename.endswith('.tar'):
+            format = 'tar'
+            mode = 'r'
+        else:  # pragma: no cover
+            raise ValueError('Unknown format for %r' % archive_filename)
+    try:
+        if format == 'zip':
+            archive = ZipFile(archive_filename, 'r')
+            if check:
+                names = archive.namelist()
+                for name in names:
+                    check_path(name)
+        else:
+            archive = tarfile.open(archive_filename, mode)
+            if check:
+                names = archive.getnames()
+                for name in names:
+                    check_path(name)
+        if format != 'zip' and sys.version_info[0] < 3:
+            # See Python issue 17153. If the dest path contains Unicode,
+            # tarfile extraction fails on Python 2.x if a member path name
+            # contains non-ASCII characters - it leads to an implicit
+            # bytes -> unicode conversion using ASCII to decode.
+            for tarinfo in archive.getmembers():
+                if not isinstance(tarinfo.name, text_type):
+                    tarinfo.name = tarinfo.name.decode('utf-8')
+        archive.extractall(dest_dir)
+
+    finally:
+        if archive:
+            archive.close()
+
+
+def zip_dir(directory):
+    """zip a directory tree into a BytesIO object"""
+    result = io.BytesIO()
+    dlen = len(directory)
+    with ZipFile(result, "w") as zf:
+        for root, dirs, files in os.walk(directory):
+            for name in files:
+                full = os.path.join(root, name)
+                rel = root[dlen:]
+                dest = os.path.join(rel, name)
+                zf.write(full, dest)
+    return result
+
+#
+# Simple progress bar
+#
+
+UNITS = ('', 'K', 'M', 'G','T','P')
+
+
+class Progress(object):
+    unknown = 'UNKNOWN'
+
+    def __init__(self, minval=0, maxval=100):
+        assert maxval is None or maxval >= minval
+        self.min = self.cur = minval
+        self.max = maxval
+        self.started = None
+        self.elapsed = 0
+        self.done = False
+
+    def update(self, curval):
+        assert self.min <= curval
+        assert self.max is None or curval <= self.max
+        self.cur = curval
+        now = time.time()
+        if self.started is None:
+            self.started = now
+        else:
+            self.elapsed = now - self.started
+
+    def increment(self, incr):
+        assert incr >= 0
+        self.update(self.cur + incr)
+
+    def start(self):
+        self.update(self.min)
+        return self
+
+    def stop(self):
+        if self.max is not None:
+            self.update(self.max)
+        self.done = True
+
+    @property
+    def maximum(self):
+        return self.unknown if self.max is None else self.max
+
+    @property
+    def percentage(self):
+        if self.done:
+            result = '100 %'
+        elif self.max is None:
+            result = ' ?? %'
+        else:
+            v = 100.0 * (self.cur - self.min) / (self.max - self.min)
+            result = '%3d %%' % v
+        return result
+
+    def format_duration(self, duration):
+        if (duration <= 0) and self.max is None or self.cur == self.min:
+            result = '??:??:??'
+        #elif duration < 1:
+        #    result = '--:--:--'
+        else:
+            result = time.strftime('%H:%M:%S', time.gmtime(duration))
+        return result
+
+    @property
+    def ETA(self):
+        if self.done:
+            prefix = 'Done'
+            t = self.elapsed
+            #import pdb; pdb.set_trace()
+        else:
+            prefix = 'ETA '
+            if self.max is None:
+                t = -1
+            elif self.elapsed == 0 or (self.cur == self.min):
+                t = 0
+            else:
+                #import pdb; pdb.set_trace()
+                t = float(self.max - self.min)
+                t /= self.cur - self.min
+                t = (t - 1) * self.elapsed
+        return '%s: %s' % (prefix, self.format_duration(t))
+
+    @property
+    def speed(self):
+        if self.elapsed == 0:
+            result = 0.0
+        else:
+            result = (self.cur - self.min) / self.elapsed
+        for unit in UNITS:
+            if result < 1000:
+                break
+            result /= 1000.0
+        return '%d %sB/s' % (result, unit)
+
+#
+# Glob functionality
+#
+
+RICH_GLOB = re.compile(r'\{([^}]*)\}')
+_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]')
+_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$')
+
+
+def iglob(path_glob):
+    """Extended globbing function that supports ** and {opt1,opt2,opt3}."""
+    if _CHECK_RECURSIVE_GLOB.search(path_glob):
+        msg = """invalid glob %r: recursive glob "**" must be used alone"""
+        raise ValueError(msg % path_glob)
+    if _CHECK_MISMATCH_SET.search(path_glob):
+        msg = """invalid glob %r: mismatching set marker '{' or '}'"""
+        raise ValueError(msg % path_glob)
+    return _iglob(path_glob)
+
+
+def _iglob(path_glob):
+    rich_path_glob = RICH_GLOB.split(path_glob, 1)
+    if len(rich_path_glob) > 1:
+        assert len(rich_path_glob) == 3, rich_path_glob
+        prefix, set, suffix = rich_path_glob
+        for item in set.split(','):
+            for path in _iglob(''.join((prefix, item, suffix))):
+                yield path
+    else:
+        if '**' not in path_glob:
+            for item in std_iglob(path_glob):
+                yield item
+        else:
+            prefix, radical = path_glob.split('**', 1)
+            if prefix == '':
+                prefix = '.'
+            if radical == '':
+                radical = '*'
+            else:
+                # we support both
+                radical = radical.lstrip('/')
+                radical = radical.lstrip('\\')
+            for path, dir, files in os.walk(prefix):
+                path = os.path.normpath(path)
+                for fn in _iglob(os.path.join(path, radical)):
+                    yield fn
+
+if ssl:
+    from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname,
+                         CertificateError)
+
+
+#
+# HTTPSConnection which verifies certificates/matches domains
+#
+
+    class HTTPSConnection(httplib.HTTPSConnection):
+        ca_certs = None # set this to the path to the certs file (.pem)
+        check_domain = True # only used if ca_certs is not None
+
+        # noinspection PyPropertyAccess
+        def connect(self):
+            sock = socket.create_connection((self.host, self.port), self.timeout)
+            if getattr(self, '_tunnel_host', False):
+                self.sock = sock
+                self._tunnel()
+
+            if not hasattr(ssl, 'SSLContext'):
+                # For 2.x
+                if self.ca_certs:
+                    cert_reqs = ssl.CERT_REQUIRED
+                else:
+                    cert_reqs = ssl.CERT_NONE
+                self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file,
+                                            cert_reqs=cert_reqs,
+                                            ssl_version=ssl.PROTOCOL_SSLv23,
+                                            ca_certs=self.ca_certs)
+            else:  # pragma: no cover
+                context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
+                context.options |= ssl.OP_NO_SSLv2
+                if self.cert_file:
+                    context.load_cert_chain(self.cert_file, self.key_file)
+                kwargs = {}
+                if self.ca_certs:
+                    context.verify_mode = ssl.CERT_REQUIRED
+                    context.load_verify_locations(cafile=self.ca_certs)
+                    if getattr(ssl, 'HAS_SNI', False):
+                        kwargs['server_hostname'] = self.host
+                self.sock = context.wrap_socket(sock, **kwargs)
+            if self.ca_certs and self.check_domain:
+                try:
+                    match_hostname(self.sock.getpeercert(), self.host)
+                    logger.debug('Host verified: %s', self.host)
+                except CertificateError:  # pragma: no cover
+                    self.sock.shutdown(socket.SHUT_RDWR)
+                    self.sock.close()
+                    raise
+
+    class HTTPSHandler(BaseHTTPSHandler):
+        def __init__(self, ca_certs, check_domain=True):
+            BaseHTTPSHandler.__init__(self)
+            self.ca_certs = ca_certs
+            self.check_domain = check_domain
+
+        def _conn_maker(self, *args, **kwargs):
+            """
+            This is called to create a connection instance. Normally you'd
+            pass a connection class to do_open, but it doesn't actually check for
+            a class, and just expects a callable. As long as we behave just as a
+            constructor would have, we should be OK. If it ever changes so that
+            we *must* pass a class, we'll create an UnsafeHTTPSConnection class
+            which just sets check_domain to False in the class definition, and
+            choose which one to pass to do_open.
+            """
+            result = HTTPSConnection(*args, **kwargs)
+            if self.ca_certs:
+                result.ca_certs = self.ca_certs
+                result.check_domain = self.check_domain
+            return result
+
+        def https_open(self, req):
+            try:
+                return self.do_open(self._conn_maker, req)
+            except URLError as e:
+                if 'certificate verify failed' in str(e.reason):
+                    raise CertificateError('Unable to verify server certificate '
+                                           'for %s' % req.host)
+                else:
+                    raise
+
+    #
+    # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The-
+    # Middle proxy using HTTP listens on port 443, or an index mistakenly serves
+    # HTML containing a http://xyz link when it should be https://xyz),
+    # you can use the following handler class, which does not allow HTTP traffic.
+    #
+    # It works by inheriting from HTTPHandler - so build_opener won't add a
+    # handler for HTTP itself.
+    #
+    class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler):
+        def http_open(self, req):
+            raise URLError('Unexpected HTTP request on what should be a secure '
+                           'connection: %s' % req)
+
+#
+# XML-RPC with timeouts
+#
+
+_ver_info = sys.version_info[:2]
+
+if _ver_info == (2, 6):
+    class HTTP(httplib.HTTP):
+        def __init__(self, host='', port=None, **kwargs):
+            if port == 0:   # 0 means use port 0, not the default port
+                port = None
+            self._setup(self._connection_class(host, port, **kwargs))
+
+
+    if ssl:
+        class HTTPS(httplib.HTTPS):
+            def __init__(self, host='', port=None, **kwargs):
+                if port == 0:   # 0 means use port 0, not the default port
+                    port = None
+                self._setup(self._connection_class(host, port, **kwargs))
+
+
+class Transport(xmlrpclib.Transport):
+    def __init__(self, timeout, use_datetime=0):
+        self.timeout = timeout
+        xmlrpclib.Transport.__init__(self, use_datetime)
+
+    def make_connection(self, host):
+        h, eh, x509 = self.get_host_info(host)
+        if _ver_info == (2, 6):
+            result = HTTP(h, timeout=self.timeout)
+        else:
+            if not self._connection or host != self._connection[0]:
+                self._extra_headers = eh
+                self._connection = host, httplib.HTTPConnection(h)
+            result = self._connection[1]
+        return result
+
+if ssl:
+    class SafeTransport(xmlrpclib.SafeTransport):
+        def __init__(self, timeout, use_datetime=0):
+            self.timeout = timeout
+            xmlrpclib.SafeTransport.__init__(self, use_datetime)
+
+        def make_connection(self, host):
+            h, eh, kwargs = self.get_host_info(host)
+            if not kwargs:
+                kwargs = {}
+            kwargs['timeout'] = self.timeout
+            if _ver_info == (2, 6):
+                result = HTTPS(host, None, **kwargs)
+            else:
+                if not self._connection or host != self._connection[0]:
+                    self._extra_headers = eh
+                    self._connection = host, httplib.HTTPSConnection(h, None,
+                                                                     **kwargs)
+                result = self._connection[1]
+            return result
+
+
+class ServerProxy(xmlrpclib.ServerProxy):
+    def __init__(self, uri, **kwargs):
+        self.timeout = timeout = kwargs.pop('timeout', None)
+        # The above classes only come into play if a timeout
+        # is specified
+        if timeout is not None:
+            scheme, _ = splittype(uri)
+            use_datetime = kwargs.get('use_datetime', 0)
+            if scheme == 'https':
+                tcls = SafeTransport
+            else:
+                tcls = Transport
+            kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime)
+            self.transport = t
+        xmlrpclib.ServerProxy.__init__(self, uri, **kwargs)
+
+#
+# CSV functionality. This is provided because on 2.x, the csv module can't
+# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files.
+#
+
+def _csv_open(fn, mode, **kwargs):
+    if sys.version_info[0] < 3:
+        mode += 'b'
+    else:
+        kwargs['newline'] = ''
+    return open(fn, mode, **kwargs)
+
+
+class CSVBase(object):
+    defaults = {
+        'delimiter': str(','),      # The strs are used because we need native
+        'quotechar': str('"'),      # str in the csv API (2.x won't take
+        'lineterminator': str('\n') # Unicode)
+    }
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, *exc_info):
+        self.stream.close()
+
+
+class CSVReader(CSVBase):
+    def __init__(self, **kwargs):
+        if 'stream' in kwargs:
+            stream = kwargs['stream']
+            if sys.version_info[0] >= 3:
+                # needs to be a text stream
+                stream = codecs.getreader('utf-8')(stream)
+            self.stream = stream
+        else:
+            self.stream = _csv_open(kwargs['path'], 'r')
+        self.reader = csv.reader(self.stream, **self.defaults)
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        result = next(self.reader)
+        if sys.version_info[0] < 3:
+            for i, item in enumerate(result):
+                if not isinstance(item, text_type):
+                    result[i] = item.decode('utf-8')
+        return result
+
+    __next__ = next
+
+class CSVWriter(CSVBase):
+    def __init__(self, fn, **kwargs):
+        self.stream = _csv_open(fn, 'w')
+        self.writer = csv.writer(self.stream, **self.defaults)
+
+    def writerow(self, row):
+        if sys.version_info[0] < 3:
+            r = []
+            for item in row:
+                if isinstance(item, text_type):
+                    item = item.encode('utf-8')
+                r.append(item)
+            row = r
+        self.writer.writerow(row)
+
+#
+#   Configurator functionality
+#
+
+class Configurator(BaseConfigurator):
+
+    value_converters = dict(BaseConfigurator.value_converters)
+    value_converters['inc'] = 'inc_convert'
+
+    def __init__(self, config, base=None):
+        super(Configurator, self).__init__(config)
+        self.base = base or os.getcwd()
+
+    def configure_custom(self, config):
+        def convert(o):
+            if isinstance(o, (list, tuple)):
+                result = type(o)([convert(i) for i in o])
+            elif isinstance(o, dict):
+                if '()' in o:
+                    result = self.configure_custom(o)
+                else:
+                    result = {}
+                    for k in o:
+                        result[k] = convert(o[k])
+            else:
+                result = self.convert(o)
+            return result
+
+        c = config.pop('()')
+        if not callable(c):
+            c = self.resolve(c)
+        props = config.pop('.', None)
+        # Check for valid identifiers
+        args = config.pop('[]', ())
+        if args:
+            args = tuple([convert(o) for o in args])
+        items = [(k, convert(config[k])) for k in config if valid_ident(k)]
+        kwargs = dict(items)
+        result = c(*args, **kwargs)
+        if props:
+            for n, v in props.items():
+                setattr(result, n, convert(v))
+        return result
+
+    def __getitem__(self, key):
+        result = self.config[key]
+        if isinstance(result, dict) and '()' in result:
+            self.config[key] = result = self.configure_custom(result)
+        return result
+
+    def inc_convert(self, value):
+        """Default converter for the inc:// protocol."""
+        if not os.path.isabs(value):
+            value = os.path.join(self.base, value)
+        with codecs.open(value, 'r', encoding='utf-8') as f:
+            result = json.load(f)
+        return result
+
+#
+# Mixin for running subprocesses and capturing their output
+#
+
+class SubprocessMixin(object):
+    def __init__(self, verbose=False, progress=None):
+        self.verbose = verbose
+        self.progress = progress
+
+    def reader(self, stream, context):
+        """
+        Read lines from a subprocess' output stream and either pass to a progress
+        callable (if specified) or write progress information to sys.stderr.
+        """
+        progress = self.progress
+        verbose = self.verbose
+        while True:
+            s = stream.readline()
+            if not s:
+                break
+            if progress is not None:
+                progress(s, context)
+            else:
+                if not verbose:
+                    sys.stderr.write('.')
+                else:
+                    sys.stderr.write(s.decode('utf-8'))
+                sys.stderr.flush()
+        stream.close()
+
+    def run_command(self, cmd, **kwargs):
+        p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+                             stderr=subprocess.PIPE, **kwargs)
+        t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout'))
+        t1.start()
+        t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr'))
+        t2.start()
+        p.wait()
+        t1.join()
+        t2.join()
+        if self.progress is not None:
+            self.progress('done.', 'main')
+        elif self.verbose:
+            sys.stderr.write('done.\n')
+        return p
+
+
+def normalize_name(name):
+    """Normalize a python package name a la PEP 503"""
+    # https://www.python.org/dev/peps/pep-0503/#normalized-names
+    return re.sub('[-_.]+', '-', name).lower()
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/version.py b/vendor/pip-9.0.3/pip/_vendor/distlib/version.py
new file mode 100644
index 0000000000000000000000000000000000000000..48c17c0a6ff39f55bccca31222caa28d2a1ccb5a
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/version.py
@@ -0,0 +1,742 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012-2016 The Python Software Foundation.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+"""
+Implementation of a flexible versioning scheme providing support for PEP-440,
+setuptools-compatible and semantic versioning.
+"""
+
+import logging
+import re
+
+from .compat import string_types
+
+__all__ = ['NormalizedVersion', 'NormalizedMatcher',
+           'LegacyVersion', 'LegacyMatcher',
+           'SemanticVersion', 'SemanticMatcher',
+           'UnsupportedVersionError', 'get_scheme']
+
+logger = logging.getLogger(__name__)
+
+
+class UnsupportedVersionError(ValueError):
+    """This is an unsupported version."""
+    pass
+
+
+class Version(object):
+    def __init__(self, s):
+        self._string = s = s.strip()
+        self._parts = parts = self.parse(s)
+        assert isinstance(parts, tuple)
+        assert len(parts) > 0
+
+    def parse(self, s):
+        raise NotImplementedError('please implement in a subclass')
+
+    def _check_compatible(self, other):
+        if type(self) != type(other):
+            raise TypeError('cannot compare %r and %r' % (self, other))
+
+    def __eq__(self, other):
+        self._check_compatible(other)
+        return self._parts == other._parts
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __lt__(self, other):
+        self._check_compatible(other)
+        return self._parts < other._parts
+
+    def __gt__(self, other):
+        return not (self.__lt__(other) or self.__eq__(other))
+
+    def __le__(self, other):
+        return self.__lt__(other) or self.__eq__(other)
+
+    def __ge__(self, other):
+        return self.__gt__(other) or self.__eq__(other)
+
+    # See http://docs.python.org/reference/datamodel#object.__hash__
+    def __hash__(self):
+        return hash(self._parts)
+
+    def __repr__(self):
+        return "%s('%s')" % (self.__class__.__name__, self._string)
+
+    def __str__(self):
+        return self._string
+
+    @property
+    def is_prerelease(self):
+        raise NotImplementedError('Please implement in subclasses.')
+
+
+class Matcher(object):
+    version_class = None
+
+    dist_re = re.compile(r"^(\w[\s\w'.-]*)(\((.*)\))?")
+    comp_re = re.compile(r'^(<=|>=|<|>|!=|={2,3}|~=)?\s*([^\s,]+)$')
+    num_re = re.compile(r'^\d+(\.\d+)*$')
+
+    # value is either a callable or the name of a method
+    _operators = {
+        '<': lambda v, c, p: v < c,
+        '>': lambda v, c, p: v > c,
+        '<=': lambda v, c, p: v == c or v < c,
+        '>=': lambda v, c, p: v == c or v > c,
+        '==': lambda v, c, p: v == c,
+        '===': lambda v, c, p: v == c,
+        # by default, compatible => >=.
+        '~=': lambda v, c, p: v == c or v > c,
+        '!=': lambda v, c, p: v != c,
+    }
+
+    def __init__(self, s):
+        if self.version_class is None:
+            raise ValueError('Please specify a version class')
+        self._string = s = s.strip()
+        m = self.dist_re.match(s)
+        if not m:
+            raise ValueError('Not valid: %r' % s)
+        groups = m.groups('')
+        self.name = groups[0].strip()
+        self.key = self.name.lower()    # for case-insensitive comparisons
+        clist = []
+        if groups[2]:
+            constraints = [c.strip() for c in groups[2].split(',')]
+            for c in constraints:
+                m = self.comp_re.match(c)
+                if not m:
+                    raise ValueError('Invalid %r in %r' % (c, s))
+                groups = m.groups()
+                op = groups[0] or '~='
+                s = groups[1]
+                if s.endswith('.*'):
+                    if op not in ('==', '!='):
+                        raise ValueError('\'.*\' not allowed for '
+                                         '%r constraints' % op)
+                    # Could be a partial version (e.g. for '2.*') which
+                    # won't parse as a version, so keep it as a string
+                    vn, prefix = s[:-2], True
+                    if not self.num_re.match(vn):
+                        # Just to check that vn is a valid version
+                        self.version_class(vn)
+                else:
+                    # Should parse as a version, so we can create an
+                    # instance for the comparison
+                    vn, prefix = self.version_class(s), False
+                clist.append((op, vn, prefix))
+        self._parts = tuple(clist)
+
+    def match(self, version):
+        """
+        Check if the provided version matches the constraints.
+
+        :param version: The version to match against this instance.
+        :type version: String or :class:`Version` instance.
+        """
+        if isinstance(version, string_types):
+            version = self.version_class(version)
+        for operator, constraint, prefix in self._parts:
+            f = self._operators.get(operator)
+            if isinstance(f, string_types):
+                f = getattr(self, f)
+            if not f:
+                msg = ('%r not implemented '
+                       'for %s' % (operator, self.__class__.__name__))
+                raise NotImplementedError(msg)
+            if not f(version, constraint, prefix):
+                return False
+        return True
+
+    @property
+    def exact_version(self):
+        result = None
+        if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='):
+            result = self._parts[0][1]
+        return result
+
+    def _check_compatible(self, other):
+        if type(self) != type(other) or self.name != other.name:
+            raise TypeError('cannot compare %s and %s' % (self, other))
+
+    def __eq__(self, other):
+        self._check_compatible(other)
+        return self.key == other.key and self._parts == other._parts
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    # See http://docs.python.org/reference/datamodel#object.__hash__
+    def __hash__(self):
+        return hash(self.key) + hash(self._parts)
+
+    def __repr__(self):
+        return "%s(%r)" % (self.__class__.__name__, self._string)
+
+    def __str__(self):
+        return self._string
+
+
+PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?'
+                               r'(\.(post)(\d+))?(\.(dev)(\d+))?'
+                               r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$')
+
+
+def _pep_440_key(s):
+    s = s.strip()
+    m = PEP440_VERSION_RE.match(s)
+    if not m:
+        raise UnsupportedVersionError('Not a valid version: %s' % s)
+    groups = m.groups()
+    nums = tuple(int(v) for v in groups[1].split('.'))
+    while len(nums) > 1 and nums[-1] == 0:
+        nums = nums[:-1]
+
+    if not groups[0]:
+        epoch = 0
+    else:
+        epoch = int(groups[0])
+    pre = groups[4:6]
+    post = groups[7:9]
+    dev = groups[10:12]
+    local = groups[13]
+    if pre == (None, None):
+        pre = ()
+    else:
+        pre = pre[0], int(pre[1])
+    if post == (None, None):
+        post = ()
+    else:
+        post = post[0], int(post[1])
+    if dev == (None, None):
+        dev = ()
+    else:
+        dev = dev[0], int(dev[1])
+    if local is None:
+        local = ()
+    else:
+        parts = []
+        for part in local.split('.'):
+            # to ensure that numeric compares as > lexicographic, avoid
+            # comparing them directly, but encode a tuple which ensures
+            # correct sorting
+            if part.isdigit():
+                part = (1, int(part))
+            else:
+                part = (0, part)
+            parts.append(part)
+        local = tuple(parts)
+    if not pre:
+        # either before pre-release, or final release and after
+        if not post and dev:
+            # before pre-release
+            pre = ('a', -1)     # to sort before a0
+        else:
+            pre = ('z',)        # to sort after all pre-releases
+    # now look at the state of post and dev.
+    if not post:
+        post = ('_',)   # sort before 'a'
+    if not dev:
+        dev = ('final',)
+
+    #print('%s -> %s' % (s, m.groups()))
+    return epoch, nums, pre, post, dev, local
+
+
+_normalized_key = _pep_440_key
+
+
+class NormalizedVersion(Version):
+    """A rational version.
+
+    Good:
+        1.2         # equivalent to "1.2.0"
+        1.2.0
+        1.2a1
+        1.2.3a2
+        1.2.3b1
+        1.2.3c1
+        1.2.3.4
+        TODO: fill this out
+
+    Bad:
+        1           # minimum two numbers
+        1.2a        # release level must have a release serial
+        1.2.3b
+    """
+    def parse(self, s):
+        result = _normalized_key(s)
+        # _normalized_key loses trailing zeroes in the release
+        # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0
+        # However, PEP 440 prefix matching needs it: for example,
+        # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0).
+        m = PEP440_VERSION_RE.match(s)      # must succeed
+        groups = m.groups()
+        self._release_clause = tuple(int(v) for v in groups[1].split('.'))
+        return result
+
+    PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev'])
+
+    @property
+    def is_prerelease(self):
+        return any(t[0] in self.PREREL_TAGS for t in self._parts if t)
+
+
+def _match_prefix(x, y):
+    x = str(x)
+    y = str(y)
+    if x == y:
+        return True
+    if not x.startswith(y):
+        return False
+    n = len(y)
+    return x[n] == '.'
+
+
+class NormalizedMatcher(Matcher):
+    version_class = NormalizedVersion
+
+    # value is either a callable or the name of a method
+    _operators = {
+        '~=': '_match_compatible',
+        '<': '_match_lt',
+        '>': '_match_gt',
+        '<=': '_match_le',
+        '>=': '_match_ge',
+        '==': '_match_eq',
+        '===': '_match_arbitrary',
+        '!=': '_match_ne',
+    }
+
+    def _adjust_local(self, version, constraint, prefix):
+        if prefix:
+            strip_local = '+' not in constraint and version._parts[-1]
+        else:
+            # both constraint and version are
+            # NormalizedVersion instances.
+            # If constraint does not have a local component,
+            # ensure the version doesn't, either.
+            strip_local = not constraint._parts[-1] and version._parts[-1]
+        if strip_local:
+            s = version._string.split('+', 1)[0]
+            version = self.version_class(s)
+        return version, constraint
+
+    def _match_lt(self, version, constraint, prefix):
+        version, constraint = self._adjust_local(version, constraint, prefix)
+        if version >= constraint:
+            return False
+        release_clause = constraint._release_clause
+        pfx = '.'.join([str(i) for i in release_clause])
+        return not _match_prefix(version, pfx)
+
+    def _match_gt(self, version, constraint, prefix):
+        version, constraint = self._adjust_local(version, constraint, prefix)
+        if version <= constraint:
+            return False
+        release_clause = constraint._release_clause
+        pfx = '.'.join([str(i) for i in release_clause])
+        return not _match_prefix(version, pfx)
+
+    def _match_le(self, version, constraint, prefix):
+        version, constraint = self._adjust_local(version, constraint, prefix)
+        return version <= constraint
+
+    def _match_ge(self, version, constraint, prefix):
+        version, constraint = self._adjust_local(version, constraint, prefix)
+        return version >= constraint
+
+    def _match_eq(self, version, constraint, prefix):
+        version, constraint = self._adjust_local(version, constraint, prefix)
+        if not prefix:
+            result = (version == constraint)
+        else:
+            result = _match_prefix(version, constraint)
+        return result
+
+    def _match_arbitrary(self, version, constraint, prefix):
+        return str(version) == str(constraint)
+
+    def _match_ne(self, version, constraint, prefix):
+        version, constraint = self._adjust_local(version, constraint, prefix)
+        if not prefix:
+            result = (version != constraint)
+        else:
+            result = not _match_prefix(version, constraint)
+        return result
+
+    def _match_compatible(self, version, constraint, prefix):
+        version, constraint = self._adjust_local(version, constraint, prefix)
+        if version == constraint:
+            return True
+        if version < constraint:
+            return False
+#        if not prefix:
+#            return True
+        release_clause = constraint._release_clause
+        if len(release_clause) > 1:
+            release_clause = release_clause[:-1]
+        pfx = '.'.join([str(i) for i in release_clause])
+        return _match_prefix(version, pfx)
+
+_REPLACEMENTS = (
+    (re.compile('[.+-]$'), ''),                     # remove trailing puncts
+    (re.compile(r'^[.](\d)'), r'0.\1'),             # .N -> 0.N at start
+    (re.compile('^[.-]'), ''),                      # remove leading puncts
+    (re.compile(r'^\((.*)\)$'), r'\1'),             # remove parentheses
+    (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'),    # remove leading v(ersion)
+    (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'),        # remove leading v(ersion)
+    (re.compile('[.]{2,}'), '.'),                   # multiple runs of '.'
+    (re.compile(r'\b(alfa|apha)\b'), 'alpha'),      # misspelt alpha
+    (re.compile(r'\b(pre-alpha|prealpha)\b'),
+                'pre.alpha'),                       # standardise
+    (re.compile(r'\(beta\)$'), 'beta'),             # remove parentheses
+)
+
+_SUFFIX_REPLACEMENTS = (
+    (re.compile('^[:~._+-]+'), ''),                   # remove leading puncts
+    (re.compile('[,*")([\]]'), ''),                   # remove unwanted chars
+    (re.compile('[~:+_ -]'), '.'),                    # replace illegal chars
+    (re.compile('[.]{2,}'), '.'),                   # multiple runs of '.'
+    (re.compile(r'\.$'), ''),                       # trailing '.'
+)
+
+_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)')
+
+
+def _suggest_semantic_version(s):
+    """
+    Try to suggest a semantic form for a version for which
+    _suggest_normalized_version couldn't come up with anything.
+    """
+    result = s.strip().lower()
+    for pat, repl in _REPLACEMENTS:
+        result = pat.sub(repl, result)
+    if not result:
+        result = '0.0.0'
+
+    # Now look for numeric prefix, and separate it out from
+    # the rest.
+    #import pdb; pdb.set_trace()
+    m = _NUMERIC_PREFIX.match(result)
+    if not m:
+        prefix = '0.0.0'
+        suffix = result
+    else:
+        prefix = m.groups()[0].split('.')
+        prefix = [int(i) for i in prefix]
+        while len(prefix) < 3:
+            prefix.append(0)
+        if len(prefix) == 3:
+            suffix = result[m.end():]
+        else:
+            suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():]
+            prefix = prefix[:3]
+        prefix = '.'.join([str(i) for i in prefix])
+        suffix = suffix.strip()
+    if suffix:
+        #import pdb; pdb.set_trace()
+        # massage the suffix.
+        for pat, repl in _SUFFIX_REPLACEMENTS:
+            suffix = pat.sub(repl, suffix)
+
+    if not suffix:
+        result = prefix
+    else:
+        sep = '-' if 'dev' in suffix else '+'
+        result = prefix + sep + suffix
+    if not is_semver(result):
+        result = None
+    return result
+
+
+def _suggest_normalized_version(s):
+    """Suggest a normalized version close to the given version string.
+
+    If you have a version string that isn't rational (i.e. NormalizedVersion
+    doesn't like it) then you might be able to get an equivalent (or close)
+    rational version from this function.
+
+    This does a number of simple normalizations to the given string, based
+    on observation of versions currently in use on PyPI. Given a dump of
+    those version during PyCon 2009, 4287 of them:
+    - 2312 (53.93%) match NormalizedVersion without change
+      with the automatic suggestion
+    - 3474 (81.04%) match when using this suggestion method
+
+    @param s {str} An irrational version string.
+    @returns A rational version string, or None, if couldn't determine one.
+    """
+    try:
+        _normalized_key(s)
+        return s   # already rational
+    except UnsupportedVersionError:
+        pass
+
+    rs = s.lower()
+
+    # part of this could use maketrans
+    for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'),
+                       ('beta', 'b'), ('rc', 'c'), ('-final', ''),
+                       ('-pre', 'c'),
+                       ('-release', ''), ('.release', ''), ('-stable', ''),
+                       ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''),
+                       ('final', '')):
+        rs = rs.replace(orig, repl)
+
+    # if something ends with dev or pre, we add a 0
+    rs = re.sub(r"pre$", r"pre0", rs)
+    rs = re.sub(r"dev$", r"dev0", rs)
+
+    # if we have something like "b-2" or "a.2" at the end of the
+    # version, that is probably beta, alpha, etc
+    # let's remove the dash or dot
+    rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs)
+
+    # 1.0-dev-r371 -> 1.0.dev371
+    # 0.1-dev-r79 -> 0.1.dev79
+    rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs)
+
+    # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1
+    rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs)
+
+    # Clean: v0.3, v1.0
+    if rs.startswith('v'):
+        rs = rs[1:]
+
+    # Clean leading '0's on numbers.
+    #TODO: unintended side-effect on, e.g., "2003.05.09"
+    # PyPI stats: 77 (~2%) better
+    rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs)
+
+    # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers
+    # zero.
+    # PyPI stats: 245 (7.56%) better
+    rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs)
+
+    # the 'dev-rNNN' tag is a dev tag
+    rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs)
+
+    # clean the - when used as a pre delimiter
+    rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs)
+
+    # a terminal "dev" or "devel" can be changed into ".dev0"
+    rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs)
+
+    # a terminal "dev" can be changed into ".dev0"
+    rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs)
+
+    # a terminal "final" or "stable" can be removed
+    rs = re.sub(r"(final|stable)$", "", rs)
+
+    # The 'r' and the '-' tags are post release tags
+    #   0.4a1.r10       ->  0.4a1.post10
+    #   0.9.33-17222    ->  0.9.33.post17222
+    #   0.9.33-r17222   ->  0.9.33.post17222
+    rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs)
+
+    # Clean 'r' instead of 'dev' usage:
+    #   0.9.33+r17222   ->  0.9.33.dev17222
+    #   1.0dev123       ->  1.0.dev123
+    #   1.0.git123      ->  1.0.dev123
+    #   1.0.bzr123      ->  1.0.dev123
+    #   0.1a0dev.123    ->  0.1a0.dev123
+    # PyPI stats:  ~150 (~4%) better
+    rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs)
+
+    # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage:
+    #   0.2.pre1        ->  0.2c1
+    #   0.2-c1         ->  0.2c1
+    #   1.0preview123   ->  1.0c123
+    # PyPI stats: ~21 (0.62%) better
+    rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs)
+
+    # Tcl/Tk uses "px" for their post release markers
+    rs = re.sub(r"p(\d+)$", r".post\1", rs)
+
+    try:
+        _normalized_key(rs)
+    except UnsupportedVersionError:
+        rs = None
+    return rs
+
+#
+#   Legacy version processing (distribute-compatible)
+#
+
+_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I)
+_VERSION_REPLACE = {
+    'pre': 'c',
+    'preview': 'c',
+    '-': 'final-',
+    'rc': 'c',
+    'dev': '@',
+    '': None,
+    '.': None,
+}
+
+
+def _legacy_key(s):
+    def get_parts(s):
+        result = []
+        for p in _VERSION_PART.split(s.lower()):
+            p = _VERSION_REPLACE.get(p, p)
+            if p:
+                if '0' <= p[:1] <= '9':
+                    p = p.zfill(8)
+                else:
+                    p = '*' + p
+                result.append(p)
+        result.append('*final')
+        return result
+
+    result = []
+    for p in get_parts(s):
+        if p.startswith('*'):
+            if p < '*final':
+                while result and result[-1] == '*final-':
+                    result.pop()
+            while result and result[-1] == '00000000':
+                result.pop()
+        result.append(p)
+    return tuple(result)
+
+
+class LegacyVersion(Version):
+    def parse(self, s):
+        return _legacy_key(s)
+
+    @property
+    def is_prerelease(self):
+        result = False
+        for x in self._parts:
+            if (isinstance(x, string_types) and x.startswith('*') and
+                x < '*final'):
+                result = True
+                break
+        return result
+
+
+class LegacyMatcher(Matcher):
+    version_class = LegacyVersion
+
+    _operators = dict(Matcher._operators)
+    _operators['~='] = '_match_compatible'
+
+    numeric_re = re.compile('^(\d+(\.\d+)*)')
+
+    def _match_compatible(self, version, constraint, prefix):
+        if version < constraint:
+            return False
+        m = self.numeric_re.match(str(constraint))
+        if not m:
+            logger.warning('Cannot compute compatible match for version %s '
+                           ' and constraint %s', version, constraint)
+            return True
+        s = m.groups()[0]
+        if '.' in s:
+            s = s.rsplit('.', 1)[0]
+        return _match_prefix(version, s)
+
+#
+#   Semantic versioning
+#
+
+_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)'
+                        r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?'
+                        r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I)
+
+
+def is_semver(s):
+    return _SEMVER_RE.match(s)
+
+
+def _semantic_key(s):
+    def make_tuple(s, absent):
+        if s is None:
+            result = (absent,)
+        else:
+            parts = s[1:].split('.')
+            # We can't compare ints and strings on Python 3, so fudge it
+            # by zero-filling numeric values so simulate a numeric comparison
+            result = tuple([p.zfill(8) if p.isdigit() else p for p in parts])
+        return result
+
+    m = is_semver(s)
+    if not m:
+        raise UnsupportedVersionError(s)
+    groups = m.groups()
+    major, minor, patch = [int(i) for i in groups[:3]]
+    # choose the '|' and '*' so that versions sort correctly
+    pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*')
+    return (major, minor, patch), pre, build
+
+
+class SemanticVersion(Version):
+    def parse(self, s):
+        return _semantic_key(s)
+
+    @property
+    def is_prerelease(self):
+        return self._parts[1][0] != '|'
+
+
+class SemanticMatcher(Matcher):
+    version_class = SemanticVersion
+
+
+class VersionScheme(object):
+    def __init__(self, key, matcher, suggester=None):
+        self.key = key
+        self.matcher = matcher
+        self.suggester = suggester
+
+    def is_valid_version(self, s):
+        try:
+            self.matcher.version_class(s)
+            result = True
+        except UnsupportedVersionError:
+            result = False
+        return result
+
+    def is_valid_matcher(self, s):
+        try:
+            self.matcher(s)
+            result = True
+        except UnsupportedVersionError:
+            result = False
+        return result
+
+    def is_valid_constraint_list(self, s):
+        """
+        Used for processing some metadata fields
+        """
+        return self.is_valid_matcher('dummy_name (%s)' % s)
+
+    def suggest(self, s):
+        if self.suggester is None:
+            result = None
+        else:
+            result = self.suggester(s)
+        return result
+
+_SCHEMES = {
+    'normalized': VersionScheme(_normalized_key, NormalizedMatcher,
+                                _suggest_normalized_version),
+    'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s),
+    'semantic': VersionScheme(_semantic_key, SemanticMatcher,
+                              _suggest_semantic_version),
+}
+
+_SCHEMES['default'] = _SCHEMES['normalized']
+
+
+def get_scheme(name):
+    if name not in _SCHEMES:
+        raise ValueError('unknown scheme name: %r' % name)
+    return _SCHEMES[name]
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/w32.exe b/vendor/pip-9.0.3/pip/_vendor/distlib/w32.exe
new file mode 100644
index 0000000000000000000000000000000000000000..85a90a5f51a9596679a7365eadd3352443b95782
Binary files /dev/null and b/vendor/pip-9.0.3/pip/_vendor/distlib/w32.exe differ
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/w64.exe b/vendor/pip-9.0.3/pip/_vendor/distlib/w64.exe
new file mode 100644
index 0000000000000000000000000000000000000000..b3aea316f61163e2637a7c0b0a96cd3c664b54dc
Binary files /dev/null and b/vendor/pip-9.0.3/pip/_vendor/distlib/w64.exe differ
diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/wheel.py b/vendor/pip-9.0.3/pip/_vendor/distlib/wheel.py
new file mode 100644
index 0000000000000000000000000000000000000000..2952b8e0b3142afd86317e58d81ed6da787c2b37
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distlib/wheel.py
@@ -0,0 +1,978 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-2016 Vinay Sajip.
+# Licensed to the Python Software Foundation under a contributor agreement.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+from __future__ import unicode_literals
+
+import base64
+import codecs
+import datetime
+import distutils.util
+from email import message_from_file
+import hashlib
+import imp
+import json
+import logging
+import os
+import posixpath
+import re
+import shutil
+import sys
+import tempfile
+import zipfile
+
+from . import __version__, DistlibException
+from .compat import sysconfig, ZipFile, fsdecode, text_type, filter
+from .database import InstalledDistribution
+from .metadata import Metadata, METADATA_FILENAME
+from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache,
+                   cached_property, get_cache_base, read_exports, tempdir)
+from .version import NormalizedVersion, UnsupportedVersionError
+
+logger = logging.getLogger(__name__)
+
+cache = None    # created when needed
+
+if hasattr(sys, 'pypy_version_info'):
+    IMP_PREFIX = 'pp'
+elif sys.platform.startswith('java'):
+    IMP_PREFIX = 'jy'
+elif sys.platform == 'cli':
+    IMP_PREFIX = 'ip'
+else:
+    IMP_PREFIX = 'cp'
+
+VER_SUFFIX = sysconfig.get_config_var('py_version_nodot')
+if not VER_SUFFIX:   # pragma: no cover
+    VER_SUFFIX = '%s%s' % sys.version_info[:2]
+PYVER = 'py' + VER_SUFFIX
+IMPVER = IMP_PREFIX + VER_SUFFIX
+
+ARCH = distutils.util.get_platform().replace('-', '_').replace('.', '_')
+
+ABI = sysconfig.get_config_var('SOABI')
+if ABI and ABI.startswith('cpython-'):
+    ABI = ABI.replace('cpython-', 'cp')
+else:
+    def _derive_abi():
+        parts = ['cp', VER_SUFFIX]
+        if sysconfig.get_config_var('Py_DEBUG'):
+            parts.append('d')
+        if sysconfig.get_config_var('WITH_PYMALLOC'):
+            parts.append('m')
+        if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4:
+            parts.append('u')
+        return ''.join(parts)
+    ABI = _derive_abi()
+    del _derive_abi
+
+FILENAME_RE = re.compile(r'''
+(?P<nm>[^-]+)
+-(?P<vn>\d+[^-]*)
+(-(?P<bn>\d+[^-]*))?
+-(?P<py>\w+\d+(\.\w+\d+)*)
+-(?P<bi>\w+)
+-(?P<ar>\w+(\.\w+)*)
+\.whl$
+''', re.IGNORECASE | re.VERBOSE)
+
+NAME_VERSION_RE = re.compile(r'''
+(?P<nm>[^-]+)
+-(?P<vn>\d+[^-]*)
+(-(?P<bn>\d+[^-]*))?$
+''', re.IGNORECASE | re.VERBOSE)
+
+SHEBANG_RE = re.compile(br'\s*#![^\r\n]*')
+SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$')
+SHEBANG_PYTHON = b'#!python'
+SHEBANG_PYTHONW = b'#!pythonw'
+
+if os.sep == '/':
+    to_posix = lambda o: o
+else:
+    to_posix = lambda o: o.replace(os.sep, '/')
+
+
+class Mounter(object):
+    def __init__(self):
+        self.impure_wheels = {}
+        self.libs = {}
+
+    def add(self, pathname, extensions):
+        self.impure_wheels[pathname] = extensions
+        self.libs.update(extensions)
+
+    def remove(self, pathname):
+        extensions = self.impure_wheels.pop(pathname)
+        for k, v in extensions:
+            if k in self.libs:
+                del self.libs[k]
+
+    def find_module(self, fullname, path=None):
+        if fullname in self.libs:
+            result = self
+        else:
+            result = None
+        return result
+
+    def load_module(self, fullname):
+        if fullname in sys.modules:
+            result = sys.modules[fullname]
+        else:
+            if fullname not in self.libs:
+                raise ImportError('unable to find extension for %s' % fullname)
+            result = imp.load_dynamic(fullname, self.libs[fullname])
+            result.__loader__ = self
+            parts = fullname.rsplit('.', 1)
+            if len(parts) > 1:
+                result.__package__ = parts[0]
+        return result
+
+_hook = Mounter()
+
+
+class Wheel(object):
+    """
+    Class to build and install from Wheel files (PEP 427).
+    """
+
+    wheel_version = (1, 1)
+    hash_kind = 'sha256'
+
+    def __init__(self, filename=None, sign=False, verify=False):
+        """
+        Initialise an instance using a (valid) filename.
+        """
+        self.sign = sign
+        self.should_verify = verify
+        self.buildver = ''
+        self.pyver = [PYVER]
+        self.abi = ['none']
+        self.arch = ['any']
+        self.dirname = os.getcwd()
+        if filename is None:
+            self.name = 'dummy'
+            self.version = '0.1'
+            self._filename = self.filename
+        else:
+            m = NAME_VERSION_RE.match(filename)
+            if m:
+                info = m.groupdict('')
+                self.name = info['nm']
+                # Reinstate the local version separator
+                self.version = info['vn'].replace('_', '-')
+                self.buildver = info['bn']
+                self._filename = self.filename
+            else:
+                dirname, filename = os.path.split(filename)
+                m = FILENAME_RE.match(filename)
+                if not m:
+                    raise DistlibException('Invalid name or '
+                                           'filename: %r' % filename)
+                if dirname:
+                    self.dirname = os.path.abspath(dirname)
+                self._filename = filename
+                info = m.groupdict('')
+                self.name = info['nm']
+                self.version = info['vn']
+                self.buildver = info['bn']
+                self.pyver = info['py'].split('.')
+                self.abi = info['bi'].split('.')
+                self.arch = info['ar'].split('.')
+
+    @property
+    def filename(self):
+        """
+        Build and return a filename from the various components.
+        """
+        if self.buildver:
+            buildver = '-' + self.buildver
+        else:
+            buildver = ''
+        pyver = '.'.join(self.pyver)
+        abi = '.'.join(self.abi)
+        arch = '.'.join(self.arch)
+        # replace - with _ as a local version separator
+        version = self.version.replace('-', '_')
+        return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver,
+                                         pyver, abi, arch)
+
+    @property
+    def exists(self):
+        path = os.path.join(self.dirname, self.filename)
+        return os.path.isfile(path)
+
+    @property
+    def tags(self):
+        for pyver in self.pyver:
+            for abi in self.abi:
+                for arch in self.arch:
+                    yield pyver, abi, arch
+
+    @cached_property
+    def metadata(self):
+        pathname = os.path.join(self.dirname, self.filename)
+        name_ver = '%s-%s' % (self.name, self.version)
+        info_dir = '%s.dist-info' % name_ver
+        wrapper = codecs.getreader('utf-8')
+        with ZipFile(pathname, 'r') as zf:
+            wheel_metadata = self.get_wheel_metadata(zf)
+            wv = wheel_metadata['Wheel-Version'].split('.', 1)
+            file_version = tuple([int(i) for i in wv])
+            if file_version < (1, 1):
+                fn = 'METADATA'
+            else:
+                fn = METADATA_FILENAME
+            try:
+                metadata_filename = posixpath.join(info_dir, fn)
+                with zf.open(metadata_filename) as bf:
+                    wf = wrapper(bf)
+                    result = Metadata(fileobj=wf)
+            except KeyError:
+                raise ValueError('Invalid wheel, because %s is '
+                                 'missing' % fn)
+        return result
+
+    def get_wheel_metadata(self, zf):
+        name_ver = '%s-%s' % (self.name, self.version)
+        info_dir = '%s.dist-info' % name_ver
+        metadata_filename = posixpath.join(info_dir, 'WHEEL')
+        with zf.open(metadata_filename) as bf:
+            wf = codecs.getreader('utf-8')(bf)
+            message = message_from_file(wf)
+        return dict(message)
+
+    @cached_property
+    def info(self):
+        pathname = os.path.join(self.dirname, self.filename)
+        with ZipFile(pathname, 'r') as zf:
+            result = self.get_wheel_metadata(zf)
+        return result
+
+    def process_shebang(self, data):
+        m = SHEBANG_RE.match(data)
+        if m:
+            end = m.end()
+            shebang, data_after_shebang = data[:end], data[end:]
+            # Preserve any arguments after the interpreter
+            if b'pythonw' in shebang.lower():
+                shebang_python = SHEBANG_PYTHONW
+            else:
+                shebang_python = SHEBANG_PYTHON
+            m = SHEBANG_DETAIL_RE.match(shebang)
+            if m:
+                args = b' ' + m.groups()[-1]
+            else:
+                args = b''
+            shebang = shebang_python + args
+            data = shebang + data_after_shebang
+        else:
+            cr = data.find(b'\r')
+            lf = data.find(b'\n')
+            if cr < 0 or cr > lf:
+                term = b'\n'
+            else:
+                if data[cr:cr + 2] == b'\r\n':
+                    term = b'\r\n'
+                else:
+                    term = b'\r'
+            data = SHEBANG_PYTHON + term + data
+        return data
+
+    def get_hash(self, data, hash_kind=None):
+        if hash_kind is None:
+            hash_kind = self.hash_kind
+        try:
+            hasher = getattr(hashlib, hash_kind)
+        except AttributeError:
+            raise DistlibException('Unsupported hash algorithm: %r' % hash_kind)
+        result = hasher(data).digest()
+        result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii')
+        return hash_kind, result
+
+    def write_record(self, records, record_path, base):
+        records = list(records) # make a copy for sorting
+        p = to_posix(os.path.relpath(record_path, base))
+        records.append((p, '', ''))
+        records.sort()
+        with CSVWriter(record_path) as writer:
+            for row in records:
+                writer.writerow(row)
+
+    def write_records(self, info, libdir, archive_paths):
+        records = []
+        distinfo, info_dir = info
+        hasher = getattr(hashlib, self.hash_kind)
+        for ap, p in archive_paths:
+            with open(p, 'rb') as f:
+                data = f.read()
+            digest = '%s=%s' % self.get_hash(data)
+            size = os.path.getsize(p)
+            records.append((ap, digest, size))
+
+        p = os.path.join(distinfo, 'RECORD')
+        self.write_record(records, p, libdir)
+        ap = to_posix(os.path.join(info_dir, 'RECORD'))
+        archive_paths.append((ap, p))
+
+    def build_zip(self, pathname, archive_paths):
+        with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf:
+            for ap, p in archive_paths:
+                logger.debug('Wrote %s to %s in wheel', p, ap)
+                zf.write(p, ap)
+
+    def build(self, paths, tags=None, wheel_version=None):
+        """
+        Build a wheel from files in specified paths, and use any specified tags
+        when determining the name of the wheel.
+        """
+        if tags is None:
+            tags = {}
+
+        libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0]
+        if libkey == 'platlib':
+            is_pure = 'false'
+            default_pyver = [IMPVER]
+            default_abi = [ABI]
+            default_arch = [ARCH]
+        else:
+            is_pure = 'true'
+            default_pyver = [PYVER]
+            default_abi = ['none']
+            default_arch = ['any']
+
+        self.pyver = tags.get('pyver', default_pyver)
+        self.abi = tags.get('abi', default_abi)
+        self.arch = tags.get('arch', default_arch)
+
+        libdir = paths[libkey]
+
+        name_ver = '%s-%s' % (self.name, self.version)
+        data_dir = '%s.data' % name_ver
+        info_dir = '%s.dist-info' % name_ver
+
+        archive_paths = []
+
+        # First, stuff which is not in site-packages
+        for key in ('data', 'headers', 'scripts'):
+            if key not in paths:
+                continue
+            path = paths[key]
+            if os.path.isdir(path):
+                for root, dirs, files in os.walk(path):
+                    for fn in files:
+                        p = fsdecode(os.path.join(root, fn))
+                        rp = os.path.relpath(p, path)
+                        ap = to_posix(os.path.join(data_dir, key, rp))
+                        archive_paths.append((ap, p))
+                        if key == 'scripts' and not p.endswith('.exe'):
+                            with open(p, 'rb') as f:
+                                data = f.read()
+                            data = self.process_shebang(data)
+                            with open(p, 'wb') as f:
+                                f.write(data)
+
+        # Now, stuff which is in site-packages, other than the
+        # distinfo stuff.
+        path = libdir
+        distinfo = None
+        for root, dirs, files in os.walk(path):
+            if root == path:
+                # At the top level only, save distinfo for later
+                # and skip it for now
+                for i, dn in enumerate(dirs):
+                    dn = fsdecode(dn)
+                    if dn.endswith('.dist-info'):
+                        distinfo = os.path.join(root, dn)
+                        del dirs[i]
+                        break
+                assert distinfo, '.dist-info directory expected, not found'
+
+            for fn in files:
+                # comment out next suite to leave .pyc files in
+                if fsdecode(fn).endswith(('.pyc', '.pyo')):
+                    continue
+                p = os.path.join(root, fn)
+                rp = to_posix(os.path.relpath(p, path))
+                archive_paths.append((rp, p))
+
+        # Now distinfo. Assumed to be flat, i.e. os.listdir is enough.
+        files = os.listdir(distinfo)
+        for fn in files:
+            if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'):
+                p = fsdecode(os.path.join(distinfo, fn))
+                ap = to_posix(os.path.join(info_dir, fn))
+                archive_paths.append((ap, p))
+
+        wheel_metadata = [
+            'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version),
+            'Generator: distlib %s' % __version__,
+            'Root-Is-Purelib: %s' % is_pure,
+        ]
+        for pyver, abi, arch in self.tags:
+            wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch))
+        p = os.path.join(distinfo, 'WHEEL')
+        with open(p, 'w') as f:
+            f.write('\n'.join(wheel_metadata))
+        ap = to_posix(os.path.join(info_dir, 'WHEEL'))
+        archive_paths.append((ap, p))
+
+        # Now, at last, RECORD.
+        # Paths in here are archive paths - nothing else makes sense.
+        self.write_records((distinfo, info_dir), libdir, archive_paths)
+        # Now, ready to build the zip file
+        pathname = os.path.join(self.dirname, self.filename)
+        self.build_zip(pathname, archive_paths)
+        return pathname
+
+    def install(self, paths, maker, **kwargs):
+        """
+        Install a wheel to the specified paths. If kwarg ``warner`` is
+        specified, it should be a callable, which will be called with two
+        tuples indicating the wheel version of this software and the wheel
+        version in the file, if there is a discrepancy in the versions.
+        This can be used to issue any warnings to raise any exceptions.
+        If kwarg ``lib_only`` is True, only the purelib/platlib files are
+        installed, and the headers, scripts, data and dist-info metadata are
+        not written.
+
+        The return value is a :class:`InstalledDistribution` instance unless
+        ``options.lib_only`` is True, in which case the return value is ``None``.
+        """
+
+        dry_run = maker.dry_run
+        warner = kwargs.get('warner')
+        lib_only = kwargs.get('lib_only', False)
+
+        pathname = os.path.join(self.dirname, self.filename)
+        name_ver = '%s-%s' % (self.name, self.version)
+        data_dir = '%s.data' % name_ver
+        info_dir = '%s.dist-info' % name_ver
+
+        metadata_name = posixpath.join(info_dir, METADATA_FILENAME)
+        wheel_metadata_name = posixpath.join(info_dir, 'WHEEL')
+        record_name = posixpath.join(info_dir, 'RECORD')
+
+        wrapper = codecs.getreader('utf-8')
+
+        with ZipFile(pathname, 'r') as zf:
+            with zf.open(wheel_metadata_name) as bwf:
+                wf = wrapper(bwf)
+                message = message_from_file(wf)
+            wv = message['Wheel-Version'].split('.', 1)
+            file_version = tuple([int(i) for i in wv])
+            if (file_version != self.wheel_version) and warner:
+                warner(self.wheel_version, file_version)
+
+            if message['Root-Is-Purelib'] == 'true':
+                libdir = paths['purelib']
+            else:
+                libdir = paths['platlib']
+
+            records = {}
+            with zf.open(record_name) as bf:
+                with CSVReader(stream=bf) as reader:
+                    for row in reader:
+                        p = row[0]
+                        records[p] = row
+
+            data_pfx = posixpath.join(data_dir, '')
+            info_pfx = posixpath.join(info_dir, '')
+            script_pfx = posixpath.join(data_dir, 'scripts', '')
+
+            # make a new instance rather than a copy of maker's,
+            # as we mutate it
+            fileop = FileOperator(dry_run=dry_run)
+            fileop.record = True    # so we can rollback if needed
+
+            bc = not sys.dont_write_bytecode    # Double negatives. Lovely!
+
+            outfiles = []   # for RECORD writing
+
+            # for script copying/shebang processing
+            workdir = tempfile.mkdtemp()
+            # set target dir later
+            # we default add_launchers to False, as the
+            # Python Launcher should be used instead
+            maker.source_dir = workdir
+            maker.target_dir = None
+            try:
+                for zinfo in zf.infolist():
+                    arcname = zinfo.filename
+                    if isinstance(arcname, text_type):
+                        u_arcname = arcname
+                    else:
+                        u_arcname = arcname.decode('utf-8')
+                    # The signature file won't be in RECORD,
+                    # and we  don't currently don't do anything with it
+                    if u_arcname.endswith('/RECORD.jws'):
+                        continue
+                    row = records[u_arcname]
+                    if row[2] and str(zinfo.file_size) != row[2]:
+                        raise DistlibException('size mismatch for '
+                                               '%s' % u_arcname)
+                    if row[1]:
+                        kind, value = row[1].split('=', 1)
+                        with zf.open(arcname) as bf:
+                            data = bf.read()
+                        _, digest = self.get_hash(data, kind)
+                        if digest != value:
+                            raise DistlibException('digest mismatch for '
+                                                   '%s' % arcname)
+
+                    if lib_only and u_arcname.startswith((info_pfx, data_pfx)):
+                        logger.debug('lib_only: skipping %s', u_arcname)
+                        continue
+                    is_script = (u_arcname.startswith(script_pfx)
+                                 and not u_arcname.endswith('.exe'))
+
+                    if u_arcname.startswith(data_pfx):
+                        _, where, rp = u_arcname.split('/', 2)
+                        outfile = os.path.join(paths[where], convert_path(rp))
+                    else:
+                        # meant for site-packages.
+                        if u_arcname in (wheel_metadata_name, record_name):
+                            continue
+                        outfile = os.path.join(libdir, convert_path(u_arcname))
+                    if not is_script:
+                        with zf.open(arcname) as bf:
+                            fileop.copy_stream(bf, outfile)
+                        outfiles.append(outfile)
+                        # Double check the digest of the written file
+                        if not dry_run and row[1]:
+                            with open(outfile, 'rb') as bf:
+                                data = bf.read()
+                                _, newdigest = self.get_hash(data, kind)
+                                if newdigest != digest:
+                                    raise DistlibException('digest mismatch '
+                                                           'on write for '
+                                                           '%s' % outfile)
+                        if bc and outfile.endswith('.py'):
+                            try:
+                                pyc = fileop.byte_compile(outfile)
+                                outfiles.append(pyc)
+                            except Exception:
+                                # Don't give up if byte-compilation fails,
+                                # but log it and perhaps warn the user
+                                logger.warning('Byte-compilation failed',
+                                               exc_info=True)
+                    else:
+                        fn = os.path.basename(convert_path(arcname))
+                        workname = os.path.join(workdir, fn)
+                        with zf.open(arcname) as bf:
+                            fileop.copy_stream(bf, workname)
+
+                        dn, fn = os.path.split(outfile)
+                        maker.target_dir = dn
+                        filenames = maker.make(fn)
+                        fileop.set_executable_mode(filenames)
+                        outfiles.extend(filenames)
+
+                if lib_only:
+                    logger.debug('lib_only: returning None')
+                    dist = None
+                else:
+                    # Generate scripts
+
+                    # Try to get pydist.json so we can see if there are
+                    # any commands to generate. If this fails (e.g. because
+                    # of a legacy wheel), log a warning but don't give up.
+                    commands = None
+                    file_version = self.info['Wheel-Version']
+                    if file_version == '1.0':
+                        # Use legacy info
+                        ep = posixpath.join(info_dir, 'entry_points.txt')
+                        try:
+                            with zf.open(ep) as bwf:
+                                epdata = read_exports(bwf)
+                            commands = {}
+                            for key in ('console', 'gui'):
+                                k = '%s_scripts' % key
+                                if k in epdata:
+                                    commands['wrap_%s' % key] = d = {}
+                                    for v in epdata[k].values():
+                                        s = '%s:%s' % (v.prefix, v.suffix)
+                                        if v.flags:
+                                            s += ' %s' % v.flags
+                                        d[v.name] = s
+                        except Exception:
+                            logger.warning('Unable to read legacy script '
+                                           'metadata, so cannot generate '
+                                           'scripts')
+                    else:
+                        try:
+                            with zf.open(metadata_name) as bwf:
+                                wf = wrapper(bwf)
+                                commands = json.load(wf).get('extensions')
+                                if commands:
+                                    commands = commands.get('python.commands')
+                        except Exception:
+                            logger.warning('Unable to read JSON metadata, so '
+                                           'cannot generate scripts')
+                    if commands:
+                        console_scripts = commands.get('wrap_console', {})
+                        gui_scripts = commands.get('wrap_gui', {})
+                        if console_scripts or gui_scripts:
+                            script_dir = paths.get('scripts', '')
+                            if not os.path.isdir(script_dir):
+                                raise ValueError('Valid script path not '
+                                                 'specified')
+                            maker.target_dir = script_dir
+                            for k, v in console_scripts.items():
+                                script = '%s = %s' % (k, v)
+                                filenames = maker.make(script)
+                                fileop.set_executable_mode(filenames)
+
+                            if gui_scripts:
+                                options = {'gui': True }
+                                for k, v in gui_scripts.items():
+                                    script = '%s = %s' % (k, v)
+                                    filenames = maker.make(script, options)
+                                    fileop.set_executable_mode(filenames)
+
+                    p = os.path.join(libdir, info_dir)
+                    dist = InstalledDistribution(p)
+
+                    # Write SHARED
+                    paths = dict(paths)     # don't change passed in dict
+                    del paths['purelib']
+                    del paths['platlib']
+                    paths['lib'] = libdir
+                    p = dist.write_shared_locations(paths, dry_run)
+                    if p:
+                        outfiles.append(p)
+
+                    # Write RECORD
+                    dist.write_installed_files(outfiles, paths['prefix'],
+                                               dry_run)
+                return dist
+            except Exception:  # pragma: no cover
+                logger.exception('installation failed.')
+                fileop.rollback()
+                raise
+            finally:
+                shutil.rmtree(workdir)
+
+    def _get_dylib_cache(self):
+        global cache
+        if cache is None:
+            # Use native string to avoid issues on 2.x: see Python #20140.
+            base = os.path.join(get_cache_base(), str('dylib-cache'),
+                                sys.version[:3])
+            cache = Cache(base)
+        return cache
+
+    def _get_extensions(self):
+        pathname = os.path.join(self.dirname, self.filename)
+        name_ver = '%s-%s' % (self.name, self.version)
+        info_dir = '%s.dist-info' % name_ver
+        arcname = posixpath.join(info_dir, 'EXTENSIONS')
+        wrapper = codecs.getreader('utf-8')
+        result = []
+        with ZipFile(pathname, 'r') as zf:
+            try:
+                with zf.open(arcname) as bf:
+                    wf = wrapper(bf)
+                    extensions = json.load(wf)
+                    cache = self._get_dylib_cache()
+                    prefix = cache.prefix_to_dir(pathname)
+                    cache_base = os.path.join(cache.base, prefix)
+                    if not os.path.isdir(cache_base):
+                        os.makedirs(cache_base)
+                    for name, relpath in extensions.items():
+                        dest = os.path.join(cache_base, convert_path(relpath))
+                        if not os.path.exists(dest):
+                            extract = True
+                        else:
+                            file_time = os.stat(dest).st_mtime
+                            file_time = datetime.datetime.fromtimestamp(file_time)
+                            info = zf.getinfo(relpath)
+                            wheel_time = datetime.datetime(*info.date_time)
+                            extract = wheel_time > file_time
+                        if extract:
+                            zf.extract(relpath, cache_base)
+                        result.append((name, dest))
+            except KeyError:
+                pass
+        return result
+
+    def is_compatible(self):
+        """
+        Determine if a wheel is compatible with the running system.
+        """
+        return is_compatible(self)
+
+    def is_mountable(self):
+        """
+        Determine if a wheel is asserted as mountable by its metadata.
+        """
+        return True # for now - metadata details TBD
+
+    def mount(self, append=False):
+        pathname = os.path.abspath(os.path.join(self.dirname, self.filename))
+        if not self.is_compatible():
+            msg = 'Wheel %s not compatible with this Python.' % pathname
+            raise DistlibException(msg)
+        if not self.is_mountable():
+            msg = 'Wheel %s is marked as not mountable.' % pathname
+            raise DistlibException(msg)
+        if pathname in sys.path:
+            logger.debug('%s already in path', pathname)
+        else:
+            if append:
+                sys.path.append(pathname)
+            else:
+                sys.path.insert(0, pathname)
+            extensions = self._get_extensions()
+            if extensions:
+                if _hook not in sys.meta_path:
+                    sys.meta_path.append(_hook)
+                _hook.add(pathname, extensions)
+
+    def unmount(self):
+        pathname = os.path.abspath(os.path.join(self.dirname, self.filename))
+        if pathname not in sys.path:
+            logger.debug('%s not in path', pathname)
+        else:
+            sys.path.remove(pathname)
+            if pathname in _hook.impure_wheels:
+                _hook.remove(pathname)
+            if not _hook.impure_wheels:
+                if _hook in sys.meta_path:
+                    sys.meta_path.remove(_hook)
+
+    def verify(self):
+        pathname = os.path.join(self.dirname, self.filename)
+        name_ver = '%s-%s' % (self.name, self.version)
+        data_dir = '%s.data' % name_ver
+        info_dir = '%s.dist-info' % name_ver
+
+        metadata_name = posixpath.join(info_dir, METADATA_FILENAME)
+        wheel_metadata_name = posixpath.join(info_dir, 'WHEEL')
+        record_name = posixpath.join(info_dir, 'RECORD')
+
+        wrapper = codecs.getreader('utf-8')
+
+        with ZipFile(pathname, 'r') as zf:
+            with zf.open(wheel_metadata_name) as bwf:
+                wf = wrapper(bwf)
+                message = message_from_file(wf)
+            wv = message['Wheel-Version'].split('.', 1)
+            file_version = tuple([int(i) for i in wv])
+            # TODO version verification
+
+            records = {}
+            with zf.open(record_name) as bf:
+                with CSVReader(stream=bf) as reader:
+                    for row in reader:
+                        p = row[0]
+                        records[p] = row
+
+            for zinfo in zf.infolist():
+                arcname = zinfo.filename
+                if isinstance(arcname, text_type):
+                    u_arcname = arcname
+                else:
+                    u_arcname = arcname.decode('utf-8')
+                if '..' in u_arcname:
+                    raise DistlibException('invalid entry in '
+                                           'wheel: %r' % u_arcname)
+
+                # The signature file won't be in RECORD,
+                # and we  don't currently don't do anything with it
+                if u_arcname.endswith('/RECORD.jws'):
+                    continue
+                row = records[u_arcname]
+                if row[2] and str(zinfo.file_size) != row[2]:
+                    raise DistlibException('size mismatch for '
+                                           '%s' % u_arcname)
+                if row[1]:
+                    kind, value = row[1].split('=', 1)
+                    with zf.open(arcname) as bf:
+                        data = bf.read()
+                    _, digest = self.get_hash(data, kind)
+                    if digest != value:
+                        raise DistlibException('digest mismatch for '
+                                               '%s' % arcname)
+
+    def update(self, modifier, dest_dir=None, **kwargs):
+        """
+        Update the contents of a wheel in a generic way. The modifier should
+        be a callable which expects a dictionary argument: its keys are
+        archive-entry paths, and its values are absolute filesystem paths
+        where the contents the corresponding archive entries can be found. The
+        modifier is free to change the contents of the files pointed to, add
+        new entries and remove entries, before returning. This method will
+        extract the entire contents of the wheel to a temporary location, call
+        the modifier, and then use the passed (and possibly updated)
+        dictionary to write a new wheel. If ``dest_dir`` is specified, the new
+        wheel is written there -- otherwise, the original wheel is overwritten.
+
+        The modifier should return True if it updated the wheel, else False.
+        This method returns the same value the modifier returns.
+        """
+
+        def get_version(path_map, info_dir):
+            version = path = None
+            key = '%s/%s' % (info_dir, METADATA_FILENAME)
+            if key not in path_map:
+                key = '%s/PKG-INFO' % info_dir
+            if key in path_map:
+                path = path_map[key]
+                version = Metadata(path=path).version
+            return version, path
+
+        def update_version(version, path):
+            updated = None
+            try:
+                v = NormalizedVersion(version)
+                i = version.find('-')
+                if i < 0:
+                    updated = '%s+1' % version
+                else:
+                    parts = [int(s) for s in version[i + 1:].split('.')]
+                    parts[-1] += 1
+                    updated = '%s+%s' % (version[:i],
+                                         '.'.join(str(i) for i in parts))
+            except UnsupportedVersionError:
+                logger.debug('Cannot update non-compliant (PEP-440) '
+                             'version %r', version)
+            if updated:
+                md = Metadata(path=path)
+                md.version = updated
+                legacy = not path.endswith(METADATA_FILENAME)
+                md.write(path=path, legacy=legacy)
+                logger.debug('Version updated from %r to %r', version,
+                             updated)
+
+        pathname = os.path.join(self.dirname, self.filename)
+        name_ver = '%s-%s' % (self.name, self.version)
+        info_dir = '%s.dist-info' % name_ver
+        record_name = posixpath.join(info_dir, 'RECORD')
+        with tempdir() as workdir:
+            with ZipFile(pathname, 'r') as zf:
+                path_map = {}
+                for zinfo in zf.infolist():
+                    arcname = zinfo.filename
+                    if isinstance(arcname, text_type):
+                        u_arcname = arcname
+                    else:
+                        u_arcname = arcname.decode('utf-8')
+                    if u_arcname == record_name:
+                        continue
+                    if '..' in u_arcname:
+                        raise DistlibException('invalid entry in '
+                                               'wheel: %r' % u_arcname)
+                    zf.extract(zinfo, workdir)
+                    path = os.path.join(workdir, convert_path(u_arcname))
+                    path_map[u_arcname] = path
+
+            # Remember the version.
+            original_version, _ = get_version(path_map, info_dir)
+            # Files extracted. Call the modifier.
+            modified = modifier(path_map, **kwargs)
+            if modified:
+                # Something changed - need to build a new wheel.
+                current_version, path = get_version(path_map, info_dir)
+                if current_version and (current_version == original_version):
+                    # Add or update local version to signify changes.
+                    update_version(current_version, path)
+                # Decide where the new wheel goes.
+                if dest_dir is None:
+                    fd, newpath = tempfile.mkstemp(suffix='.whl',
+                                                   prefix='wheel-update-',
+                                                   dir=workdir)
+                    os.close(fd)
+                else:
+                    if not os.path.isdir(dest_dir):
+                        raise DistlibException('Not a directory: %r' % dest_dir)
+                    newpath = os.path.join(dest_dir, self.filename)
+                archive_paths = list(path_map.items())
+                distinfo = os.path.join(workdir, info_dir)
+                info = distinfo, info_dir
+                self.write_records(info, workdir, archive_paths)
+                self.build_zip(newpath, archive_paths)
+                if dest_dir is None:
+                    shutil.copyfile(newpath, pathname)
+        return modified
+
+def compatible_tags():
+    """
+    Return (pyver, abi, arch) tuples compatible with this Python.
+    """
+    versions = [VER_SUFFIX]
+    major = VER_SUFFIX[0]
+    for minor in range(sys.version_info[1] - 1, - 1, -1):
+        versions.append(''.join([major, str(minor)]))
+
+    abis = []
+    for suffix, _, _ in imp.get_suffixes():
+        if suffix.startswith('.abi'):
+            abis.append(suffix.split('.', 2)[1])
+    abis.sort()
+    if ABI != 'none':
+        abis.insert(0, ABI)
+    abis.append('none')
+    result = []
+
+    arches = [ARCH]
+    if sys.platform == 'darwin':
+        m = re.match('(\w+)_(\d+)_(\d+)_(\w+)$', ARCH)
+        if m:
+            name, major, minor, arch = m.groups()
+            minor = int(minor)
+            matches = [arch]
+            if arch in ('i386', 'ppc'):
+                matches.append('fat')
+            if arch in ('i386', 'ppc', 'x86_64'):
+                matches.append('fat3')
+            if arch in ('ppc64', 'x86_64'):
+                matches.append('fat64')
+            if arch in ('i386', 'x86_64'):
+                matches.append('intel')
+            if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'):
+                matches.append('universal')
+            while minor >= 0:
+                for match in matches:
+                    s = '%s_%s_%s_%s' % (name, major, minor, match)
+                    if s != ARCH:   # already there
+                        arches.append(s)
+                minor -= 1
+
+    # Most specific - our Python version, ABI and arch
+    for abi in abis:
+        for arch in arches:
+            result.append((''.join((IMP_PREFIX, versions[0])), abi, arch))
+
+    # where no ABI / arch dependency, but IMP_PREFIX dependency
+    for i, version in enumerate(versions):
+        result.append((''.join((IMP_PREFIX, version)), 'none', 'any'))
+        if i == 0:
+            result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any'))
+
+    # no IMP_PREFIX, ABI or arch dependency
+    for i, version in enumerate(versions):
+        result.append((''.join(('py', version)), 'none', 'any'))
+        if i == 0:
+            result.append((''.join(('py', version[0])), 'none', 'any'))
+    return set(result)
+
+
+COMPATIBLE_TAGS = compatible_tags()
+
+del compatible_tags
+
+
+def is_compatible(wheel, tags=None):
+    if not isinstance(wheel, Wheel):
+        wheel = Wheel(wheel)    # assume it's a filename
+    result = False
+    if tags is None:
+        tags = COMPATIBLE_TAGS
+    for ver, abi, arch in tags:
+        if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch:
+            result = True
+            break
+    return result
diff --git a/vendor/pip-9.0.3/pip/_vendor/distro.py b/vendor/pip-9.0.3/pip/_vendor/distro.py
new file mode 100644
index 0000000000000000000000000000000000000000..9e7daad2bb476cf1712c3f404b6d541df33d7230
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/distro.py
@@ -0,0 +1,1081 @@
+# Copyright 2015,2016 Nir Cohen
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+The ``distro`` package (``distro`` stands for Linux Distribution) provides
+information about the Linux distribution it runs on, such as a reliable
+machine-readable distro ID, or version information.
+
+It is a renewed alternative implementation for Python's original
+:py:func:`platform.linux_distribution` function, but it provides much more
+functionality. An alternative implementation became necessary because Python
+3.5 deprecated this function, and Python 3.7 is expected to remove it
+altogether. Its predecessor function :py:func:`platform.dist` was already
+deprecated since Python 2.6 and is also expected to be removed in Python 3.7.
+Still, there are many cases in which access to Linux distribution information
+is needed. See `Python issue 1322 <https://bugs.python.org/issue1322>`_ for
+more information.
+"""
+
+import os
+import re
+import sys
+import json
+import shlex
+import logging
+import subprocess
+
+
+if not sys.platform.startswith('linux'):
+    raise ImportError('Unsupported platform: {0}'.format(sys.platform))
+
+_UNIXCONFDIR = '/etc'
+_OS_RELEASE_BASENAME = 'os-release'
+
+#: Translation table for normalizing the "ID" attribute defined in os-release
+#: files, for use by the :func:`distro.id` method.
+#:
+#: * Key: Value as defined in the os-release file, translated to lower case,
+#:   with blanks translated to underscores.
+#:
+#: * Value: Normalized value.
+NORMALIZED_OS_ID = {}
+
+#: Translation table for normalizing the "Distributor ID" attribute returned by
+#: the lsb_release command, for use by the :func:`distro.id` method.
+#:
+#: * Key: Value as returned by the lsb_release command, translated to lower
+#:   case, with blanks translated to underscores.
+#:
+#: * Value: Normalized value.
+NORMALIZED_LSB_ID = {
+    'enterpriseenterprise': 'oracle',  # Oracle Enterprise Linux
+    'redhatenterpriseworkstation': 'rhel',  # RHEL 6.7
+}
+
+#: Translation table for normalizing the distro ID derived from the file name
+#: of distro release files, for use by the :func:`distro.id` method.
+#:
+#: * Key: Value as derived from the file name of a distro release file,
+#:   translated to lower case, with blanks translated to underscores.
+#:
+#: * Value: Normalized value.
+NORMALIZED_DISTRO_ID = {
+    'redhat': 'rhel',  # RHEL 6.x, 7.x
+}
+
+# Pattern for content of distro release file (reversed)
+_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile(
+    r'(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)')
+
+# Pattern for base file name of distro release file
+_DISTRO_RELEASE_BASENAME_PATTERN = re.compile(
+    r'(\w+)[-_](release|version)$')
+
+# Base file names to be ignored when searching for distro release file
+_DISTRO_RELEASE_IGNORE_BASENAMES = (
+    'debian_version',
+    'lsb-release',
+    'oem-release',
+    _OS_RELEASE_BASENAME,
+    'system-release'
+)
+
+
+def linux_distribution(full_distribution_name=True):
+    """
+    Return information about the current Linux distribution as a tuple
+    ``(id_name, version, codename)`` with items as follows:
+
+    * ``id_name``:  If *full_distribution_name* is false, the result of
+      :func:`distro.id`. Otherwise, the result of :func:`distro.name`.
+
+    * ``version``:  The result of :func:`distro.version`.
+
+    * ``codename``:  The result of :func:`distro.codename`.
+
+    The interface of this function is compatible with the original
+    :py:func:`platform.linux_distribution` function, supporting a subset of
+    its parameters.
+
+    The data it returns may not exactly be the same, because it uses more data
+    sources than the original function, and that may lead to different data if
+    the Linux distribution is not consistent across multiple data sources it
+    provides (there are indeed such distributions ...).
+
+    Another reason for differences is the fact that the :func:`distro.id`
+    method normalizes the distro ID string to a reliable machine-readable value
+    for a number of popular Linux distributions.
+    """
+    return _distro.linux_distribution(full_distribution_name)
+
+
+def id():
+    """
+    Return the distro ID of the current Linux distribution, as a
+    machine-readable string.
+
+    For a number of Linux distributions, the returned distro ID value is
+    *reliable*, in the sense that it is documented and that it does not change
+    across releases of the distribution.
+
+    This package maintains the following reliable distro ID values:
+
+    ==============  =========================================
+    Distro ID       Distribution
+    ==============  =========================================
+    "ubuntu"        Ubuntu
+    "debian"        Debian
+    "rhel"          RedHat Enterprise Linux
+    "centos"        CentOS
+    "fedora"        Fedora
+    "sles"          SUSE Linux Enterprise Server
+    "opensuse"      openSUSE
+    "amazon"        Amazon Linux
+    "arch"          Arch Linux
+    "cloudlinux"    CloudLinux OS
+    "exherbo"       Exherbo Linux
+    "gentoo"        GenToo Linux
+    "ibm_powerkvm"  IBM PowerKVM
+    "kvmibm"        KVM for IBM z Systems
+    "linuxmint"     Linux Mint
+    "mageia"        Mageia
+    "mandriva"      Mandriva Linux
+    "parallels"     Parallels
+    "pidora"        Pidora
+    "raspbian"      Raspbian
+    "oracle"        Oracle Linux (and Oracle Enterprise Linux)
+    "scientific"    Scientific Linux
+    "slackware"     Slackware
+    "xenserver"     XenServer
+    ==============  =========================================
+
+    If you have a need to get distros for reliable IDs added into this set,
+    or if you find that the :func:`distro.id` function returns a different
+    distro ID for one of the listed distros, please create an issue in the
+    `distro issue tracker`_.
+
+    **Lookup hierarchy and transformations:**
+
+    First, the ID is obtained from the following sources, in the specified
+    order. The first available and non-empty value is used:
+
+    * the value of the "ID" attribute of the os-release file,
+
+    * the value of the "Distributor ID" attribute returned by the lsb_release
+      command,
+
+    * the first part of the file name of the distro release file,
+
+    The so determined ID value then passes the following transformations,
+    before it is returned by this method:
+
+    * it is translated to lower case,
+
+    * blanks (which should not be there anyway) are translated to underscores,
+
+    * a normalization of the ID is performed, based upon
+      `normalization tables`_. The purpose of this normalization is to ensure
+      that the ID is as reliable as possible, even across incompatible changes
+      in the Linux distributions. A common reason for an incompatible change is
+      the addition of an os-release file, or the addition of the lsb_release
+      command, with ID values that differ from what was previously determined
+      from the distro release file name.
+    """
+    return _distro.id()
+
+
+def name(pretty=False):
+    """
+    Return the name of the current Linux distribution, as a human-readable
+    string.
+
+    If *pretty* is false, the name is returned without version or codename.
+    (e.g. "CentOS Linux")
+
+    If *pretty* is true, the version and codename are appended.
+    (e.g. "CentOS Linux 7.1.1503 (Core)")
+
+    **Lookup hierarchy:**
+
+    The name is obtained from the following sources, in the specified order.
+    The first available and non-empty value is used:
+
+    * If *pretty* is false:
+
+      - the value of the "NAME" attribute of the os-release file,
+
+      - the value of the "Distributor ID" attribute returned by the lsb_release
+        command,
+
+      - the value of the "<name>" field of the distro release file.
+
+    * If *pretty* is true:
+
+      - the value of the "PRETTY_NAME" attribute of the os-release file,
+
+      - the value of the "Description" attribute returned by the lsb_release
+        command,
+
+      - the value of the "<name>" field of the distro release file, appended
+        with the value of the pretty version ("<version_id>" and "<codename>"
+        fields) of the distro release file, if available.
+    """
+    return _distro.name(pretty)
+
+
+def version(pretty=False, best=False):
+    """
+    Return the version of the current Linux distribution, as a human-readable
+    string.
+
+    If *pretty* is false, the version is returned without codename (e.g.
+    "7.0").
+
+    If *pretty* is true, the codename in parenthesis is appended, if the
+    codename is non-empty (e.g. "7.0 (Maipo)").
+
+    Some distributions provide version numbers with different precisions in
+    the different sources of distribution information. Examining the different
+    sources in a fixed priority order does not always yield the most precise
+    version (e.g. for Debian 8.2, or CentOS 7.1).
+
+    The *best* parameter can be used to control the approach for the returned
+    version:
+
+    If *best* is false, the first non-empty version number in priority order of
+    the examined sources is returned.
+
+    If *best* is true, the most precise version number out of all examined
+    sources is returned.
+
+    **Lookup hierarchy:**
+
+    In all cases, the version number is obtained from the following sources.
+    If *best* is false, this order represents the priority order:
+
+    * the value of the "VERSION_ID" attribute of the os-release file,
+    * the value of the "Release" attribute returned by the lsb_release
+      command,
+    * the version number parsed from the "<version_id>" field of the first line
+      of the distro release file,
+    * the version number parsed from the "PRETTY_NAME" attribute of the
+      os-release file, if it follows the format of the distro release files.
+    * the version number parsed from the "Description" attribute returned by
+      the lsb_release command, if it follows the format of the distro release
+      files.
+    """
+    return _distro.version(pretty, best)
+
+
+def version_parts(best=False):
+    """
+    Return the version of the current Linux distribution as a tuple
+    ``(major, minor, build_number)`` with items as follows:
+
+    * ``major``:  The result of :func:`distro.major_version`.
+
+    * ``minor``:  The result of :func:`distro.minor_version`.
+
+    * ``build_number``:  The result of :func:`distro.build_number`.
+
+    For a description of the *best* parameter, see the :func:`distro.version`
+    method.
+    """
+    return _distro.version_parts(best)
+
+
+def major_version(best=False):
+    """
+    Return the major version of the current Linux distribution, as a string,
+    if provided.
+    Otherwise, the empty string is returned. The major version is the first
+    part of the dot-separated version string.
+
+    For a description of the *best* parameter, see the :func:`distro.version`
+    method.
+    """
+    return _distro.major_version(best)
+
+
+def minor_version(best=False):
+    """
+    Return the minor version of the current Linux distribution, as a string,
+    if provided.
+    Otherwise, the empty string is returned. The minor version is the second
+    part of the dot-separated version string.
+
+    For a description of the *best* parameter, see the :func:`distro.version`
+    method.
+    """
+    return _distro.minor_version(best)
+
+
+def build_number(best=False):
+    """
+    Return the build number of the current Linux distribution, as a string,
+    if provided.
+    Otherwise, the empty string is returned. The build number is the third part
+    of the dot-separated version string.
+
+    For a description of the *best* parameter, see the :func:`distro.version`
+    method.
+    """
+    return _distro.build_number(best)
+
+
+def like():
+    """
+    Return a space-separated list of distro IDs of distributions that are
+    closely related to the current Linux distribution in regards to packaging
+    and programming interfaces, for example distributions the current
+    distribution is a derivative from.
+
+    **Lookup hierarchy:**
+
+    This information item is only provided by the os-release file.
+    For details, see the description of the "ID_LIKE" attribute in the
+    `os-release man page
+    <http://www.freedesktop.org/software/systemd/man/os-release.html>`_.
+    """
+    return _distro.like()
+
+
+def codename():
+    """
+    Return the codename for the release of the current Linux distribution,
+    as a string.
+
+    If the distribution does not have a codename, an empty string is returned.
+
+    Note that the returned codename is not always really a codename. For
+    example, openSUSE returns "x86_64". This function does not handle such
+    cases in any special way and just returns the string it finds, if any.
+
+    **Lookup hierarchy:**
+
+    * the codename within the "VERSION" attribute of the os-release file, if
+      provided,
+
+    * the value of the "Codename" attribute returned by the lsb_release
+      command,
+
+    * the value of the "<codename>" field of the distro release file.
+    """
+    return _distro.codename()
+
+
+def info(pretty=False, best=False):
+    """
+    Return certain machine-readable information items about the current Linux
+    distribution in a dictionary, as shown in the following example:
+
+    .. sourcecode:: python
+
+        {
+            'id': 'rhel',
+            'version': '7.0',
+            'version_parts': {
+                'major': '7',
+                'minor': '0',
+                'build_number': ''
+            },
+            'like': 'fedora',
+            'codename': 'Maipo'
+        }
+
+    The dictionary structure and keys are always the same, regardless of which
+    information items are available in the underlying data sources. The values
+    for the various keys are as follows:
+
+    * ``id``:  The result of :func:`distro.id`.
+
+    * ``version``:  The result of :func:`distro.version`.
+
+    * ``version_parts -> major``:  The result of :func:`distro.major_version`.
+
+    * ``version_parts -> minor``:  The result of :func:`distro.minor_version`.
+
+    * ``version_parts -> build_number``:  The result of
+      :func:`distro.build_number`.
+
+    * ``like``:  The result of :func:`distro.like`.
+
+    * ``codename``:  The result of :func:`distro.codename`.
+
+    For a description of the *pretty* and *best* parameters, see the
+    :func:`distro.version` method.
+    """
+    return _distro.info(pretty, best)
+
+
+def os_release_info():
+    """
+    Return a dictionary containing key-value pairs for the information items
+    from the os-release file data source of the current Linux distribution.
+
+    See `os-release file`_ for details about these information items.
+    """
+    return _distro.os_release_info()
+
+
+def lsb_release_info():
+    """
+    Return a dictionary containing key-value pairs for the information items
+    from the lsb_release command data source of the current Linux distribution.
+
+    See `lsb_release command output`_ for details about these information
+    items.
+    """
+    return _distro.lsb_release_info()
+
+
+def distro_release_info():
+    """
+    Return a dictionary containing key-value pairs for the information items
+    from the distro release file data source of the current Linux distribution.
+
+    See `distro release file`_ for details about these information items.
+    """
+    return _distro.distro_release_info()
+
+
+def os_release_attr(attribute):
+    """
+    Return a single named information item from the os-release file data source
+    of the current Linux distribution.
+
+    Parameters:
+
+    * ``attribute`` (string): Key of the information item.
+
+    Returns:
+
+    * (string): Value of the information item, if the item exists.
+      The empty string, if the item does not exist.
+
+    See `os-release file`_ for details about these information items.
+    """
+    return _distro.os_release_attr(attribute)
+
+
+def lsb_release_attr(attribute):
+    """
+    Return a single named information item from the lsb_release command output
+    data source of the current Linux distribution.
+
+    Parameters:
+
+    * ``attribute`` (string): Key of the information item.
+
+    Returns:
+
+    * (string): Value of the information item, if the item exists.
+      The empty string, if the item does not exist.
+
+    See `lsb_release command output`_ for details about these information
+    items.
+    """
+    return _distro.lsb_release_attr(attribute)
+
+
+def distro_release_attr(attribute):
+    """
+    Return a single named information item from the distro release file
+    data source of the current Linux distribution.
+
+    Parameters:
+
+    * ``attribute`` (string): Key of the information item.
+
+    Returns:
+
+    * (string): Value of the information item, if the item exists.
+      The empty string, if the item does not exist.
+
+    See `distro release file`_ for details about these information items.
+    """
+    return _distro.distro_release_attr(attribute)
+
+
+class LinuxDistribution(object):
+    """
+    Provides information about a Linux distribution.
+
+    This package creates a private module-global instance of this class with
+    default initialization arguments, that is used by the
+    `consolidated accessor functions`_ and `single source accessor functions`_.
+    By using default initialization arguments, that module-global instance
+    returns data about the current Linux distribution (i.e. the distro this
+    package runs on).
+
+    Normally, it is not necessary to create additional instances of this class.
+    However, in situations where control is needed over the exact data sources
+    that are used, instances of this class can be created with a specific
+    distro release file, or a specific os-release file, or without invoking the
+    lsb_release command.
+    """
+
+    def __init__(self,
+                 include_lsb=True,
+                 os_release_file='',
+                 distro_release_file=''):
+        """
+        The initialization method of this class gathers information from the
+        available data sources, and stores that in private instance attributes.
+        Subsequent access to the information items uses these private instance
+        attributes, so that the data sources are read only once.
+
+        Parameters:
+
+        * ``include_lsb`` (bool): Controls whether the
+          `lsb_release command output`_ is included as a data source.
+
+          If the lsb_release command is not available in the program execution
+          path, the data source for the lsb_release command will be empty.
+
+        * ``os_release_file`` (string): The path name of the
+          `os-release file`_ that is to be used as a data source.
+
+          An empty string (the default) will cause the default path name to
+          be used (see `os-release file`_ for details).
+
+          If the specified or defaulted os-release file does not exist, the
+          data source for the os-release file will be empty.
+
+        * ``distro_release_file`` (string): The path name of the
+          `distro release file`_ that is to be used as a data source.
+
+          An empty string (the default) will cause a default search algorithm
+          to be used (see `distro release file`_ for details).
+
+          If the specified distro release file does not exist, or if no default
+          distro release file can be found, the data source for the distro
+          release file will be empty.
+
+        Public instance attributes:
+
+        * ``os_release_file`` (string): The path name of the
+          `os-release file`_ that is actually used as a data source. The
+          empty string if no distro release file is used as a data source.
+
+        * ``distro_release_file`` (string): The path name of the
+          `distro release file`_ that is actually used as a data source. The
+          empty string if no distro release file is used as a data source.
+
+        Raises:
+
+        * :py:exc:`IOError`: Some I/O issue with an os-release file or distro
+          release file.
+
+        * :py:exc:`subprocess.CalledProcessError`: The lsb_release command had
+          some issue (other than not being available in the program execution
+          path).
+
+        * :py:exc:`UnicodeError`: A data source has unexpected characters or
+          uses an unexpected encoding.
+        """
+        self.os_release_file = os_release_file or \
+            os.path.join(_UNIXCONFDIR, _OS_RELEASE_BASENAME)
+        self.distro_release_file = distro_release_file or ''  # updated later
+        self._os_release_info = self._get_os_release_info()
+        self._lsb_release_info = self._get_lsb_release_info() \
+            if include_lsb else {}
+        self._distro_release_info = self._get_distro_release_info()
+
+    def __repr__(self):
+        """Return repr of all info
+        """
+        return \
+            "LinuxDistribution(" \
+            "os_release_file={0!r}, " \
+            "distro_release_file={1!r}, " \
+            "_os_release_info={2!r}, " \
+            "_lsb_release_info={3!r}, " \
+            "_distro_release_info={4!r})".format(
+                self.os_release_file,
+                self.distro_release_file,
+                self._os_release_info,
+                self._lsb_release_info,
+                self._distro_release_info)
+
+    def linux_distribution(self, full_distribution_name=True):
+        """
+        Return information about the Linux distribution that is compatible
+        with Python's :func:`platform.linux_distribution`, supporting a subset
+        of its parameters.
+
+        For details, see :func:`distro.linux_distribution`.
+        """
+        return (
+            self.name() if full_distribution_name else self.id(),
+            self.version(),
+            self.codename()
+        )
+
+    def id(self):
+        """Return the distro ID of the Linux distribution, as a string.
+
+        For details, see :func:`distro.id`.
+        """
+        def normalize(distro_id, table):
+            distro_id = distro_id.lower().replace(' ', '_')
+            return table.get(distro_id, distro_id)
+
+        distro_id = self.os_release_attr('id')
+        if distro_id:
+            return normalize(distro_id, NORMALIZED_OS_ID)
+
+        distro_id = self.lsb_release_attr('distributor_id')
+        if distro_id:
+            return normalize(distro_id, NORMALIZED_LSB_ID)
+
+        distro_id = self.distro_release_attr('id')
+        if distro_id:
+            return normalize(distro_id, NORMALIZED_DISTRO_ID)
+
+        return ''
+
+    def name(self, pretty=False):
+        """
+        Return the name of the Linux distribution, as a string.
+
+        For details, see :func:`distro.name`.
+        """
+        name = self.os_release_attr('name') \
+            or self.lsb_release_attr('distributor_id') \
+            or self.distro_release_attr('name')
+        if pretty:
+            name = self.os_release_attr('pretty_name') \
+                or self.lsb_release_attr('description')
+            if not name:
+                name = self.distro_release_attr('name')
+                version = self.version(pretty=True)
+                if version:
+                    name = name + ' ' + version
+        return name or ''
+
+    def version(self, pretty=False, best=False):
+        """
+        Return the version of the Linux distribution, as a string.
+
+        For details, see :func:`distro.version`.
+        """
+        versions = [
+            self.os_release_attr('version_id'),
+            self.lsb_release_attr('release'),
+            self.distro_release_attr('version_id'),
+            self._parse_distro_release_content(
+                self.os_release_attr('pretty_name')).get('version_id', ''),
+            self._parse_distro_release_content(
+                self.lsb_release_attr('description')).get('version_id', '')
+        ]
+        version = ''
+        if best:
+            # This algorithm uses the last version in priority order that has
+            # the best precision. If the versions are not in conflict, that
+            # does not matter; otherwise, using the last one instead of the
+            # first one might be considered a surprise.
+            for v in versions:
+                if v.count(".") > version.count(".") or version == '':
+                    version = v
+        else:
+            for v in versions:
+                if v != '':
+                    version = v
+                    break
+        if pretty and version and self.codename():
+            version = u'{0} ({1})'.format(version, self.codename())
+        return version
+
+    def version_parts(self, best=False):
+        """
+        Return the version of the Linux distribution, as a tuple of version
+        numbers.
+
+        For details, see :func:`distro.version_parts`.
+        """
+        version_str = self.version(best=best)
+        if version_str:
+            version_regex = re.compile(r'(\d+)\.?(\d+)?\.?(\d+)?')
+            matches = version_regex.match(version_str)
+            if matches:
+                major, minor, build_number = matches.groups()
+                return major, minor or '', build_number or ''
+        return '', '', ''
+
+    def major_version(self, best=False):
+        """
+        Return the major version number of the current distribution.
+
+        For details, see :func:`distro.major_version`.
+        """
+        return self.version_parts(best)[0]
+
+    def minor_version(self, best=False):
+        """
+        Return the minor version number of the Linux distribution.
+
+        For details, see :func:`distro.minor_version`.
+        """
+        return self.version_parts(best)[1]
+
+    def build_number(self, best=False):
+        """
+        Return the build number of the Linux distribution.
+
+        For details, see :func:`distro.build_number`.
+        """
+        return self.version_parts(best)[2]
+
+    def like(self):
+        """
+        Return the IDs of distributions that are like the Linux distribution.
+
+        For details, see :func:`distro.like`.
+        """
+        return self.os_release_attr('id_like') or ''
+
+    def codename(self):
+        """
+        Return the codename of the Linux distribution.
+
+        For details, see :func:`distro.codename`.
+        """
+        return self.os_release_attr('codename') \
+            or self.lsb_release_attr('codename') \
+            or self.distro_release_attr('codename') \
+            or ''
+
+    def info(self, pretty=False, best=False):
+        """
+        Return certain machine-readable information about the Linux
+        distribution.
+
+        For details, see :func:`distro.info`.
+        """
+        return dict(
+            id=self.id(),
+            version=self.version(pretty, best),
+            version_parts=dict(
+                major=self.major_version(best),
+                minor=self.minor_version(best),
+                build_number=self.build_number(best)
+            ),
+            like=self.like(),
+            codename=self.codename(),
+        )
+
+    def os_release_info(self):
+        """
+        Return a dictionary containing key-value pairs for the information
+        items from the os-release file data source of the Linux distribution.
+
+        For details, see :func:`distro.os_release_info`.
+        """
+        return self._os_release_info
+
+    def lsb_release_info(self):
+        """
+        Return a dictionary containing key-value pairs for the information
+        items from the lsb_release command data source of the Linux
+        distribution.
+
+        For details, see :func:`distro.lsb_release_info`.
+        """
+        return self._lsb_release_info
+
+    def distro_release_info(self):
+        """
+        Return a dictionary containing key-value pairs for the information
+        items from the distro release file data source of the Linux
+        distribution.
+
+        For details, see :func:`distro.distro_release_info`.
+        """
+        return self._distro_release_info
+
+    def os_release_attr(self, attribute):
+        """
+        Return a single named information item from the os-release file data
+        source of the Linux distribution.
+
+        For details, see :func:`distro.os_release_attr`.
+        """
+        return self._os_release_info.get(attribute, '')
+
+    def lsb_release_attr(self, attribute):
+        """
+        Return a single named information item from the lsb_release command
+        output data source of the Linux distribution.
+
+        For details, see :func:`distro.lsb_release_attr`.
+        """
+        return self._lsb_release_info.get(attribute, '')
+
+    def distro_release_attr(self, attribute):
+        """
+        Return a single named information item from the distro release file
+        data source of the Linux distribution.
+
+        For details, see :func:`distro.distro_release_attr`.
+        """
+        return self._distro_release_info.get(attribute, '')
+
+    def _get_os_release_info(self):
+        """
+        Get the information items from the specified os-release file.
+
+        Returns:
+            A dictionary containing all information items.
+        """
+        if os.path.isfile(self.os_release_file):
+            with open(self.os_release_file) as release_file:
+                return self._parse_os_release_content(release_file)
+        return {}
+
+    @staticmethod
+    def _parse_os_release_content(lines):
+        """
+        Parse the lines of an os-release file.
+
+        Parameters:
+
+        * lines: Iterable through the lines in the os-release file.
+                 Each line must be a unicode string or a UTF-8 encoded byte
+                 string.
+
+        Returns:
+            A dictionary containing all information items.
+        """
+        props = {}
+        lexer = shlex.shlex(lines, posix=True)
+        lexer.whitespace_split = True
+
+        # The shlex module defines its `wordchars` variable using literals,
+        # making it dependent on the encoding of the Python source file.
+        # In Python 2.6 and 2.7, the shlex source file is encoded in
+        # 'iso-8859-1', and the `wordchars` variable is defined as a byte
+        # string. This causes a UnicodeDecodeError to be raised when the
+        # parsed content is a unicode object. The following fix resolves that
+        # (... but it should be fixed in shlex...):
+        if sys.version_info[0] == 2 and isinstance(lexer.wordchars, bytes):
+            lexer.wordchars = lexer.wordchars.decode('iso-8859-1')
+
+        tokens = list(lexer)
+        for token in tokens:
+            # At this point, all shell-like parsing has been done (i.e.
+            # comments processed, quotes and backslash escape sequences
+            # processed, multi-line values assembled, trailing newlines
+            # stripped, etc.), so the tokens are now either:
+            # * variable assignments: var=value
+            # * commands or their arguments (not allowed in os-release)
+            if '=' in token:
+                k, v = token.split('=', 1)
+                if isinstance(v, bytes):
+                    v = v.decode('utf-8')
+                props[k.lower()] = v
+                if k == 'VERSION':
+                    # this handles cases in which the codename is in
+                    # the `(CODENAME)` (rhel, centos, fedora) format
+                    # or in the `, CODENAME` format (Ubuntu).
+                    codename = re.search(r'(\(\D+\))|,(\s+)?\D+', v)
+                    if codename:
+                        codename = codename.group()
+                        codename = codename.strip('()')
+                        codename = codename.strip(',')
+                        codename = codename.strip()
+                        # codename appears within paranthese.
+                        props['codename'] = codename
+                    else:
+                        props['codename'] = ''
+            else:
+                # Ignore any tokens that are not variable assignments
+                pass
+        return props
+
+    def _get_lsb_release_info(self):
+        """
+        Get the information items from the lsb_release command output.
+
+        Returns:
+            A dictionary containing all information items.
+        """
+        cmd = 'lsb_release -a'
+        process = subprocess.Popen(
+            cmd,
+            shell=True,
+            stdout=subprocess.PIPE,
+            stderr=subprocess.PIPE)
+        stdout, stderr = process.communicate()
+        stdout, stderr = stdout.decode('utf-8'), stderr.decode('utf-8')
+        code = process.returncode
+        if code == 0:
+            content = stdout.splitlines()
+            return self._parse_lsb_release_content(content)
+        elif code == 127:  # Command not found
+            return {}
+        else:
+            if sys.version_info[:2] >= (3, 5):
+                raise subprocess.CalledProcessError(code, cmd, stdout, stderr)
+            elif sys.version_info[:2] >= (2, 7):
+                raise subprocess.CalledProcessError(code, cmd, stdout)
+            elif sys.version_info[:2] == (2, 6):
+                raise subprocess.CalledProcessError(code, cmd)
+
+    @staticmethod
+    def _parse_lsb_release_content(lines):
+        """
+        Parse the output of the lsb_release command.
+
+        Parameters:
+
+        * lines: Iterable through the lines of the lsb_release output.
+                 Each line must be a unicode string or a UTF-8 encoded byte
+                 string.
+
+        Returns:
+            A dictionary containing all information items.
+        """
+        props = {}
+        for line in lines:
+            line = line.decode('utf-8') if isinstance(line, bytes) else line
+            kv = line.strip('\n').split(':', 1)
+            if len(kv) != 2:
+                # Ignore lines without colon.
+                continue
+            k, v = kv
+            props.update({k.replace(' ', '_').lower(): v.strip()})
+        return props
+
+    def _get_distro_release_info(self):
+        """
+        Get the information items from the specified distro release file.
+
+        Returns:
+            A dictionary containing all information items.
+        """
+        if self.distro_release_file:
+            # If it was specified, we use it and parse what we can, even if
+            # its file name or content does not match the expected pattern.
+            distro_info = self._parse_distro_release_file(
+                self.distro_release_file)
+            basename = os.path.basename(self.distro_release_file)
+            # The file name pattern for user-specified distro release files
+            # is somewhat more tolerant (compared to when searching for the
+            # file), because we want to use what was specified as best as
+            # possible.
+            match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename)
+            if match:
+                distro_info['id'] = match.group(1)
+            return distro_info
+        else:
+            basenames = os.listdir(_UNIXCONFDIR)
+            # We sort for repeatability in cases where there are multiple
+            # distro specific files; e.g. CentOS, Oracle, Enterprise all
+            # containing `redhat-release` on top of their own.
+            basenames.sort()
+            for basename in basenames:
+                if basename in _DISTRO_RELEASE_IGNORE_BASENAMES:
+                    continue
+                match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename)
+                if match:
+                    filepath = os.path.join(_UNIXCONFDIR, basename)
+                    distro_info = self._parse_distro_release_file(filepath)
+                    if 'name' in distro_info:
+                        # The name is always present if the pattern matches
+                        self.distro_release_file = filepath
+                        distro_info['id'] = match.group(1)
+                        return distro_info
+            return {}
+
+    def _parse_distro_release_file(self, filepath):
+        """
+        Parse a distro release file.
+
+        Parameters:
+
+        * filepath: Path name of the distro release file.
+
+        Returns:
+            A dictionary containing all information items.
+        """
+        if os.path.isfile(filepath):
+            with open(filepath) as fp:
+                # Only parse the first line. For instance, on SLES there
+                # are multiple lines. We don't want them...
+                return self._parse_distro_release_content(fp.readline())
+        return {}
+
+    @staticmethod
+    def _parse_distro_release_content(line):
+        """
+        Parse a line from a distro release file.
+
+        Parameters:
+        * line: Line from the distro release file. Must be a unicode string
+                or a UTF-8 encoded byte string.
+
+        Returns:
+            A dictionary containing all information items.
+        """
+        if isinstance(line, bytes):
+            line = line.decode('utf-8')
+        matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match(
+            line.strip()[::-1])
+        distro_info = {}
+        if matches:
+            # regexp ensures non-None
+            distro_info['name'] = matches.group(3)[::-1]
+            if matches.group(2):
+                distro_info['version_id'] = matches.group(2)[::-1]
+            if matches.group(1):
+                distro_info['codename'] = matches.group(1)[::-1]
+        elif line:
+            distro_info['name'] = line.strip()
+        return distro_info
+
+
+_distro = LinuxDistribution()
+
+
+def main():
+    import argparse
+
+    logger = logging.getLogger(__name__)
+    logger.setLevel(logging.DEBUG)
+    logger.addHandler(logging.StreamHandler(sys.stdout))
+
+    parser = argparse.ArgumentParser(description="Linux distro info tool")
+    parser.add_argument(
+        '--json',
+        '-j',
+        help="Output in machine readable format",
+        action="store_true")
+    args = parser.parse_args()
+
+    if args.json:
+        logger.info(json.dumps(info(), indent=4, sort_keys=True))
+    else:
+        logger.info('Name: %s', name(pretty=True))
+        distribution_version = version(pretty=True)
+        if distribution_version:
+            logger.info('Version: %s', distribution_version)
+        distribution_codename = codename()
+        if distribution_codename:
+            logger.info('Codename: %s', distribution_codename)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/__init__.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..7427eb126a538a61489aa240a166f409b6aab680
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/__init__.py
@@ -0,0 +1,25 @@
+"""
+HTML parsing library based on the WHATWG "HTML5"
+specification. The parser is designed to be compatible with existing
+HTML found in the wild and implements well-defined error recovery that
+is largely compatible with modern desktop web browsers.
+
+Example usage:
+
+import html5lib
+f = open("my_document.html")
+tree = html5lib.parse(f)
+"""
+
+from __future__ import absolute_import, division, unicode_literals
+
+from .html5parser import HTMLParser, parse, parseFragment
+from .treebuilders import getTreeBuilder
+from .treewalkers import getTreeWalker
+from .serializer import serialize
+
+__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder",
+           "getTreeWalker", "serialize"]
+
+# this has to be at the top level, see how setup.py parses this
+__version__ = "1.0b10"
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/_ihatexml.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/_ihatexml.py
new file mode 100644
index 0000000000000000000000000000000000000000..d6d1d6fb7d382493ef4166ee4a999ec7c65d2d8e
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/_ihatexml.py
@@ -0,0 +1,288 @@
+from __future__ import absolute_import, division, unicode_literals
+
+import re
+import warnings
+
+from .constants import DataLossWarning
+
+baseChar = """
+[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] |
+[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] |
+[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] |
+[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 |
+[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] |
+[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] |
+[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] |
+[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] |
+[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 |
+[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] |
+[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] |
+[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D |
+[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] |
+[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] |
+[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] |
+[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] |
+[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] |
+[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] |
+[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 |
+[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] |
+[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] |
+[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] |
+[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] |
+[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] |
+[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] |
+[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] |
+[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] |
+[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] |
+[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] |
+[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A |
+#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 |
+#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] |
+#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] |
+[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] |
+[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C |
+#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 |
+[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] |
+[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] |
+[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 |
+[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] |
+[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B |
+#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE |
+[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] |
+[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 |
+[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] |
+[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]"""
+
+ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]"""
+
+combiningCharacter = """
+[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] |
+[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 |
+[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] |
+[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] |
+#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] |
+[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] |
+[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 |
+#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] |
+[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC |
+[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] |
+#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] |
+[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] |
+[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] |
+[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] |
+[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] |
+[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] |
+#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 |
+[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] |
+#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] |
+[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] |
+[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] |
+#x3099 | #x309A"""
+
+digit = """
+[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] |
+[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] |
+[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] |
+[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]"""
+
+extender = """
+#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 |
+#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]"""
+
+letter = " | ".join([baseChar, ideographic])
+
+# Without the
+name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter,
+                   extender])
+nameFirst = " | ".join([letter, "_"])
+
+reChar = re.compile(r"#x([\d|A-F]{4,4})")
+reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]")
+
+
+def charStringToList(chars):
+    charRanges = [item.strip() for item in chars.split(" | ")]
+    rv = []
+    for item in charRanges:
+        foundMatch = False
+        for regexp in (reChar, reCharRange):
+            match = regexp.match(item)
+            if match is not None:
+                rv.append([hexToInt(item) for item in match.groups()])
+                if len(rv[-1]) == 1:
+                    rv[-1] = rv[-1] * 2
+                foundMatch = True
+                break
+        if not foundMatch:
+            assert len(item) == 1
+
+            rv.append([ord(item)] * 2)
+    rv = normaliseCharList(rv)
+    return rv
+
+
+def normaliseCharList(charList):
+    charList = sorted(charList)
+    for item in charList:
+        assert item[1] >= item[0]
+    rv = []
+    i = 0
+    while i < len(charList):
+        j = 1
+        rv.append(charList[i])
+        while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1:
+            rv[-1][1] = charList[i + j][1]
+            j += 1
+        i += j
+    return rv
+
+# We don't really support characters above the BMP :(
+max_unicode = int("FFFF", 16)
+
+
+def missingRanges(charList):
+    rv = []
+    if charList[0] != 0:
+        rv.append([0, charList[0][0] - 1])
+    for i, item in enumerate(charList[:-1]):
+        rv.append([item[1] + 1, charList[i + 1][0] - 1])
+    if charList[-1][1] != max_unicode:
+        rv.append([charList[-1][1] + 1, max_unicode])
+    return rv
+
+
+def listToRegexpStr(charList):
+    rv = []
+    for item in charList:
+        if item[0] == item[1]:
+            rv.append(escapeRegexp(chr(item[0])))
+        else:
+            rv.append(escapeRegexp(chr(item[0])) + "-" +
+                      escapeRegexp(chr(item[1])))
+    return "[%s]" % "".join(rv)
+
+
+def hexToInt(hex_str):
+    return int(hex_str, 16)
+
+
+def escapeRegexp(string):
+    specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}",
+                         "[", "]", "|", "(", ")", "-")
+    for char in specialCharacters:
+        string = string.replace(char, "\\" + char)
+
+    return string
+
+# output from the above
+nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]')  # noqa
+
+nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]')  # noqa
+
+# Simpler things
+nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\-\'()+,./:=?;!*#@$_%]")
+
+
+class InfosetFilter(object):
+    replacementRegexp = re.compile(r"U[\dA-F]{5,5}")
+
+    def __init__(self,
+                 dropXmlnsLocalName=False,
+                 dropXmlnsAttrNs=False,
+                 preventDoubleDashComments=False,
+                 preventDashAtCommentEnd=False,
+                 replaceFormFeedCharacters=True,
+                 preventSingleQuotePubid=False):
+
+        self.dropXmlnsLocalName = dropXmlnsLocalName
+        self.dropXmlnsAttrNs = dropXmlnsAttrNs
+
+        self.preventDoubleDashComments = preventDoubleDashComments
+        self.preventDashAtCommentEnd = preventDashAtCommentEnd
+
+        self.replaceFormFeedCharacters = replaceFormFeedCharacters
+
+        self.preventSingleQuotePubid = preventSingleQuotePubid
+
+        self.replaceCache = {}
+
+    def coerceAttribute(self, name, namespace=None):
+        if self.dropXmlnsLocalName and name.startswith("xmlns:"):
+            warnings.warn("Attributes cannot begin with xmlns", DataLossWarning)
+            return None
+        elif (self.dropXmlnsAttrNs and
+              namespace == "http://www.w3.org/2000/xmlns/"):
+            warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning)
+            return None
+        else:
+            return self.toXmlName(name)
+
+    def coerceElement(self, name):
+        return self.toXmlName(name)
+
+    def coerceComment(self, data):
+        if self.preventDoubleDashComments:
+            while "--" in data:
+                warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning)
+                data = data.replace("--", "- -")
+            if data.endswith("-"):
+                warnings.warn("Comments cannot end in a dash", DataLossWarning)
+                data += " "
+        return data
+
+    def coerceCharacters(self, data):
+        if self.replaceFormFeedCharacters:
+            for _ in range(data.count("\x0C")):
+                warnings.warn("Text cannot contain U+000C", DataLossWarning)
+            data = data.replace("\x0C", " ")
+        # Other non-xml characters
+        return data
+
+    def coercePubid(self, data):
+        dataOutput = data
+        for char in nonPubidCharRegexp.findall(data):
+            warnings.warn("Coercing non-XML pubid", DataLossWarning)
+            replacement = self.getReplacementCharacter(char)
+            dataOutput = dataOutput.replace(char, replacement)
+        if self.preventSingleQuotePubid and dataOutput.find("'") >= 0:
+            warnings.warn("Pubid cannot contain single quote", DataLossWarning)
+            dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'"))
+        return dataOutput
+
+    def toXmlName(self, name):
+        nameFirst = name[0]
+        nameRest = name[1:]
+        m = nonXmlNameFirstBMPRegexp.match(nameFirst)
+        if m:
+            warnings.warn("Coercing non-XML name", DataLossWarning)
+            nameFirstOutput = self.getReplacementCharacter(nameFirst)
+        else:
+            nameFirstOutput = nameFirst
+
+        nameRestOutput = nameRest
+        replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest))
+        for char in replaceChars:
+            warnings.warn("Coercing non-XML name", DataLossWarning)
+            replacement = self.getReplacementCharacter(char)
+            nameRestOutput = nameRestOutput.replace(char, replacement)
+        return nameFirstOutput + nameRestOutput
+
+    def getReplacementCharacter(self, char):
+        if char in self.replaceCache:
+            replacement = self.replaceCache[char]
+        else:
+            replacement = self.escapeChar(char)
+        return replacement
+
+    def fromXmlName(self, name):
+        for item in set(self.replacementRegexp.findall(name)):
+            name = name.replace(item, self.unescapeChar(item))
+        return name
+
+    def escapeChar(self, char):
+        replacement = "U%05X" % ord(char)
+        self.replaceCache[char] = replacement
+        return replacement
+
+    def unescapeChar(self, charcode):
+        return chr(int(charcode[1:], 16))
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/_inputstream.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/_inputstream.py
new file mode 100644
index 0000000000000000000000000000000000000000..7c5639ff8c0f7fd43283b7f22ea014e52dbf7f40
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/_inputstream.py
@@ -0,0 +1,923 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from pip._vendor.six import text_type, binary_type
+from pip._vendor.six.moves import http_client, urllib
+
+import codecs
+import re
+
+from pip._vendor import webencodings
+
+from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase
+from .constants import ReparseException
+from . import _utils
+
+from io import StringIO
+
+try:
+    from io import BytesIO
+except ImportError:
+    BytesIO = StringIO
+
+# Non-unicode versions of constants for use in the pre-parser
+spaceCharactersBytes = frozenset([item.encode("ascii") for item in spaceCharacters])
+asciiLettersBytes = frozenset([item.encode("ascii") for item in asciiLetters])
+asciiUppercaseBytes = frozenset([item.encode("ascii") for item in asciiUppercase])
+spacesAngleBrackets = spaceCharactersBytes | frozenset([b">", b"<"])
+
+
+invalid_unicode_no_surrogate = "[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]"  # noqa
+
+if _utils.supports_lone_surrogates:
+    # Use one extra step of indirection and create surrogates with
+    # eval. Not using this indirection would introduce an illegal
+    # unicode literal on platforms not supporting such lone
+    # surrogates.
+    assert invalid_unicode_no_surrogate[-1] == "]" and invalid_unicode_no_surrogate.count("]") == 1
+    invalid_unicode_re = re.compile(invalid_unicode_no_surrogate[:-1] +
+                                    eval('"\\uD800-\\uDFFF"') +  # pylint:disable=eval-used
+                                    "]")
+else:
+    invalid_unicode_re = re.compile(invalid_unicode_no_surrogate)
+
+non_bmp_invalid_codepoints = set([0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE,
+                                  0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF,
+                                  0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE,
+                                  0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF,
+                                  0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE,
+                                  0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF,
+                                  0x10FFFE, 0x10FFFF])
+
+ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E]")
+
+# Cache for charsUntil()
+charsUntilRegEx = {}
+
+
+class BufferedStream(object):
+    """Buffering for streams that do not have buffering of their own
+
+    The buffer is implemented as a list of chunks on the assumption that
+    joining many strings will be slow since it is O(n**2)
+    """
+
+    def __init__(self, stream):
+        self.stream = stream
+        self.buffer = []
+        self.position = [-1, 0]  # chunk number, offset
+
+    def tell(self):
+        pos = 0
+        for chunk in self.buffer[:self.position[0]]:
+            pos += len(chunk)
+        pos += self.position[1]
+        return pos
+
+    def seek(self, pos):
+        assert pos <= self._bufferedBytes()
+        offset = pos
+        i = 0
+        while len(self.buffer[i]) < offset:
+            offset -= len(self.buffer[i])
+            i += 1
+        self.position = [i, offset]
+
+    def read(self, bytes):
+        if not self.buffer:
+            return self._readStream(bytes)
+        elif (self.position[0] == len(self.buffer) and
+              self.position[1] == len(self.buffer[-1])):
+            return self._readStream(bytes)
+        else:
+            return self._readFromBuffer(bytes)
+
+    def _bufferedBytes(self):
+        return sum([len(item) for item in self.buffer])
+
+    def _readStream(self, bytes):
+        data = self.stream.read(bytes)
+        self.buffer.append(data)
+        self.position[0] += 1
+        self.position[1] = len(data)
+        return data
+
+    def _readFromBuffer(self, bytes):
+        remainingBytes = bytes
+        rv = []
+        bufferIndex = self.position[0]
+        bufferOffset = self.position[1]
+        while bufferIndex < len(self.buffer) and remainingBytes != 0:
+            assert remainingBytes > 0
+            bufferedData = self.buffer[bufferIndex]
+
+            if remainingBytes <= len(bufferedData) - bufferOffset:
+                bytesToRead = remainingBytes
+                self.position = [bufferIndex, bufferOffset + bytesToRead]
+            else:
+                bytesToRead = len(bufferedData) - bufferOffset
+                self.position = [bufferIndex, len(bufferedData)]
+                bufferIndex += 1
+            rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead])
+            remainingBytes -= bytesToRead
+
+            bufferOffset = 0
+
+        if remainingBytes:
+            rv.append(self._readStream(remainingBytes))
+
+        return b"".join(rv)
+
+
+def HTMLInputStream(source, **kwargs):
+    # Work around Python bug #20007: read(0) closes the connection.
+    # http://bugs.python.org/issue20007
+    if (isinstance(source, http_client.HTTPResponse) or
+        # Also check for addinfourl wrapping HTTPResponse
+        (isinstance(source, urllib.response.addbase) and
+         isinstance(source.fp, http_client.HTTPResponse))):
+        isUnicode = False
+    elif hasattr(source, "read"):
+        isUnicode = isinstance(source.read(0), text_type)
+    else:
+        isUnicode = isinstance(source, text_type)
+
+    if isUnicode:
+        encodings = [x for x in kwargs if x.endswith("_encoding")]
+        if encodings:
+            raise TypeError("Cannot set an encoding with a unicode input, set %r" % encodings)
+
+        return HTMLUnicodeInputStream(source, **kwargs)
+    else:
+        return HTMLBinaryInputStream(source, **kwargs)
+
+
+class HTMLUnicodeInputStream(object):
+    """Provides a unicode stream of characters to the HTMLTokenizer.
+
+    This class takes care of character encoding and removing or replacing
+    incorrect byte-sequences and also provides column and line tracking.
+
+    """
+
+    _defaultChunkSize = 10240
+
+    def __init__(self, source):
+        """Initialises the HTMLInputStream.
+
+        HTMLInputStream(source, [encoding]) -> Normalized stream from source
+        for use by html5lib.
+
+        source can be either a file-object, local filename or a string.
+
+        The optional encoding parameter must be a string that indicates
+        the encoding.  If specified, that encoding will be used,
+        regardless of any BOM or later declaration (such as in a meta
+        element)
+
+        """
+
+        if not _utils.supports_lone_surrogates:
+            # Such platforms will have already checked for such
+            # surrogate errors, so no need to do this checking.
+            self.reportCharacterErrors = None
+        elif len("\U0010FFFF") == 1:
+            self.reportCharacterErrors = self.characterErrorsUCS4
+        else:
+            self.reportCharacterErrors = self.characterErrorsUCS2
+
+        # List of where new lines occur
+        self.newLines = [0]
+
+        self.charEncoding = (lookupEncoding("utf-8"), "certain")
+        self.dataStream = self.openStream(source)
+
+        self.reset()
+
+    def reset(self):
+        self.chunk = ""
+        self.chunkSize = 0
+        self.chunkOffset = 0
+        self.errors = []
+
+        # number of (complete) lines in previous chunks
+        self.prevNumLines = 0
+        # number of columns in the last line of the previous chunk
+        self.prevNumCols = 0
+
+        # Deal with CR LF and surrogates split over chunk boundaries
+        self._bufferedCharacter = None
+
+    def openStream(self, source):
+        """Produces a file object from source.
+
+        source can be either a file object, local filename or a string.
+
+        """
+        # Already a file object
+        if hasattr(source, 'read'):
+            stream = source
+        else:
+            stream = StringIO(source)
+
+        return stream
+
+    def _position(self, offset):
+        chunk = self.chunk
+        nLines = chunk.count('\n', 0, offset)
+        positionLine = self.prevNumLines + nLines
+        lastLinePos = chunk.rfind('\n', 0, offset)
+        if lastLinePos == -1:
+            positionColumn = self.prevNumCols + offset
+        else:
+            positionColumn = offset - (lastLinePos + 1)
+        return (positionLine, positionColumn)
+
+    def position(self):
+        """Returns (line, col) of the current position in the stream."""
+        line, col = self._position(self.chunkOffset)
+        return (line + 1, col)
+
+    def char(self):
+        """ Read one character from the stream or queue if available. Return
+            EOF when EOF is reached.
+        """
+        # Read a new chunk from the input stream if necessary
+        if self.chunkOffset >= self.chunkSize:
+            if not self.readChunk():
+                return EOF
+
+        chunkOffset = self.chunkOffset
+        char = self.chunk[chunkOffset]
+        self.chunkOffset = chunkOffset + 1
+
+        return char
+
+    def readChunk(self, chunkSize=None):
+        if chunkSize is None:
+            chunkSize = self._defaultChunkSize
+
+        self.prevNumLines, self.prevNumCols = self._position(self.chunkSize)
+
+        self.chunk = ""
+        self.chunkSize = 0
+        self.chunkOffset = 0
+
+        data = self.dataStream.read(chunkSize)
+
+        # Deal with CR LF and surrogates broken across chunks
+        if self._bufferedCharacter:
+            data = self._bufferedCharacter + data
+            self._bufferedCharacter = None
+        elif not data:
+            # We have no more data, bye-bye stream
+            return False
+
+        if len(data) > 1:
+            lastv = ord(data[-1])
+            if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF:
+                self._bufferedCharacter = data[-1]
+                data = data[:-1]
+
+        if self.reportCharacterErrors:
+            self.reportCharacterErrors(data)
+
+        # Replace invalid characters
+        data = data.replace("\r\n", "\n")
+        data = data.replace("\r", "\n")
+
+        self.chunk = data
+        self.chunkSize = len(data)
+
+        return True
+
+    def characterErrorsUCS4(self, data):
+        for _ in range(len(invalid_unicode_re.findall(data))):
+            self.errors.append("invalid-codepoint")
+
+    def characterErrorsUCS2(self, data):
+        # Someone picked the wrong compile option
+        # You lose
+        skip = False
+        for match in invalid_unicode_re.finditer(data):
+            if skip:
+                continue
+            codepoint = ord(match.group())
+            pos = match.start()
+            # Pretty sure there should be endianness issues here
+            if _utils.isSurrogatePair(data[pos:pos + 2]):
+                # We have a surrogate pair!
+                char_val = _utils.surrogatePairToCodepoint(data[pos:pos + 2])
+                if char_val in non_bmp_invalid_codepoints:
+                    self.errors.append("invalid-codepoint")
+                skip = True
+            elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and
+                  pos == len(data) - 1):
+                self.errors.append("invalid-codepoint")
+            else:
+                skip = False
+                self.errors.append("invalid-codepoint")
+
+    def charsUntil(self, characters, opposite=False):
+        """ Returns a string of characters from the stream up to but not
+        including any character in 'characters' or EOF. 'characters' must be
+        a container that supports the 'in' method and iteration over its
+        characters.
+        """
+
+        # Use a cache of regexps to find the required characters
+        try:
+            chars = charsUntilRegEx[(characters, opposite)]
+        except KeyError:
+            if __debug__:
+                for c in characters:
+                    assert(ord(c) < 128)
+            regex = "".join(["\\x%02x" % ord(c) for c in characters])
+            if not opposite:
+                regex = "^%s" % regex
+            chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex)
+
+        rv = []
+
+        while True:
+            # Find the longest matching prefix
+            m = chars.match(self.chunk, self.chunkOffset)
+            if m is None:
+                # If nothing matched, and it wasn't because we ran out of chunk,
+                # then stop
+                if self.chunkOffset != self.chunkSize:
+                    break
+            else:
+                end = m.end()
+                # If not the whole chunk matched, return everything
+                # up to the part that didn't match
+                if end != self.chunkSize:
+                    rv.append(self.chunk[self.chunkOffset:end])
+                    self.chunkOffset = end
+                    break
+            # If the whole remainder of the chunk matched,
+            # use it all and read the next chunk
+            rv.append(self.chunk[self.chunkOffset:])
+            if not self.readChunk():
+                # Reached EOF
+                break
+
+        r = "".join(rv)
+        return r
+
+    def unget(self, char):
+        # Only one character is allowed to be ungotten at once - it must
+        # be consumed again before any further call to unget
+        if char is not None:
+            if self.chunkOffset == 0:
+                # unget is called quite rarely, so it's a good idea to do
+                # more work here if it saves a bit of work in the frequently
+                # called char and charsUntil.
+                # So, just prepend the ungotten character onto the current
+                # chunk:
+                self.chunk = char + self.chunk
+                self.chunkSize += 1
+            else:
+                self.chunkOffset -= 1
+                assert self.chunk[self.chunkOffset] == char
+
+
+class HTMLBinaryInputStream(HTMLUnicodeInputStream):
+    """Provides a unicode stream of characters to the HTMLTokenizer.
+
+    This class takes care of character encoding and removing or replacing
+    incorrect byte-sequences and also provides column and line tracking.
+
+    """
+
+    def __init__(self, source, override_encoding=None, transport_encoding=None,
+                 same_origin_parent_encoding=None, likely_encoding=None,
+                 default_encoding="windows-1252", useChardet=True):
+        """Initialises the HTMLInputStream.
+
+        HTMLInputStream(source, [encoding]) -> Normalized stream from source
+        for use by html5lib.
+
+        source can be either a file-object, local filename or a string.
+
+        The optional encoding parameter must be a string that indicates
+        the encoding.  If specified, that encoding will be used,
+        regardless of any BOM or later declaration (such as in a meta
+        element)
+
+        """
+        # Raw Stream - for unicode objects this will encode to utf-8 and set
+        #              self.charEncoding as appropriate
+        self.rawStream = self.openStream(source)
+
+        HTMLUnicodeInputStream.__init__(self, self.rawStream)
+
+        # Encoding Information
+        # Number of bytes to use when looking for a meta element with
+        # encoding information
+        self.numBytesMeta = 1024
+        # Number of bytes to use when using detecting encoding using chardet
+        self.numBytesChardet = 100
+        # Things from args
+        self.override_encoding = override_encoding
+        self.transport_encoding = transport_encoding
+        self.same_origin_parent_encoding = same_origin_parent_encoding
+        self.likely_encoding = likely_encoding
+        self.default_encoding = default_encoding
+
+        # Determine encoding
+        self.charEncoding = self.determineEncoding(useChardet)
+        assert self.charEncoding[0] is not None
+
+        # Call superclass
+        self.reset()
+
+    def reset(self):
+        self.dataStream = self.charEncoding[0].codec_info.streamreader(self.rawStream, 'replace')
+        HTMLUnicodeInputStream.reset(self)
+
+    def openStream(self, source):
+        """Produces a file object from source.
+
+        source can be either a file object, local filename or a string.
+
+        """
+        # Already a file object
+        if hasattr(source, 'read'):
+            stream = source
+        else:
+            stream = BytesIO(source)
+
+        try:
+            stream.seek(stream.tell())
+        except:  # pylint:disable=bare-except
+            stream = BufferedStream(stream)
+
+        return stream
+
+    def determineEncoding(self, chardet=True):
+        # BOMs take precedence over everything
+        # This will also read past the BOM if present
+        charEncoding = self.detectBOM(), "certain"
+        if charEncoding[0] is not None:
+            return charEncoding
+
+        # If we've been overriden, we've been overriden
+        charEncoding = lookupEncoding(self.override_encoding), "certain"
+        if charEncoding[0] is not None:
+            return charEncoding
+
+        # Now check the transport layer
+        charEncoding = lookupEncoding(self.transport_encoding), "certain"
+        if charEncoding[0] is not None:
+            return charEncoding
+
+        # Look for meta elements with encoding information
+        charEncoding = self.detectEncodingMeta(), "tentative"
+        if charEncoding[0] is not None:
+            return charEncoding
+
+        # Parent document encoding
+        charEncoding = lookupEncoding(self.same_origin_parent_encoding), "tentative"
+        if charEncoding[0] is not None and not charEncoding[0].name.startswith("utf-16"):
+            return charEncoding
+
+        # "likely" encoding
+        charEncoding = lookupEncoding(self.likely_encoding), "tentative"
+        if charEncoding[0] is not None:
+            return charEncoding
+
+        # Guess with chardet, if available
+        if chardet:
+            try:
+                from chardet.universaldetector import UniversalDetector
+            except ImportError:
+                pass
+            else:
+                buffers = []
+                detector = UniversalDetector()
+                while not detector.done:
+                    buffer = self.rawStream.read(self.numBytesChardet)
+                    assert isinstance(buffer, bytes)
+                    if not buffer:
+                        break
+                    buffers.append(buffer)
+                    detector.feed(buffer)
+                detector.close()
+                encoding = lookupEncoding(detector.result['encoding'])
+                self.rawStream.seek(0)
+                if encoding is not None:
+                    return encoding, "tentative"
+
+        # Try the default encoding
+        charEncoding = lookupEncoding(self.default_encoding), "tentative"
+        if charEncoding[0] is not None:
+            return charEncoding
+
+        # Fallback to html5lib's default if even that hasn't worked
+        return lookupEncoding("windows-1252"), "tentative"
+
+    def changeEncoding(self, newEncoding):
+        assert self.charEncoding[1] != "certain"
+        newEncoding = lookupEncoding(newEncoding)
+        if newEncoding is None:
+            return
+        if newEncoding.name in ("utf-16be", "utf-16le"):
+            newEncoding = lookupEncoding("utf-8")
+            assert newEncoding is not None
+        elif newEncoding == self.charEncoding[0]:
+            self.charEncoding = (self.charEncoding[0], "certain")
+        else:
+            self.rawStream.seek(0)
+            self.charEncoding = (newEncoding, "certain")
+            self.reset()
+            raise ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding))
+
+    def detectBOM(self):
+        """Attempts to detect at BOM at the start of the stream. If
+        an encoding can be determined from the BOM return the name of the
+        encoding otherwise return None"""
+        bomDict = {
+            codecs.BOM_UTF8: 'utf-8',
+            codecs.BOM_UTF16_LE: 'utf-16le', codecs.BOM_UTF16_BE: 'utf-16be',
+            codecs.BOM_UTF32_LE: 'utf-32le', codecs.BOM_UTF32_BE: 'utf-32be'
+        }
+
+        # Go to beginning of file and read in 4 bytes
+        string = self.rawStream.read(4)
+        assert isinstance(string, bytes)
+
+        # Try detecting the BOM using bytes from the string
+        encoding = bomDict.get(string[:3])         # UTF-8
+        seek = 3
+        if not encoding:
+            # Need to detect UTF-32 before UTF-16
+            encoding = bomDict.get(string)         # UTF-32
+            seek = 4
+            if not encoding:
+                encoding = bomDict.get(string[:2])  # UTF-16
+                seek = 2
+
+        # Set the read position past the BOM if one was found, otherwise
+        # set it to the start of the stream
+        if encoding:
+            self.rawStream.seek(seek)
+            return lookupEncoding(encoding)
+        else:
+            self.rawStream.seek(0)
+            return None
+
+    def detectEncodingMeta(self):
+        """Report the encoding declared by the meta element
+        """
+        buffer = self.rawStream.read(self.numBytesMeta)
+        assert isinstance(buffer, bytes)
+        parser = EncodingParser(buffer)
+        self.rawStream.seek(0)
+        encoding = parser.getEncoding()
+
+        if encoding is not None and encoding.name in ("utf-16be", "utf-16le"):
+            encoding = lookupEncoding("utf-8")
+
+        return encoding
+
+
+class EncodingBytes(bytes):
+    """String-like object with an associated position and various extra methods
+    If the position is ever greater than the string length then an exception is
+    raised"""
+    def __new__(self, value):
+        assert isinstance(value, bytes)
+        return bytes.__new__(self, value.lower())
+
+    def __init__(self, value):
+        # pylint:disable=unused-argument
+        self._position = -1
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        p = self._position = self._position + 1
+        if p >= len(self):
+            raise StopIteration
+        elif p < 0:
+            raise TypeError
+        return self[p:p + 1]
+
+    def next(self):
+        # Py2 compat
+        return self.__next__()
+
+    def previous(self):
+        p = self._position
+        if p >= len(self):
+            raise StopIteration
+        elif p < 0:
+            raise TypeError
+        self._position = p = p - 1
+        return self[p:p + 1]
+
+    def setPosition(self, position):
+        if self._position >= len(self):
+            raise StopIteration
+        self._position = position
+
+    def getPosition(self):
+        if self._position >= len(self):
+            raise StopIteration
+        if self._position >= 0:
+            return self._position
+        else:
+            return None
+
+    position = property(getPosition, setPosition)
+
+    def getCurrentByte(self):
+        return self[self.position:self.position + 1]
+
+    currentByte = property(getCurrentByte)
+
+    def skip(self, chars=spaceCharactersBytes):
+        """Skip past a list of characters"""
+        p = self.position               # use property for the error-checking
+        while p < len(self):
+            c = self[p:p + 1]
+            if c not in chars:
+                self._position = p
+                return c
+            p += 1
+        self._position = p
+        return None
+
+    def skipUntil(self, chars):
+        p = self.position
+        while p < len(self):
+            c = self[p:p + 1]
+            if c in chars:
+                self._position = p
+                return c
+            p += 1
+        self._position = p
+        return None
+
+    def matchBytes(self, bytes):
+        """Look for a sequence of bytes at the start of a string. If the bytes
+        are found return True and advance the position to the byte after the
+        match. Otherwise return False and leave the position alone"""
+        p = self.position
+        data = self[p:p + len(bytes)]
+        rv = data.startswith(bytes)
+        if rv:
+            self.position += len(bytes)
+        return rv
+
+    def jumpTo(self, bytes):
+        """Look for the next sequence of bytes matching a given sequence. If
+        a match is found advance the position to the last byte of the match"""
+        newPosition = self[self.position:].find(bytes)
+        if newPosition > -1:
+            # XXX: This is ugly, but I can't see a nicer way to fix this.
+            if self._position == -1:
+                self._position = 0
+            self._position += (newPosition + len(bytes) - 1)
+            return True
+        else:
+            raise StopIteration
+
+
+class EncodingParser(object):
+    """Mini parser for detecting character encoding from meta elements"""
+
+    def __init__(self, data):
+        """string - the data to work on for encoding detection"""
+        self.data = EncodingBytes(data)
+        self.encoding = None
+
+    def getEncoding(self):
+        methodDispatch = (
+            (b"<!--", self.handleComment),
+            (b"<meta", self.handleMeta),
+            (b"</", self.handlePossibleEndTag),
+            (b"<!", self.handleOther),
+            (b"<?", self.handleOther),
+            (b"<", self.handlePossibleStartTag))
+        for _ in self.data:
+            keepParsing = True
+            for key, method in methodDispatch:
+                if self.data.matchBytes(key):
+                    try:
+                        keepParsing = method()
+                        break
+                    except StopIteration:
+                        keepParsing = False
+                        break
+            if not keepParsing:
+                break
+
+        return self.encoding
+
+    def handleComment(self):
+        """Skip over comments"""
+        return self.data.jumpTo(b"-->")
+
+    def handleMeta(self):
+        if self.data.currentByte not in spaceCharactersBytes:
+            # if we have <meta not followed by a space so just keep going
+            return True
+        # We have a valid meta element we want to search for attributes
+        hasPragma = False
+        pendingEncoding = None
+        while True:
+            # Try to find the next attribute after the current position
+            attr = self.getAttribute()
+            if attr is None:
+                return True
+            else:
+                if attr[0] == b"http-equiv":
+                    hasPragma = attr[1] == b"content-type"
+                    if hasPragma and pendingEncoding is not None:
+                        self.encoding = pendingEncoding
+                        return False
+                elif attr[0] == b"charset":
+                    tentativeEncoding = attr[1]
+                    codec = lookupEncoding(tentativeEncoding)
+                    if codec is not None:
+                        self.encoding = codec
+                        return False
+                elif attr[0] == b"content":
+                    contentParser = ContentAttrParser(EncodingBytes(attr[1]))
+                    tentativeEncoding = contentParser.parse()
+                    if tentativeEncoding is not None:
+                        codec = lookupEncoding(tentativeEncoding)
+                        if codec is not None:
+                            if hasPragma:
+                                self.encoding = codec
+                                return False
+                            else:
+                                pendingEncoding = codec
+
+    def handlePossibleStartTag(self):
+        return self.handlePossibleTag(False)
+
+    def handlePossibleEndTag(self):
+        next(self.data)
+        return self.handlePossibleTag(True)
+
+    def handlePossibleTag(self, endTag):
+        data = self.data
+        if data.currentByte not in asciiLettersBytes:
+            # If the next byte is not an ascii letter either ignore this
+            # fragment (possible start tag case) or treat it according to
+            # handleOther
+            if endTag:
+                data.previous()
+                self.handleOther()
+            return True
+
+        c = data.skipUntil(spacesAngleBrackets)
+        if c == b"<":
+            # return to the first step in the overall "two step" algorithm
+            # reprocessing the < byte
+            data.previous()
+        else:
+            # Read all attributes
+            attr = self.getAttribute()
+            while attr is not None:
+                attr = self.getAttribute()
+        return True
+
+    def handleOther(self):
+        return self.data.jumpTo(b">")
+
+    def getAttribute(self):
+        """Return a name,value pair for the next attribute in the stream,
+        if one is found, or None"""
+        data = self.data
+        # Step 1 (skip chars)
+        c = data.skip(spaceCharactersBytes | frozenset([b"/"]))
+        assert c is None or len(c) == 1
+        # Step 2
+        if c in (b">", None):
+            return None
+        # Step 3
+        attrName = []
+        attrValue = []
+        # Step 4 attribute name
+        while True:
+            if c == b"=" and attrName:
+                break
+            elif c in spaceCharactersBytes:
+                # Step 6!
+                c = data.skip()
+                break
+            elif c in (b"/", b">"):
+                return b"".join(attrName), b""
+            elif c in asciiUppercaseBytes:
+                attrName.append(c.lower())
+            elif c is None:
+                return None
+            else:
+                attrName.append(c)
+            # Step 5
+            c = next(data)
+        # Step 7
+        if c != b"=":
+            data.previous()
+            return b"".join(attrName), b""
+        # Step 8
+        next(data)
+        # Step 9
+        c = data.skip()
+        # Step 10
+        if c in (b"'", b'"'):
+            # 10.1
+            quoteChar = c
+            while True:
+                # 10.2
+                c = next(data)
+                # 10.3
+                if c == quoteChar:
+                    next(data)
+                    return b"".join(attrName), b"".join(attrValue)
+                # 10.4
+                elif c in asciiUppercaseBytes:
+                    attrValue.append(c.lower())
+                # 10.5
+                else:
+                    attrValue.append(c)
+        elif c == b">":
+            return b"".join(attrName), b""
+        elif c in asciiUppercaseBytes:
+            attrValue.append(c.lower())
+        elif c is None:
+            return None
+        else:
+            attrValue.append(c)
+        # Step 11
+        while True:
+            c = next(data)
+            if c in spacesAngleBrackets:
+                return b"".join(attrName), b"".join(attrValue)
+            elif c in asciiUppercaseBytes:
+                attrValue.append(c.lower())
+            elif c is None:
+                return None
+            else:
+                attrValue.append(c)
+
+
+class ContentAttrParser(object):
+    def __init__(self, data):
+        assert isinstance(data, bytes)
+        self.data = data
+
+    def parse(self):
+        try:
+            # Check if the attr name is charset
+            # otherwise return
+            self.data.jumpTo(b"charset")
+            self.data.position += 1
+            self.data.skip()
+            if not self.data.currentByte == b"=":
+                # If there is no = sign keep looking for attrs
+                return None
+            self.data.position += 1
+            self.data.skip()
+            # Look for an encoding between matching quote marks
+            if self.data.currentByte in (b'"', b"'"):
+                quoteMark = self.data.currentByte
+                self.data.position += 1
+                oldPosition = self.data.position
+                if self.data.jumpTo(quoteMark):
+                    return self.data[oldPosition:self.data.position]
+                else:
+                    return None
+            else:
+                # Unquoted value
+                oldPosition = self.data.position
+                try:
+                    self.data.skipUntil(spaceCharactersBytes)
+                    return self.data[oldPosition:self.data.position]
+                except StopIteration:
+                    # Return the whole remaining value
+                    return self.data[oldPosition:]
+        except StopIteration:
+            return None
+
+
+def lookupEncoding(encoding):
+    """Return the python codec name corresponding to an encoding or None if the
+    string doesn't correspond to a valid encoding."""
+    if isinstance(encoding, binary_type):
+        try:
+            encoding = encoding.decode("ascii")
+        except UnicodeDecodeError:
+            return None
+
+    if encoding is not None:
+        try:
+            return webencodings.lookup(encoding)
+        except AttributeError:
+            return None
+    else:
+        return None
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/_tokenizer.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/_tokenizer.py
new file mode 100644
index 0000000000000000000000000000000000000000..178f6e7fa8c79abe6d18f0c60adfe0c239eb97e1
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/_tokenizer.py
@@ -0,0 +1,1721 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from pip._vendor.six import unichr as chr
+
+from collections import deque
+
+from .constants import spaceCharacters
+from .constants import entities
+from .constants import asciiLetters, asciiUpper2Lower
+from .constants import digits, hexDigits, EOF
+from .constants import tokenTypes, tagTokenTypes
+from .constants import replacementCharacters
+
+from ._inputstream import HTMLInputStream
+
+from ._trie import Trie
+
+entitiesTrie = Trie(entities)
+
+
+class HTMLTokenizer(object):
+    """ This class takes care of tokenizing HTML.
+
+    * self.currentToken
+      Holds the token that is currently being processed.
+
+    * self.state
+      Holds a reference to the method to be invoked... XXX
+
+    * self.stream
+      Points to HTMLInputStream object.
+    """
+
+    def __init__(self, stream, parser=None, **kwargs):
+
+        self.stream = HTMLInputStream(stream, **kwargs)
+        self.parser = parser
+
+        # Setup the initial tokenizer state
+        self.escapeFlag = False
+        self.lastFourChars = []
+        self.state = self.dataState
+        self.escape = False
+
+        # The current token being created
+        self.currentToken = None
+        super(HTMLTokenizer, self).__init__()
+
+    def __iter__(self):
+        """ This is where the magic happens.
+
+        We do our usually processing through the states and when we have a token
+        to return we yield the token which pauses processing until the next token
+        is requested.
+        """
+        self.tokenQueue = deque([])
+        # Start processing. When EOF is reached self.state will return False
+        # instead of True and the loop will terminate.
+        while self.state():
+            while self.stream.errors:
+                yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)}
+            while self.tokenQueue:
+                yield self.tokenQueue.popleft()
+
+    def consumeNumberEntity(self, isHex):
+        """This function returns either U+FFFD or the character based on the
+        decimal or hexadecimal representation. It also discards ";" if present.
+        If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked.
+        """
+
+        allowed = digits
+        radix = 10
+        if isHex:
+            allowed = hexDigits
+            radix = 16
+
+        charStack = []
+
+        # Consume all the characters that are in range while making sure we
+        # don't hit an EOF.
+        c = self.stream.char()
+        while c in allowed and c is not EOF:
+            charStack.append(c)
+            c = self.stream.char()
+
+        # Convert the set of characters consumed to an int.
+        charAsInt = int("".join(charStack), radix)
+
+        # Certain characters get replaced with others
+        if charAsInt in replacementCharacters:
+            char = replacementCharacters[charAsInt]
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "illegal-codepoint-for-numeric-entity",
+                                    "datavars": {"charAsInt": charAsInt}})
+        elif ((0xD800 <= charAsInt <= 0xDFFF) or
+              (charAsInt > 0x10FFFF)):
+            char = "\uFFFD"
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "illegal-codepoint-for-numeric-entity",
+                                    "datavars": {"charAsInt": charAsInt}})
+        else:
+            # Should speed up this check somehow (e.g. move the set to a constant)
+            if ((0x0001 <= charAsInt <= 0x0008) or
+                (0x000E <= charAsInt <= 0x001F) or
+                (0x007F <= charAsInt <= 0x009F) or
+                (0xFDD0 <= charAsInt <= 0xFDEF) or
+                charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE,
+                                        0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE,
+                                        0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE,
+                                        0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE,
+                                        0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE,
+                                        0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE,
+                                        0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE,
+                                        0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE,
+                                        0xFFFFF, 0x10FFFE, 0x10FFFF])):
+                self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                        "data":
+                                        "illegal-codepoint-for-numeric-entity",
+                                        "datavars": {"charAsInt": charAsInt}})
+            try:
+                # Try/except needed as UCS-2 Python builds' unichar only works
+                # within the BMP.
+                char = chr(charAsInt)
+            except ValueError:
+                v = charAsInt - 0x10000
+                char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF))
+
+        # Discard the ; if present. Otherwise, put it back on the queue and
+        # invoke parseError on parser.
+        if c != ";":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "numeric-entity-without-semicolon"})
+            self.stream.unget(c)
+
+        return char
+
+    def consumeEntity(self, allowedChar=None, fromAttribute=False):
+        # Initialise to the default output for when no entity is matched
+        output = "&"
+
+        charStack = [self.stream.char()]
+        if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") or
+                (allowedChar is not None and allowedChar == charStack[0])):
+            self.stream.unget(charStack[0])
+
+        elif charStack[0] == "#":
+            # Read the next character to see if it's hex or decimal
+            hex = False
+            charStack.append(self.stream.char())
+            if charStack[-1] in ("x", "X"):
+                hex = True
+                charStack.append(self.stream.char())
+
+            # charStack[-1] should be the first digit
+            if (hex and charStack[-1] in hexDigits) \
+                    or (not hex and charStack[-1] in digits):
+                # At least one digit found, so consume the whole number
+                self.stream.unget(charStack[-1])
+                output = self.consumeNumberEntity(hex)
+            else:
+                # No digits found
+                self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                        "data": "expected-numeric-entity"})
+                self.stream.unget(charStack.pop())
+                output = "&" + "".join(charStack)
+
+        else:
+            # At this point in the process might have named entity. Entities
+            # are stored in the global variable "entities".
+            #
+            # Consume characters and compare to these to a substring of the
+            # entity names in the list until the substring no longer matches.
+            while (charStack[-1] is not EOF):
+                if not entitiesTrie.has_keys_with_prefix("".join(charStack)):
+                    break
+                charStack.append(self.stream.char())
+
+            # At this point we have a string that starts with some characters
+            # that may match an entity
+            # Try to find the longest entity the string will match to take care
+            # of &noti for instance.
+            try:
+                entityName = entitiesTrie.longest_prefix("".join(charStack[:-1]))
+                entityLength = len(entityName)
+            except KeyError:
+                entityName = None
+
+            if entityName is not None:
+                if entityName[-1] != ";":
+                    self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                            "named-entity-without-semicolon"})
+                if (entityName[-1] != ";" and fromAttribute and
+                    (charStack[entityLength] in asciiLetters or
+                     charStack[entityLength] in digits or
+                     charStack[entityLength] == "=")):
+                    self.stream.unget(charStack.pop())
+                    output = "&" + "".join(charStack)
+                else:
+                    output = entities[entityName]
+                    self.stream.unget(charStack.pop())
+                    output += "".join(charStack[entityLength:])
+            else:
+                self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                        "expected-named-entity"})
+                self.stream.unget(charStack.pop())
+                output = "&" + "".join(charStack)
+
+        if fromAttribute:
+            self.currentToken["data"][-1][1] += output
+        else:
+            if output in spaceCharacters:
+                tokenType = "SpaceCharacters"
+            else:
+                tokenType = "Characters"
+            self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output})
+
+    def processEntityInAttribute(self, allowedChar):
+        """This method replaces the need for "entityInAttributeValueState".
+        """
+        self.consumeEntity(allowedChar=allowedChar, fromAttribute=True)
+
+    def emitCurrentToken(self):
+        """This method is a generic handler for emitting the tags. It also sets
+        the state to "data" because that's what's needed after a token has been
+        emitted.
+        """
+        token = self.currentToken
+        # Add token to the queue to be yielded
+        if (token["type"] in tagTokenTypes):
+            token["name"] = token["name"].translate(asciiUpper2Lower)
+            if token["type"] == tokenTypes["EndTag"]:
+                if token["data"]:
+                    self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                            "data": "attributes-in-end-tag"})
+                if token["selfClosing"]:
+                    self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                            "data": "self-closing-flag-on-end-tag"})
+        self.tokenQueue.append(token)
+        self.state = self.dataState
+
+    # Below are the various tokenizer states worked out.
+    def dataState(self):
+        data = self.stream.char()
+        if data == "&":
+            self.state = self.entityDataState
+        elif data == "<":
+            self.state = self.tagOpenState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\u0000"})
+        elif data is EOF:
+            # Tokenization ends.
+            return False
+        elif data in spaceCharacters:
+            # Directly after emitting a token you switch back to the "data
+            # state". At that point spaceCharacters are important so they are
+            # emitted separately.
+            self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data":
+                                    data + self.stream.charsUntil(spaceCharacters, True)})
+            # No need to update lastFourChars here, since the first space will
+            # have already been appended to lastFourChars and will have broken
+            # any <!-- or --> sequences
+        else:
+            chars = self.stream.charsUntil(("&", "<", "\u0000"))
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
+                                    data + chars})
+        return True
+
+    def entityDataState(self):
+        self.consumeEntity()
+        self.state = self.dataState
+        return True
+
+    def rcdataState(self):
+        data = self.stream.char()
+        if data == "&":
+            self.state = self.characterReferenceInRcdata
+        elif data == "<":
+            self.state = self.rcdataLessThanSignState
+        elif data == EOF:
+            # Tokenization ends.
+            return False
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+        elif data in spaceCharacters:
+            # Directly after emitting a token you switch back to the "data
+            # state". At that point spaceCharacters are important so they are
+            # emitted separately.
+            self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data":
+                                    data + self.stream.charsUntil(spaceCharacters, True)})
+            # No need to update lastFourChars here, since the first space will
+            # have already been appended to lastFourChars and will have broken
+            # any <!-- or --> sequences
+        else:
+            chars = self.stream.charsUntil(("&", "<", "\u0000"))
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
+                                    data + chars})
+        return True
+
+    def characterReferenceInRcdata(self):
+        self.consumeEntity()
+        self.state = self.rcdataState
+        return True
+
+    def rawtextState(self):
+        data = self.stream.char()
+        if data == "<":
+            self.state = self.rawtextLessThanSignState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+        elif data == EOF:
+            # Tokenization ends.
+            return False
+        else:
+            chars = self.stream.charsUntil(("<", "\u0000"))
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
+                                    data + chars})
+        return True
+
+    def scriptDataState(self):
+        data = self.stream.char()
+        if data == "<":
+            self.state = self.scriptDataLessThanSignState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+        elif data == EOF:
+            # Tokenization ends.
+            return False
+        else:
+            chars = self.stream.charsUntil(("<", "\u0000"))
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
+                                    data + chars})
+        return True
+
+    def plaintextState(self):
+        data = self.stream.char()
+        if data == EOF:
+            # Tokenization ends.
+            return False
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
+                                    data + self.stream.charsUntil("\u0000")})
+        return True
+
+    def tagOpenState(self):
+        data = self.stream.char()
+        if data == "!":
+            self.state = self.markupDeclarationOpenState
+        elif data == "/":
+            self.state = self.closeTagOpenState
+        elif data in asciiLetters:
+            self.currentToken = {"type": tokenTypes["StartTag"],
+                                 "name": data, "data": [],
+                                 "selfClosing": False,
+                                 "selfClosingAcknowledged": False}
+            self.state = self.tagNameState
+        elif data == ">":
+            # XXX In theory it could be something besides a tag name. But
+            # do we really care?
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-tag-name-but-got-right-bracket"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"})
+            self.state = self.dataState
+        elif data == "?":
+            # XXX In theory it could be something besides a tag name. But
+            # do we really care?
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-tag-name-but-got-question-mark"})
+            self.stream.unget(data)
+            self.state = self.bogusCommentState
+        else:
+            # XXX
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-tag-name"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
+            self.stream.unget(data)
+            self.state = self.dataState
+        return True
+
+    def closeTagOpenState(self):
+        data = self.stream.char()
+        if data in asciiLetters:
+            self.currentToken = {"type": tokenTypes["EndTag"], "name": data,
+                                 "data": [], "selfClosing": False}
+            self.state = self.tagNameState
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-closing-tag-but-got-right-bracket"})
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-closing-tag-but-got-eof"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"})
+            self.state = self.dataState
+        else:
+            # XXX data can be _'_...
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-closing-tag-but-got-char",
+                                    "datavars": {"data": data}})
+            self.stream.unget(data)
+            self.state = self.bogusCommentState
+        return True
+
+    def tagNameState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.state = self.beforeAttributeNameState
+        elif data == ">":
+            self.emitCurrentToken()
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-tag-name"})
+            self.state = self.dataState
+        elif data == "/":
+            self.state = self.selfClosingStartTagState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["name"] += "\uFFFD"
+        else:
+            self.currentToken["name"] += data
+            # (Don't use charsUntil here, because tag names are
+            # very short and it's faster to not do anything fancy)
+        return True
+
+    def rcdataLessThanSignState(self):
+        data = self.stream.char()
+        if data == "/":
+            self.temporaryBuffer = ""
+            self.state = self.rcdataEndTagOpenState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
+            self.stream.unget(data)
+            self.state = self.rcdataState
+        return True
+
+    def rcdataEndTagOpenState(self):
+        data = self.stream.char()
+        if data in asciiLetters:
+            self.temporaryBuffer += data
+            self.state = self.rcdataEndTagNameState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"})
+            self.stream.unget(data)
+            self.state = self.rcdataState
+        return True
+
+    def rcdataEndTagNameState(self):
+        appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower()
+        data = self.stream.char()
+        if data in spaceCharacters and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.state = self.beforeAttributeNameState
+        elif data == "/" and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.state = self.selfClosingStartTagState
+        elif data == ">" and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.emitCurrentToken()
+            self.state = self.dataState
+        elif data in asciiLetters:
+            self.temporaryBuffer += data
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "</" + self.temporaryBuffer})
+            self.stream.unget(data)
+            self.state = self.rcdataState
+        return True
+
+    def rawtextLessThanSignState(self):
+        data = self.stream.char()
+        if data == "/":
+            self.temporaryBuffer = ""
+            self.state = self.rawtextEndTagOpenState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
+            self.stream.unget(data)
+            self.state = self.rawtextState
+        return True
+
+    def rawtextEndTagOpenState(self):
+        data = self.stream.char()
+        if data in asciiLetters:
+            self.temporaryBuffer += data
+            self.state = self.rawtextEndTagNameState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"})
+            self.stream.unget(data)
+            self.state = self.rawtextState
+        return True
+
+    def rawtextEndTagNameState(self):
+        appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower()
+        data = self.stream.char()
+        if data in spaceCharacters and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.state = self.beforeAttributeNameState
+        elif data == "/" and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.state = self.selfClosingStartTagState
+        elif data == ">" and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.emitCurrentToken()
+            self.state = self.dataState
+        elif data in asciiLetters:
+            self.temporaryBuffer += data
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "</" + self.temporaryBuffer})
+            self.stream.unget(data)
+            self.state = self.rawtextState
+        return True
+
+    def scriptDataLessThanSignState(self):
+        data = self.stream.char()
+        if data == "/":
+            self.temporaryBuffer = ""
+            self.state = self.scriptDataEndTagOpenState
+        elif data == "!":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<!"})
+            self.state = self.scriptDataEscapeStartState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
+            self.stream.unget(data)
+            self.state = self.scriptDataState
+        return True
+
+    def scriptDataEndTagOpenState(self):
+        data = self.stream.char()
+        if data in asciiLetters:
+            self.temporaryBuffer += data
+            self.state = self.scriptDataEndTagNameState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"})
+            self.stream.unget(data)
+            self.state = self.scriptDataState
+        return True
+
+    def scriptDataEndTagNameState(self):
+        appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower()
+        data = self.stream.char()
+        if data in spaceCharacters and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.state = self.beforeAttributeNameState
+        elif data == "/" and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.state = self.selfClosingStartTagState
+        elif data == ">" and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.emitCurrentToken()
+            self.state = self.dataState
+        elif data in asciiLetters:
+            self.temporaryBuffer += data
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "</" + self.temporaryBuffer})
+            self.stream.unget(data)
+            self.state = self.scriptDataState
+        return True
+
+    def scriptDataEscapeStartState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
+            self.state = self.scriptDataEscapeStartDashState
+        else:
+            self.stream.unget(data)
+            self.state = self.scriptDataState
+        return True
+
+    def scriptDataEscapeStartDashState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
+            self.state = self.scriptDataEscapedDashDashState
+        else:
+            self.stream.unget(data)
+            self.state = self.scriptDataState
+        return True
+
+    def scriptDataEscapedState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
+            self.state = self.scriptDataEscapedDashState
+        elif data == "<":
+            self.state = self.scriptDataEscapedLessThanSignState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+        elif data == EOF:
+            self.state = self.dataState
+        else:
+            chars = self.stream.charsUntil(("<", "-", "\u0000"))
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
+                                    data + chars})
+        return True
+
+    def scriptDataEscapedDashState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
+            self.state = self.scriptDataEscapedDashDashState
+        elif data == "<":
+            self.state = self.scriptDataEscapedLessThanSignState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+            self.state = self.scriptDataEscapedState
+        elif data == EOF:
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+            self.state = self.scriptDataEscapedState
+        return True
+
+    def scriptDataEscapedDashDashState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
+        elif data == "<":
+            self.state = self.scriptDataEscapedLessThanSignState
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"})
+            self.state = self.scriptDataState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+            self.state = self.scriptDataEscapedState
+        elif data == EOF:
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+            self.state = self.scriptDataEscapedState
+        return True
+
+    def scriptDataEscapedLessThanSignState(self):
+        data = self.stream.char()
+        if data == "/":
+            self.temporaryBuffer = ""
+            self.state = self.scriptDataEscapedEndTagOpenState
+        elif data in asciiLetters:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data})
+            self.temporaryBuffer = data
+            self.state = self.scriptDataDoubleEscapeStartState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
+            self.stream.unget(data)
+            self.state = self.scriptDataEscapedState
+        return True
+
+    def scriptDataEscapedEndTagOpenState(self):
+        data = self.stream.char()
+        if data in asciiLetters:
+            self.temporaryBuffer = data
+            self.state = self.scriptDataEscapedEndTagNameState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"})
+            self.stream.unget(data)
+            self.state = self.scriptDataEscapedState
+        return True
+
+    def scriptDataEscapedEndTagNameState(self):
+        appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower()
+        data = self.stream.char()
+        if data in spaceCharacters and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.state = self.beforeAttributeNameState
+        elif data == "/" and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.state = self.selfClosingStartTagState
+        elif data == ">" and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.emitCurrentToken()
+            self.state = self.dataState
+        elif data in asciiLetters:
+            self.temporaryBuffer += data
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "</" + self.temporaryBuffer})
+            self.stream.unget(data)
+            self.state = self.scriptDataEscapedState
+        return True
+
+    def scriptDataDoubleEscapeStartState(self):
+        data = self.stream.char()
+        if data in (spaceCharacters | frozenset(("/", ">"))):
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+            if self.temporaryBuffer.lower() == "script":
+                self.state = self.scriptDataDoubleEscapedState
+            else:
+                self.state = self.scriptDataEscapedState
+        elif data in asciiLetters:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+            self.temporaryBuffer += data
+        else:
+            self.stream.unget(data)
+            self.state = self.scriptDataEscapedState
+        return True
+
+    def scriptDataDoubleEscapedState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
+            self.state = self.scriptDataDoubleEscapedDashState
+        elif data == "<":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
+            self.state = self.scriptDataDoubleEscapedLessThanSignState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+        elif data == EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-script-in-script"})
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+        return True
+
+    def scriptDataDoubleEscapedDashState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
+            self.state = self.scriptDataDoubleEscapedDashDashState
+        elif data == "<":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
+            self.state = self.scriptDataDoubleEscapedLessThanSignState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+            self.state = self.scriptDataDoubleEscapedState
+        elif data == EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-script-in-script"})
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+            self.state = self.scriptDataDoubleEscapedState
+        return True
+
+    def scriptDataDoubleEscapedDashDashState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
+        elif data == "<":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
+            self.state = self.scriptDataDoubleEscapedLessThanSignState
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"})
+            self.state = self.scriptDataState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+            self.state = self.scriptDataDoubleEscapedState
+        elif data == EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-script-in-script"})
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+            self.state = self.scriptDataDoubleEscapedState
+        return True
+
+    def scriptDataDoubleEscapedLessThanSignState(self):
+        data = self.stream.char()
+        if data == "/":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"})
+            self.temporaryBuffer = ""
+            self.state = self.scriptDataDoubleEscapeEndState
+        else:
+            self.stream.unget(data)
+            self.state = self.scriptDataDoubleEscapedState
+        return True
+
+    def scriptDataDoubleEscapeEndState(self):
+        data = self.stream.char()
+        if data in (spaceCharacters | frozenset(("/", ">"))):
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+            if self.temporaryBuffer.lower() == "script":
+                self.state = self.scriptDataEscapedState
+            else:
+                self.state = self.scriptDataDoubleEscapedState
+        elif data in asciiLetters:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+            self.temporaryBuffer += data
+        else:
+            self.stream.unget(data)
+            self.state = self.scriptDataDoubleEscapedState
+        return True
+
+    def beforeAttributeNameState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.stream.charsUntil(spaceCharacters, True)
+        elif data in asciiLetters:
+            self.currentToken["data"].append([data, ""])
+            self.state = self.attributeNameState
+        elif data == ">":
+            self.emitCurrentToken()
+        elif data == "/":
+            self.state = self.selfClosingStartTagState
+        elif data in ("'", '"', "=", "<"):
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "invalid-character-in-attribute-name"})
+            self.currentToken["data"].append([data, ""])
+            self.state = self.attributeNameState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"].append(["\uFFFD", ""])
+            self.state = self.attributeNameState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-attribute-name-but-got-eof"})
+            self.state = self.dataState
+        else:
+            self.currentToken["data"].append([data, ""])
+            self.state = self.attributeNameState
+        return True
+
+    def attributeNameState(self):
+        data = self.stream.char()
+        leavingThisState = True
+        emitToken = False
+        if data == "=":
+            self.state = self.beforeAttributeValueState
+        elif data in asciiLetters:
+            self.currentToken["data"][-1][0] += data +\
+                self.stream.charsUntil(asciiLetters, True)
+            leavingThisState = False
+        elif data == ">":
+            # XXX If we emit here the attributes are converted to a dict
+            # without being checked and when the code below runs we error
+            # because data is a dict not a list
+            emitToken = True
+        elif data in spaceCharacters:
+            self.state = self.afterAttributeNameState
+        elif data == "/":
+            self.state = self.selfClosingStartTagState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"][-1][0] += "\uFFFD"
+            leavingThisState = False
+        elif data in ("'", '"', "<"):
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data":
+                                    "invalid-character-in-attribute-name"})
+            self.currentToken["data"][-1][0] += data
+            leavingThisState = False
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "eof-in-attribute-name"})
+            self.state = self.dataState
+        else:
+            self.currentToken["data"][-1][0] += data
+            leavingThisState = False
+
+        if leavingThisState:
+            # Attributes are not dropped at this stage. That happens when the
+            # start tag token is emitted so values can still be safely appended
+            # to attributes, but we do want to report the parse error in time.
+            self.currentToken["data"][-1][0] = (
+                self.currentToken["data"][-1][0].translate(asciiUpper2Lower))
+            for name, _ in self.currentToken["data"][:-1]:
+                if self.currentToken["data"][-1][0] == name:
+                    self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                            "duplicate-attribute"})
+                    break
+            # XXX Fix for above XXX
+            if emitToken:
+                self.emitCurrentToken()
+        return True
+
+    def afterAttributeNameState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.stream.charsUntil(spaceCharacters, True)
+        elif data == "=":
+            self.state = self.beforeAttributeValueState
+        elif data == ">":
+            self.emitCurrentToken()
+        elif data in asciiLetters:
+            self.currentToken["data"].append([data, ""])
+            self.state = self.attributeNameState
+        elif data == "/":
+            self.state = self.selfClosingStartTagState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"].append(["\uFFFD", ""])
+            self.state = self.attributeNameState
+        elif data in ("'", '"', "<"):
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "invalid-character-after-attribute-name"})
+            self.currentToken["data"].append([data, ""])
+            self.state = self.attributeNameState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-end-of-tag-but-got-eof"})
+            self.state = self.dataState
+        else:
+            self.currentToken["data"].append([data, ""])
+            self.state = self.attributeNameState
+        return True
+
+    def beforeAttributeValueState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.stream.charsUntil(spaceCharacters, True)
+        elif data == "\"":
+            self.state = self.attributeValueDoubleQuotedState
+        elif data == "&":
+            self.state = self.attributeValueUnQuotedState
+            self.stream.unget(data)
+        elif data == "'":
+            self.state = self.attributeValueSingleQuotedState
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-attribute-value-but-got-right-bracket"})
+            self.emitCurrentToken()
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"][-1][1] += "\uFFFD"
+            self.state = self.attributeValueUnQuotedState
+        elif data in ("=", "<", "`"):
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "equals-in-unquoted-attribute-value"})
+            self.currentToken["data"][-1][1] += data
+            self.state = self.attributeValueUnQuotedState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-attribute-value-but-got-eof"})
+            self.state = self.dataState
+        else:
+            self.currentToken["data"][-1][1] += data
+            self.state = self.attributeValueUnQuotedState
+        return True
+
+    def attributeValueDoubleQuotedState(self):
+        data = self.stream.char()
+        if data == "\"":
+            self.state = self.afterAttributeValueState
+        elif data == "&":
+            self.processEntityInAttribute('"')
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"][-1][1] += "\uFFFD"
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-attribute-value-double-quote"})
+            self.state = self.dataState
+        else:
+            self.currentToken["data"][-1][1] += data +\
+                self.stream.charsUntil(("\"", "&", "\u0000"))
+        return True
+
+    def attributeValueSingleQuotedState(self):
+        data = self.stream.char()
+        if data == "'":
+            self.state = self.afterAttributeValueState
+        elif data == "&":
+            self.processEntityInAttribute("'")
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"][-1][1] += "\uFFFD"
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-attribute-value-single-quote"})
+            self.state = self.dataState
+        else:
+            self.currentToken["data"][-1][1] += data +\
+                self.stream.charsUntil(("'", "&", "\u0000"))
+        return True
+
+    def attributeValueUnQuotedState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.state = self.beforeAttributeNameState
+        elif data == "&":
+            self.processEntityInAttribute(">")
+        elif data == ">":
+            self.emitCurrentToken()
+        elif data in ('"', "'", "=", "<", "`"):
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-character-in-unquoted-attribute-value"})
+            self.currentToken["data"][-1][1] += data
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"][-1][1] += "\uFFFD"
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-attribute-value-no-quotes"})
+            self.state = self.dataState
+        else:
+            self.currentToken["data"][-1][1] += data + self.stream.charsUntil(
+                frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters)
+        return True
+
+    def afterAttributeValueState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.state = self.beforeAttributeNameState
+        elif data == ">":
+            self.emitCurrentToken()
+        elif data == "/":
+            self.state = self.selfClosingStartTagState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-EOF-after-attribute-value"})
+            self.stream.unget(data)
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-character-after-attribute-value"})
+            self.stream.unget(data)
+            self.state = self.beforeAttributeNameState
+        return True
+
+    def selfClosingStartTagState(self):
+        data = self.stream.char()
+        if data == ">":
+            self.currentToken["selfClosing"] = True
+            self.emitCurrentToken()
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data":
+                                    "unexpected-EOF-after-solidus-in-tag"})
+            self.stream.unget(data)
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-character-after-solidus-in-tag"})
+            self.stream.unget(data)
+            self.state = self.beforeAttributeNameState
+        return True
+
+    def bogusCommentState(self):
+        # Make a new comment token and give it as value all the characters
+        # until the first > or EOF (charsUntil checks for EOF automatically)
+        # and emit it.
+        data = self.stream.charsUntil(">")
+        data = data.replace("\u0000", "\uFFFD")
+        self.tokenQueue.append(
+            {"type": tokenTypes["Comment"], "data": data})
+
+        # Eat the character directly after the bogus comment which is either a
+        # ">" or an EOF.
+        self.stream.char()
+        self.state = self.dataState
+        return True
+
+    def markupDeclarationOpenState(self):
+        charStack = [self.stream.char()]
+        if charStack[-1] == "-":
+            charStack.append(self.stream.char())
+            if charStack[-1] == "-":
+                self.currentToken = {"type": tokenTypes["Comment"], "data": ""}
+                self.state = self.commentStartState
+                return True
+        elif charStack[-1] in ('d', 'D'):
+            matched = True
+            for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'),
+                             ('y', 'Y'), ('p', 'P'), ('e', 'E')):
+                charStack.append(self.stream.char())
+                if charStack[-1] not in expected:
+                    matched = False
+                    break
+            if matched:
+                self.currentToken = {"type": tokenTypes["Doctype"],
+                                     "name": "",
+                                     "publicId": None, "systemId": None,
+                                     "correct": True}
+                self.state = self.doctypeState
+                return True
+        elif (charStack[-1] == "[" and
+              self.parser is not None and
+              self.parser.tree.openElements and
+              self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace):
+            matched = True
+            for expected in ["C", "D", "A", "T", "A", "["]:
+                charStack.append(self.stream.char())
+                if charStack[-1] != expected:
+                    matched = False
+                    break
+            if matched:
+                self.state = self.cdataSectionState
+                return True
+
+        self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                "expected-dashes-or-doctype"})
+
+        while charStack:
+            self.stream.unget(charStack.pop())
+        self.state = self.bogusCommentState
+        return True
+
+    def commentStartState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.state = self.commentStartDashState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"] += "\uFFFD"
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "incorrect-comment"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-comment"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["data"] += data
+            self.state = self.commentState
+        return True
+
+    def commentStartDashState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.state = self.commentEndState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"] += "-\uFFFD"
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "incorrect-comment"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-comment"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["data"] += "-" + data
+            self.state = self.commentState
+        return True
+
+    def commentState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.state = self.commentEndDashState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"] += "\uFFFD"
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "eof-in-comment"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["data"] += data + \
+                self.stream.charsUntil(("-", "\u0000"))
+        return True
+
+    def commentEndDashState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.state = self.commentEndState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"] += "-\uFFFD"
+            self.state = self.commentState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-comment-end-dash"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["data"] += "-" + data
+            self.state = self.commentState
+        return True
+
+    def commentEndState(self):
+        data = self.stream.char()
+        if data == ">":
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"] += "--\uFFFD"
+            self.state = self.commentState
+        elif data == "!":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-bang-after-double-dash-in-comment"})
+            self.state = self.commentEndBangState
+        elif data == "-":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-dash-after-double-dash-in-comment"})
+            self.currentToken["data"] += data
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-comment-double-dash"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            # XXX
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-comment"})
+            self.currentToken["data"] += "--" + data
+            self.state = self.commentState
+        return True
+
+    def commentEndBangState(self):
+        data = self.stream.char()
+        if data == ">":
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data == "-":
+            self.currentToken["data"] += "--!"
+            self.state = self.commentEndDashState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"] += "--!\uFFFD"
+            self.state = self.commentState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-comment-end-bang-state"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["data"] += "--!" + data
+            self.state = self.commentState
+        return True
+
+    def doctypeState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.state = self.beforeDoctypeNameState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-doctype-name-but-got-eof"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "need-space-after-doctype"})
+            self.stream.unget(data)
+            self.state = self.beforeDoctypeNameState
+        return True
+
+    def beforeDoctypeNameState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            pass
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-doctype-name-but-got-right-bracket"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["name"] = "\uFFFD"
+            self.state = self.doctypeNameState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-doctype-name-but-got-eof"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["name"] = data
+            self.state = self.doctypeNameState
+        return True
+
+    def doctypeNameState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower)
+            self.state = self.afterDoctypeNameState
+        elif data == ">":
+            self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower)
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["name"] += "\uFFFD"
+            self.state = self.doctypeNameState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype-name"})
+            self.currentToken["correct"] = False
+            self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower)
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["name"] += data
+        return True
+
+    def afterDoctypeNameState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            pass
+        elif data == ">":
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.currentToken["correct"] = False
+            self.stream.unget(data)
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            if data in ("p", "P"):
+                matched = True
+                for expected in (("u", "U"), ("b", "B"), ("l", "L"),
+                                 ("i", "I"), ("c", "C")):
+                    data = self.stream.char()
+                    if data not in expected:
+                        matched = False
+                        break
+                if matched:
+                    self.state = self.afterDoctypePublicKeywordState
+                    return True
+            elif data in ("s", "S"):
+                matched = True
+                for expected in (("y", "Y"), ("s", "S"), ("t", "T"),
+                                 ("e", "E"), ("m", "M")):
+                    data = self.stream.char()
+                    if data not in expected:
+                        matched = False
+                        break
+                if matched:
+                    self.state = self.afterDoctypeSystemKeywordState
+                    return True
+
+            # All the characters read before the current 'data' will be
+            # [a-zA-Z], so they're garbage in the bogus doctype and can be
+            # discarded; only the latest character might be '>' or EOF
+            # and needs to be ungetted
+            self.stream.unget(data)
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-space-or-right-bracket-in-doctype", "datavars":
+                                    {"data": data}})
+            self.currentToken["correct"] = False
+            self.state = self.bogusDoctypeState
+
+        return True
+
+    def afterDoctypePublicKeywordState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.state = self.beforeDoctypePublicIdentifierState
+        elif data in ("'", '"'):
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.stream.unget(data)
+            self.state = self.beforeDoctypePublicIdentifierState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.stream.unget(data)
+            self.state = self.beforeDoctypePublicIdentifierState
+        return True
+
+    def beforeDoctypePublicIdentifierState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            pass
+        elif data == "\"":
+            self.currentToken["publicId"] = ""
+            self.state = self.doctypePublicIdentifierDoubleQuotedState
+        elif data == "'":
+            self.currentToken["publicId"] = ""
+            self.state = self.doctypePublicIdentifierSingleQuotedState
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-end-of-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.currentToken["correct"] = False
+            self.state = self.bogusDoctypeState
+        return True
+
+    def doctypePublicIdentifierDoubleQuotedState(self):
+        data = self.stream.char()
+        if data == "\"":
+            self.state = self.afterDoctypePublicIdentifierState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["publicId"] += "\uFFFD"
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-end-of-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["publicId"] += data
+        return True
+
+    def doctypePublicIdentifierSingleQuotedState(self):
+        data = self.stream.char()
+        if data == "'":
+            self.state = self.afterDoctypePublicIdentifierState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["publicId"] += "\uFFFD"
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-end-of-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["publicId"] += data
+        return True
+
+    def afterDoctypePublicIdentifierState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.state = self.betweenDoctypePublicAndSystemIdentifiersState
+        elif data == ">":
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data == '"':
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.currentToken["systemId"] = ""
+            self.state = self.doctypeSystemIdentifierDoubleQuotedState
+        elif data == "'":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.currentToken["systemId"] = ""
+            self.state = self.doctypeSystemIdentifierSingleQuotedState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.currentToken["correct"] = False
+            self.state = self.bogusDoctypeState
+        return True
+
+    def betweenDoctypePublicAndSystemIdentifiersState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            pass
+        elif data == ">":
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data == '"':
+            self.currentToken["systemId"] = ""
+            self.state = self.doctypeSystemIdentifierDoubleQuotedState
+        elif data == "'":
+            self.currentToken["systemId"] = ""
+            self.state = self.doctypeSystemIdentifierSingleQuotedState
+        elif data == EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.currentToken["correct"] = False
+            self.state = self.bogusDoctypeState
+        return True
+
+    def afterDoctypeSystemKeywordState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.state = self.beforeDoctypeSystemIdentifierState
+        elif data in ("'", '"'):
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.stream.unget(data)
+            self.state = self.beforeDoctypeSystemIdentifierState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.stream.unget(data)
+            self.state = self.beforeDoctypeSystemIdentifierState
+        return True
+
+    def beforeDoctypeSystemIdentifierState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            pass
+        elif data == "\"":
+            self.currentToken["systemId"] = ""
+            self.state = self.doctypeSystemIdentifierDoubleQuotedState
+        elif data == "'":
+            self.currentToken["systemId"] = ""
+            self.state = self.doctypeSystemIdentifierSingleQuotedState
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.currentToken["correct"] = False
+            self.state = self.bogusDoctypeState
+        return True
+
+    def doctypeSystemIdentifierDoubleQuotedState(self):
+        data = self.stream.char()
+        if data == "\"":
+            self.state = self.afterDoctypeSystemIdentifierState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["systemId"] += "\uFFFD"
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-end-of-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["systemId"] += data
+        return True
+
+    def doctypeSystemIdentifierSingleQuotedState(self):
+        data = self.stream.char()
+        if data == "'":
+            self.state = self.afterDoctypeSystemIdentifierState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["systemId"] += "\uFFFD"
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-end-of-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["systemId"] += data
+        return True
+
+    def afterDoctypeSystemIdentifierState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            pass
+        elif data == ">":
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.state = self.bogusDoctypeState
+        return True
+
+    def bogusDoctypeState(self):
+        data = self.stream.char()
+        if data == ">":
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            # XXX EMIT
+            self.stream.unget(data)
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            pass
+        return True
+
+    def cdataSectionState(self):
+        data = []
+        while True:
+            data.append(self.stream.charsUntil("]"))
+            data.append(self.stream.charsUntil(">"))
+            char = self.stream.char()
+            if char == EOF:
+                break
+            else:
+                assert char == ">"
+                if data[-1][-2:] == "]]":
+                    data[-1] = data[-1][:-2]
+                    break
+                else:
+                    data.append(char)
+
+        data = "".join(data)  # pylint:disable=redefined-variable-type
+        # Deal with null here rather than in the parser
+        nullCount = data.count("\u0000")
+        if nullCount > 0:
+            for _ in range(nullCount):
+                self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                        "data": "invalid-codepoint"})
+            data = data.replace("\u0000", "\uFFFD")
+        if data:
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": data})
+        self.state = self.dataState
+        return True
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/__init__.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..a5ba4bf123aa585ec8a47dce6838b09b4dfa0b1a
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/__init__.py
@@ -0,0 +1,14 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from .py import Trie as PyTrie
+
+Trie = PyTrie
+
+# pylint:disable=wrong-import-position
+try:
+    from .datrie import Trie as DATrie
+except ImportError:
+    pass
+else:
+    Trie = DATrie
+# pylint:enable=wrong-import-position
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/_base.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/_base.py
new file mode 100644
index 0000000000000000000000000000000000000000..25eece46ed2da28c4fc22b888f4945e2b07a828f
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/_base.py
@@ -0,0 +1,38 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from collections import Mapping
+
+
+class Trie(Mapping):
+    """Abstract base class for tries"""
+
+    def keys(self, prefix=None):
+        # pylint:disable=arguments-differ
+        keys = super(Trie, self).keys()
+
+        if prefix is None:
+            return set(keys)
+
+        # Python 2.6: no set comprehensions
+        return set([x for x in keys if x.startswith(prefix)])
+
+    def has_keys_with_prefix(self, prefix):
+        for key in self.keys():
+            if key.startswith(prefix):
+                return True
+
+        return False
+
+    def longest_prefix(self, prefix):
+        if prefix in self:
+            return prefix
+
+        for i in range(1, len(prefix) + 1):
+            if prefix[:-i] in self:
+                return prefix[:-i]
+
+        raise KeyError(prefix)
+
+    def longest_prefix_item(self, prefix):
+        lprefix = self.longest_prefix(prefix)
+        return (lprefix, self[lprefix])
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/datrie.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/datrie.py
new file mode 100644
index 0000000000000000000000000000000000000000..e2e5f86621c3881d1d812814aec9d153dca34bd1
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/datrie.py
@@ -0,0 +1,44 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from datrie import Trie as DATrie
+from pip._vendor.six import text_type
+
+from ._base import Trie as ABCTrie
+
+
+class Trie(ABCTrie):
+    def __init__(self, data):
+        chars = set()
+        for key in data.keys():
+            if not isinstance(key, text_type):
+                raise TypeError("All keys must be strings")
+            for char in key:
+                chars.add(char)
+
+        self._data = DATrie("".join(chars))
+        for key, value in data.items():
+            self._data[key] = value
+
+    def __contains__(self, key):
+        return key in self._data
+
+    def __len__(self):
+        return len(self._data)
+
+    def __iter__(self):
+        raise NotImplementedError()
+
+    def __getitem__(self, key):
+        return self._data[key]
+
+    def keys(self, prefix=None):
+        return self._data.keys(prefix)
+
+    def has_keys_with_prefix(self, prefix):
+        return self._data.has_keys_with_prefix(prefix)
+
+    def longest_prefix(self, prefix):
+        return self._data.longest_prefix(prefix)
+
+    def longest_prefix_item(self, prefix):
+        return self._data.longest_prefix_item(prefix)
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/py.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/py.py
new file mode 100644
index 0000000000000000000000000000000000000000..c178b219def8f7fbfe6d00f7822a8e61293d003a
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/py.py
@@ -0,0 +1,67 @@
+from __future__ import absolute_import, division, unicode_literals
+from pip._vendor.six import text_type
+
+from bisect import bisect_left
+
+from ._base import Trie as ABCTrie
+
+
+class Trie(ABCTrie):
+    def __init__(self, data):
+        if not all(isinstance(x, text_type) for x in data.keys()):
+            raise TypeError("All keys must be strings")
+
+        self._data = data
+        self._keys = sorted(data.keys())
+        self._cachestr = ""
+        self._cachepoints = (0, len(data))
+
+    def __contains__(self, key):
+        return key in self._data
+
+    def __len__(self):
+        return len(self._data)
+
+    def __iter__(self):
+        return iter(self._data)
+
+    def __getitem__(self, key):
+        return self._data[key]
+
+    def keys(self, prefix=None):
+        if prefix is None or prefix == "" or not self._keys:
+            return set(self._keys)
+
+        if prefix.startswith(self._cachestr):
+            lo, hi = self._cachepoints
+            start = i = bisect_left(self._keys, prefix, lo, hi)
+        else:
+            start = i = bisect_left(self._keys, prefix)
+
+        keys = set()
+        if start == len(self._keys):
+            return keys
+
+        while self._keys[i].startswith(prefix):
+            keys.add(self._keys[i])
+            i += 1
+
+        self._cachestr = prefix
+        self._cachepoints = (start, i)
+
+        return keys
+
+    def has_keys_with_prefix(self, prefix):
+        if prefix in self._data:
+            return True
+
+        if prefix.startswith(self._cachestr):
+            lo, hi = self._cachepoints
+            i = bisect_left(self._keys, prefix, lo, hi)
+        else:
+            i = bisect_left(self._keys, prefix)
+
+        if i == len(self._keys):
+            return False
+
+        return self._keys[i].startswith(prefix)
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/_utils.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..55d67475300e03374bb53ee1934e4c9a5c2fd753
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/_utils.py
@@ -0,0 +1,127 @@
+from __future__ import absolute_import, division, unicode_literals
+
+import sys
+from types import ModuleType
+
+from pip._vendor.six import text_type
+
+try:
+    import xml.etree.cElementTree as default_etree
+except ImportError:
+    import xml.etree.ElementTree as default_etree
+
+
+__all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair",
+           "surrogatePairToCodepoint", "moduleFactoryFactory",
+           "supports_lone_surrogates", "PY27"]
+
+
+PY27 = sys.version_info[0] == 2 and sys.version_info[1] >= 7
+
+# Platforms not supporting lone surrogates (\uD800-\uDFFF) should be
+# caught by the below test. In general this would be any platform
+# using UTF-16 as its encoding of unicode strings, such as
+# Jython. This is because UTF-16 itself is based on the use of such
+# surrogates, and there is no mechanism to further escape such
+# escapes.
+try:
+    _x = eval('"\\uD800"')  # pylint:disable=eval-used
+    if not isinstance(_x, text_type):
+        # We need this with u"" because of http://bugs.jython.org/issue2039
+        _x = eval('u"\\uD800"')  # pylint:disable=eval-used
+        assert isinstance(_x, text_type)
+except:  # pylint:disable=bare-except
+    supports_lone_surrogates = False
+else:
+    supports_lone_surrogates = True
+
+
+class MethodDispatcher(dict):
+    """Dict with 2 special properties:
+
+    On initiation, keys that are lists, sets or tuples are converted to
+    multiple keys so accessing any one of the items in the original
+    list-like object returns the matching value
+
+    md = MethodDispatcher({("foo", "bar"):"baz"})
+    md["foo"] == "baz"
+
+    A default value which can be set through the default attribute.
+    """
+
+    def __init__(self, items=()):
+        # Using _dictEntries instead of directly assigning to self is about
+        # twice as fast. Please do careful performance testing before changing
+        # anything here.
+        _dictEntries = []
+        for name, value in items:
+            if isinstance(name, (list, tuple, frozenset, set)):
+                for item in name:
+                    _dictEntries.append((item, value))
+            else:
+                _dictEntries.append((name, value))
+        dict.__init__(self, _dictEntries)
+        assert len(self) == len(_dictEntries)
+        self.default = None
+
+    def __getitem__(self, key):
+        return dict.get(self, key, self.default)
+
+
+# Some utility functions to deal with weirdness around UCS2 vs UCS4
+# python builds
+
+def isSurrogatePair(data):
+    return (len(data) == 2 and
+            ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and
+            ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF)
+
+
+def surrogatePairToCodepoint(data):
+    char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 +
+                (ord(data[1]) - 0xDC00))
+    return char_val
+
+# Module Factory Factory (no, this isn't Java, I know)
+# Here to stop this being duplicated all over the place.
+
+
+def moduleFactoryFactory(factory):
+    moduleCache = {}
+
+    def moduleFactory(baseModule, *args, **kwargs):
+        if isinstance(ModuleType.__name__, type("")):
+            name = "_%s_factory" % baseModule.__name__
+        else:
+            name = b"_%s_factory" % baseModule.__name__
+
+        kwargs_tuple = tuple(kwargs.items())
+
+        try:
+            return moduleCache[name][args][kwargs_tuple]
+        except KeyError:
+            mod = ModuleType(name)
+            objs = factory(baseModule, *args, **kwargs)
+            mod.__dict__.update(objs)
+            if "name" not in moduleCache:
+                moduleCache[name] = {}
+            if "args" not in moduleCache[name]:
+                moduleCache[name][args] = {}
+            if "kwargs" not in moduleCache[name][args]:
+                moduleCache[name][args][kwargs_tuple] = {}
+            moduleCache[name][args][kwargs_tuple] = mod
+            return mod
+
+    return moduleFactory
+
+
+def memoize(func):
+    cache = {}
+
+    def wrapped(*args, **kwargs):
+        key = (tuple(args), tuple(kwargs.items()))
+        if key not in cache:
+            cache[key] = func(*args, **kwargs)
+        return cache[key]
+
+    return wrapped
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/constants.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/constants.py
new file mode 100644
index 0000000000000000000000000000000000000000..9e7541d3826e8ded149f116fb8459e41e2224754
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/constants.py
@@ -0,0 +1,2945 @@
+from __future__ import absolute_import, division, unicode_literals
+
+import string
+
+EOF = None
+
+E = {
+    "null-character":
+        "Null character in input stream, replaced with U+FFFD.",
+    "invalid-codepoint":
+        "Invalid codepoint in stream.",
+    "incorrectly-placed-solidus":
+        "Solidus (/) incorrectly placed in tag.",
+    "incorrect-cr-newline-entity":
+        "Incorrect CR newline entity, replaced with LF.",
+    "illegal-windows-1252-entity":
+        "Entity used with illegal number (windows-1252 reference).",
+    "cant-convert-numeric-entity":
+        "Numeric entity couldn't be converted to character "
+        "(codepoint U+%(charAsInt)08x).",
+    "illegal-codepoint-for-numeric-entity":
+        "Numeric entity represents an illegal codepoint: "
+        "U+%(charAsInt)08x.",
+    "numeric-entity-without-semicolon":
+        "Numeric entity didn't end with ';'.",
+    "expected-numeric-entity-but-got-eof":
+        "Numeric entity expected. Got end of file instead.",
+    "expected-numeric-entity":
+        "Numeric entity expected but none found.",
+    "named-entity-without-semicolon":
+        "Named entity didn't end with ';'.",
+    "expected-named-entity":
+        "Named entity expected. Got none.",
+    "attributes-in-end-tag":
+        "End tag contains unexpected attributes.",
+    'self-closing-flag-on-end-tag':
+        "End tag contains unexpected self-closing flag.",
+    "expected-tag-name-but-got-right-bracket":
+        "Expected tag name. Got '>' instead.",
+    "expected-tag-name-but-got-question-mark":
+        "Expected tag name. Got '?' instead. (HTML doesn't "
+        "support processing instructions.)",
+    "expected-tag-name":
+        "Expected tag name. Got something else instead",
+    "expected-closing-tag-but-got-right-bracket":
+        "Expected closing tag. Got '>' instead. Ignoring '</>'.",
+    "expected-closing-tag-but-got-eof":
+        "Expected closing tag. Unexpected end of file.",
+    "expected-closing-tag-but-got-char":
+        "Expected closing tag. Unexpected character '%(data)s' found.",
+    "eof-in-tag-name":
+        "Unexpected end of file in the tag name.",
+    "expected-attribute-name-but-got-eof":
+        "Unexpected end of file. Expected attribute name instead.",
+    "eof-in-attribute-name":
+        "Unexpected end of file in attribute name.",
+    "invalid-character-in-attribute-name":
+        "Invalid character in attribute name",
+    "duplicate-attribute":
+        "Dropped duplicate attribute on tag.",
+    "expected-end-of-tag-name-but-got-eof":
+        "Unexpected end of file. Expected = or end of tag.",
+    "expected-attribute-value-but-got-eof":
+        "Unexpected end of file. Expected attribute value.",
+    "expected-attribute-value-but-got-right-bracket":
+        "Expected attribute value. Got '>' instead.",
+    'equals-in-unquoted-attribute-value':
+        "Unexpected = in unquoted attribute",
+    'unexpected-character-in-unquoted-attribute-value':
+        "Unexpected character in unquoted attribute",
+    "invalid-character-after-attribute-name":
+        "Unexpected character after attribute name.",
+    "unexpected-character-after-attribute-value":
+        "Unexpected character after attribute value.",
+    "eof-in-attribute-value-double-quote":
+        "Unexpected end of file in attribute value (\").",
+    "eof-in-attribute-value-single-quote":
+        "Unexpected end of file in attribute value (').",
+    "eof-in-attribute-value-no-quotes":
+        "Unexpected end of file in attribute value.",
+    "unexpected-EOF-after-solidus-in-tag":
+        "Unexpected end of file in tag. Expected >",
+    "unexpected-character-after-solidus-in-tag":
+        "Unexpected character after / in tag. Expected >",
+    "expected-dashes-or-doctype":
+        "Expected '--' or 'DOCTYPE'. Not found.",
+    "unexpected-bang-after-double-dash-in-comment":
+        "Unexpected ! after -- in comment",
+    "unexpected-space-after-double-dash-in-comment":
+        "Unexpected space after -- in comment",
+    "incorrect-comment":
+        "Incorrect comment.",
+    "eof-in-comment":
+        "Unexpected end of file in comment.",
+    "eof-in-comment-end-dash":
+        "Unexpected end of file in comment (-)",
+    "unexpected-dash-after-double-dash-in-comment":
+        "Unexpected '-' after '--' found in comment.",
+    "eof-in-comment-double-dash":
+        "Unexpected end of file in comment (--).",
+    "eof-in-comment-end-space-state":
+        "Unexpected end of file in comment.",
+    "eof-in-comment-end-bang-state":
+        "Unexpected end of file in comment.",
+    "unexpected-char-in-comment":
+        "Unexpected character in comment found.",
+    "need-space-after-doctype":
+        "No space after literal string 'DOCTYPE'.",
+    "expected-doctype-name-but-got-right-bracket":
+        "Unexpected > character. Expected DOCTYPE name.",
+    "expected-doctype-name-but-got-eof":
+        "Unexpected end of file. Expected DOCTYPE name.",
+    "eof-in-doctype-name":
+        "Unexpected end of file in DOCTYPE name.",
+    "eof-in-doctype":
+        "Unexpected end of file in DOCTYPE.",
+    "expected-space-or-right-bracket-in-doctype":
+        "Expected space or '>'. Got '%(data)s'",
+    "unexpected-end-of-doctype":
+        "Unexpected end of DOCTYPE.",
+    "unexpected-char-in-doctype":
+        "Unexpected character in DOCTYPE.",
+    "eof-in-innerhtml":
+        "XXX innerHTML EOF",
+    "unexpected-doctype":
+        "Unexpected DOCTYPE. Ignored.",
+    "non-html-root":
+        "html needs to be the first start tag.",
+    "expected-doctype-but-got-eof":
+        "Unexpected End of file. Expected DOCTYPE.",
+    "unknown-doctype":
+        "Erroneous DOCTYPE.",
+    "expected-doctype-but-got-chars":
+        "Unexpected non-space characters. Expected DOCTYPE.",
+    "expected-doctype-but-got-start-tag":
+        "Unexpected start tag (%(name)s). Expected DOCTYPE.",
+    "expected-doctype-but-got-end-tag":
+        "Unexpected end tag (%(name)s). Expected DOCTYPE.",
+    "end-tag-after-implied-root":
+        "Unexpected end tag (%(name)s) after the (implied) root element.",
+    "expected-named-closing-tag-but-got-eof":
+        "Unexpected end of file. Expected end tag (%(name)s).",
+    "two-heads-are-not-better-than-one":
+        "Unexpected start tag head in existing head. Ignored.",
+    "unexpected-end-tag":
+        "Unexpected end tag (%(name)s). Ignored.",
+    "unexpected-start-tag-out-of-my-head":
+        "Unexpected start tag (%(name)s) that can be in head. Moved.",
+    "unexpected-start-tag":
+        "Unexpected start tag (%(name)s).",
+    "missing-end-tag":
+        "Missing end tag (%(name)s).",
+    "missing-end-tags":
+        "Missing end tags (%(name)s).",
+    "unexpected-start-tag-implies-end-tag":
+        "Unexpected start tag (%(startName)s) "
+        "implies end tag (%(endName)s).",
+    "unexpected-start-tag-treated-as":
+        "Unexpected start tag (%(originalName)s). Treated as %(newName)s.",
+    "deprecated-tag":
+        "Unexpected start tag %(name)s. Don't use it!",
+    "unexpected-start-tag-ignored":
+        "Unexpected start tag %(name)s. Ignored.",
+    "expected-one-end-tag-but-got-another":
+        "Unexpected end tag (%(gotName)s). "
+        "Missing end tag (%(expectedName)s).",
+    "end-tag-too-early":
+        "End tag (%(name)s) seen too early. Expected other end tag.",
+    "end-tag-too-early-named":
+        "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).",
+    "end-tag-too-early-ignored":
+        "End tag (%(name)s) seen too early. Ignored.",
+    "adoption-agency-1.1":
+        "End tag (%(name)s) violates step 1, "
+        "paragraph 1 of the adoption agency algorithm.",
+    "adoption-agency-1.2":
+        "End tag (%(name)s) violates step 1, "
+        "paragraph 2 of the adoption agency algorithm.",
+    "adoption-agency-1.3":
+        "End tag (%(name)s) violates step 1, "
+        "paragraph 3 of the adoption agency algorithm.",
+    "adoption-agency-4.4":
+        "End tag (%(name)s) violates step 4, "
+        "paragraph 4 of the adoption agency algorithm.",
+    "unexpected-end-tag-treated-as":
+        "Unexpected end tag (%(originalName)s). Treated as %(newName)s.",
+    "no-end-tag":
+        "This element (%(name)s) has no end tag.",
+    "unexpected-implied-end-tag-in-table":
+        "Unexpected implied end tag (%(name)s) in the table phase.",
+    "unexpected-implied-end-tag-in-table-body":
+        "Unexpected implied end tag (%(name)s) in the table body phase.",
+    "unexpected-char-implies-table-voodoo":
+        "Unexpected non-space characters in "
+        "table context caused voodoo mode.",
+    "unexpected-hidden-input-in-table":
+        "Unexpected input with type hidden in table context.",
+    "unexpected-form-in-table":
+        "Unexpected form in table context.",
+    "unexpected-start-tag-implies-table-voodoo":
+        "Unexpected start tag (%(name)s) in "
+        "table context caused voodoo mode.",
+    "unexpected-end-tag-implies-table-voodoo":
+        "Unexpected end tag (%(name)s) in "
+        "table context caused voodoo mode.",
+    "unexpected-cell-in-table-body":
+        "Unexpected table cell start tag (%(name)s) "
+        "in the table body phase.",
+    "unexpected-cell-end-tag":
+        "Got table cell end tag (%(name)s) "
+        "while required end tags are missing.",
+    "unexpected-end-tag-in-table-body":
+        "Unexpected end tag (%(name)s) in the table body phase. Ignored.",
+    "unexpected-implied-end-tag-in-table-row":
+        "Unexpected implied end tag (%(name)s) in the table row phase.",
+    "unexpected-end-tag-in-table-row":
+        "Unexpected end tag (%(name)s) in the table row phase. Ignored.",
+    "unexpected-select-in-select":
+        "Unexpected select start tag in the select phase "
+        "treated as select end tag.",
+    "unexpected-input-in-select":
+        "Unexpected input start tag in the select phase.",
+    "unexpected-start-tag-in-select":
+        "Unexpected start tag token (%(name)s in the select phase. "
+        "Ignored.",
+    "unexpected-end-tag-in-select":
+        "Unexpected end tag (%(name)s) in the select phase. Ignored.",
+    "unexpected-table-element-start-tag-in-select-in-table":
+        "Unexpected table element start tag (%(name)s) in the select in table phase.",
+    "unexpected-table-element-end-tag-in-select-in-table":
+        "Unexpected table element end tag (%(name)s) in the select in table phase.",
+    "unexpected-char-after-body":
+        "Unexpected non-space characters in the after body phase.",
+    "unexpected-start-tag-after-body":
+        "Unexpected start tag token (%(name)s)"
+        " in the after body phase.",
+    "unexpected-end-tag-after-body":
+        "Unexpected end tag token (%(name)s)"
+        " in the after body phase.",
+    "unexpected-char-in-frameset":
+        "Unexpected characters in the frameset phase. Characters ignored.",
+    "unexpected-start-tag-in-frameset":
+        "Unexpected start tag token (%(name)s)"
+        " in the frameset phase. Ignored.",
+    "unexpected-frameset-in-frameset-innerhtml":
+        "Unexpected end tag token (frameset) "
+        "in the frameset phase (innerHTML).",
+    "unexpected-end-tag-in-frameset":
+        "Unexpected end tag token (%(name)s)"
+        " in the frameset phase. Ignored.",
+    "unexpected-char-after-frameset":
+        "Unexpected non-space characters in the "
+        "after frameset phase. Ignored.",
+    "unexpected-start-tag-after-frameset":
+        "Unexpected start tag (%(name)s)"
+        " in the after frameset phase. Ignored.",
+    "unexpected-end-tag-after-frameset":
+        "Unexpected end tag (%(name)s)"
+        " in the after frameset phase. Ignored.",
+    "unexpected-end-tag-after-body-innerhtml":
+        "Unexpected end tag after body(innerHtml)",
+    "expected-eof-but-got-char":
+        "Unexpected non-space characters. Expected end of file.",
+    "expected-eof-but-got-start-tag":
+        "Unexpected start tag (%(name)s)"
+        ". Expected end of file.",
+    "expected-eof-but-got-end-tag":
+        "Unexpected end tag (%(name)s)"
+        ". Expected end of file.",
+    "eof-in-table":
+        "Unexpected end of file. Expected table content.",
+    "eof-in-select":
+        "Unexpected end of file. Expected select content.",
+    "eof-in-frameset":
+        "Unexpected end of file. Expected frameset content.",
+    "eof-in-script-in-script":
+        "Unexpected end of file. Expected script content.",
+    "eof-in-foreign-lands":
+        "Unexpected end of file. Expected foreign content",
+    "non-void-element-with-trailing-solidus":
+        "Trailing solidus not allowed on element %(name)s",
+    "unexpected-html-element-in-foreign-content":
+        "Element %(name)s not allowed in a non-html context",
+    "unexpected-end-tag-before-html":
+        "Unexpected end tag (%(name)s) before html.",
+    "unexpected-inhead-noscript-tag":
+        "Element %(name)s not allowed in a inhead-noscript context",
+    "eof-in-head-noscript":
+        "Unexpected end of file. Expected inhead-noscript content",
+    "char-in-head-noscript":
+        "Unexpected non-space character. Expected inhead-noscript content",
+    "XXX-undefined-error":
+        "Undefined error (this sucks and should be fixed)",
+}
+
+namespaces = {
+    "html": "http://www.w3.org/1999/xhtml",
+    "mathml": "http://www.w3.org/1998/Math/MathML",
+    "svg": "http://www.w3.org/2000/svg",
+    "xlink": "http://www.w3.org/1999/xlink",
+    "xml": "http://www.w3.org/XML/1998/namespace",
+    "xmlns": "http://www.w3.org/2000/xmlns/"
+}
+
+scopingElements = frozenset([
+    (namespaces["html"], "applet"),
+    (namespaces["html"], "caption"),
+    (namespaces["html"], "html"),
+    (namespaces["html"], "marquee"),
+    (namespaces["html"], "object"),
+    (namespaces["html"], "table"),
+    (namespaces["html"], "td"),
+    (namespaces["html"], "th"),
+    (namespaces["mathml"], "mi"),
+    (namespaces["mathml"], "mo"),
+    (namespaces["mathml"], "mn"),
+    (namespaces["mathml"], "ms"),
+    (namespaces["mathml"], "mtext"),
+    (namespaces["mathml"], "annotation-xml"),
+    (namespaces["svg"], "foreignObject"),
+    (namespaces["svg"], "desc"),
+    (namespaces["svg"], "title"),
+])
+
+formattingElements = frozenset([
+    (namespaces["html"], "a"),
+    (namespaces["html"], "b"),
+    (namespaces["html"], "big"),
+    (namespaces["html"], "code"),
+    (namespaces["html"], "em"),
+    (namespaces["html"], "font"),
+    (namespaces["html"], "i"),
+    (namespaces["html"], "nobr"),
+    (namespaces["html"], "s"),
+    (namespaces["html"], "small"),
+    (namespaces["html"], "strike"),
+    (namespaces["html"], "strong"),
+    (namespaces["html"], "tt"),
+    (namespaces["html"], "u")
+])
+
+specialElements = frozenset([
+    (namespaces["html"], "address"),
+    (namespaces["html"], "applet"),
+    (namespaces["html"], "area"),
+    (namespaces["html"], "article"),
+    (namespaces["html"], "aside"),
+    (namespaces["html"], "base"),
+    (namespaces["html"], "basefont"),
+    (namespaces["html"], "bgsound"),
+    (namespaces["html"], "blockquote"),
+    (namespaces["html"], "body"),
+    (namespaces["html"], "br"),
+    (namespaces["html"], "button"),
+    (namespaces["html"], "caption"),
+    (namespaces["html"], "center"),
+    (namespaces["html"], "col"),
+    (namespaces["html"], "colgroup"),
+    (namespaces["html"], "command"),
+    (namespaces["html"], "dd"),
+    (namespaces["html"], "details"),
+    (namespaces["html"], "dir"),
+    (namespaces["html"], "div"),
+    (namespaces["html"], "dl"),
+    (namespaces["html"], "dt"),
+    (namespaces["html"], "embed"),
+    (namespaces["html"], "fieldset"),
+    (namespaces["html"], "figure"),
+    (namespaces["html"], "footer"),
+    (namespaces["html"], "form"),
+    (namespaces["html"], "frame"),
+    (namespaces["html"], "frameset"),
+    (namespaces["html"], "h1"),
+    (namespaces["html"], "h2"),
+    (namespaces["html"], "h3"),
+    (namespaces["html"], "h4"),
+    (namespaces["html"], "h5"),
+    (namespaces["html"], "h6"),
+    (namespaces["html"], "head"),
+    (namespaces["html"], "header"),
+    (namespaces["html"], "hr"),
+    (namespaces["html"], "html"),
+    (namespaces["html"], "iframe"),
+    # Note that image is commented out in the spec as "this isn't an
+    # element that can end up on the stack, so it doesn't matter,"
+    (namespaces["html"], "image"),
+    (namespaces["html"], "img"),
+    (namespaces["html"], "input"),
+    (namespaces["html"], "isindex"),
+    (namespaces["html"], "li"),
+    (namespaces["html"], "link"),
+    (namespaces["html"], "listing"),
+    (namespaces["html"], "marquee"),
+    (namespaces["html"], "menu"),
+    (namespaces["html"], "meta"),
+    (namespaces["html"], "nav"),
+    (namespaces["html"], "noembed"),
+    (namespaces["html"], "noframes"),
+    (namespaces["html"], "noscript"),
+    (namespaces["html"], "object"),
+    (namespaces["html"], "ol"),
+    (namespaces["html"], "p"),
+    (namespaces["html"], "param"),
+    (namespaces["html"], "plaintext"),
+    (namespaces["html"], "pre"),
+    (namespaces["html"], "script"),
+    (namespaces["html"], "section"),
+    (namespaces["html"], "select"),
+    (namespaces["html"], "style"),
+    (namespaces["html"], "table"),
+    (namespaces["html"], "tbody"),
+    (namespaces["html"], "td"),
+    (namespaces["html"], "textarea"),
+    (namespaces["html"], "tfoot"),
+    (namespaces["html"], "th"),
+    (namespaces["html"], "thead"),
+    (namespaces["html"], "title"),
+    (namespaces["html"], "tr"),
+    (namespaces["html"], "ul"),
+    (namespaces["html"], "wbr"),
+    (namespaces["html"], "xmp"),
+    (namespaces["svg"], "foreignObject")
+])
+
+htmlIntegrationPointElements = frozenset([
+    (namespaces["mathml"], "annotaion-xml"),
+    (namespaces["svg"], "foreignObject"),
+    (namespaces["svg"], "desc"),
+    (namespaces["svg"], "title")
+])
+
+mathmlTextIntegrationPointElements = frozenset([
+    (namespaces["mathml"], "mi"),
+    (namespaces["mathml"], "mo"),
+    (namespaces["mathml"], "mn"),
+    (namespaces["mathml"], "ms"),
+    (namespaces["mathml"], "mtext")
+])
+
+adjustSVGAttributes = {
+    "attributename": "attributeName",
+    "attributetype": "attributeType",
+    "basefrequency": "baseFrequency",
+    "baseprofile": "baseProfile",
+    "calcmode": "calcMode",
+    "clippathunits": "clipPathUnits",
+    "contentscripttype": "contentScriptType",
+    "contentstyletype": "contentStyleType",
+    "diffuseconstant": "diffuseConstant",
+    "edgemode": "edgeMode",
+    "externalresourcesrequired": "externalResourcesRequired",
+    "filterres": "filterRes",
+    "filterunits": "filterUnits",
+    "glyphref": "glyphRef",
+    "gradienttransform": "gradientTransform",
+    "gradientunits": "gradientUnits",
+    "kernelmatrix": "kernelMatrix",
+    "kernelunitlength": "kernelUnitLength",
+    "keypoints": "keyPoints",
+    "keysplines": "keySplines",
+    "keytimes": "keyTimes",
+    "lengthadjust": "lengthAdjust",
+    "limitingconeangle": "limitingConeAngle",
+    "markerheight": "markerHeight",
+    "markerunits": "markerUnits",
+    "markerwidth": "markerWidth",
+    "maskcontentunits": "maskContentUnits",
+    "maskunits": "maskUnits",
+    "numoctaves": "numOctaves",
+    "pathlength": "pathLength",
+    "patterncontentunits": "patternContentUnits",
+    "patterntransform": "patternTransform",
+    "patternunits": "patternUnits",
+    "pointsatx": "pointsAtX",
+    "pointsaty": "pointsAtY",
+    "pointsatz": "pointsAtZ",
+    "preservealpha": "preserveAlpha",
+    "preserveaspectratio": "preserveAspectRatio",
+    "primitiveunits": "primitiveUnits",
+    "refx": "refX",
+    "refy": "refY",
+    "repeatcount": "repeatCount",
+    "repeatdur": "repeatDur",
+    "requiredextensions": "requiredExtensions",
+    "requiredfeatures": "requiredFeatures",
+    "specularconstant": "specularConstant",
+    "specularexponent": "specularExponent",
+    "spreadmethod": "spreadMethod",
+    "startoffset": "startOffset",
+    "stddeviation": "stdDeviation",
+    "stitchtiles": "stitchTiles",
+    "surfacescale": "surfaceScale",
+    "systemlanguage": "systemLanguage",
+    "tablevalues": "tableValues",
+    "targetx": "targetX",
+    "targety": "targetY",
+    "textlength": "textLength",
+    "viewbox": "viewBox",
+    "viewtarget": "viewTarget",
+    "xchannelselector": "xChannelSelector",
+    "ychannelselector": "yChannelSelector",
+    "zoomandpan": "zoomAndPan"
+}
+
+adjustMathMLAttributes = {"definitionurl": "definitionURL"}
+
+adjustForeignAttributes = {
+    "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]),
+    "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]),
+    "xlink:href": ("xlink", "href", namespaces["xlink"]),
+    "xlink:role": ("xlink", "role", namespaces["xlink"]),
+    "xlink:show": ("xlink", "show", namespaces["xlink"]),
+    "xlink:title": ("xlink", "title", namespaces["xlink"]),
+    "xlink:type": ("xlink", "type", namespaces["xlink"]),
+    "xml:base": ("xml", "base", namespaces["xml"]),
+    "xml:lang": ("xml", "lang", namespaces["xml"]),
+    "xml:space": ("xml", "space", namespaces["xml"]),
+    "xmlns": (None, "xmlns", namespaces["xmlns"]),
+    "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"])
+}
+
+unadjustForeignAttributes = dict([((ns, local), qname) for qname, (prefix, local, ns) in
+                                  adjustForeignAttributes.items()])
+
+spaceCharacters = frozenset([
+    "\t",
+    "\n",
+    "\u000C",
+    " ",
+    "\r"
+])
+
+tableInsertModeElements = frozenset([
+    "table",
+    "tbody",
+    "tfoot",
+    "thead",
+    "tr"
+])
+
+asciiLowercase = frozenset(string.ascii_lowercase)
+asciiUppercase = frozenset(string.ascii_uppercase)
+asciiLetters = frozenset(string.ascii_letters)
+digits = frozenset(string.digits)
+hexDigits = frozenset(string.hexdigits)
+
+asciiUpper2Lower = dict([(ord(c), ord(c.lower()))
+                         for c in string.ascii_uppercase])
+
+# Heading elements need to be ordered
+headingElements = (
+    "h1",
+    "h2",
+    "h3",
+    "h4",
+    "h5",
+    "h6"
+)
+
+voidElements = frozenset([
+    "base",
+    "command",
+    "event-source",
+    "link",
+    "meta",
+    "hr",
+    "br",
+    "img",
+    "embed",
+    "param",
+    "area",
+    "col",
+    "input",
+    "source",
+    "track"
+])
+
+cdataElements = frozenset(['title', 'textarea'])
+
+rcdataElements = frozenset([
+    'style',
+    'script',
+    'xmp',
+    'iframe',
+    'noembed',
+    'noframes',
+    'noscript'
+])
+
+booleanAttributes = {
+    "": frozenset(["irrelevant"]),
+    "style": frozenset(["scoped"]),
+    "img": frozenset(["ismap"]),
+    "audio": frozenset(["autoplay", "controls"]),
+    "video": frozenset(["autoplay", "controls"]),
+    "script": frozenset(["defer", "async"]),
+    "details": frozenset(["open"]),
+    "datagrid": frozenset(["multiple", "disabled"]),
+    "command": frozenset(["hidden", "disabled", "checked", "default"]),
+    "hr": frozenset(["noshade"]),
+    "menu": frozenset(["autosubmit"]),
+    "fieldset": frozenset(["disabled", "readonly"]),
+    "option": frozenset(["disabled", "readonly", "selected"]),
+    "optgroup": frozenset(["disabled", "readonly"]),
+    "button": frozenset(["disabled", "autofocus"]),
+    "input": frozenset(["disabled", "readonly", "required", "autofocus", "checked", "ismap"]),
+    "select": frozenset(["disabled", "readonly", "autofocus", "multiple"]),
+    "output": frozenset(["disabled", "readonly"]),
+}
+
+# entitiesWindows1252 has to be _ordered_ and needs to have an index. It
+# therefore can't be a frozenset.
+entitiesWindows1252 = (
+    8364,   # 0x80  0x20AC  EURO SIGN
+    65533,  # 0x81          UNDEFINED
+    8218,   # 0x82  0x201A  SINGLE LOW-9 QUOTATION MARK
+    402,    # 0x83  0x0192  LATIN SMALL LETTER F WITH HOOK
+    8222,   # 0x84  0x201E  DOUBLE LOW-9 QUOTATION MARK
+    8230,   # 0x85  0x2026  HORIZONTAL ELLIPSIS
+    8224,   # 0x86  0x2020  DAGGER
+    8225,   # 0x87  0x2021  DOUBLE DAGGER
+    710,    # 0x88  0x02C6  MODIFIER LETTER CIRCUMFLEX ACCENT
+    8240,   # 0x89  0x2030  PER MILLE SIGN
+    352,    # 0x8A  0x0160  LATIN CAPITAL LETTER S WITH CARON
+    8249,   # 0x8B  0x2039  SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+    338,    # 0x8C  0x0152  LATIN CAPITAL LIGATURE OE
+    65533,  # 0x8D          UNDEFINED
+    381,    # 0x8E  0x017D  LATIN CAPITAL LETTER Z WITH CARON
+    65533,  # 0x8F          UNDEFINED
+    65533,  # 0x90          UNDEFINED
+    8216,   # 0x91  0x2018  LEFT SINGLE QUOTATION MARK
+    8217,   # 0x92  0x2019  RIGHT SINGLE QUOTATION MARK
+    8220,   # 0x93  0x201C  LEFT DOUBLE QUOTATION MARK
+    8221,   # 0x94  0x201D  RIGHT DOUBLE QUOTATION MARK
+    8226,   # 0x95  0x2022  BULLET
+    8211,   # 0x96  0x2013  EN DASH
+    8212,   # 0x97  0x2014  EM DASH
+    732,    # 0x98  0x02DC  SMALL TILDE
+    8482,   # 0x99  0x2122  TRADE MARK SIGN
+    353,    # 0x9A  0x0161  LATIN SMALL LETTER S WITH CARON
+    8250,   # 0x9B  0x203A  SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+    339,    # 0x9C  0x0153  LATIN SMALL LIGATURE OE
+    65533,  # 0x9D          UNDEFINED
+    382,    # 0x9E  0x017E  LATIN SMALL LETTER Z WITH CARON
+    376     # 0x9F  0x0178  LATIN CAPITAL LETTER Y WITH DIAERESIS
+)
+
+xmlEntities = frozenset(['lt;', 'gt;', 'amp;', 'apos;', 'quot;'])
+
+entities = {
+    "AElig": "\xc6",
+    "AElig;": "\xc6",
+    "AMP": "&",
+    "AMP;": "&",
+    "Aacute": "\xc1",
+    "Aacute;": "\xc1",
+    "Abreve;": "\u0102",
+    "Acirc": "\xc2",
+    "Acirc;": "\xc2",
+    "Acy;": "\u0410",
+    "Afr;": "\U0001d504",
+    "Agrave": "\xc0",
+    "Agrave;": "\xc0",
+    "Alpha;": "\u0391",
+    "Amacr;": "\u0100",
+    "And;": "\u2a53",
+    "Aogon;": "\u0104",
+    "Aopf;": "\U0001d538",
+    "ApplyFunction;": "\u2061",
+    "Aring": "\xc5",
+    "Aring;": "\xc5",
+    "Ascr;": "\U0001d49c",
+    "Assign;": "\u2254",
+    "Atilde": "\xc3",
+    "Atilde;": "\xc3",
+    "Auml": "\xc4",
+    "Auml;": "\xc4",
+    "Backslash;": "\u2216",
+    "Barv;": "\u2ae7",
+    "Barwed;": "\u2306",
+    "Bcy;": "\u0411",
+    "Because;": "\u2235",
+    "Bernoullis;": "\u212c",
+    "Beta;": "\u0392",
+    "Bfr;": "\U0001d505",
+    "Bopf;": "\U0001d539",
+    "Breve;": "\u02d8",
+    "Bscr;": "\u212c",
+    "Bumpeq;": "\u224e",
+    "CHcy;": "\u0427",
+    "COPY": "\xa9",
+    "COPY;": "\xa9",
+    "Cacute;": "\u0106",
+    "Cap;": "\u22d2",
+    "CapitalDifferentialD;": "\u2145",
+    "Cayleys;": "\u212d",
+    "Ccaron;": "\u010c",
+    "Ccedil": "\xc7",
+    "Ccedil;": "\xc7",
+    "Ccirc;": "\u0108",
+    "Cconint;": "\u2230",
+    "Cdot;": "\u010a",
+    "Cedilla;": "\xb8",
+    "CenterDot;": "\xb7",
+    "Cfr;": "\u212d",
+    "Chi;": "\u03a7",
+    "CircleDot;": "\u2299",
+    "CircleMinus;": "\u2296",
+    "CirclePlus;": "\u2295",
+    "CircleTimes;": "\u2297",
+    "ClockwiseContourIntegral;": "\u2232",
+    "CloseCurlyDoubleQuote;": "\u201d",
+    "CloseCurlyQuote;": "\u2019",
+    "Colon;": "\u2237",
+    "Colone;": "\u2a74",
+    "Congruent;": "\u2261",
+    "Conint;": "\u222f",
+    "ContourIntegral;": "\u222e",
+    "Copf;": "\u2102",
+    "Coproduct;": "\u2210",
+    "CounterClockwiseContourIntegral;": "\u2233",
+    "Cross;": "\u2a2f",
+    "Cscr;": "\U0001d49e",
+    "Cup;": "\u22d3",
+    "CupCap;": "\u224d",
+    "DD;": "\u2145",
+    "DDotrahd;": "\u2911",
+    "DJcy;": "\u0402",
+    "DScy;": "\u0405",
+    "DZcy;": "\u040f",
+    "Dagger;": "\u2021",
+    "Darr;": "\u21a1",
+    "Dashv;": "\u2ae4",
+    "Dcaron;": "\u010e",
+    "Dcy;": "\u0414",
+    "Del;": "\u2207",
+    "Delta;": "\u0394",
+    "Dfr;": "\U0001d507",
+    "DiacriticalAcute;": "\xb4",
+    "DiacriticalDot;": "\u02d9",
+    "DiacriticalDoubleAcute;": "\u02dd",
+    "DiacriticalGrave;": "`",
+    "DiacriticalTilde;": "\u02dc",
+    "Diamond;": "\u22c4",
+    "DifferentialD;": "\u2146",
+    "Dopf;": "\U0001d53b",
+    "Dot;": "\xa8",
+    "DotDot;": "\u20dc",
+    "DotEqual;": "\u2250",
+    "DoubleContourIntegral;": "\u222f",
+    "DoubleDot;": "\xa8",
+    "DoubleDownArrow;": "\u21d3",
+    "DoubleLeftArrow;": "\u21d0",
+    "DoubleLeftRightArrow;": "\u21d4",
+    "DoubleLeftTee;": "\u2ae4",
+    "DoubleLongLeftArrow;": "\u27f8",
+    "DoubleLongLeftRightArrow;": "\u27fa",
+    "DoubleLongRightArrow;": "\u27f9",
+    "DoubleRightArrow;": "\u21d2",
+    "DoubleRightTee;": "\u22a8",
+    "DoubleUpArrow;": "\u21d1",
+    "DoubleUpDownArrow;": "\u21d5",
+    "DoubleVerticalBar;": "\u2225",
+    "DownArrow;": "\u2193",
+    "DownArrowBar;": "\u2913",
+    "DownArrowUpArrow;": "\u21f5",
+    "DownBreve;": "\u0311",
+    "DownLeftRightVector;": "\u2950",
+    "DownLeftTeeVector;": "\u295e",
+    "DownLeftVector;": "\u21bd",
+    "DownLeftVectorBar;": "\u2956",
+    "DownRightTeeVector;": "\u295f",
+    "DownRightVector;": "\u21c1",
+    "DownRightVectorBar;": "\u2957",
+    "DownTee;": "\u22a4",
+    "DownTeeArrow;": "\u21a7",
+    "Downarrow;": "\u21d3",
+    "Dscr;": "\U0001d49f",
+    "Dstrok;": "\u0110",
+    "ENG;": "\u014a",
+    "ETH": "\xd0",
+    "ETH;": "\xd0",
+    "Eacute": "\xc9",
+    "Eacute;": "\xc9",
+    "Ecaron;": "\u011a",
+    "Ecirc": "\xca",
+    "Ecirc;": "\xca",
+    "Ecy;": "\u042d",
+    "Edot;": "\u0116",
+    "Efr;": "\U0001d508",
+    "Egrave": "\xc8",
+    "Egrave;": "\xc8",
+    "Element;": "\u2208",
+    "Emacr;": "\u0112",
+    "EmptySmallSquare;": "\u25fb",
+    "EmptyVerySmallSquare;": "\u25ab",
+    "Eogon;": "\u0118",
+    "Eopf;": "\U0001d53c",
+    "Epsilon;": "\u0395",
+    "Equal;": "\u2a75",
+    "EqualTilde;": "\u2242",
+    "Equilibrium;": "\u21cc",
+    "Escr;": "\u2130",
+    "Esim;": "\u2a73",
+    "Eta;": "\u0397",
+    "Euml": "\xcb",
+    "Euml;": "\xcb",
+    "Exists;": "\u2203",
+    "ExponentialE;": "\u2147",
+    "Fcy;": "\u0424",
+    "Ffr;": "\U0001d509",
+    "FilledSmallSquare;": "\u25fc",
+    "FilledVerySmallSquare;": "\u25aa",
+    "Fopf;": "\U0001d53d",
+    "ForAll;": "\u2200",
+    "Fouriertrf;": "\u2131",
+    "Fscr;": "\u2131",
+    "GJcy;": "\u0403",
+    "GT": ">",
+    "GT;": ">",
+    "Gamma;": "\u0393",
+    "Gammad;": "\u03dc",
+    "Gbreve;": "\u011e",
+    "Gcedil;": "\u0122",
+    "Gcirc;": "\u011c",
+    "Gcy;": "\u0413",
+    "Gdot;": "\u0120",
+    "Gfr;": "\U0001d50a",
+    "Gg;": "\u22d9",
+    "Gopf;": "\U0001d53e",
+    "GreaterEqual;": "\u2265",
+    "GreaterEqualLess;": "\u22db",
+    "GreaterFullEqual;": "\u2267",
+    "GreaterGreater;": "\u2aa2",
+    "GreaterLess;": "\u2277",
+    "GreaterSlantEqual;": "\u2a7e",
+    "GreaterTilde;": "\u2273",
+    "Gscr;": "\U0001d4a2",
+    "Gt;": "\u226b",
+    "HARDcy;": "\u042a",
+    "Hacek;": "\u02c7",
+    "Hat;": "^",
+    "Hcirc;": "\u0124",
+    "Hfr;": "\u210c",
+    "HilbertSpace;": "\u210b",
+    "Hopf;": "\u210d",
+    "HorizontalLine;": "\u2500",
+    "Hscr;": "\u210b",
+    "Hstrok;": "\u0126",
+    "HumpDownHump;": "\u224e",
+    "HumpEqual;": "\u224f",
+    "IEcy;": "\u0415",
+    "IJlig;": "\u0132",
+    "IOcy;": "\u0401",
+    "Iacute": "\xcd",
+    "Iacute;": "\xcd",
+    "Icirc": "\xce",
+    "Icirc;": "\xce",
+    "Icy;": "\u0418",
+    "Idot;": "\u0130",
+    "Ifr;": "\u2111",
+    "Igrave": "\xcc",
+    "Igrave;": "\xcc",
+    "Im;": "\u2111",
+    "Imacr;": "\u012a",
+    "ImaginaryI;": "\u2148",
+    "Implies;": "\u21d2",
+    "Int;": "\u222c",
+    "Integral;": "\u222b",
+    "Intersection;": "\u22c2",
+    "InvisibleComma;": "\u2063",
+    "InvisibleTimes;": "\u2062",
+    "Iogon;": "\u012e",
+    "Iopf;": "\U0001d540",
+    "Iota;": "\u0399",
+    "Iscr;": "\u2110",
+    "Itilde;": "\u0128",
+    "Iukcy;": "\u0406",
+    "Iuml": "\xcf",
+    "Iuml;": "\xcf",
+    "Jcirc;": "\u0134",
+    "Jcy;": "\u0419",
+    "Jfr;": "\U0001d50d",
+    "Jopf;": "\U0001d541",
+    "Jscr;": "\U0001d4a5",
+    "Jsercy;": "\u0408",
+    "Jukcy;": "\u0404",
+    "KHcy;": "\u0425",
+    "KJcy;": "\u040c",
+    "Kappa;": "\u039a",
+    "Kcedil;": "\u0136",
+    "Kcy;": "\u041a",
+    "Kfr;": "\U0001d50e",
+    "Kopf;": "\U0001d542",
+    "Kscr;": "\U0001d4a6",
+    "LJcy;": "\u0409",
+    "LT": "<",
+    "LT;": "<",
+    "Lacute;": "\u0139",
+    "Lambda;": "\u039b",
+    "Lang;": "\u27ea",
+    "Laplacetrf;": "\u2112",
+    "Larr;": "\u219e",
+    "Lcaron;": "\u013d",
+    "Lcedil;": "\u013b",
+    "Lcy;": "\u041b",
+    "LeftAngleBracket;": "\u27e8",
+    "LeftArrow;": "\u2190",
+    "LeftArrowBar;": "\u21e4",
+    "LeftArrowRightArrow;": "\u21c6",
+    "LeftCeiling;": "\u2308",
+    "LeftDoubleBracket;": "\u27e6",
+    "LeftDownTeeVector;": "\u2961",
+    "LeftDownVector;": "\u21c3",
+    "LeftDownVectorBar;": "\u2959",
+    "LeftFloor;": "\u230a",
+    "LeftRightArrow;": "\u2194",
+    "LeftRightVector;": "\u294e",
+    "LeftTee;": "\u22a3",
+    "LeftTeeArrow;": "\u21a4",
+    "LeftTeeVector;": "\u295a",
+    "LeftTriangle;": "\u22b2",
+    "LeftTriangleBar;": "\u29cf",
+    "LeftTriangleEqual;": "\u22b4",
+    "LeftUpDownVector;": "\u2951",
+    "LeftUpTeeVector;": "\u2960",
+    "LeftUpVector;": "\u21bf",
+    "LeftUpVectorBar;": "\u2958",
+    "LeftVector;": "\u21bc",
+    "LeftVectorBar;": "\u2952",
+    "Leftarrow;": "\u21d0",
+    "Leftrightarrow;": "\u21d4",
+    "LessEqualGreater;": "\u22da",
+    "LessFullEqual;": "\u2266",
+    "LessGreater;": "\u2276",
+    "LessLess;": "\u2aa1",
+    "LessSlantEqual;": "\u2a7d",
+    "LessTilde;": "\u2272",
+    "Lfr;": "\U0001d50f",
+    "Ll;": "\u22d8",
+    "Lleftarrow;": "\u21da",
+    "Lmidot;": "\u013f",
+    "LongLeftArrow;": "\u27f5",
+    "LongLeftRightArrow;": "\u27f7",
+    "LongRightArrow;": "\u27f6",
+    "Longleftarrow;": "\u27f8",
+    "Longleftrightarrow;": "\u27fa",
+    "Longrightarrow;": "\u27f9",
+    "Lopf;": "\U0001d543",
+    "LowerLeftArrow;": "\u2199",
+    "LowerRightArrow;": "\u2198",
+    "Lscr;": "\u2112",
+    "Lsh;": "\u21b0",
+    "Lstrok;": "\u0141",
+    "Lt;": "\u226a",
+    "Map;": "\u2905",
+    "Mcy;": "\u041c",
+    "MediumSpace;": "\u205f",
+    "Mellintrf;": "\u2133",
+    "Mfr;": "\U0001d510",
+    "MinusPlus;": "\u2213",
+    "Mopf;": "\U0001d544",
+    "Mscr;": "\u2133",
+    "Mu;": "\u039c",
+    "NJcy;": "\u040a",
+    "Nacute;": "\u0143",
+    "Ncaron;": "\u0147",
+    "Ncedil;": "\u0145",
+    "Ncy;": "\u041d",
+    "NegativeMediumSpace;": "\u200b",
+    "NegativeThickSpace;": "\u200b",
+    "NegativeThinSpace;": "\u200b",
+    "NegativeVeryThinSpace;": "\u200b",
+    "NestedGreaterGreater;": "\u226b",
+    "NestedLessLess;": "\u226a",
+    "NewLine;": "\n",
+    "Nfr;": "\U0001d511",
+    "NoBreak;": "\u2060",
+    "NonBreakingSpace;": "\xa0",
+    "Nopf;": "\u2115",
+    "Not;": "\u2aec",
+    "NotCongruent;": "\u2262",
+    "NotCupCap;": "\u226d",
+    "NotDoubleVerticalBar;": "\u2226",
+    "NotElement;": "\u2209",
+    "NotEqual;": "\u2260",
+    "NotEqualTilde;": "\u2242\u0338",
+    "NotExists;": "\u2204",
+    "NotGreater;": "\u226f",
+    "NotGreaterEqual;": "\u2271",
+    "NotGreaterFullEqual;": "\u2267\u0338",
+    "NotGreaterGreater;": "\u226b\u0338",
+    "NotGreaterLess;": "\u2279",
+    "NotGreaterSlantEqual;": "\u2a7e\u0338",
+    "NotGreaterTilde;": "\u2275",
+    "NotHumpDownHump;": "\u224e\u0338",
+    "NotHumpEqual;": "\u224f\u0338",
+    "NotLeftTriangle;": "\u22ea",
+    "NotLeftTriangleBar;": "\u29cf\u0338",
+    "NotLeftTriangleEqual;": "\u22ec",
+    "NotLess;": "\u226e",
+    "NotLessEqual;": "\u2270",
+    "NotLessGreater;": "\u2278",
+    "NotLessLess;": "\u226a\u0338",
+    "NotLessSlantEqual;": "\u2a7d\u0338",
+    "NotLessTilde;": "\u2274",
+    "NotNestedGreaterGreater;": "\u2aa2\u0338",
+    "NotNestedLessLess;": "\u2aa1\u0338",
+    "NotPrecedes;": "\u2280",
+    "NotPrecedesEqual;": "\u2aaf\u0338",
+    "NotPrecedesSlantEqual;": "\u22e0",
+    "NotReverseElement;": "\u220c",
+    "NotRightTriangle;": "\u22eb",
+    "NotRightTriangleBar;": "\u29d0\u0338",
+    "NotRightTriangleEqual;": "\u22ed",
+    "NotSquareSubset;": "\u228f\u0338",
+    "NotSquareSubsetEqual;": "\u22e2",
+    "NotSquareSuperset;": "\u2290\u0338",
+    "NotSquareSupersetEqual;": "\u22e3",
+    "NotSubset;": "\u2282\u20d2",
+    "NotSubsetEqual;": "\u2288",
+    "NotSucceeds;": "\u2281",
+    "NotSucceedsEqual;": "\u2ab0\u0338",
+    "NotSucceedsSlantEqual;": "\u22e1",
+    "NotSucceedsTilde;": "\u227f\u0338",
+    "NotSuperset;": "\u2283\u20d2",
+    "NotSupersetEqual;": "\u2289",
+    "NotTilde;": "\u2241",
+    "NotTildeEqual;": "\u2244",
+    "NotTildeFullEqual;": "\u2247",
+    "NotTildeTilde;": "\u2249",
+    "NotVerticalBar;": "\u2224",
+    "Nscr;": "\U0001d4a9",
+    "Ntilde": "\xd1",
+    "Ntilde;": "\xd1",
+    "Nu;": "\u039d",
+    "OElig;": "\u0152",
+    "Oacute": "\xd3",
+    "Oacute;": "\xd3",
+    "Ocirc": "\xd4",
+    "Ocirc;": "\xd4",
+    "Ocy;": "\u041e",
+    "Odblac;": "\u0150",
+    "Ofr;": "\U0001d512",
+    "Ograve": "\xd2",
+    "Ograve;": "\xd2",
+    "Omacr;": "\u014c",
+    "Omega;": "\u03a9",
+    "Omicron;": "\u039f",
+    "Oopf;": "\U0001d546",
+    "OpenCurlyDoubleQuote;": "\u201c",
+    "OpenCurlyQuote;": "\u2018",
+    "Or;": "\u2a54",
+    "Oscr;": "\U0001d4aa",
+    "Oslash": "\xd8",
+    "Oslash;": "\xd8",
+    "Otilde": "\xd5",
+    "Otilde;": "\xd5",
+    "Otimes;": "\u2a37",
+    "Ouml": "\xd6",
+    "Ouml;": "\xd6",
+    "OverBar;": "\u203e",
+    "OverBrace;": "\u23de",
+    "OverBracket;": "\u23b4",
+    "OverParenthesis;": "\u23dc",
+    "PartialD;": "\u2202",
+    "Pcy;": "\u041f",
+    "Pfr;": "\U0001d513",
+    "Phi;": "\u03a6",
+    "Pi;": "\u03a0",
+    "PlusMinus;": "\xb1",
+    "Poincareplane;": "\u210c",
+    "Popf;": "\u2119",
+    "Pr;": "\u2abb",
+    "Precedes;": "\u227a",
+    "PrecedesEqual;": "\u2aaf",
+    "PrecedesSlantEqual;": "\u227c",
+    "PrecedesTilde;": "\u227e",
+    "Prime;": "\u2033",
+    "Product;": "\u220f",
+    "Proportion;": "\u2237",
+    "Proportional;": "\u221d",
+    "Pscr;": "\U0001d4ab",
+    "Psi;": "\u03a8",
+    "QUOT": "\"",
+    "QUOT;": "\"",
+    "Qfr;": "\U0001d514",
+    "Qopf;": "\u211a",
+    "Qscr;": "\U0001d4ac",
+    "RBarr;": "\u2910",
+    "REG": "\xae",
+    "REG;": "\xae",
+    "Racute;": "\u0154",
+    "Rang;": "\u27eb",
+    "Rarr;": "\u21a0",
+    "Rarrtl;": "\u2916",
+    "Rcaron;": "\u0158",
+    "Rcedil;": "\u0156",
+    "Rcy;": "\u0420",
+    "Re;": "\u211c",
+    "ReverseElement;": "\u220b",
+    "ReverseEquilibrium;": "\u21cb",
+    "ReverseUpEquilibrium;": "\u296f",
+    "Rfr;": "\u211c",
+    "Rho;": "\u03a1",
+    "RightAngleBracket;": "\u27e9",
+    "RightArrow;": "\u2192",
+    "RightArrowBar;": "\u21e5",
+    "RightArrowLeftArrow;": "\u21c4",
+    "RightCeiling;": "\u2309",
+    "RightDoubleBracket;": "\u27e7",
+    "RightDownTeeVector;": "\u295d",
+    "RightDownVector;": "\u21c2",
+    "RightDownVectorBar;": "\u2955",
+    "RightFloor;": "\u230b",
+    "RightTee;": "\u22a2",
+    "RightTeeArrow;": "\u21a6",
+    "RightTeeVector;": "\u295b",
+    "RightTriangle;": "\u22b3",
+    "RightTriangleBar;": "\u29d0",
+    "RightTriangleEqual;": "\u22b5",
+    "RightUpDownVector;": "\u294f",
+    "RightUpTeeVector;": "\u295c",
+    "RightUpVector;": "\u21be",
+    "RightUpVectorBar;": "\u2954",
+    "RightVector;": "\u21c0",
+    "RightVectorBar;": "\u2953",
+    "Rightarrow;": "\u21d2",
+    "Ropf;": "\u211d",
+    "RoundImplies;": "\u2970",
+    "Rrightarrow;": "\u21db",
+    "Rscr;": "\u211b",
+    "Rsh;": "\u21b1",
+    "RuleDelayed;": "\u29f4",
+    "SHCHcy;": "\u0429",
+    "SHcy;": "\u0428",
+    "SOFTcy;": "\u042c",
+    "Sacute;": "\u015a",
+    "Sc;": "\u2abc",
+    "Scaron;": "\u0160",
+    "Scedil;": "\u015e",
+    "Scirc;": "\u015c",
+    "Scy;": "\u0421",
+    "Sfr;": "\U0001d516",
+    "ShortDownArrow;": "\u2193",
+    "ShortLeftArrow;": "\u2190",
+    "ShortRightArrow;": "\u2192",
+    "ShortUpArrow;": "\u2191",
+    "Sigma;": "\u03a3",
+    "SmallCircle;": "\u2218",
+    "Sopf;": "\U0001d54a",
+    "Sqrt;": "\u221a",
+    "Square;": "\u25a1",
+    "SquareIntersection;": "\u2293",
+    "SquareSubset;": "\u228f",
+    "SquareSubsetEqual;": "\u2291",
+    "SquareSuperset;": "\u2290",
+    "SquareSupersetEqual;": "\u2292",
+    "SquareUnion;": "\u2294",
+    "Sscr;": "\U0001d4ae",
+    "Star;": "\u22c6",
+    "Sub;": "\u22d0",
+    "Subset;": "\u22d0",
+    "SubsetEqual;": "\u2286",
+    "Succeeds;": "\u227b",
+    "SucceedsEqual;": "\u2ab0",
+    "SucceedsSlantEqual;": "\u227d",
+    "SucceedsTilde;": "\u227f",
+    "SuchThat;": "\u220b",
+    "Sum;": "\u2211",
+    "Sup;": "\u22d1",
+    "Superset;": "\u2283",
+    "SupersetEqual;": "\u2287",
+    "Supset;": "\u22d1",
+    "THORN": "\xde",
+    "THORN;": "\xde",
+    "TRADE;": "\u2122",
+    "TSHcy;": "\u040b",
+    "TScy;": "\u0426",
+    "Tab;": "\t",
+    "Tau;": "\u03a4",
+    "Tcaron;": "\u0164",
+    "Tcedil;": "\u0162",
+    "Tcy;": "\u0422",
+    "Tfr;": "\U0001d517",
+    "Therefore;": "\u2234",
+    "Theta;": "\u0398",
+    "ThickSpace;": "\u205f\u200a",
+    "ThinSpace;": "\u2009",
+    "Tilde;": "\u223c",
+    "TildeEqual;": "\u2243",
+    "TildeFullEqual;": "\u2245",
+    "TildeTilde;": "\u2248",
+    "Topf;": "\U0001d54b",
+    "TripleDot;": "\u20db",
+    "Tscr;": "\U0001d4af",
+    "Tstrok;": "\u0166",
+    "Uacute": "\xda",
+    "Uacute;": "\xda",
+    "Uarr;": "\u219f",
+    "Uarrocir;": "\u2949",
+    "Ubrcy;": "\u040e",
+    "Ubreve;": "\u016c",
+    "Ucirc": "\xdb",
+    "Ucirc;": "\xdb",
+    "Ucy;": "\u0423",
+    "Udblac;": "\u0170",
+    "Ufr;": "\U0001d518",
+    "Ugrave": "\xd9",
+    "Ugrave;": "\xd9",
+    "Umacr;": "\u016a",
+    "UnderBar;": "_",
+    "UnderBrace;": "\u23df",
+    "UnderBracket;": "\u23b5",
+    "UnderParenthesis;": "\u23dd",
+    "Union;": "\u22c3",
+    "UnionPlus;": "\u228e",
+    "Uogon;": "\u0172",
+    "Uopf;": "\U0001d54c",
+    "UpArrow;": "\u2191",
+    "UpArrowBar;": "\u2912",
+    "UpArrowDownArrow;": "\u21c5",
+    "UpDownArrow;": "\u2195",
+    "UpEquilibrium;": "\u296e",
+    "UpTee;": "\u22a5",
+    "UpTeeArrow;": "\u21a5",
+    "Uparrow;": "\u21d1",
+    "Updownarrow;": "\u21d5",
+    "UpperLeftArrow;": "\u2196",
+    "UpperRightArrow;": "\u2197",
+    "Upsi;": "\u03d2",
+    "Upsilon;": "\u03a5",
+    "Uring;": "\u016e",
+    "Uscr;": "\U0001d4b0",
+    "Utilde;": "\u0168",
+    "Uuml": "\xdc",
+    "Uuml;": "\xdc",
+    "VDash;": "\u22ab",
+    "Vbar;": "\u2aeb",
+    "Vcy;": "\u0412",
+    "Vdash;": "\u22a9",
+    "Vdashl;": "\u2ae6",
+    "Vee;": "\u22c1",
+    "Verbar;": "\u2016",
+    "Vert;": "\u2016",
+    "VerticalBar;": "\u2223",
+    "VerticalLine;": "|",
+    "VerticalSeparator;": "\u2758",
+    "VerticalTilde;": "\u2240",
+    "VeryThinSpace;": "\u200a",
+    "Vfr;": "\U0001d519",
+    "Vopf;": "\U0001d54d",
+    "Vscr;": "\U0001d4b1",
+    "Vvdash;": "\u22aa",
+    "Wcirc;": "\u0174",
+    "Wedge;": "\u22c0",
+    "Wfr;": "\U0001d51a",
+    "Wopf;": "\U0001d54e",
+    "Wscr;": "\U0001d4b2",
+    "Xfr;": "\U0001d51b",
+    "Xi;": "\u039e",
+    "Xopf;": "\U0001d54f",
+    "Xscr;": "\U0001d4b3",
+    "YAcy;": "\u042f",
+    "YIcy;": "\u0407",
+    "YUcy;": "\u042e",
+    "Yacute": "\xdd",
+    "Yacute;": "\xdd",
+    "Ycirc;": "\u0176",
+    "Ycy;": "\u042b",
+    "Yfr;": "\U0001d51c",
+    "Yopf;": "\U0001d550",
+    "Yscr;": "\U0001d4b4",
+    "Yuml;": "\u0178",
+    "ZHcy;": "\u0416",
+    "Zacute;": "\u0179",
+    "Zcaron;": "\u017d",
+    "Zcy;": "\u0417",
+    "Zdot;": "\u017b",
+    "ZeroWidthSpace;": "\u200b",
+    "Zeta;": "\u0396",
+    "Zfr;": "\u2128",
+    "Zopf;": "\u2124",
+    "Zscr;": "\U0001d4b5",
+    "aacute": "\xe1",
+    "aacute;": "\xe1",
+    "abreve;": "\u0103",
+    "ac;": "\u223e",
+    "acE;": "\u223e\u0333",
+    "acd;": "\u223f",
+    "acirc": "\xe2",
+    "acirc;": "\xe2",
+    "acute": "\xb4",
+    "acute;": "\xb4",
+    "acy;": "\u0430",
+    "aelig": "\xe6",
+    "aelig;": "\xe6",
+    "af;": "\u2061",
+    "afr;": "\U0001d51e",
+    "agrave": "\xe0",
+    "agrave;": "\xe0",
+    "alefsym;": "\u2135",
+    "aleph;": "\u2135",
+    "alpha;": "\u03b1",
+    "amacr;": "\u0101",
+    "amalg;": "\u2a3f",
+    "amp": "&",
+    "amp;": "&",
+    "and;": "\u2227",
+    "andand;": "\u2a55",
+    "andd;": "\u2a5c",
+    "andslope;": "\u2a58",
+    "andv;": "\u2a5a",
+    "ang;": "\u2220",
+    "ange;": "\u29a4",
+    "angle;": "\u2220",
+    "angmsd;": "\u2221",
+    "angmsdaa;": "\u29a8",
+    "angmsdab;": "\u29a9",
+    "angmsdac;": "\u29aa",
+    "angmsdad;": "\u29ab",
+    "angmsdae;": "\u29ac",
+    "angmsdaf;": "\u29ad",
+    "angmsdag;": "\u29ae",
+    "angmsdah;": "\u29af",
+    "angrt;": "\u221f",
+    "angrtvb;": "\u22be",
+    "angrtvbd;": "\u299d",
+    "angsph;": "\u2222",
+    "angst;": "\xc5",
+    "angzarr;": "\u237c",
+    "aogon;": "\u0105",
+    "aopf;": "\U0001d552",
+    "ap;": "\u2248",
+    "apE;": "\u2a70",
+    "apacir;": "\u2a6f",
+    "ape;": "\u224a",
+    "apid;": "\u224b",
+    "apos;": "'",
+    "approx;": "\u2248",
+    "approxeq;": "\u224a",
+    "aring": "\xe5",
+    "aring;": "\xe5",
+    "ascr;": "\U0001d4b6",
+    "ast;": "*",
+    "asymp;": "\u2248",
+    "asympeq;": "\u224d",
+    "atilde": "\xe3",
+    "atilde;": "\xe3",
+    "auml": "\xe4",
+    "auml;": "\xe4",
+    "awconint;": "\u2233",
+    "awint;": "\u2a11",
+    "bNot;": "\u2aed",
+    "backcong;": "\u224c",
+    "backepsilon;": "\u03f6",
+    "backprime;": "\u2035",
+    "backsim;": "\u223d",
+    "backsimeq;": "\u22cd",
+    "barvee;": "\u22bd",
+    "barwed;": "\u2305",
+    "barwedge;": "\u2305",
+    "bbrk;": "\u23b5",
+    "bbrktbrk;": "\u23b6",
+    "bcong;": "\u224c",
+    "bcy;": "\u0431",
+    "bdquo;": "\u201e",
+    "becaus;": "\u2235",
+    "because;": "\u2235",
+    "bemptyv;": "\u29b0",
+    "bepsi;": "\u03f6",
+    "bernou;": "\u212c",
+    "beta;": "\u03b2",
+    "beth;": "\u2136",
+    "between;": "\u226c",
+    "bfr;": "\U0001d51f",
+    "bigcap;": "\u22c2",
+    "bigcirc;": "\u25ef",
+    "bigcup;": "\u22c3",
+    "bigodot;": "\u2a00",
+    "bigoplus;": "\u2a01",
+    "bigotimes;": "\u2a02",
+    "bigsqcup;": "\u2a06",
+    "bigstar;": "\u2605",
+    "bigtriangledown;": "\u25bd",
+    "bigtriangleup;": "\u25b3",
+    "biguplus;": "\u2a04",
+    "bigvee;": "\u22c1",
+    "bigwedge;": "\u22c0",
+    "bkarow;": "\u290d",
+    "blacklozenge;": "\u29eb",
+    "blacksquare;": "\u25aa",
+    "blacktriangle;": "\u25b4",
+    "blacktriangledown;": "\u25be",
+    "blacktriangleleft;": "\u25c2",
+    "blacktriangleright;": "\u25b8",
+    "blank;": "\u2423",
+    "blk12;": "\u2592",
+    "blk14;": "\u2591",
+    "blk34;": "\u2593",
+    "block;": "\u2588",
+    "bne;": "=\u20e5",
+    "bnequiv;": "\u2261\u20e5",
+    "bnot;": "\u2310",
+    "bopf;": "\U0001d553",
+    "bot;": "\u22a5",
+    "bottom;": "\u22a5",
+    "bowtie;": "\u22c8",
+    "boxDL;": "\u2557",
+    "boxDR;": "\u2554",
+    "boxDl;": "\u2556",
+    "boxDr;": "\u2553",
+    "boxH;": "\u2550",
+    "boxHD;": "\u2566",
+    "boxHU;": "\u2569",
+    "boxHd;": "\u2564",
+    "boxHu;": "\u2567",
+    "boxUL;": "\u255d",
+    "boxUR;": "\u255a",
+    "boxUl;": "\u255c",
+    "boxUr;": "\u2559",
+    "boxV;": "\u2551",
+    "boxVH;": "\u256c",
+    "boxVL;": "\u2563",
+    "boxVR;": "\u2560",
+    "boxVh;": "\u256b",
+    "boxVl;": "\u2562",
+    "boxVr;": "\u255f",
+    "boxbox;": "\u29c9",
+    "boxdL;": "\u2555",
+    "boxdR;": "\u2552",
+    "boxdl;": "\u2510",
+    "boxdr;": "\u250c",
+    "boxh;": "\u2500",
+    "boxhD;": "\u2565",
+    "boxhU;": "\u2568",
+    "boxhd;": "\u252c",
+    "boxhu;": "\u2534",
+    "boxminus;": "\u229f",
+    "boxplus;": "\u229e",
+    "boxtimes;": "\u22a0",
+    "boxuL;": "\u255b",
+    "boxuR;": "\u2558",
+    "boxul;": "\u2518",
+    "boxur;": "\u2514",
+    "boxv;": "\u2502",
+    "boxvH;": "\u256a",
+    "boxvL;": "\u2561",
+    "boxvR;": "\u255e",
+    "boxvh;": "\u253c",
+    "boxvl;": "\u2524",
+    "boxvr;": "\u251c",
+    "bprime;": "\u2035",
+    "breve;": "\u02d8",
+    "brvbar": "\xa6",
+    "brvbar;": "\xa6",
+    "bscr;": "\U0001d4b7",
+    "bsemi;": "\u204f",
+    "bsim;": "\u223d",
+    "bsime;": "\u22cd",
+    "bsol;": "\\",
+    "bsolb;": "\u29c5",
+    "bsolhsub;": "\u27c8",
+    "bull;": "\u2022",
+    "bullet;": "\u2022",
+    "bump;": "\u224e",
+    "bumpE;": "\u2aae",
+    "bumpe;": "\u224f",
+    "bumpeq;": "\u224f",
+    "cacute;": "\u0107",
+    "cap;": "\u2229",
+    "capand;": "\u2a44",
+    "capbrcup;": "\u2a49",
+    "capcap;": "\u2a4b",
+    "capcup;": "\u2a47",
+    "capdot;": "\u2a40",
+    "caps;": "\u2229\ufe00",
+    "caret;": "\u2041",
+    "caron;": "\u02c7",
+    "ccaps;": "\u2a4d",
+    "ccaron;": "\u010d",
+    "ccedil": "\xe7",
+    "ccedil;": "\xe7",
+    "ccirc;": "\u0109",
+    "ccups;": "\u2a4c",
+    "ccupssm;": "\u2a50",
+    "cdot;": "\u010b",
+    "cedil": "\xb8",
+    "cedil;": "\xb8",
+    "cemptyv;": "\u29b2",
+    "cent": "\xa2",
+    "cent;": "\xa2",
+    "centerdot;": "\xb7",
+    "cfr;": "\U0001d520",
+    "chcy;": "\u0447",
+    "check;": "\u2713",
+    "checkmark;": "\u2713",
+    "chi;": "\u03c7",
+    "cir;": "\u25cb",
+    "cirE;": "\u29c3",
+    "circ;": "\u02c6",
+    "circeq;": "\u2257",
+    "circlearrowleft;": "\u21ba",
+    "circlearrowright;": "\u21bb",
+    "circledR;": "\xae",
+    "circledS;": "\u24c8",
+    "circledast;": "\u229b",
+    "circledcirc;": "\u229a",
+    "circleddash;": "\u229d",
+    "cire;": "\u2257",
+    "cirfnint;": "\u2a10",
+    "cirmid;": "\u2aef",
+    "cirscir;": "\u29c2",
+    "clubs;": "\u2663",
+    "clubsuit;": "\u2663",
+    "colon;": ":",
+    "colone;": "\u2254",
+    "coloneq;": "\u2254",
+    "comma;": ",",
+    "commat;": "@",
+    "comp;": "\u2201",
+    "compfn;": "\u2218",
+    "complement;": "\u2201",
+    "complexes;": "\u2102",
+    "cong;": "\u2245",
+    "congdot;": "\u2a6d",
+    "conint;": "\u222e",
+    "copf;": "\U0001d554",
+    "coprod;": "\u2210",
+    "copy": "\xa9",
+    "copy;": "\xa9",
+    "copysr;": "\u2117",
+    "crarr;": "\u21b5",
+    "cross;": "\u2717",
+    "cscr;": "\U0001d4b8",
+    "csub;": "\u2acf",
+    "csube;": "\u2ad1",
+    "csup;": "\u2ad0",
+    "csupe;": "\u2ad2",
+    "ctdot;": "\u22ef",
+    "cudarrl;": "\u2938",
+    "cudarrr;": "\u2935",
+    "cuepr;": "\u22de",
+    "cuesc;": "\u22df",
+    "cularr;": "\u21b6",
+    "cularrp;": "\u293d",
+    "cup;": "\u222a",
+    "cupbrcap;": "\u2a48",
+    "cupcap;": "\u2a46",
+    "cupcup;": "\u2a4a",
+    "cupdot;": "\u228d",
+    "cupor;": "\u2a45",
+    "cups;": "\u222a\ufe00",
+    "curarr;": "\u21b7",
+    "curarrm;": "\u293c",
+    "curlyeqprec;": "\u22de",
+    "curlyeqsucc;": "\u22df",
+    "curlyvee;": "\u22ce",
+    "curlywedge;": "\u22cf",
+    "curren": "\xa4",
+    "curren;": "\xa4",
+    "curvearrowleft;": "\u21b6",
+    "curvearrowright;": "\u21b7",
+    "cuvee;": "\u22ce",
+    "cuwed;": "\u22cf",
+    "cwconint;": "\u2232",
+    "cwint;": "\u2231",
+    "cylcty;": "\u232d",
+    "dArr;": "\u21d3",
+    "dHar;": "\u2965",
+    "dagger;": "\u2020",
+    "daleth;": "\u2138",
+    "darr;": "\u2193",
+    "dash;": "\u2010",
+    "dashv;": "\u22a3",
+    "dbkarow;": "\u290f",
+    "dblac;": "\u02dd",
+    "dcaron;": "\u010f",
+    "dcy;": "\u0434",
+    "dd;": "\u2146",
+    "ddagger;": "\u2021",
+    "ddarr;": "\u21ca",
+    "ddotseq;": "\u2a77",
+    "deg": "\xb0",
+    "deg;": "\xb0",
+    "delta;": "\u03b4",
+    "demptyv;": "\u29b1",
+    "dfisht;": "\u297f",
+    "dfr;": "\U0001d521",
+    "dharl;": "\u21c3",
+    "dharr;": "\u21c2",
+    "diam;": "\u22c4",
+    "diamond;": "\u22c4",
+    "diamondsuit;": "\u2666",
+    "diams;": "\u2666",
+    "die;": "\xa8",
+    "digamma;": "\u03dd",
+    "disin;": "\u22f2",
+    "div;": "\xf7",
+    "divide": "\xf7",
+    "divide;": "\xf7",
+    "divideontimes;": "\u22c7",
+    "divonx;": "\u22c7",
+    "djcy;": "\u0452",
+    "dlcorn;": "\u231e",
+    "dlcrop;": "\u230d",
+    "dollar;": "$",
+    "dopf;": "\U0001d555",
+    "dot;": "\u02d9",
+    "doteq;": "\u2250",
+    "doteqdot;": "\u2251",
+    "dotminus;": "\u2238",
+    "dotplus;": "\u2214",
+    "dotsquare;": "\u22a1",
+    "doublebarwedge;": "\u2306",
+    "downarrow;": "\u2193",
+    "downdownarrows;": "\u21ca",
+    "downharpoonleft;": "\u21c3",
+    "downharpoonright;": "\u21c2",
+    "drbkarow;": "\u2910",
+    "drcorn;": "\u231f",
+    "drcrop;": "\u230c",
+    "dscr;": "\U0001d4b9",
+    "dscy;": "\u0455",
+    "dsol;": "\u29f6",
+    "dstrok;": "\u0111",
+    "dtdot;": "\u22f1",
+    "dtri;": "\u25bf",
+    "dtrif;": "\u25be",
+    "duarr;": "\u21f5",
+    "duhar;": "\u296f",
+    "dwangle;": "\u29a6",
+    "dzcy;": "\u045f",
+    "dzigrarr;": "\u27ff",
+    "eDDot;": "\u2a77",
+    "eDot;": "\u2251",
+    "eacute": "\xe9",
+    "eacute;": "\xe9",
+    "easter;": "\u2a6e",
+    "ecaron;": "\u011b",
+    "ecir;": "\u2256",
+    "ecirc": "\xea",
+    "ecirc;": "\xea",
+    "ecolon;": "\u2255",
+    "ecy;": "\u044d",
+    "edot;": "\u0117",
+    "ee;": "\u2147",
+    "efDot;": "\u2252",
+    "efr;": "\U0001d522",
+    "eg;": "\u2a9a",
+    "egrave": "\xe8",
+    "egrave;": "\xe8",
+    "egs;": "\u2a96",
+    "egsdot;": "\u2a98",
+    "el;": "\u2a99",
+    "elinters;": "\u23e7",
+    "ell;": "\u2113",
+    "els;": "\u2a95",
+    "elsdot;": "\u2a97",
+    "emacr;": "\u0113",
+    "empty;": "\u2205",
+    "emptyset;": "\u2205",
+    "emptyv;": "\u2205",
+    "emsp13;": "\u2004",
+    "emsp14;": "\u2005",
+    "emsp;": "\u2003",
+    "eng;": "\u014b",
+    "ensp;": "\u2002",
+    "eogon;": "\u0119",
+    "eopf;": "\U0001d556",
+    "epar;": "\u22d5",
+    "eparsl;": "\u29e3",
+    "eplus;": "\u2a71",
+    "epsi;": "\u03b5",
+    "epsilon;": "\u03b5",
+    "epsiv;": "\u03f5",
+    "eqcirc;": "\u2256",
+    "eqcolon;": "\u2255",
+    "eqsim;": "\u2242",
+    "eqslantgtr;": "\u2a96",
+    "eqslantless;": "\u2a95",
+    "equals;": "=",
+    "equest;": "\u225f",
+    "equiv;": "\u2261",
+    "equivDD;": "\u2a78",
+    "eqvparsl;": "\u29e5",
+    "erDot;": "\u2253",
+    "erarr;": "\u2971",
+    "escr;": "\u212f",
+    "esdot;": "\u2250",
+    "esim;": "\u2242",
+    "eta;": "\u03b7",
+    "eth": "\xf0",
+    "eth;": "\xf0",
+    "euml": "\xeb",
+    "euml;": "\xeb",
+    "euro;": "\u20ac",
+    "excl;": "!",
+    "exist;": "\u2203",
+    "expectation;": "\u2130",
+    "exponentiale;": "\u2147",
+    "fallingdotseq;": "\u2252",
+    "fcy;": "\u0444",
+    "female;": "\u2640",
+    "ffilig;": "\ufb03",
+    "fflig;": "\ufb00",
+    "ffllig;": "\ufb04",
+    "ffr;": "\U0001d523",
+    "filig;": "\ufb01",
+    "fjlig;": "fj",
+    "flat;": "\u266d",
+    "fllig;": "\ufb02",
+    "fltns;": "\u25b1",
+    "fnof;": "\u0192",
+    "fopf;": "\U0001d557",
+    "forall;": "\u2200",
+    "fork;": "\u22d4",
+    "forkv;": "\u2ad9",
+    "fpartint;": "\u2a0d",
+    "frac12": "\xbd",
+    "frac12;": "\xbd",
+    "frac13;": "\u2153",
+    "frac14": "\xbc",
+    "frac14;": "\xbc",
+    "frac15;": "\u2155",
+    "frac16;": "\u2159",
+    "frac18;": "\u215b",
+    "frac23;": "\u2154",
+    "frac25;": "\u2156",
+    "frac34": "\xbe",
+    "frac34;": "\xbe",
+    "frac35;": "\u2157",
+    "frac38;": "\u215c",
+    "frac45;": "\u2158",
+    "frac56;": "\u215a",
+    "frac58;": "\u215d",
+    "frac78;": "\u215e",
+    "frasl;": "\u2044",
+    "frown;": "\u2322",
+    "fscr;": "\U0001d4bb",
+    "gE;": "\u2267",
+    "gEl;": "\u2a8c",
+    "gacute;": "\u01f5",
+    "gamma;": "\u03b3",
+    "gammad;": "\u03dd",
+    "gap;": "\u2a86",
+    "gbreve;": "\u011f",
+    "gcirc;": "\u011d",
+    "gcy;": "\u0433",
+    "gdot;": "\u0121",
+    "ge;": "\u2265",
+    "gel;": "\u22db",
+    "geq;": "\u2265",
+    "geqq;": "\u2267",
+    "geqslant;": "\u2a7e",
+    "ges;": "\u2a7e",
+    "gescc;": "\u2aa9",
+    "gesdot;": "\u2a80",
+    "gesdoto;": "\u2a82",
+    "gesdotol;": "\u2a84",
+    "gesl;": "\u22db\ufe00",
+    "gesles;": "\u2a94",
+    "gfr;": "\U0001d524",
+    "gg;": "\u226b",
+    "ggg;": "\u22d9",
+    "gimel;": "\u2137",
+    "gjcy;": "\u0453",
+    "gl;": "\u2277",
+    "glE;": "\u2a92",
+    "gla;": "\u2aa5",
+    "glj;": "\u2aa4",
+    "gnE;": "\u2269",
+    "gnap;": "\u2a8a",
+    "gnapprox;": "\u2a8a",
+    "gne;": "\u2a88",
+    "gneq;": "\u2a88",
+    "gneqq;": "\u2269",
+    "gnsim;": "\u22e7",
+    "gopf;": "\U0001d558",
+    "grave;": "`",
+    "gscr;": "\u210a",
+    "gsim;": "\u2273",
+    "gsime;": "\u2a8e",
+    "gsiml;": "\u2a90",
+    "gt": ">",
+    "gt;": ">",
+    "gtcc;": "\u2aa7",
+    "gtcir;": "\u2a7a",
+    "gtdot;": "\u22d7",
+    "gtlPar;": "\u2995",
+    "gtquest;": "\u2a7c",
+    "gtrapprox;": "\u2a86",
+    "gtrarr;": "\u2978",
+    "gtrdot;": "\u22d7",
+    "gtreqless;": "\u22db",
+    "gtreqqless;": "\u2a8c",
+    "gtrless;": "\u2277",
+    "gtrsim;": "\u2273",
+    "gvertneqq;": "\u2269\ufe00",
+    "gvnE;": "\u2269\ufe00",
+    "hArr;": "\u21d4",
+    "hairsp;": "\u200a",
+    "half;": "\xbd",
+    "hamilt;": "\u210b",
+    "hardcy;": "\u044a",
+    "harr;": "\u2194",
+    "harrcir;": "\u2948",
+    "harrw;": "\u21ad",
+    "hbar;": "\u210f",
+    "hcirc;": "\u0125",
+    "hearts;": "\u2665",
+    "heartsuit;": "\u2665",
+    "hellip;": "\u2026",
+    "hercon;": "\u22b9",
+    "hfr;": "\U0001d525",
+    "hksearow;": "\u2925",
+    "hkswarow;": "\u2926",
+    "hoarr;": "\u21ff",
+    "homtht;": "\u223b",
+    "hookleftarrow;": "\u21a9",
+    "hookrightarrow;": "\u21aa",
+    "hopf;": "\U0001d559",
+    "horbar;": "\u2015",
+    "hscr;": "\U0001d4bd",
+    "hslash;": "\u210f",
+    "hstrok;": "\u0127",
+    "hybull;": "\u2043",
+    "hyphen;": "\u2010",
+    "iacute": "\xed",
+    "iacute;": "\xed",
+    "ic;": "\u2063",
+    "icirc": "\xee",
+    "icirc;": "\xee",
+    "icy;": "\u0438",
+    "iecy;": "\u0435",
+    "iexcl": "\xa1",
+    "iexcl;": "\xa1",
+    "iff;": "\u21d4",
+    "ifr;": "\U0001d526",
+    "igrave": "\xec",
+    "igrave;": "\xec",
+    "ii;": "\u2148",
+    "iiiint;": "\u2a0c",
+    "iiint;": "\u222d",
+    "iinfin;": "\u29dc",
+    "iiota;": "\u2129",
+    "ijlig;": "\u0133",
+    "imacr;": "\u012b",
+    "image;": "\u2111",
+    "imagline;": "\u2110",
+    "imagpart;": "\u2111",
+    "imath;": "\u0131",
+    "imof;": "\u22b7",
+    "imped;": "\u01b5",
+    "in;": "\u2208",
+    "incare;": "\u2105",
+    "infin;": "\u221e",
+    "infintie;": "\u29dd",
+    "inodot;": "\u0131",
+    "int;": "\u222b",
+    "intcal;": "\u22ba",
+    "integers;": "\u2124",
+    "intercal;": "\u22ba",
+    "intlarhk;": "\u2a17",
+    "intprod;": "\u2a3c",
+    "iocy;": "\u0451",
+    "iogon;": "\u012f",
+    "iopf;": "\U0001d55a",
+    "iota;": "\u03b9",
+    "iprod;": "\u2a3c",
+    "iquest": "\xbf",
+    "iquest;": "\xbf",
+    "iscr;": "\U0001d4be",
+    "isin;": "\u2208",
+    "isinE;": "\u22f9",
+    "isindot;": "\u22f5",
+    "isins;": "\u22f4",
+    "isinsv;": "\u22f3",
+    "isinv;": "\u2208",
+    "it;": "\u2062",
+    "itilde;": "\u0129",
+    "iukcy;": "\u0456",
+    "iuml": "\xef",
+    "iuml;": "\xef",
+    "jcirc;": "\u0135",
+    "jcy;": "\u0439",
+    "jfr;": "\U0001d527",
+    "jmath;": "\u0237",
+    "jopf;": "\U0001d55b",
+    "jscr;": "\U0001d4bf",
+    "jsercy;": "\u0458",
+    "jukcy;": "\u0454",
+    "kappa;": "\u03ba",
+    "kappav;": "\u03f0",
+    "kcedil;": "\u0137",
+    "kcy;": "\u043a",
+    "kfr;": "\U0001d528",
+    "kgreen;": "\u0138",
+    "khcy;": "\u0445",
+    "kjcy;": "\u045c",
+    "kopf;": "\U0001d55c",
+    "kscr;": "\U0001d4c0",
+    "lAarr;": "\u21da",
+    "lArr;": "\u21d0",
+    "lAtail;": "\u291b",
+    "lBarr;": "\u290e",
+    "lE;": "\u2266",
+    "lEg;": "\u2a8b",
+    "lHar;": "\u2962",
+    "lacute;": "\u013a",
+    "laemptyv;": "\u29b4",
+    "lagran;": "\u2112",
+    "lambda;": "\u03bb",
+    "lang;": "\u27e8",
+    "langd;": "\u2991",
+    "langle;": "\u27e8",
+    "lap;": "\u2a85",
+    "laquo": "\xab",
+    "laquo;": "\xab",
+    "larr;": "\u2190",
+    "larrb;": "\u21e4",
+    "larrbfs;": "\u291f",
+    "larrfs;": "\u291d",
+    "larrhk;": "\u21a9",
+    "larrlp;": "\u21ab",
+    "larrpl;": "\u2939",
+    "larrsim;": "\u2973",
+    "larrtl;": "\u21a2",
+    "lat;": "\u2aab",
+    "latail;": "\u2919",
+    "late;": "\u2aad",
+    "lates;": "\u2aad\ufe00",
+    "lbarr;": "\u290c",
+    "lbbrk;": "\u2772",
+    "lbrace;": "{",
+    "lbrack;": "[",
+    "lbrke;": "\u298b",
+    "lbrksld;": "\u298f",
+    "lbrkslu;": "\u298d",
+    "lcaron;": "\u013e",
+    "lcedil;": "\u013c",
+    "lceil;": "\u2308",
+    "lcub;": "{",
+    "lcy;": "\u043b",
+    "ldca;": "\u2936",
+    "ldquo;": "\u201c",
+    "ldquor;": "\u201e",
+    "ldrdhar;": "\u2967",
+    "ldrushar;": "\u294b",
+    "ldsh;": "\u21b2",
+    "le;": "\u2264",
+    "leftarrow;": "\u2190",
+    "leftarrowtail;": "\u21a2",
+    "leftharpoondown;": "\u21bd",
+    "leftharpoonup;": "\u21bc",
+    "leftleftarrows;": "\u21c7",
+    "leftrightarrow;": "\u2194",
+    "leftrightarrows;": "\u21c6",
+    "leftrightharpoons;": "\u21cb",
+    "leftrightsquigarrow;": "\u21ad",
+    "leftthreetimes;": "\u22cb",
+    "leg;": "\u22da",
+    "leq;": "\u2264",
+    "leqq;": "\u2266",
+    "leqslant;": "\u2a7d",
+    "les;": "\u2a7d",
+    "lescc;": "\u2aa8",
+    "lesdot;": "\u2a7f",
+    "lesdoto;": "\u2a81",
+    "lesdotor;": "\u2a83",
+    "lesg;": "\u22da\ufe00",
+    "lesges;": "\u2a93",
+    "lessapprox;": "\u2a85",
+    "lessdot;": "\u22d6",
+    "lesseqgtr;": "\u22da",
+    "lesseqqgtr;": "\u2a8b",
+    "lessgtr;": "\u2276",
+    "lesssim;": "\u2272",
+    "lfisht;": "\u297c",
+    "lfloor;": "\u230a",
+    "lfr;": "\U0001d529",
+    "lg;": "\u2276",
+    "lgE;": "\u2a91",
+    "lhard;": "\u21bd",
+    "lharu;": "\u21bc",
+    "lharul;": "\u296a",
+    "lhblk;": "\u2584",
+    "ljcy;": "\u0459",
+    "ll;": "\u226a",
+    "llarr;": "\u21c7",
+    "llcorner;": "\u231e",
+    "llhard;": "\u296b",
+    "lltri;": "\u25fa",
+    "lmidot;": "\u0140",
+    "lmoust;": "\u23b0",
+    "lmoustache;": "\u23b0",
+    "lnE;": "\u2268",
+    "lnap;": "\u2a89",
+    "lnapprox;": "\u2a89",
+    "lne;": "\u2a87",
+    "lneq;": "\u2a87",
+    "lneqq;": "\u2268",
+    "lnsim;": "\u22e6",
+    "loang;": "\u27ec",
+    "loarr;": "\u21fd",
+    "lobrk;": "\u27e6",
+    "longleftarrow;": "\u27f5",
+    "longleftrightarrow;": "\u27f7",
+    "longmapsto;": "\u27fc",
+    "longrightarrow;": "\u27f6",
+    "looparrowleft;": "\u21ab",
+    "looparrowright;": "\u21ac",
+    "lopar;": "\u2985",
+    "lopf;": "\U0001d55d",
+    "loplus;": "\u2a2d",
+    "lotimes;": "\u2a34",
+    "lowast;": "\u2217",
+    "lowbar;": "_",
+    "loz;": "\u25ca",
+    "lozenge;": "\u25ca",
+    "lozf;": "\u29eb",
+    "lpar;": "(",
+    "lparlt;": "\u2993",
+    "lrarr;": "\u21c6",
+    "lrcorner;": "\u231f",
+    "lrhar;": "\u21cb",
+    "lrhard;": "\u296d",
+    "lrm;": "\u200e",
+    "lrtri;": "\u22bf",
+    "lsaquo;": "\u2039",
+    "lscr;": "\U0001d4c1",
+    "lsh;": "\u21b0",
+    "lsim;": "\u2272",
+    "lsime;": "\u2a8d",
+    "lsimg;": "\u2a8f",
+    "lsqb;": "[",
+    "lsquo;": "\u2018",
+    "lsquor;": "\u201a",
+    "lstrok;": "\u0142",
+    "lt": "<",
+    "lt;": "<",
+    "ltcc;": "\u2aa6",
+    "ltcir;": "\u2a79",
+    "ltdot;": "\u22d6",
+    "lthree;": "\u22cb",
+    "ltimes;": "\u22c9",
+    "ltlarr;": "\u2976",
+    "ltquest;": "\u2a7b",
+    "ltrPar;": "\u2996",
+    "ltri;": "\u25c3",
+    "ltrie;": "\u22b4",
+    "ltrif;": "\u25c2",
+    "lurdshar;": "\u294a",
+    "luruhar;": "\u2966",
+    "lvertneqq;": "\u2268\ufe00",
+    "lvnE;": "\u2268\ufe00",
+    "mDDot;": "\u223a",
+    "macr": "\xaf",
+    "macr;": "\xaf",
+    "male;": "\u2642",
+    "malt;": "\u2720",
+    "maltese;": "\u2720",
+    "map;": "\u21a6",
+    "mapsto;": "\u21a6",
+    "mapstodown;": "\u21a7",
+    "mapstoleft;": "\u21a4",
+    "mapstoup;": "\u21a5",
+    "marker;": "\u25ae",
+    "mcomma;": "\u2a29",
+    "mcy;": "\u043c",
+    "mdash;": "\u2014",
+    "measuredangle;": "\u2221",
+    "mfr;": "\U0001d52a",
+    "mho;": "\u2127",
+    "micro": "\xb5",
+    "micro;": "\xb5",
+    "mid;": "\u2223",
+    "midast;": "*",
+    "midcir;": "\u2af0",
+    "middot": "\xb7",
+    "middot;": "\xb7",
+    "minus;": "\u2212",
+    "minusb;": "\u229f",
+    "minusd;": "\u2238",
+    "minusdu;": "\u2a2a",
+    "mlcp;": "\u2adb",
+    "mldr;": "\u2026",
+    "mnplus;": "\u2213",
+    "models;": "\u22a7",
+    "mopf;": "\U0001d55e",
+    "mp;": "\u2213",
+    "mscr;": "\U0001d4c2",
+    "mstpos;": "\u223e",
+    "mu;": "\u03bc",
+    "multimap;": "\u22b8",
+    "mumap;": "\u22b8",
+    "nGg;": "\u22d9\u0338",
+    "nGt;": "\u226b\u20d2",
+    "nGtv;": "\u226b\u0338",
+    "nLeftarrow;": "\u21cd",
+    "nLeftrightarrow;": "\u21ce",
+    "nLl;": "\u22d8\u0338",
+    "nLt;": "\u226a\u20d2",
+    "nLtv;": "\u226a\u0338",
+    "nRightarrow;": "\u21cf",
+    "nVDash;": "\u22af",
+    "nVdash;": "\u22ae",
+    "nabla;": "\u2207",
+    "nacute;": "\u0144",
+    "nang;": "\u2220\u20d2",
+    "nap;": "\u2249",
+    "napE;": "\u2a70\u0338",
+    "napid;": "\u224b\u0338",
+    "napos;": "\u0149",
+    "napprox;": "\u2249",
+    "natur;": "\u266e",
+    "natural;": "\u266e",
+    "naturals;": "\u2115",
+    "nbsp": "\xa0",
+    "nbsp;": "\xa0",
+    "nbump;": "\u224e\u0338",
+    "nbumpe;": "\u224f\u0338",
+    "ncap;": "\u2a43",
+    "ncaron;": "\u0148",
+    "ncedil;": "\u0146",
+    "ncong;": "\u2247",
+    "ncongdot;": "\u2a6d\u0338",
+    "ncup;": "\u2a42",
+    "ncy;": "\u043d",
+    "ndash;": "\u2013",
+    "ne;": "\u2260",
+    "neArr;": "\u21d7",
+    "nearhk;": "\u2924",
+    "nearr;": "\u2197",
+    "nearrow;": "\u2197",
+    "nedot;": "\u2250\u0338",
+    "nequiv;": "\u2262",
+    "nesear;": "\u2928",
+    "nesim;": "\u2242\u0338",
+    "nexist;": "\u2204",
+    "nexists;": "\u2204",
+    "nfr;": "\U0001d52b",
+    "ngE;": "\u2267\u0338",
+    "nge;": "\u2271",
+    "ngeq;": "\u2271",
+    "ngeqq;": "\u2267\u0338",
+    "ngeqslant;": "\u2a7e\u0338",
+    "nges;": "\u2a7e\u0338",
+    "ngsim;": "\u2275",
+    "ngt;": "\u226f",
+    "ngtr;": "\u226f",
+    "nhArr;": "\u21ce",
+    "nharr;": "\u21ae",
+    "nhpar;": "\u2af2",
+    "ni;": "\u220b",
+    "nis;": "\u22fc",
+    "nisd;": "\u22fa",
+    "niv;": "\u220b",
+    "njcy;": "\u045a",
+    "nlArr;": "\u21cd",
+    "nlE;": "\u2266\u0338",
+    "nlarr;": "\u219a",
+    "nldr;": "\u2025",
+    "nle;": "\u2270",
+    "nleftarrow;": "\u219a",
+    "nleftrightarrow;": "\u21ae",
+    "nleq;": "\u2270",
+    "nleqq;": "\u2266\u0338",
+    "nleqslant;": "\u2a7d\u0338",
+    "nles;": "\u2a7d\u0338",
+    "nless;": "\u226e",
+    "nlsim;": "\u2274",
+    "nlt;": "\u226e",
+    "nltri;": "\u22ea",
+    "nltrie;": "\u22ec",
+    "nmid;": "\u2224",
+    "nopf;": "\U0001d55f",
+    "not": "\xac",
+    "not;": "\xac",
+    "notin;": "\u2209",
+    "notinE;": "\u22f9\u0338",
+    "notindot;": "\u22f5\u0338",
+    "notinva;": "\u2209",
+    "notinvb;": "\u22f7",
+    "notinvc;": "\u22f6",
+    "notni;": "\u220c",
+    "notniva;": "\u220c",
+    "notnivb;": "\u22fe",
+    "notnivc;": "\u22fd",
+    "npar;": "\u2226",
+    "nparallel;": "\u2226",
+    "nparsl;": "\u2afd\u20e5",
+    "npart;": "\u2202\u0338",
+    "npolint;": "\u2a14",
+    "npr;": "\u2280",
+    "nprcue;": "\u22e0",
+    "npre;": "\u2aaf\u0338",
+    "nprec;": "\u2280",
+    "npreceq;": "\u2aaf\u0338",
+    "nrArr;": "\u21cf",
+    "nrarr;": "\u219b",
+    "nrarrc;": "\u2933\u0338",
+    "nrarrw;": "\u219d\u0338",
+    "nrightarrow;": "\u219b",
+    "nrtri;": "\u22eb",
+    "nrtrie;": "\u22ed",
+    "nsc;": "\u2281",
+    "nsccue;": "\u22e1",
+    "nsce;": "\u2ab0\u0338",
+    "nscr;": "\U0001d4c3",
+    "nshortmid;": "\u2224",
+    "nshortparallel;": "\u2226",
+    "nsim;": "\u2241",
+    "nsime;": "\u2244",
+    "nsimeq;": "\u2244",
+    "nsmid;": "\u2224",
+    "nspar;": "\u2226",
+    "nsqsube;": "\u22e2",
+    "nsqsupe;": "\u22e3",
+    "nsub;": "\u2284",
+    "nsubE;": "\u2ac5\u0338",
+    "nsube;": "\u2288",
+    "nsubset;": "\u2282\u20d2",
+    "nsubseteq;": "\u2288",
+    "nsubseteqq;": "\u2ac5\u0338",
+    "nsucc;": "\u2281",
+    "nsucceq;": "\u2ab0\u0338",
+    "nsup;": "\u2285",
+    "nsupE;": "\u2ac6\u0338",
+    "nsupe;": "\u2289",
+    "nsupset;": "\u2283\u20d2",
+    "nsupseteq;": "\u2289",
+    "nsupseteqq;": "\u2ac6\u0338",
+    "ntgl;": "\u2279",
+    "ntilde": "\xf1",
+    "ntilde;": "\xf1",
+    "ntlg;": "\u2278",
+    "ntriangleleft;": "\u22ea",
+    "ntrianglelefteq;": "\u22ec",
+    "ntriangleright;": "\u22eb",
+    "ntrianglerighteq;": "\u22ed",
+    "nu;": "\u03bd",
+    "num;": "#",
+    "numero;": "\u2116",
+    "numsp;": "\u2007",
+    "nvDash;": "\u22ad",
+    "nvHarr;": "\u2904",
+    "nvap;": "\u224d\u20d2",
+    "nvdash;": "\u22ac",
+    "nvge;": "\u2265\u20d2",
+    "nvgt;": ">\u20d2",
+    "nvinfin;": "\u29de",
+    "nvlArr;": "\u2902",
+    "nvle;": "\u2264\u20d2",
+    "nvlt;": "<\u20d2",
+    "nvltrie;": "\u22b4\u20d2",
+    "nvrArr;": "\u2903",
+    "nvrtrie;": "\u22b5\u20d2",
+    "nvsim;": "\u223c\u20d2",
+    "nwArr;": "\u21d6",
+    "nwarhk;": "\u2923",
+    "nwarr;": "\u2196",
+    "nwarrow;": "\u2196",
+    "nwnear;": "\u2927",
+    "oS;": "\u24c8",
+    "oacute": "\xf3",
+    "oacute;": "\xf3",
+    "oast;": "\u229b",
+    "ocir;": "\u229a",
+    "ocirc": "\xf4",
+    "ocirc;": "\xf4",
+    "ocy;": "\u043e",
+    "odash;": "\u229d",
+    "odblac;": "\u0151",
+    "odiv;": "\u2a38",
+    "odot;": "\u2299",
+    "odsold;": "\u29bc",
+    "oelig;": "\u0153",
+    "ofcir;": "\u29bf",
+    "ofr;": "\U0001d52c",
+    "ogon;": "\u02db",
+    "ograve": "\xf2",
+    "ograve;": "\xf2",
+    "ogt;": "\u29c1",
+    "ohbar;": "\u29b5",
+    "ohm;": "\u03a9",
+    "oint;": "\u222e",
+    "olarr;": "\u21ba",
+    "olcir;": "\u29be",
+    "olcross;": "\u29bb",
+    "oline;": "\u203e",
+    "olt;": "\u29c0",
+    "omacr;": "\u014d",
+    "omega;": "\u03c9",
+    "omicron;": "\u03bf",
+    "omid;": "\u29b6",
+    "ominus;": "\u2296",
+    "oopf;": "\U0001d560",
+    "opar;": "\u29b7",
+    "operp;": "\u29b9",
+    "oplus;": "\u2295",
+    "or;": "\u2228",
+    "orarr;": "\u21bb",
+    "ord;": "\u2a5d",
+    "order;": "\u2134",
+    "orderof;": "\u2134",
+    "ordf": "\xaa",
+    "ordf;": "\xaa",
+    "ordm": "\xba",
+    "ordm;": "\xba",
+    "origof;": "\u22b6",
+    "oror;": "\u2a56",
+    "orslope;": "\u2a57",
+    "orv;": "\u2a5b",
+    "oscr;": "\u2134",
+    "oslash": "\xf8",
+    "oslash;": "\xf8",
+    "osol;": "\u2298",
+    "otilde": "\xf5",
+    "otilde;": "\xf5",
+    "otimes;": "\u2297",
+    "otimesas;": "\u2a36",
+    "ouml": "\xf6",
+    "ouml;": "\xf6",
+    "ovbar;": "\u233d",
+    "par;": "\u2225",
+    "para": "\xb6",
+    "para;": "\xb6",
+    "parallel;": "\u2225",
+    "parsim;": "\u2af3",
+    "parsl;": "\u2afd",
+    "part;": "\u2202",
+    "pcy;": "\u043f",
+    "percnt;": "%",
+    "period;": ".",
+    "permil;": "\u2030",
+    "perp;": "\u22a5",
+    "pertenk;": "\u2031",
+    "pfr;": "\U0001d52d",
+    "phi;": "\u03c6",
+    "phiv;": "\u03d5",
+    "phmmat;": "\u2133",
+    "phone;": "\u260e",
+    "pi;": "\u03c0",
+    "pitchfork;": "\u22d4",
+    "piv;": "\u03d6",
+    "planck;": "\u210f",
+    "planckh;": "\u210e",
+    "plankv;": "\u210f",
+    "plus;": "+",
+    "plusacir;": "\u2a23",
+    "plusb;": "\u229e",
+    "pluscir;": "\u2a22",
+    "plusdo;": "\u2214",
+    "plusdu;": "\u2a25",
+    "pluse;": "\u2a72",
+    "plusmn": "\xb1",
+    "plusmn;": "\xb1",
+    "plussim;": "\u2a26",
+    "plustwo;": "\u2a27",
+    "pm;": "\xb1",
+    "pointint;": "\u2a15",
+    "popf;": "\U0001d561",
+    "pound": "\xa3",
+    "pound;": "\xa3",
+    "pr;": "\u227a",
+    "prE;": "\u2ab3",
+    "prap;": "\u2ab7",
+    "prcue;": "\u227c",
+    "pre;": "\u2aaf",
+    "prec;": "\u227a",
+    "precapprox;": "\u2ab7",
+    "preccurlyeq;": "\u227c",
+    "preceq;": "\u2aaf",
+    "precnapprox;": "\u2ab9",
+    "precneqq;": "\u2ab5",
+    "precnsim;": "\u22e8",
+    "precsim;": "\u227e",
+    "prime;": "\u2032",
+    "primes;": "\u2119",
+    "prnE;": "\u2ab5",
+    "prnap;": "\u2ab9",
+    "prnsim;": "\u22e8",
+    "prod;": "\u220f",
+    "profalar;": "\u232e",
+    "profline;": "\u2312",
+    "profsurf;": "\u2313",
+    "prop;": "\u221d",
+    "propto;": "\u221d",
+    "prsim;": "\u227e",
+    "prurel;": "\u22b0",
+    "pscr;": "\U0001d4c5",
+    "psi;": "\u03c8",
+    "puncsp;": "\u2008",
+    "qfr;": "\U0001d52e",
+    "qint;": "\u2a0c",
+    "qopf;": "\U0001d562",
+    "qprime;": "\u2057",
+    "qscr;": "\U0001d4c6",
+    "quaternions;": "\u210d",
+    "quatint;": "\u2a16",
+    "quest;": "?",
+    "questeq;": "\u225f",
+    "quot": "\"",
+    "quot;": "\"",
+    "rAarr;": "\u21db",
+    "rArr;": "\u21d2",
+    "rAtail;": "\u291c",
+    "rBarr;": "\u290f",
+    "rHar;": "\u2964",
+    "race;": "\u223d\u0331",
+    "racute;": "\u0155",
+    "radic;": "\u221a",
+    "raemptyv;": "\u29b3",
+    "rang;": "\u27e9",
+    "rangd;": "\u2992",
+    "range;": "\u29a5",
+    "rangle;": "\u27e9",
+    "raquo": "\xbb",
+    "raquo;": "\xbb",
+    "rarr;": "\u2192",
+    "rarrap;": "\u2975",
+    "rarrb;": "\u21e5",
+    "rarrbfs;": "\u2920",
+    "rarrc;": "\u2933",
+    "rarrfs;": "\u291e",
+    "rarrhk;": "\u21aa",
+    "rarrlp;": "\u21ac",
+    "rarrpl;": "\u2945",
+    "rarrsim;": "\u2974",
+    "rarrtl;": "\u21a3",
+    "rarrw;": "\u219d",
+    "ratail;": "\u291a",
+    "ratio;": "\u2236",
+    "rationals;": "\u211a",
+    "rbarr;": "\u290d",
+    "rbbrk;": "\u2773",
+    "rbrace;": "}",
+    "rbrack;": "]",
+    "rbrke;": "\u298c",
+    "rbrksld;": "\u298e",
+    "rbrkslu;": "\u2990",
+    "rcaron;": "\u0159",
+    "rcedil;": "\u0157",
+    "rceil;": "\u2309",
+    "rcub;": "}",
+    "rcy;": "\u0440",
+    "rdca;": "\u2937",
+    "rdldhar;": "\u2969",
+    "rdquo;": "\u201d",
+    "rdquor;": "\u201d",
+    "rdsh;": "\u21b3",
+    "real;": "\u211c",
+    "realine;": "\u211b",
+    "realpart;": "\u211c",
+    "reals;": "\u211d",
+    "rect;": "\u25ad",
+    "reg": "\xae",
+    "reg;": "\xae",
+    "rfisht;": "\u297d",
+    "rfloor;": "\u230b",
+    "rfr;": "\U0001d52f",
+    "rhard;": "\u21c1",
+    "rharu;": "\u21c0",
+    "rharul;": "\u296c",
+    "rho;": "\u03c1",
+    "rhov;": "\u03f1",
+    "rightarrow;": "\u2192",
+    "rightarrowtail;": "\u21a3",
+    "rightharpoondown;": "\u21c1",
+    "rightharpoonup;": "\u21c0",
+    "rightleftarrows;": "\u21c4",
+    "rightleftharpoons;": "\u21cc",
+    "rightrightarrows;": "\u21c9",
+    "rightsquigarrow;": "\u219d",
+    "rightthreetimes;": "\u22cc",
+    "ring;": "\u02da",
+    "risingdotseq;": "\u2253",
+    "rlarr;": "\u21c4",
+    "rlhar;": "\u21cc",
+    "rlm;": "\u200f",
+    "rmoust;": "\u23b1",
+    "rmoustache;": "\u23b1",
+    "rnmid;": "\u2aee",
+    "roang;": "\u27ed",
+    "roarr;": "\u21fe",
+    "robrk;": "\u27e7",
+    "ropar;": "\u2986",
+    "ropf;": "\U0001d563",
+    "roplus;": "\u2a2e",
+    "rotimes;": "\u2a35",
+    "rpar;": ")",
+    "rpargt;": "\u2994",
+    "rppolint;": "\u2a12",
+    "rrarr;": "\u21c9",
+    "rsaquo;": "\u203a",
+    "rscr;": "\U0001d4c7",
+    "rsh;": "\u21b1",
+    "rsqb;": "]",
+    "rsquo;": "\u2019",
+    "rsquor;": "\u2019",
+    "rthree;": "\u22cc",
+    "rtimes;": "\u22ca",
+    "rtri;": "\u25b9",
+    "rtrie;": "\u22b5",
+    "rtrif;": "\u25b8",
+    "rtriltri;": "\u29ce",
+    "ruluhar;": "\u2968",
+    "rx;": "\u211e",
+    "sacute;": "\u015b",
+    "sbquo;": "\u201a",
+    "sc;": "\u227b",
+    "scE;": "\u2ab4",
+    "scap;": "\u2ab8",
+    "scaron;": "\u0161",
+    "sccue;": "\u227d",
+    "sce;": "\u2ab0",
+    "scedil;": "\u015f",
+    "scirc;": "\u015d",
+    "scnE;": "\u2ab6",
+    "scnap;": "\u2aba",
+    "scnsim;": "\u22e9",
+    "scpolint;": "\u2a13",
+    "scsim;": "\u227f",
+    "scy;": "\u0441",
+    "sdot;": "\u22c5",
+    "sdotb;": "\u22a1",
+    "sdote;": "\u2a66",
+    "seArr;": "\u21d8",
+    "searhk;": "\u2925",
+    "searr;": "\u2198",
+    "searrow;": "\u2198",
+    "sect": "\xa7",
+    "sect;": "\xa7",
+    "semi;": ";",
+    "seswar;": "\u2929",
+    "setminus;": "\u2216",
+    "setmn;": "\u2216",
+    "sext;": "\u2736",
+    "sfr;": "\U0001d530",
+    "sfrown;": "\u2322",
+    "sharp;": "\u266f",
+    "shchcy;": "\u0449",
+    "shcy;": "\u0448",
+    "shortmid;": "\u2223",
+    "shortparallel;": "\u2225",
+    "shy": "\xad",
+    "shy;": "\xad",
+    "sigma;": "\u03c3",
+    "sigmaf;": "\u03c2",
+    "sigmav;": "\u03c2",
+    "sim;": "\u223c",
+    "simdot;": "\u2a6a",
+    "sime;": "\u2243",
+    "simeq;": "\u2243",
+    "simg;": "\u2a9e",
+    "simgE;": "\u2aa0",
+    "siml;": "\u2a9d",
+    "simlE;": "\u2a9f",
+    "simne;": "\u2246",
+    "simplus;": "\u2a24",
+    "simrarr;": "\u2972",
+    "slarr;": "\u2190",
+    "smallsetminus;": "\u2216",
+    "smashp;": "\u2a33",
+    "smeparsl;": "\u29e4",
+    "smid;": "\u2223",
+    "smile;": "\u2323",
+    "smt;": "\u2aaa",
+    "smte;": "\u2aac",
+    "smtes;": "\u2aac\ufe00",
+    "softcy;": "\u044c",
+    "sol;": "/",
+    "solb;": "\u29c4",
+    "solbar;": "\u233f",
+    "sopf;": "\U0001d564",
+    "spades;": "\u2660",
+    "spadesuit;": "\u2660",
+    "spar;": "\u2225",
+    "sqcap;": "\u2293",
+    "sqcaps;": "\u2293\ufe00",
+    "sqcup;": "\u2294",
+    "sqcups;": "\u2294\ufe00",
+    "sqsub;": "\u228f",
+    "sqsube;": "\u2291",
+    "sqsubset;": "\u228f",
+    "sqsubseteq;": "\u2291",
+    "sqsup;": "\u2290",
+    "sqsupe;": "\u2292",
+    "sqsupset;": "\u2290",
+    "sqsupseteq;": "\u2292",
+    "squ;": "\u25a1",
+    "square;": "\u25a1",
+    "squarf;": "\u25aa",
+    "squf;": "\u25aa",
+    "srarr;": "\u2192",
+    "sscr;": "\U0001d4c8",
+    "ssetmn;": "\u2216",
+    "ssmile;": "\u2323",
+    "sstarf;": "\u22c6",
+    "star;": "\u2606",
+    "starf;": "\u2605",
+    "straightepsilon;": "\u03f5",
+    "straightphi;": "\u03d5",
+    "strns;": "\xaf",
+    "sub;": "\u2282",
+    "subE;": "\u2ac5",
+    "subdot;": "\u2abd",
+    "sube;": "\u2286",
+    "subedot;": "\u2ac3",
+    "submult;": "\u2ac1",
+    "subnE;": "\u2acb",
+    "subne;": "\u228a",
+    "subplus;": "\u2abf",
+    "subrarr;": "\u2979",
+    "subset;": "\u2282",
+    "subseteq;": "\u2286",
+    "subseteqq;": "\u2ac5",
+    "subsetneq;": "\u228a",
+    "subsetneqq;": "\u2acb",
+    "subsim;": "\u2ac7",
+    "subsub;": "\u2ad5",
+    "subsup;": "\u2ad3",
+    "succ;": "\u227b",
+    "succapprox;": "\u2ab8",
+    "succcurlyeq;": "\u227d",
+    "succeq;": "\u2ab0",
+    "succnapprox;": "\u2aba",
+    "succneqq;": "\u2ab6",
+    "succnsim;": "\u22e9",
+    "succsim;": "\u227f",
+    "sum;": "\u2211",
+    "sung;": "\u266a",
+    "sup1": "\xb9",
+    "sup1;": "\xb9",
+    "sup2": "\xb2",
+    "sup2;": "\xb2",
+    "sup3": "\xb3",
+    "sup3;": "\xb3",
+    "sup;": "\u2283",
+    "supE;": "\u2ac6",
+    "supdot;": "\u2abe",
+    "supdsub;": "\u2ad8",
+    "supe;": "\u2287",
+    "supedot;": "\u2ac4",
+    "suphsol;": "\u27c9",
+    "suphsub;": "\u2ad7",
+    "suplarr;": "\u297b",
+    "supmult;": "\u2ac2",
+    "supnE;": "\u2acc",
+    "supne;": "\u228b",
+    "supplus;": "\u2ac0",
+    "supset;": "\u2283",
+    "supseteq;": "\u2287",
+    "supseteqq;": "\u2ac6",
+    "supsetneq;": "\u228b",
+    "supsetneqq;": "\u2acc",
+    "supsim;": "\u2ac8",
+    "supsub;": "\u2ad4",
+    "supsup;": "\u2ad6",
+    "swArr;": "\u21d9",
+    "swarhk;": "\u2926",
+    "swarr;": "\u2199",
+    "swarrow;": "\u2199",
+    "swnwar;": "\u292a",
+    "szlig": "\xdf",
+    "szlig;": "\xdf",
+    "target;": "\u2316",
+    "tau;": "\u03c4",
+    "tbrk;": "\u23b4",
+    "tcaron;": "\u0165",
+    "tcedil;": "\u0163",
+    "tcy;": "\u0442",
+    "tdot;": "\u20db",
+    "telrec;": "\u2315",
+    "tfr;": "\U0001d531",
+    "there4;": "\u2234",
+    "therefore;": "\u2234",
+    "theta;": "\u03b8",
+    "thetasym;": "\u03d1",
+    "thetav;": "\u03d1",
+    "thickapprox;": "\u2248",
+    "thicksim;": "\u223c",
+    "thinsp;": "\u2009",
+    "thkap;": "\u2248",
+    "thksim;": "\u223c",
+    "thorn": "\xfe",
+    "thorn;": "\xfe",
+    "tilde;": "\u02dc",
+    "times": "\xd7",
+    "times;": "\xd7",
+    "timesb;": "\u22a0",
+    "timesbar;": "\u2a31",
+    "timesd;": "\u2a30",
+    "tint;": "\u222d",
+    "toea;": "\u2928",
+    "top;": "\u22a4",
+    "topbot;": "\u2336",
+    "topcir;": "\u2af1",
+    "topf;": "\U0001d565",
+    "topfork;": "\u2ada",
+    "tosa;": "\u2929",
+    "tprime;": "\u2034",
+    "trade;": "\u2122",
+    "triangle;": "\u25b5",
+    "triangledown;": "\u25bf",
+    "triangleleft;": "\u25c3",
+    "trianglelefteq;": "\u22b4",
+    "triangleq;": "\u225c",
+    "triangleright;": "\u25b9",
+    "trianglerighteq;": "\u22b5",
+    "tridot;": "\u25ec",
+    "trie;": "\u225c",
+    "triminus;": "\u2a3a",
+    "triplus;": "\u2a39",
+    "trisb;": "\u29cd",
+    "tritime;": "\u2a3b",
+    "trpezium;": "\u23e2",
+    "tscr;": "\U0001d4c9",
+    "tscy;": "\u0446",
+    "tshcy;": "\u045b",
+    "tstrok;": "\u0167",
+    "twixt;": "\u226c",
+    "twoheadleftarrow;": "\u219e",
+    "twoheadrightarrow;": "\u21a0",
+    "uArr;": "\u21d1",
+    "uHar;": "\u2963",
+    "uacute": "\xfa",
+    "uacute;": "\xfa",
+    "uarr;": "\u2191",
+    "ubrcy;": "\u045e",
+    "ubreve;": "\u016d",
+    "ucirc": "\xfb",
+    "ucirc;": "\xfb",
+    "ucy;": "\u0443",
+    "udarr;": "\u21c5",
+    "udblac;": "\u0171",
+    "udhar;": "\u296e",
+    "ufisht;": "\u297e",
+    "ufr;": "\U0001d532",
+    "ugrave": "\xf9",
+    "ugrave;": "\xf9",
+    "uharl;": "\u21bf",
+    "uharr;": "\u21be",
+    "uhblk;": "\u2580",
+    "ulcorn;": "\u231c",
+    "ulcorner;": "\u231c",
+    "ulcrop;": "\u230f",
+    "ultri;": "\u25f8",
+    "umacr;": "\u016b",
+    "uml": "\xa8",
+    "uml;": "\xa8",
+    "uogon;": "\u0173",
+    "uopf;": "\U0001d566",
+    "uparrow;": "\u2191",
+    "updownarrow;": "\u2195",
+    "upharpoonleft;": "\u21bf",
+    "upharpoonright;": "\u21be",
+    "uplus;": "\u228e",
+    "upsi;": "\u03c5",
+    "upsih;": "\u03d2",
+    "upsilon;": "\u03c5",
+    "upuparrows;": "\u21c8",
+    "urcorn;": "\u231d",
+    "urcorner;": "\u231d",
+    "urcrop;": "\u230e",
+    "uring;": "\u016f",
+    "urtri;": "\u25f9",
+    "uscr;": "\U0001d4ca",
+    "utdot;": "\u22f0",
+    "utilde;": "\u0169",
+    "utri;": "\u25b5",
+    "utrif;": "\u25b4",
+    "uuarr;": "\u21c8",
+    "uuml": "\xfc",
+    "uuml;": "\xfc",
+    "uwangle;": "\u29a7",
+    "vArr;": "\u21d5",
+    "vBar;": "\u2ae8",
+    "vBarv;": "\u2ae9",
+    "vDash;": "\u22a8",
+    "vangrt;": "\u299c",
+    "varepsilon;": "\u03f5",
+    "varkappa;": "\u03f0",
+    "varnothing;": "\u2205",
+    "varphi;": "\u03d5",
+    "varpi;": "\u03d6",
+    "varpropto;": "\u221d",
+    "varr;": "\u2195",
+    "varrho;": "\u03f1",
+    "varsigma;": "\u03c2",
+    "varsubsetneq;": "\u228a\ufe00",
+    "varsubsetneqq;": "\u2acb\ufe00",
+    "varsupsetneq;": "\u228b\ufe00",
+    "varsupsetneqq;": "\u2acc\ufe00",
+    "vartheta;": "\u03d1",
+    "vartriangleleft;": "\u22b2",
+    "vartriangleright;": "\u22b3",
+    "vcy;": "\u0432",
+    "vdash;": "\u22a2",
+    "vee;": "\u2228",
+    "veebar;": "\u22bb",
+    "veeeq;": "\u225a",
+    "vellip;": "\u22ee",
+    "verbar;": "|",
+    "vert;": "|",
+    "vfr;": "\U0001d533",
+    "vltri;": "\u22b2",
+    "vnsub;": "\u2282\u20d2",
+    "vnsup;": "\u2283\u20d2",
+    "vopf;": "\U0001d567",
+    "vprop;": "\u221d",
+    "vrtri;": "\u22b3",
+    "vscr;": "\U0001d4cb",
+    "vsubnE;": "\u2acb\ufe00",
+    "vsubne;": "\u228a\ufe00",
+    "vsupnE;": "\u2acc\ufe00",
+    "vsupne;": "\u228b\ufe00",
+    "vzigzag;": "\u299a",
+    "wcirc;": "\u0175",
+    "wedbar;": "\u2a5f",
+    "wedge;": "\u2227",
+    "wedgeq;": "\u2259",
+    "weierp;": "\u2118",
+    "wfr;": "\U0001d534",
+    "wopf;": "\U0001d568",
+    "wp;": "\u2118",
+    "wr;": "\u2240",
+    "wreath;": "\u2240",
+    "wscr;": "\U0001d4cc",
+    "xcap;": "\u22c2",
+    "xcirc;": "\u25ef",
+    "xcup;": "\u22c3",
+    "xdtri;": "\u25bd",
+    "xfr;": "\U0001d535",
+    "xhArr;": "\u27fa",
+    "xharr;": "\u27f7",
+    "xi;": "\u03be",
+    "xlArr;": "\u27f8",
+    "xlarr;": "\u27f5",
+    "xmap;": "\u27fc",
+    "xnis;": "\u22fb",
+    "xodot;": "\u2a00",
+    "xopf;": "\U0001d569",
+    "xoplus;": "\u2a01",
+    "xotime;": "\u2a02",
+    "xrArr;": "\u27f9",
+    "xrarr;": "\u27f6",
+    "xscr;": "\U0001d4cd",
+    "xsqcup;": "\u2a06",
+    "xuplus;": "\u2a04",
+    "xutri;": "\u25b3",
+    "xvee;": "\u22c1",
+    "xwedge;": "\u22c0",
+    "yacute": "\xfd",
+    "yacute;": "\xfd",
+    "yacy;": "\u044f",
+    "ycirc;": "\u0177",
+    "ycy;": "\u044b",
+    "yen": "\xa5",
+    "yen;": "\xa5",
+    "yfr;": "\U0001d536",
+    "yicy;": "\u0457",
+    "yopf;": "\U0001d56a",
+    "yscr;": "\U0001d4ce",
+    "yucy;": "\u044e",
+    "yuml": "\xff",
+    "yuml;": "\xff",
+    "zacute;": "\u017a",
+    "zcaron;": "\u017e",
+    "zcy;": "\u0437",
+    "zdot;": "\u017c",
+    "zeetrf;": "\u2128",
+    "zeta;": "\u03b6",
+    "zfr;": "\U0001d537",
+    "zhcy;": "\u0436",
+    "zigrarr;": "\u21dd",
+    "zopf;": "\U0001d56b",
+    "zscr;": "\U0001d4cf",
+    "zwj;": "\u200d",
+    "zwnj;": "\u200c",
+}
+
+replacementCharacters = {
+    0x0: "\uFFFD",
+    0x0d: "\u000D",
+    0x80: "\u20AC",
+    0x81: "\u0081",
+    0x82: "\u201A",
+    0x83: "\u0192",
+    0x84: "\u201E",
+    0x85: "\u2026",
+    0x86: "\u2020",
+    0x87: "\u2021",
+    0x88: "\u02C6",
+    0x89: "\u2030",
+    0x8A: "\u0160",
+    0x8B: "\u2039",
+    0x8C: "\u0152",
+    0x8D: "\u008D",
+    0x8E: "\u017D",
+    0x8F: "\u008F",
+    0x90: "\u0090",
+    0x91: "\u2018",
+    0x92: "\u2019",
+    0x93: "\u201C",
+    0x94: "\u201D",
+    0x95: "\u2022",
+    0x96: "\u2013",
+    0x97: "\u2014",
+    0x98: "\u02DC",
+    0x99: "\u2122",
+    0x9A: "\u0161",
+    0x9B: "\u203A",
+    0x9C: "\u0153",
+    0x9D: "\u009D",
+    0x9E: "\u017E",
+    0x9F: "\u0178",
+}
+
+tokenTypes = {
+    "Doctype": 0,
+    "Characters": 1,
+    "SpaceCharacters": 2,
+    "StartTag": 3,
+    "EndTag": 4,
+    "EmptyTag": 5,
+    "Comment": 6,
+    "ParseError": 7
+}
+
+tagTokenTypes = frozenset([tokenTypes["StartTag"], tokenTypes["EndTag"],
+                           tokenTypes["EmptyTag"]])
+
+
+prefixes = dict([(v, k) for k, v in namespaces.items()])
+prefixes["http://www.w3.org/1998/Math/MathML"] = "math"
+
+
+class DataLossWarning(UserWarning):
+    pass
+
+
+class ReparseException(Exception):
+    pass
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/__init__.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/alphabeticalattributes.py
new file mode 100644
index 0000000000000000000000000000000000000000..4795baecc9949b5fb076fb07107c472f7fcff1d9
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/alphabeticalattributes.py
@@ -0,0 +1,20 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from . import base
+
+try:
+    from collections import OrderedDict
+except ImportError:
+    from ordereddict import OrderedDict
+
+
+class Filter(base.Filter):
+    def __iter__(self):
+        for token in base.Filter.__iter__(self):
+            if token["type"] in ("StartTag", "EmptyTag"):
+                attrs = OrderedDict()
+                for name, value in sorted(token["data"].items(),
+                                          key=lambda x: x[0]):
+                    attrs[name] = value
+                token["data"] = attrs
+            yield token
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/base.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/base.py
new file mode 100644
index 0000000000000000000000000000000000000000..c7dbaed0fab5afb4f8947b24dd175d2239d35d6b
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/base.py
@@ -0,0 +1,12 @@
+from __future__ import absolute_import, division, unicode_literals
+
+
+class Filter(object):
+    def __init__(self, source):
+        self.source = source
+
+    def __iter__(self):
+        return iter(self.source)
+
+    def __getattr__(self, name):
+        return getattr(self.source, name)
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/inject_meta_charset.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/inject_meta_charset.py
new file mode 100644
index 0000000000000000000000000000000000000000..2059ec861871c4a8d73ac8c736169d3bd67acc94
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/inject_meta_charset.py
@@ -0,0 +1,65 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from . import base
+
+
+class Filter(base.Filter):
+    def __init__(self, source, encoding):
+        base.Filter.__init__(self, source)
+        self.encoding = encoding
+
+    def __iter__(self):
+        state = "pre_head"
+        meta_found = (self.encoding is None)
+        pending = []
+
+        for token in base.Filter.__iter__(self):
+            type = token["type"]
+            if type == "StartTag":
+                if token["name"].lower() == "head":
+                    state = "in_head"
+
+            elif type == "EmptyTag":
+                if token["name"].lower() == "meta":
+                    # replace charset with actual encoding
+                    has_http_equiv_content_type = False
+                    for (namespace, name), value in token["data"].items():
+                        if namespace is not None:
+                            continue
+                        elif name.lower() == 'charset':
+                            token["data"][(namespace, name)] = self.encoding
+                            meta_found = True
+                            break
+                        elif name == 'http-equiv' and value.lower() == 'content-type':
+                            has_http_equiv_content_type = True
+                    else:
+                        if has_http_equiv_content_type and (None, "content") in token["data"]:
+                            token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding
+                            meta_found = True
+
+                elif token["name"].lower() == "head" and not meta_found:
+                    # insert meta into empty head
+                    yield {"type": "StartTag", "name": "head",
+                           "data": token["data"]}
+                    yield {"type": "EmptyTag", "name": "meta",
+                           "data": {(None, "charset"): self.encoding}}
+                    yield {"type": "EndTag", "name": "head"}
+                    meta_found = True
+                    continue
+
+            elif type == "EndTag":
+                if token["name"].lower() == "head" and pending:
+                    # insert meta into head (if necessary) and flush pending queue
+                    yield pending.pop(0)
+                    if not meta_found:
+                        yield {"type": "EmptyTag", "name": "meta",
+                               "data": {(None, "charset"): self.encoding}}
+                    while pending:
+                        yield pending.pop(0)
+                    meta_found = True
+                    state = "post_head"
+
+            if state == "in_head":
+                pending.append(token)
+            else:
+                yield token
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/lint.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/lint.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b892c860926fa3fc08baad7f9dbd8391175b97b
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/lint.py
@@ -0,0 +1,81 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from pip._vendor.six import text_type
+
+from . import base
+from ..constants import namespaces, voidElements
+
+from ..constants import spaceCharacters
+spaceCharacters = "".join(spaceCharacters)
+
+
+class Filter(base.Filter):
+    def __init__(self, source, require_matching_tags=True):
+        super(Filter, self).__init__(source)
+        self.require_matching_tags = require_matching_tags
+
+    def __iter__(self):
+        open_elements = []
+        for token in base.Filter.__iter__(self):
+            type = token["type"]
+            if type in ("StartTag", "EmptyTag"):
+                namespace = token["namespace"]
+                name = token["name"]
+                assert namespace is None or isinstance(namespace, text_type)
+                assert namespace != ""
+                assert isinstance(name, text_type)
+                assert name != ""
+                assert isinstance(token["data"], dict)
+                if (not namespace or namespace == namespaces["html"]) and name in voidElements:
+                    assert type == "EmptyTag"
+                else:
+                    assert type == "StartTag"
+                if type == "StartTag" and self.require_matching_tags:
+                    open_elements.append((namespace, name))
+                for (namespace, name), value in token["data"].items():
+                    assert namespace is None or isinstance(namespace, text_type)
+                    assert namespace != ""
+                    assert isinstance(name, text_type)
+                    assert name != ""
+                    assert isinstance(value, text_type)
+
+            elif type == "EndTag":
+                namespace = token["namespace"]
+                name = token["name"]
+                assert namespace is None or isinstance(namespace, text_type)
+                assert namespace != ""
+                assert isinstance(name, text_type)
+                assert name != ""
+                if (not namespace or namespace == namespaces["html"]) and name in voidElements:
+                    assert False, "Void element reported as EndTag token: %(tag)s" % {"tag": name}
+                elif self.require_matching_tags:
+                    start = open_elements.pop()
+                    assert start == (namespace, name)
+
+            elif type == "Comment":
+                data = token["data"]
+                assert isinstance(data, text_type)
+
+            elif type in ("Characters", "SpaceCharacters"):
+                data = token["data"]
+                assert isinstance(data, text_type)
+                assert data != ""
+                if type == "SpaceCharacters":
+                    assert data.strip(spaceCharacters) == ""
+
+            elif type == "Doctype":
+                name = token["name"]
+                assert name is None or isinstance(name, text_type)
+                assert token["publicId"] is None or isinstance(name, text_type)
+                assert token["systemId"] is None or isinstance(name, text_type)
+
+            elif type == "Entity":
+                assert isinstance(token["name"], text_type)
+
+            elif type == "SerializerError":
+                assert isinstance(token["data"], text_type)
+
+            else:
+                assert False, "Unknown token type: %(type)s" % {"type": type}
+
+            yield token
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/optionaltags.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/optionaltags.py
new file mode 100644
index 0000000000000000000000000000000000000000..f6edb7341c535edbf67b9c0d9e9d13c1781abc47
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/optionaltags.py
@@ -0,0 +1,206 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from . import base
+
+
+class Filter(base.Filter):
+    def slider(self):
+        previous1 = previous2 = None
+        for token in self.source:
+            if previous1 is not None:
+                yield previous2, previous1, token
+            previous2 = previous1
+            previous1 = token
+        if previous1 is not None:
+            yield previous2, previous1, None
+
+    def __iter__(self):
+        for previous, token, next in self.slider():
+            type = token["type"]
+            if type == "StartTag":
+                if (token["data"] or
+                        not self.is_optional_start(token["name"], previous, next)):
+                    yield token
+            elif type == "EndTag":
+                if not self.is_optional_end(token["name"], next):
+                    yield token
+            else:
+                yield token
+
+    def is_optional_start(self, tagname, previous, next):
+        type = next and next["type"] or None
+        if tagname in 'html':
+            # An html element's start tag may be omitted if the first thing
+            # inside the html element is not a space character or a comment.
+            return type not in ("Comment", "SpaceCharacters")
+        elif tagname == 'head':
+            # A head element's start tag may be omitted if the first thing
+            # inside the head element is an element.
+            # XXX: we also omit the start tag if the head element is empty
+            if type in ("StartTag", "EmptyTag"):
+                return True
+            elif type == "EndTag":
+                return next["name"] == "head"
+        elif tagname == 'body':
+            # A body element's start tag may be omitted if the first thing
+            # inside the body element is not a space character or a comment,
+            # except if the first thing inside the body element is a script
+            # or style element and the node immediately preceding the body
+            # element is a head element whose end tag has been omitted.
+            if type in ("Comment", "SpaceCharacters"):
+                return False
+            elif type == "StartTag":
+                # XXX: we do not look at the preceding event, so we never omit
+                # the body element's start tag if it's followed by a script or
+                # a style element.
+                return next["name"] not in ('script', 'style')
+            else:
+                return True
+        elif tagname == 'colgroup':
+            # A colgroup element's start tag may be omitted if the first thing
+            # inside the colgroup element is a col element, and if the element
+            # is not immediately preceded by another colgroup element whose
+            # end tag has been omitted.
+            if type in ("StartTag", "EmptyTag"):
+                # XXX: we do not look at the preceding event, so instead we never
+                # omit the colgroup element's end tag when it is immediately
+                # followed by another colgroup element. See is_optional_end.
+                return next["name"] == "col"
+            else:
+                return False
+        elif tagname == 'tbody':
+            # A tbody element's start tag may be omitted if the first thing
+            # inside the tbody element is a tr element, and if the element is
+            # not immediately preceded by a tbody, thead, or tfoot element
+            # whose end tag has been omitted.
+            if type == "StartTag":
+                # omit the thead and tfoot elements' end tag when they are
+                # immediately followed by a tbody element. See is_optional_end.
+                if previous and previous['type'] == 'EndTag' and \
+                        previous['name'] in ('tbody', 'thead', 'tfoot'):
+                    return False
+                return next["name"] == 'tr'
+            else:
+                return False
+        return False
+
+    def is_optional_end(self, tagname, next):
+        type = next and next["type"] or None
+        if tagname in ('html', 'head', 'body'):
+            # An html element's end tag may be omitted if the html element
+            # is not immediately followed by a space character or a comment.
+            return type not in ("Comment", "SpaceCharacters")
+        elif tagname in ('li', 'optgroup', 'tr'):
+            # A li element's end tag may be omitted if the li element is
+            # immediately followed by another li element or if there is
+            # no more content in the parent element.
+            # An optgroup element's end tag may be omitted if the optgroup
+            # element is immediately followed by another optgroup element,
+            # or if there is no more content in the parent element.
+            # A tr element's end tag may be omitted if the tr element is
+            # immediately followed by another tr element, or if there is
+            # no more content in the parent element.
+            if type == "StartTag":
+                return next["name"] == tagname
+            else:
+                return type == "EndTag" or type is None
+        elif tagname in ('dt', 'dd'):
+            # A dt element's end tag may be omitted if the dt element is
+            # immediately followed by another dt element or a dd element.
+            # A dd element's end tag may be omitted if the dd element is
+            # immediately followed by another dd element or a dt element,
+            # or if there is no more content in the parent element.
+            if type == "StartTag":
+                return next["name"] in ('dt', 'dd')
+            elif tagname == 'dd':
+                return type == "EndTag" or type is None
+            else:
+                return False
+        elif tagname == 'p':
+            # A p element's end tag may be omitted if the p element is
+            # immediately followed by an address, article, aside,
+            # blockquote, datagrid, dialog, dir, div, dl, fieldset,
+            # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu,
+            # nav, ol, p, pre, section, table, or ul, element, or if
+            # there is no more content in the parent element.
+            if type in ("StartTag", "EmptyTag"):
+                return next["name"] in ('address', 'article', 'aside',
+                                        'blockquote', 'datagrid', 'dialog',
+                                        'dir', 'div', 'dl', 'fieldset', 'footer',
+                                        'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
+                                        'header', 'hr', 'menu', 'nav', 'ol',
+                                        'p', 'pre', 'section', 'table', 'ul')
+            else:
+                return type == "EndTag" or type is None
+        elif tagname == 'option':
+            # An option element's end tag may be omitted if the option
+            # element is immediately followed by another option element,
+            # or if it is immediately followed by an <code>optgroup</code>
+            # element, or if there is no more content in the parent
+            # element.
+            if type == "StartTag":
+                return next["name"] in ('option', 'optgroup')
+            else:
+                return type == "EndTag" or type is None
+        elif tagname in ('rt', 'rp'):
+            # An rt element's end tag may be omitted if the rt element is
+            # immediately followed by an rt or rp element, or if there is
+            # no more content in the parent element.
+            # An rp element's end tag may be omitted if the rp element is
+            # immediately followed by an rt or rp element, or if there is
+            # no more content in the parent element.
+            if type == "StartTag":
+                return next["name"] in ('rt', 'rp')
+            else:
+                return type == "EndTag" or type is None
+        elif tagname == 'colgroup':
+            # A colgroup element's end tag may be omitted if the colgroup
+            # element is not immediately followed by a space character or
+            # a comment.
+            if type in ("Comment", "SpaceCharacters"):
+                return False
+            elif type == "StartTag":
+                # XXX: we also look for an immediately following colgroup
+                # element. See is_optional_start.
+                return next["name"] != 'colgroup'
+            else:
+                return True
+        elif tagname in ('thead', 'tbody'):
+            # A thead element's end tag may be omitted if the thead element
+            # is immediately followed by a tbody or tfoot element.
+            # A tbody element's end tag may be omitted if the tbody element
+            # is immediately followed by a tbody or tfoot element, or if
+            # there is no more content in the parent element.
+            # A tfoot element's end tag may be omitted if the tfoot element
+            # is immediately followed by a tbody element, or if there is no
+            # more content in the parent element.
+            # XXX: we never omit the end tag when the following element is
+            # a tbody. See is_optional_start.
+            if type == "StartTag":
+                return next["name"] in ['tbody', 'tfoot']
+            elif tagname == 'tbody':
+                return type == "EndTag" or type is None
+            else:
+                return False
+        elif tagname == 'tfoot':
+            # A tfoot element's end tag may be omitted if the tfoot element
+            # is immediately followed by a tbody element, or if there is no
+            # more content in the parent element.
+            # XXX: we never omit the end tag when the following element is
+            # a tbody. See is_optional_start.
+            if type == "StartTag":
+                return next["name"] == 'tbody'
+            else:
+                return type == "EndTag" or type is None
+        elif tagname in ('td', 'th'):
+            # A td element's end tag may be omitted if the td element is
+            # immediately followed by a td or th element, or if there is
+            # no more content in the parent element.
+            # A th element's end tag may be omitted if the th element is
+            # immediately followed by a td or th element, or if there is
+            # no more content in the parent element.
+            if type == "StartTag":
+                return next["name"] in ('td', 'th')
+            else:
+                return type == "EndTag" or type is None
+        return False
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/sanitizer.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/sanitizer.py
new file mode 100644
index 0000000000000000000000000000000000000000..026748d2e45d6d45d04c752481dad6e11ff04bb8
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/sanitizer.py
@@ -0,0 +1,865 @@
+from __future__ import absolute_import, division, unicode_literals
+
+import re
+from xml.sax.saxutils import escape, unescape
+
+from pip._vendor.six.moves import urllib_parse as urlparse
+
+from . import base
+from ..constants import namespaces, prefixes
+
+__all__ = ["Filter"]
+
+
+allowed_elements = frozenset((
+    (namespaces['html'], 'a'),
+    (namespaces['html'], 'abbr'),
+    (namespaces['html'], 'acronym'),
+    (namespaces['html'], 'address'),
+    (namespaces['html'], 'area'),
+    (namespaces['html'], 'article'),
+    (namespaces['html'], 'aside'),
+    (namespaces['html'], 'audio'),
+    (namespaces['html'], 'b'),
+    (namespaces['html'], 'big'),
+    (namespaces['html'], 'blockquote'),
+    (namespaces['html'], 'br'),
+    (namespaces['html'], 'button'),
+    (namespaces['html'], 'canvas'),
+    (namespaces['html'], 'caption'),
+    (namespaces['html'], 'center'),
+    (namespaces['html'], 'cite'),
+    (namespaces['html'], 'code'),
+    (namespaces['html'], 'col'),
+    (namespaces['html'], 'colgroup'),
+    (namespaces['html'], 'command'),
+    (namespaces['html'], 'datagrid'),
+    (namespaces['html'], 'datalist'),
+    (namespaces['html'], 'dd'),
+    (namespaces['html'], 'del'),
+    (namespaces['html'], 'details'),
+    (namespaces['html'], 'dfn'),
+    (namespaces['html'], 'dialog'),
+    (namespaces['html'], 'dir'),
+    (namespaces['html'], 'div'),
+    (namespaces['html'], 'dl'),
+    (namespaces['html'], 'dt'),
+    (namespaces['html'], 'em'),
+    (namespaces['html'], 'event-source'),
+    (namespaces['html'], 'fieldset'),
+    (namespaces['html'], 'figcaption'),
+    (namespaces['html'], 'figure'),
+    (namespaces['html'], 'footer'),
+    (namespaces['html'], 'font'),
+    (namespaces['html'], 'form'),
+    (namespaces['html'], 'header'),
+    (namespaces['html'], 'h1'),
+    (namespaces['html'], 'h2'),
+    (namespaces['html'], 'h3'),
+    (namespaces['html'], 'h4'),
+    (namespaces['html'], 'h5'),
+    (namespaces['html'], 'h6'),
+    (namespaces['html'], 'hr'),
+    (namespaces['html'], 'i'),
+    (namespaces['html'], 'img'),
+    (namespaces['html'], 'input'),
+    (namespaces['html'], 'ins'),
+    (namespaces['html'], 'keygen'),
+    (namespaces['html'], 'kbd'),
+    (namespaces['html'], 'label'),
+    (namespaces['html'], 'legend'),
+    (namespaces['html'], 'li'),
+    (namespaces['html'], 'm'),
+    (namespaces['html'], 'map'),
+    (namespaces['html'], 'menu'),
+    (namespaces['html'], 'meter'),
+    (namespaces['html'], 'multicol'),
+    (namespaces['html'], 'nav'),
+    (namespaces['html'], 'nextid'),
+    (namespaces['html'], 'ol'),
+    (namespaces['html'], 'output'),
+    (namespaces['html'], 'optgroup'),
+    (namespaces['html'], 'option'),
+    (namespaces['html'], 'p'),
+    (namespaces['html'], 'pre'),
+    (namespaces['html'], 'progress'),
+    (namespaces['html'], 'q'),
+    (namespaces['html'], 's'),
+    (namespaces['html'], 'samp'),
+    (namespaces['html'], 'section'),
+    (namespaces['html'], 'select'),
+    (namespaces['html'], 'small'),
+    (namespaces['html'], 'sound'),
+    (namespaces['html'], 'source'),
+    (namespaces['html'], 'spacer'),
+    (namespaces['html'], 'span'),
+    (namespaces['html'], 'strike'),
+    (namespaces['html'], 'strong'),
+    (namespaces['html'], 'sub'),
+    (namespaces['html'], 'sup'),
+    (namespaces['html'], 'table'),
+    (namespaces['html'], 'tbody'),
+    (namespaces['html'], 'td'),
+    (namespaces['html'], 'textarea'),
+    (namespaces['html'], 'time'),
+    (namespaces['html'], 'tfoot'),
+    (namespaces['html'], 'th'),
+    (namespaces['html'], 'thead'),
+    (namespaces['html'], 'tr'),
+    (namespaces['html'], 'tt'),
+    (namespaces['html'], 'u'),
+    (namespaces['html'], 'ul'),
+    (namespaces['html'], 'var'),
+    (namespaces['html'], 'video'),
+    (namespaces['mathml'], 'maction'),
+    (namespaces['mathml'], 'math'),
+    (namespaces['mathml'], 'merror'),
+    (namespaces['mathml'], 'mfrac'),
+    (namespaces['mathml'], 'mi'),
+    (namespaces['mathml'], 'mmultiscripts'),
+    (namespaces['mathml'], 'mn'),
+    (namespaces['mathml'], 'mo'),
+    (namespaces['mathml'], 'mover'),
+    (namespaces['mathml'], 'mpadded'),
+    (namespaces['mathml'], 'mphantom'),
+    (namespaces['mathml'], 'mprescripts'),
+    (namespaces['mathml'], 'mroot'),
+    (namespaces['mathml'], 'mrow'),
+    (namespaces['mathml'], 'mspace'),
+    (namespaces['mathml'], 'msqrt'),
+    (namespaces['mathml'], 'mstyle'),
+    (namespaces['mathml'], 'msub'),
+    (namespaces['mathml'], 'msubsup'),
+    (namespaces['mathml'], 'msup'),
+    (namespaces['mathml'], 'mtable'),
+    (namespaces['mathml'], 'mtd'),
+    (namespaces['mathml'], 'mtext'),
+    (namespaces['mathml'], 'mtr'),
+    (namespaces['mathml'], 'munder'),
+    (namespaces['mathml'], 'munderover'),
+    (namespaces['mathml'], 'none'),
+    (namespaces['svg'], 'a'),
+    (namespaces['svg'], 'animate'),
+    (namespaces['svg'], 'animateColor'),
+    (namespaces['svg'], 'animateMotion'),
+    (namespaces['svg'], 'animateTransform'),
+    (namespaces['svg'], 'clipPath'),
+    (namespaces['svg'], 'circle'),
+    (namespaces['svg'], 'defs'),
+    (namespaces['svg'], 'desc'),
+    (namespaces['svg'], 'ellipse'),
+    (namespaces['svg'], 'font-face'),
+    (namespaces['svg'], 'font-face-name'),
+    (namespaces['svg'], 'font-face-src'),
+    (namespaces['svg'], 'g'),
+    (namespaces['svg'], 'glyph'),
+    (namespaces['svg'], 'hkern'),
+    (namespaces['svg'], 'linearGradient'),
+    (namespaces['svg'], 'line'),
+    (namespaces['svg'], 'marker'),
+    (namespaces['svg'], 'metadata'),
+    (namespaces['svg'], 'missing-glyph'),
+    (namespaces['svg'], 'mpath'),
+    (namespaces['svg'], 'path'),
+    (namespaces['svg'], 'polygon'),
+    (namespaces['svg'], 'polyline'),
+    (namespaces['svg'], 'radialGradient'),
+    (namespaces['svg'], 'rect'),
+    (namespaces['svg'], 'set'),
+    (namespaces['svg'], 'stop'),
+    (namespaces['svg'], 'svg'),
+    (namespaces['svg'], 'switch'),
+    (namespaces['svg'], 'text'),
+    (namespaces['svg'], 'title'),
+    (namespaces['svg'], 'tspan'),
+    (namespaces['svg'], 'use'),
+))
+
+allowed_attributes = frozenset((
+    # HTML attributes
+    (None, 'abbr'),
+    (None, 'accept'),
+    (None, 'accept-charset'),
+    (None, 'accesskey'),
+    (None, 'action'),
+    (None, 'align'),
+    (None, 'alt'),
+    (None, 'autocomplete'),
+    (None, 'autofocus'),
+    (None, 'axis'),
+    (None, 'background'),
+    (None, 'balance'),
+    (None, 'bgcolor'),
+    (None, 'bgproperties'),
+    (None, 'border'),
+    (None, 'bordercolor'),
+    (None, 'bordercolordark'),
+    (None, 'bordercolorlight'),
+    (None, 'bottompadding'),
+    (None, 'cellpadding'),
+    (None, 'cellspacing'),
+    (None, 'ch'),
+    (None, 'challenge'),
+    (None, 'char'),
+    (None, 'charoff'),
+    (None, 'choff'),
+    (None, 'charset'),
+    (None, 'checked'),
+    (None, 'cite'),
+    (None, 'class'),
+    (None, 'clear'),
+    (None, 'color'),
+    (None, 'cols'),
+    (None, 'colspan'),
+    (None, 'compact'),
+    (None, 'contenteditable'),
+    (None, 'controls'),
+    (None, 'coords'),
+    (None, 'data'),
+    (None, 'datafld'),
+    (None, 'datapagesize'),
+    (None, 'datasrc'),
+    (None, 'datetime'),
+    (None, 'default'),
+    (None, 'delay'),
+    (None, 'dir'),
+    (None, 'disabled'),
+    (None, 'draggable'),
+    (None, 'dynsrc'),
+    (None, 'enctype'),
+    (None, 'end'),
+    (None, 'face'),
+    (None, 'for'),
+    (None, 'form'),
+    (None, 'frame'),
+    (None, 'galleryimg'),
+    (None, 'gutter'),
+    (None, 'headers'),
+    (None, 'height'),
+    (None, 'hidefocus'),
+    (None, 'hidden'),
+    (None, 'high'),
+    (None, 'href'),
+    (None, 'hreflang'),
+    (None, 'hspace'),
+    (None, 'icon'),
+    (None, 'id'),
+    (None, 'inputmode'),
+    (None, 'ismap'),
+    (None, 'keytype'),
+    (None, 'label'),
+    (None, 'leftspacing'),
+    (None, 'lang'),
+    (None, 'list'),
+    (None, 'longdesc'),
+    (None, 'loop'),
+    (None, 'loopcount'),
+    (None, 'loopend'),
+    (None, 'loopstart'),
+    (None, 'low'),
+    (None, 'lowsrc'),
+    (None, 'max'),
+    (None, 'maxlength'),
+    (None, 'media'),
+    (None, 'method'),
+    (None, 'min'),
+    (None, 'multiple'),
+    (None, 'name'),
+    (None, 'nohref'),
+    (None, 'noshade'),
+    (None, 'nowrap'),
+    (None, 'open'),
+    (None, 'optimum'),
+    (None, 'pattern'),
+    (None, 'ping'),
+    (None, 'point-size'),
+    (None, 'poster'),
+    (None, 'pqg'),
+    (None, 'preload'),
+    (None, 'prompt'),
+    (None, 'radiogroup'),
+    (None, 'readonly'),
+    (None, 'rel'),
+    (None, 'repeat-max'),
+    (None, 'repeat-min'),
+    (None, 'replace'),
+    (None, 'required'),
+    (None, 'rev'),
+    (None, 'rightspacing'),
+    (None, 'rows'),
+    (None, 'rowspan'),
+    (None, 'rules'),
+    (None, 'scope'),
+    (None, 'selected'),
+    (None, 'shape'),
+    (None, 'size'),
+    (None, 'span'),
+    (None, 'src'),
+    (None, 'start'),
+    (None, 'step'),
+    (None, 'style'),
+    (None, 'summary'),
+    (None, 'suppress'),
+    (None, 'tabindex'),
+    (None, 'target'),
+    (None, 'template'),
+    (None, 'title'),
+    (None, 'toppadding'),
+    (None, 'type'),
+    (None, 'unselectable'),
+    (None, 'usemap'),
+    (None, 'urn'),
+    (None, 'valign'),
+    (None, 'value'),
+    (None, 'variable'),
+    (None, 'volume'),
+    (None, 'vspace'),
+    (None, 'vrml'),
+    (None, 'width'),
+    (None, 'wrap'),
+    (namespaces['xml'], 'lang'),
+    # MathML attributes
+    (None, 'actiontype'),
+    (None, 'align'),
+    (None, 'columnalign'),
+    (None, 'columnalign'),
+    (None, 'columnalign'),
+    (None, 'columnlines'),
+    (None, 'columnspacing'),
+    (None, 'columnspan'),
+    (None, 'depth'),
+    (None, 'display'),
+    (None, 'displaystyle'),
+    (None, 'equalcolumns'),
+    (None, 'equalrows'),
+    (None, 'fence'),
+    (None, 'fontstyle'),
+    (None, 'fontweight'),
+    (None, 'frame'),
+    (None, 'height'),
+    (None, 'linethickness'),
+    (None, 'lspace'),
+    (None, 'mathbackground'),
+    (None, 'mathcolor'),
+    (None, 'mathvariant'),
+    (None, 'mathvariant'),
+    (None, 'maxsize'),
+    (None, 'minsize'),
+    (None, 'other'),
+    (None, 'rowalign'),
+    (None, 'rowalign'),
+    (None, 'rowalign'),
+    (None, 'rowlines'),
+    (None, 'rowspacing'),
+    (None, 'rowspan'),
+    (None, 'rspace'),
+    (None, 'scriptlevel'),
+    (None, 'selection'),
+    (None, 'separator'),
+    (None, 'stretchy'),
+    (None, 'width'),
+    (None, 'width'),
+    (namespaces['xlink'], 'href'),
+    (namespaces['xlink'], 'show'),
+    (namespaces['xlink'], 'type'),
+    # SVG attributes
+    (None, 'accent-height'),
+    (None, 'accumulate'),
+    (None, 'additive'),
+    (None, 'alphabetic'),
+    (None, 'arabic-form'),
+    (None, 'ascent'),
+    (None, 'attributeName'),
+    (None, 'attributeType'),
+    (None, 'baseProfile'),
+    (None, 'bbox'),
+    (None, 'begin'),
+    (None, 'by'),
+    (None, 'calcMode'),
+    (None, 'cap-height'),
+    (None, 'class'),
+    (None, 'clip-path'),
+    (None, 'color'),
+    (None, 'color-rendering'),
+    (None, 'content'),
+    (None, 'cx'),
+    (None, 'cy'),
+    (None, 'd'),
+    (None, 'dx'),
+    (None, 'dy'),
+    (None, 'descent'),
+    (None, 'display'),
+    (None, 'dur'),
+    (None, 'end'),
+    (None, 'fill'),
+    (None, 'fill-opacity'),
+    (None, 'fill-rule'),
+    (None, 'font-family'),
+    (None, 'font-size'),
+    (None, 'font-stretch'),
+    (None, 'font-style'),
+    (None, 'font-variant'),
+    (None, 'font-weight'),
+    (None, 'from'),
+    (None, 'fx'),
+    (None, 'fy'),
+    (None, 'g1'),
+    (None, 'g2'),
+    (None, 'glyph-name'),
+    (None, 'gradientUnits'),
+    (None, 'hanging'),
+    (None, 'height'),
+    (None, 'horiz-adv-x'),
+    (None, 'horiz-origin-x'),
+    (None, 'id'),
+    (None, 'ideographic'),
+    (None, 'k'),
+    (None, 'keyPoints'),
+    (None, 'keySplines'),
+    (None, 'keyTimes'),
+    (None, 'lang'),
+    (None, 'marker-end'),
+    (None, 'marker-mid'),
+    (None, 'marker-start'),
+    (None, 'markerHeight'),
+    (None, 'markerUnits'),
+    (None, 'markerWidth'),
+    (None, 'mathematical'),
+    (None, 'max'),
+    (None, 'min'),
+    (None, 'name'),
+    (None, 'offset'),
+    (None, 'opacity'),
+    (None, 'orient'),
+    (None, 'origin'),
+    (None, 'overline-position'),
+    (None, 'overline-thickness'),
+    (None, 'panose-1'),
+    (None, 'path'),
+    (None, 'pathLength'),
+    (None, 'points'),
+    (None, 'preserveAspectRatio'),
+    (None, 'r'),
+    (None, 'refX'),
+    (None, 'refY'),
+    (None, 'repeatCount'),
+    (None, 'repeatDur'),
+    (None, 'requiredExtensions'),
+    (None, 'requiredFeatures'),
+    (None, 'restart'),
+    (None, 'rotate'),
+    (None, 'rx'),
+    (None, 'ry'),
+    (None, 'slope'),
+    (None, 'stemh'),
+    (None, 'stemv'),
+    (None, 'stop-color'),
+    (None, 'stop-opacity'),
+    (None, 'strikethrough-position'),
+    (None, 'strikethrough-thickness'),
+    (None, 'stroke'),
+    (None, 'stroke-dasharray'),
+    (None, 'stroke-dashoffset'),
+    (None, 'stroke-linecap'),
+    (None, 'stroke-linejoin'),
+    (None, 'stroke-miterlimit'),
+    (None, 'stroke-opacity'),
+    (None, 'stroke-width'),
+    (None, 'systemLanguage'),
+    (None, 'target'),
+    (None, 'text-anchor'),
+    (None, 'to'),
+    (None, 'transform'),
+    (None, 'type'),
+    (None, 'u1'),
+    (None, 'u2'),
+    (None, 'underline-position'),
+    (None, 'underline-thickness'),
+    (None, 'unicode'),
+    (None, 'unicode-range'),
+    (None, 'units-per-em'),
+    (None, 'values'),
+    (None, 'version'),
+    (None, 'viewBox'),
+    (None, 'visibility'),
+    (None, 'width'),
+    (None, 'widths'),
+    (None, 'x'),
+    (None, 'x-height'),
+    (None, 'x1'),
+    (None, 'x2'),
+    (namespaces['xlink'], 'actuate'),
+    (namespaces['xlink'], 'arcrole'),
+    (namespaces['xlink'], 'href'),
+    (namespaces['xlink'], 'role'),
+    (namespaces['xlink'], 'show'),
+    (namespaces['xlink'], 'title'),
+    (namespaces['xlink'], 'type'),
+    (namespaces['xml'], 'base'),
+    (namespaces['xml'], 'lang'),
+    (namespaces['xml'], 'space'),
+    (None, 'y'),
+    (None, 'y1'),
+    (None, 'y2'),
+    (None, 'zoomAndPan'),
+))
+
+attr_val_is_uri = frozenset((
+    (None, 'href'),
+    (None, 'src'),
+    (None, 'cite'),
+    (None, 'action'),
+    (None, 'longdesc'),
+    (None, 'poster'),
+    (None, 'background'),
+    (None, 'datasrc'),
+    (None, 'dynsrc'),
+    (None, 'lowsrc'),
+    (None, 'ping'),
+    (namespaces['xlink'], 'href'),
+    (namespaces['xml'], 'base'),
+))
+
+svg_attr_val_allows_ref = frozenset((
+    (None, 'clip-path'),
+    (None, 'color-profile'),
+    (None, 'cursor'),
+    (None, 'fill'),
+    (None, 'filter'),
+    (None, 'marker'),
+    (None, 'marker-start'),
+    (None, 'marker-mid'),
+    (None, 'marker-end'),
+    (None, 'mask'),
+    (None, 'stroke'),
+))
+
+svg_allow_local_href = frozenset((
+    (None, 'altGlyph'),
+    (None, 'animate'),
+    (None, 'animateColor'),
+    (None, 'animateMotion'),
+    (None, 'animateTransform'),
+    (None, 'cursor'),
+    (None, 'feImage'),
+    (None, 'filter'),
+    (None, 'linearGradient'),
+    (None, 'pattern'),
+    (None, 'radialGradient'),
+    (None, 'textpath'),
+    (None, 'tref'),
+    (None, 'set'),
+    (None, 'use')
+))
+
+allowed_css_properties = frozenset((
+    'azimuth',
+    'background-color',
+    'border-bottom-color',
+    'border-collapse',
+    'border-color',
+    'border-left-color',
+    'border-right-color',
+    'border-top-color',
+    'clear',
+    'color',
+    'cursor',
+    'direction',
+    'display',
+    'elevation',
+    'float',
+    'font',
+    'font-family',
+    'font-size',
+    'font-style',
+    'font-variant',
+    'font-weight',
+    'height',
+    'letter-spacing',
+    'line-height',
+    'overflow',
+    'pause',
+    'pause-after',
+    'pause-before',
+    'pitch',
+    'pitch-range',
+    'richness',
+    'speak',
+    'speak-header',
+    'speak-numeral',
+    'speak-punctuation',
+    'speech-rate',
+    'stress',
+    'text-align',
+    'text-decoration',
+    'text-indent',
+    'unicode-bidi',
+    'vertical-align',
+    'voice-family',
+    'volume',
+    'white-space',
+    'width',
+))
+
+allowed_css_keywords = frozenset((
+    'auto',
+    'aqua',
+    'black',
+    'block',
+    'blue',
+    'bold',
+    'both',
+    'bottom',
+    'brown',
+    'center',
+    'collapse',
+    'dashed',
+    'dotted',
+    'fuchsia',
+    'gray',
+    'green',
+    '!important',
+    'italic',
+    'left',
+    'lime',
+    'maroon',
+    'medium',
+    'none',
+    'navy',
+    'normal',
+    'nowrap',
+    'olive',
+    'pointer',
+    'purple',
+    'red',
+    'right',
+    'solid',
+    'silver',
+    'teal',
+    'top',
+    'transparent',
+    'underline',
+    'white',
+    'yellow',
+))
+
+allowed_svg_properties = frozenset((
+    'fill',
+    'fill-opacity',
+    'fill-rule',
+    'stroke',
+    'stroke-width',
+    'stroke-linecap',
+    'stroke-linejoin',
+    'stroke-opacity',
+))
+
+allowed_protocols = frozenset((
+    'ed2k',
+    'ftp',
+    'http',
+    'https',
+    'irc',
+    'mailto',
+    'news',
+    'gopher',
+    'nntp',
+    'telnet',
+    'webcal',
+    'xmpp',
+    'callto',
+    'feed',
+    'urn',
+    'aim',
+    'rsync',
+    'tag',
+    'ssh',
+    'sftp',
+    'rtsp',
+    'afs',
+    'data',
+))
+
+allowed_content_types = frozenset((
+    'image/png',
+    'image/jpeg',
+    'image/gif',
+    'image/webp',
+    'image/bmp',
+    'text/plain',
+))
+
+
+data_content_type = re.compile(r'''
+                                ^
+                                # Match a content type <application>/<type>
+                                (?P<content_type>[-a-zA-Z0-9.]+/[-a-zA-Z0-9.]+)
+                                # Match any character set and encoding
+                                (?:(?:;charset=(?:[-a-zA-Z0-9]+)(?:;(?:base64))?)
+                                  |(?:;(?:base64))?(?:;charset=(?:[-a-zA-Z0-9]+))?)
+                                # Assume the rest is data
+                                ,.*
+                                $
+                                ''',
+                               re.VERBOSE)
+
+
+class Filter(base.Filter):
+    """ sanitization of XHTML+MathML+SVG and of inline style attributes."""
+    def __init__(self,
+                 source,
+                 allowed_elements=allowed_elements,
+                 allowed_attributes=allowed_attributes,
+                 allowed_css_properties=allowed_css_properties,
+                 allowed_css_keywords=allowed_css_keywords,
+                 allowed_svg_properties=allowed_svg_properties,
+                 allowed_protocols=allowed_protocols,
+                 allowed_content_types=allowed_content_types,
+                 attr_val_is_uri=attr_val_is_uri,
+                 svg_attr_val_allows_ref=svg_attr_val_allows_ref,
+                 svg_allow_local_href=svg_allow_local_href):
+        super(Filter, self).__init__(source)
+        self.allowed_elements = allowed_elements
+        self.allowed_attributes = allowed_attributes
+        self.allowed_css_properties = allowed_css_properties
+        self.allowed_css_keywords = allowed_css_keywords
+        self.allowed_svg_properties = allowed_svg_properties
+        self.allowed_protocols = allowed_protocols
+        self.allowed_content_types = allowed_content_types
+        self.attr_val_is_uri = attr_val_is_uri
+        self.svg_attr_val_allows_ref = svg_attr_val_allows_ref
+        self.svg_allow_local_href = svg_allow_local_href
+
+    def __iter__(self):
+        for token in base.Filter.__iter__(self):
+            token = self.sanitize_token(token)
+            if token:
+                yield token
+
+    # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and
+    # stripping out all # attributes not in ALLOWED_ATTRIBUTES. Style
+    # attributes are parsed, and a restricted set, # specified by
+    # ALLOWED_CSS_PROPERTIES and ALLOWED_CSS_KEYWORDS, are allowed through.
+    # attributes in ATTR_VAL_IS_URI are scanned, and only URI schemes specified
+    # in ALLOWED_PROTOCOLS are allowed.
+    #
+    #   sanitize_html('<script> do_nasty_stuff() </script>')
+    #    => &lt;script> do_nasty_stuff() &lt;/script>
+    #   sanitize_html('<a href="javascript: sucker();">Click here for $100</a>')
+    #    => <a>Click here for $100</a>
+    def sanitize_token(self, token):
+
+        # accommodate filters which use token_type differently
+        token_type = token["type"]
+        if token_type in ("StartTag", "EndTag", "EmptyTag"):
+            name = token["name"]
+            namespace = token["namespace"]
+            if ((namespace, name) in self.allowed_elements or
+                (namespace is None and
+                 (namespaces["html"], name) in self.allowed_elements)):
+                return self.allowed_token(token)
+            else:
+                return self.disallowed_token(token)
+        elif token_type == "Comment":
+            pass
+        else:
+            return token
+
+    def allowed_token(self, token):
+        if "data" in token:
+            attrs = token["data"]
+            attr_names = set(attrs.keys())
+
+            # Remove forbidden attributes
+            for to_remove in (attr_names - self.allowed_attributes):
+                del token["data"][to_remove]
+                attr_names.remove(to_remove)
+
+            # Remove attributes with disallowed URL values
+            for attr in (attr_names & self.attr_val_is_uri):
+                assert attr in attrs
+                # I don't have a clue where this regexp comes from or why it matches those
+                # characters, nor why we call unescape. I just know it's always been here.
+                # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all
+                # this will do is remove *more* than it otherwise would.
+                val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\s]+", '',
+                                       unescape(attrs[attr])).lower()
+                # remove replacement characters from unescaped characters
+                val_unescaped = val_unescaped.replace("\ufffd", "")
+                try:
+                    uri = urlparse.urlparse(val_unescaped)
+                except ValueError:
+                    uri = None
+                    del attrs[attr]
+                if uri and uri.scheme:
+                    if uri.scheme not in self.allowed_protocols:
+                        del attrs[attr]
+                    if uri.scheme == 'data':
+                        m = data_content_type.match(uri.path)
+                        if not m:
+                            del attrs[attr]
+                        elif m.group('content_type') not in self.allowed_content_types:
+                            del attrs[attr]
+
+            for attr in self.svg_attr_val_allows_ref:
+                if attr in attrs:
+                    attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)',
+                                         ' ',
+                                         unescape(attrs[attr]))
+            if (token["name"] in self.svg_allow_local_href and
+                (namespaces['xlink'], 'href') in attrs and re.search('^\s*[^#\s].*',
+                                                                     attrs[(namespaces['xlink'], 'href')])):
+                del attrs[(namespaces['xlink'], 'href')]
+            if (None, 'style') in attrs:
+                attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')])
+            token["data"] = attrs
+        return token
+
+    def disallowed_token(self, token):
+        token_type = token["type"]
+        if token_type == "EndTag":
+            token["data"] = "</%s>" % token["name"]
+        elif token["data"]:
+            assert token_type in ("StartTag", "EmptyTag")
+            attrs = []
+            for (ns, name), v in token["data"].items():
+                attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v)))
+            token["data"] = "<%s%s>" % (token["name"], ''.join(attrs))
+        else:
+            token["data"] = "<%s>" % token["name"]
+        if token.get("selfClosing"):
+            token["data"] = token["data"][:-1] + "/>"
+
+        token["type"] = "Characters"
+
+        del token["name"]
+        return token
+
+    def sanitize_css(self, style):
+        # disallow urls
+        style = re.compile('url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style)
+
+        # gauntlet
+        if not re.match("""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style):
+            return ''
+        if not re.match("^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style):
+            return ''
+
+        clean = []
+        for prop, value in re.findall("([-\w]+)\s*:\s*([^:;]*)", style):
+            if not value:
+                continue
+            if prop.lower() in self.allowed_css_properties:
+                clean.append(prop + ': ' + value + ';')
+            elif prop.split('-')[0].lower() in ['background', 'border', 'margin',
+                                                'padding']:
+                for keyword in value.split():
+                    if keyword not in self.allowed_css_keywords and \
+                            not re.match("^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword):  # noqa
+                        break
+                else:
+                    clean.append(prop + ': ' + value + ';')
+            elif prop.lower() in self.allowed_svg_properties:
+                clean.append(prop + ': ' + value + ';')
+
+        return ' '.join(clean)
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/whitespace.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/whitespace.py
new file mode 100644
index 0000000000000000000000000000000000000000..89210528717dcd653e5313c62bf6b83e8445309f
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/whitespace.py
@@ -0,0 +1,38 @@
+from __future__ import absolute_import, division, unicode_literals
+
+import re
+
+from . import base
+from ..constants import rcdataElements, spaceCharacters
+spaceCharacters = "".join(spaceCharacters)
+
+SPACES_REGEX = re.compile("[%s]+" % spaceCharacters)
+
+
+class Filter(base.Filter):
+
+    spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements))
+
+    def __iter__(self):
+        preserve = 0
+        for token in base.Filter.__iter__(self):
+            type = token["type"]
+            if type == "StartTag" \
+                    and (preserve or token["name"] in self.spacePreserveElements):
+                preserve += 1
+
+            elif type == "EndTag" and preserve:
+                preserve -= 1
+
+            elif not preserve and type == "SpaceCharacters" and token["data"]:
+                # Test on token["data"] above to not introduce spaces where there were not
+                token["data"] = " "
+
+            elif not preserve and type == "Characters":
+                token["data"] = collapse_spaces(token["data"])
+
+            yield token
+
+
+def collapse_spaces(text):
+    return SPACES_REGEX.sub(' ', text)
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/html5parser.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/html5parser.py
new file mode 100644
index 0000000000000000000000000000000000000000..f7043cb19891a8f93b1476ce2dcbdead32e526d8
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/html5parser.py
@@ -0,0 +1,2733 @@
+from __future__ import absolute_import, division, unicode_literals
+from pip._vendor.six import with_metaclass, viewkeys, PY3
+
+import types
+
+try:
+    from collections import OrderedDict
+except ImportError:
+    from pip._vendor.ordereddict import OrderedDict
+
+from . import _inputstream
+from . import _tokenizer
+
+from . import treebuilders
+from .treebuilders.base import Marker
+
+from . import _utils
+from .constants import (
+    spaceCharacters, asciiUpper2Lower,
+    specialElements, headingElements, cdataElements, rcdataElements,
+    tokenTypes, tagTokenTypes,
+    namespaces,
+    htmlIntegrationPointElements, mathmlTextIntegrationPointElements,
+    adjustForeignAttributes as adjustForeignAttributesMap,
+    adjustMathMLAttributes, adjustSVGAttributes,
+    E,
+    ReparseException
+)
+
+
+def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs):
+    """Parse a string or file-like object into a tree"""
+    tb = treebuilders.getTreeBuilder(treebuilder)
+    p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements)
+    return p.parse(doc, **kwargs)
+
+
+def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs):
+    tb = treebuilders.getTreeBuilder(treebuilder)
+    p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements)
+    return p.parseFragment(doc, container=container, **kwargs)
+
+
+def method_decorator_metaclass(function):
+    class Decorated(type):
+        def __new__(meta, classname, bases, classDict):
+            for attributeName, attribute in classDict.items():
+                if isinstance(attribute, types.FunctionType):
+                    attribute = function(attribute)
+
+                classDict[attributeName] = attribute
+            return type.__new__(meta, classname, bases, classDict)
+    return Decorated
+
+
+class HTMLParser(object):
+    """HTML parser. Generates a tree structure from a stream of (possibly
+        malformed) HTML"""
+
+    def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False):
+        """
+        strict - raise an exception when a parse error is encountered
+
+        tree - a treebuilder class controlling the type of tree that will be
+        returned. Built in treebuilders can be accessed through
+        html5lib.treebuilders.getTreeBuilder(treeType)
+        """
+
+        # Raise an exception on the first error encountered
+        self.strict = strict
+
+        if tree is None:
+            tree = treebuilders.getTreeBuilder("etree")
+        self.tree = tree(namespaceHTMLElements)
+        self.errors = []
+
+        self.phases = dict([(name, cls(self, self.tree)) for name, cls in
+                            getPhases(debug).items()])
+
+    def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs):
+
+        self.innerHTMLMode = innerHTML
+        self.container = container
+        self.scripting = scripting
+        self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs)
+        self.reset()
+
+        try:
+            self.mainLoop()
+        except ReparseException:
+            self.reset()
+            self.mainLoop()
+
+    def reset(self):
+        self.tree.reset()
+        self.firstStartTag = False
+        self.errors = []
+        self.log = []  # only used with debug mode
+        # "quirks" / "limited quirks" / "no quirks"
+        self.compatMode = "no quirks"
+
+        if self.innerHTMLMode:
+            self.innerHTML = self.container.lower()
+
+            if self.innerHTML in cdataElements:
+                self.tokenizer.state = self.tokenizer.rcdataState
+            elif self.innerHTML in rcdataElements:
+                self.tokenizer.state = self.tokenizer.rawtextState
+            elif self.innerHTML == 'plaintext':
+                self.tokenizer.state = self.tokenizer.plaintextState
+            else:
+                # state already is data state
+                # self.tokenizer.state = self.tokenizer.dataState
+                pass
+            self.phase = self.phases["beforeHtml"]
+            self.phase.insertHtmlElement()
+            self.resetInsertionMode()
+        else:
+            self.innerHTML = False  # pylint:disable=redefined-variable-type
+            self.phase = self.phases["initial"]
+
+        self.lastPhase = None
+
+        self.beforeRCDataPhase = None
+
+        self.framesetOK = True
+
+    @property
+    def documentEncoding(self):
+        """The name of the character encoding
+        that was used to decode the input stream,
+        or :obj:`None` if that is not determined yet.
+
+        """
+        if not hasattr(self, 'tokenizer'):
+            return None
+        return self.tokenizer.stream.charEncoding[0].name
+
+    def isHTMLIntegrationPoint(self, element):
+        if (element.name == "annotation-xml" and
+                element.namespace == namespaces["mathml"]):
+            return ("encoding" in element.attributes and
+                    element.attributes["encoding"].translate(
+                        asciiUpper2Lower) in
+                    ("text/html", "application/xhtml+xml"))
+        else:
+            return (element.namespace, element.name) in htmlIntegrationPointElements
+
+    def isMathMLTextIntegrationPoint(self, element):
+        return (element.namespace, element.name) in mathmlTextIntegrationPointElements
+
+    def mainLoop(self):
+        CharactersToken = tokenTypes["Characters"]
+        SpaceCharactersToken = tokenTypes["SpaceCharacters"]
+        StartTagToken = tokenTypes["StartTag"]
+        EndTagToken = tokenTypes["EndTag"]
+        CommentToken = tokenTypes["Comment"]
+        DoctypeToken = tokenTypes["Doctype"]
+        ParseErrorToken = tokenTypes["ParseError"]
+
+        for token in self.normalizedTokens():
+            prev_token = None
+            new_token = token
+            while new_token is not None:
+                prev_token = new_token
+                currentNode = self.tree.openElements[-1] if self.tree.openElements else None
+                currentNodeNamespace = currentNode.namespace if currentNode else None
+                currentNodeName = currentNode.name if currentNode else None
+
+                type = new_token["type"]
+
+                if type == ParseErrorToken:
+                    self.parseError(new_token["data"], new_token.get("datavars", {}))
+                    new_token = None
+                else:
+                    if (len(self.tree.openElements) == 0 or
+                        currentNodeNamespace == self.tree.defaultNamespace or
+                        (self.isMathMLTextIntegrationPoint(currentNode) and
+                         ((type == StartTagToken and
+                           token["name"] not in frozenset(["mglyph", "malignmark"])) or
+                          type in (CharactersToken, SpaceCharactersToken))) or
+                        (currentNodeNamespace == namespaces["mathml"] and
+                         currentNodeName == "annotation-xml" and
+                         type == StartTagToken and
+                         token["name"] == "svg") or
+                        (self.isHTMLIntegrationPoint(currentNode) and
+                         type in (StartTagToken, CharactersToken, SpaceCharactersToken))):
+                        phase = self.phase
+                    else:
+                        phase = self.phases["inForeignContent"]
+
+                    if type == CharactersToken:
+                        new_token = phase.processCharacters(new_token)
+                    elif type == SpaceCharactersToken:
+                        new_token = phase.processSpaceCharacters(new_token)
+                    elif type == StartTagToken:
+                        new_token = phase.processStartTag(new_token)
+                    elif type == EndTagToken:
+                        new_token = phase.processEndTag(new_token)
+                    elif type == CommentToken:
+                        new_token = phase.processComment(new_token)
+                    elif type == DoctypeToken:
+                        new_token = phase.processDoctype(new_token)
+
+            if (type == StartTagToken and prev_token["selfClosing"] and
+                    not prev_token["selfClosingAcknowledged"]):
+                self.parseError("non-void-element-with-trailing-solidus",
+                                {"name": prev_token["name"]})
+
+        # When the loop finishes it's EOF
+        reprocess = True
+        phases = []
+        while reprocess:
+            phases.append(self.phase)
+            reprocess = self.phase.processEOF()
+            if reprocess:
+                assert self.phase not in phases
+
+    def normalizedTokens(self):
+        for token in self.tokenizer:
+            yield self.normalizeToken(token)
+
+    def parse(self, stream, *args, **kwargs):
+        """Parse a HTML document into a well-formed tree
+
+        stream - a filelike object or string containing the HTML to be parsed
+
+        The optional encoding parameter must be a string that indicates
+        the encoding.  If specified, that encoding will be used,
+        regardless of any BOM or later declaration (such as in a meta
+        element)
+
+        scripting - treat noscript elements as if javascript was turned on
+        """
+        self._parse(stream, False, None, *args, **kwargs)
+        return self.tree.getDocument()
+
+    def parseFragment(self, stream, *args, **kwargs):
+        """Parse a HTML fragment into a well-formed tree fragment
+
+        container - name of the element we're setting the innerHTML property
+        if set to None, default to 'div'
+
+        stream - a filelike object or string containing the HTML to be parsed
+
+        The optional encoding parameter must be a string that indicates
+        the encoding.  If specified, that encoding will be used,
+        regardless of any BOM or later declaration (such as in a meta
+        element)
+
+        scripting - treat noscript elements as if javascript was turned on
+        """
+        self._parse(stream, True, *args, **kwargs)
+        return self.tree.getFragment()
+
+    def parseError(self, errorcode="XXX-undefined-error", datavars=None):
+        # XXX The idea is to make errorcode mandatory.
+        if datavars is None:
+            datavars = {}
+        self.errors.append((self.tokenizer.stream.position(), errorcode, datavars))
+        if self.strict:
+            raise ParseError(E[errorcode] % datavars)
+
+    def normalizeToken(self, token):
+        """ HTML5 specific normalizations to the token stream """
+
+        if token["type"] == tokenTypes["StartTag"]:
+            raw = token["data"]
+            token["data"] = OrderedDict(raw)
+            if len(raw) > len(token["data"]):
+                # we had some duplicated attribute, fix so first wins
+                token["data"].update(raw[::-1])
+
+        return token
+
+    def adjustMathMLAttributes(self, token):
+        adjust_attributes(token, adjustMathMLAttributes)
+
+    def adjustSVGAttributes(self, token):
+        adjust_attributes(token, adjustSVGAttributes)
+
+    def adjustForeignAttributes(self, token):
+        adjust_attributes(token, adjustForeignAttributesMap)
+
+    def reparseTokenNormal(self, token):
+        # pylint:disable=unused-argument
+        self.parser.phase()
+
+    def resetInsertionMode(self):
+        # The name of this method is mostly historical. (It's also used in the
+        # specification.)
+        last = False
+        newModes = {
+            "select": "inSelect",
+            "td": "inCell",
+            "th": "inCell",
+            "tr": "inRow",
+            "tbody": "inTableBody",
+            "thead": "inTableBody",
+            "tfoot": "inTableBody",
+            "caption": "inCaption",
+            "colgroup": "inColumnGroup",
+            "table": "inTable",
+            "head": "inBody",
+            "body": "inBody",
+            "frameset": "inFrameset",
+            "html": "beforeHead"
+        }
+        for node in self.tree.openElements[::-1]:
+            nodeName = node.name
+            new_phase = None
+            if node == self.tree.openElements[0]:
+                assert self.innerHTML
+                last = True
+                nodeName = self.innerHTML
+            # Check for conditions that should only happen in the innerHTML
+            # case
+            if nodeName in ("select", "colgroup", "head", "html"):
+                assert self.innerHTML
+
+            if not last and node.namespace != self.tree.defaultNamespace:
+                continue
+
+            if nodeName in newModes:
+                new_phase = self.phases[newModes[nodeName]]
+                break
+            elif last:
+                new_phase = self.phases["inBody"]
+                break
+
+        self.phase = new_phase
+
+    def parseRCDataRawtext(self, token, contentType):
+        """Generic RCDATA/RAWTEXT Parsing algorithm
+        contentType - RCDATA or RAWTEXT
+        """
+        assert contentType in ("RAWTEXT", "RCDATA")
+
+        self.tree.insertElement(token)
+
+        if contentType == "RAWTEXT":
+            self.tokenizer.state = self.tokenizer.rawtextState
+        else:
+            self.tokenizer.state = self.tokenizer.rcdataState
+
+        self.originalPhase = self.phase
+
+        self.phase = self.phases["text"]
+
+
+@_utils.memoize
+def getPhases(debug):
+    def log(function):
+        """Logger that records which phase processes each token"""
+        type_names = dict((value, key) for key, value in
+                          tokenTypes.items())
+
+        def wrapped(self, *args, **kwargs):
+            if function.__name__.startswith("process") and len(args) > 0:
+                token = args[0]
+                try:
+                    info = {"type": type_names[token['type']]}
+                except:
+                    raise
+                if token['type'] in tagTokenTypes:
+                    info["name"] = token['name']
+
+                self.parser.log.append((self.parser.tokenizer.state.__name__,
+                                        self.parser.phase.__class__.__name__,
+                                        self.__class__.__name__,
+                                        function.__name__,
+                                        info))
+                return function(self, *args, **kwargs)
+            else:
+                return function(self, *args, **kwargs)
+        return wrapped
+
+    def getMetaclass(use_metaclass, metaclass_func):
+        if use_metaclass:
+            return method_decorator_metaclass(metaclass_func)
+        else:
+            return type
+
+    # pylint:disable=unused-argument
+    class Phase(with_metaclass(getMetaclass(debug, log))):
+        """Base class for helper object that implements each phase of processing
+        """
+
+        def __init__(self, parser, tree):
+            self.parser = parser
+            self.tree = tree
+
+        def processEOF(self):
+            raise NotImplementedError
+
+        def processComment(self, token):
+            # For most phases the following is correct. Where it's not it will be
+            # overridden.
+            self.tree.insertComment(token, self.tree.openElements[-1])
+
+        def processDoctype(self, token):
+            self.parser.parseError("unexpected-doctype")
+
+        def processCharacters(self, token):
+            self.tree.insertText(token["data"])
+
+        def processSpaceCharacters(self, token):
+            self.tree.insertText(token["data"])
+
+        def processStartTag(self, token):
+            return self.startTagHandler[token["name"]](token)
+
+        def startTagHtml(self, token):
+            if not self.parser.firstStartTag and token["name"] == "html":
+                self.parser.parseError("non-html-root")
+            # XXX Need a check here to see if the first start tag token emitted is
+            # this token... If it's not, invoke self.parser.parseError().
+            for attr, value in token["data"].items():
+                if attr not in self.tree.openElements[0].attributes:
+                    self.tree.openElements[0].attributes[attr] = value
+            self.parser.firstStartTag = False
+
+        def processEndTag(self, token):
+            return self.endTagHandler[token["name"]](token)
+
+    class InitialPhase(Phase):
+        def processSpaceCharacters(self, token):
+            pass
+
+        def processComment(self, token):
+            self.tree.insertComment(token, self.tree.document)
+
+        def processDoctype(self, token):
+            name = token["name"]
+            publicId = token["publicId"]
+            systemId = token["systemId"]
+            correct = token["correct"]
+
+            if (name != "html" or publicId is not None or
+                    systemId is not None and systemId != "about:legacy-compat"):
+                self.parser.parseError("unknown-doctype")
+
+            if publicId is None:
+                publicId = ""
+
+            self.tree.insertDoctype(token)
+
+            if publicId != "":
+                publicId = publicId.translate(asciiUpper2Lower)
+
+            if (not correct or token["name"] != "html" or
+                    publicId.startswith(
+                        ("+//silmaril//dtd html pro v0r11 19970101//",
+                         "-//advasoft ltd//dtd html 3.0 aswedit + extensions//",
+                         "-//as//dtd html 3.0 aswedit + extensions//",
+                         "-//ietf//dtd html 2.0 level 1//",
+                         "-//ietf//dtd html 2.0 level 2//",
+                         "-//ietf//dtd html 2.0 strict level 1//",
+                         "-//ietf//dtd html 2.0 strict level 2//",
+                         "-//ietf//dtd html 2.0 strict//",
+                         "-//ietf//dtd html 2.0//",
+                         "-//ietf//dtd html 2.1e//",
+                         "-//ietf//dtd html 3.0//",
+                         "-//ietf//dtd html 3.2 final//",
+                         "-//ietf//dtd html 3.2//",
+                         "-//ietf//dtd html 3//",
+                         "-//ietf//dtd html level 0//",
+                         "-//ietf//dtd html level 1//",
+                         "-//ietf//dtd html level 2//",
+                         "-//ietf//dtd html level 3//",
+                         "-//ietf//dtd html strict level 0//",
+                         "-//ietf//dtd html strict level 1//",
+                         "-//ietf//dtd html strict level 2//",
+                         "-//ietf//dtd html strict level 3//",
+                         "-//ietf//dtd html strict//",
+                         "-//ietf//dtd html//",
+                         "-//metrius//dtd metrius presentational//",
+                         "-//microsoft//dtd internet explorer 2.0 html strict//",
+                         "-//microsoft//dtd internet explorer 2.0 html//",
+                         "-//microsoft//dtd internet explorer 2.0 tables//",
+                         "-//microsoft//dtd internet explorer 3.0 html strict//",
+                         "-//microsoft//dtd internet explorer 3.0 html//",
+                         "-//microsoft//dtd internet explorer 3.0 tables//",
+                         "-//netscape comm. corp.//dtd html//",
+                         "-//netscape comm. corp.//dtd strict html//",
+                         "-//o'reilly and associates//dtd html 2.0//",
+                         "-//o'reilly and associates//dtd html extended 1.0//",
+                         "-//o'reilly and associates//dtd html extended relaxed 1.0//",
+                         "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//",
+                         "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//",
+                         "-//spyglass//dtd html 2.0 extended//",
+                         "-//sq//dtd html 2.0 hotmetal + extensions//",
+                         "-//sun microsystems corp.//dtd hotjava html//",
+                         "-//sun microsystems corp.//dtd hotjava strict html//",
+                         "-//w3c//dtd html 3 1995-03-24//",
+                         "-//w3c//dtd html 3.2 draft//",
+                         "-//w3c//dtd html 3.2 final//",
+                         "-//w3c//dtd html 3.2//",
+                         "-//w3c//dtd html 3.2s draft//",
+                         "-//w3c//dtd html 4.0 frameset//",
+                         "-//w3c//dtd html 4.0 transitional//",
+                         "-//w3c//dtd html experimental 19960712//",
+                         "-//w3c//dtd html experimental 970421//",
+                         "-//w3c//dtd w3 html//",
+                         "-//w3o//dtd w3 html 3.0//",
+                         "-//webtechs//dtd mozilla html 2.0//",
+                         "-//webtechs//dtd mozilla html//")) or
+                    publicId in ("-//w3o//dtd w3 html strict 3.0//en//",
+                                 "-/w3c/dtd html 4.0 transitional/en",
+                                 "html") or
+                    publicId.startswith(
+                        ("-//w3c//dtd html 4.01 frameset//",
+                         "-//w3c//dtd html 4.01 transitional//")) and
+                    systemId is None or
+                    systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"):
+                self.parser.compatMode = "quirks"
+            elif (publicId.startswith(
+                    ("-//w3c//dtd xhtml 1.0 frameset//",
+                     "-//w3c//dtd xhtml 1.0 transitional//")) or
+                  publicId.startswith(
+                      ("-//w3c//dtd html 4.01 frameset//",
+                       "-//w3c//dtd html 4.01 transitional//")) and
+                  systemId is not None):
+                self.parser.compatMode = "limited quirks"
+
+            self.parser.phase = self.parser.phases["beforeHtml"]
+
+        def anythingElse(self):
+            self.parser.compatMode = "quirks"
+            self.parser.phase = self.parser.phases["beforeHtml"]
+
+        def processCharacters(self, token):
+            self.parser.parseError("expected-doctype-but-got-chars")
+            self.anythingElse()
+            return token
+
+        def processStartTag(self, token):
+            self.parser.parseError("expected-doctype-but-got-start-tag",
+                                   {"name": token["name"]})
+            self.anythingElse()
+            return token
+
+        def processEndTag(self, token):
+            self.parser.parseError("expected-doctype-but-got-end-tag",
+                                   {"name": token["name"]})
+            self.anythingElse()
+            return token
+
+        def processEOF(self):
+            self.parser.parseError("expected-doctype-but-got-eof")
+            self.anythingElse()
+            return True
+
+    class BeforeHtmlPhase(Phase):
+        # helper methods
+        def insertHtmlElement(self):
+            self.tree.insertRoot(impliedTagToken("html", "StartTag"))
+            self.parser.phase = self.parser.phases["beforeHead"]
+
+        # other
+        def processEOF(self):
+            self.insertHtmlElement()
+            return True
+
+        def processComment(self, token):
+            self.tree.insertComment(token, self.tree.document)
+
+        def processSpaceCharacters(self, token):
+            pass
+
+        def processCharacters(self, token):
+            self.insertHtmlElement()
+            return token
+
+        def processStartTag(self, token):
+            if token["name"] == "html":
+                self.parser.firstStartTag = True
+            self.insertHtmlElement()
+            return token
+
+        def processEndTag(self, token):
+            if token["name"] not in ("head", "body", "html", "br"):
+                self.parser.parseError("unexpected-end-tag-before-html",
+                                       {"name": token["name"]})
+            else:
+                self.insertHtmlElement()
+                return token
+
+    class BeforeHeadPhase(Phase):
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                ("head", self.startTagHead)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+            self.endTagHandler = _utils.MethodDispatcher([
+                (("head", "body", "html", "br"), self.endTagImplyHead)
+            ])
+            self.endTagHandler.default = self.endTagOther
+
+        def processEOF(self):
+            self.startTagHead(impliedTagToken("head", "StartTag"))
+            return True
+
+        def processSpaceCharacters(self, token):
+            pass
+
+        def processCharacters(self, token):
+            self.startTagHead(impliedTagToken("head", "StartTag"))
+            return token
+
+        def startTagHtml(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def startTagHead(self, token):
+            self.tree.insertElement(token)
+            self.tree.headPointer = self.tree.openElements[-1]
+            self.parser.phase = self.parser.phases["inHead"]
+
+        def startTagOther(self, token):
+            self.startTagHead(impliedTagToken("head", "StartTag"))
+            return token
+
+        def endTagImplyHead(self, token):
+            self.startTagHead(impliedTagToken("head", "StartTag"))
+            return token
+
+        def endTagOther(self, token):
+            self.parser.parseError("end-tag-after-implied-root",
+                                   {"name": token["name"]})
+
+    class InHeadPhase(Phase):
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                ("title", self.startTagTitle),
+                (("noframes", "style"), self.startTagNoFramesStyle),
+                ("noscript", self.startTagNoscript),
+                ("script", self.startTagScript),
+                (("base", "basefont", "bgsound", "command", "link"),
+                 self.startTagBaseLinkCommand),
+                ("meta", self.startTagMeta),
+                ("head", self.startTagHead)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+            self.endTagHandler = _utils.MethodDispatcher([
+                ("head", self.endTagHead),
+                (("br", "html", "body"), self.endTagHtmlBodyBr)
+            ])
+            self.endTagHandler.default = self.endTagOther
+
+        # the real thing
+        def processEOF(self):
+            self.anythingElse()
+            return True
+
+        def processCharacters(self, token):
+            self.anythingElse()
+            return token
+
+        def startTagHtml(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def startTagHead(self, token):
+            self.parser.parseError("two-heads-are-not-better-than-one")
+
+        def startTagBaseLinkCommand(self, token):
+            self.tree.insertElement(token)
+            self.tree.openElements.pop()
+            token["selfClosingAcknowledged"] = True
+
+        def startTagMeta(self, token):
+            self.tree.insertElement(token)
+            self.tree.openElements.pop()
+            token["selfClosingAcknowledged"] = True
+
+            attributes = token["data"]
+            if self.parser.tokenizer.stream.charEncoding[1] == "tentative":
+                if "charset" in attributes:
+                    self.parser.tokenizer.stream.changeEncoding(attributes["charset"])
+                elif ("content" in attributes and
+                      "http-equiv" in attributes and
+                      attributes["http-equiv"].lower() == "content-type"):
+                    # Encoding it as UTF-8 here is a hack, as really we should pass
+                    # the abstract Unicode string, and just use the
+                    # ContentAttrParser on that, but using UTF-8 allows all chars
+                    # to be encoded and as a ASCII-superset works.
+                    data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8"))
+                    parser = _inputstream.ContentAttrParser(data)
+                    codec = parser.parse()
+                    self.parser.tokenizer.stream.changeEncoding(codec)
+
+        def startTagTitle(self, token):
+            self.parser.parseRCDataRawtext(token, "RCDATA")
+
+        def startTagNoFramesStyle(self, token):
+            # Need to decide whether to implement the scripting-disabled case
+            self.parser.parseRCDataRawtext(token, "RAWTEXT")
+
+        def startTagNoscript(self, token):
+            if self.parser.scripting:
+                self.parser.parseRCDataRawtext(token, "RAWTEXT")
+            else:
+                self.tree.insertElement(token)
+                self.parser.phase = self.parser.phases["inHeadNoscript"]
+
+        def startTagScript(self, token):
+            self.tree.insertElement(token)
+            self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState
+            self.parser.originalPhase = self.parser.phase
+            self.parser.phase = self.parser.phases["text"]
+
+        def startTagOther(self, token):
+            self.anythingElse()
+            return token
+
+        def endTagHead(self, token):
+            node = self.parser.tree.openElements.pop()
+            assert node.name == "head", "Expected head got %s" % node.name
+            self.parser.phase = self.parser.phases["afterHead"]
+
+        def endTagHtmlBodyBr(self, token):
+            self.anythingElse()
+            return token
+
+        def endTagOther(self, token):
+            self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+
+        def anythingElse(self):
+            self.endTagHead(impliedTagToken("head"))
+
+    class InHeadNoscriptPhase(Phase):
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand),
+                (("head", "noscript"), self.startTagHeadNoscript),
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+            self.endTagHandler = _utils.MethodDispatcher([
+                ("noscript", self.endTagNoscript),
+                ("br", self.endTagBr),
+            ])
+            self.endTagHandler.default = self.endTagOther
+
+        def processEOF(self):
+            self.parser.parseError("eof-in-head-noscript")
+            self.anythingElse()
+            return True
+
+        def processComment(self, token):
+            return self.parser.phases["inHead"].processComment(token)
+
+        def processCharacters(self, token):
+            self.parser.parseError("char-in-head-noscript")
+            self.anythingElse()
+            return token
+
+        def processSpaceCharacters(self, token):
+            return self.parser.phases["inHead"].processSpaceCharacters(token)
+
+        def startTagHtml(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def startTagBaseLinkCommand(self, token):
+            return self.parser.phases["inHead"].processStartTag(token)
+
+        def startTagHeadNoscript(self, token):
+            self.parser.parseError("unexpected-start-tag", {"name": token["name"]})
+
+        def startTagOther(self, token):
+            self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]})
+            self.anythingElse()
+            return token
+
+        def endTagNoscript(self, token):
+            node = self.parser.tree.openElements.pop()
+            assert node.name == "noscript", "Expected noscript got %s" % node.name
+            self.parser.phase = self.parser.phases["inHead"]
+
+        def endTagBr(self, token):
+            self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]})
+            self.anythingElse()
+            return token
+
+        def endTagOther(self, token):
+            self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+
+        def anythingElse(self):
+            # Caller must raise parse error first!
+            self.endTagNoscript(impliedTagToken("noscript"))
+
+    class AfterHeadPhase(Phase):
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                ("body", self.startTagBody),
+                ("frameset", self.startTagFrameset),
+                (("base", "basefont", "bgsound", "link", "meta", "noframes", "script",
+                  "style", "title"),
+                 self.startTagFromHead),
+                ("head", self.startTagHead)
+            ])
+            self.startTagHandler.default = self.startTagOther
+            self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"),
+                                                           self.endTagHtmlBodyBr)])
+            self.endTagHandler.default = self.endTagOther
+
+        def processEOF(self):
+            self.anythingElse()
+            return True
+
+        def processCharacters(self, token):
+            self.anythingElse()
+            return token
+
+        def startTagHtml(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def startTagBody(self, token):
+            self.parser.framesetOK = False
+            self.tree.insertElement(token)
+            self.parser.phase = self.parser.phases["inBody"]
+
+        def startTagFrameset(self, token):
+            self.tree.insertElement(token)
+            self.parser.phase = self.parser.phases["inFrameset"]
+
+        def startTagFromHead(self, token):
+            self.parser.parseError("unexpected-start-tag-out-of-my-head",
+                                   {"name": token["name"]})
+            self.tree.openElements.append(self.tree.headPointer)
+            self.parser.phases["inHead"].processStartTag(token)
+            for node in self.tree.openElements[::-1]:
+                if node.name == "head":
+                    self.tree.openElements.remove(node)
+                    break
+
+        def startTagHead(self, token):
+            self.parser.parseError("unexpected-start-tag", {"name": token["name"]})
+
+        def startTagOther(self, token):
+            self.anythingElse()
+            return token
+
+        def endTagHtmlBodyBr(self, token):
+            self.anythingElse()
+            return token
+
+        def endTagOther(self, token):
+            self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+
+        def anythingElse(self):
+            self.tree.insertElement(impliedTagToken("body", "StartTag"))
+            self.parser.phase = self.parser.phases["inBody"]
+            self.parser.framesetOK = True
+
+    class InBodyPhase(Phase):
+        # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody
+        # the really-really-really-very crazy mode
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+            # Set this to the default handler
+            self.processSpaceCharacters = self.processSpaceCharactersNonPre
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                (("base", "basefont", "bgsound", "command", "link", "meta",
+                  "script", "style", "title"),
+                 self.startTagProcessInHead),
+                ("body", self.startTagBody),
+                ("frameset", self.startTagFrameset),
+                (("address", "article", "aside", "blockquote", "center", "details",
+                  "dir", "div", "dl", "fieldset", "figcaption", "figure",
+                  "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p",
+                  "section", "summary", "ul"),
+                 self.startTagCloseP),
+                (headingElements, self.startTagHeading),
+                (("pre", "listing"), self.startTagPreListing),
+                ("form", self.startTagForm),
+                (("li", "dd", "dt"), self.startTagListItem),
+                ("plaintext", self.startTagPlaintext),
+                ("a", self.startTagA),
+                (("b", "big", "code", "em", "font", "i", "s", "small", "strike",
+                  "strong", "tt", "u"), self.startTagFormatting),
+                ("nobr", self.startTagNobr),
+                ("button", self.startTagButton),
+                (("applet", "marquee", "object"), self.startTagAppletMarqueeObject),
+                ("xmp", self.startTagXmp),
+                ("table", self.startTagTable),
+                (("area", "br", "embed", "img", "keygen", "wbr"),
+                 self.startTagVoidFormatting),
+                (("param", "source", "track"), self.startTagParamSource),
+                ("input", self.startTagInput),
+                ("hr", self.startTagHr),
+                ("image", self.startTagImage),
+                ("isindex", self.startTagIsIndex),
+                ("textarea", self.startTagTextarea),
+                ("iframe", self.startTagIFrame),
+                ("noscript", self.startTagNoscript),
+                (("noembed", "noframes"), self.startTagRawtext),
+                ("select", self.startTagSelect),
+                (("rp", "rt"), self.startTagRpRt),
+                (("option", "optgroup"), self.startTagOpt),
+                (("math"), self.startTagMath),
+                (("svg"), self.startTagSvg),
+                (("caption", "col", "colgroup", "frame", "head",
+                  "tbody", "td", "tfoot", "th", "thead",
+                  "tr"), self.startTagMisplaced)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+            self.endTagHandler = _utils.MethodDispatcher([
+                ("body", self.endTagBody),
+                ("html", self.endTagHtml),
+                (("address", "article", "aside", "blockquote", "button", "center",
+                  "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure",
+                  "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre",
+                  "section", "summary", "ul"), self.endTagBlock),
+                ("form", self.endTagForm),
+                ("p", self.endTagP),
+                (("dd", "dt", "li"), self.endTagListItem),
+                (headingElements, self.endTagHeading),
+                (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small",
+                  "strike", "strong", "tt", "u"), self.endTagFormatting),
+                (("applet", "marquee", "object"), self.endTagAppletMarqueeObject),
+                ("br", self.endTagBr),
+            ])
+            self.endTagHandler.default = self.endTagOther
+
+        def isMatchingFormattingElement(self, node1, node2):
+            return (node1.name == node2.name and
+                    node1.namespace == node2.namespace and
+                    node1.attributes == node2.attributes)
+
+        # helper
+        def addFormattingElement(self, token):
+            self.tree.insertElement(token)
+            element = self.tree.openElements[-1]
+
+            matchingElements = []
+            for node in self.tree.activeFormattingElements[::-1]:
+                if node is Marker:
+                    break
+                elif self.isMatchingFormattingElement(node, element):
+                    matchingElements.append(node)
+
+            assert len(matchingElements) <= 3
+            if len(matchingElements) == 3:
+                self.tree.activeFormattingElements.remove(matchingElements[-1])
+            self.tree.activeFormattingElements.append(element)
+
+        # the real deal
+        def processEOF(self):
+            allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td",
+                                          "tfoot", "th", "thead", "tr", "body",
+                                          "html"))
+            for node in self.tree.openElements[::-1]:
+                if node.name not in allowed_elements:
+                    self.parser.parseError("expected-closing-tag-but-got-eof")
+                    break
+            # Stop parsing
+
+        def processSpaceCharactersDropNewline(self, token):
+            # Sometimes (start of <pre>, <listing>, and <textarea> blocks) we
+            # want to drop leading newlines
+            data = token["data"]
+            self.processSpaceCharacters = self.processSpaceCharactersNonPre
+            if (data.startswith("\n") and
+                self.tree.openElements[-1].name in ("pre", "listing", "textarea") and
+                    not self.tree.openElements[-1].hasContent()):
+                data = data[1:]
+            if data:
+                self.tree.reconstructActiveFormattingElements()
+                self.tree.insertText(data)
+
+        def processCharacters(self, token):
+            if token["data"] == "\u0000":
+                # The tokenizer should always emit null on its own
+                return
+            self.tree.reconstructActiveFormattingElements()
+            self.tree.insertText(token["data"])
+            # This must be bad for performance
+            if (self.parser.framesetOK and
+                any([char not in spaceCharacters
+                     for char in token["data"]])):
+                self.parser.framesetOK = False
+
+        def processSpaceCharactersNonPre(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            self.tree.insertText(token["data"])
+
+        def startTagProcessInHead(self, token):
+            return self.parser.phases["inHead"].processStartTag(token)
+
+        def startTagBody(self, token):
+            self.parser.parseError("unexpected-start-tag", {"name": "body"})
+            if (len(self.tree.openElements) == 1 or
+                    self.tree.openElements[1].name != "body"):
+                assert self.parser.innerHTML
+            else:
+                self.parser.framesetOK = False
+                for attr, value in token["data"].items():
+                    if attr not in self.tree.openElements[1].attributes:
+                        self.tree.openElements[1].attributes[attr] = value
+
+        def startTagFrameset(self, token):
+            self.parser.parseError("unexpected-start-tag", {"name": "frameset"})
+            if (len(self.tree.openElements) == 1 or self.tree.openElements[1].name != "body"):
+                assert self.parser.innerHTML
+            elif not self.parser.framesetOK:
+                pass
+            else:
+                if self.tree.openElements[1].parent:
+                    self.tree.openElements[1].parent.removeChild(self.tree.openElements[1])
+                while self.tree.openElements[-1].name != "html":
+                    self.tree.openElements.pop()
+                self.tree.insertElement(token)
+                self.parser.phase = self.parser.phases["inFrameset"]
+
+        def startTagCloseP(self, token):
+            if self.tree.elementInScope("p", variant="button"):
+                self.endTagP(impliedTagToken("p"))
+            self.tree.insertElement(token)
+
+        def startTagPreListing(self, token):
+            if self.tree.elementInScope("p", variant="button"):
+                self.endTagP(impliedTagToken("p"))
+            self.tree.insertElement(token)
+            self.parser.framesetOK = False
+            self.processSpaceCharacters = self.processSpaceCharactersDropNewline
+
+        def startTagForm(self, token):
+            if self.tree.formPointer:
+                self.parser.parseError("unexpected-start-tag", {"name": "form"})
+            else:
+                if self.tree.elementInScope("p", variant="button"):
+                    self.endTagP(impliedTagToken("p"))
+                self.tree.insertElement(token)
+                self.tree.formPointer = self.tree.openElements[-1]
+
+        def startTagListItem(self, token):
+            self.parser.framesetOK = False
+
+            stopNamesMap = {"li": ["li"],
+                            "dt": ["dt", "dd"],
+                            "dd": ["dt", "dd"]}
+            stopNames = stopNamesMap[token["name"]]
+            for node in reversed(self.tree.openElements):
+                if node.name in stopNames:
+                    self.parser.phase.processEndTag(
+                        impliedTagToken(node.name, "EndTag"))
+                    break
+                if (node.nameTuple in specialElements and
+                        node.name not in ("address", "div", "p")):
+                    break
+
+            if self.tree.elementInScope("p", variant="button"):
+                self.parser.phase.processEndTag(
+                    impliedTagToken("p", "EndTag"))
+
+            self.tree.insertElement(token)
+
+        def startTagPlaintext(self, token):
+            if self.tree.elementInScope("p", variant="button"):
+                self.endTagP(impliedTagToken("p"))
+            self.tree.insertElement(token)
+            self.parser.tokenizer.state = self.parser.tokenizer.plaintextState
+
+        def startTagHeading(self, token):
+            if self.tree.elementInScope("p", variant="button"):
+                self.endTagP(impliedTagToken("p"))
+            if self.tree.openElements[-1].name in headingElements:
+                self.parser.parseError("unexpected-start-tag", {"name": token["name"]})
+                self.tree.openElements.pop()
+            self.tree.insertElement(token)
+
+        def startTagA(self, token):
+            afeAElement = self.tree.elementInActiveFormattingElements("a")
+            if afeAElement:
+                self.parser.parseError("unexpected-start-tag-implies-end-tag",
+                                       {"startName": "a", "endName": "a"})
+                self.endTagFormatting(impliedTagToken("a"))
+                if afeAElement in self.tree.openElements:
+                    self.tree.openElements.remove(afeAElement)
+                if afeAElement in self.tree.activeFormattingElements:
+                    self.tree.activeFormattingElements.remove(afeAElement)
+            self.tree.reconstructActiveFormattingElements()
+            self.addFormattingElement(token)
+
+        def startTagFormatting(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            self.addFormattingElement(token)
+
+        def startTagNobr(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            if self.tree.elementInScope("nobr"):
+                self.parser.parseError("unexpected-start-tag-implies-end-tag",
+                                       {"startName": "nobr", "endName": "nobr"})
+                self.processEndTag(impliedTagToken("nobr"))
+                # XXX Need tests that trigger the following
+                self.tree.reconstructActiveFormattingElements()
+            self.addFormattingElement(token)
+
+        def startTagButton(self, token):
+            if self.tree.elementInScope("button"):
+                self.parser.parseError("unexpected-start-tag-implies-end-tag",
+                                       {"startName": "button", "endName": "button"})
+                self.processEndTag(impliedTagToken("button"))
+                return token
+            else:
+                self.tree.reconstructActiveFormattingElements()
+                self.tree.insertElement(token)
+                self.parser.framesetOK = False
+
+        def startTagAppletMarqueeObject(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            self.tree.insertElement(token)
+            self.tree.activeFormattingElements.append(Marker)
+            self.parser.framesetOK = False
+
+        def startTagXmp(self, token):
+            if self.tree.elementInScope("p", variant="button"):
+                self.endTagP(impliedTagToken("p"))
+            self.tree.reconstructActiveFormattingElements()
+            self.parser.framesetOK = False
+            self.parser.parseRCDataRawtext(token, "RAWTEXT")
+
+        def startTagTable(self, token):
+            if self.parser.compatMode != "quirks":
+                if self.tree.elementInScope("p", variant="button"):
+                    self.processEndTag(impliedTagToken("p"))
+            self.tree.insertElement(token)
+            self.parser.framesetOK = False
+            self.parser.phase = self.parser.phases["inTable"]
+
+        def startTagVoidFormatting(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            self.tree.insertElement(token)
+            self.tree.openElements.pop()
+            token["selfClosingAcknowledged"] = True
+            self.parser.framesetOK = False
+
+        def startTagInput(self, token):
+            framesetOK = self.parser.framesetOK
+            self.startTagVoidFormatting(token)
+            if ("type" in token["data"] and
+                    token["data"]["type"].translate(asciiUpper2Lower) == "hidden"):
+                # input type=hidden doesn't change framesetOK
+                self.parser.framesetOK = framesetOK
+
+        def startTagParamSource(self, token):
+            self.tree.insertElement(token)
+            self.tree.openElements.pop()
+            token["selfClosingAcknowledged"] = True
+
+        def startTagHr(self, token):
+            if self.tree.elementInScope("p", variant="button"):
+                self.endTagP(impliedTagToken("p"))
+            self.tree.insertElement(token)
+            self.tree.openElements.pop()
+            token["selfClosingAcknowledged"] = True
+            self.parser.framesetOK = False
+
+        def startTagImage(self, token):
+            # No really...
+            self.parser.parseError("unexpected-start-tag-treated-as",
+                                   {"originalName": "image", "newName": "img"})
+            self.processStartTag(impliedTagToken("img", "StartTag",
+                                                 attributes=token["data"],
+                                                 selfClosing=token["selfClosing"]))
+
+        def startTagIsIndex(self, token):
+            self.parser.parseError("deprecated-tag", {"name": "isindex"})
+            if self.tree.formPointer:
+                return
+            form_attrs = {}
+            if "action" in token["data"]:
+                form_attrs["action"] = token["data"]["action"]
+            self.processStartTag(impliedTagToken("form", "StartTag",
+                                                 attributes=form_attrs))
+            self.processStartTag(impliedTagToken("hr", "StartTag"))
+            self.processStartTag(impliedTagToken("label", "StartTag"))
+            # XXX Localization ...
+            if "prompt" in token["data"]:
+                prompt = token["data"]["prompt"]
+            else:
+                prompt = "This is a searchable index. Enter search keywords: "
+            self.processCharacters(
+                {"type": tokenTypes["Characters"], "data": prompt})
+            attributes = token["data"].copy()
+            if "action" in attributes:
+                del attributes["action"]
+            if "prompt" in attributes:
+                del attributes["prompt"]
+            attributes["name"] = "isindex"
+            self.processStartTag(impliedTagToken("input", "StartTag",
+                                                 attributes=attributes,
+                                                 selfClosing=token["selfClosing"]))
+            self.processEndTag(impliedTagToken("label"))
+            self.processStartTag(impliedTagToken("hr", "StartTag"))
+            self.processEndTag(impliedTagToken("form"))
+
+        def startTagTextarea(self, token):
+            self.tree.insertElement(token)
+            self.parser.tokenizer.state = self.parser.tokenizer.rcdataState
+            self.processSpaceCharacters = self.processSpaceCharactersDropNewline
+            self.parser.framesetOK = False
+
+        def startTagIFrame(self, token):
+            self.parser.framesetOK = False
+            self.startTagRawtext(token)
+
+        def startTagNoscript(self, token):
+            if self.parser.scripting:
+                self.startTagRawtext(token)
+            else:
+                self.startTagOther(token)
+
+        def startTagRawtext(self, token):
+            """iframe, noembed noframes, noscript(if scripting enabled)"""
+            self.parser.parseRCDataRawtext(token, "RAWTEXT")
+
+        def startTagOpt(self, token):
+            if self.tree.openElements[-1].name == "option":
+                self.parser.phase.processEndTag(impliedTagToken("option"))
+            self.tree.reconstructActiveFormattingElements()
+            self.parser.tree.insertElement(token)
+
+        def startTagSelect(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            self.tree.insertElement(token)
+            self.parser.framesetOK = False
+            if self.parser.phase in (self.parser.phases["inTable"],
+                                     self.parser.phases["inCaption"],
+                                     self.parser.phases["inColumnGroup"],
+                                     self.parser.phases["inTableBody"],
+                                     self.parser.phases["inRow"],
+                                     self.parser.phases["inCell"]):
+                self.parser.phase = self.parser.phases["inSelectInTable"]
+            else:
+                self.parser.phase = self.parser.phases["inSelect"]
+
+        def startTagRpRt(self, token):
+            if self.tree.elementInScope("ruby"):
+                self.tree.generateImpliedEndTags()
+                if self.tree.openElements[-1].name != "ruby":
+                    self.parser.parseError()
+            self.tree.insertElement(token)
+
+        def startTagMath(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            self.parser.adjustMathMLAttributes(token)
+            self.parser.adjustForeignAttributes(token)
+            token["namespace"] = namespaces["mathml"]
+            self.tree.insertElement(token)
+            # Need to get the parse error right for the case where the token
+            # has a namespace not equal to the xmlns attribute
+            if token["selfClosing"]:
+                self.tree.openElements.pop()
+                token["selfClosingAcknowledged"] = True
+
+        def startTagSvg(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            self.parser.adjustSVGAttributes(token)
+            self.parser.adjustForeignAttributes(token)
+            token["namespace"] = namespaces["svg"]
+            self.tree.insertElement(token)
+            # Need to get the parse error right for the case where the token
+            # has a namespace not equal to the xmlns attribute
+            if token["selfClosing"]:
+                self.tree.openElements.pop()
+                token["selfClosingAcknowledged"] = True
+
+        def startTagMisplaced(self, token):
+            """ Elements that should be children of other elements that have a
+            different insertion mode; here they are ignored
+            "caption", "col", "colgroup", "frame", "frameset", "head",
+            "option", "optgroup", "tbody", "td", "tfoot", "th", "thead",
+            "tr", "noscript"
+            """
+            self.parser.parseError("unexpected-start-tag-ignored", {"name": token["name"]})
+
+        def startTagOther(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            self.tree.insertElement(token)
+
+        def endTagP(self, token):
+            if not self.tree.elementInScope("p", variant="button"):
+                self.startTagCloseP(impliedTagToken("p", "StartTag"))
+                self.parser.parseError("unexpected-end-tag", {"name": "p"})
+                self.endTagP(impliedTagToken("p", "EndTag"))
+            else:
+                self.tree.generateImpliedEndTags("p")
+                if self.tree.openElements[-1].name != "p":
+                    self.parser.parseError("unexpected-end-tag", {"name": "p"})
+                node = self.tree.openElements.pop()
+                while node.name != "p":
+                    node = self.tree.openElements.pop()
+
+        def endTagBody(self, token):
+            if not self.tree.elementInScope("body"):
+                self.parser.parseError()
+                return
+            elif self.tree.openElements[-1].name != "body":
+                for node in self.tree.openElements[2:]:
+                    if node.name not in frozenset(("dd", "dt", "li", "optgroup",
+                                                   "option", "p", "rp", "rt",
+                                                   "tbody", "td", "tfoot",
+                                                   "th", "thead", "tr", "body",
+                                                   "html")):
+                        # Not sure this is the correct name for the parse error
+                        self.parser.parseError(
+                            "expected-one-end-tag-but-got-another",
+                            {"gotName": "body", "expectedName": node.name})
+                        break
+            self.parser.phase = self.parser.phases["afterBody"]
+
+        def endTagHtml(self, token):
+            # We repeat the test for the body end tag token being ignored here
+            if self.tree.elementInScope("body"):
+                self.endTagBody(impliedTagToken("body"))
+                return token
+
+        def endTagBlock(self, token):
+            # Put us back in the right whitespace handling mode
+            if token["name"] == "pre":
+                self.processSpaceCharacters = self.processSpaceCharactersNonPre
+            inScope = self.tree.elementInScope(token["name"])
+            if inScope:
+                self.tree.generateImpliedEndTags()
+            if self.tree.openElements[-1].name != token["name"]:
+                self.parser.parseError("end-tag-too-early", {"name": token["name"]})
+            if inScope:
+                node = self.tree.openElements.pop()
+                while node.name != token["name"]:
+                    node = self.tree.openElements.pop()
+
+        def endTagForm(self, token):
+            node = self.tree.formPointer
+            self.tree.formPointer = None
+            if node is None or not self.tree.elementInScope(node):
+                self.parser.parseError("unexpected-end-tag",
+                                       {"name": "form"})
+            else:
+                self.tree.generateImpliedEndTags()
+                if self.tree.openElements[-1] != node:
+                    self.parser.parseError("end-tag-too-early-ignored",
+                                           {"name": "form"})
+                self.tree.openElements.remove(node)
+
+        def endTagListItem(self, token):
+            if token["name"] == "li":
+                variant = "list"
+            else:
+                variant = None
+            if not self.tree.elementInScope(token["name"], variant=variant):
+                self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+            else:
+                self.tree.generateImpliedEndTags(exclude=token["name"])
+                if self.tree.openElements[-1].name != token["name"]:
+                    self.parser.parseError(
+                        "end-tag-too-early",
+                        {"name": token["name"]})
+                node = self.tree.openElements.pop()
+                while node.name != token["name"]:
+                    node = self.tree.openElements.pop()
+
+        def endTagHeading(self, token):
+            for item in headingElements:
+                if self.tree.elementInScope(item):
+                    self.tree.generateImpliedEndTags()
+                    break
+            if self.tree.openElements[-1].name != token["name"]:
+                self.parser.parseError("end-tag-too-early", {"name": token["name"]})
+
+            for item in headingElements:
+                if self.tree.elementInScope(item):
+                    item = self.tree.openElements.pop()
+                    while item.name not in headingElements:
+                        item = self.tree.openElements.pop()
+                    break
+
+        def endTagFormatting(self, token):
+            """The much-feared adoption agency algorithm"""
+            # http://svn.whatwg.org/webapps/complete.html#adoptionAgency revision 7867
+            # XXX Better parseError messages appreciated.
+
+            # Step 1
+            outerLoopCounter = 0
+
+            # Step 2
+            while outerLoopCounter < 8:
+
+                # Step 3
+                outerLoopCounter += 1
+
+                # Step 4:
+
+                # Let the formatting element be the last element in
+                # the list of active formatting elements that:
+                # - is between the end of the list and the last scope
+                # marker in the list, if any, or the start of the list
+                # otherwise, and
+                # - has the same tag name as the token.
+                formattingElement = self.tree.elementInActiveFormattingElements(
+                    token["name"])
+                if (not formattingElement or
+                    (formattingElement in self.tree.openElements and
+                     not self.tree.elementInScope(formattingElement.name))):
+                    # If there is no such node, then abort these steps
+                    # and instead act as described in the "any other
+                    # end tag" entry below.
+                    self.endTagOther(token)
+                    return
+
+                # Otherwise, if there is such a node, but that node is
+                # not in the stack of open elements, then this is a
+                # parse error; remove the element from the list, and
+                # abort these steps.
+                elif formattingElement not in self.tree.openElements:
+                    self.parser.parseError("adoption-agency-1.2", {"name": token["name"]})
+                    self.tree.activeFormattingElements.remove(formattingElement)
+                    return
+
+                # Otherwise, if there is such a node, and that node is
+                # also in the stack of open elements, but the element
+                # is not in scope, then this is a parse error; ignore
+                # the token, and abort these steps.
+                elif not self.tree.elementInScope(formattingElement.name):
+                    self.parser.parseError("adoption-agency-4.4", {"name": token["name"]})
+                    return
+
+                # Otherwise, there is a formatting element and that
+                # element is in the stack and is in scope. If the
+                # element is not the current node, this is a parse
+                # error. In any case, proceed with the algorithm as
+                # written in the following steps.
+                else:
+                    if formattingElement != self.tree.openElements[-1]:
+                        self.parser.parseError("adoption-agency-1.3", {"name": token["name"]})
+
+                # Step 5:
+
+                # Let the furthest block be the topmost node in the
+                # stack of open elements that is lower in the stack
+                # than the formatting element, and is an element in
+                # the special category. There might not be one.
+                afeIndex = self.tree.openElements.index(formattingElement)
+                furthestBlock = None
+                for element in self.tree.openElements[afeIndex:]:
+                    if element.nameTuple in specialElements:
+                        furthestBlock = element
+                        break
+
+                # Step 6:
+
+                # If there is no furthest block, then the UA must
+                # first pop all the nodes from the bottom of the stack
+                # of open elements, from the current node up to and
+                # including the formatting element, then remove the
+                # formatting element from the list of active
+                # formatting elements, and finally abort these steps.
+                if furthestBlock is None:
+                    element = self.tree.openElements.pop()
+                    while element != formattingElement:
+                        element = self.tree.openElements.pop()
+                    self.tree.activeFormattingElements.remove(element)
+                    return
+
+                # Step 7
+                commonAncestor = self.tree.openElements[afeIndex - 1]
+
+                # Step 8:
+                # The bookmark is supposed to help us identify where to reinsert
+                # nodes in step 15. We have to ensure that we reinsert nodes after
+                # the node before the active formatting element. Note the bookmark
+                # can move in step 9.7
+                bookmark = self.tree.activeFormattingElements.index(formattingElement)
+
+                # Step 9
+                lastNode = node = furthestBlock
+                innerLoopCounter = 0
+
+                index = self.tree.openElements.index(node)
+                while innerLoopCounter < 3:
+                    innerLoopCounter += 1
+                    # Node is element before node in open elements
+                    index -= 1
+                    node = self.tree.openElements[index]
+                    if node not in self.tree.activeFormattingElements:
+                        self.tree.openElements.remove(node)
+                        continue
+                    # Step 9.6
+                    if node == formattingElement:
+                        break
+                    # Step 9.7
+                    if lastNode == furthestBlock:
+                        bookmark = self.tree.activeFormattingElements.index(node) + 1
+                    # Step 9.8
+                    clone = node.cloneNode()
+                    # Replace node with clone
+                    self.tree.activeFormattingElements[
+                        self.tree.activeFormattingElements.index(node)] = clone
+                    self.tree.openElements[
+                        self.tree.openElements.index(node)] = clone
+                    node = clone
+                    # Step 9.9
+                    # Remove lastNode from its parents, if any
+                    if lastNode.parent:
+                        lastNode.parent.removeChild(lastNode)
+                    node.appendChild(lastNode)
+                    # Step 9.10
+                    lastNode = node
+
+                # Step 10
+                # Foster parent lastNode if commonAncestor is a
+                # table, tbody, tfoot, thead, or tr we need to foster
+                # parent the lastNode
+                if lastNode.parent:
+                    lastNode.parent.removeChild(lastNode)
+
+                if commonAncestor.name in frozenset(("table", "tbody", "tfoot", "thead", "tr")):
+                    parent, insertBefore = self.tree.getTableMisnestedNodePosition()
+                    parent.insertBefore(lastNode, insertBefore)
+                else:
+                    commonAncestor.appendChild(lastNode)
+
+                # Step 11
+                clone = formattingElement.cloneNode()
+
+                # Step 12
+                furthestBlock.reparentChildren(clone)
+
+                # Step 13
+                furthestBlock.appendChild(clone)
+
+                # Step 14
+                self.tree.activeFormattingElements.remove(formattingElement)
+                self.tree.activeFormattingElements.insert(bookmark, clone)
+
+                # Step 15
+                self.tree.openElements.remove(formattingElement)
+                self.tree.openElements.insert(
+                    self.tree.openElements.index(furthestBlock) + 1, clone)
+
+        def endTagAppletMarqueeObject(self, token):
+            if self.tree.elementInScope(token["name"]):
+                self.tree.generateImpliedEndTags()
+            if self.tree.openElements[-1].name != token["name"]:
+                self.parser.parseError("end-tag-too-early", {"name": token["name"]})
+
+            if self.tree.elementInScope(token["name"]):
+                element = self.tree.openElements.pop()
+                while element.name != token["name"]:
+                    element = self.tree.openElements.pop()
+                self.tree.clearActiveFormattingElements()
+
+        def endTagBr(self, token):
+            self.parser.parseError("unexpected-end-tag-treated-as",
+                                   {"originalName": "br", "newName": "br element"})
+            self.tree.reconstructActiveFormattingElements()
+            self.tree.insertElement(impliedTagToken("br", "StartTag"))
+            self.tree.openElements.pop()
+
+        def endTagOther(self, token):
+            for node in self.tree.openElements[::-1]:
+                if node.name == token["name"]:
+                    self.tree.generateImpliedEndTags(exclude=token["name"])
+                    if self.tree.openElements[-1].name != token["name"]:
+                        self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+                    while self.tree.openElements.pop() != node:
+                        pass
+                    break
+                else:
+                    if node.nameTuple in specialElements:
+                        self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+                        break
+
+    class TextPhase(Phase):
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+            self.startTagHandler = _utils.MethodDispatcher([])
+            self.startTagHandler.default = self.startTagOther
+            self.endTagHandler = _utils.MethodDispatcher([
+                ("script", self.endTagScript)])
+            self.endTagHandler.default = self.endTagOther
+
+        def processCharacters(self, token):
+            self.tree.insertText(token["data"])
+
+        def processEOF(self):
+            self.parser.parseError("expected-named-closing-tag-but-got-eof",
+                                   {"name": self.tree.openElements[-1].name})
+            self.tree.openElements.pop()
+            self.parser.phase = self.parser.originalPhase
+            return True
+
+        def startTagOther(self, token):
+            assert False, "Tried to process start tag %s in RCDATA/RAWTEXT mode" % token['name']
+
+        def endTagScript(self, token):
+            node = self.tree.openElements.pop()
+            assert node.name == "script"
+            self.parser.phase = self.parser.originalPhase
+            # The rest of this method is all stuff that only happens if
+            # document.write works
+
+        def endTagOther(self, token):
+            self.tree.openElements.pop()
+            self.parser.phase = self.parser.originalPhase
+
+    class InTablePhase(Phase):
+        # http://www.whatwg.org/specs/web-apps/current-work/#in-table
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                ("caption", self.startTagCaption),
+                ("colgroup", self.startTagColgroup),
+                ("col", self.startTagCol),
+                (("tbody", "tfoot", "thead"), self.startTagRowGroup),
+                (("td", "th", "tr"), self.startTagImplyTbody),
+                ("table", self.startTagTable),
+                (("style", "script"), self.startTagStyleScript),
+                ("input", self.startTagInput),
+                ("form", self.startTagForm)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+            self.endTagHandler = _utils.MethodDispatcher([
+                ("table", self.endTagTable),
+                (("body", "caption", "col", "colgroup", "html", "tbody", "td",
+                  "tfoot", "th", "thead", "tr"), self.endTagIgnore)
+            ])
+            self.endTagHandler.default = self.endTagOther
+
+        # helper methods
+        def clearStackToTableContext(self):
+            # "clear the stack back to a table context"
+            while self.tree.openElements[-1].name not in ("table", "html"):
+                # self.parser.parseError("unexpected-implied-end-tag-in-table",
+                #  {"name":  self.tree.openElements[-1].name})
+                self.tree.openElements.pop()
+            # When the current node is <html> it's an innerHTML case
+
+        # processing methods
+        def processEOF(self):
+            if self.tree.openElements[-1].name != "html":
+                self.parser.parseError("eof-in-table")
+            else:
+                assert self.parser.innerHTML
+            # Stop parsing
+
+        def processSpaceCharacters(self, token):
+            originalPhase = self.parser.phase
+            self.parser.phase = self.parser.phases["inTableText"]
+            self.parser.phase.originalPhase = originalPhase
+            self.parser.phase.processSpaceCharacters(token)
+
+        def processCharacters(self, token):
+            originalPhase = self.parser.phase
+            self.parser.phase = self.parser.phases["inTableText"]
+            self.parser.phase.originalPhase = originalPhase
+            self.parser.phase.processCharacters(token)
+
+        def insertText(self, token):
+            # If we get here there must be at least one non-whitespace character
+            # Do the table magic!
+            self.tree.insertFromTable = True
+            self.parser.phases["inBody"].processCharacters(token)
+            self.tree.insertFromTable = False
+
+        def startTagCaption(self, token):
+            self.clearStackToTableContext()
+            self.tree.activeFormattingElements.append(Marker)
+            self.tree.insertElement(token)
+            self.parser.phase = self.parser.phases["inCaption"]
+
+        def startTagColgroup(self, token):
+            self.clearStackToTableContext()
+            self.tree.insertElement(token)
+            self.parser.phase = self.parser.phases["inColumnGroup"]
+
+        def startTagCol(self, token):
+            self.startTagColgroup(impliedTagToken("colgroup", "StartTag"))
+            return token
+
+        def startTagRowGroup(self, token):
+            self.clearStackToTableContext()
+            self.tree.insertElement(token)
+            self.parser.phase = self.parser.phases["inTableBody"]
+
+        def startTagImplyTbody(self, token):
+            self.startTagRowGroup(impliedTagToken("tbody", "StartTag"))
+            return token
+
+        def startTagTable(self, token):
+            self.parser.parseError("unexpected-start-tag-implies-end-tag",
+                                   {"startName": "table", "endName": "table"})
+            self.parser.phase.processEndTag(impliedTagToken("table"))
+            if not self.parser.innerHTML:
+                return token
+
+        def startTagStyleScript(self, token):
+            return self.parser.phases["inHead"].processStartTag(token)
+
+        def startTagInput(self, token):
+            if ("type" in token["data"] and
+                    token["data"]["type"].translate(asciiUpper2Lower) == "hidden"):
+                self.parser.parseError("unexpected-hidden-input-in-table")
+                self.tree.insertElement(token)
+                # XXX associate with form
+                self.tree.openElements.pop()
+            else:
+                self.startTagOther(token)
+
+        def startTagForm(self, token):
+            self.parser.parseError("unexpected-form-in-table")
+            if self.tree.formPointer is None:
+                self.tree.insertElement(token)
+                self.tree.formPointer = self.tree.openElements[-1]
+                self.tree.openElements.pop()
+
+        def startTagOther(self, token):
+            self.parser.parseError("unexpected-start-tag-implies-table-voodoo", {"name": token["name"]})
+            # Do the table magic!
+            self.tree.insertFromTable = True
+            self.parser.phases["inBody"].processStartTag(token)
+            self.tree.insertFromTable = False
+
+        def endTagTable(self, token):
+            if self.tree.elementInScope("table", variant="table"):
+                self.tree.generateImpliedEndTags()
+                if self.tree.openElements[-1].name != "table":
+                    self.parser.parseError("end-tag-too-early-named",
+                                           {"gotName": "table",
+                                            "expectedName": self.tree.openElements[-1].name})
+                while self.tree.openElements[-1].name != "table":
+                    self.tree.openElements.pop()
+                self.tree.openElements.pop()
+                self.parser.resetInsertionMode()
+            else:
+                # innerHTML case
+                assert self.parser.innerHTML
+                self.parser.parseError()
+
+        def endTagIgnore(self, token):
+            self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+
+        def endTagOther(self, token):
+            self.parser.parseError("unexpected-end-tag-implies-table-voodoo", {"name": token["name"]})
+            # Do the table magic!
+            self.tree.insertFromTable = True
+            self.parser.phases["inBody"].processEndTag(token)
+            self.tree.insertFromTable = False
+
+    class InTableTextPhase(Phase):
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+            self.originalPhase = None
+            self.characterTokens = []
+
+        def flushCharacters(self):
+            data = "".join([item["data"] for item in self.characterTokens])
+            if any([item not in spaceCharacters for item in data]):
+                token = {"type": tokenTypes["Characters"], "data": data}
+                self.parser.phases["inTable"].insertText(token)
+            elif data:
+                self.tree.insertText(data)
+            self.characterTokens = []
+
+        def processComment(self, token):
+            self.flushCharacters()
+            self.parser.phase = self.originalPhase
+            return token
+
+        def processEOF(self):
+            self.flushCharacters()
+            self.parser.phase = self.originalPhase
+            return True
+
+        def processCharacters(self, token):
+            if token["data"] == "\u0000":
+                return
+            self.characterTokens.append(token)
+
+        def processSpaceCharacters(self, token):
+            # pretty sure we should never reach here
+            self.characterTokens.append(token)
+    #        assert False
+
+        def processStartTag(self, token):
+            self.flushCharacters()
+            self.parser.phase = self.originalPhase
+            return token
+
+        def processEndTag(self, token):
+            self.flushCharacters()
+            self.parser.phase = self.originalPhase
+            return token
+
+    class InCaptionPhase(Phase):
+        # http://www.whatwg.org/specs/web-apps/current-work/#in-caption
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th",
+                  "thead", "tr"), self.startTagTableElement)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+            self.endTagHandler = _utils.MethodDispatcher([
+                ("caption", self.endTagCaption),
+                ("table", self.endTagTable),
+                (("body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th",
+                  "thead", "tr"), self.endTagIgnore)
+            ])
+            self.endTagHandler.default = self.endTagOther
+
+        def ignoreEndTagCaption(self):
+            return not self.tree.elementInScope("caption", variant="table")
+
+        def processEOF(self):
+            self.parser.phases["inBody"].processEOF()
+
+        def processCharacters(self, token):
+            return self.parser.phases["inBody"].processCharacters(token)
+
+        def startTagTableElement(self, token):
+            self.parser.parseError()
+            # XXX Have to duplicate logic here to find out if the tag is ignored
+            ignoreEndTag = self.ignoreEndTagCaption()
+            self.parser.phase.processEndTag(impliedTagToken("caption"))
+            if not ignoreEndTag:
+                return token
+
+        def startTagOther(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def endTagCaption(self, token):
+            if not self.ignoreEndTagCaption():
+                # AT this code is quite similar to endTagTable in "InTable"
+                self.tree.generateImpliedEndTags()
+                if self.tree.openElements[-1].name != "caption":
+                    self.parser.parseError("expected-one-end-tag-but-got-another",
+                                           {"gotName": "caption",
+                                            "expectedName": self.tree.openElements[-1].name})
+                while self.tree.openElements[-1].name != "caption":
+                    self.tree.openElements.pop()
+                self.tree.openElements.pop()
+                self.tree.clearActiveFormattingElements()
+                self.parser.phase = self.parser.phases["inTable"]
+            else:
+                # innerHTML case
+                assert self.parser.innerHTML
+                self.parser.parseError()
+
+        def endTagTable(self, token):
+            self.parser.parseError()
+            ignoreEndTag = self.ignoreEndTagCaption()
+            self.parser.phase.processEndTag(impliedTagToken("caption"))
+            if not ignoreEndTag:
+                return token
+
+        def endTagIgnore(self, token):
+            self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+
+        def endTagOther(self, token):
+            return self.parser.phases["inBody"].processEndTag(token)
+
+    class InColumnGroupPhase(Phase):
+        # http://www.whatwg.org/specs/web-apps/current-work/#in-column
+
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                ("col", self.startTagCol)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+            self.endTagHandler = _utils.MethodDispatcher([
+                ("colgroup", self.endTagColgroup),
+                ("col", self.endTagCol)
+            ])
+            self.endTagHandler.default = self.endTagOther
+
+        def ignoreEndTagColgroup(self):
+            return self.tree.openElements[-1].name == "html"
+
+        def processEOF(self):
+            if self.tree.openElements[-1].name == "html":
+                assert self.parser.innerHTML
+                return
+            else:
+                ignoreEndTag = self.ignoreEndTagColgroup()
+                self.endTagColgroup(impliedTagToken("colgroup"))
+                if not ignoreEndTag:
+                    return True
+
+        def processCharacters(self, token):
+            ignoreEndTag = self.ignoreEndTagColgroup()
+            self.endTagColgroup(impliedTagToken("colgroup"))
+            if not ignoreEndTag:
+                return token
+
+        def startTagCol(self, token):
+            self.tree.insertElement(token)
+            self.tree.openElements.pop()
+            token["selfClosingAcknowledged"] = True
+
+        def startTagOther(self, token):
+            ignoreEndTag = self.ignoreEndTagColgroup()
+            self.endTagColgroup(impliedTagToken("colgroup"))
+            if not ignoreEndTag:
+                return token
+
+        def endTagColgroup(self, token):
+            if self.ignoreEndTagColgroup():
+                # innerHTML case
+                assert self.parser.innerHTML
+                self.parser.parseError()
+            else:
+                self.tree.openElements.pop()
+                self.parser.phase = self.parser.phases["inTable"]
+
+        def endTagCol(self, token):
+            self.parser.parseError("no-end-tag", {"name": "col"})
+
+        def endTagOther(self, token):
+            ignoreEndTag = self.ignoreEndTagColgroup()
+            self.endTagColgroup(impliedTagToken("colgroup"))
+            if not ignoreEndTag:
+                return token
+
+    class InTableBodyPhase(Phase):
+        # http://www.whatwg.org/specs/web-apps/current-work/#in-table0
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                ("tr", self.startTagTr),
+                (("td", "th"), self.startTagTableCell),
+                (("caption", "col", "colgroup", "tbody", "tfoot", "thead"),
+                 self.startTagTableOther)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+            self.endTagHandler = _utils.MethodDispatcher([
+                (("tbody", "tfoot", "thead"), self.endTagTableRowGroup),
+                ("table", self.endTagTable),
+                (("body", "caption", "col", "colgroup", "html", "td", "th",
+                  "tr"), self.endTagIgnore)
+            ])
+            self.endTagHandler.default = self.endTagOther
+
+        # helper methods
+        def clearStackToTableBodyContext(self):
+            while self.tree.openElements[-1].name not in ("tbody", "tfoot",
+                                                          "thead", "html"):
+                # self.parser.parseError("unexpected-implied-end-tag-in-table",
+                #  {"name": self.tree.openElements[-1].name})
+                self.tree.openElements.pop()
+            if self.tree.openElements[-1].name == "html":
+                assert self.parser.innerHTML
+
+        # the rest
+        def processEOF(self):
+            self.parser.phases["inTable"].processEOF()
+
+        def processSpaceCharacters(self, token):
+            return self.parser.phases["inTable"].processSpaceCharacters(token)
+
+        def processCharacters(self, token):
+            return self.parser.phases["inTable"].processCharacters(token)
+
+        def startTagTr(self, token):
+            self.clearStackToTableBodyContext()
+            self.tree.insertElement(token)
+            self.parser.phase = self.parser.phases["inRow"]
+
+        def startTagTableCell(self, token):
+            self.parser.parseError("unexpected-cell-in-table-body",
+                                   {"name": token["name"]})
+            self.startTagTr(impliedTagToken("tr", "StartTag"))
+            return token
+
+        def startTagTableOther(self, token):
+            # XXX AT Any ideas on how to share this with endTagTable?
+            if (self.tree.elementInScope("tbody", variant="table") or
+                self.tree.elementInScope("thead", variant="table") or
+                    self.tree.elementInScope("tfoot", variant="table")):
+                self.clearStackToTableBodyContext()
+                self.endTagTableRowGroup(
+                    impliedTagToken(self.tree.openElements[-1].name))
+                return token
+            else:
+                # innerHTML case
+                assert self.parser.innerHTML
+                self.parser.parseError()
+
+        def startTagOther(self, token):
+            return self.parser.phases["inTable"].processStartTag(token)
+
+        def endTagTableRowGroup(self, token):
+            if self.tree.elementInScope(token["name"], variant="table"):
+                self.clearStackToTableBodyContext()
+                self.tree.openElements.pop()
+                self.parser.phase = self.parser.phases["inTable"]
+            else:
+                self.parser.parseError("unexpected-end-tag-in-table-body",
+                                       {"name": token["name"]})
+
+        def endTagTable(self, token):
+            if (self.tree.elementInScope("tbody", variant="table") or
+                self.tree.elementInScope("thead", variant="table") or
+                    self.tree.elementInScope("tfoot", variant="table")):
+                self.clearStackToTableBodyContext()
+                self.endTagTableRowGroup(
+                    impliedTagToken(self.tree.openElements[-1].name))
+                return token
+            else:
+                # innerHTML case
+                assert self.parser.innerHTML
+                self.parser.parseError()
+
+        def endTagIgnore(self, token):
+            self.parser.parseError("unexpected-end-tag-in-table-body",
+                                   {"name": token["name"]})
+
+        def endTagOther(self, token):
+            return self.parser.phases["inTable"].processEndTag(token)
+
+    class InRowPhase(Phase):
+        # http://www.whatwg.org/specs/web-apps/current-work/#in-row
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                (("td", "th"), self.startTagTableCell),
+                (("caption", "col", "colgroup", "tbody", "tfoot", "thead",
+                  "tr"), self.startTagTableOther)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+            self.endTagHandler = _utils.MethodDispatcher([
+                ("tr", self.endTagTr),
+                ("table", self.endTagTable),
+                (("tbody", "tfoot", "thead"), self.endTagTableRowGroup),
+                (("body", "caption", "col", "colgroup", "html", "td", "th"),
+                 self.endTagIgnore)
+            ])
+            self.endTagHandler.default = self.endTagOther
+
+        # helper methods (XXX unify this with other table helper methods)
+        def clearStackToTableRowContext(self):
+            while self.tree.openElements[-1].name not in ("tr", "html"):
+                self.parser.parseError("unexpected-implied-end-tag-in-table-row",
+                                       {"name": self.tree.openElements[-1].name})
+                self.tree.openElements.pop()
+
+        def ignoreEndTagTr(self):
+            return not self.tree.elementInScope("tr", variant="table")
+
+        # the rest
+        def processEOF(self):
+            self.parser.phases["inTable"].processEOF()
+
+        def processSpaceCharacters(self, token):
+            return self.parser.phases["inTable"].processSpaceCharacters(token)
+
+        def processCharacters(self, token):
+            return self.parser.phases["inTable"].processCharacters(token)
+
+        def startTagTableCell(self, token):
+            self.clearStackToTableRowContext()
+            self.tree.insertElement(token)
+            self.parser.phase = self.parser.phases["inCell"]
+            self.tree.activeFormattingElements.append(Marker)
+
+        def startTagTableOther(self, token):
+            ignoreEndTag = self.ignoreEndTagTr()
+            self.endTagTr(impliedTagToken("tr"))
+            # XXX how are we sure it's always ignored in the innerHTML case?
+            if not ignoreEndTag:
+                return token
+
+        def startTagOther(self, token):
+            return self.parser.phases["inTable"].processStartTag(token)
+
+        def endTagTr(self, token):
+            if not self.ignoreEndTagTr():
+                self.clearStackToTableRowContext()
+                self.tree.openElements.pop()
+                self.parser.phase = self.parser.phases["inTableBody"]
+            else:
+                # innerHTML case
+                assert self.parser.innerHTML
+                self.parser.parseError()
+
+        def endTagTable(self, token):
+            ignoreEndTag = self.ignoreEndTagTr()
+            self.endTagTr(impliedTagToken("tr"))
+            # Reprocess the current tag if the tr end tag was not ignored
+            # XXX how are we sure it's always ignored in the innerHTML case?
+            if not ignoreEndTag:
+                return token
+
+        def endTagTableRowGroup(self, token):
+            if self.tree.elementInScope(token["name"], variant="table"):
+                self.endTagTr(impliedTagToken("tr"))
+                return token
+            else:
+                self.parser.parseError()
+
+        def endTagIgnore(self, token):
+            self.parser.parseError("unexpected-end-tag-in-table-row",
+                                   {"name": token["name"]})
+
+        def endTagOther(self, token):
+            return self.parser.phases["inTable"].processEndTag(token)
+
+    class InCellPhase(Phase):
+        # http://www.whatwg.org/specs/web-apps/current-work/#in-cell
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th",
+                  "thead", "tr"), self.startTagTableOther)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+            self.endTagHandler = _utils.MethodDispatcher([
+                (("td", "th"), self.endTagTableCell),
+                (("body", "caption", "col", "colgroup", "html"), self.endTagIgnore),
+                (("table", "tbody", "tfoot", "thead", "tr"), self.endTagImply)
+            ])
+            self.endTagHandler.default = self.endTagOther
+
+        # helper
+        def closeCell(self):
+            if self.tree.elementInScope("td", variant="table"):
+                self.endTagTableCell(impliedTagToken("td"))
+            elif self.tree.elementInScope("th", variant="table"):
+                self.endTagTableCell(impliedTagToken("th"))
+
+        # the rest
+        def processEOF(self):
+            self.parser.phases["inBody"].processEOF()
+
+        def processCharacters(self, token):
+            return self.parser.phases["inBody"].processCharacters(token)
+
+        def startTagTableOther(self, token):
+            if (self.tree.elementInScope("td", variant="table") or
+                    self.tree.elementInScope("th", variant="table")):
+                self.closeCell()
+                return token
+            else:
+                # innerHTML case
+                assert self.parser.innerHTML
+                self.parser.parseError()
+
+        def startTagOther(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def endTagTableCell(self, token):
+            if self.tree.elementInScope(token["name"], variant="table"):
+                self.tree.generateImpliedEndTags(token["name"])
+                if self.tree.openElements[-1].name != token["name"]:
+                    self.parser.parseError("unexpected-cell-end-tag",
+                                           {"name": token["name"]})
+                    while True:
+                        node = self.tree.openElements.pop()
+                        if node.name == token["name"]:
+                            break
+                else:
+                    self.tree.openElements.pop()
+                self.tree.clearActiveFormattingElements()
+                self.parser.phase = self.parser.phases["inRow"]
+            else:
+                self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+
+        def endTagIgnore(self, token):
+            self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+
+        def endTagImply(self, token):
+            if self.tree.elementInScope(token["name"], variant="table"):
+                self.closeCell()
+                return token
+            else:
+                # sometimes innerHTML case
+                self.parser.parseError()
+
+        def endTagOther(self, token):
+            return self.parser.phases["inBody"].processEndTag(token)
+
+    class InSelectPhase(Phase):
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                ("option", self.startTagOption),
+                ("optgroup", self.startTagOptgroup),
+                ("select", self.startTagSelect),
+                (("input", "keygen", "textarea"), self.startTagInput),
+                ("script", self.startTagScript)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+            self.endTagHandler = _utils.MethodDispatcher([
+                ("option", self.endTagOption),
+                ("optgroup", self.endTagOptgroup),
+                ("select", self.endTagSelect)
+            ])
+            self.endTagHandler.default = self.endTagOther
+
+        # http://www.whatwg.org/specs/web-apps/current-work/#in-select
+        def processEOF(self):
+            if self.tree.openElements[-1].name != "html":
+                self.parser.parseError("eof-in-select")
+            else:
+                assert self.parser.innerHTML
+
+        def processCharacters(self, token):
+            if token["data"] == "\u0000":
+                return
+            self.tree.insertText(token["data"])
+
+        def startTagOption(self, token):
+            # We need to imply </option> if <option> is the current node.
+            if self.tree.openElements[-1].name == "option":
+                self.tree.openElements.pop()
+            self.tree.insertElement(token)
+
+        def startTagOptgroup(self, token):
+            if self.tree.openElements[-1].name == "option":
+                self.tree.openElements.pop()
+            if self.tree.openElements[-1].name == "optgroup":
+                self.tree.openElements.pop()
+            self.tree.insertElement(token)
+
+        def startTagSelect(self, token):
+            self.parser.parseError("unexpected-select-in-select")
+            self.endTagSelect(impliedTagToken("select"))
+
+        def startTagInput(self, token):
+            self.parser.parseError("unexpected-input-in-select")
+            if self.tree.elementInScope("select", variant="select"):
+                self.endTagSelect(impliedTagToken("select"))
+                return token
+            else:
+                assert self.parser.innerHTML
+
+        def startTagScript(self, token):
+            return self.parser.phases["inHead"].processStartTag(token)
+
+        def startTagOther(self, token):
+            self.parser.parseError("unexpected-start-tag-in-select",
+                                   {"name": token["name"]})
+
+        def endTagOption(self, token):
+            if self.tree.openElements[-1].name == "option":
+                self.tree.openElements.pop()
+            else:
+                self.parser.parseError("unexpected-end-tag-in-select",
+                                       {"name": "option"})
+
+        def endTagOptgroup(self, token):
+            # </optgroup> implicitly closes <option>
+            if (self.tree.openElements[-1].name == "option" and
+                    self.tree.openElements[-2].name == "optgroup"):
+                self.tree.openElements.pop()
+            # It also closes </optgroup>
+            if self.tree.openElements[-1].name == "optgroup":
+                self.tree.openElements.pop()
+            # But nothing else
+            else:
+                self.parser.parseError("unexpected-end-tag-in-select",
+                                       {"name": "optgroup"})
+
+        def endTagSelect(self, token):
+            if self.tree.elementInScope("select", variant="select"):
+                node = self.tree.openElements.pop()
+                while node.name != "select":
+                    node = self.tree.openElements.pop()
+                self.parser.resetInsertionMode()
+            else:
+                # innerHTML case
+                assert self.parser.innerHTML
+                self.parser.parseError()
+
+        def endTagOther(self, token):
+            self.parser.parseError("unexpected-end-tag-in-select",
+                                   {"name": token["name"]})
+
+    class InSelectInTablePhase(Phase):
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"),
+                 self.startTagTable)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+            self.endTagHandler = _utils.MethodDispatcher([
+                (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"),
+                 self.endTagTable)
+            ])
+            self.endTagHandler.default = self.endTagOther
+
+        def processEOF(self):
+            self.parser.phases["inSelect"].processEOF()
+
+        def processCharacters(self, token):
+            return self.parser.phases["inSelect"].processCharacters(token)
+
+        def startTagTable(self, token):
+            self.parser.parseError("unexpected-table-element-start-tag-in-select-in-table", {"name": token["name"]})
+            self.endTagOther(impliedTagToken("select"))
+            return token
+
+        def startTagOther(self, token):
+            return self.parser.phases["inSelect"].processStartTag(token)
+
+        def endTagTable(self, token):
+            self.parser.parseError("unexpected-table-element-end-tag-in-select-in-table", {"name": token["name"]})
+            if self.tree.elementInScope(token["name"], variant="table"):
+                self.endTagOther(impliedTagToken("select"))
+                return token
+
+        def endTagOther(self, token):
+            return self.parser.phases["inSelect"].processEndTag(token)
+
+    class InForeignContentPhase(Phase):
+        breakoutElements = frozenset(["b", "big", "blockquote", "body", "br",
+                                      "center", "code", "dd", "div", "dl", "dt",
+                                      "em", "embed", "h1", "h2", "h3",
+                                      "h4", "h5", "h6", "head", "hr", "i", "img",
+                                      "li", "listing", "menu", "meta", "nobr",
+                                      "ol", "p", "pre", "ruby", "s", "small",
+                                      "span", "strong", "strike", "sub", "sup",
+                                      "table", "tt", "u", "ul", "var"])
+
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+        def adjustSVGTagNames(self, token):
+            replacements = {"altglyph": "altGlyph",
+                            "altglyphdef": "altGlyphDef",
+                            "altglyphitem": "altGlyphItem",
+                            "animatecolor": "animateColor",
+                            "animatemotion": "animateMotion",
+                            "animatetransform": "animateTransform",
+                            "clippath": "clipPath",
+                            "feblend": "feBlend",
+                            "fecolormatrix": "feColorMatrix",
+                            "fecomponenttransfer": "feComponentTransfer",
+                            "fecomposite": "feComposite",
+                            "feconvolvematrix": "feConvolveMatrix",
+                            "fediffuselighting": "feDiffuseLighting",
+                            "fedisplacementmap": "feDisplacementMap",
+                            "fedistantlight": "feDistantLight",
+                            "feflood": "feFlood",
+                            "fefunca": "feFuncA",
+                            "fefuncb": "feFuncB",
+                            "fefuncg": "feFuncG",
+                            "fefuncr": "feFuncR",
+                            "fegaussianblur": "feGaussianBlur",
+                            "feimage": "feImage",
+                            "femerge": "feMerge",
+                            "femergenode": "feMergeNode",
+                            "femorphology": "feMorphology",
+                            "feoffset": "feOffset",
+                            "fepointlight": "fePointLight",
+                            "fespecularlighting": "feSpecularLighting",
+                            "fespotlight": "feSpotLight",
+                            "fetile": "feTile",
+                            "feturbulence": "feTurbulence",
+                            "foreignobject": "foreignObject",
+                            "glyphref": "glyphRef",
+                            "lineargradient": "linearGradient",
+                            "radialgradient": "radialGradient",
+                            "textpath": "textPath"}
+
+            if token["name"] in replacements:
+                token["name"] = replacements[token["name"]]
+
+        def processCharacters(self, token):
+            if token["data"] == "\u0000":
+                token["data"] = "\uFFFD"
+            elif (self.parser.framesetOK and
+                  any(char not in spaceCharacters for char in token["data"])):
+                self.parser.framesetOK = False
+            Phase.processCharacters(self, token)
+
+        def processStartTag(self, token):
+            currentNode = self.tree.openElements[-1]
+            if (token["name"] in self.breakoutElements or
+                (token["name"] == "font" and
+                 set(token["data"].keys()) & set(["color", "face", "size"]))):
+                self.parser.parseError("unexpected-html-element-in-foreign-content",
+                                       {"name": token["name"]})
+                while (self.tree.openElements[-1].namespace !=
+                       self.tree.defaultNamespace and
+                       not self.parser.isHTMLIntegrationPoint(self.tree.openElements[-1]) and
+                       not self.parser.isMathMLTextIntegrationPoint(self.tree.openElements[-1])):
+                    self.tree.openElements.pop()
+                return token
+
+            else:
+                if currentNode.namespace == namespaces["mathml"]:
+                    self.parser.adjustMathMLAttributes(token)
+                elif currentNode.namespace == namespaces["svg"]:
+                    self.adjustSVGTagNames(token)
+                    self.parser.adjustSVGAttributes(token)
+                self.parser.adjustForeignAttributes(token)
+                token["namespace"] = currentNode.namespace
+                self.tree.insertElement(token)
+                if token["selfClosing"]:
+                    self.tree.openElements.pop()
+                    token["selfClosingAcknowledged"] = True
+
+        def processEndTag(self, token):
+            nodeIndex = len(self.tree.openElements) - 1
+            node = self.tree.openElements[-1]
+            if node.name.translate(asciiUpper2Lower) != token["name"]:
+                self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+
+            while True:
+                if node.name.translate(asciiUpper2Lower) == token["name"]:
+                    # XXX this isn't in the spec but it seems necessary
+                    if self.parser.phase == self.parser.phases["inTableText"]:
+                        self.parser.phase.flushCharacters()
+                        self.parser.phase = self.parser.phase.originalPhase
+                    while self.tree.openElements.pop() != node:
+                        assert self.tree.openElements
+                    new_token = None
+                    break
+                nodeIndex -= 1
+
+                node = self.tree.openElements[nodeIndex]
+                if node.namespace != self.tree.defaultNamespace:
+                    continue
+                else:
+                    new_token = self.parser.phase.processEndTag(token)
+                    break
+            return new_token
+
+    class AfterBodyPhase(Phase):
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+            self.endTagHandler = _utils.MethodDispatcher([("html", self.endTagHtml)])
+            self.endTagHandler.default = self.endTagOther
+
+        def processEOF(self):
+            # Stop parsing
+            pass
+
+        def processComment(self, token):
+            # This is needed because data is to be appended to the <html> element
+            # here and not to whatever is currently open.
+            self.tree.insertComment(token, self.tree.openElements[0])
+
+        def processCharacters(self, token):
+            self.parser.parseError("unexpected-char-after-body")
+            self.parser.phase = self.parser.phases["inBody"]
+            return token
+
+        def startTagHtml(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def startTagOther(self, token):
+            self.parser.parseError("unexpected-start-tag-after-body",
+                                   {"name": token["name"]})
+            self.parser.phase = self.parser.phases["inBody"]
+            return token
+
+        def endTagHtml(self, name):
+            if self.parser.innerHTML:
+                self.parser.parseError("unexpected-end-tag-after-body-innerhtml")
+            else:
+                self.parser.phase = self.parser.phases["afterAfterBody"]
+
+        def endTagOther(self, token):
+            self.parser.parseError("unexpected-end-tag-after-body",
+                                   {"name": token["name"]})
+            self.parser.phase = self.parser.phases["inBody"]
+            return token
+
+    class InFramesetPhase(Phase):
+        # http://www.whatwg.org/specs/web-apps/current-work/#in-frameset
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                ("frameset", self.startTagFrameset),
+                ("frame", self.startTagFrame),
+                ("noframes", self.startTagNoframes)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+            self.endTagHandler = _utils.MethodDispatcher([
+                ("frameset", self.endTagFrameset)
+            ])
+            self.endTagHandler.default = self.endTagOther
+
+        def processEOF(self):
+            if self.tree.openElements[-1].name != "html":
+                self.parser.parseError("eof-in-frameset")
+            else:
+                assert self.parser.innerHTML
+
+        def processCharacters(self, token):
+            self.parser.parseError("unexpected-char-in-frameset")
+
+        def startTagFrameset(self, token):
+            self.tree.insertElement(token)
+
+        def startTagFrame(self, token):
+            self.tree.insertElement(token)
+            self.tree.openElements.pop()
+
+        def startTagNoframes(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def startTagOther(self, token):
+            self.parser.parseError("unexpected-start-tag-in-frameset",
+                                   {"name": token["name"]})
+
+        def endTagFrameset(self, token):
+            if self.tree.openElements[-1].name == "html":
+                # innerHTML case
+                self.parser.parseError("unexpected-frameset-in-frameset-innerhtml")
+            else:
+                self.tree.openElements.pop()
+            if (not self.parser.innerHTML and
+                    self.tree.openElements[-1].name != "frameset"):
+                # If we're not in innerHTML mode and the current node is not a
+                # "frameset" element (anymore) then switch.
+                self.parser.phase = self.parser.phases["afterFrameset"]
+
+        def endTagOther(self, token):
+            self.parser.parseError("unexpected-end-tag-in-frameset",
+                                   {"name": token["name"]})
+
+    class AfterFramesetPhase(Phase):
+        # http://www.whatwg.org/specs/web-apps/current-work/#after3
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                ("noframes", self.startTagNoframes)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+            self.endTagHandler = _utils.MethodDispatcher([
+                ("html", self.endTagHtml)
+            ])
+            self.endTagHandler.default = self.endTagOther
+
+        def processEOF(self):
+            # Stop parsing
+            pass
+
+        def processCharacters(self, token):
+            self.parser.parseError("unexpected-char-after-frameset")
+
+        def startTagNoframes(self, token):
+            return self.parser.phases["inHead"].processStartTag(token)
+
+        def startTagOther(self, token):
+            self.parser.parseError("unexpected-start-tag-after-frameset",
+                                   {"name": token["name"]})
+
+        def endTagHtml(self, token):
+            self.parser.phase = self.parser.phases["afterAfterFrameset"]
+
+        def endTagOther(self, token):
+            self.parser.parseError("unexpected-end-tag-after-frameset",
+                                   {"name": token["name"]})
+
+    class AfterAfterBodyPhase(Phase):
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+        def processEOF(self):
+            pass
+
+        def processComment(self, token):
+            self.tree.insertComment(token, self.tree.document)
+
+        def processSpaceCharacters(self, token):
+            return self.parser.phases["inBody"].processSpaceCharacters(token)
+
+        def processCharacters(self, token):
+            self.parser.parseError("expected-eof-but-got-char")
+            self.parser.phase = self.parser.phases["inBody"]
+            return token
+
+        def startTagHtml(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def startTagOther(self, token):
+            self.parser.parseError("expected-eof-but-got-start-tag",
+                                   {"name": token["name"]})
+            self.parser.phase = self.parser.phases["inBody"]
+            return token
+
+        def processEndTag(self, token):
+            self.parser.parseError("expected-eof-but-got-end-tag",
+                                   {"name": token["name"]})
+            self.parser.phase = self.parser.phases["inBody"]
+            return token
+
+    class AfterAfterFramesetPhase(Phase):
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                ("noframes", self.startTagNoFrames)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+        def processEOF(self):
+            pass
+
+        def processComment(self, token):
+            self.tree.insertComment(token, self.tree.document)
+
+        def processSpaceCharacters(self, token):
+            return self.parser.phases["inBody"].processSpaceCharacters(token)
+
+        def processCharacters(self, token):
+            self.parser.parseError("expected-eof-but-got-char")
+
+        def startTagHtml(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def startTagNoFrames(self, token):
+            return self.parser.phases["inHead"].processStartTag(token)
+
+        def startTagOther(self, token):
+            self.parser.parseError("expected-eof-but-got-start-tag",
+                                   {"name": token["name"]})
+
+        def processEndTag(self, token):
+            self.parser.parseError("expected-eof-but-got-end-tag",
+                                   {"name": token["name"]})
+    # pylint:enable=unused-argument
+
+    return {
+        "initial": InitialPhase,
+        "beforeHtml": BeforeHtmlPhase,
+        "beforeHead": BeforeHeadPhase,
+        "inHead": InHeadPhase,
+        "inHeadNoscript": InHeadNoscriptPhase,
+        "afterHead": AfterHeadPhase,
+        "inBody": InBodyPhase,
+        "text": TextPhase,
+        "inTable": InTablePhase,
+        "inTableText": InTableTextPhase,
+        "inCaption": InCaptionPhase,
+        "inColumnGroup": InColumnGroupPhase,
+        "inTableBody": InTableBodyPhase,
+        "inRow": InRowPhase,
+        "inCell": InCellPhase,
+        "inSelect": InSelectPhase,
+        "inSelectInTable": InSelectInTablePhase,
+        "inForeignContent": InForeignContentPhase,
+        "afterBody": AfterBodyPhase,
+        "inFrameset": InFramesetPhase,
+        "afterFrameset": AfterFramesetPhase,
+        "afterAfterBody": AfterAfterBodyPhase,
+        "afterAfterFrameset": AfterAfterFramesetPhase,
+        # XXX after after frameset
+    }
+
+
+def adjust_attributes(token, replacements):
+    if PY3 or _utils.PY27:
+        needs_adjustment = viewkeys(token['data']) & viewkeys(replacements)
+    else:
+        needs_adjustment = frozenset(token['data']) & frozenset(replacements)
+    if needs_adjustment:
+        token['data'] = OrderedDict((replacements.get(k, k), v)
+                                    for k, v in token['data'].items())
+
+
+def impliedTagToken(name, type="EndTag", attributes=None,
+                    selfClosing=False):
+    if attributes is None:
+        attributes = {}
+    return {"type": tokenTypes[type], "name": name, "data": attributes,
+            "selfClosing": selfClosing}
+
+
+class ParseError(Exception):
+    """Error in parsed document"""
+    pass
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/serializer.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/serializer.py
new file mode 100644
index 0000000000000000000000000000000000000000..2fb3481512a8dfaf6ee2217fd14056ab368afafc
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/serializer.py
@@ -0,0 +1,334 @@
+from __future__ import absolute_import, division, unicode_literals
+from pip._vendor.six import text_type
+
+import re
+
+from codecs import register_error, xmlcharrefreplace_errors
+
+from .constants import voidElements, booleanAttributes, spaceCharacters
+from .constants import rcdataElements, entities, xmlEntities
+from . import treewalkers, _utils
+from xml.sax.saxutils import escape
+
+_quoteAttributeSpecChars = "".join(spaceCharacters) + "\"'=<>`"
+_quoteAttributeSpec = re.compile("[" + _quoteAttributeSpecChars + "]")
+_quoteAttributeLegacy = re.compile("[" + _quoteAttributeSpecChars +
+                                   "\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n"
+                                   "\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15"
+                                   "\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
+                                   "\x20\x2f\x60\xa0\u1680\u180e\u180f\u2000"
+                                   "\u2001\u2002\u2003\u2004\u2005\u2006\u2007"
+                                   "\u2008\u2009\u200a\u2028\u2029\u202f\u205f"
+                                   "\u3000]")
+
+
+_encode_entity_map = {}
+_is_ucs4 = len("\U0010FFFF") == 1
+for k, v in list(entities.items()):
+    # skip multi-character entities
+    if ((_is_ucs4 and len(v) > 1) or
+            (not _is_ucs4 and len(v) > 2)):
+        continue
+    if v != "&":
+        if len(v) == 2:
+            v = _utils.surrogatePairToCodepoint(v)
+        else:
+            v = ord(v)
+        if v not in _encode_entity_map or k.islower():
+            # prefer &lt; over &LT; and similarly for &amp;, &gt;, etc.
+            _encode_entity_map[v] = k
+
+
+def htmlentityreplace_errors(exc):
+    if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)):
+        res = []
+        codepoints = []
+        skip = False
+        for i, c in enumerate(exc.object[exc.start:exc.end]):
+            if skip:
+                skip = False
+                continue
+            index = i + exc.start
+            if _utils.isSurrogatePair(exc.object[index:min([exc.end, index + 2])]):
+                codepoint = _utils.surrogatePairToCodepoint(exc.object[index:index + 2])
+                skip = True
+            else:
+                codepoint = ord(c)
+            codepoints.append(codepoint)
+        for cp in codepoints:
+            e = _encode_entity_map.get(cp)
+            if e:
+                res.append("&")
+                res.append(e)
+                if not e.endswith(";"):
+                    res.append(";")
+            else:
+                res.append("&#x%s;" % (hex(cp)[2:]))
+        return ("".join(res), exc.end)
+    else:
+        return xmlcharrefreplace_errors(exc)
+
+register_error("htmlentityreplace", htmlentityreplace_errors)
+
+
+def serialize(input, tree="etree", encoding=None, **serializer_opts):
+    # XXX: Should we cache this?
+    walker = treewalkers.getTreeWalker(tree)
+    s = HTMLSerializer(**serializer_opts)
+    return s.render(walker(input), encoding)
+
+
+class HTMLSerializer(object):
+
+    # attribute quoting options
+    quote_attr_values = "legacy"  # be secure by default
+    quote_char = '"'
+    use_best_quote_char = True
+
+    # tag syntax options
+    omit_optional_tags = True
+    minimize_boolean_attributes = True
+    use_trailing_solidus = False
+    space_before_trailing_solidus = True
+
+    # escaping options
+    escape_lt_in_attrs = False
+    escape_rcdata = False
+    resolve_entities = True
+
+    # miscellaneous options
+    alphabetical_attributes = False
+    inject_meta_charset = True
+    strip_whitespace = False
+    sanitize = False
+
+    options = ("quote_attr_values", "quote_char", "use_best_quote_char",
+               "omit_optional_tags", "minimize_boolean_attributes",
+               "use_trailing_solidus", "space_before_trailing_solidus",
+               "escape_lt_in_attrs", "escape_rcdata", "resolve_entities",
+               "alphabetical_attributes", "inject_meta_charset",
+               "strip_whitespace", "sanitize")
+
+    def __init__(self, **kwargs):
+        """Initialize HTMLSerializer.
+
+        Keyword options (default given first unless specified) include:
+
+        inject_meta_charset=True|False
+          Whether it insert a meta element to define the character set of the
+          document.
+        quote_attr_values="legacy"|"spec"|"always"
+          Whether to quote attribute values that don't require quoting
+          per legacy browser behaviour, when required by the standard, or always.
+        quote_char=u'"'|u"'"
+          Use given quote character for attribute quoting. Default is to
+          use double quote unless attribute value contains a double quote,
+          in which case single quotes are used instead.
+        escape_lt_in_attrs=False|True
+          Whether to escape < in attribute values.
+        escape_rcdata=False|True
+          Whether to escape characters that need to be escaped within normal
+          elements within rcdata elements such as style.
+        resolve_entities=True|False
+          Whether to resolve named character entities that appear in the
+          source tree. The XML predefined entities &lt; &gt; &amp; &quot; &apos;
+          are unaffected by this setting.
+        strip_whitespace=False|True
+          Whether to remove semantically meaningless whitespace. (This
+          compresses all whitespace to a single space except within pre.)
+        minimize_boolean_attributes=True|False
+          Shortens boolean attributes to give just the attribute value,
+          for example <input disabled="disabled"> becomes <input disabled>.
+        use_trailing_solidus=False|True
+          Includes a close-tag slash at the end of the start tag of void
+          elements (empty elements whose end tag is forbidden). E.g. <hr/>.
+        space_before_trailing_solidus=True|False
+          Places a space immediately before the closing slash in a tag
+          using a trailing solidus. E.g. <hr />. Requires use_trailing_solidus.
+        sanitize=False|True
+          Strip all unsafe or unknown constructs from output.
+          See `html5lib user documentation`_
+        omit_optional_tags=True|False
+          Omit start/end tags that are optional.
+        alphabetical_attributes=False|True
+          Reorder attributes to be in alphabetical order.
+
+        .. _html5lib user documentation: http://code.google.com/p/html5lib/wiki/UserDocumentation
+        """
+        unexpected_args = frozenset(kwargs) - frozenset(self.options)
+        if len(unexpected_args) > 0:
+            raise TypeError("__init__() got an unexpected keyword argument '%s'" % next(iter(unexpected_args)))
+        if 'quote_char' in kwargs:
+            self.use_best_quote_char = False
+        for attr in self.options:
+            setattr(self, attr, kwargs.get(attr, getattr(self, attr)))
+        self.errors = []
+        self.strict = False
+
+    def encode(self, string):
+        assert(isinstance(string, text_type))
+        if self.encoding:
+            return string.encode(self.encoding, "htmlentityreplace")
+        else:
+            return string
+
+    def encodeStrict(self, string):
+        assert(isinstance(string, text_type))
+        if self.encoding:
+            return string.encode(self.encoding, "strict")
+        else:
+            return string
+
+    def serialize(self, treewalker, encoding=None):
+        # pylint:disable=too-many-nested-blocks
+        self.encoding = encoding
+        in_cdata = False
+        self.errors = []
+
+        if encoding and self.inject_meta_charset:
+            from .filters.inject_meta_charset import Filter
+            treewalker = Filter(treewalker, encoding)
+        # Alphabetical attributes is here under the assumption that none of
+        # the later filters add or change order of attributes; it needs to be
+        # before the sanitizer so escaped elements come out correctly
+        if self.alphabetical_attributes:
+            from .filters.alphabeticalattributes import Filter
+            treewalker = Filter(treewalker)
+        # WhitespaceFilter should be used before OptionalTagFilter
+        # for maximum efficiently of this latter filter
+        if self.strip_whitespace:
+            from .filters.whitespace import Filter
+            treewalker = Filter(treewalker)
+        if self.sanitize:
+            from .filters.sanitizer import Filter
+            treewalker = Filter(treewalker)
+        if self.omit_optional_tags:
+            from .filters.optionaltags import Filter
+            treewalker = Filter(treewalker)
+
+        for token in treewalker:
+            type = token["type"]
+            if type == "Doctype":
+                doctype = "<!DOCTYPE %s" % token["name"]
+
+                if token["publicId"]:
+                    doctype += ' PUBLIC "%s"' % token["publicId"]
+                elif token["systemId"]:
+                    doctype += " SYSTEM"
+                if token["systemId"]:
+                    if token["systemId"].find('"') >= 0:
+                        if token["systemId"].find("'") >= 0:
+                            self.serializeError("System identifer contains both single and double quote characters")
+                        quote_char = "'"
+                    else:
+                        quote_char = '"'
+                    doctype += " %s%s%s" % (quote_char, token["systemId"], quote_char)
+
+                doctype += ">"
+                yield self.encodeStrict(doctype)
+
+            elif type in ("Characters", "SpaceCharacters"):
+                if type == "SpaceCharacters" or in_cdata:
+                    if in_cdata and token["data"].find("</") >= 0:
+                        self.serializeError("Unexpected </ in CDATA")
+                    yield self.encode(token["data"])
+                else:
+                    yield self.encode(escape(token["data"]))
+
+            elif type in ("StartTag", "EmptyTag"):
+                name = token["name"]
+                yield self.encodeStrict("<%s" % name)
+                if name in rcdataElements and not self.escape_rcdata:
+                    in_cdata = True
+                elif in_cdata:
+                    self.serializeError("Unexpected child element of a CDATA element")
+                for (_, attr_name), attr_value in token["data"].items():
+                    # TODO: Add namespace support here
+                    k = attr_name
+                    v = attr_value
+                    yield self.encodeStrict(' ')
+
+                    yield self.encodeStrict(k)
+                    if not self.minimize_boolean_attributes or \
+                        (k not in booleanAttributes.get(name, tuple()) and
+                         k not in booleanAttributes.get("", tuple())):
+                        yield self.encodeStrict("=")
+                        if self.quote_attr_values == "always" or len(v) == 0:
+                            quote_attr = True
+                        elif self.quote_attr_values == "spec":
+                            quote_attr = _quoteAttributeSpec.search(v) is not None
+                        elif self.quote_attr_values == "legacy":
+                            quote_attr = _quoteAttributeLegacy.search(v) is not None
+                        else:
+                            raise ValueError("quote_attr_values must be one of: "
+                                             "'always', 'spec', or 'legacy'")
+                        v = v.replace("&", "&amp;")
+                        if self.escape_lt_in_attrs:
+                            v = v.replace("<", "&lt;")
+                        if quote_attr:
+                            quote_char = self.quote_char
+                            if self.use_best_quote_char:
+                                if "'" in v and '"' not in v:
+                                    quote_char = '"'
+                                elif '"' in v and "'" not in v:
+                                    quote_char = "'"
+                            if quote_char == "'":
+                                v = v.replace("'", "&#39;")
+                            else:
+                                v = v.replace('"', "&quot;")
+                            yield self.encodeStrict(quote_char)
+                            yield self.encode(v)
+                            yield self.encodeStrict(quote_char)
+                        else:
+                            yield self.encode(v)
+                if name in voidElements and self.use_trailing_solidus:
+                    if self.space_before_trailing_solidus:
+                        yield self.encodeStrict(" /")
+                    else:
+                        yield self.encodeStrict("/")
+                yield self.encode(">")
+
+            elif type == "EndTag":
+                name = token["name"]
+                if name in rcdataElements:
+                    in_cdata = False
+                elif in_cdata:
+                    self.serializeError("Unexpected child element of a CDATA element")
+                yield self.encodeStrict("</%s>" % name)
+
+            elif type == "Comment":
+                data = token["data"]
+                if data.find("--") >= 0:
+                    self.serializeError("Comment contains --")
+                yield self.encodeStrict("<!--%s-->" % token["data"])
+
+            elif type == "Entity":
+                name = token["name"]
+                key = name + ";"
+                if key not in entities:
+                    self.serializeError("Entity %s not recognized" % name)
+                if self.resolve_entities and key not in xmlEntities:
+                    data = entities[key]
+                else:
+                    data = "&%s;" % name
+                yield self.encodeStrict(data)
+
+            else:
+                self.serializeError(token["data"])
+
+    def render(self, treewalker, encoding=None):
+        if encoding:
+            return b"".join(list(self.serialize(treewalker, encoding)))
+        else:
+            return "".join(list(self.serialize(treewalker)))
+
+    def serializeError(self, data="XXX ERROR MESSAGE NEEDED"):
+        # XXX The idea is to make data mandatory.
+        self.errors.append(data)
+        if self.strict:
+            raise SerializeError
+
+
+class SerializeError(Exception):
+    """Error in serialized tree"""
+    pass
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/__init__.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..4f97846602bae0016a1894f689abcc583b2b71c3
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/__init__.py
@@ -0,0 +1,12 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from . import sax
+
+__all__ = ["sax"]
+
+try:
+    from . import genshi  # noqa
+except ImportError:
+    pass
+else:
+    __all__.append("genshi")
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/genshi.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/genshi.py
new file mode 100644
index 0000000000000000000000000000000000000000..04e316df5e3763f345566e28a4e494fd156b567d
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/genshi.py
@@ -0,0 +1,47 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from genshi.core import QName, Attrs
+from genshi.core import START, END, TEXT, COMMENT, DOCTYPE
+
+
+def to_genshi(walker):
+    text = []
+    for token in walker:
+        type = token["type"]
+        if type in ("Characters", "SpaceCharacters"):
+            text.append(token["data"])
+        elif text:
+            yield TEXT, "".join(text), (None, -1, -1)
+            text = []
+
+        if type in ("StartTag", "EmptyTag"):
+            if token["namespace"]:
+                name = "{%s}%s" % (token["namespace"], token["name"])
+            else:
+                name = token["name"]
+            attrs = Attrs([(QName("{%s}%s" % attr if attr[0] is not None else attr[1]), value)
+                           for attr, value in token["data"].items()])
+            yield (START, (QName(name), attrs), (None, -1, -1))
+            if type == "EmptyTag":
+                type = "EndTag"
+
+        if type == "EndTag":
+            if token["namespace"]:
+                name = "{%s}%s" % (token["namespace"], token["name"])
+            else:
+                name = token["name"]
+
+            yield END, QName(name), (None, -1, -1)
+
+        elif type == "Comment":
+            yield COMMENT, token["data"], (None, -1, -1)
+
+        elif type == "Doctype":
+            yield DOCTYPE, (token["name"], token["publicId"],
+                            token["systemId"]), (None, -1, -1)
+
+        else:
+            pass  # FIXME: What to do?
+
+    if text:
+        yield TEXT, "".join(text), (None, -1, -1)
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/sax.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/sax.py
new file mode 100644
index 0000000000000000000000000000000000000000..ad47df95648cd79722504ac5ceb0a396557c1e71
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/sax.py
@@ -0,0 +1,44 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from xml.sax.xmlreader import AttributesNSImpl
+
+from ..constants import adjustForeignAttributes, unadjustForeignAttributes
+
+prefix_mapping = {}
+for prefix, localName, namespace in adjustForeignAttributes.values():
+    if prefix is not None:
+        prefix_mapping[prefix] = namespace
+
+
+def to_sax(walker, handler):
+    """Call SAX-like content handler based on treewalker walker"""
+    handler.startDocument()
+    for prefix, namespace in prefix_mapping.items():
+        handler.startPrefixMapping(prefix, namespace)
+
+    for token in walker:
+        type = token["type"]
+        if type == "Doctype":
+            continue
+        elif type in ("StartTag", "EmptyTag"):
+            attrs = AttributesNSImpl(token["data"],
+                                     unadjustForeignAttributes)
+            handler.startElementNS((token["namespace"], token["name"]),
+                                   token["name"],
+                                   attrs)
+            if type == "EmptyTag":
+                handler.endElementNS((token["namespace"], token["name"]),
+                                     token["name"])
+        elif type == "EndTag":
+            handler.endElementNS((token["namespace"], token["name"]),
+                                 token["name"])
+        elif type in ("Characters", "SpaceCharacters"):
+            handler.characters(token["data"])
+        elif type == "Comment":
+            pass
+        else:
+            assert False, "Unknown token type"
+
+    for prefix, namespace in prefix_mapping.items():
+        handler.endPrefixMapping(prefix)
+    handler.endDocument()
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/__init__.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e23288474fc6445e48a0be0e2a554416af5431b6
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/__init__.py
@@ -0,0 +1,76 @@
+"""A collection of modules for building different kinds of tree from
+HTML documents.
+
+To create a treebuilder for a new type of tree, you need to do
+implement several things:
+
+1) A set of classes for various types of elements: Document, Doctype,
+Comment, Element. These must implement the interface of
+_base.treebuilders.Node (although comment nodes have a different
+signature for their constructor, see treebuilders.etree.Comment)
+Textual content may also be implemented as another node type, or not, as
+your tree implementation requires.
+
+2) A treebuilder object (called TreeBuilder by convention) that
+inherits from treebuilders._base.TreeBuilder. This has 4 required attributes:
+documentClass - the class to use for the bottommost node of a document
+elementClass - the class to use for HTML Elements
+commentClass - the class to use for comments
+doctypeClass - the class to use for doctypes
+It also has one required method:
+getDocument - Returns the root node of the complete document tree
+
+3) If you wish to run the unit tests, you must also create a
+testSerializer method on your treebuilder which accepts a node and
+returns a string containing Node and its children serialized according
+to the format used in the unittests
+"""
+
+from __future__ import absolute_import, division, unicode_literals
+
+from .._utils import default_etree
+
+treeBuilderCache = {}
+
+
+def getTreeBuilder(treeType, implementation=None, **kwargs):
+    """Get a TreeBuilder class for various types of tree with built-in support
+
+    treeType - the name of the tree type required (case-insensitive). Supported
+               values are:
+
+               "dom" - A generic builder for DOM implementations, defaulting to
+                       a xml.dom.minidom based implementation.
+               "etree" - A generic builder for tree implementations exposing an
+                         ElementTree-like interface, defaulting to
+                         xml.etree.cElementTree if available and
+                         xml.etree.ElementTree if not.
+               "lxml" - A etree-based builder for lxml.etree, handling
+                        limitations of lxml's implementation.
+
+    implementation - (Currently applies to the "etree" and "dom" tree types). A
+                      module implementing the tree type e.g.
+                      xml.etree.ElementTree or xml.etree.cElementTree."""
+
+    treeType = treeType.lower()
+    if treeType not in treeBuilderCache:
+        if treeType == "dom":
+            from . import dom
+            # Come up with a sane default (pref. from the stdlib)
+            if implementation is None:
+                from xml.dom import minidom
+                implementation = minidom
+            # NEVER cache here, caching is done in the dom submodule
+            return dom.getDomModule(implementation, **kwargs).TreeBuilder
+        elif treeType == "lxml":
+            from . import etree_lxml
+            treeBuilderCache[treeType] = etree_lxml.TreeBuilder
+        elif treeType == "etree":
+            from . import etree
+            if implementation is None:
+                implementation = default_etree
+            # NEVER cache here, caching is done in the etree submodule
+            return etree.getETreeModule(implementation, **kwargs).TreeBuilder
+        else:
+            raise ValueError("""Unrecognised treebuilder "%s" """ % treeType)
+    return treeBuilderCache.get(treeType)
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/base.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/base.py
new file mode 100644
index 0000000000000000000000000000000000000000..9798f7cfb979ae5324a0fba27ae56b79dce716dc
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/base.py
@@ -0,0 +1,383 @@
+from __future__ import absolute_import, division, unicode_literals
+from pip._vendor.six import text_type
+
+from ..constants import scopingElements, tableInsertModeElements, namespaces
+
+# The scope markers are inserted when entering object elements,
+# marquees, table cells, and table captions, and are used to prevent formatting
+# from "leaking" into tables, object elements, and marquees.
+Marker = None
+
+listElementsMap = {
+    None: (frozenset(scopingElements), False),
+    "button": (frozenset(scopingElements | set([(namespaces["html"], "button")])), False),
+    "list": (frozenset(scopingElements | set([(namespaces["html"], "ol"),
+                                              (namespaces["html"], "ul")])), False),
+    "table": (frozenset([(namespaces["html"], "html"),
+                         (namespaces["html"], "table")]), False),
+    "select": (frozenset([(namespaces["html"], "optgroup"),
+                          (namespaces["html"], "option")]), True)
+}
+
+
+class Node(object):
+    def __init__(self, name):
+        """Node representing an item in the tree.
+        name - The tag name associated with the node
+        parent - The parent of the current node (or None for the document node)
+        value - The value of the current node (applies to text nodes and
+        comments
+        attributes - a dict holding name, value pairs for attributes of the node
+        childNodes - a list of child nodes of the current node. This must
+        include all elements but not necessarily other node types
+        _flags - A list of miscellaneous flags that can be set on the node
+        """
+        self.name = name
+        self.parent = None
+        self.value = None
+        self.attributes = {}
+        self.childNodes = []
+        self._flags = []
+
+    def __str__(self):
+        attributesStr = " ".join(["%s=\"%s\"" % (name, value)
+                                  for name, value in
+                                  self.attributes.items()])
+        if attributesStr:
+            return "<%s %s>" % (self.name, attributesStr)
+        else:
+            return "<%s>" % (self.name)
+
+    def __repr__(self):
+        return "<%s>" % (self.name)
+
+    def appendChild(self, node):
+        """Insert node as a child of the current node
+        """
+        raise NotImplementedError
+
+    def insertText(self, data, insertBefore=None):
+        """Insert data as text in the current node, positioned before the
+        start of node insertBefore or to the end of the node's text.
+        """
+        raise NotImplementedError
+
+    def insertBefore(self, node, refNode):
+        """Insert node as a child of the current node, before refNode in the
+        list of child nodes. Raises ValueError if refNode is not a child of
+        the current node"""
+        raise NotImplementedError
+
+    def removeChild(self, node):
+        """Remove node from the children of the current node
+        """
+        raise NotImplementedError
+
+    def reparentChildren(self, newParent):
+        """Move all the children of the current node to newParent.
+        This is needed so that trees that don't store text as nodes move the
+        text in the correct way
+        """
+        # XXX - should this method be made more general?
+        for child in self.childNodes:
+            newParent.appendChild(child)
+        self.childNodes = []
+
+    def cloneNode(self):
+        """Return a shallow copy of the current node i.e. a node with the same
+        name and attributes but with no parent or child nodes
+        """
+        raise NotImplementedError
+
+    def hasContent(self):
+        """Return true if the node has children or text, false otherwise
+        """
+        raise NotImplementedError
+
+
+class ActiveFormattingElements(list):
+    def append(self, node):
+        equalCount = 0
+        if node != Marker:
+            for element in self[::-1]:
+                if element == Marker:
+                    break
+                if self.nodesEqual(element, node):
+                    equalCount += 1
+                if equalCount == 3:
+                    self.remove(element)
+                    break
+        list.append(self, node)
+
+    def nodesEqual(self, node1, node2):
+        if not node1.nameTuple == node2.nameTuple:
+            return False
+
+        if not node1.attributes == node2.attributes:
+            return False
+
+        return True
+
+
+class TreeBuilder(object):
+    """Base treebuilder implementation
+    documentClass - the class to use for the bottommost node of a document
+    elementClass - the class to use for HTML Elements
+    commentClass - the class to use for comments
+    doctypeClass - the class to use for doctypes
+    """
+    # pylint:disable=not-callable
+
+    # Document class
+    documentClass = None
+
+    # The class to use for creating a node
+    elementClass = None
+
+    # The class to use for creating comments
+    commentClass = None
+
+    # The class to use for creating doctypes
+    doctypeClass = None
+
+    # Fragment class
+    fragmentClass = None
+
+    def __init__(self, namespaceHTMLElements):
+        if namespaceHTMLElements:
+            self.defaultNamespace = "http://www.w3.org/1999/xhtml"
+        else:
+            self.defaultNamespace = None
+        self.reset()
+
+    def reset(self):
+        self.openElements = []
+        self.activeFormattingElements = ActiveFormattingElements()
+
+        # XXX - rename these to headElement, formElement
+        self.headPointer = None
+        self.formPointer = None
+
+        self.insertFromTable = False
+
+        self.document = self.documentClass()
+
+    def elementInScope(self, target, variant=None):
+
+        # If we pass a node in we match that. if we pass a string
+        # match any node with that name
+        exactNode = hasattr(target, "nameTuple")
+        if not exactNode:
+            if isinstance(target, text_type):
+                target = (namespaces["html"], target)
+            assert isinstance(target, tuple)
+
+        listElements, invert = listElementsMap[variant]
+
+        for node in reversed(self.openElements):
+            if exactNode and node == target:
+                return True
+            elif not exactNode and node.nameTuple == target:
+                return True
+            elif (invert ^ (node.nameTuple in listElements)):
+                return False
+
+        assert False  # We should never reach this point
+
+    def reconstructActiveFormattingElements(self):
+        # Within this algorithm the order of steps described in the
+        # specification is not quite the same as the order of steps in the
+        # code. It should still do the same though.
+
+        # Step 1: stop the algorithm when there's nothing to do.
+        if not self.activeFormattingElements:
+            return
+
+        # Step 2 and step 3: we start with the last element. So i is -1.
+        i = len(self.activeFormattingElements) - 1
+        entry = self.activeFormattingElements[i]
+        if entry == Marker or entry in self.openElements:
+            return
+
+        # Step 6
+        while entry != Marker and entry not in self.openElements:
+            if i == 0:
+                # This will be reset to 0 below
+                i = -1
+                break
+            i -= 1
+            # Step 5: let entry be one earlier in the list.
+            entry = self.activeFormattingElements[i]
+
+        while True:
+            # Step 7
+            i += 1
+
+            # Step 8
+            entry = self.activeFormattingElements[i]
+            clone = entry.cloneNode()  # Mainly to get a new copy of the attributes
+
+            # Step 9
+            element = self.insertElement({"type": "StartTag",
+                                          "name": clone.name,
+                                          "namespace": clone.namespace,
+                                          "data": clone.attributes})
+
+            # Step 10
+            self.activeFormattingElements[i] = element
+
+            # Step 11
+            if element == self.activeFormattingElements[-1]:
+                break
+
+    def clearActiveFormattingElements(self):
+        entry = self.activeFormattingElements.pop()
+        while self.activeFormattingElements and entry != Marker:
+            entry = self.activeFormattingElements.pop()
+
+    def elementInActiveFormattingElements(self, name):
+        """Check if an element exists between the end of the active
+        formatting elements and the last marker. If it does, return it, else
+        return false"""
+
+        for item in self.activeFormattingElements[::-1]:
+            # Check for Marker first because if it's a Marker it doesn't have a
+            # name attribute.
+            if item == Marker:
+                break
+            elif item.name == name:
+                return item
+        return False
+
+    def insertRoot(self, token):
+        element = self.createElement(token)
+        self.openElements.append(element)
+        self.document.appendChild(element)
+
+    def insertDoctype(self, token):
+        name = token["name"]
+        publicId = token["publicId"]
+        systemId = token["systemId"]
+
+        doctype = self.doctypeClass(name, publicId, systemId)
+        self.document.appendChild(doctype)
+
+    def insertComment(self, token, parent=None):
+        if parent is None:
+            parent = self.openElements[-1]
+        parent.appendChild(self.commentClass(token["data"]))
+
+    def createElement(self, token):
+        """Create an element but don't insert it anywhere"""
+        name = token["name"]
+        namespace = token.get("namespace", self.defaultNamespace)
+        element = self.elementClass(name, namespace)
+        element.attributes = token["data"]
+        return element
+
+    def _getInsertFromTable(self):
+        return self._insertFromTable
+
+    def _setInsertFromTable(self, value):
+        """Switch the function used to insert an element from the
+        normal one to the misnested table one and back again"""
+        self._insertFromTable = value
+        if value:
+            self.insertElement = self.insertElementTable
+        else:
+            self.insertElement = self.insertElementNormal
+
+    insertFromTable = property(_getInsertFromTable, _setInsertFromTable)
+
+    def insertElementNormal(self, token):
+        name = token["name"]
+        assert isinstance(name, text_type), "Element %s not unicode" % name
+        namespace = token.get("namespace", self.defaultNamespace)
+        element = self.elementClass(name, namespace)
+        element.attributes = token["data"]
+        self.openElements[-1].appendChild(element)
+        self.openElements.append(element)
+        return element
+
+    def insertElementTable(self, token):
+        """Create an element and insert it into the tree"""
+        element = self.createElement(token)
+        if self.openElements[-1].name not in tableInsertModeElements:
+            return self.insertElementNormal(token)
+        else:
+            # We should be in the InTable mode. This means we want to do
+            # special magic element rearranging
+            parent, insertBefore = self.getTableMisnestedNodePosition()
+            if insertBefore is None:
+                parent.appendChild(element)
+            else:
+                parent.insertBefore(element, insertBefore)
+            self.openElements.append(element)
+        return element
+
+    def insertText(self, data, parent=None):
+        """Insert text data."""
+        if parent is None:
+            parent = self.openElements[-1]
+
+        if (not self.insertFromTable or (self.insertFromTable and
+                                         self.openElements[-1].name
+                                         not in tableInsertModeElements)):
+            parent.insertText(data)
+        else:
+            # We should be in the InTable mode. This means we want to do
+            # special magic element rearranging
+            parent, insertBefore = self.getTableMisnestedNodePosition()
+            parent.insertText(data, insertBefore)
+
+    def getTableMisnestedNodePosition(self):
+        """Get the foster parent element, and sibling to insert before
+        (or None) when inserting a misnested table node"""
+        # The foster parent element is the one which comes before the most
+        # recently opened table element
+        # XXX - this is really inelegant
+        lastTable = None
+        fosterParent = None
+        insertBefore = None
+        for elm in self.openElements[::-1]:
+            if elm.name == "table":
+                lastTable = elm
+                break
+        if lastTable:
+            # XXX - we should really check that this parent is actually a
+            # node here
+            if lastTable.parent:
+                fosterParent = lastTable.parent
+                insertBefore = lastTable
+            else:
+                fosterParent = self.openElements[
+                    self.openElements.index(lastTable) - 1]
+        else:
+            fosterParent = self.openElements[0]
+        return fosterParent, insertBefore
+
+    def generateImpliedEndTags(self, exclude=None):
+        name = self.openElements[-1].name
+        # XXX td, th and tr are not actually needed
+        if (name in frozenset(("dd", "dt", "li", "option", "optgroup", "p", "rp", "rt")) and
+                name != exclude):
+            self.openElements.pop()
+            # XXX This is not entirely what the specification says. We should
+            # investigate it more closely.
+            self.generateImpliedEndTags(exclude)
+
+    def getDocument(self):
+        "Return the final tree"
+        return self.document
+
+    def getFragment(self):
+        "Return the final fragment"
+        # assert self.innerHTML
+        fragment = self.fragmentClass()
+        self.openElements[0].reparentChildren(fragment)
+        return fragment
+
+    def testSerializer(self, node):
+        """Serialize the subtree of node in the format required by unit tests
+        node - the node from which to start serializing"""
+        raise NotImplementedError
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/dom.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/dom.py
new file mode 100644
index 0000000000000000000000000000000000000000..dcfac220bfaf9906b1f57ee747baff2a627cfa58
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/dom.py
@@ -0,0 +1,236 @@
+from __future__ import absolute_import, division, unicode_literals
+
+
+from collections import MutableMapping
+from xml.dom import minidom, Node
+import weakref
+
+from . import base
+from .. import constants
+from ..constants import namespaces
+from .._utils import moduleFactoryFactory
+
+
+def getDomBuilder(DomImplementation):
+    Dom = DomImplementation
+
+    class AttrList(MutableMapping):
+        def __init__(self, element):
+            self.element = element
+
+        def __iter__(self):
+            return iter(self.element.attributes.keys())
+
+        def __setitem__(self, name, value):
+            if isinstance(name, tuple):
+                raise NotImplementedError
+            else:
+                attr = self.element.ownerDocument.createAttribute(name)
+                attr.value = value
+                self.element.attributes[name] = attr
+
+        def __len__(self):
+            return len(self.element.attributes)
+
+        def items(self):
+            return list(self.element.attributes.items())
+
+        def values(self):
+            return list(self.element.attributes.values())
+
+        def __getitem__(self, name):
+            if isinstance(name, tuple):
+                raise NotImplementedError
+            else:
+                return self.element.attributes[name].value
+
+        def __delitem__(self, name):
+            if isinstance(name, tuple):
+                raise NotImplementedError
+            else:
+                del self.element.attributes[name]
+
+    class NodeBuilder(base.Node):
+        def __init__(self, element):
+            base.Node.__init__(self, element.nodeName)
+            self.element = element
+
+        namespace = property(lambda self: hasattr(self.element, "namespaceURI") and
+                             self.element.namespaceURI or None)
+
+        def appendChild(self, node):
+            node.parent = self
+            self.element.appendChild(node.element)
+
+        def insertText(self, data, insertBefore=None):
+            text = self.element.ownerDocument.createTextNode(data)
+            if insertBefore:
+                self.element.insertBefore(text, insertBefore.element)
+            else:
+                self.element.appendChild(text)
+
+        def insertBefore(self, node, refNode):
+            self.element.insertBefore(node.element, refNode.element)
+            node.parent = self
+
+        def removeChild(self, node):
+            if node.element.parentNode == self.element:
+                self.element.removeChild(node.element)
+            node.parent = None
+
+        def reparentChildren(self, newParent):
+            while self.element.hasChildNodes():
+                child = self.element.firstChild
+                self.element.removeChild(child)
+                newParent.element.appendChild(child)
+            self.childNodes = []
+
+        def getAttributes(self):
+            return AttrList(self.element)
+
+        def setAttributes(self, attributes):
+            if attributes:
+                for name, value in list(attributes.items()):
+                    if isinstance(name, tuple):
+                        if name[0] is not None:
+                            qualifiedName = (name[0] + ":" + name[1])
+                        else:
+                            qualifiedName = name[1]
+                        self.element.setAttributeNS(name[2], qualifiedName,
+                                                    value)
+                    else:
+                        self.element.setAttribute(
+                            name, value)
+        attributes = property(getAttributes, setAttributes)
+
+        def cloneNode(self):
+            return NodeBuilder(self.element.cloneNode(False))
+
+        def hasContent(self):
+            return self.element.hasChildNodes()
+
+        def getNameTuple(self):
+            if self.namespace is None:
+                return namespaces["html"], self.name
+            else:
+                return self.namespace, self.name
+
+        nameTuple = property(getNameTuple)
+
+    class TreeBuilder(base.TreeBuilder):  # pylint:disable=unused-variable
+        def documentClass(self):
+            self.dom = Dom.getDOMImplementation().createDocument(None, None, None)
+            return weakref.proxy(self)
+
+        def insertDoctype(self, token):
+            name = token["name"]
+            publicId = token["publicId"]
+            systemId = token["systemId"]
+
+            domimpl = Dom.getDOMImplementation()
+            doctype = domimpl.createDocumentType(name, publicId, systemId)
+            self.document.appendChild(NodeBuilder(doctype))
+            if Dom == minidom:
+                doctype.ownerDocument = self.dom
+
+        def elementClass(self, name, namespace=None):
+            if namespace is None and self.defaultNamespace is None:
+                node = self.dom.createElement(name)
+            else:
+                node = self.dom.createElementNS(namespace, name)
+
+            return NodeBuilder(node)
+
+        def commentClass(self, data):
+            return NodeBuilder(self.dom.createComment(data))
+
+        def fragmentClass(self):
+            return NodeBuilder(self.dom.createDocumentFragment())
+
+        def appendChild(self, node):
+            self.dom.appendChild(node.element)
+
+        def testSerializer(self, element):
+            return testSerializer(element)
+
+        def getDocument(self):
+            return self.dom
+
+        def getFragment(self):
+            return base.TreeBuilder.getFragment(self).element
+
+        def insertText(self, data, parent=None):
+            data = data
+            if parent != self:
+                base.TreeBuilder.insertText(self, data, parent)
+            else:
+                # HACK: allow text nodes as children of the document node
+                if hasattr(self.dom, '_child_node_types'):
+                    # pylint:disable=protected-access
+                    if Node.TEXT_NODE not in self.dom._child_node_types:
+                        self.dom._child_node_types = list(self.dom._child_node_types)
+                        self.dom._child_node_types.append(Node.TEXT_NODE)
+                self.dom.appendChild(self.dom.createTextNode(data))
+
+        implementation = DomImplementation
+        name = None
+
+    def testSerializer(element):
+        element.normalize()
+        rv = []
+
+        def serializeElement(element, indent=0):
+            if element.nodeType == Node.DOCUMENT_TYPE_NODE:
+                if element.name:
+                    if element.publicId or element.systemId:
+                        publicId = element.publicId or ""
+                        systemId = element.systemId or ""
+                        rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" %
+                                  (' ' * indent, element.name, publicId, systemId))
+                    else:
+                        rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, element.name))
+                else:
+                    rv.append("|%s<!DOCTYPE >" % (' ' * indent,))
+            elif element.nodeType == Node.DOCUMENT_NODE:
+                rv.append("#document")
+            elif element.nodeType == Node.DOCUMENT_FRAGMENT_NODE:
+                rv.append("#document-fragment")
+            elif element.nodeType == Node.COMMENT_NODE:
+                rv.append("|%s<!-- %s -->" % (' ' * indent, element.nodeValue))
+            elif element.nodeType == Node.TEXT_NODE:
+                rv.append("|%s\"%s\"" % (' ' * indent, element.nodeValue))
+            else:
+                if (hasattr(element, "namespaceURI") and
+                        element.namespaceURI is not None):
+                    name = "%s %s" % (constants.prefixes[element.namespaceURI],
+                                      element.nodeName)
+                else:
+                    name = element.nodeName
+                rv.append("|%s<%s>" % (' ' * indent, name))
+                if element.hasAttributes():
+                    attributes = []
+                    for i in range(len(element.attributes)):
+                        attr = element.attributes.item(i)
+                        name = attr.nodeName
+                        value = attr.value
+                        ns = attr.namespaceURI
+                        if ns:
+                            name = "%s %s" % (constants.prefixes[ns], attr.localName)
+                        else:
+                            name = attr.nodeName
+                        attributes.append((name, value))
+
+                    for name, value in sorted(attributes):
+                        rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value))
+            indent += 2
+            for child in element.childNodes:
+                serializeElement(child, indent)
+        serializeElement(element, 0)
+
+        return "\n".join(rv)
+
+    return locals()
+
+
+# The actual means to get a module!
+getDomModule = moduleFactoryFactory(getDomBuilder)
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/etree.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/etree.py
new file mode 100644
index 0000000000000000000000000000000000000000..0dedf441643902d5258b4aef64f001f9282e7220
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/etree.py
@@ -0,0 +1,340 @@
+from __future__ import absolute_import, division, unicode_literals
+# pylint:disable=protected-access
+
+from pip._vendor.six import text_type
+
+import re
+
+from . import base
+from .. import _ihatexml
+from .. import constants
+from ..constants import namespaces
+from .._utils import moduleFactoryFactory
+
+tag_regexp = re.compile("{([^}]*)}(.*)")
+
+
+def getETreeBuilder(ElementTreeImplementation, fullTree=False):
+    ElementTree = ElementTreeImplementation
+    ElementTreeCommentType = ElementTree.Comment("asd").tag
+
+    class Element(base.Node):
+        def __init__(self, name, namespace=None):
+            self._name = name
+            self._namespace = namespace
+            self._element = ElementTree.Element(self._getETreeTag(name,
+                                                                  namespace))
+            if namespace is None:
+                self.nameTuple = namespaces["html"], self._name
+            else:
+                self.nameTuple = self._namespace, self._name
+            self.parent = None
+            self._childNodes = []
+            self._flags = []
+
+        def _getETreeTag(self, name, namespace):
+            if namespace is None:
+                etree_tag = name
+            else:
+                etree_tag = "{%s}%s" % (namespace, name)
+            return etree_tag
+
+        def _setName(self, name):
+            self._name = name
+            self._element.tag = self._getETreeTag(self._name, self._namespace)
+
+        def _getName(self):
+            return self._name
+
+        name = property(_getName, _setName)
+
+        def _setNamespace(self, namespace):
+            self._namespace = namespace
+            self._element.tag = self._getETreeTag(self._name, self._namespace)
+
+        def _getNamespace(self):
+            return self._namespace
+
+        namespace = property(_getNamespace, _setNamespace)
+
+        def _getAttributes(self):
+            return self._element.attrib
+
+        def _setAttributes(self, attributes):
+            # Delete existing attributes first
+            # XXX - there may be a better way to do this...
+            for key in list(self._element.attrib.keys()):
+                del self._element.attrib[key]
+            for key, value in attributes.items():
+                if isinstance(key, tuple):
+                    name = "{%s}%s" % (key[2], key[1])
+                else:
+                    name = key
+                self._element.set(name, value)
+
+        attributes = property(_getAttributes, _setAttributes)
+
+        def _getChildNodes(self):
+            return self._childNodes
+
+        def _setChildNodes(self, value):
+            del self._element[:]
+            self._childNodes = []
+            for element in value:
+                self.insertChild(element)
+
+        childNodes = property(_getChildNodes, _setChildNodes)
+
+        def hasContent(self):
+            """Return true if the node has children or text"""
+            return bool(self._element.text or len(self._element))
+
+        def appendChild(self, node):
+            self._childNodes.append(node)
+            self._element.append(node._element)
+            node.parent = self
+
+        def insertBefore(self, node, refNode):
+            index = list(self._element).index(refNode._element)
+            self._element.insert(index, node._element)
+            node.parent = self
+
+        def removeChild(self, node):
+            self._childNodes.remove(node)
+            self._element.remove(node._element)
+            node.parent = None
+
+        def insertText(self, data, insertBefore=None):
+            if not(len(self._element)):
+                if not self._element.text:
+                    self._element.text = ""
+                self._element.text += data
+            elif insertBefore is None:
+                # Insert the text as the tail of the last child element
+                if not self._element[-1].tail:
+                    self._element[-1].tail = ""
+                self._element[-1].tail += data
+            else:
+                # Insert the text before the specified node
+                children = list(self._element)
+                index = children.index(insertBefore._element)
+                if index > 0:
+                    if not self._element[index - 1].tail:
+                        self._element[index - 1].tail = ""
+                    self._element[index - 1].tail += data
+                else:
+                    if not self._element.text:
+                        self._element.text = ""
+                    self._element.text += data
+
+        def cloneNode(self):
+            element = type(self)(self.name, self.namespace)
+            for name, value in self.attributes.items():
+                element.attributes[name] = value
+            return element
+
+        def reparentChildren(self, newParent):
+            if newParent.childNodes:
+                newParent.childNodes[-1]._element.tail += self._element.text
+            else:
+                if not newParent._element.text:
+                    newParent._element.text = ""
+                if self._element.text is not None:
+                    newParent._element.text += self._element.text
+            self._element.text = ""
+            base.Node.reparentChildren(self, newParent)
+
+    class Comment(Element):
+        def __init__(self, data):
+            # Use the superclass constructor to set all properties on the
+            # wrapper element
+            self._element = ElementTree.Comment(data)
+            self.parent = None
+            self._childNodes = []
+            self._flags = []
+
+        def _getData(self):
+            return self._element.text
+
+        def _setData(self, value):
+            self._element.text = value
+
+        data = property(_getData, _setData)
+
+    class DocumentType(Element):
+        def __init__(self, name, publicId, systemId):
+            Element.__init__(self, "<!DOCTYPE>")
+            self._element.text = name
+            self.publicId = publicId
+            self.systemId = systemId
+
+        def _getPublicId(self):
+            return self._element.get("publicId", "")
+
+        def _setPublicId(self, value):
+            if value is not None:
+                self._element.set("publicId", value)
+
+        publicId = property(_getPublicId, _setPublicId)
+
+        def _getSystemId(self):
+            return self._element.get("systemId", "")
+
+        def _setSystemId(self, value):
+            if value is not None:
+                self._element.set("systemId", value)
+
+        systemId = property(_getSystemId, _setSystemId)
+
+    class Document(Element):
+        def __init__(self):
+            Element.__init__(self, "DOCUMENT_ROOT")
+
+    class DocumentFragment(Element):
+        def __init__(self):
+            Element.__init__(self, "DOCUMENT_FRAGMENT")
+
+    def testSerializer(element):
+        rv = []
+
+        def serializeElement(element, indent=0):
+            if not(hasattr(element, "tag")):
+                element = element.getroot()
+            if element.tag == "<!DOCTYPE>":
+                if element.get("publicId") or element.get("systemId"):
+                    publicId = element.get("publicId") or ""
+                    systemId = element.get("systemId") or ""
+                    rv.append("""<!DOCTYPE %s "%s" "%s">""" %
+                              (element.text, publicId, systemId))
+                else:
+                    rv.append("<!DOCTYPE %s>" % (element.text,))
+            elif element.tag == "DOCUMENT_ROOT":
+                rv.append("#document")
+                if element.text is not None:
+                    rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text))
+                if element.tail is not None:
+                    raise TypeError("Document node cannot have tail")
+                if hasattr(element, "attrib") and len(element.attrib):
+                    raise TypeError("Document node cannot have attributes")
+            elif element.tag == ElementTreeCommentType:
+                rv.append("|%s<!-- %s -->" % (' ' * indent, element.text))
+            else:
+                assert isinstance(element.tag, text_type), \
+                    "Expected unicode, got %s, %s" % (type(element.tag), element.tag)
+                nsmatch = tag_regexp.match(element.tag)
+
+                if nsmatch is None:
+                    name = element.tag
+                else:
+                    ns, name = nsmatch.groups()
+                    prefix = constants.prefixes[ns]
+                    name = "%s %s" % (prefix, name)
+                rv.append("|%s<%s>" % (' ' * indent, name))
+
+                if hasattr(element, "attrib"):
+                    attributes = []
+                    for name, value in element.attrib.items():
+                        nsmatch = tag_regexp.match(name)
+                        if nsmatch is not None:
+                            ns, name = nsmatch.groups()
+                            prefix = constants.prefixes[ns]
+                            attr_string = "%s %s" % (prefix, name)
+                        else:
+                            attr_string = name
+                        attributes.append((attr_string, value))
+
+                    for name, value in sorted(attributes):
+                        rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value))
+                if element.text:
+                    rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text))
+            indent += 2
+            for child in element:
+                serializeElement(child, indent)
+            if element.tail:
+                rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail))
+        serializeElement(element, 0)
+
+        return "\n".join(rv)
+
+    def tostring(element):  # pylint:disable=unused-variable
+        """Serialize an element and its child nodes to a string"""
+        rv = []
+        filter = _ihatexml.InfosetFilter()
+
+        def serializeElement(element):
+            if isinstance(element, ElementTree.ElementTree):
+                element = element.getroot()
+
+            if element.tag == "<!DOCTYPE>":
+                if element.get("publicId") or element.get("systemId"):
+                    publicId = element.get("publicId") or ""
+                    systemId = element.get("systemId") or ""
+                    rv.append("""<!DOCTYPE %s PUBLIC "%s" "%s">""" %
+                              (element.text, publicId, systemId))
+                else:
+                    rv.append("<!DOCTYPE %s>" % (element.text,))
+            elif element.tag == "DOCUMENT_ROOT":
+                if element.text is not None:
+                    rv.append(element.text)
+                if element.tail is not None:
+                    raise TypeError("Document node cannot have tail")
+                if hasattr(element, "attrib") and len(element.attrib):
+                    raise TypeError("Document node cannot have attributes")
+
+                for child in element:
+                    serializeElement(child)
+
+            elif element.tag == ElementTreeCommentType:
+                rv.append("<!--%s-->" % (element.text,))
+            else:
+                # This is assumed to be an ordinary element
+                if not element.attrib:
+                    rv.append("<%s>" % (filter.fromXmlName(element.tag),))
+                else:
+                    attr = " ".join(["%s=\"%s\"" % (
+                        filter.fromXmlName(name), value)
+                        for name, value in element.attrib.items()])
+                    rv.append("<%s %s>" % (element.tag, attr))
+                if element.text:
+                    rv.append(element.text)
+
+                for child in element:
+                    serializeElement(child)
+
+                rv.append("</%s>" % (element.tag,))
+
+            if element.tail:
+                rv.append(element.tail)
+
+        serializeElement(element)
+
+        return "".join(rv)
+
+    class TreeBuilder(base.TreeBuilder):  # pylint:disable=unused-variable
+        documentClass = Document
+        doctypeClass = DocumentType
+        elementClass = Element
+        commentClass = Comment
+        fragmentClass = DocumentFragment
+        implementation = ElementTreeImplementation
+
+        def testSerializer(self, element):
+            return testSerializer(element)
+
+        def getDocument(self):
+            if fullTree:
+                return self.document._element
+            else:
+                if self.defaultNamespace is not None:
+                    return self.document._element.find(
+                        "{%s}html" % self.defaultNamespace)
+                else:
+                    return self.document._element.find("html")
+
+        def getFragment(self):
+            return base.TreeBuilder.getFragment(self)._element
+
+    return locals()
+
+
+getETreeModule = moduleFactoryFactory(getETreeBuilder)
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/etree_lxml.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/etree_lxml.py
new file mode 100644
index 0000000000000000000000000000000000000000..908820c08104c24a9f9c7851252f6af8d8c25355
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/etree_lxml.py
@@ -0,0 +1,367 @@
+"""Module for supporting the lxml.etree library. The idea here is to use as much
+of the native library as possible, without using fragile hacks like custom element
+names that break between releases. The downside of this is that we cannot represent
+all possible trees; specifically the following are known to cause problems:
+
+Text or comments as siblings of the root element
+Docypes with no name
+
+When any of these things occur, we emit a DataLossWarning
+"""
+
+from __future__ import absolute_import, division, unicode_literals
+# pylint:disable=protected-access
+
+import warnings
+import re
+import sys
+
+from . import base
+from ..constants import DataLossWarning
+from .. import constants
+from . import etree as etree_builders
+from .. import _ihatexml
+
+import lxml.etree as etree
+
+
+fullTree = True
+tag_regexp = re.compile("{([^}]*)}(.*)")
+
+comment_type = etree.Comment("asd").tag
+
+
+class DocumentType(object):
+    def __init__(self, name, publicId, systemId):
+        self.name = name
+        self.publicId = publicId
+        self.systemId = systemId
+
+
+class Document(object):
+    def __init__(self):
+        self._elementTree = None
+        self._childNodes = []
+
+    def appendChild(self, element):
+        self._elementTree.getroot().addnext(element._element)
+
+    def _getChildNodes(self):
+        return self._childNodes
+
+    childNodes = property(_getChildNodes)
+
+
+def testSerializer(element):
+    rv = []
+    infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True)
+
+    def serializeElement(element, indent=0):
+        if not hasattr(element, "tag"):
+            if hasattr(element, "getroot"):
+                # Full tree case
+                rv.append("#document")
+                if element.docinfo.internalDTD:
+                    if not (element.docinfo.public_id or
+                            element.docinfo.system_url):
+                        dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name
+                    else:
+                        dtd_str = """<!DOCTYPE %s "%s" "%s">""" % (
+                            element.docinfo.root_name,
+                            element.docinfo.public_id,
+                            element.docinfo.system_url)
+                    rv.append("|%s%s" % (' ' * (indent + 2), dtd_str))
+                next_element = element.getroot()
+                while next_element.getprevious() is not None:
+                    next_element = next_element.getprevious()
+                while next_element is not None:
+                    serializeElement(next_element, indent + 2)
+                    next_element = next_element.getnext()
+            elif isinstance(element, str) or isinstance(element, bytes):
+                # Text in a fragment
+                assert isinstance(element, str) or sys.version_info[0] == 2
+                rv.append("|%s\"%s\"" % (' ' * indent, element))
+            else:
+                # Fragment case
+                rv.append("#document-fragment")
+                for next_element in element:
+                    serializeElement(next_element, indent + 2)
+        elif element.tag == comment_type:
+            rv.append("|%s<!-- %s -->" % (' ' * indent, element.text))
+            if hasattr(element, "tail") and element.tail:
+                rv.append("|%s\"%s\"" % (' ' * indent, element.tail))
+        else:
+            assert isinstance(element, etree._Element)
+            nsmatch = etree_builders.tag_regexp.match(element.tag)
+            if nsmatch is not None:
+                ns = nsmatch.group(1)
+                tag = nsmatch.group(2)
+                prefix = constants.prefixes[ns]
+                rv.append("|%s<%s %s>" % (' ' * indent, prefix,
+                                          infosetFilter.fromXmlName(tag)))
+            else:
+                rv.append("|%s<%s>" % (' ' * indent,
+                                       infosetFilter.fromXmlName(element.tag)))
+
+            if hasattr(element, "attrib"):
+                attributes = []
+                for name, value in element.attrib.items():
+                    nsmatch = tag_regexp.match(name)
+                    if nsmatch is not None:
+                        ns, name = nsmatch.groups()
+                        name = infosetFilter.fromXmlName(name)
+                        prefix = constants.prefixes[ns]
+                        attr_string = "%s %s" % (prefix, name)
+                    else:
+                        attr_string = infosetFilter.fromXmlName(name)
+                    attributes.append((attr_string, value))
+
+                for name, value in sorted(attributes):
+                    rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value))
+
+            if element.text:
+                rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text))
+            indent += 2
+            for child in element:
+                serializeElement(child, indent)
+            if hasattr(element, "tail") and element.tail:
+                rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail))
+    serializeElement(element, 0)
+
+    return "\n".join(rv)
+
+
+def tostring(element):
+    """Serialize an element and its child nodes to a string"""
+    rv = []
+
+    def serializeElement(element):
+        if not hasattr(element, "tag"):
+            if element.docinfo.internalDTD:
+                if element.docinfo.doctype:
+                    dtd_str = element.docinfo.doctype
+                else:
+                    dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name
+                rv.append(dtd_str)
+            serializeElement(element.getroot())
+
+        elif element.tag == comment_type:
+            rv.append("<!--%s-->" % (element.text,))
+
+        else:
+            # This is assumed to be an ordinary element
+            if not element.attrib:
+                rv.append("<%s>" % (element.tag,))
+            else:
+                attr = " ".join(["%s=\"%s\"" % (name, value)
+                                 for name, value in element.attrib.items()])
+                rv.append("<%s %s>" % (element.tag, attr))
+            if element.text:
+                rv.append(element.text)
+
+            for child in element:
+                serializeElement(child)
+
+            rv.append("</%s>" % (element.tag,))
+
+        if hasattr(element, "tail") and element.tail:
+            rv.append(element.tail)
+
+    serializeElement(element)
+
+    return "".join(rv)
+
+
+class TreeBuilder(base.TreeBuilder):
+    documentClass = Document
+    doctypeClass = DocumentType
+    elementClass = None
+    commentClass = None
+    fragmentClass = Document
+    implementation = etree
+
+    def __init__(self, namespaceHTMLElements, fullTree=False):
+        builder = etree_builders.getETreeModule(etree, fullTree=fullTree)
+        infosetFilter = self.infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True)
+        self.namespaceHTMLElements = namespaceHTMLElements
+
+        class Attributes(dict):
+            def __init__(self, element, value=None):
+                if value is None:
+                    value = {}
+                self._element = element
+                dict.__init__(self, value)  # pylint:disable=non-parent-init-called
+                for key, value in self.items():
+                    if isinstance(key, tuple):
+                        name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1]))
+                    else:
+                        name = infosetFilter.coerceAttribute(key)
+                    self._element._element.attrib[name] = value
+
+            def __setitem__(self, key, value):
+                dict.__setitem__(self, key, value)
+                if isinstance(key, tuple):
+                    name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1]))
+                else:
+                    name = infosetFilter.coerceAttribute(key)
+                self._element._element.attrib[name] = value
+
+        class Element(builder.Element):
+            def __init__(self, name, namespace):
+                name = infosetFilter.coerceElement(name)
+                builder.Element.__init__(self, name, namespace=namespace)
+                self._attributes = Attributes(self)
+
+            def _setName(self, name):
+                self._name = infosetFilter.coerceElement(name)
+                self._element.tag = self._getETreeTag(
+                    self._name, self._namespace)
+
+            def _getName(self):
+                return infosetFilter.fromXmlName(self._name)
+
+            name = property(_getName, _setName)
+
+            def _getAttributes(self):
+                return self._attributes
+
+            def _setAttributes(self, attributes):
+                self._attributes = Attributes(self, attributes)
+
+            attributes = property(_getAttributes, _setAttributes)
+
+            def insertText(self, data, insertBefore=None):
+                data = infosetFilter.coerceCharacters(data)
+                builder.Element.insertText(self, data, insertBefore)
+
+            def appendChild(self, child):
+                builder.Element.appendChild(self, child)
+
+        class Comment(builder.Comment):
+            def __init__(self, data):
+                data = infosetFilter.coerceComment(data)
+                builder.Comment.__init__(self, data)
+
+            def _setData(self, data):
+                data = infosetFilter.coerceComment(data)
+                self._element.text = data
+
+            def _getData(self):
+                return self._element.text
+
+            data = property(_getData, _setData)
+
+        self.elementClass = Element
+        self.commentClass = Comment
+        # self.fragmentClass = builder.DocumentFragment
+        base.TreeBuilder.__init__(self, namespaceHTMLElements)
+
+    def reset(self):
+        base.TreeBuilder.reset(self)
+        self.insertComment = self.insertCommentInitial
+        self.initial_comments = []
+        self.doctype = None
+
+    def testSerializer(self, element):
+        return testSerializer(element)
+
+    def getDocument(self):
+        if fullTree:
+            return self.document._elementTree
+        else:
+            return self.document._elementTree.getroot()
+
+    def getFragment(self):
+        fragment = []
+        element = self.openElements[0]._element
+        if element.text:
+            fragment.append(element.text)
+        fragment.extend(list(element))
+        if element.tail:
+            fragment.append(element.tail)
+        return fragment
+
+    def insertDoctype(self, token):
+        name = token["name"]
+        publicId = token["publicId"]
+        systemId = token["systemId"]
+
+        if not name:
+            warnings.warn("lxml cannot represent empty doctype", DataLossWarning)
+            self.doctype = None
+        else:
+            coercedName = self.infosetFilter.coerceElement(name)
+            if coercedName != name:
+                warnings.warn("lxml cannot represent non-xml doctype", DataLossWarning)
+
+            doctype = self.doctypeClass(coercedName, publicId, systemId)
+            self.doctype = doctype
+
+    def insertCommentInitial(self, data, parent=None):
+        assert parent is None or parent is self.document
+        assert self.document._elementTree is None
+        self.initial_comments.append(data)
+
+    def insertCommentMain(self, data, parent=None):
+        if (parent == self.document and
+                self.document._elementTree.getroot()[-1].tag == comment_type):
+            warnings.warn("lxml cannot represent adjacent comments beyond the root elements", DataLossWarning)
+        super(TreeBuilder, self).insertComment(data, parent)
+
+    def insertRoot(self, token):
+        """Create the document root"""
+        # Because of the way libxml2 works, it doesn't seem to be possible to
+        # alter information like the doctype after the tree has been parsed.
+        # Therefore we need to use the built-in parser to create our initial
+        # tree, after which we can add elements like normal
+        docStr = ""
+        if self.doctype:
+            assert self.doctype.name
+            docStr += "<!DOCTYPE %s" % self.doctype.name
+            if (self.doctype.publicId is not None or
+                    self.doctype.systemId is not None):
+                docStr += (' PUBLIC "%s" ' %
+                           (self.infosetFilter.coercePubid(self.doctype.publicId or "")))
+                if self.doctype.systemId:
+                    sysid = self.doctype.systemId
+                    if sysid.find("'") >= 0 and sysid.find('"') >= 0:
+                        warnings.warn("DOCTYPE system cannot contain single and double quotes", DataLossWarning)
+                        sysid = sysid.replace("'", 'U00027')
+                    if sysid.find("'") >= 0:
+                        docStr += '"%s"' % sysid
+                    else:
+                        docStr += "'%s'" % sysid
+                else:
+                    docStr += "''"
+            docStr += ">"
+            if self.doctype.name != token["name"]:
+                warnings.warn("lxml cannot represent doctype with a different name to the root element", DataLossWarning)
+        docStr += "<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>"
+        root = etree.fromstring(docStr)
+
+        # Append the initial comments:
+        for comment_token in self.initial_comments:
+            comment = self.commentClass(comment_token["data"])
+            root.addprevious(comment._element)
+
+        # Create the root document and add the ElementTree to it
+        self.document = self.documentClass()
+        self.document._elementTree = root.getroottree()
+
+        # Give the root element the right name
+        name = token["name"]
+        namespace = token.get("namespace", self.defaultNamespace)
+        if namespace is None:
+            etree_tag = name
+        else:
+            etree_tag = "{%s}%s" % (namespace, name)
+        root.tag = etree_tag
+
+        # Add the root element to the internal child/open data structures
+        root_element = self.elementClass(name, namespace)
+        root_element._element = root
+        self.document._childNodes.append(root_element)
+        self.openElements.append(root_element)
+
+        # Reset to the default insert comment function
+        self.insertComment = self.insertCommentMain
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/__init__.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..9e19a5595af928738fa0e1ab2bc4513e02ebc026
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/__init__.py
@@ -0,0 +1,143 @@
+"""A collection of modules for iterating through different kinds of
+tree, generating tokens identical to those produced by the tokenizer
+module.
+
+To create a tree walker for a new type of tree, you need to do
+implement a tree walker object (called TreeWalker by convention) that
+implements a 'serialize' method taking a tree as sole argument and
+returning an iterator generating tokens.
+"""
+
+from __future__ import absolute_import, division, unicode_literals
+
+from .. import constants
+from .._utils import default_etree
+
+__all__ = ["getTreeWalker", "pprint", "dom", "etree", "genshi", "etree_lxml"]
+
+treeWalkerCache = {}
+
+
+def getTreeWalker(treeType, implementation=None, **kwargs):
+    """Get a TreeWalker class for various types of tree with built-in support
+
+    Args:
+        treeType (str): the name of the tree type required (case-insensitive).
+            Supported values are:
+
+            - "dom": The xml.dom.minidom DOM implementation
+            - "etree": A generic walker for tree implementations exposing an
+                       elementtree-like interface (known to work with
+                       ElementTree, cElementTree and lxml.etree).
+            - "lxml": Optimized walker for lxml.etree
+            - "genshi": a Genshi stream
+
+        Implementation: A module implementing the tree type e.g.
+            xml.etree.ElementTree or cElementTree (Currently applies to the
+            "etree" tree type only).
+    """
+
+    treeType = treeType.lower()
+    if treeType not in treeWalkerCache:
+        if treeType == "dom":
+            from . import dom
+            treeWalkerCache[treeType] = dom.TreeWalker
+        elif treeType == "genshi":
+            from . import genshi
+            treeWalkerCache[treeType] = genshi.TreeWalker
+        elif treeType == "lxml":
+            from . import etree_lxml
+            treeWalkerCache[treeType] = etree_lxml.TreeWalker
+        elif treeType == "etree":
+            from . import etree
+            if implementation is None:
+                implementation = default_etree
+            # XXX: NEVER cache here, caching is done in the etree submodule
+            return etree.getETreeModule(implementation, **kwargs).TreeWalker
+    return treeWalkerCache.get(treeType)
+
+
+def concatenateCharacterTokens(tokens):
+    pendingCharacters = []
+    for token in tokens:
+        type = token["type"]
+        if type in ("Characters", "SpaceCharacters"):
+            pendingCharacters.append(token["data"])
+        else:
+            if pendingCharacters:
+                yield {"type": "Characters", "data": "".join(pendingCharacters)}
+                pendingCharacters = []
+            yield token
+    if pendingCharacters:
+        yield {"type": "Characters", "data": "".join(pendingCharacters)}
+
+
+def pprint(walker):
+    """Pretty printer for tree walkers"""
+    output = []
+    indent = 0
+    for token in concatenateCharacterTokens(walker):
+        type = token["type"]
+        if type in ("StartTag", "EmptyTag"):
+            # tag name
+            if token["namespace"] and token["namespace"] != constants.namespaces["html"]:
+                if token["namespace"] in constants.prefixes:
+                    ns = constants.prefixes[token["namespace"]]
+                else:
+                    ns = token["namespace"]
+                name = "%s %s" % (ns, token["name"])
+            else:
+                name = token["name"]
+            output.append("%s<%s>" % (" " * indent, name))
+            indent += 2
+            # attributes (sorted for consistent ordering)
+            attrs = token["data"]
+            for (namespace, localname), value in sorted(attrs.items()):
+                if namespace:
+                    if namespace in constants.prefixes:
+                        ns = constants.prefixes[namespace]
+                    else:
+                        ns = namespace
+                    name = "%s %s" % (ns, localname)
+                else:
+                    name = localname
+                output.append("%s%s=\"%s\"" % (" " * indent, name, value))
+            # self-closing
+            if type == "EmptyTag":
+                indent -= 2
+
+        elif type == "EndTag":
+            indent -= 2
+
+        elif type == "Comment":
+            output.append("%s<!-- %s -->" % (" " * indent, token["data"]))
+
+        elif type == "Doctype":
+            if token["name"]:
+                if token["publicId"]:
+                    output.append("""%s<!DOCTYPE %s "%s" "%s">""" %
+                                  (" " * indent,
+                                   token["name"],
+                                   token["publicId"],
+                                   token["systemId"] if token["systemId"] else ""))
+                elif token["systemId"]:
+                    output.append("""%s<!DOCTYPE %s "" "%s">""" %
+                                  (" " * indent,
+                                   token["name"],
+                                   token["systemId"]))
+                else:
+                    output.append("%s<!DOCTYPE %s>" % (" " * indent,
+                                                       token["name"]))
+            else:
+                output.append("%s<!DOCTYPE >" % (" " * indent,))
+
+        elif type == "Characters":
+            output.append("%s\"%s\"" % (" " * indent, token["data"]))
+
+        elif type == "SpaceCharacters":
+            assert False, "concatenateCharacterTokens should have got rid of all Space tokens"
+
+        else:
+            raise ValueError("Unknown token type, %s" % type)
+
+    return "\n".join(output)
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/base.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/base.py
new file mode 100644
index 0000000000000000000000000000000000000000..36e1ba2420fb4375adf27f060ab8f15cf138174e
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/base.py
@@ -0,0 +1,150 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from xml.dom import Node
+from ..constants import namespaces, voidElements, spaceCharacters
+
+__all__ = ["DOCUMENT", "DOCTYPE", "TEXT", "ELEMENT", "COMMENT", "ENTITY", "UNKNOWN",
+           "TreeWalker", "NonRecursiveTreeWalker"]
+
+DOCUMENT = Node.DOCUMENT_NODE
+DOCTYPE = Node.DOCUMENT_TYPE_NODE
+TEXT = Node.TEXT_NODE
+ELEMENT = Node.ELEMENT_NODE
+COMMENT = Node.COMMENT_NODE
+ENTITY = Node.ENTITY_NODE
+UNKNOWN = "<#UNKNOWN#>"
+
+spaceCharacters = "".join(spaceCharacters)
+
+
+class TreeWalker(object):
+    def __init__(self, tree):
+        self.tree = tree
+
+    def __iter__(self):
+        raise NotImplementedError
+
+    def error(self, msg):
+        return {"type": "SerializeError", "data": msg}
+
+    def emptyTag(self, namespace, name, attrs, hasChildren=False):
+        yield {"type": "EmptyTag", "name": name,
+               "namespace": namespace,
+               "data": attrs}
+        if hasChildren:
+            yield self.error("Void element has children")
+
+    def startTag(self, namespace, name, attrs):
+        return {"type": "StartTag",
+                "name": name,
+                "namespace": namespace,
+                "data": attrs}
+
+    def endTag(self, namespace, name):
+        return {"type": "EndTag",
+                "name": name,
+                "namespace": namespace}
+
+    def text(self, data):
+        data = data
+        middle = data.lstrip(spaceCharacters)
+        left = data[:len(data) - len(middle)]
+        if left:
+            yield {"type": "SpaceCharacters", "data": left}
+        data = middle
+        middle = data.rstrip(spaceCharacters)
+        right = data[len(middle):]
+        if middle:
+            yield {"type": "Characters", "data": middle}
+        if right:
+            yield {"type": "SpaceCharacters", "data": right}
+
+    def comment(self, data):
+        return {"type": "Comment", "data": data}
+
+    def doctype(self, name, publicId=None, systemId=None):
+        return {"type": "Doctype",
+                "name": name,
+                "publicId": publicId,
+                "systemId": systemId}
+
+    def entity(self, name):
+        return {"type": "Entity", "name": name}
+
+    def unknown(self, nodeType):
+        return self.error("Unknown node type: " + nodeType)
+
+
+class NonRecursiveTreeWalker(TreeWalker):
+    def getNodeDetails(self, node):
+        raise NotImplementedError
+
+    def getFirstChild(self, node):
+        raise NotImplementedError
+
+    def getNextSibling(self, node):
+        raise NotImplementedError
+
+    def getParentNode(self, node):
+        raise NotImplementedError
+
+    def __iter__(self):
+        currentNode = self.tree
+        while currentNode is not None:
+            details = self.getNodeDetails(currentNode)
+            type, details = details[0], details[1:]
+            hasChildren = False
+
+            if type == DOCTYPE:
+                yield self.doctype(*details)
+
+            elif type == TEXT:
+                for token in self.text(*details):
+                    yield token
+
+            elif type == ELEMENT:
+                namespace, name, attributes, hasChildren = details
+                if (not namespace or namespace == namespaces["html"]) and name in voidElements:
+                    for token in self.emptyTag(namespace, name, attributes,
+                                               hasChildren):
+                        yield token
+                    hasChildren = False
+                else:
+                    yield self.startTag(namespace, name, attributes)
+
+            elif type == COMMENT:
+                yield self.comment(details[0])
+
+            elif type == ENTITY:
+                yield self.entity(details[0])
+
+            elif type == DOCUMENT:
+                hasChildren = True
+
+            else:
+                yield self.unknown(details[0])
+
+            if hasChildren:
+                firstChild = self.getFirstChild(currentNode)
+            else:
+                firstChild = None
+
+            if firstChild is not None:
+                currentNode = firstChild
+            else:
+                while currentNode is not None:
+                    details = self.getNodeDetails(currentNode)
+                    type, details = details[0], details[1:]
+                    if type == ELEMENT:
+                        namespace, name, attributes, hasChildren = details
+                        if (namespace and namespace != namespaces["html"]) or name not in voidElements:
+                            yield self.endTag(namespace, name)
+                    if self.tree is currentNode:
+                        currentNode = None
+                        break
+                    nextSibling = self.getNextSibling(currentNode)
+                    if nextSibling is not None:
+                        currentNode = nextSibling
+                        break
+                    else:
+                        currentNode = self.getParentNode(currentNode)
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/dom.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/dom.py
new file mode 100644
index 0000000000000000000000000000000000000000..b0c89b001fd3b60511734c31e452c1d2053468d0
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/dom.py
@@ -0,0 +1,43 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from xml.dom import Node
+
+from . import base
+
+
+class TreeWalker(base.NonRecursiveTreeWalker):
+    def getNodeDetails(self, node):
+        if node.nodeType == Node.DOCUMENT_TYPE_NODE:
+            return base.DOCTYPE, node.name, node.publicId, node.systemId
+
+        elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
+            return base.TEXT, node.nodeValue
+
+        elif node.nodeType == Node.ELEMENT_NODE:
+            attrs = {}
+            for attr in list(node.attributes.keys()):
+                attr = node.getAttributeNode(attr)
+                if attr.namespaceURI:
+                    attrs[(attr.namespaceURI, attr.localName)] = attr.value
+                else:
+                    attrs[(None, attr.name)] = attr.value
+            return (base.ELEMENT, node.namespaceURI, node.nodeName,
+                    attrs, node.hasChildNodes())
+
+        elif node.nodeType == Node.COMMENT_NODE:
+            return base.COMMENT, node.nodeValue
+
+        elif node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE):
+            return (base.DOCUMENT,)
+
+        else:
+            return base.UNKNOWN, node.nodeType
+
+    def getFirstChild(self, node):
+        return node.firstChild
+
+    def getNextSibling(self, node):
+        return node.nextSibling
+
+    def getParentNode(self, node):
+        return node.parentNode
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/etree.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/etree.py
new file mode 100644
index 0000000000000000000000000000000000000000..bcf17d170cbf6d6164a7c2fbf58c85844386c918
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/etree.py
@@ -0,0 +1,137 @@
+from __future__ import absolute_import, division, unicode_literals
+
+try:
+    from collections import OrderedDict
+except ImportError:
+    try:
+        from ordereddict import OrderedDict
+    except ImportError:
+        OrderedDict = dict
+
+import re
+
+from pip._vendor.six import string_types
+
+from . import base
+from .._utils import moduleFactoryFactory
+
+tag_regexp = re.compile("{([^}]*)}(.*)")
+
+
+def getETreeBuilder(ElementTreeImplementation):
+    ElementTree = ElementTreeImplementation
+    ElementTreeCommentType = ElementTree.Comment("asd").tag
+
+    class TreeWalker(base.NonRecursiveTreeWalker):  # pylint:disable=unused-variable
+        """Given the particular ElementTree representation, this implementation,
+        to avoid using recursion, returns "nodes" as tuples with the following
+        content:
+
+        1. The current element
+
+        2. The index of the element relative to its parent
+
+        3. A stack of ancestor elements
+
+        4. A flag "text", "tail" or None to indicate if the current node is a
+           text node; either the text or tail of the current element (1)
+        """
+        def getNodeDetails(self, node):
+            if isinstance(node, tuple):  # It might be the root Element
+                elt, _, _, flag = node
+                if flag in ("text", "tail"):
+                    return base.TEXT, getattr(elt, flag)
+                else:
+                    node = elt
+
+            if not(hasattr(node, "tag")):
+                node = node.getroot()
+
+            if node.tag in ("DOCUMENT_ROOT", "DOCUMENT_FRAGMENT"):
+                return (base.DOCUMENT,)
+
+            elif node.tag == "<!DOCTYPE>":
+                return (base.DOCTYPE, node.text,
+                        node.get("publicId"), node.get("systemId"))
+
+            elif node.tag == ElementTreeCommentType:
+                return base.COMMENT, node.text
+
+            else:
+                assert isinstance(node.tag, string_types), type(node.tag)
+                # This is assumed to be an ordinary element
+                match = tag_regexp.match(node.tag)
+                if match:
+                    namespace, tag = match.groups()
+                else:
+                    namespace = None
+                    tag = node.tag
+                attrs = OrderedDict()
+                for name, value in list(node.attrib.items()):
+                    match = tag_regexp.match(name)
+                    if match:
+                        attrs[(match.group(1), match.group(2))] = value
+                    else:
+                        attrs[(None, name)] = value
+                return (base.ELEMENT, namespace, tag,
+                        attrs, len(node) or node.text)
+
+        def getFirstChild(self, node):
+            if isinstance(node, tuple):
+                element, key, parents, flag = node
+            else:
+                element, key, parents, flag = node, None, [], None
+
+            if flag in ("text", "tail"):
+                return None
+            else:
+                if element.text:
+                    return element, key, parents, "text"
+                elif len(element):
+                    parents.append(element)
+                    return element[0], 0, parents, None
+                else:
+                    return None
+
+        def getNextSibling(self, node):
+            if isinstance(node, tuple):
+                element, key, parents, flag = node
+            else:
+                return None
+
+            if flag == "text":
+                if len(element):
+                    parents.append(element)
+                    return element[0], 0, parents, None
+                else:
+                    return None
+            else:
+                if element.tail and flag != "tail":
+                    return element, key, parents, "tail"
+                elif key < len(parents[-1]) - 1:
+                    return parents[-1][key + 1], key + 1, parents, None
+                else:
+                    return None
+
+        def getParentNode(self, node):
+            if isinstance(node, tuple):
+                element, key, parents, flag = node
+            else:
+                return None
+
+            if flag == "text":
+                if not parents:
+                    return element
+                else:
+                    return element, key, parents, None
+            else:
+                parent = parents.pop()
+                if not parents:
+                    return parent
+                else:
+                    assert list(parents[-1]).count(parent) == 1
+                    return parent, list(parents[-1]).index(parent), parents, None
+
+    return locals()
+
+getETreeModule = moduleFactoryFactory(getETreeBuilder)
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/etree_lxml.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/etree_lxml.py
new file mode 100644
index 0000000000000000000000000000000000000000..e81ddf33b2eff3b278effd4602ef1511311ee4f6
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/etree_lxml.py
@@ -0,0 +1,213 @@
+from __future__ import absolute_import, division, unicode_literals
+from pip._vendor.six import text_type
+
+from lxml import etree
+from ..treebuilders.etree import tag_regexp
+
+from . import base
+
+from .. import _ihatexml
+
+
+def ensure_str(s):
+    if s is None:
+        return None
+    elif isinstance(s, text_type):
+        return s
+    else:
+        return s.decode("ascii", "strict")
+
+
+class Root(object):
+    def __init__(self, et):
+        self.elementtree = et
+        self.children = []
+
+        try:
+            if et.docinfo.internalDTD:
+                self.children.append(Doctype(self,
+                                             ensure_str(et.docinfo.root_name),
+                                             ensure_str(et.docinfo.public_id),
+                                             ensure_str(et.docinfo.system_url)))
+        except AttributeError:
+            pass
+
+        try:
+            node = et.getroot()
+        except AttributeError:
+            node = et
+
+        while node.getprevious() is not None:
+            node = node.getprevious()
+        while node is not None:
+            self.children.append(node)
+            node = node.getnext()
+
+        self.text = None
+        self.tail = None
+
+    def __getitem__(self, key):
+        return self.children[key]
+
+    def getnext(self):
+        return None
+
+    def __len__(self):
+        return 1
+
+
+class Doctype(object):
+    def __init__(self, root_node, name, public_id, system_id):
+        self.root_node = root_node
+        self.name = name
+        self.public_id = public_id
+        self.system_id = system_id
+
+        self.text = None
+        self.tail = None
+
+    def getnext(self):
+        return self.root_node.children[1]
+
+
+class FragmentRoot(Root):
+    def __init__(self, children):
+        self.children = [FragmentWrapper(self, child) for child in children]
+        self.text = self.tail = None
+
+    def getnext(self):
+        return None
+
+
+class FragmentWrapper(object):
+    def __init__(self, fragment_root, obj):
+        self.root_node = fragment_root
+        self.obj = obj
+        if hasattr(self.obj, 'text'):
+            self.text = ensure_str(self.obj.text)
+        else:
+            self.text = None
+        if hasattr(self.obj, 'tail'):
+            self.tail = ensure_str(self.obj.tail)
+        else:
+            self.tail = None
+
+    def __getattr__(self, name):
+        return getattr(self.obj, name)
+
+    def getnext(self):
+        siblings = self.root_node.children
+        idx = siblings.index(self)
+        if idx < len(siblings) - 1:
+            return siblings[idx + 1]
+        else:
+            return None
+
+    def __getitem__(self, key):
+        return self.obj[key]
+
+    def __bool__(self):
+        return bool(self.obj)
+
+    def getparent(self):
+        return None
+
+    def __str__(self):
+        return str(self.obj)
+
+    def __unicode__(self):
+        return str(self.obj)
+
+    def __len__(self):
+        return len(self.obj)
+
+
+class TreeWalker(base.NonRecursiveTreeWalker):
+    def __init__(self, tree):
+        # pylint:disable=redefined-variable-type
+        if isinstance(tree, list):
+            self.fragmentChildren = set(tree)
+            tree = FragmentRoot(tree)
+        else:
+            self.fragmentChildren = set()
+            tree = Root(tree)
+        base.NonRecursiveTreeWalker.__init__(self, tree)
+        self.filter = _ihatexml.InfosetFilter()
+
+    def getNodeDetails(self, node):
+        if isinstance(node, tuple):  # Text node
+            node, key = node
+            assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key
+            return base.TEXT, ensure_str(getattr(node, key))
+
+        elif isinstance(node, Root):
+            return (base.DOCUMENT,)
+
+        elif isinstance(node, Doctype):
+            return base.DOCTYPE, node.name, node.public_id, node.system_id
+
+        elif isinstance(node, FragmentWrapper) and not hasattr(node, "tag"):
+            return base.TEXT, ensure_str(node.obj)
+
+        elif node.tag == etree.Comment:
+            return base.COMMENT, ensure_str(node.text)
+
+        elif node.tag == etree.Entity:
+            return base.ENTITY, ensure_str(node.text)[1:-1]  # strip &;
+
+        else:
+            # This is assumed to be an ordinary element
+            match = tag_regexp.match(ensure_str(node.tag))
+            if match:
+                namespace, tag = match.groups()
+            else:
+                namespace = None
+                tag = ensure_str(node.tag)
+            attrs = {}
+            for name, value in list(node.attrib.items()):
+                name = ensure_str(name)
+                value = ensure_str(value)
+                match = tag_regexp.match(name)
+                if match:
+                    attrs[(match.group(1), match.group(2))] = value
+                else:
+                    attrs[(None, name)] = value
+            return (base.ELEMENT, namespace, self.filter.fromXmlName(tag),
+                    attrs, len(node) > 0 or node.text)
+
+    def getFirstChild(self, node):
+        assert not isinstance(node, tuple), "Text nodes have no children"
+
+        assert len(node) or node.text, "Node has no children"
+        if node.text:
+            return (node, "text")
+        else:
+            return node[0]
+
+    def getNextSibling(self, node):
+        if isinstance(node, tuple):  # Text node
+            node, key = node
+            assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key
+            if key == "text":
+                # XXX: we cannot use a "bool(node) and node[0] or None" construct here
+                # because node[0] might evaluate to False if it has no child element
+                if len(node):
+                    return node[0]
+                else:
+                    return None
+            else:  # tail
+                return node.getnext()
+
+        return (node, "tail") if node.tail else node.getnext()
+
+    def getParentNode(self, node):
+        if isinstance(node, tuple):  # Text node
+            node, key = node
+            assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key
+            if key == "text":
+                return node
+            # else: fallback to "normal" processing
+        elif node in self.fragmentChildren:
+            return None
+
+        return node.getparent()
diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/genshi.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/genshi.py
new file mode 100644
index 0000000000000000000000000000000000000000..7483be27d4d24f845e56b6954ee63eec730c00aa
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/genshi.py
@@ -0,0 +1,69 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from genshi.core import QName
+from genshi.core import START, END, XML_NAMESPACE, DOCTYPE, TEXT
+from genshi.core import START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT
+
+from . import base
+
+from ..constants import voidElements, namespaces
+
+
+class TreeWalker(base.TreeWalker):
+    def __iter__(self):
+        # Buffer the events so we can pass in the following one
+        previous = None
+        for event in self.tree:
+            if previous is not None:
+                for token in self.tokens(previous, event):
+                    yield token
+            previous = event
+
+        # Don't forget the final event!
+        if previous is not None:
+            for token in self.tokens(previous, None):
+                yield token
+
+    def tokens(self, event, next):
+        kind, data, _ = event
+        if kind == START:
+            tag, attribs = data
+            name = tag.localname
+            namespace = tag.namespace
+            converted_attribs = {}
+            for k, v in attribs:
+                if isinstance(k, QName):
+                    converted_attribs[(k.namespace, k.localname)] = v
+                else:
+                    converted_attribs[(None, k)] = v
+
+            if namespace == namespaces["html"] and name in voidElements:
+                for token in self.emptyTag(namespace, name, converted_attribs,
+                                           not next or next[0] != END or
+                                           next[1] != tag):
+                    yield token
+            else:
+                yield self.startTag(namespace, name, converted_attribs)
+
+        elif kind == END:
+            name = data.localname
+            namespace = data.namespace
+            if namespace != namespaces["html"] or name not in voidElements:
+                yield self.endTag(namespace, name)
+
+        elif kind == COMMENT:
+            yield self.comment(data)
+
+        elif kind == TEXT:
+            for token in self.text(data):
+                yield token
+
+        elif kind == DOCTYPE:
+            yield self.doctype(*data)
+
+        elif kind in (XML_NAMESPACE, DOCTYPE, START_NS, END_NS,
+                      START_CDATA, END_CDATA, PI):
+            pass
+
+        else:
+            yield self.unknown(kind)
diff --git a/vendor/pip-9.0.3/pip/_vendor/idna/__init__.py b/vendor/pip-9.0.3/pip/_vendor/idna/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..847bf9354781fddc44ed2f47055a67c025972fd4
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/idna/__init__.py
@@ -0,0 +1,2 @@
+from .package_data import __version__
+from .core import *
diff --git a/vendor/pip-9.0.3/pip/_vendor/idna/codec.py b/vendor/pip-9.0.3/pip/_vendor/idna/codec.py
new file mode 100644
index 0000000000000000000000000000000000000000..98c65ead146e42b359a11703d719bafe916b1ad7
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/idna/codec.py
@@ -0,0 +1,118 @@
+from .core import encode, decode, alabel, ulabel, IDNAError
+import codecs
+import re
+
+_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]')
+
+class Codec(codecs.Codec):
+
+    def encode(self, data, errors='strict'):
+
+        if errors != 'strict':
+            raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
+
+        if not data:
+            return "", 0
+
+        return encode(data), len(data)
+
+    def decode(self, data, errors='strict'):
+
+        if errors != 'strict':
+            raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
+
+        if not data:
+            return u"", 0
+
+        return decode(data), len(data)
+
+class IncrementalEncoder(codecs.BufferedIncrementalEncoder):
+    def _buffer_encode(self, data, errors, final):
+        if errors != 'strict':
+            raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
+
+        if not data:
+            return ("", 0)
+
+        labels = _unicode_dots_re.split(data)
+        trailing_dot = u''
+        if labels:
+            if not labels[-1]:
+                trailing_dot = '.'
+                del labels[-1]
+            elif not final:
+                # Keep potentially unfinished label until the next call
+                del labels[-1]
+                if labels:
+                    trailing_dot = '.'
+
+        result = []
+        size = 0
+        for label in labels:
+            result.append(alabel(label))
+            if size:
+                size += 1
+            size += len(label)
+
+        # Join with U+002E
+        result = ".".join(result) + trailing_dot
+        size += len(trailing_dot)
+        return (result, size)
+
+class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
+    def _buffer_decode(self, data, errors, final):
+        if errors != 'strict':
+            raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
+
+        if not data:
+            return (u"", 0)
+
+        # IDNA allows decoding to operate on Unicode strings, too.
+        if isinstance(data, unicode):
+            labels = _unicode_dots_re.split(data)
+        else:
+            # Must be ASCII string
+            data = str(data)
+            unicode(data, "ascii")
+            labels = data.split(".")
+
+        trailing_dot = u''
+        if labels:
+            if not labels[-1]:
+                trailing_dot = u'.'
+                del labels[-1]
+            elif not final:
+                # Keep potentially unfinished label until the next call
+                del labels[-1]
+                if labels:
+                    trailing_dot = u'.'
+
+        result = []
+        size = 0
+        for label in labels:
+            result.append(ulabel(label))
+            if size:
+                size += 1
+            size += len(label)
+
+        result = u".".join(result) + trailing_dot
+        size += len(trailing_dot)
+        return (result, size)
+
+
+class StreamWriter(Codec, codecs.StreamWriter):
+    pass
+
+class StreamReader(Codec, codecs.StreamReader):
+    pass
+
+def getregentry():
+    return codecs.CodecInfo(
+        name='idna',
+        encode=Codec().encode,
+        decode=Codec().decode,
+        incrementalencoder=IncrementalEncoder,
+        incrementaldecoder=IncrementalDecoder,
+        streamwriter=StreamWriter,
+        streamreader=StreamReader,
+    )
diff --git a/vendor/pip-9.0.3/pip/_vendor/idna/compat.py b/vendor/pip-9.0.3/pip/_vendor/idna/compat.py
new file mode 100644
index 0000000000000000000000000000000000000000..4d47f336dbc55ca7141150c14ec1a7924dd0e854
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/idna/compat.py
@@ -0,0 +1,12 @@
+from .core import *
+from .codec import *
+
+def ToASCII(label):
+    return encode(label)
+
+def ToUnicode(label):
+    return decode(label)
+
+def nameprep(s):
+    raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol")
+
diff --git a/vendor/pip-9.0.3/pip/_vendor/idna/core.py b/vendor/pip-9.0.3/pip/_vendor/idna/core.py
new file mode 100644
index 0000000000000000000000000000000000000000..b55b664568ea4fecf954196381047a9918bd4926
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/idna/core.py
@@ -0,0 +1,387 @@
+from . import idnadata
+import bisect
+import unicodedata
+import re
+import sys
+from .intranges import intranges_contain
+
+_virama_combining_class = 9
+_alabel_prefix = b'xn--'
+_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]')
+
+if sys.version_info[0] == 3:
+    unicode = str
+    unichr = chr
+
+class IDNAError(UnicodeError):
+    """ Base exception for all IDNA-encoding related problems """
+    pass
+
+
+class IDNABidiError(IDNAError):
+    """ Exception when bidirectional requirements are not satisfied """
+    pass
+
+
+class InvalidCodepoint(IDNAError):
+    """ Exception when a disallowed or unallocated codepoint is used """
+    pass
+
+
+class InvalidCodepointContext(IDNAError):
+    """ Exception when the codepoint is not valid in the context it is used """
+    pass
+
+
+def _combining_class(cp):
+    return unicodedata.combining(unichr(cp))
+
+def _is_script(cp, script):
+    return intranges_contain(ord(cp), idnadata.scripts[script])
+
+def _punycode(s):
+    return s.encode('punycode')
+
+def _unot(s):
+    return 'U+{0:04X}'.format(s)
+
+
+def valid_label_length(label):
+
+    if len(label) > 63:
+        return False
+    return True
+
+
+def valid_string_length(label, trailing_dot):
+
+    if len(label) > (254 if trailing_dot else 253):
+        return False
+    return True
+
+
+def check_bidi(label, check_ltr=False):
+
+    # Bidi rules should only be applied if string contains RTL characters
+    bidi_label = False
+    for (idx, cp) in enumerate(label, 1):
+        direction = unicodedata.bidirectional(cp)
+        if direction == '':
+            # String likely comes from a newer version of Unicode
+            raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx))
+        if direction in ['R', 'AL', 'AN']:
+            bidi_label = True
+            break
+    if not bidi_label and not check_ltr:
+        return True
+
+    # Bidi rule 1
+    direction = unicodedata.bidirectional(label[0])
+    if direction in ['R', 'AL']:
+        rtl = True
+    elif direction == 'L':
+        rtl = False
+    else:
+        raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label)))
+
+    valid_ending = False
+    number_type = False
+    for (idx, cp) in enumerate(label, 1):
+        direction = unicodedata.bidirectional(cp)
+
+        if rtl:
+            # Bidi rule 2
+            if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']:
+                raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx))
+            # Bidi rule 3
+            if direction in ['R', 'AL', 'EN', 'AN']:
+                valid_ending = True
+            elif direction != 'NSM':
+                valid_ending = False
+            # Bidi rule 4
+            if direction in ['AN', 'EN']:
+                if not number_type:
+                    number_type = direction
+                else:
+                    if number_type != direction:
+                        raise IDNABidiError('Can not mix numeral types in a right-to-left label')
+        else:
+            # Bidi rule 5
+            if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']:
+                raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx))
+            # Bidi rule 6
+            if direction in ['L', 'EN']:
+                valid_ending = True
+            elif direction != 'NSM':
+                valid_ending = False
+
+    if not valid_ending:
+        raise IDNABidiError('Label ends with illegal codepoint directionality')
+
+    return True
+
+
+def check_initial_combiner(label):
+
+    if unicodedata.category(label[0])[0] == 'M':
+        raise IDNAError('Label begins with an illegal combining character')
+    return True
+
+
+def check_hyphen_ok(label):
+
+    if label[2:4] == '--':
+        raise IDNAError('Label has disallowed hyphens in 3rd and 4th position')
+    if label[0] == '-' or label[-1] == '-':
+        raise IDNAError('Label must not start or end with a hyphen')
+    return True
+
+
+def check_nfc(label):
+
+    if unicodedata.normalize('NFC', label) != label:
+        raise IDNAError('Label must be in Normalization Form C')
+
+
+def valid_contextj(label, pos):
+
+    cp_value = ord(label[pos])
+
+    if cp_value == 0x200c:
+
+        if pos > 0:
+            if _combining_class(ord(label[pos - 1])) == _virama_combining_class:
+                return True
+
+        ok = False
+        for i in range(pos-1, -1, -1):
+            joining_type = idnadata.joining_types.get(ord(label[i]))
+            if joining_type == ord('T'):
+                continue
+            if joining_type in [ord('L'), ord('D')]:
+                ok = True
+                break
+
+        if not ok:
+            return False
+
+        ok = False
+        for i in range(pos+1, len(label)):
+            joining_type = idnadata.joining_types.get(ord(label[i]))
+            if joining_type == ord('T'):
+                continue
+            if joining_type in [ord('R'), ord('D')]:
+                ok = True
+                break
+        return ok
+
+    if cp_value == 0x200d:
+
+        if pos > 0:
+            if _combining_class(ord(label[pos - 1])) == _virama_combining_class:
+                return True
+        return False
+
+    else:
+
+        return False
+
+
+def valid_contexto(label, pos, exception=False):
+
+    cp_value = ord(label[pos])
+
+    if cp_value == 0x00b7:
+        if 0 < pos < len(label)-1:
+            if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c:
+                return True
+        return False
+
+    elif cp_value == 0x0375:
+        if pos < len(label)-1 and len(label) > 1:
+            return _is_script(label[pos + 1], 'Greek')
+        return False
+
+    elif cp_value == 0x05f3 or cp_value == 0x05f4:
+        if pos > 0:
+            return _is_script(label[pos - 1], 'Hebrew')
+        return False
+
+    elif cp_value == 0x30fb:
+        for cp in label:
+            if cp == u'\u30fb':
+                continue
+            if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'):
+                return True
+        return False
+
+    elif 0x660 <= cp_value <= 0x669:
+        for cp in label:
+            if 0x6f0 <= ord(cp) <= 0x06f9:
+                return False
+        return True
+
+    elif 0x6f0 <= cp_value <= 0x6f9:
+        for cp in label:
+            if 0x660 <= ord(cp) <= 0x0669:
+                return False
+        return True
+
+
+def check_label(label):
+
+    if isinstance(label, (bytes, bytearray)):
+        label = label.decode('utf-8')
+    if len(label) == 0:
+        raise IDNAError('Empty Label')
+
+    check_nfc(label)
+    check_hyphen_ok(label)
+    check_initial_combiner(label)
+
+    for (pos, cp) in enumerate(label):
+        cp_value = ord(cp)
+        if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']):
+            continue
+        elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']):
+            if not valid_contextj(label, pos):
+                raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label)))
+        elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']):
+            if not valid_contexto(label, pos):
+                raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label)))
+        else:
+            raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label)))
+
+    check_bidi(label)
+
+
+def alabel(label):
+
+    try:
+        label = label.encode('ascii')
+        try:
+            ulabel(label)
+        except IDNAError:
+            raise IDNAError('The label {0} is not a valid A-label'.format(label))
+        if not valid_label_length(label):
+            raise IDNAError('Label too long')
+        return label
+    except UnicodeEncodeError:
+        pass
+
+    if not label:
+        raise IDNAError('No Input')
+
+    label = unicode(label)
+    check_label(label)
+    label = _punycode(label)
+    label = _alabel_prefix + label
+
+    if not valid_label_length(label):
+        raise IDNAError('Label too long')
+
+    return label
+
+
+def ulabel(label):
+
+    if not isinstance(label, (bytes, bytearray)):
+        try:
+            label = label.encode('ascii')
+        except UnicodeEncodeError:
+            check_label(label)
+            return label
+
+    label = label.lower()
+    if label.startswith(_alabel_prefix):
+        label = label[len(_alabel_prefix):]
+    else:
+        check_label(label)
+        return label.decode('ascii')
+
+    label = label.decode('punycode')
+    check_label(label)
+    return label
+
+
+def uts46_remap(domain, std3_rules=True, transitional=False):
+    """Re-map the characters in the string according to UTS46 processing."""
+    from .uts46data import uts46data
+    output = u""
+    try:
+        for pos, char in enumerate(domain):
+            code_point = ord(char)
+            uts46row = uts46data[code_point if code_point < 256 else
+                bisect.bisect_left(uts46data, (code_point, "Z")) - 1]
+            status = uts46row[1]
+            replacement = uts46row[2] if len(uts46row) == 3 else None
+            if (status == "V" or
+                    (status == "D" and not transitional) or
+                    (status == "3" and std3_rules and replacement is None)):
+                output += char
+            elif replacement is not None and (status == "M" or
+                    (status == "3" and std3_rules) or
+                    (status == "D" and transitional)):
+                output += replacement
+            elif status != "I":
+                raise IndexError()
+        return unicodedata.normalize("NFC", output)
+    except IndexError:
+        raise InvalidCodepoint(
+            "Codepoint {0} not allowed at position {1} in {2}".format(
+            _unot(code_point), pos + 1, repr(domain)))
+
+
+def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False):
+
+    if isinstance(s, (bytes, bytearray)):
+        s = s.decode("ascii")
+    if uts46:
+        s = uts46_remap(s, std3_rules, transitional)
+    trailing_dot = False
+    result = []
+    if strict:
+        labels = s.split('.')
+    else:
+        labels = _unicode_dots_re.split(s)
+    while labels and not labels[0]:
+        del labels[0]
+    if not labels:
+        raise IDNAError('Empty domain')
+    if labels[-1] == '':
+        del labels[-1]
+        trailing_dot = True
+    for label in labels:
+        result.append(alabel(label))
+    if trailing_dot:
+        result.append(b'')
+    s = b'.'.join(result)
+    if not valid_string_length(s, trailing_dot):
+        raise IDNAError('Domain too long')
+    return s
+
+
+def decode(s, strict=False, uts46=False, std3_rules=False):
+
+    if isinstance(s, (bytes, bytearray)):
+        s = s.decode("ascii")
+    if uts46:
+        s = uts46_remap(s, std3_rules, False)
+    trailing_dot = False
+    result = []
+    if not strict:
+        labels = _unicode_dots_re.split(s)
+    else:
+        labels = s.split(u'.')
+    while labels and not labels[0]:
+        del labels[0]
+    if not labels:
+        raise IDNAError('Empty domain')
+    if not labels[-1]:
+        del labels[-1]
+        trailing_dot = True
+    for label in labels:
+        result.append(ulabel(label))
+    if trailing_dot:
+        result.append(u'')
+    return u'.'.join(result)
diff --git a/vendor/pip-9.0.3/pip/_vendor/idna/idnadata.py b/vendor/pip-9.0.3/pip/_vendor/idna/idnadata.py
new file mode 100644
index 0000000000000000000000000000000000000000..c48f1b5047dfd12a58bc46e0394bb7701577d7e4
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/idna/idnadata.py
@@ -0,0 +1,1585 @@
+# This file is automatically generated by tools/idna-data
+
+__version__ = "6.3.0"
+scripts = {
+    'Greek': (
+        0x37000000374,
+        0x37500000378,
+        0x37a0000037e,
+        0x38400000385,
+        0x38600000387,
+        0x3880000038b,
+        0x38c0000038d,
+        0x38e000003a2,
+        0x3a3000003e2,
+        0x3f000000400,
+        0x1d2600001d2b,
+        0x1d5d00001d62,
+        0x1d6600001d6b,
+        0x1dbf00001dc0,
+        0x1f0000001f16,
+        0x1f1800001f1e,
+        0x1f2000001f46,
+        0x1f4800001f4e,
+        0x1f5000001f58,
+        0x1f5900001f5a,
+        0x1f5b00001f5c,
+        0x1f5d00001f5e,
+        0x1f5f00001f7e,
+        0x1f8000001fb5,
+        0x1fb600001fc5,
+        0x1fc600001fd4,
+        0x1fd600001fdc,
+        0x1fdd00001ff0,
+        0x1ff200001ff5,
+        0x1ff600001fff,
+        0x212600002127,
+        0x101400001018b,
+        0x1d2000001d246,
+    ),
+    'Han': (
+        0x2e8000002e9a,
+        0x2e9b00002ef4,
+        0x2f0000002fd6,
+        0x300500003006,
+        0x300700003008,
+        0x30210000302a,
+        0x30380000303c,
+        0x340000004db6,
+        0x4e0000009fcd,
+        0xf9000000fa6e,
+        0xfa700000fada,
+        0x200000002a6d7,
+        0x2a7000002b735,
+        0x2b7400002b81e,
+        0x2f8000002fa1e,
+    ),
+    'Hebrew': (
+        0x591000005c8,
+        0x5d0000005eb,
+        0x5f0000005f5,
+        0xfb1d0000fb37,
+        0xfb380000fb3d,
+        0xfb3e0000fb3f,
+        0xfb400000fb42,
+        0xfb430000fb45,
+        0xfb460000fb50,
+    ),
+    'Hiragana': (
+        0x304100003097,
+        0x309d000030a0,
+        0x1b0010001b002,
+        0x1f2000001f201,
+    ),
+    'Katakana': (
+        0x30a1000030fb,
+        0x30fd00003100,
+        0x31f000003200,
+        0x32d0000032ff,
+        0x330000003358,
+        0xff660000ff70,
+        0xff710000ff9e,
+        0x1b0000001b001,
+    ),
+}
+joining_types = {
+    0x600: 85,
+    0x601: 85,
+    0x602: 85,
+    0x603: 85,
+    0x604: 85,
+    0x608: 85,
+    0x60b: 85,
+    0x620: 68,
+    0x621: 85,
+    0x622: 82,
+    0x623: 82,
+    0x624: 82,
+    0x625: 82,
+    0x626: 68,
+    0x627: 82,
+    0x628: 68,
+    0x629: 82,
+    0x62a: 68,
+    0x62b: 68,
+    0x62c: 68,
+    0x62d: 68,
+    0x62e: 68,
+    0x62f: 82,
+    0x630: 82,
+    0x631: 82,
+    0x632: 82,
+    0x633: 68,
+    0x634: 68,
+    0x635: 68,
+    0x636: 68,
+    0x637: 68,
+    0x638: 68,
+    0x639: 68,
+    0x63a: 68,
+    0x63b: 68,
+    0x63c: 68,
+    0x63d: 68,
+    0x63e: 68,
+    0x63f: 68,
+    0x640: 67,
+    0x641: 68,
+    0x642: 68,
+    0x643: 68,
+    0x644: 68,
+    0x645: 68,
+    0x646: 68,
+    0x647: 68,
+    0x648: 82,
+    0x649: 68,
+    0x64a: 68,
+    0x66e: 68,
+    0x66f: 68,
+    0x671: 82,
+    0x672: 82,
+    0x673: 82,
+    0x674: 85,
+    0x675: 82,
+    0x676: 82,
+    0x677: 82,
+    0x678: 68,
+    0x679: 68,
+    0x67a: 68,
+    0x67b: 68,
+    0x67c: 68,
+    0x67d: 68,
+    0x67e: 68,
+    0x67f: 68,
+    0x680: 68,
+    0x681: 68,
+    0x682: 68,
+    0x683: 68,
+    0x684: 68,
+    0x685: 68,
+    0x686: 68,
+    0x687: 68,
+    0x688: 82,
+    0x689: 82,
+    0x68a: 82,
+    0x68b: 82,
+    0x68c: 82,
+    0x68d: 82,
+    0x68e: 82,
+    0x68f: 82,
+    0x690: 82,
+    0x691: 82,
+    0x692: 82,
+    0x693: 82,
+    0x694: 82,
+    0x695: 82,
+    0x696: 82,
+    0x697: 82,
+    0x698: 82,
+    0x699: 82,
+    0x69a: 68,
+    0x69b: 68,
+    0x69c: 68,
+    0x69d: 68,
+    0x69e: 68,
+    0x69f: 68,
+    0x6a0: 68,
+    0x6a1: 68,
+    0x6a2: 68,
+    0x6a3: 68,
+    0x6a4: 68,
+    0x6a5: 68,
+    0x6a6: 68,
+    0x6a7: 68,
+    0x6a8: 68,
+    0x6a9: 68,
+    0x6aa: 68,
+    0x6ab: 68,
+    0x6ac: 68,
+    0x6ad: 68,
+    0x6ae: 68,
+    0x6af: 68,
+    0x6b0: 68,
+    0x6b1: 68,
+    0x6b2: 68,
+    0x6b3: 68,
+    0x6b4: 68,
+    0x6b5: 68,
+    0x6b6: 68,
+    0x6b7: 68,
+    0x6b8: 68,
+    0x6b9: 68,
+    0x6ba: 68,
+    0x6bb: 68,
+    0x6bc: 68,
+    0x6bd: 68,
+    0x6be: 68,
+    0x6bf: 68,
+    0x6c0: 82,
+    0x6c1: 68,
+    0x6c2: 68,
+    0x6c3: 82,
+    0x6c4: 82,
+    0x6c5: 82,
+    0x6c6: 82,
+    0x6c7: 82,
+    0x6c8: 82,
+    0x6c9: 82,
+    0x6ca: 82,
+    0x6cb: 82,
+    0x6cc: 68,
+    0x6cd: 82,
+    0x6ce: 68,
+    0x6cf: 82,
+    0x6d0: 68,
+    0x6d1: 68,
+    0x6d2: 82,
+    0x6d3: 82,
+    0x6d5: 82,
+    0x6dd: 85,
+    0x6ee: 82,
+    0x6ef: 82,
+    0x6fa: 68,
+    0x6fb: 68,
+    0x6fc: 68,
+    0x6ff: 68,
+    0x710: 82,
+    0x712: 68,
+    0x713: 68,
+    0x714: 68,
+    0x715: 82,
+    0x716: 82,
+    0x717: 82,
+    0x718: 82,
+    0x719: 82,
+    0x71a: 68,
+    0x71b: 68,
+    0x71c: 68,
+    0x71d: 68,
+    0x71e: 82,
+    0x71f: 68,
+    0x720: 68,
+    0x721: 68,
+    0x722: 68,
+    0x723: 68,
+    0x724: 68,
+    0x725: 68,
+    0x726: 68,
+    0x727: 68,
+    0x728: 82,
+    0x729: 68,
+    0x72a: 82,
+    0x72b: 68,
+    0x72c: 82,
+    0x72d: 68,
+    0x72e: 68,
+    0x72f: 82,
+    0x74d: 82,
+    0x74e: 68,
+    0x74f: 68,
+    0x750: 68,
+    0x751: 68,
+    0x752: 68,
+    0x753: 68,
+    0x754: 68,
+    0x755: 68,
+    0x756: 68,
+    0x757: 68,
+    0x758: 68,
+    0x759: 82,
+    0x75a: 82,
+    0x75b: 82,
+    0x75c: 68,
+    0x75d: 68,
+    0x75e: 68,
+    0x75f: 68,
+    0x760: 68,
+    0x761: 68,
+    0x762: 68,
+    0x763: 68,
+    0x764: 68,
+    0x765: 68,
+    0x766: 68,
+    0x767: 68,
+    0x768: 68,
+    0x769: 68,
+    0x76a: 68,
+    0x76b: 82,
+    0x76c: 82,
+    0x76d: 68,
+    0x76e: 68,
+    0x76f: 68,
+    0x770: 68,
+    0x771: 82,
+    0x772: 68,
+    0x773: 82,
+    0x774: 82,
+    0x775: 68,
+    0x776: 68,
+    0x777: 68,
+    0x778: 82,
+    0x779: 82,
+    0x77a: 68,
+    0x77b: 68,
+    0x77c: 68,
+    0x77d: 68,
+    0x77e: 68,
+    0x77f: 68,
+    0x7ca: 68,
+    0x7cb: 68,
+    0x7cc: 68,
+    0x7cd: 68,
+    0x7ce: 68,
+    0x7cf: 68,
+    0x7d0: 68,
+    0x7d1: 68,
+    0x7d2: 68,
+    0x7d3: 68,
+    0x7d4: 68,
+    0x7d5: 68,
+    0x7d6: 68,
+    0x7d7: 68,
+    0x7d8: 68,
+    0x7d9: 68,
+    0x7da: 68,
+    0x7db: 68,
+    0x7dc: 68,
+    0x7dd: 68,
+    0x7de: 68,
+    0x7df: 68,
+    0x7e0: 68,
+    0x7e1: 68,
+    0x7e2: 68,
+    0x7e3: 68,
+    0x7e4: 68,
+    0x7e5: 68,
+    0x7e6: 68,
+    0x7e7: 68,
+    0x7e8: 68,
+    0x7e9: 68,
+    0x7ea: 68,
+    0x7fa: 67,
+    0x840: 82,
+    0x841: 68,
+    0x842: 68,
+    0x843: 68,
+    0x844: 68,
+    0x845: 68,
+    0x846: 82,
+    0x847: 68,
+    0x848: 68,
+    0x849: 82,
+    0x84a: 68,
+    0x84b: 68,
+    0x84c: 68,
+    0x84d: 68,
+    0x84e: 68,
+    0x84f: 82,
+    0x850: 68,
+    0x851: 68,
+    0x852: 68,
+    0x853: 68,
+    0x854: 82,
+    0x855: 68,
+    0x856: 85,
+    0x857: 85,
+    0x858: 85,
+    0x8a0: 68,
+    0x8a2: 68,
+    0x8a3: 68,
+    0x8a4: 68,
+    0x8a5: 68,
+    0x8a6: 68,
+    0x8a7: 68,
+    0x8a8: 68,
+    0x8a9: 68,
+    0x8aa: 82,
+    0x8ab: 82,
+    0x8ac: 82,
+    0x1806: 85,
+    0x1807: 68,
+    0x180a: 67,
+    0x180e: 85,
+    0x1820: 68,
+    0x1821: 68,
+    0x1822: 68,
+    0x1823: 68,
+    0x1824: 68,
+    0x1825: 68,
+    0x1826: 68,
+    0x1827: 68,
+    0x1828: 68,
+    0x1829: 68,
+    0x182a: 68,
+    0x182b: 68,
+    0x182c: 68,
+    0x182d: 68,
+    0x182e: 68,
+    0x182f: 68,
+    0x1830: 68,
+    0x1831: 68,
+    0x1832: 68,
+    0x1833: 68,
+    0x1834: 68,
+    0x1835: 68,
+    0x1836: 68,
+    0x1837: 68,
+    0x1838: 68,
+    0x1839: 68,
+    0x183a: 68,
+    0x183b: 68,
+    0x183c: 68,
+    0x183d: 68,
+    0x183e: 68,
+    0x183f: 68,
+    0x1840: 68,
+    0x1841: 68,
+    0x1842: 68,
+    0x1843: 68,
+    0x1844: 68,
+    0x1845: 68,
+    0x1846: 68,
+    0x1847: 68,
+    0x1848: 68,
+    0x1849: 68,
+    0x184a: 68,
+    0x184b: 68,
+    0x184c: 68,
+    0x184d: 68,
+    0x184e: 68,
+    0x184f: 68,
+    0x1850: 68,
+    0x1851: 68,
+    0x1852: 68,
+    0x1853: 68,
+    0x1854: 68,
+    0x1855: 68,
+    0x1856: 68,
+    0x1857: 68,
+    0x1858: 68,
+    0x1859: 68,
+    0x185a: 68,
+    0x185b: 68,
+    0x185c: 68,
+    0x185d: 68,
+    0x185e: 68,
+    0x185f: 68,
+    0x1860: 68,
+    0x1861: 68,
+    0x1862: 68,
+    0x1863: 68,
+    0x1864: 68,
+    0x1865: 68,
+    0x1866: 68,
+    0x1867: 68,
+    0x1868: 68,
+    0x1869: 68,
+    0x186a: 68,
+    0x186b: 68,
+    0x186c: 68,
+    0x186d: 68,
+    0x186e: 68,
+    0x186f: 68,
+    0x1870: 68,
+    0x1871: 68,
+    0x1872: 68,
+    0x1873: 68,
+    0x1874: 68,
+    0x1875: 68,
+    0x1876: 68,
+    0x1877: 68,
+    0x1880: 85,
+    0x1881: 85,
+    0x1882: 85,
+    0x1883: 85,
+    0x1884: 85,
+    0x1885: 85,
+    0x1886: 85,
+    0x1887: 68,
+    0x1888: 68,
+    0x1889: 68,
+    0x188a: 68,
+    0x188b: 68,
+    0x188c: 68,
+    0x188d: 68,
+    0x188e: 68,
+    0x188f: 68,
+    0x1890: 68,
+    0x1891: 68,
+    0x1892: 68,
+    0x1893: 68,
+    0x1894: 68,
+    0x1895: 68,
+    0x1896: 68,
+    0x1897: 68,
+    0x1898: 68,
+    0x1899: 68,
+    0x189a: 68,
+    0x189b: 68,
+    0x189c: 68,
+    0x189d: 68,
+    0x189e: 68,
+    0x189f: 68,
+    0x18a0: 68,
+    0x18a1: 68,
+    0x18a2: 68,
+    0x18a3: 68,
+    0x18a4: 68,
+    0x18a5: 68,
+    0x18a6: 68,
+    0x18a7: 68,
+    0x18a8: 68,
+    0x18aa: 68,
+    0x200c: 85,
+    0x200d: 67,
+    0x2066: 85,
+    0x2067: 85,
+    0x2068: 85,
+    0x2069: 85,
+    0xa840: 68,
+    0xa841: 68,
+    0xa842: 68,
+    0xa843: 68,
+    0xa844: 68,
+    0xa845: 68,
+    0xa846: 68,
+    0xa847: 68,
+    0xa848: 68,
+    0xa849: 68,
+    0xa84a: 68,
+    0xa84b: 68,
+    0xa84c: 68,
+    0xa84d: 68,
+    0xa84e: 68,
+    0xa84f: 68,
+    0xa850: 68,
+    0xa851: 68,
+    0xa852: 68,
+    0xa853: 68,
+    0xa854: 68,
+    0xa855: 68,
+    0xa856: 68,
+    0xa857: 68,
+    0xa858: 68,
+    0xa859: 68,
+    0xa85a: 68,
+    0xa85b: 68,
+    0xa85c: 68,
+    0xa85d: 68,
+    0xa85e: 68,
+    0xa85f: 68,
+    0xa860: 68,
+    0xa861: 68,
+    0xa862: 68,
+    0xa863: 68,
+    0xa864: 68,
+    0xa865: 68,
+    0xa866: 68,
+    0xa867: 68,
+    0xa868: 68,
+    0xa869: 68,
+    0xa86a: 68,
+    0xa86b: 68,
+    0xa86c: 68,
+    0xa86d: 68,
+    0xa86e: 68,
+    0xa86f: 68,
+    0xa870: 68,
+    0xa871: 68,
+    0xa872: 76,
+    0xa873: 85,
+}
+codepoint_classes = {
+    'PVALID': (
+        0x2d0000002e,
+        0x300000003a,
+        0x610000007b,
+        0xdf000000f7,
+        0xf800000100,
+        0x10100000102,
+        0x10300000104,
+        0x10500000106,
+        0x10700000108,
+        0x1090000010a,
+        0x10b0000010c,
+        0x10d0000010e,
+        0x10f00000110,
+        0x11100000112,
+        0x11300000114,
+        0x11500000116,
+        0x11700000118,
+        0x1190000011a,
+        0x11b0000011c,
+        0x11d0000011e,
+        0x11f00000120,
+        0x12100000122,
+        0x12300000124,
+        0x12500000126,
+        0x12700000128,
+        0x1290000012a,
+        0x12b0000012c,
+        0x12d0000012e,
+        0x12f00000130,
+        0x13100000132,
+        0x13500000136,
+        0x13700000139,
+        0x13a0000013b,
+        0x13c0000013d,
+        0x13e0000013f,
+        0x14200000143,
+        0x14400000145,
+        0x14600000147,
+        0x14800000149,
+        0x14b0000014c,
+        0x14d0000014e,
+        0x14f00000150,
+        0x15100000152,
+        0x15300000154,
+        0x15500000156,
+        0x15700000158,
+        0x1590000015a,
+        0x15b0000015c,
+        0x15d0000015e,
+        0x15f00000160,
+        0x16100000162,
+        0x16300000164,
+        0x16500000166,
+        0x16700000168,
+        0x1690000016a,
+        0x16b0000016c,
+        0x16d0000016e,
+        0x16f00000170,
+        0x17100000172,
+        0x17300000174,
+        0x17500000176,
+        0x17700000178,
+        0x17a0000017b,
+        0x17c0000017d,
+        0x17e0000017f,
+        0x18000000181,
+        0x18300000184,
+        0x18500000186,
+        0x18800000189,
+        0x18c0000018e,
+        0x19200000193,
+        0x19500000196,
+        0x1990000019c,
+        0x19e0000019f,
+        0x1a1000001a2,
+        0x1a3000001a4,
+        0x1a5000001a6,
+        0x1a8000001a9,
+        0x1aa000001ac,
+        0x1ad000001ae,
+        0x1b0000001b1,
+        0x1b4000001b5,
+        0x1b6000001b7,
+        0x1b9000001bc,
+        0x1bd000001c4,
+        0x1ce000001cf,
+        0x1d0000001d1,
+        0x1d2000001d3,
+        0x1d4000001d5,
+        0x1d6000001d7,
+        0x1d8000001d9,
+        0x1da000001db,
+        0x1dc000001de,
+        0x1df000001e0,
+        0x1e1000001e2,
+        0x1e3000001e4,
+        0x1e5000001e6,
+        0x1e7000001e8,
+        0x1e9000001ea,
+        0x1eb000001ec,
+        0x1ed000001ee,
+        0x1ef000001f1,
+        0x1f5000001f6,
+        0x1f9000001fa,
+        0x1fb000001fc,
+        0x1fd000001fe,
+        0x1ff00000200,
+        0x20100000202,
+        0x20300000204,
+        0x20500000206,
+        0x20700000208,
+        0x2090000020a,
+        0x20b0000020c,
+        0x20d0000020e,
+        0x20f00000210,
+        0x21100000212,
+        0x21300000214,
+        0x21500000216,
+        0x21700000218,
+        0x2190000021a,
+        0x21b0000021c,
+        0x21d0000021e,
+        0x21f00000220,
+        0x22100000222,
+        0x22300000224,
+        0x22500000226,
+        0x22700000228,
+        0x2290000022a,
+        0x22b0000022c,
+        0x22d0000022e,
+        0x22f00000230,
+        0x23100000232,
+        0x2330000023a,
+        0x23c0000023d,
+        0x23f00000241,
+        0x24200000243,
+        0x24700000248,
+        0x2490000024a,
+        0x24b0000024c,
+        0x24d0000024e,
+        0x24f000002b0,
+        0x2b9000002c2,
+        0x2c6000002d2,
+        0x2ec000002ed,
+        0x2ee000002ef,
+        0x30000000340,
+        0x34200000343,
+        0x3460000034f,
+        0x35000000370,
+        0x37100000372,
+        0x37300000374,
+        0x37700000378,
+        0x37b0000037e,
+        0x39000000391,
+        0x3ac000003cf,
+        0x3d7000003d8,
+        0x3d9000003da,
+        0x3db000003dc,
+        0x3dd000003de,
+        0x3df000003e0,
+        0x3e1000003e2,
+        0x3e3000003e4,
+        0x3e5000003e6,
+        0x3e7000003e8,
+        0x3e9000003ea,
+        0x3eb000003ec,
+        0x3ed000003ee,
+        0x3ef000003f0,
+        0x3f3000003f4,
+        0x3f8000003f9,
+        0x3fb000003fd,
+        0x43000000460,
+        0x46100000462,
+        0x46300000464,
+        0x46500000466,
+        0x46700000468,
+        0x4690000046a,
+        0x46b0000046c,
+        0x46d0000046e,
+        0x46f00000470,
+        0x47100000472,
+        0x47300000474,
+        0x47500000476,
+        0x47700000478,
+        0x4790000047a,
+        0x47b0000047c,
+        0x47d0000047e,
+        0x47f00000480,
+        0x48100000482,
+        0x48300000488,
+        0x48b0000048c,
+        0x48d0000048e,
+        0x48f00000490,
+        0x49100000492,
+        0x49300000494,
+        0x49500000496,
+        0x49700000498,
+        0x4990000049a,
+        0x49b0000049c,
+        0x49d0000049e,
+        0x49f000004a0,
+        0x4a1000004a2,
+        0x4a3000004a4,
+        0x4a5000004a6,
+        0x4a7000004a8,
+        0x4a9000004aa,
+        0x4ab000004ac,
+        0x4ad000004ae,
+        0x4af000004b0,
+        0x4b1000004b2,
+        0x4b3000004b4,
+        0x4b5000004b6,
+        0x4b7000004b8,
+        0x4b9000004ba,
+        0x4bb000004bc,
+        0x4bd000004be,
+        0x4bf000004c0,
+        0x4c2000004c3,
+        0x4c4000004c5,
+        0x4c6000004c7,
+        0x4c8000004c9,
+        0x4ca000004cb,
+        0x4cc000004cd,
+        0x4ce000004d0,
+        0x4d1000004d2,
+        0x4d3000004d4,
+        0x4d5000004d6,
+        0x4d7000004d8,
+        0x4d9000004da,
+        0x4db000004dc,
+        0x4dd000004de,
+        0x4df000004e0,
+        0x4e1000004e2,
+        0x4e3000004e4,
+        0x4e5000004e6,
+        0x4e7000004e8,
+        0x4e9000004ea,
+        0x4eb000004ec,
+        0x4ed000004ee,
+        0x4ef000004f0,
+        0x4f1000004f2,
+        0x4f3000004f4,
+        0x4f5000004f6,
+        0x4f7000004f8,
+        0x4f9000004fa,
+        0x4fb000004fc,
+        0x4fd000004fe,
+        0x4ff00000500,
+        0x50100000502,
+        0x50300000504,
+        0x50500000506,
+        0x50700000508,
+        0x5090000050a,
+        0x50b0000050c,
+        0x50d0000050e,
+        0x50f00000510,
+        0x51100000512,
+        0x51300000514,
+        0x51500000516,
+        0x51700000518,
+        0x5190000051a,
+        0x51b0000051c,
+        0x51d0000051e,
+        0x51f00000520,
+        0x52100000522,
+        0x52300000524,
+        0x52500000526,
+        0x52700000528,
+        0x5590000055a,
+        0x56100000587,
+        0x591000005be,
+        0x5bf000005c0,
+        0x5c1000005c3,
+        0x5c4000005c6,
+        0x5c7000005c8,
+        0x5d0000005eb,
+        0x5f0000005f3,
+        0x6100000061b,
+        0x62000000640,
+        0x64100000660,
+        0x66e00000675,
+        0x679000006d4,
+        0x6d5000006dd,
+        0x6df000006e9,
+        0x6ea000006f0,
+        0x6fa00000700,
+        0x7100000074b,
+        0x74d000007b2,
+        0x7c0000007f6,
+        0x8000000082e,
+        0x8400000085c,
+        0x8a0000008a1,
+        0x8a2000008ad,
+        0x8e4000008ff,
+        0x90000000958,
+        0x96000000964,
+        0x96600000970,
+        0x97100000978,
+        0x97900000980,
+        0x98100000984,
+        0x9850000098d,
+        0x98f00000991,
+        0x993000009a9,
+        0x9aa000009b1,
+        0x9b2000009b3,
+        0x9b6000009ba,
+        0x9bc000009c5,
+        0x9c7000009c9,
+        0x9cb000009cf,
+        0x9d7000009d8,
+        0x9e0000009e4,
+        0x9e6000009f2,
+        0xa0100000a04,
+        0xa0500000a0b,
+        0xa0f00000a11,
+        0xa1300000a29,
+        0xa2a00000a31,
+        0xa3200000a33,
+        0xa3500000a36,
+        0xa3800000a3a,
+        0xa3c00000a3d,
+        0xa3e00000a43,
+        0xa4700000a49,
+        0xa4b00000a4e,
+        0xa5100000a52,
+        0xa5c00000a5d,
+        0xa6600000a76,
+        0xa8100000a84,
+        0xa8500000a8e,
+        0xa8f00000a92,
+        0xa9300000aa9,
+        0xaaa00000ab1,
+        0xab200000ab4,
+        0xab500000aba,
+        0xabc00000ac6,
+        0xac700000aca,
+        0xacb00000ace,
+        0xad000000ad1,
+        0xae000000ae4,
+        0xae600000af0,
+        0xb0100000b04,
+        0xb0500000b0d,
+        0xb0f00000b11,
+        0xb1300000b29,
+        0xb2a00000b31,
+        0xb3200000b34,
+        0xb3500000b3a,
+        0xb3c00000b45,
+        0xb4700000b49,
+        0xb4b00000b4e,
+        0xb5600000b58,
+        0xb5f00000b64,
+        0xb6600000b70,
+        0xb7100000b72,
+        0xb8200000b84,
+        0xb8500000b8b,
+        0xb8e00000b91,
+        0xb9200000b96,
+        0xb9900000b9b,
+        0xb9c00000b9d,
+        0xb9e00000ba0,
+        0xba300000ba5,
+        0xba800000bab,
+        0xbae00000bba,
+        0xbbe00000bc3,
+        0xbc600000bc9,
+        0xbca00000bce,
+        0xbd000000bd1,
+        0xbd700000bd8,
+        0xbe600000bf0,
+        0xc0100000c04,
+        0xc0500000c0d,
+        0xc0e00000c11,
+        0xc1200000c29,
+        0xc2a00000c34,
+        0xc3500000c3a,
+        0xc3d00000c45,
+        0xc4600000c49,
+        0xc4a00000c4e,
+        0xc5500000c57,
+        0xc5800000c5a,
+        0xc6000000c64,
+        0xc6600000c70,
+        0xc8200000c84,
+        0xc8500000c8d,
+        0xc8e00000c91,
+        0xc9200000ca9,
+        0xcaa00000cb4,
+        0xcb500000cba,
+        0xcbc00000cc5,
+        0xcc600000cc9,
+        0xcca00000cce,
+        0xcd500000cd7,
+        0xcde00000cdf,
+        0xce000000ce4,
+        0xce600000cf0,
+        0xcf100000cf3,
+        0xd0200000d04,
+        0xd0500000d0d,
+        0xd0e00000d11,
+        0xd1200000d3b,
+        0xd3d00000d45,
+        0xd4600000d49,
+        0xd4a00000d4f,
+        0xd5700000d58,
+        0xd6000000d64,
+        0xd6600000d70,
+        0xd7a00000d80,
+        0xd8200000d84,
+        0xd8500000d97,
+        0xd9a00000db2,
+        0xdb300000dbc,
+        0xdbd00000dbe,
+        0xdc000000dc7,
+        0xdca00000dcb,
+        0xdcf00000dd5,
+        0xdd600000dd7,
+        0xdd800000de0,
+        0xdf200000df4,
+        0xe0100000e33,
+        0xe3400000e3b,
+        0xe4000000e4f,
+        0xe5000000e5a,
+        0xe8100000e83,
+        0xe8400000e85,
+        0xe8700000e89,
+        0xe8a00000e8b,
+        0xe8d00000e8e,
+        0xe9400000e98,
+        0xe9900000ea0,
+        0xea100000ea4,
+        0xea500000ea6,
+        0xea700000ea8,
+        0xeaa00000eac,
+        0xead00000eb3,
+        0xeb400000eba,
+        0xebb00000ebe,
+        0xec000000ec5,
+        0xec600000ec7,
+        0xec800000ece,
+        0xed000000eda,
+        0xede00000ee0,
+        0xf0000000f01,
+        0xf0b00000f0c,
+        0xf1800000f1a,
+        0xf2000000f2a,
+        0xf3500000f36,
+        0xf3700000f38,
+        0xf3900000f3a,
+        0xf3e00000f43,
+        0xf4400000f48,
+        0xf4900000f4d,
+        0xf4e00000f52,
+        0xf5300000f57,
+        0xf5800000f5c,
+        0xf5d00000f69,
+        0xf6a00000f6d,
+        0xf7100000f73,
+        0xf7400000f75,
+        0xf7a00000f81,
+        0xf8200000f85,
+        0xf8600000f93,
+        0xf9400000f98,
+        0xf9900000f9d,
+        0xf9e00000fa2,
+        0xfa300000fa7,
+        0xfa800000fac,
+        0xfad00000fb9,
+        0xfba00000fbd,
+        0xfc600000fc7,
+        0x10000000104a,
+        0x10500000109e,
+        0x10d0000010fb,
+        0x10fd00001100,
+        0x120000001249,
+        0x124a0000124e,
+        0x125000001257,
+        0x125800001259,
+        0x125a0000125e,
+        0x126000001289,
+        0x128a0000128e,
+        0x1290000012b1,
+        0x12b2000012b6,
+        0x12b8000012bf,
+        0x12c0000012c1,
+        0x12c2000012c6,
+        0x12c8000012d7,
+        0x12d800001311,
+        0x131200001316,
+        0x13180000135b,
+        0x135d00001360,
+        0x138000001390,
+        0x13a0000013f5,
+        0x14010000166d,
+        0x166f00001680,
+        0x16810000169b,
+        0x16a0000016eb,
+        0x17000000170d,
+        0x170e00001715,
+        0x172000001735,
+        0x174000001754,
+        0x17600000176d,
+        0x176e00001771,
+        0x177200001774,
+        0x1780000017b4,
+        0x17b6000017d4,
+        0x17d7000017d8,
+        0x17dc000017de,
+        0x17e0000017ea,
+        0x18100000181a,
+        0x182000001878,
+        0x1880000018ab,
+        0x18b0000018f6,
+        0x19000000191d,
+        0x19200000192c,
+        0x19300000193c,
+        0x19460000196e,
+        0x197000001975,
+        0x1980000019ac,
+        0x19b0000019ca,
+        0x19d0000019da,
+        0x1a0000001a1c,
+        0x1a2000001a5f,
+        0x1a6000001a7d,
+        0x1a7f00001a8a,
+        0x1a9000001a9a,
+        0x1aa700001aa8,
+        0x1b0000001b4c,
+        0x1b5000001b5a,
+        0x1b6b00001b74,
+        0x1b8000001bf4,
+        0x1c0000001c38,
+        0x1c4000001c4a,
+        0x1c4d00001c7e,
+        0x1cd000001cd3,
+        0x1cd400001cf7,
+        0x1d0000001d2c,
+        0x1d2f00001d30,
+        0x1d3b00001d3c,
+        0x1d4e00001d4f,
+        0x1d6b00001d78,
+        0x1d7900001d9b,
+        0x1dc000001de7,
+        0x1dfc00001e00,
+        0x1e0100001e02,
+        0x1e0300001e04,
+        0x1e0500001e06,
+        0x1e0700001e08,
+        0x1e0900001e0a,
+        0x1e0b00001e0c,
+        0x1e0d00001e0e,
+        0x1e0f00001e10,
+        0x1e1100001e12,
+        0x1e1300001e14,
+        0x1e1500001e16,
+        0x1e1700001e18,
+        0x1e1900001e1a,
+        0x1e1b00001e1c,
+        0x1e1d00001e1e,
+        0x1e1f00001e20,
+        0x1e2100001e22,
+        0x1e2300001e24,
+        0x1e2500001e26,
+        0x1e2700001e28,
+        0x1e2900001e2a,
+        0x1e2b00001e2c,
+        0x1e2d00001e2e,
+        0x1e2f00001e30,
+        0x1e3100001e32,
+        0x1e3300001e34,
+        0x1e3500001e36,
+        0x1e3700001e38,
+        0x1e3900001e3a,
+        0x1e3b00001e3c,
+        0x1e3d00001e3e,
+        0x1e3f00001e40,
+        0x1e4100001e42,
+        0x1e4300001e44,
+        0x1e4500001e46,
+        0x1e4700001e48,
+        0x1e4900001e4a,
+        0x1e4b00001e4c,
+        0x1e4d00001e4e,
+        0x1e4f00001e50,
+        0x1e5100001e52,
+        0x1e5300001e54,
+        0x1e5500001e56,
+        0x1e5700001e58,
+        0x1e5900001e5a,
+        0x1e5b00001e5c,
+        0x1e5d00001e5e,
+        0x1e5f00001e60,
+        0x1e6100001e62,
+        0x1e6300001e64,
+        0x1e6500001e66,
+        0x1e6700001e68,
+        0x1e6900001e6a,
+        0x1e6b00001e6c,
+        0x1e6d00001e6e,
+        0x1e6f00001e70,
+        0x1e7100001e72,
+        0x1e7300001e74,
+        0x1e7500001e76,
+        0x1e7700001e78,
+        0x1e7900001e7a,
+        0x1e7b00001e7c,
+        0x1e7d00001e7e,
+        0x1e7f00001e80,
+        0x1e8100001e82,
+        0x1e8300001e84,
+        0x1e8500001e86,
+        0x1e8700001e88,
+        0x1e8900001e8a,
+        0x1e8b00001e8c,
+        0x1e8d00001e8e,
+        0x1e8f00001e90,
+        0x1e9100001e92,
+        0x1e9300001e94,
+        0x1e9500001e9a,
+        0x1e9c00001e9e,
+        0x1e9f00001ea0,
+        0x1ea100001ea2,
+        0x1ea300001ea4,
+        0x1ea500001ea6,
+        0x1ea700001ea8,
+        0x1ea900001eaa,
+        0x1eab00001eac,
+        0x1ead00001eae,
+        0x1eaf00001eb0,
+        0x1eb100001eb2,
+        0x1eb300001eb4,
+        0x1eb500001eb6,
+        0x1eb700001eb8,
+        0x1eb900001eba,
+        0x1ebb00001ebc,
+        0x1ebd00001ebe,
+        0x1ebf00001ec0,
+        0x1ec100001ec2,
+        0x1ec300001ec4,
+        0x1ec500001ec6,
+        0x1ec700001ec8,
+        0x1ec900001eca,
+        0x1ecb00001ecc,
+        0x1ecd00001ece,
+        0x1ecf00001ed0,
+        0x1ed100001ed2,
+        0x1ed300001ed4,
+        0x1ed500001ed6,
+        0x1ed700001ed8,
+        0x1ed900001eda,
+        0x1edb00001edc,
+        0x1edd00001ede,
+        0x1edf00001ee0,
+        0x1ee100001ee2,
+        0x1ee300001ee4,
+        0x1ee500001ee6,
+        0x1ee700001ee8,
+        0x1ee900001eea,
+        0x1eeb00001eec,
+        0x1eed00001eee,
+        0x1eef00001ef0,
+        0x1ef100001ef2,
+        0x1ef300001ef4,
+        0x1ef500001ef6,
+        0x1ef700001ef8,
+        0x1ef900001efa,
+        0x1efb00001efc,
+        0x1efd00001efe,
+        0x1eff00001f08,
+        0x1f1000001f16,
+        0x1f2000001f28,
+        0x1f3000001f38,
+        0x1f4000001f46,
+        0x1f5000001f58,
+        0x1f6000001f68,
+        0x1f7000001f71,
+        0x1f7200001f73,
+        0x1f7400001f75,
+        0x1f7600001f77,
+        0x1f7800001f79,
+        0x1f7a00001f7b,
+        0x1f7c00001f7d,
+        0x1fb000001fb2,
+        0x1fb600001fb7,
+        0x1fc600001fc7,
+        0x1fd000001fd3,
+        0x1fd600001fd8,
+        0x1fe000001fe3,
+        0x1fe400001fe8,
+        0x1ff600001ff7,
+        0x214e0000214f,
+        0x218400002185,
+        0x2c3000002c5f,
+        0x2c6100002c62,
+        0x2c6500002c67,
+        0x2c6800002c69,
+        0x2c6a00002c6b,
+        0x2c6c00002c6d,
+        0x2c7100002c72,
+        0x2c7300002c75,
+        0x2c7600002c7c,
+        0x2c8100002c82,
+        0x2c8300002c84,
+        0x2c8500002c86,
+        0x2c8700002c88,
+        0x2c8900002c8a,
+        0x2c8b00002c8c,
+        0x2c8d00002c8e,
+        0x2c8f00002c90,
+        0x2c9100002c92,
+        0x2c9300002c94,
+        0x2c9500002c96,
+        0x2c9700002c98,
+        0x2c9900002c9a,
+        0x2c9b00002c9c,
+        0x2c9d00002c9e,
+        0x2c9f00002ca0,
+        0x2ca100002ca2,
+        0x2ca300002ca4,
+        0x2ca500002ca6,
+        0x2ca700002ca8,
+        0x2ca900002caa,
+        0x2cab00002cac,
+        0x2cad00002cae,
+        0x2caf00002cb0,
+        0x2cb100002cb2,
+        0x2cb300002cb4,
+        0x2cb500002cb6,
+        0x2cb700002cb8,
+        0x2cb900002cba,
+        0x2cbb00002cbc,
+        0x2cbd00002cbe,
+        0x2cbf00002cc0,
+        0x2cc100002cc2,
+        0x2cc300002cc4,
+        0x2cc500002cc6,
+        0x2cc700002cc8,
+        0x2cc900002cca,
+        0x2ccb00002ccc,
+        0x2ccd00002cce,
+        0x2ccf00002cd0,
+        0x2cd100002cd2,
+        0x2cd300002cd4,
+        0x2cd500002cd6,
+        0x2cd700002cd8,
+        0x2cd900002cda,
+        0x2cdb00002cdc,
+        0x2cdd00002cde,
+        0x2cdf00002ce0,
+        0x2ce100002ce2,
+        0x2ce300002ce5,
+        0x2cec00002ced,
+        0x2cee00002cf2,
+        0x2cf300002cf4,
+        0x2d0000002d26,
+        0x2d2700002d28,
+        0x2d2d00002d2e,
+        0x2d3000002d68,
+        0x2d7f00002d97,
+        0x2da000002da7,
+        0x2da800002daf,
+        0x2db000002db7,
+        0x2db800002dbf,
+        0x2dc000002dc7,
+        0x2dc800002dcf,
+        0x2dd000002dd7,
+        0x2dd800002ddf,
+        0x2de000002e00,
+        0x2e2f00002e30,
+        0x300500003008,
+        0x302a0000302e,
+        0x303c0000303d,
+        0x304100003097,
+        0x30990000309b,
+        0x309d0000309f,
+        0x30a1000030fb,
+        0x30fc000030ff,
+        0x31050000312e,
+        0x31a0000031bb,
+        0x31f000003200,
+        0x340000004db6,
+        0x4e0000009fcd,
+        0xa0000000a48d,
+        0xa4d00000a4fe,
+        0xa5000000a60d,
+        0xa6100000a62c,
+        0xa6410000a642,
+        0xa6430000a644,
+        0xa6450000a646,
+        0xa6470000a648,
+        0xa6490000a64a,
+        0xa64b0000a64c,
+        0xa64d0000a64e,
+        0xa64f0000a650,
+        0xa6510000a652,
+        0xa6530000a654,
+        0xa6550000a656,
+        0xa6570000a658,
+        0xa6590000a65a,
+        0xa65b0000a65c,
+        0xa65d0000a65e,
+        0xa65f0000a660,
+        0xa6610000a662,
+        0xa6630000a664,
+        0xa6650000a666,
+        0xa6670000a668,
+        0xa6690000a66a,
+        0xa66b0000a66c,
+        0xa66d0000a670,
+        0xa6740000a67e,
+        0xa67f0000a680,
+        0xa6810000a682,
+        0xa6830000a684,
+        0xa6850000a686,
+        0xa6870000a688,
+        0xa6890000a68a,
+        0xa68b0000a68c,
+        0xa68d0000a68e,
+        0xa68f0000a690,
+        0xa6910000a692,
+        0xa6930000a694,
+        0xa6950000a696,
+        0xa6970000a698,
+        0xa69f0000a6e6,
+        0xa6f00000a6f2,
+        0xa7170000a720,
+        0xa7230000a724,
+        0xa7250000a726,
+        0xa7270000a728,
+        0xa7290000a72a,
+        0xa72b0000a72c,
+        0xa72d0000a72e,
+        0xa72f0000a732,
+        0xa7330000a734,
+        0xa7350000a736,
+        0xa7370000a738,
+        0xa7390000a73a,
+        0xa73b0000a73c,
+        0xa73d0000a73e,
+        0xa73f0000a740,
+        0xa7410000a742,
+        0xa7430000a744,
+        0xa7450000a746,
+        0xa7470000a748,
+        0xa7490000a74a,
+        0xa74b0000a74c,
+        0xa74d0000a74e,
+        0xa74f0000a750,
+        0xa7510000a752,
+        0xa7530000a754,
+        0xa7550000a756,
+        0xa7570000a758,
+        0xa7590000a75a,
+        0xa75b0000a75c,
+        0xa75d0000a75e,
+        0xa75f0000a760,
+        0xa7610000a762,
+        0xa7630000a764,
+        0xa7650000a766,
+        0xa7670000a768,
+        0xa7690000a76a,
+        0xa76b0000a76c,
+        0xa76d0000a76e,
+        0xa76f0000a770,
+        0xa7710000a779,
+        0xa77a0000a77b,
+        0xa77c0000a77d,
+        0xa77f0000a780,
+        0xa7810000a782,
+        0xa7830000a784,
+        0xa7850000a786,
+        0xa7870000a789,
+        0xa78c0000a78d,
+        0xa78e0000a78f,
+        0xa7910000a792,
+        0xa7930000a794,
+        0xa7a10000a7a2,
+        0xa7a30000a7a4,
+        0xa7a50000a7a6,
+        0xa7a70000a7a8,
+        0xa7a90000a7aa,
+        0xa7fa0000a828,
+        0xa8400000a874,
+        0xa8800000a8c5,
+        0xa8d00000a8da,
+        0xa8e00000a8f8,
+        0xa8fb0000a8fc,
+        0xa9000000a92e,
+        0xa9300000a954,
+        0xa9800000a9c1,
+        0xa9cf0000a9da,
+        0xaa000000aa37,
+        0xaa400000aa4e,
+        0xaa500000aa5a,
+        0xaa600000aa77,
+        0xaa7a0000aa7c,
+        0xaa800000aac3,
+        0xaadb0000aade,
+        0xaae00000aaf0,
+        0xaaf20000aaf7,
+        0xab010000ab07,
+        0xab090000ab0f,
+        0xab110000ab17,
+        0xab200000ab27,
+        0xab280000ab2f,
+        0xabc00000abeb,
+        0xabec0000abee,
+        0xabf00000abfa,
+        0xac000000d7a4,
+        0xfa0e0000fa10,
+        0xfa110000fa12,
+        0xfa130000fa15,
+        0xfa1f0000fa20,
+        0xfa210000fa22,
+        0xfa230000fa25,
+        0xfa270000fa2a,
+        0xfb1e0000fb1f,
+        0xfe200000fe27,
+        0xfe730000fe74,
+        0x100000001000c,
+        0x1000d00010027,
+        0x100280001003b,
+        0x1003c0001003e,
+        0x1003f0001004e,
+        0x100500001005e,
+        0x10080000100fb,
+        0x101fd000101fe,
+        0x102800001029d,
+        0x102a0000102d1,
+        0x103000001031f,
+        0x1033000010341,
+        0x103420001034a,
+        0x103800001039e,
+        0x103a0000103c4,
+        0x103c8000103d0,
+        0x104280001049e,
+        0x104a0000104aa,
+        0x1080000010806,
+        0x1080800010809,
+        0x1080a00010836,
+        0x1083700010839,
+        0x1083c0001083d,
+        0x1083f00010856,
+        0x1090000010916,
+        0x109200001093a,
+        0x10980000109b8,
+        0x109be000109c0,
+        0x10a0000010a04,
+        0x10a0500010a07,
+        0x10a0c00010a14,
+        0x10a1500010a18,
+        0x10a1900010a34,
+        0x10a3800010a3b,
+        0x10a3f00010a40,
+        0x10a6000010a7d,
+        0x10b0000010b36,
+        0x10b4000010b56,
+        0x10b6000010b73,
+        0x10c0000010c49,
+        0x1100000011047,
+        0x1106600011070,
+        0x11080000110bb,
+        0x110d0000110e9,
+        0x110f0000110fa,
+        0x1110000011135,
+        0x1113600011140,
+        0x11180000111c5,
+        0x111d0000111da,
+        0x11680000116b8,
+        0x116c0000116ca,
+        0x120000001236f,
+        0x130000001342f,
+        0x1680000016a39,
+        0x16f0000016f45,
+        0x16f5000016f7f,
+        0x16f8f00016fa0,
+        0x1b0000001b002,
+        0x200000002a6d7,
+        0x2a7000002b735,
+        0x2b7400002b81e,
+    ),
+    'CONTEXTJ': (
+        0x200c0000200e,
+    ),
+    'CONTEXTO': (
+        0xb7000000b8,
+        0x37500000376,
+        0x5f3000005f5,
+        0x6600000066a,
+        0x6f0000006fa,
+        0x30fb000030fc,
+    ),
+}
diff --git a/vendor/pip-9.0.3/pip/_vendor/idna/intranges.py b/vendor/pip-9.0.3/pip/_vendor/idna/intranges.py
new file mode 100644
index 0000000000000000000000000000000000000000..fa8a735662d0afc1950ba75bc57e99e8480dac88
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/idna/intranges.py
@@ -0,0 +1,53 @@
+"""
+Given a list of integers, made up of (hopefully) a small number of long runs
+of consecutive integers, compute a representation of the form
+((start1, end1), (start2, end2) ...). Then answer the question "was x present
+in the original list?" in time O(log(# runs)).
+"""
+
+import bisect
+
+def intranges_from_list(list_):
+    """Represent a list of integers as a sequence of ranges:
+    ((start_0, end_0), (start_1, end_1), ...), such that the original
+    integers are exactly those x such that start_i <= x < end_i for some i.
+
+    Ranges are encoded as single integers (start << 32 | end), not as tuples.
+    """
+
+    sorted_list = sorted(list_)
+    ranges = []
+    last_write = -1
+    for i in range(len(sorted_list)):
+        if i+1 < len(sorted_list):
+            if sorted_list[i] == sorted_list[i+1]-1:
+                continue
+        current_range = sorted_list[last_write+1:i+1]
+        ranges.append(_encode_range(current_range[0], current_range[-1] + 1))
+        last_write = i
+
+    return tuple(ranges)
+
+def _encode_range(start, end):
+    return (start << 32) | end
+
+def _decode_range(r):
+    return (r >> 32), (r & ((1 << 32) - 1))
+
+
+def intranges_contain(int_, ranges):
+    """Determine if `int_` falls into one of the ranges in `ranges`."""
+    tuple_ = _encode_range(int_, 0)
+    pos = bisect.bisect_left(ranges, tuple_)
+    # we could be immediately ahead of a tuple (start, end)
+    # with start < int_ <= end
+    if pos > 0:
+        left, right = _decode_range(ranges[pos-1])
+        if left <= int_ < right:
+            return True
+    # or we could be immediately behind a tuple (int_, end)
+    if pos < len(ranges):
+        left, _ = _decode_range(ranges[pos])
+        if left == int_:
+            return True
+    return False
diff --git a/vendor/pip-9.0.3/pip/_vendor/idna/package_data.py b/vendor/pip-9.0.3/pip/_vendor/idna/package_data.py
new file mode 100644
index 0000000000000000000000000000000000000000..fc3313927b2efb231b1ffd6870b7e5ce37bb1d9e
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/idna/package_data.py
@@ -0,0 +1,2 @@
+__version__ = '2.6'
+
diff --git a/vendor/pip-9.0.3/pip/_vendor/idna/uts46data.py b/vendor/pip-9.0.3/pip/_vendor/idna/uts46data.py
new file mode 100644
index 0000000000000000000000000000000000000000..f9b3236f4aa810bba202b53ea65d3693b70b4de4
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/idna/uts46data.py
@@ -0,0 +1,7634 @@
+# This file is automatically generated by tools/idna-data
+# vim: set fileencoding=utf-8 :
+
+"""IDNA Mapping Table from UTS46."""
+
+
+__version__ = "6.3.0"
+def _seg_0():
+    return [
+    (0x0, '3'),
+    (0x1, '3'),
+    (0x2, '3'),
+    (0x3, '3'),
+    (0x4, '3'),
+    (0x5, '3'),
+    (0x6, '3'),
+    (0x7, '3'),
+    (0x8, '3'),
+    (0x9, '3'),
+    (0xA, '3'),
+    (0xB, '3'),
+    (0xC, '3'),
+    (0xD, '3'),
+    (0xE, '3'),
+    (0xF, '3'),
+    (0x10, '3'),
+    (0x11, '3'),
+    (0x12, '3'),
+    (0x13, '3'),
+    (0x14, '3'),
+    (0x15, '3'),
+    (0x16, '3'),
+    (0x17, '3'),
+    (0x18, '3'),
+    (0x19, '3'),
+    (0x1A, '3'),
+    (0x1B, '3'),
+    (0x1C, '3'),
+    (0x1D, '3'),
+    (0x1E, '3'),
+    (0x1F, '3'),
+    (0x20, '3'),
+    (0x21, '3'),
+    (0x22, '3'),
+    (0x23, '3'),
+    (0x24, '3'),
+    (0x25, '3'),
+    (0x26, '3'),
+    (0x27, '3'),
+    (0x28, '3'),
+    (0x29, '3'),
+    (0x2A, '3'),
+    (0x2B, '3'),
+    (0x2C, '3'),
+    (0x2D, 'V'),
+    (0x2E, 'V'),
+    (0x2F, '3'),
+    (0x30, 'V'),
+    (0x31, 'V'),
+    (0x32, 'V'),
+    (0x33, 'V'),
+    (0x34, 'V'),
+    (0x35, 'V'),
+    (0x36, 'V'),
+    (0x37, 'V'),
+    (0x38, 'V'),
+    (0x39, 'V'),
+    (0x3A, '3'),
+    (0x3B, '3'),
+    (0x3C, '3'),
+    (0x3D, '3'),
+    (0x3E, '3'),
+    (0x3F, '3'),
+    (0x40, '3'),
+    (0x41, 'M', u'a'),
+    (0x42, 'M', u'b'),
+    (0x43, 'M', u'c'),
+    (0x44, 'M', u'd'),
+    (0x45, 'M', u'e'),
+    (0x46, 'M', u'f'),
+    (0x47, 'M', u'g'),
+    (0x48, 'M', u'h'),
+    (0x49, 'M', u'i'),
+    (0x4A, 'M', u'j'),
+    (0x4B, 'M', u'k'),
+    (0x4C, 'M', u'l'),
+    (0x4D, 'M', u'm'),
+    (0x4E, 'M', u'n'),
+    (0x4F, 'M', u'o'),
+    (0x50, 'M', u'p'),
+    (0x51, 'M', u'q'),
+    (0x52, 'M', u'r'),
+    (0x53, 'M', u's'),
+    (0x54, 'M', u't'),
+    (0x55, 'M', u'u'),
+    (0x56, 'M', u'v'),
+    (0x57, 'M', u'w'),
+    (0x58, 'M', u'x'),
+    (0x59, 'M', u'y'),
+    (0x5A, 'M', u'z'),
+    (0x5B, '3'),
+    (0x5C, '3'),
+    (0x5D, '3'),
+    (0x5E, '3'),
+    (0x5F, '3'),
+    (0x60, '3'),
+    (0x61, 'V'),
+    (0x62, 'V'),
+    (0x63, 'V'),
+    ]
+
+def _seg_1():
+    return [
+    (0x64, 'V'),
+    (0x65, 'V'),
+    (0x66, 'V'),
+    (0x67, 'V'),
+    (0x68, 'V'),
+    (0x69, 'V'),
+    (0x6A, 'V'),
+    (0x6B, 'V'),
+    (0x6C, 'V'),
+    (0x6D, 'V'),
+    (0x6E, 'V'),
+    (0x6F, 'V'),
+    (0x70, 'V'),
+    (0x71, 'V'),
+    (0x72, 'V'),
+    (0x73, 'V'),
+    (0x74, 'V'),
+    (0x75, 'V'),
+    (0x76, 'V'),
+    (0x77, 'V'),
+    (0x78, 'V'),
+    (0x79, 'V'),
+    (0x7A, 'V'),
+    (0x7B, '3'),
+    (0x7C, '3'),
+    (0x7D, '3'),
+    (0x7E, '3'),
+    (0x7F, '3'),
+    (0x80, 'X'),
+    (0x81, 'X'),
+    (0x82, 'X'),
+    (0x83, 'X'),
+    (0x84, 'X'),
+    (0x85, 'X'),
+    (0x86, 'X'),
+    (0x87, 'X'),
+    (0x88, 'X'),
+    (0x89, 'X'),
+    (0x8A, 'X'),
+    (0x8B, 'X'),
+    (0x8C, 'X'),
+    (0x8D, 'X'),
+    (0x8E, 'X'),
+    (0x8F, 'X'),
+    (0x90, 'X'),
+    (0x91, 'X'),
+    (0x92, 'X'),
+    (0x93, 'X'),
+    (0x94, 'X'),
+    (0x95, 'X'),
+    (0x96, 'X'),
+    (0x97, 'X'),
+    (0x98, 'X'),
+    (0x99, 'X'),
+    (0x9A, 'X'),
+    (0x9B, 'X'),
+    (0x9C, 'X'),
+    (0x9D, 'X'),
+    (0x9E, 'X'),
+    (0x9F, 'X'),
+    (0xA0, '3', u' '),
+    (0xA1, 'V'),
+    (0xA2, 'V'),
+    (0xA3, 'V'),
+    (0xA4, 'V'),
+    (0xA5, 'V'),
+    (0xA6, 'V'),
+    (0xA7, 'V'),
+    (0xA8, '3', u' ̈'),
+    (0xA9, 'V'),
+    (0xAA, 'M', u'a'),
+    (0xAB, 'V'),
+    (0xAC, 'V'),
+    (0xAD, 'I'),
+    (0xAE, 'V'),
+    (0xAF, '3', u' Ì„'),
+    (0xB0, 'V'),
+    (0xB1, 'V'),
+    (0xB2, 'M', u'2'),
+    (0xB3, 'M', u'3'),
+    (0xB4, '3', u' ́'),
+    (0xB5, 'M', u'μ'),
+    (0xB6, 'V'),
+    (0xB7, 'V'),
+    (0xB8, '3', u' ̧'),
+    (0xB9, 'M', u'1'),
+    (0xBA, 'M', u'o'),
+    (0xBB, 'V'),
+    (0xBC, 'M', u'1⁄4'),
+    (0xBD, 'M', u'1⁄2'),
+    (0xBE, 'M', u'3⁄4'),
+    (0xBF, 'V'),
+    (0xC0, 'M', u'à'),
+    (0xC1, 'M', u'á'),
+    (0xC2, 'M', u'â'),
+    (0xC3, 'M', u'ã'),
+    (0xC4, 'M', u'ä'),
+    (0xC5, 'M', u'Ã¥'),
+    (0xC6, 'M', u'æ'),
+    (0xC7, 'M', u'ç'),
+    ]
+
+def _seg_2():
+    return [
+    (0xC8, 'M', u'è'),
+    (0xC9, 'M', u'é'),
+    (0xCA, 'M', u'ê'),
+    (0xCB, 'M', u'ë'),
+    (0xCC, 'M', u'ì'),
+    (0xCD, 'M', u'í'),
+    (0xCE, 'M', u'î'),
+    (0xCF, 'M', u'ï'),
+    (0xD0, 'M', u'ð'),
+    (0xD1, 'M', u'ñ'),
+    (0xD2, 'M', u'ò'),
+    (0xD3, 'M', u'ó'),
+    (0xD4, 'M', u'ô'),
+    (0xD5, 'M', u'õ'),
+    (0xD6, 'M', u'ö'),
+    (0xD7, 'V'),
+    (0xD8, 'M', u'ø'),
+    (0xD9, 'M', u'ù'),
+    (0xDA, 'M', u'ú'),
+    (0xDB, 'M', u'û'),
+    (0xDC, 'M', u'ü'),
+    (0xDD, 'M', u'ý'),
+    (0xDE, 'M', u'þ'),
+    (0xDF, 'D', u'ss'),
+    (0xE0, 'V'),
+    (0xE1, 'V'),
+    (0xE2, 'V'),
+    (0xE3, 'V'),
+    (0xE4, 'V'),
+    (0xE5, 'V'),
+    (0xE6, 'V'),
+    (0xE7, 'V'),
+    (0xE8, 'V'),
+    (0xE9, 'V'),
+    (0xEA, 'V'),
+    (0xEB, 'V'),
+    (0xEC, 'V'),
+    (0xED, 'V'),
+    (0xEE, 'V'),
+    (0xEF, 'V'),
+    (0xF0, 'V'),
+    (0xF1, 'V'),
+    (0xF2, 'V'),
+    (0xF3, 'V'),
+    (0xF4, 'V'),
+    (0xF5, 'V'),
+    (0xF6, 'V'),
+    (0xF7, 'V'),
+    (0xF8, 'V'),
+    (0xF9, 'V'),
+    (0xFA, 'V'),
+    (0xFB, 'V'),
+    (0xFC, 'V'),
+    (0xFD, 'V'),
+    (0xFE, 'V'),
+    (0xFF, 'V'),
+    (0x100, 'M', u'ā'),
+    (0x101, 'V'),
+    (0x102, 'M', u'ă'),
+    (0x103, 'V'),
+    (0x104, 'M', u'Ä…'),
+    (0x105, 'V'),
+    (0x106, 'M', u'ć'),
+    (0x107, 'V'),
+    (0x108, 'M', u'ĉ'),
+    (0x109, 'V'),
+    (0x10A, 'M', u'Ä‹'),
+    (0x10B, 'V'),
+    (0x10C, 'M', u'č'),
+    (0x10D, 'V'),
+    (0x10E, 'M', u'ď'),
+    (0x10F, 'V'),
+    (0x110, 'M', u'Ä‘'),
+    (0x111, 'V'),
+    (0x112, 'M', u'Ä“'),
+    (0x113, 'V'),
+    (0x114, 'M', u'Ä•'),
+    (0x115, 'V'),
+    (0x116, 'M', u'Ä—'),
+    (0x117, 'V'),
+    (0x118, 'M', u'Ä™'),
+    (0x119, 'V'),
+    (0x11A, 'M', u'Ä›'),
+    (0x11B, 'V'),
+    (0x11C, 'M', u'ĝ'),
+    (0x11D, 'V'),
+    (0x11E, 'M', u'ÄŸ'),
+    (0x11F, 'V'),
+    (0x120, 'M', u'Ä¡'),
+    (0x121, 'V'),
+    (0x122, 'M', u'Ä£'),
+    (0x123, 'V'),
+    (0x124, 'M', u'Ä¥'),
+    (0x125, 'V'),
+    (0x126, 'M', u'ħ'),
+    (0x127, 'V'),
+    (0x128, 'M', u'Ä©'),
+    (0x129, 'V'),
+    (0x12A, 'M', u'Ä«'),
+    (0x12B, 'V'),
+    ]
+
+def _seg_3():
+    return [
+    (0x12C, 'M', u'Ä­'),
+    (0x12D, 'V'),
+    (0x12E, 'M', u'į'),
+    (0x12F, 'V'),
+    (0x130, 'M', u'i̇'),
+    (0x131, 'V'),
+    (0x132, 'M', u'ij'),
+    (0x134, 'M', u'ĵ'),
+    (0x135, 'V'),
+    (0x136, 'M', u'Ä·'),
+    (0x137, 'V'),
+    (0x139, 'M', u'ĺ'),
+    (0x13A, 'V'),
+    (0x13B, 'M', u'ļ'),
+    (0x13C, 'V'),
+    (0x13D, 'M', u'ľ'),
+    (0x13E, 'V'),
+    (0x13F, 'M', u'l·'),
+    (0x141, 'M', u'Å‚'),
+    (0x142, 'V'),
+    (0x143, 'M', u'Å„'),
+    (0x144, 'V'),
+    (0x145, 'M', u'ņ'),
+    (0x146, 'V'),
+    (0x147, 'M', u'ň'),
+    (0x148, 'V'),
+    (0x149, 'M', u'ʼn'),
+    (0x14A, 'M', u'Å‹'),
+    (0x14B, 'V'),
+    (0x14C, 'M', u'ō'),
+    (0x14D, 'V'),
+    (0x14E, 'M', u'ŏ'),
+    (0x14F, 'V'),
+    (0x150, 'M', u'Å‘'),
+    (0x151, 'V'),
+    (0x152, 'M', u'Å“'),
+    (0x153, 'V'),
+    (0x154, 'M', u'Å•'),
+    (0x155, 'V'),
+    (0x156, 'M', u'Å—'),
+    (0x157, 'V'),
+    (0x158, 'M', u'Å™'),
+    (0x159, 'V'),
+    (0x15A, 'M', u'Å›'),
+    (0x15B, 'V'),
+    (0x15C, 'M', u'ŝ'),
+    (0x15D, 'V'),
+    (0x15E, 'M', u'ÅŸ'),
+    (0x15F, 'V'),
+    (0x160, 'M', u'Å¡'),
+    (0x161, 'V'),
+    (0x162, 'M', u'Å£'),
+    (0x163, 'V'),
+    (0x164, 'M', u'Å¥'),
+    (0x165, 'V'),
+    (0x166, 'M', u'ŧ'),
+    (0x167, 'V'),
+    (0x168, 'M', u'Å©'),
+    (0x169, 'V'),
+    (0x16A, 'M', u'Å«'),
+    (0x16B, 'V'),
+    (0x16C, 'M', u'Å­'),
+    (0x16D, 'V'),
+    (0x16E, 'M', u'ů'),
+    (0x16F, 'V'),
+    (0x170, 'M', u'ű'),
+    (0x171, 'V'),
+    (0x172, 'M', u'ų'),
+    (0x173, 'V'),
+    (0x174, 'M', u'ŵ'),
+    (0x175, 'V'),
+    (0x176, 'M', u'Å·'),
+    (0x177, 'V'),
+    (0x178, 'M', u'ÿ'),
+    (0x179, 'M', u'ź'),
+    (0x17A, 'V'),
+    (0x17B, 'M', u'ż'),
+    (0x17C, 'V'),
+    (0x17D, 'M', u'ž'),
+    (0x17E, 'V'),
+    (0x17F, 'M', u's'),
+    (0x180, 'V'),
+    (0x181, 'M', u'É“'),
+    (0x182, 'M', u'ƃ'),
+    (0x183, 'V'),
+    (0x184, 'M', u'Æ…'),
+    (0x185, 'V'),
+    (0x186, 'M', u'É”'),
+    (0x187, 'M', u'ƈ'),
+    (0x188, 'V'),
+    (0x189, 'M', u'É–'),
+    (0x18A, 'M', u'É—'),
+    (0x18B, 'M', u'ƌ'),
+    (0x18C, 'V'),
+    (0x18E, 'M', u'ǝ'),
+    (0x18F, 'M', u'É™'),
+    (0x190, 'M', u'É›'),
+    (0x191, 'M', u'Æ’'),
+    (0x192, 'V'),
+    (0x193, 'M', u'É '),
+    ]
+
+def _seg_4():
+    return [
+    (0x194, 'M', u'É£'),
+    (0x195, 'V'),
+    (0x196, 'M', u'É©'),
+    (0x197, 'M', u'ɨ'),
+    (0x198, 'M', u'Æ™'),
+    (0x199, 'V'),
+    (0x19C, 'M', u'ɯ'),
+    (0x19D, 'M', u'ɲ'),
+    (0x19E, 'V'),
+    (0x19F, 'M', u'ɵ'),
+    (0x1A0, 'M', u'Æ¡'),
+    (0x1A1, 'V'),
+    (0x1A2, 'M', u'Æ£'),
+    (0x1A3, 'V'),
+    (0x1A4, 'M', u'Æ¥'),
+    (0x1A5, 'V'),
+    (0x1A6, 'M', u'Ê€'),
+    (0x1A7, 'M', u'ƨ'),
+    (0x1A8, 'V'),
+    (0x1A9, 'M', u'ʃ'),
+    (0x1AA, 'V'),
+    (0x1AC, 'M', u'Æ­'),
+    (0x1AD, 'V'),
+    (0x1AE, 'M', u'ʈ'),
+    (0x1AF, 'M', u'ư'),
+    (0x1B0, 'V'),
+    (0x1B1, 'M', u'ÊŠ'),
+    (0x1B2, 'M', u'Ê‹'),
+    (0x1B3, 'M', u'Æ´'),
+    (0x1B4, 'V'),
+    (0x1B5, 'M', u'ƶ'),
+    (0x1B6, 'V'),
+    (0x1B7, 'M', u'Ê’'),
+    (0x1B8, 'M', u'ƹ'),
+    (0x1B9, 'V'),
+    (0x1BC, 'M', u'ƽ'),
+    (0x1BD, 'V'),
+    (0x1C4, 'M', u'dž'),
+    (0x1C7, 'M', u'lj'),
+    (0x1CA, 'M', u'nj'),
+    (0x1CD, 'M', u'ÇŽ'),
+    (0x1CE, 'V'),
+    (0x1CF, 'M', u'ǐ'),
+    (0x1D0, 'V'),
+    (0x1D1, 'M', u'Ç’'),
+    (0x1D2, 'V'),
+    (0x1D3, 'M', u'Ç”'),
+    (0x1D4, 'V'),
+    (0x1D5, 'M', u'Ç–'),
+    (0x1D6, 'V'),
+    (0x1D7, 'M', u'ǘ'),
+    (0x1D8, 'V'),
+    (0x1D9, 'M', u'Çš'),
+    (0x1DA, 'V'),
+    (0x1DB, 'M', u'ǜ'),
+    (0x1DC, 'V'),
+    (0x1DE, 'M', u'ÇŸ'),
+    (0x1DF, 'V'),
+    (0x1E0, 'M', u'Ç¡'),
+    (0x1E1, 'V'),
+    (0x1E2, 'M', u'Ç£'),
+    (0x1E3, 'V'),
+    (0x1E4, 'M', u'Ç¥'),
+    (0x1E5, 'V'),
+    (0x1E6, 'M', u'ǧ'),
+    (0x1E7, 'V'),
+    (0x1E8, 'M', u'Ç©'),
+    (0x1E9, 'V'),
+    (0x1EA, 'M', u'Ç«'),
+    (0x1EB, 'V'),
+    (0x1EC, 'M', u'Ç­'),
+    (0x1ED, 'V'),
+    (0x1EE, 'M', u'ǯ'),
+    (0x1EF, 'V'),
+    (0x1F1, 'M', u'dz'),
+    (0x1F4, 'M', u'ǵ'),
+    (0x1F5, 'V'),
+    (0x1F6, 'M', u'Æ•'),
+    (0x1F7, 'M', u'Æ¿'),
+    (0x1F8, 'M', u'ǹ'),
+    (0x1F9, 'V'),
+    (0x1FA, 'M', u'Ç»'),
+    (0x1FB, 'V'),
+    (0x1FC, 'M', u'ǽ'),
+    (0x1FD, 'V'),
+    (0x1FE, 'M', u'Ç¿'),
+    (0x1FF, 'V'),
+    (0x200, 'M', u'ȁ'),
+    (0x201, 'V'),
+    (0x202, 'M', u'ȃ'),
+    (0x203, 'V'),
+    (0x204, 'M', u'È…'),
+    (0x205, 'V'),
+    (0x206, 'M', u'ȇ'),
+    (0x207, 'V'),
+    (0x208, 'M', u'ȉ'),
+    (0x209, 'V'),
+    (0x20A, 'M', u'È‹'),
+    (0x20B, 'V'),
+    (0x20C, 'M', u'ȍ'),
+    ]
+
+def _seg_5():
+    return [
+    (0x20D, 'V'),
+    (0x20E, 'M', u'ȏ'),
+    (0x20F, 'V'),
+    (0x210, 'M', u'È‘'),
+    (0x211, 'V'),
+    (0x212, 'M', u'È“'),
+    (0x213, 'V'),
+    (0x214, 'M', u'È•'),
+    (0x215, 'V'),
+    (0x216, 'M', u'È—'),
+    (0x217, 'V'),
+    (0x218, 'M', u'È™'),
+    (0x219, 'V'),
+    (0x21A, 'M', u'È›'),
+    (0x21B, 'V'),
+    (0x21C, 'M', u'ȝ'),
+    (0x21D, 'V'),
+    (0x21E, 'M', u'ÈŸ'),
+    (0x21F, 'V'),
+    (0x220, 'M', u'Æž'),
+    (0x221, 'V'),
+    (0x222, 'M', u'È£'),
+    (0x223, 'V'),
+    (0x224, 'M', u'È¥'),
+    (0x225, 'V'),
+    (0x226, 'M', u'ȧ'),
+    (0x227, 'V'),
+    (0x228, 'M', u'È©'),
+    (0x229, 'V'),
+    (0x22A, 'M', u'È«'),
+    (0x22B, 'V'),
+    (0x22C, 'M', u'È­'),
+    (0x22D, 'V'),
+    (0x22E, 'M', u'ȯ'),
+    (0x22F, 'V'),
+    (0x230, 'M', u'ȱ'),
+    (0x231, 'V'),
+    (0x232, 'M', u'ȳ'),
+    (0x233, 'V'),
+    (0x23A, 'M', u'â±¥'),
+    (0x23B, 'M', u'ȼ'),
+    (0x23C, 'V'),
+    (0x23D, 'M', u'Æš'),
+    (0x23E, 'M', u'ⱦ'),
+    (0x23F, 'V'),
+    (0x241, 'M', u'É‚'),
+    (0x242, 'V'),
+    (0x243, 'M', u'Æ€'),
+    (0x244, 'M', u'ʉ'),
+    (0x245, 'M', u'ʌ'),
+    (0x246, 'M', u'ɇ'),
+    (0x247, 'V'),
+    (0x248, 'M', u'ɉ'),
+    (0x249, 'V'),
+    (0x24A, 'M', u'É‹'),
+    (0x24B, 'V'),
+    (0x24C, 'M', u'ɍ'),
+    (0x24D, 'V'),
+    (0x24E, 'M', u'ɏ'),
+    (0x24F, 'V'),
+    (0x2B0, 'M', u'h'),
+    (0x2B1, 'M', u'ɦ'),
+    (0x2B2, 'M', u'j'),
+    (0x2B3, 'M', u'r'),
+    (0x2B4, 'M', u'ɹ'),
+    (0x2B5, 'M', u'É»'),
+    (0x2B6, 'M', u'ʁ'),
+    (0x2B7, 'M', u'w'),
+    (0x2B8, 'M', u'y'),
+    (0x2B9, 'V'),
+    (0x2D8, '3', u' ̆'),
+    (0x2D9, '3', u' ̇'),
+    (0x2DA, '3', u' ÌŠ'),
+    (0x2DB, '3', u' ̨'),
+    (0x2DC, '3', u' ̃'),
+    (0x2DD, '3', u' Ì‹'),
+    (0x2DE, 'V'),
+    (0x2E0, 'M', u'É£'),
+    (0x2E1, 'M', u'l'),
+    (0x2E2, 'M', u's'),
+    (0x2E3, 'M', u'x'),
+    (0x2E4, 'M', u'Ê•'),
+    (0x2E5, 'V'),
+    (0x340, 'M', u'Ì€'),
+    (0x341, 'M', u'́'),
+    (0x342, 'V'),
+    (0x343, 'M', u'Ì“'),
+    (0x344, 'M', u'̈́'),
+    (0x345, 'M', u'ι'),
+    (0x346, 'V'),
+    (0x34F, 'I'),
+    (0x350, 'V'),
+    (0x370, 'M', u'ͱ'),
+    (0x371, 'V'),
+    (0x372, 'M', u'ͳ'),
+    (0x373, 'V'),
+    (0x374, 'M', u'ʹ'),
+    (0x375, 'V'),
+    (0x376, 'M', u'Í·'),
+    (0x377, 'V'),
+    ]
+
+def _seg_6():
+    return [
+    (0x378, 'X'),
+    (0x37A, '3', u' ι'),
+    (0x37B, 'V'),
+    (0x37E, '3', u';'),
+    (0x37F, 'X'),
+    (0x384, '3', u' ́'),
+    (0x385, '3', u' ̈́'),
+    (0x386, 'M', u'ά'),
+    (0x387, 'M', u'·'),
+    (0x388, 'M', u'έ'),
+    (0x389, 'M', u'ή'),
+    (0x38A, 'M', u'ί'),
+    (0x38B, 'X'),
+    (0x38C, 'M', u'ό'),
+    (0x38D, 'X'),
+    (0x38E, 'M', u'ύ'),
+    (0x38F, 'M', u'ÏŽ'),
+    (0x390, 'V'),
+    (0x391, 'M', u'α'),
+    (0x392, 'M', u'β'),
+    (0x393, 'M', u'γ'),
+    (0x394, 'M', u'δ'),
+    (0x395, 'M', u'ε'),
+    (0x396, 'M', u'ζ'),
+    (0x397, 'M', u'η'),
+    (0x398, 'M', u'θ'),
+    (0x399, 'M', u'ι'),
+    (0x39A, 'M', u'κ'),
+    (0x39B, 'M', u'λ'),
+    (0x39C, 'M', u'μ'),
+    (0x39D, 'M', u'ν'),
+    (0x39E, 'M', u'ξ'),
+    (0x39F, 'M', u'ο'),
+    (0x3A0, 'M', u'Ï€'),
+    (0x3A1, 'M', u'ρ'),
+    (0x3A2, 'X'),
+    (0x3A3, 'M', u'σ'),
+    (0x3A4, 'M', u'Ï„'),
+    (0x3A5, 'M', u'Ï…'),
+    (0x3A6, 'M', u'φ'),
+    (0x3A7, 'M', u'χ'),
+    (0x3A8, 'M', u'ψ'),
+    (0x3A9, 'M', u'ω'),
+    (0x3AA, 'M', u'ÏŠ'),
+    (0x3AB, 'M', u'Ï‹'),
+    (0x3AC, 'V'),
+    (0x3C2, 'D', u'σ'),
+    (0x3C3, 'V'),
+    (0x3CF, 'M', u'Ï—'),
+    (0x3D0, 'M', u'β'),
+    (0x3D1, 'M', u'θ'),
+    (0x3D2, 'M', u'Ï…'),
+    (0x3D3, 'M', u'ύ'),
+    (0x3D4, 'M', u'Ï‹'),
+    (0x3D5, 'M', u'φ'),
+    (0x3D6, 'M', u'Ï€'),
+    (0x3D7, 'V'),
+    (0x3D8, 'M', u'Ï™'),
+    (0x3D9, 'V'),
+    (0x3DA, 'M', u'Ï›'),
+    (0x3DB, 'V'),
+    (0x3DC, 'M', u'ϝ'),
+    (0x3DD, 'V'),
+    (0x3DE, 'M', u'ÏŸ'),
+    (0x3DF, 'V'),
+    (0x3E0, 'M', u'Ï¡'),
+    (0x3E1, 'V'),
+    (0x3E2, 'M', u'Ï£'),
+    (0x3E3, 'V'),
+    (0x3E4, 'M', u'Ï¥'),
+    (0x3E5, 'V'),
+    (0x3E6, 'M', u'ϧ'),
+    (0x3E7, 'V'),
+    (0x3E8, 'M', u'Ï©'),
+    (0x3E9, 'V'),
+    (0x3EA, 'M', u'Ï«'),
+    (0x3EB, 'V'),
+    (0x3EC, 'M', u'Ï­'),
+    (0x3ED, 'V'),
+    (0x3EE, 'M', u'ϯ'),
+    (0x3EF, 'V'),
+    (0x3F0, 'M', u'κ'),
+    (0x3F1, 'M', u'ρ'),
+    (0x3F2, 'M', u'σ'),
+    (0x3F3, 'V'),
+    (0x3F4, 'M', u'θ'),
+    (0x3F5, 'M', u'ε'),
+    (0x3F6, 'V'),
+    (0x3F7, 'M', u'ϸ'),
+    (0x3F8, 'V'),
+    (0x3F9, 'M', u'σ'),
+    (0x3FA, 'M', u'Ï»'),
+    (0x3FB, 'V'),
+    (0x3FD, 'M', u'Í»'),
+    (0x3FE, 'M', u'ͼ'),
+    (0x3FF, 'M', u'ͽ'),
+    (0x400, 'M', u'ѐ'),
+    (0x401, 'M', u'Ñ‘'),
+    (0x402, 'M', u'Ñ’'),
+    (0x403, 'M', u'Ñ“'),
+    ]
+
+def _seg_7():
+    return [
+    (0x404, 'M', u'Ñ”'),
+    (0x405, 'M', u'Ñ•'),
+    (0x406, 'M', u'Ñ–'),
+    (0x407, 'M', u'Ñ—'),
+    (0x408, 'M', u'ј'),
+    (0x409, 'M', u'Ñ™'),
+    (0x40A, 'M', u'Ñš'),
+    (0x40B, 'M', u'Ñ›'),
+    (0x40C, 'M', u'ќ'),
+    (0x40D, 'M', u'ѝ'),
+    (0x40E, 'M', u'Ñž'),
+    (0x40F, 'M', u'ÑŸ'),
+    (0x410, 'M', u'а'),
+    (0x411, 'M', u'б'),
+    (0x412, 'M', u'в'),
+    (0x413, 'M', u'г'),
+    (0x414, 'M', u'д'),
+    (0x415, 'M', u'е'),
+    (0x416, 'M', u'ж'),
+    (0x417, 'M', u'з'),
+    (0x418, 'M', u'и'),
+    (0x419, 'M', u'й'),
+    (0x41A, 'M', u'к'),
+    (0x41B, 'M', u'л'),
+    (0x41C, 'M', u'м'),
+    (0x41D, 'M', u'н'),
+    (0x41E, 'M', u'о'),
+    (0x41F, 'M', u'п'),
+    (0x420, 'M', u'Ñ€'),
+    (0x421, 'M', u'с'),
+    (0x422, 'M', u'Ñ‚'),
+    (0x423, 'M', u'у'),
+    (0x424, 'M', u'Ñ„'),
+    (0x425, 'M', u'Ñ…'),
+    (0x426, 'M', u'ц'),
+    (0x427, 'M', u'ч'),
+    (0x428, 'M', u'ш'),
+    (0x429, 'M', u'щ'),
+    (0x42A, 'M', u'ÑŠ'),
+    (0x42B, 'M', u'Ñ‹'),
+    (0x42C, 'M', u'ь'),
+    (0x42D, 'M', u'э'),
+    (0x42E, 'M', u'ÑŽ'),
+    (0x42F, 'M', u'я'),
+    (0x430, 'V'),
+    (0x460, 'M', u'Ñ¡'),
+    (0x461, 'V'),
+    (0x462, 'M', u'Ñ£'),
+    (0x463, 'V'),
+    (0x464, 'M', u'Ñ¥'),
+    (0x465, 'V'),
+    (0x466, 'M', u'ѧ'),
+    (0x467, 'V'),
+    (0x468, 'M', u'Ñ©'),
+    (0x469, 'V'),
+    (0x46A, 'M', u'Ñ«'),
+    (0x46B, 'V'),
+    (0x46C, 'M', u'Ñ­'),
+    (0x46D, 'V'),
+    (0x46E, 'M', u'ѯ'),
+    (0x46F, 'V'),
+    (0x470, 'M', u'ѱ'),
+    (0x471, 'V'),
+    (0x472, 'M', u'ѳ'),
+    (0x473, 'V'),
+    (0x474, 'M', u'ѵ'),
+    (0x475, 'V'),
+    (0x476, 'M', u'Ñ·'),
+    (0x477, 'V'),
+    (0x478, 'M', u'ѹ'),
+    (0x479, 'V'),
+    (0x47A, 'M', u'Ñ»'),
+    (0x47B, 'V'),
+    (0x47C, 'M', u'ѽ'),
+    (0x47D, 'V'),
+    (0x47E, 'M', u'Ñ¿'),
+    (0x47F, 'V'),
+    (0x480, 'M', u'ҁ'),
+    (0x481, 'V'),
+    (0x48A, 'M', u'Ò‹'),
+    (0x48B, 'V'),
+    (0x48C, 'M', u'ҍ'),
+    (0x48D, 'V'),
+    (0x48E, 'M', u'ҏ'),
+    (0x48F, 'V'),
+    (0x490, 'M', u'Ò‘'),
+    (0x491, 'V'),
+    (0x492, 'M', u'Ò“'),
+    (0x493, 'V'),
+    (0x494, 'M', u'Ò•'),
+    (0x495, 'V'),
+    (0x496, 'M', u'Ò—'),
+    (0x497, 'V'),
+    (0x498, 'M', u'Ò™'),
+    (0x499, 'V'),
+    (0x49A, 'M', u'Ò›'),
+    (0x49B, 'V'),
+    (0x49C, 'M', u'ҝ'),
+    (0x49D, 'V'),
+    (0x49E, 'M', u'ÒŸ'),
+    ]
+
+def _seg_8():
+    return [
+    (0x49F, 'V'),
+    (0x4A0, 'M', u'Ò¡'),
+    (0x4A1, 'V'),
+    (0x4A2, 'M', u'Ò£'),
+    (0x4A3, 'V'),
+    (0x4A4, 'M', u'Ò¥'),
+    (0x4A5, 'V'),
+    (0x4A6, 'M', u'Ò§'),
+    (0x4A7, 'V'),
+    (0x4A8, 'M', u'Ò©'),
+    (0x4A9, 'V'),
+    (0x4AA, 'M', u'Ò«'),
+    (0x4AB, 'V'),
+    (0x4AC, 'M', u'Ò­'),
+    (0x4AD, 'V'),
+    (0x4AE, 'M', u'Ò¯'),
+    (0x4AF, 'V'),
+    (0x4B0, 'M', u'Ò±'),
+    (0x4B1, 'V'),
+    (0x4B2, 'M', u'Ò³'),
+    (0x4B3, 'V'),
+    (0x4B4, 'M', u'Òµ'),
+    (0x4B5, 'V'),
+    (0x4B6, 'M', u'Ò·'),
+    (0x4B7, 'V'),
+    (0x4B8, 'M', u'Ò¹'),
+    (0x4B9, 'V'),
+    (0x4BA, 'M', u'Ò»'),
+    (0x4BB, 'V'),
+    (0x4BC, 'M', u'Ò½'),
+    (0x4BD, 'V'),
+    (0x4BE, 'M', u'Ò¿'),
+    (0x4BF, 'V'),
+    (0x4C0, 'X'),
+    (0x4C1, 'M', u'Ó‚'),
+    (0x4C2, 'V'),
+    (0x4C3, 'M', u'Ó„'),
+    (0x4C4, 'V'),
+    (0x4C5, 'M', u'Ó†'),
+    (0x4C6, 'V'),
+    (0x4C7, 'M', u'Óˆ'),
+    (0x4C8, 'V'),
+    (0x4C9, 'M', u'ÓŠ'),
+    (0x4CA, 'V'),
+    (0x4CB, 'M', u'ӌ'),
+    (0x4CC, 'V'),
+    (0x4CD, 'M', u'ÓŽ'),
+    (0x4CE, 'V'),
+    (0x4D0, 'M', u'Ó‘'),
+    (0x4D1, 'V'),
+    (0x4D2, 'M', u'Ó“'),
+    (0x4D3, 'V'),
+    (0x4D4, 'M', u'Ó•'),
+    (0x4D5, 'V'),
+    (0x4D6, 'M', u'Ó—'),
+    (0x4D7, 'V'),
+    (0x4D8, 'M', u'Ó™'),
+    (0x4D9, 'V'),
+    (0x4DA, 'M', u'Ó›'),
+    (0x4DB, 'V'),
+    (0x4DC, 'M', u'ӝ'),
+    (0x4DD, 'V'),
+    (0x4DE, 'M', u'ÓŸ'),
+    (0x4DF, 'V'),
+    (0x4E0, 'M', u'Ó¡'),
+    (0x4E1, 'V'),
+    (0x4E2, 'M', u'Ó£'),
+    (0x4E3, 'V'),
+    (0x4E4, 'M', u'Ó¥'),
+    (0x4E5, 'V'),
+    (0x4E6, 'M', u'Ó§'),
+    (0x4E7, 'V'),
+    (0x4E8, 'M', u'Ó©'),
+    (0x4E9, 'V'),
+    (0x4EA, 'M', u'Ó«'),
+    (0x4EB, 'V'),
+    (0x4EC, 'M', u'Ó­'),
+    (0x4ED, 'V'),
+    (0x4EE, 'M', u'Ó¯'),
+    (0x4EF, 'V'),
+    (0x4F0, 'M', u'Ó±'),
+    (0x4F1, 'V'),
+    (0x4F2, 'M', u'Ó³'),
+    (0x4F3, 'V'),
+    (0x4F4, 'M', u'Óµ'),
+    (0x4F5, 'V'),
+    (0x4F6, 'M', u'Ó·'),
+    (0x4F7, 'V'),
+    (0x4F8, 'M', u'Ó¹'),
+    (0x4F9, 'V'),
+    (0x4FA, 'M', u'Ó»'),
+    (0x4FB, 'V'),
+    (0x4FC, 'M', u'Ó½'),
+    (0x4FD, 'V'),
+    (0x4FE, 'M', u'Ó¿'),
+    (0x4FF, 'V'),
+    (0x500, 'M', u'ԁ'),
+    (0x501, 'V'),
+    (0x502, 'M', u'Ôƒ'),
+    (0x503, 'V'),
+    ]
+
+def _seg_9():
+    return [
+    (0x504, 'M', u'Ô…'),
+    (0x505, 'V'),
+    (0x506, 'M', u'Ô‡'),
+    (0x507, 'V'),
+    (0x508, 'M', u'Ô‰'),
+    (0x509, 'V'),
+    (0x50A, 'M', u'Ô‹'),
+    (0x50B, 'V'),
+    (0x50C, 'M', u'ԍ'),
+    (0x50D, 'V'),
+    (0x50E, 'M', u'ԏ'),
+    (0x50F, 'V'),
+    (0x510, 'M', u'Ô‘'),
+    (0x511, 'V'),
+    (0x512, 'M', u'Ô“'),
+    (0x513, 'V'),
+    (0x514, 'M', u'Ô•'),
+    (0x515, 'V'),
+    (0x516, 'M', u'Ô—'),
+    (0x517, 'V'),
+    (0x518, 'M', u'Ô™'),
+    (0x519, 'V'),
+    (0x51A, 'M', u'Ô›'),
+    (0x51B, 'V'),
+    (0x51C, 'M', u'ԝ'),
+    (0x51D, 'V'),
+    (0x51E, 'M', u'ÔŸ'),
+    (0x51F, 'V'),
+    (0x520, 'M', u'Ô¡'),
+    (0x521, 'V'),
+    (0x522, 'M', u'Ô£'),
+    (0x523, 'V'),
+    (0x524, 'M', u'Ô¥'),
+    (0x525, 'V'),
+    (0x526, 'M', u'Ô§'),
+    (0x527, 'V'),
+    (0x528, 'X'),
+    (0x531, 'M', u'Õ¡'),
+    (0x532, 'M', u'Õ¢'),
+    (0x533, 'M', u'Õ£'),
+    (0x534, 'M', u'Õ¤'),
+    (0x535, 'M', u'Õ¥'),
+    (0x536, 'M', u'Õ¦'),
+    (0x537, 'M', u'Õ§'),
+    (0x538, 'M', u'Õ¨'),
+    (0x539, 'M', u'Õ©'),
+    (0x53A, 'M', u'Õª'),
+    (0x53B, 'M', u'Õ«'),
+    (0x53C, 'M', u'Õ¬'),
+    (0x53D, 'M', u'Õ­'),
+    (0x53E, 'M', u'Õ®'),
+    (0x53F, 'M', u'Õ¯'),
+    (0x540, 'M', u'Õ°'),
+    (0x541, 'M', u'Õ±'),
+    (0x542, 'M', u'Õ²'),
+    (0x543, 'M', u'Õ³'),
+    (0x544, 'M', u'Õ´'),
+    (0x545, 'M', u'Õµ'),
+    (0x546, 'M', u'Õ¶'),
+    (0x547, 'M', u'Õ·'),
+    (0x548, 'M', u'Õ¸'),
+    (0x549, 'M', u'Õ¹'),
+    (0x54A, 'M', u'Õº'),
+    (0x54B, 'M', u'Õ»'),
+    (0x54C, 'M', u'Õ¼'),
+    (0x54D, 'M', u'Õ½'),
+    (0x54E, 'M', u'Õ¾'),
+    (0x54F, 'M', u'Õ¿'),
+    (0x550, 'M', u'Ö€'),
+    (0x551, 'M', u'ց'),
+    (0x552, 'M', u'Ö‚'),
+    (0x553, 'M', u'Öƒ'),
+    (0x554, 'M', u'Ö„'),
+    (0x555, 'M', u'Ö…'),
+    (0x556, 'M', u'Ö†'),
+    (0x557, 'X'),
+    (0x559, 'V'),
+    (0x560, 'X'),
+    (0x561, 'V'),
+    (0x587, 'M', u'Õ¥Ö‚'),
+    (0x588, 'X'),
+    (0x589, 'V'),
+    (0x58B, 'X'),
+    (0x58F, 'V'),
+    (0x590, 'X'),
+    (0x591, 'V'),
+    (0x5C8, 'X'),
+    (0x5D0, 'V'),
+    (0x5EB, 'X'),
+    (0x5F0, 'V'),
+    (0x5F5, 'X'),
+    (0x606, 'V'),
+    (0x61C, 'X'),
+    (0x61E, 'V'),
+    (0x675, 'M', u'اٴ'),
+    (0x676, 'M', u'وٴ'),
+    (0x677, 'M', u'Û‡Ù´'),
+    (0x678, 'M', u'يٴ'),
+    (0x679, 'V'),
+    (0x6DD, 'X'),
+    ]
+
+def _seg_10():
+    return [
+    (0x6DE, 'V'),
+    (0x70E, 'X'),
+    (0x710, 'V'),
+    (0x74B, 'X'),
+    (0x74D, 'V'),
+    (0x7B2, 'X'),
+    (0x7C0, 'V'),
+    (0x7FB, 'X'),
+    (0x800, 'V'),
+    (0x82E, 'X'),
+    (0x830, 'V'),
+    (0x83F, 'X'),
+    (0x840, 'V'),
+    (0x85C, 'X'),
+    (0x85E, 'V'),
+    (0x85F, 'X'),
+    (0x8A0, 'V'),
+    (0x8A1, 'X'),
+    (0x8A2, 'V'),
+    (0x8AD, 'X'),
+    (0x8E4, 'V'),
+    (0x8FF, 'X'),
+    (0x900, 'V'),
+    (0x958, 'M', u'क़'),
+    (0x959, 'M', u'ख़'),
+    (0x95A, 'M', u'ग़'),
+    (0x95B, 'M', u'ज़'),
+    (0x95C, 'M', u'ड़'),
+    (0x95D, 'M', u'ढ़'),
+    (0x95E, 'M', u'फ़'),
+    (0x95F, 'M', u'य़'),
+    (0x960, 'V'),
+    (0x978, 'X'),
+    (0x979, 'V'),
+    (0x980, 'X'),
+    (0x981, 'V'),
+    (0x984, 'X'),
+    (0x985, 'V'),
+    (0x98D, 'X'),
+    (0x98F, 'V'),
+    (0x991, 'X'),
+    (0x993, 'V'),
+    (0x9A9, 'X'),
+    (0x9AA, 'V'),
+    (0x9B1, 'X'),
+    (0x9B2, 'V'),
+    (0x9B3, 'X'),
+    (0x9B6, 'V'),
+    (0x9BA, 'X'),
+    (0x9BC, 'V'),
+    (0x9C5, 'X'),
+    (0x9C7, 'V'),
+    (0x9C9, 'X'),
+    (0x9CB, 'V'),
+    (0x9CF, 'X'),
+    (0x9D7, 'V'),
+    (0x9D8, 'X'),
+    (0x9DC, 'M', u'ড়'),
+    (0x9DD, 'M', u'ঢ়'),
+    (0x9DE, 'X'),
+    (0x9DF, 'M', u'য়'),
+    (0x9E0, 'V'),
+    (0x9E4, 'X'),
+    (0x9E6, 'V'),
+    (0x9FC, 'X'),
+    (0xA01, 'V'),
+    (0xA04, 'X'),
+    (0xA05, 'V'),
+    (0xA0B, 'X'),
+    (0xA0F, 'V'),
+    (0xA11, 'X'),
+    (0xA13, 'V'),
+    (0xA29, 'X'),
+    (0xA2A, 'V'),
+    (0xA31, 'X'),
+    (0xA32, 'V'),
+    (0xA33, 'M', u'ਲ਼'),
+    (0xA34, 'X'),
+    (0xA35, 'V'),
+    (0xA36, 'M', u'ਸ਼'),
+    (0xA37, 'X'),
+    (0xA38, 'V'),
+    (0xA3A, 'X'),
+    (0xA3C, 'V'),
+    (0xA3D, 'X'),
+    (0xA3E, 'V'),
+    (0xA43, 'X'),
+    (0xA47, 'V'),
+    (0xA49, 'X'),
+    (0xA4B, 'V'),
+    (0xA4E, 'X'),
+    (0xA51, 'V'),
+    (0xA52, 'X'),
+    (0xA59, 'M', u'ਖ਼'),
+    (0xA5A, 'M', u'ਗ਼'),
+    (0xA5B, 'M', u'ਜ਼'),
+    (0xA5C, 'V'),
+    (0xA5D, 'X'),
+    (0xA5E, 'M', u'ਫ਼'),
+    (0xA5F, 'X'),
+    ]
+
+def _seg_11():
+    return [
+    (0xA66, 'V'),
+    (0xA76, 'X'),
+    (0xA81, 'V'),
+    (0xA84, 'X'),
+    (0xA85, 'V'),
+    (0xA8E, 'X'),
+    (0xA8F, 'V'),
+    (0xA92, 'X'),
+    (0xA93, 'V'),
+    (0xAA9, 'X'),
+    (0xAAA, 'V'),
+    (0xAB1, 'X'),
+    (0xAB2, 'V'),
+    (0xAB4, 'X'),
+    (0xAB5, 'V'),
+    (0xABA, 'X'),
+    (0xABC, 'V'),
+    (0xAC6, 'X'),
+    (0xAC7, 'V'),
+    (0xACA, 'X'),
+    (0xACB, 'V'),
+    (0xACE, 'X'),
+    (0xAD0, 'V'),
+    (0xAD1, 'X'),
+    (0xAE0, 'V'),
+    (0xAE4, 'X'),
+    (0xAE6, 'V'),
+    (0xAF2, 'X'),
+    (0xB01, 'V'),
+    (0xB04, 'X'),
+    (0xB05, 'V'),
+    (0xB0D, 'X'),
+    (0xB0F, 'V'),
+    (0xB11, 'X'),
+    (0xB13, 'V'),
+    (0xB29, 'X'),
+    (0xB2A, 'V'),
+    (0xB31, 'X'),
+    (0xB32, 'V'),
+    (0xB34, 'X'),
+    (0xB35, 'V'),
+    (0xB3A, 'X'),
+    (0xB3C, 'V'),
+    (0xB45, 'X'),
+    (0xB47, 'V'),
+    (0xB49, 'X'),
+    (0xB4B, 'V'),
+    (0xB4E, 'X'),
+    (0xB56, 'V'),
+    (0xB58, 'X'),
+    (0xB5C, 'M', u'ଡ଼'),
+    (0xB5D, 'M', u'ଢ଼'),
+    (0xB5E, 'X'),
+    (0xB5F, 'V'),
+    (0xB64, 'X'),
+    (0xB66, 'V'),
+    (0xB78, 'X'),
+    (0xB82, 'V'),
+    (0xB84, 'X'),
+    (0xB85, 'V'),
+    (0xB8B, 'X'),
+    (0xB8E, 'V'),
+    (0xB91, 'X'),
+    (0xB92, 'V'),
+    (0xB96, 'X'),
+    (0xB99, 'V'),
+    (0xB9B, 'X'),
+    (0xB9C, 'V'),
+    (0xB9D, 'X'),
+    (0xB9E, 'V'),
+    (0xBA0, 'X'),
+    (0xBA3, 'V'),
+    (0xBA5, 'X'),
+    (0xBA8, 'V'),
+    (0xBAB, 'X'),
+    (0xBAE, 'V'),
+    (0xBBA, 'X'),
+    (0xBBE, 'V'),
+    (0xBC3, 'X'),
+    (0xBC6, 'V'),
+    (0xBC9, 'X'),
+    (0xBCA, 'V'),
+    (0xBCE, 'X'),
+    (0xBD0, 'V'),
+    (0xBD1, 'X'),
+    (0xBD7, 'V'),
+    (0xBD8, 'X'),
+    (0xBE6, 'V'),
+    (0xBFB, 'X'),
+    (0xC01, 'V'),
+    (0xC04, 'X'),
+    (0xC05, 'V'),
+    (0xC0D, 'X'),
+    (0xC0E, 'V'),
+    (0xC11, 'X'),
+    (0xC12, 'V'),
+    (0xC29, 'X'),
+    (0xC2A, 'V'),
+    (0xC34, 'X'),
+    (0xC35, 'V'),
+    ]
+
+def _seg_12():
+    return [
+    (0xC3A, 'X'),
+    (0xC3D, 'V'),
+    (0xC45, 'X'),
+    (0xC46, 'V'),
+    (0xC49, 'X'),
+    (0xC4A, 'V'),
+    (0xC4E, 'X'),
+    (0xC55, 'V'),
+    (0xC57, 'X'),
+    (0xC58, 'V'),
+    (0xC5A, 'X'),
+    (0xC60, 'V'),
+    (0xC64, 'X'),
+    (0xC66, 'V'),
+    (0xC70, 'X'),
+    (0xC78, 'V'),
+    (0xC80, 'X'),
+    (0xC82, 'V'),
+    (0xC84, 'X'),
+    (0xC85, 'V'),
+    (0xC8D, 'X'),
+    (0xC8E, 'V'),
+    (0xC91, 'X'),
+    (0xC92, 'V'),
+    (0xCA9, 'X'),
+    (0xCAA, 'V'),
+    (0xCB4, 'X'),
+    (0xCB5, 'V'),
+    (0xCBA, 'X'),
+    (0xCBC, 'V'),
+    (0xCC5, 'X'),
+    (0xCC6, 'V'),
+    (0xCC9, 'X'),
+    (0xCCA, 'V'),
+    (0xCCE, 'X'),
+    (0xCD5, 'V'),
+    (0xCD7, 'X'),
+    (0xCDE, 'V'),
+    (0xCDF, 'X'),
+    (0xCE0, 'V'),
+    (0xCE4, 'X'),
+    (0xCE6, 'V'),
+    (0xCF0, 'X'),
+    (0xCF1, 'V'),
+    (0xCF3, 'X'),
+    (0xD02, 'V'),
+    (0xD04, 'X'),
+    (0xD05, 'V'),
+    (0xD0D, 'X'),
+    (0xD0E, 'V'),
+    (0xD11, 'X'),
+    (0xD12, 'V'),
+    (0xD3B, 'X'),
+    (0xD3D, 'V'),
+    (0xD45, 'X'),
+    (0xD46, 'V'),
+    (0xD49, 'X'),
+    (0xD4A, 'V'),
+    (0xD4F, 'X'),
+    (0xD57, 'V'),
+    (0xD58, 'X'),
+    (0xD60, 'V'),
+    (0xD64, 'X'),
+    (0xD66, 'V'),
+    (0xD76, 'X'),
+    (0xD79, 'V'),
+    (0xD80, 'X'),
+    (0xD82, 'V'),
+    (0xD84, 'X'),
+    (0xD85, 'V'),
+    (0xD97, 'X'),
+    (0xD9A, 'V'),
+    (0xDB2, 'X'),
+    (0xDB3, 'V'),
+    (0xDBC, 'X'),
+    (0xDBD, 'V'),
+    (0xDBE, 'X'),
+    (0xDC0, 'V'),
+    (0xDC7, 'X'),
+    (0xDCA, 'V'),
+    (0xDCB, 'X'),
+    (0xDCF, 'V'),
+    (0xDD5, 'X'),
+    (0xDD6, 'V'),
+    (0xDD7, 'X'),
+    (0xDD8, 'V'),
+    (0xDE0, 'X'),
+    (0xDF2, 'V'),
+    (0xDF5, 'X'),
+    (0xE01, 'V'),
+    (0xE33, 'M', u'ํา'),
+    (0xE34, 'V'),
+    (0xE3B, 'X'),
+    (0xE3F, 'V'),
+    (0xE5C, 'X'),
+    (0xE81, 'V'),
+    (0xE83, 'X'),
+    (0xE84, 'V'),
+    (0xE85, 'X'),
+    (0xE87, 'V'),
+    ]
+
+def _seg_13():
+    return [
+    (0xE89, 'X'),
+    (0xE8A, 'V'),
+    (0xE8B, 'X'),
+    (0xE8D, 'V'),
+    (0xE8E, 'X'),
+    (0xE94, 'V'),
+    (0xE98, 'X'),
+    (0xE99, 'V'),
+    (0xEA0, 'X'),
+    (0xEA1, 'V'),
+    (0xEA4, 'X'),
+    (0xEA5, 'V'),
+    (0xEA6, 'X'),
+    (0xEA7, 'V'),
+    (0xEA8, 'X'),
+    (0xEAA, 'V'),
+    (0xEAC, 'X'),
+    (0xEAD, 'V'),
+    (0xEB3, 'M', u'ໍາ'),
+    (0xEB4, 'V'),
+    (0xEBA, 'X'),
+    (0xEBB, 'V'),
+    (0xEBE, 'X'),
+    (0xEC0, 'V'),
+    (0xEC5, 'X'),
+    (0xEC6, 'V'),
+    (0xEC7, 'X'),
+    (0xEC8, 'V'),
+    (0xECE, 'X'),
+    (0xED0, 'V'),
+    (0xEDA, 'X'),
+    (0xEDC, 'M', u'ຫນ'),
+    (0xEDD, 'M', u'ຫມ'),
+    (0xEDE, 'V'),
+    (0xEE0, 'X'),
+    (0xF00, 'V'),
+    (0xF0C, 'M', u'་'),
+    (0xF0D, 'V'),
+    (0xF43, 'M', u'གྷ'),
+    (0xF44, 'V'),
+    (0xF48, 'X'),
+    (0xF49, 'V'),
+    (0xF4D, 'M', u'ཌྷ'),
+    (0xF4E, 'V'),
+    (0xF52, 'M', u'དྷ'),
+    (0xF53, 'V'),
+    (0xF57, 'M', u'བྷ'),
+    (0xF58, 'V'),
+    (0xF5C, 'M', u'ཛྷ'),
+    (0xF5D, 'V'),
+    (0xF69, 'M', u'ཀྵ'),
+    (0xF6A, 'V'),
+    (0xF6D, 'X'),
+    (0xF71, 'V'),
+    (0xF73, 'M', u'ཱི'),
+    (0xF74, 'V'),
+    (0xF75, 'M', u'ཱུ'),
+    (0xF76, 'M', u'ྲྀ'),
+    (0xF77, 'M', u'ྲཱྀ'),
+    (0xF78, 'M', u'ླྀ'),
+    (0xF79, 'M', u'ླཱྀ'),
+    (0xF7A, 'V'),
+    (0xF81, 'M', u'ཱྀ'),
+    (0xF82, 'V'),
+    (0xF93, 'M', u'ྒྷ'),
+    (0xF94, 'V'),
+    (0xF98, 'X'),
+    (0xF99, 'V'),
+    (0xF9D, 'M', u'ྜྷ'),
+    (0xF9E, 'V'),
+    (0xFA2, 'M', u'ྡྷ'),
+    (0xFA3, 'V'),
+    (0xFA7, 'M', u'ྦྷ'),
+    (0xFA8, 'V'),
+    (0xFAC, 'M', u'ྫྷ'),
+    (0xFAD, 'V'),
+    (0xFB9, 'M', u'ྐྵ'),
+    (0xFBA, 'V'),
+    (0xFBD, 'X'),
+    (0xFBE, 'V'),
+    (0xFCD, 'X'),
+    (0xFCE, 'V'),
+    (0xFDB, 'X'),
+    (0x1000, 'V'),
+    (0x10A0, 'X'),
+    (0x10C7, 'M', u'â´§'),
+    (0x10C8, 'X'),
+    (0x10CD, 'M', u'â´­'),
+    (0x10CE, 'X'),
+    (0x10D0, 'V'),
+    (0x10FC, 'M', u'ნ'),
+    (0x10FD, 'V'),
+    (0x115F, 'X'),
+    (0x1161, 'V'),
+    (0x1249, 'X'),
+    (0x124A, 'V'),
+    (0x124E, 'X'),
+    (0x1250, 'V'),
+    (0x1257, 'X'),
+    (0x1258, 'V'),
+    ]
+
+def _seg_14():
+    return [
+    (0x1259, 'X'),
+    (0x125A, 'V'),
+    (0x125E, 'X'),
+    (0x1260, 'V'),
+    (0x1289, 'X'),
+    (0x128A, 'V'),
+    (0x128E, 'X'),
+    (0x1290, 'V'),
+    (0x12B1, 'X'),
+    (0x12B2, 'V'),
+    (0x12B6, 'X'),
+    (0x12B8, 'V'),
+    (0x12BF, 'X'),
+    (0x12C0, 'V'),
+    (0x12C1, 'X'),
+    (0x12C2, 'V'),
+    (0x12C6, 'X'),
+    (0x12C8, 'V'),
+    (0x12D7, 'X'),
+    (0x12D8, 'V'),
+    (0x1311, 'X'),
+    (0x1312, 'V'),
+    (0x1316, 'X'),
+    (0x1318, 'V'),
+    (0x135B, 'X'),
+    (0x135D, 'V'),
+    (0x137D, 'X'),
+    (0x1380, 'V'),
+    (0x139A, 'X'),
+    (0x13A0, 'V'),
+    (0x13F5, 'X'),
+    (0x1400, 'V'),
+    (0x1680, 'X'),
+    (0x1681, 'V'),
+    (0x169D, 'X'),
+    (0x16A0, 'V'),
+    (0x16F1, 'X'),
+    (0x1700, 'V'),
+    (0x170D, 'X'),
+    (0x170E, 'V'),
+    (0x1715, 'X'),
+    (0x1720, 'V'),
+    (0x1737, 'X'),
+    (0x1740, 'V'),
+    (0x1754, 'X'),
+    (0x1760, 'V'),
+    (0x176D, 'X'),
+    (0x176E, 'V'),
+    (0x1771, 'X'),
+    (0x1772, 'V'),
+    (0x1774, 'X'),
+    (0x1780, 'V'),
+    (0x17B4, 'X'),
+    (0x17B6, 'V'),
+    (0x17DE, 'X'),
+    (0x17E0, 'V'),
+    (0x17EA, 'X'),
+    (0x17F0, 'V'),
+    (0x17FA, 'X'),
+    (0x1800, 'V'),
+    (0x1806, 'X'),
+    (0x1807, 'V'),
+    (0x180B, 'I'),
+    (0x180E, 'X'),
+    (0x1810, 'V'),
+    (0x181A, 'X'),
+    (0x1820, 'V'),
+    (0x1878, 'X'),
+    (0x1880, 'V'),
+    (0x18AB, 'X'),
+    (0x18B0, 'V'),
+    (0x18F6, 'X'),
+    (0x1900, 'V'),
+    (0x191D, 'X'),
+    (0x1920, 'V'),
+    (0x192C, 'X'),
+    (0x1930, 'V'),
+    (0x193C, 'X'),
+    (0x1940, 'V'),
+    (0x1941, 'X'),
+    (0x1944, 'V'),
+    (0x196E, 'X'),
+    (0x1970, 'V'),
+    (0x1975, 'X'),
+    (0x1980, 'V'),
+    (0x19AC, 'X'),
+    (0x19B0, 'V'),
+    (0x19CA, 'X'),
+    (0x19D0, 'V'),
+    (0x19DB, 'X'),
+    (0x19DE, 'V'),
+    (0x1A1C, 'X'),
+    (0x1A1E, 'V'),
+    (0x1A5F, 'X'),
+    (0x1A60, 'V'),
+    (0x1A7D, 'X'),
+    (0x1A7F, 'V'),
+    (0x1A8A, 'X'),
+    (0x1A90, 'V'),
+    (0x1A9A, 'X'),
+    ]
+
+def _seg_15():
+    return [
+    (0x1AA0, 'V'),
+    (0x1AAE, 'X'),
+    (0x1B00, 'V'),
+    (0x1B4C, 'X'),
+    (0x1B50, 'V'),
+    (0x1B7D, 'X'),
+    (0x1B80, 'V'),
+    (0x1BF4, 'X'),
+    (0x1BFC, 'V'),
+    (0x1C38, 'X'),
+    (0x1C3B, 'V'),
+    (0x1C4A, 'X'),
+    (0x1C4D, 'V'),
+    (0x1C80, 'X'),
+    (0x1CC0, 'V'),
+    (0x1CC8, 'X'),
+    (0x1CD0, 'V'),
+    (0x1CF7, 'X'),
+    (0x1D00, 'V'),
+    (0x1D2C, 'M', u'a'),
+    (0x1D2D, 'M', u'æ'),
+    (0x1D2E, 'M', u'b'),
+    (0x1D2F, 'V'),
+    (0x1D30, 'M', u'd'),
+    (0x1D31, 'M', u'e'),
+    (0x1D32, 'M', u'ǝ'),
+    (0x1D33, 'M', u'g'),
+    (0x1D34, 'M', u'h'),
+    (0x1D35, 'M', u'i'),
+    (0x1D36, 'M', u'j'),
+    (0x1D37, 'M', u'k'),
+    (0x1D38, 'M', u'l'),
+    (0x1D39, 'M', u'm'),
+    (0x1D3A, 'M', u'n'),
+    (0x1D3B, 'V'),
+    (0x1D3C, 'M', u'o'),
+    (0x1D3D, 'M', u'È£'),
+    (0x1D3E, 'M', u'p'),
+    (0x1D3F, 'M', u'r'),
+    (0x1D40, 'M', u't'),
+    (0x1D41, 'M', u'u'),
+    (0x1D42, 'M', u'w'),
+    (0x1D43, 'M', u'a'),
+    (0x1D44, 'M', u'ɐ'),
+    (0x1D45, 'M', u'É‘'),
+    (0x1D46, 'M', u'á´‚'),
+    (0x1D47, 'M', u'b'),
+    (0x1D48, 'M', u'd'),
+    (0x1D49, 'M', u'e'),
+    (0x1D4A, 'M', u'É™'),
+    (0x1D4B, 'M', u'É›'),
+    (0x1D4C, 'M', u'ɜ'),
+    (0x1D4D, 'M', u'g'),
+    (0x1D4E, 'V'),
+    (0x1D4F, 'M', u'k'),
+    (0x1D50, 'M', u'm'),
+    (0x1D51, 'M', u'Å‹'),
+    (0x1D52, 'M', u'o'),
+    (0x1D53, 'M', u'É”'),
+    (0x1D54, 'M', u'á´–'),
+    (0x1D55, 'M', u'á´—'),
+    (0x1D56, 'M', u'p'),
+    (0x1D57, 'M', u't'),
+    (0x1D58, 'M', u'u'),
+    (0x1D59, 'M', u'ᴝ'),
+    (0x1D5A, 'M', u'ɯ'),
+    (0x1D5B, 'M', u'v'),
+    (0x1D5C, 'M', u'á´¥'),
+    (0x1D5D, 'M', u'β'),
+    (0x1D5E, 'M', u'γ'),
+    (0x1D5F, 'M', u'δ'),
+    (0x1D60, 'M', u'φ'),
+    (0x1D61, 'M', u'χ'),
+    (0x1D62, 'M', u'i'),
+    (0x1D63, 'M', u'r'),
+    (0x1D64, 'M', u'u'),
+    (0x1D65, 'M', u'v'),
+    (0x1D66, 'M', u'β'),
+    (0x1D67, 'M', u'γ'),
+    (0x1D68, 'M', u'ρ'),
+    (0x1D69, 'M', u'φ'),
+    (0x1D6A, 'M', u'χ'),
+    (0x1D6B, 'V'),
+    (0x1D78, 'M', u'н'),
+    (0x1D79, 'V'),
+    (0x1D9B, 'M', u'É’'),
+    (0x1D9C, 'M', u'c'),
+    (0x1D9D, 'M', u'É•'),
+    (0x1D9E, 'M', u'ð'),
+    (0x1D9F, 'M', u'ɜ'),
+    (0x1DA0, 'M', u'f'),
+    (0x1DA1, 'M', u'ÉŸ'),
+    (0x1DA2, 'M', u'É¡'),
+    (0x1DA3, 'M', u'É¥'),
+    (0x1DA4, 'M', u'ɨ'),
+    (0x1DA5, 'M', u'É©'),
+    (0x1DA6, 'M', u'ɪ'),
+    (0x1DA7, 'M', u'áµ»'),
+    (0x1DA8, 'M', u'ʝ'),
+    (0x1DA9, 'M', u'É­'),
+    ]
+
+def _seg_16():
+    return [
+    (0x1DAA, 'M', u'á¶…'),
+    (0x1DAB, 'M', u'ÊŸ'),
+    (0x1DAC, 'M', u'ɱ'),
+    (0x1DAD, 'M', u'ɰ'),
+    (0x1DAE, 'M', u'ɲ'),
+    (0x1DAF, 'M', u'ɳ'),
+    (0x1DB0, 'M', u'É´'),
+    (0x1DB1, 'M', u'ɵ'),
+    (0x1DB2, 'M', u'ɸ'),
+    (0x1DB3, 'M', u'Ê‚'),
+    (0x1DB4, 'M', u'ʃ'),
+    (0x1DB5, 'M', u'Æ«'),
+    (0x1DB6, 'M', u'ʉ'),
+    (0x1DB7, 'M', u'ÊŠ'),
+    (0x1DB8, 'M', u'ᴜ'),
+    (0x1DB9, 'M', u'Ê‹'),
+    (0x1DBA, 'M', u'ʌ'),
+    (0x1DBB, 'M', u'z'),
+    (0x1DBC, 'M', u'ʐ'),
+    (0x1DBD, 'M', u'Ê‘'),
+    (0x1DBE, 'M', u'Ê’'),
+    (0x1DBF, 'M', u'θ'),
+    (0x1DC0, 'V'),
+    (0x1DE7, 'X'),
+    (0x1DFC, 'V'),
+    (0x1E00, 'M', u'ḁ'),
+    (0x1E01, 'V'),
+    (0x1E02, 'M', u'ḃ'),
+    (0x1E03, 'V'),
+    (0x1E04, 'M', u'ḅ'),
+    (0x1E05, 'V'),
+    (0x1E06, 'M', u'ḇ'),
+    (0x1E07, 'V'),
+    (0x1E08, 'M', u'ḉ'),
+    (0x1E09, 'V'),
+    (0x1E0A, 'M', u'ḋ'),
+    (0x1E0B, 'V'),
+    (0x1E0C, 'M', u'ḍ'),
+    (0x1E0D, 'V'),
+    (0x1E0E, 'M', u'ḏ'),
+    (0x1E0F, 'V'),
+    (0x1E10, 'M', u'ḑ'),
+    (0x1E11, 'V'),
+    (0x1E12, 'M', u'ḓ'),
+    (0x1E13, 'V'),
+    (0x1E14, 'M', u'ḕ'),
+    (0x1E15, 'V'),
+    (0x1E16, 'M', u'ḗ'),
+    (0x1E17, 'V'),
+    (0x1E18, 'M', u'ḙ'),
+    (0x1E19, 'V'),
+    (0x1E1A, 'M', u'ḛ'),
+    (0x1E1B, 'V'),
+    (0x1E1C, 'M', u'ḝ'),
+    (0x1E1D, 'V'),
+    (0x1E1E, 'M', u'ḟ'),
+    (0x1E1F, 'V'),
+    (0x1E20, 'M', u'ḡ'),
+    (0x1E21, 'V'),
+    (0x1E22, 'M', u'ḣ'),
+    (0x1E23, 'V'),
+    (0x1E24, 'M', u'ḥ'),
+    (0x1E25, 'V'),
+    (0x1E26, 'M', u'ḧ'),
+    (0x1E27, 'V'),
+    (0x1E28, 'M', u'ḩ'),
+    (0x1E29, 'V'),
+    (0x1E2A, 'M', u'ḫ'),
+    (0x1E2B, 'V'),
+    (0x1E2C, 'M', u'ḭ'),
+    (0x1E2D, 'V'),
+    (0x1E2E, 'M', u'ḯ'),
+    (0x1E2F, 'V'),
+    (0x1E30, 'M', u'ḱ'),
+    (0x1E31, 'V'),
+    (0x1E32, 'M', u'ḳ'),
+    (0x1E33, 'V'),
+    (0x1E34, 'M', u'ḵ'),
+    (0x1E35, 'V'),
+    (0x1E36, 'M', u'ḷ'),
+    (0x1E37, 'V'),
+    (0x1E38, 'M', u'ḹ'),
+    (0x1E39, 'V'),
+    (0x1E3A, 'M', u'ḻ'),
+    (0x1E3B, 'V'),
+    (0x1E3C, 'M', u'ḽ'),
+    (0x1E3D, 'V'),
+    (0x1E3E, 'M', u'ḿ'),
+    (0x1E3F, 'V'),
+    (0x1E40, 'M', u'ṁ'),
+    (0x1E41, 'V'),
+    (0x1E42, 'M', u'ṃ'),
+    (0x1E43, 'V'),
+    (0x1E44, 'M', u'á¹…'),
+    (0x1E45, 'V'),
+    (0x1E46, 'M', u'ṇ'),
+    (0x1E47, 'V'),
+    (0x1E48, 'M', u'ṉ'),
+    (0x1E49, 'V'),
+    (0x1E4A, 'M', u'ṋ'),
+    ]
+
+def _seg_17():
+    return [
+    (0x1E4B, 'V'),
+    (0x1E4C, 'M', u'ṍ'),
+    (0x1E4D, 'V'),
+    (0x1E4E, 'M', u'ṏ'),
+    (0x1E4F, 'V'),
+    (0x1E50, 'M', u'ṑ'),
+    (0x1E51, 'V'),
+    (0x1E52, 'M', u'ṓ'),
+    (0x1E53, 'V'),
+    (0x1E54, 'M', u'ṕ'),
+    (0x1E55, 'V'),
+    (0x1E56, 'M', u'á¹—'),
+    (0x1E57, 'V'),
+    (0x1E58, 'M', u'á¹™'),
+    (0x1E59, 'V'),
+    (0x1E5A, 'M', u'á¹›'),
+    (0x1E5B, 'V'),
+    (0x1E5C, 'M', u'ṝ'),
+    (0x1E5D, 'V'),
+    (0x1E5E, 'M', u'ṟ'),
+    (0x1E5F, 'V'),
+    (0x1E60, 'M', u'ṡ'),
+    (0x1E61, 'V'),
+    (0x1E62, 'M', u'á¹£'),
+    (0x1E63, 'V'),
+    (0x1E64, 'M', u'á¹¥'),
+    (0x1E65, 'V'),
+    (0x1E66, 'M', u'á¹§'),
+    (0x1E67, 'V'),
+    (0x1E68, 'M', u'ṩ'),
+    (0x1E69, 'V'),
+    (0x1E6A, 'M', u'ṫ'),
+    (0x1E6B, 'V'),
+    (0x1E6C, 'M', u'á¹­'),
+    (0x1E6D, 'V'),
+    (0x1E6E, 'M', u'ṯ'),
+    (0x1E6F, 'V'),
+    (0x1E70, 'M', u'á¹±'),
+    (0x1E71, 'V'),
+    (0x1E72, 'M', u'á¹³'),
+    (0x1E73, 'V'),
+    (0x1E74, 'M', u'á¹µ'),
+    (0x1E75, 'V'),
+    (0x1E76, 'M', u'á¹·'),
+    (0x1E77, 'V'),
+    (0x1E78, 'M', u'á¹¹'),
+    (0x1E79, 'V'),
+    (0x1E7A, 'M', u'á¹»'),
+    (0x1E7B, 'V'),
+    (0x1E7C, 'M', u'á¹½'),
+    (0x1E7D, 'V'),
+    (0x1E7E, 'M', u'ṿ'),
+    (0x1E7F, 'V'),
+    (0x1E80, 'M', u'ẁ'),
+    (0x1E81, 'V'),
+    (0x1E82, 'M', u'ẃ'),
+    (0x1E83, 'V'),
+    (0x1E84, 'M', u'ẅ'),
+    (0x1E85, 'V'),
+    (0x1E86, 'M', u'ẇ'),
+    (0x1E87, 'V'),
+    (0x1E88, 'M', u'ẉ'),
+    (0x1E89, 'V'),
+    (0x1E8A, 'M', u'ẋ'),
+    (0x1E8B, 'V'),
+    (0x1E8C, 'M', u'ẍ'),
+    (0x1E8D, 'V'),
+    (0x1E8E, 'M', u'ẏ'),
+    (0x1E8F, 'V'),
+    (0x1E90, 'M', u'ẑ'),
+    (0x1E91, 'V'),
+    (0x1E92, 'M', u'ẓ'),
+    (0x1E93, 'V'),
+    (0x1E94, 'M', u'ẕ'),
+    (0x1E95, 'V'),
+    (0x1E9A, 'M', u'aʾ'),
+    (0x1E9B, 'M', u'ṡ'),
+    (0x1E9C, 'V'),
+    (0x1E9E, 'M', u'ss'),
+    (0x1E9F, 'V'),
+    (0x1EA0, 'M', u'ạ'),
+    (0x1EA1, 'V'),
+    (0x1EA2, 'M', u'ả'),
+    (0x1EA3, 'V'),
+    (0x1EA4, 'M', u'ấ'),
+    (0x1EA5, 'V'),
+    (0x1EA6, 'M', u'ầ'),
+    (0x1EA7, 'V'),
+    (0x1EA8, 'M', u'ẩ'),
+    (0x1EA9, 'V'),
+    (0x1EAA, 'M', u'ẫ'),
+    (0x1EAB, 'V'),
+    (0x1EAC, 'M', u'ậ'),
+    (0x1EAD, 'V'),
+    (0x1EAE, 'M', u'ắ'),
+    (0x1EAF, 'V'),
+    (0x1EB0, 'M', u'ằ'),
+    (0x1EB1, 'V'),
+    (0x1EB2, 'M', u'ẳ'),
+    (0x1EB3, 'V'),
+    ]
+
+def _seg_18():
+    return [
+    (0x1EB4, 'M', u'ẵ'),
+    (0x1EB5, 'V'),
+    (0x1EB6, 'M', u'ặ'),
+    (0x1EB7, 'V'),
+    (0x1EB8, 'M', u'ẹ'),
+    (0x1EB9, 'V'),
+    (0x1EBA, 'M', u'ẻ'),
+    (0x1EBB, 'V'),
+    (0x1EBC, 'M', u'ẽ'),
+    (0x1EBD, 'V'),
+    (0x1EBE, 'M', u'ế'),
+    (0x1EBF, 'V'),
+    (0x1EC0, 'M', u'ề'),
+    (0x1EC1, 'V'),
+    (0x1EC2, 'M', u'ể'),
+    (0x1EC3, 'V'),
+    (0x1EC4, 'M', u'á»…'),
+    (0x1EC5, 'V'),
+    (0x1EC6, 'M', u'ệ'),
+    (0x1EC7, 'V'),
+    (0x1EC8, 'M', u'ỉ'),
+    (0x1EC9, 'V'),
+    (0x1ECA, 'M', u'ị'),
+    (0x1ECB, 'V'),
+    (0x1ECC, 'M', u'ọ'),
+    (0x1ECD, 'V'),
+    (0x1ECE, 'M', u'ỏ'),
+    (0x1ECF, 'V'),
+    (0x1ED0, 'M', u'ố'),
+    (0x1ED1, 'V'),
+    (0x1ED2, 'M', u'ồ'),
+    (0x1ED3, 'V'),
+    (0x1ED4, 'M', u'ổ'),
+    (0x1ED5, 'V'),
+    (0x1ED6, 'M', u'á»—'),
+    (0x1ED7, 'V'),
+    (0x1ED8, 'M', u'á»™'),
+    (0x1ED9, 'V'),
+    (0x1EDA, 'M', u'á»›'),
+    (0x1EDB, 'V'),
+    (0x1EDC, 'M', u'ờ'),
+    (0x1EDD, 'V'),
+    (0x1EDE, 'M', u'ở'),
+    (0x1EDF, 'V'),
+    (0x1EE0, 'M', u'ỡ'),
+    (0x1EE1, 'V'),
+    (0x1EE2, 'M', u'ợ'),
+    (0x1EE3, 'V'),
+    (0x1EE4, 'M', u'ụ'),
+    (0x1EE5, 'V'),
+    (0x1EE6, 'M', u'á»§'),
+    (0x1EE7, 'V'),
+    (0x1EE8, 'M', u'ứ'),
+    (0x1EE9, 'V'),
+    (0x1EEA, 'M', u'ừ'),
+    (0x1EEB, 'V'),
+    (0x1EEC, 'M', u'á»­'),
+    (0x1EED, 'V'),
+    (0x1EEE, 'M', u'ữ'),
+    (0x1EEF, 'V'),
+    (0x1EF0, 'M', u'á»±'),
+    (0x1EF1, 'V'),
+    (0x1EF2, 'M', u'ỳ'),
+    (0x1EF3, 'V'),
+    (0x1EF4, 'M', u'ỵ'),
+    (0x1EF5, 'V'),
+    (0x1EF6, 'M', u'á»·'),
+    (0x1EF7, 'V'),
+    (0x1EF8, 'M', u'ỹ'),
+    (0x1EF9, 'V'),
+    (0x1EFA, 'M', u'á»»'),
+    (0x1EFB, 'V'),
+    (0x1EFC, 'M', u'ỽ'),
+    (0x1EFD, 'V'),
+    (0x1EFE, 'M', u'ỿ'),
+    (0x1EFF, 'V'),
+    (0x1F08, 'M', u'á¼€'),
+    (0x1F09, 'M', u'ἁ'),
+    (0x1F0A, 'M', u'ἂ'),
+    (0x1F0B, 'M', u'ἃ'),
+    (0x1F0C, 'M', u'ἄ'),
+    (0x1F0D, 'M', u'á¼…'),
+    (0x1F0E, 'M', u'ἆ'),
+    (0x1F0F, 'M', u'ἇ'),
+    (0x1F10, 'V'),
+    (0x1F16, 'X'),
+    (0x1F18, 'M', u'ἐ'),
+    (0x1F19, 'M', u'ἑ'),
+    (0x1F1A, 'M', u'á¼’'),
+    (0x1F1B, 'M', u'ἓ'),
+    (0x1F1C, 'M', u'á¼”'),
+    (0x1F1D, 'M', u'ἕ'),
+    (0x1F1E, 'X'),
+    (0x1F20, 'V'),
+    (0x1F28, 'M', u'á¼ '),
+    (0x1F29, 'M', u'ἡ'),
+    (0x1F2A, 'M', u'á¼¢'),
+    (0x1F2B, 'M', u'á¼£'),
+    (0x1F2C, 'M', u'ἤ'),
+    (0x1F2D, 'M', u'á¼¥'),
+    ]
+
+def _seg_19():
+    return [
+    (0x1F2E, 'M', u'ἦ'),
+    (0x1F2F, 'M', u'á¼§'),
+    (0x1F30, 'V'),
+    (0x1F38, 'M', u'á¼°'),
+    (0x1F39, 'M', u'á¼±'),
+    (0x1F3A, 'M', u'á¼²'),
+    (0x1F3B, 'M', u'á¼³'),
+    (0x1F3C, 'M', u'á¼´'),
+    (0x1F3D, 'M', u'á¼µ'),
+    (0x1F3E, 'M', u'á¼¶'),
+    (0x1F3F, 'M', u'á¼·'),
+    (0x1F40, 'V'),
+    (0x1F46, 'X'),
+    (0x1F48, 'M', u'á½€'),
+    (0x1F49, 'M', u'ὁ'),
+    (0x1F4A, 'M', u'ὂ'),
+    (0x1F4B, 'M', u'ὃ'),
+    (0x1F4C, 'M', u'ὄ'),
+    (0x1F4D, 'M', u'á½…'),
+    (0x1F4E, 'X'),
+    (0x1F50, 'V'),
+    (0x1F58, 'X'),
+    (0x1F59, 'M', u'ὑ'),
+    (0x1F5A, 'X'),
+    (0x1F5B, 'M', u'ὓ'),
+    (0x1F5C, 'X'),
+    (0x1F5D, 'M', u'ὕ'),
+    (0x1F5E, 'X'),
+    (0x1F5F, 'M', u'á½—'),
+    (0x1F60, 'V'),
+    (0x1F68, 'M', u'á½ '),
+    (0x1F69, 'M', u'ὡ'),
+    (0x1F6A, 'M', u'á½¢'),
+    (0x1F6B, 'M', u'á½£'),
+    (0x1F6C, 'M', u'ὤ'),
+    (0x1F6D, 'M', u'á½¥'),
+    (0x1F6E, 'M', u'ὦ'),
+    (0x1F6F, 'M', u'á½§'),
+    (0x1F70, 'V'),
+    (0x1F71, 'M', u'ά'),
+    (0x1F72, 'V'),
+    (0x1F73, 'M', u'έ'),
+    (0x1F74, 'V'),
+    (0x1F75, 'M', u'ή'),
+    (0x1F76, 'V'),
+    (0x1F77, 'M', u'ί'),
+    (0x1F78, 'V'),
+    (0x1F79, 'M', u'ό'),
+    (0x1F7A, 'V'),
+    (0x1F7B, 'M', u'ύ'),
+    (0x1F7C, 'V'),
+    (0x1F7D, 'M', u'ÏŽ'),
+    (0x1F7E, 'X'),
+    (0x1F80, 'M', u'ἀι'),
+    (0x1F81, 'M', u'ἁι'),
+    (0x1F82, 'M', u'ἂι'),
+    (0x1F83, 'M', u'ἃι'),
+    (0x1F84, 'M', u'ἄι'),
+    (0x1F85, 'M', u'ἅι'),
+    (0x1F86, 'M', u'ἆι'),
+    (0x1F87, 'M', u'ἇι'),
+    (0x1F88, 'M', u'ἀι'),
+    (0x1F89, 'M', u'ἁι'),
+    (0x1F8A, 'M', u'ἂι'),
+    (0x1F8B, 'M', u'ἃι'),
+    (0x1F8C, 'M', u'ἄι'),
+    (0x1F8D, 'M', u'ἅι'),
+    (0x1F8E, 'M', u'ἆι'),
+    (0x1F8F, 'M', u'ἇι'),
+    (0x1F90, 'M', u'ἠι'),
+    (0x1F91, 'M', u'ἡι'),
+    (0x1F92, 'M', u'ἢι'),
+    (0x1F93, 'M', u'ἣι'),
+    (0x1F94, 'M', u'ἤι'),
+    (0x1F95, 'M', u'ἥι'),
+    (0x1F96, 'M', u'ἦι'),
+    (0x1F97, 'M', u'ἧι'),
+    (0x1F98, 'M', u'ἠι'),
+    (0x1F99, 'M', u'ἡι'),
+    (0x1F9A, 'M', u'ἢι'),
+    (0x1F9B, 'M', u'ἣι'),
+    (0x1F9C, 'M', u'ἤι'),
+    (0x1F9D, 'M', u'ἥι'),
+    (0x1F9E, 'M', u'ἦι'),
+    (0x1F9F, 'M', u'ἧι'),
+    (0x1FA0, 'M', u'ὠι'),
+    (0x1FA1, 'M', u'ὡι'),
+    (0x1FA2, 'M', u'ὢι'),
+    (0x1FA3, 'M', u'ὣι'),
+    (0x1FA4, 'M', u'ὤι'),
+    (0x1FA5, 'M', u'ὥι'),
+    (0x1FA6, 'M', u'ὦι'),
+    (0x1FA7, 'M', u'ὧι'),
+    (0x1FA8, 'M', u'ὠι'),
+    (0x1FA9, 'M', u'ὡι'),
+    (0x1FAA, 'M', u'ὢι'),
+    (0x1FAB, 'M', u'ὣι'),
+    (0x1FAC, 'M', u'ὤι'),
+    (0x1FAD, 'M', u'ὥι'),
+    (0x1FAE, 'M', u'ὦι'),
+    ]
+
+def _seg_20():
+    return [
+    (0x1FAF, 'M', u'ὧι'),
+    (0x1FB0, 'V'),
+    (0x1FB2, 'M', u'ὰι'),
+    (0x1FB3, 'M', u'αι'),
+    (0x1FB4, 'M', u'άι'),
+    (0x1FB5, 'X'),
+    (0x1FB6, 'V'),
+    (0x1FB7, 'M', u'ᾶι'),
+    (0x1FB8, 'M', u'á¾°'),
+    (0x1FB9, 'M', u'á¾±'),
+    (0x1FBA, 'M', u'á½°'),
+    (0x1FBB, 'M', u'ά'),
+    (0x1FBC, 'M', u'αι'),
+    (0x1FBD, '3', u' Ì“'),
+    (0x1FBE, 'M', u'ι'),
+    (0x1FBF, '3', u' Ì“'),
+    (0x1FC0, '3', u' Í‚'),
+    (0x1FC1, '3', u' ̈͂'),
+    (0x1FC2, 'M', u'ὴι'),
+    (0x1FC3, 'M', u'ηι'),
+    (0x1FC4, 'M', u'ήι'),
+    (0x1FC5, 'X'),
+    (0x1FC6, 'V'),
+    (0x1FC7, 'M', u'ῆι'),
+    (0x1FC8, 'M', u'á½²'),
+    (0x1FC9, 'M', u'έ'),
+    (0x1FCA, 'M', u'á½´'),
+    (0x1FCB, 'M', u'ή'),
+    (0x1FCC, 'M', u'ηι'),
+    (0x1FCD, '3', u' ̓̀'),
+    (0x1FCE, '3', u' ̓́'),
+    (0x1FCF, '3', u' ̓͂'),
+    (0x1FD0, 'V'),
+    (0x1FD3, 'M', u'ΐ'),
+    (0x1FD4, 'X'),
+    (0x1FD6, 'V'),
+    (0x1FD8, 'M', u'ῐ'),
+    (0x1FD9, 'M', u'á¿‘'),
+    (0x1FDA, 'M', u'á½¶'),
+    (0x1FDB, 'M', u'ί'),
+    (0x1FDC, 'X'),
+    (0x1FDD, '3', u' ̔̀'),
+    (0x1FDE, '3', u' ̔́'),
+    (0x1FDF, '3', u' ̔͂'),
+    (0x1FE0, 'V'),
+    (0x1FE3, 'M', u'ΰ'),
+    (0x1FE4, 'V'),
+    (0x1FE8, 'M', u'á¿ '),
+    (0x1FE9, 'M', u'á¿¡'),
+    (0x1FEA, 'M', u'ὺ'),
+    (0x1FEB, 'M', u'ύ'),
+    (0x1FEC, 'M', u'á¿¥'),
+    (0x1FED, '3', u' ̈̀'),
+    (0x1FEE, '3', u' ̈́'),
+    (0x1FEF, '3', u'`'),
+    (0x1FF0, 'X'),
+    (0x1FF2, 'M', u'ὼι'),
+    (0x1FF3, 'M', u'ωι'),
+    (0x1FF4, 'M', u'ώι'),
+    (0x1FF5, 'X'),
+    (0x1FF6, 'V'),
+    (0x1FF7, 'M', u'ῶι'),
+    (0x1FF8, 'M', u'ὸ'),
+    (0x1FF9, 'M', u'ό'),
+    (0x1FFA, 'M', u'á½¼'),
+    (0x1FFB, 'M', u'ÏŽ'),
+    (0x1FFC, 'M', u'ωι'),
+    (0x1FFD, '3', u' ́'),
+    (0x1FFE, '3', u' Ì”'),
+    (0x1FFF, 'X'),
+    (0x2000, '3', u' '),
+    (0x200B, 'I'),
+    (0x200C, 'D', u''),
+    (0x200E, 'X'),
+    (0x2010, 'V'),
+    (0x2011, 'M', u'‐'),
+    (0x2012, 'V'),
+    (0x2017, '3', u' ̳'),
+    (0x2018, 'V'),
+    (0x2024, 'X'),
+    (0x2027, 'V'),
+    (0x2028, 'X'),
+    (0x202F, '3', u' '),
+    (0x2030, 'V'),
+    (0x2033, 'M', u'′′'),
+    (0x2034, 'M', u'′′′'),
+    (0x2035, 'V'),
+    (0x2036, 'M', u'‵‵'),
+    (0x2037, 'M', u'‵‵‵'),
+    (0x2038, 'V'),
+    (0x203C, '3', u'!!'),
+    (0x203D, 'V'),
+    (0x203E, '3', u' Ì…'),
+    (0x203F, 'V'),
+    (0x2047, '3', u'??'),
+    (0x2048, '3', u'?!'),
+    (0x2049, '3', u'!?'),
+    (0x204A, 'V'),
+    (0x2057, 'M', u'′′′′'),
+    (0x2058, 'V'),
+    ]
+
+def _seg_21():
+    return [
+    (0x205F, '3', u' '),
+    (0x2060, 'I'),
+    (0x2061, 'X'),
+    (0x2064, 'I'),
+    (0x2065, 'X'),
+    (0x2070, 'M', u'0'),
+    (0x2071, 'M', u'i'),
+    (0x2072, 'X'),
+    (0x2074, 'M', u'4'),
+    (0x2075, 'M', u'5'),
+    (0x2076, 'M', u'6'),
+    (0x2077, 'M', u'7'),
+    (0x2078, 'M', u'8'),
+    (0x2079, 'M', u'9'),
+    (0x207A, '3', u'+'),
+    (0x207B, 'M', u'−'),
+    (0x207C, '3', u'='),
+    (0x207D, '3', u'('),
+    (0x207E, '3', u')'),
+    (0x207F, 'M', u'n'),
+    (0x2080, 'M', u'0'),
+    (0x2081, 'M', u'1'),
+    (0x2082, 'M', u'2'),
+    (0x2083, 'M', u'3'),
+    (0x2084, 'M', u'4'),
+    (0x2085, 'M', u'5'),
+    (0x2086, 'M', u'6'),
+    (0x2087, 'M', u'7'),
+    (0x2088, 'M', u'8'),
+    (0x2089, 'M', u'9'),
+    (0x208A, '3', u'+'),
+    (0x208B, 'M', u'−'),
+    (0x208C, '3', u'='),
+    (0x208D, '3', u'('),
+    (0x208E, '3', u')'),
+    (0x208F, 'X'),
+    (0x2090, 'M', u'a'),
+    (0x2091, 'M', u'e'),
+    (0x2092, 'M', u'o'),
+    (0x2093, 'M', u'x'),
+    (0x2094, 'M', u'É™'),
+    (0x2095, 'M', u'h'),
+    (0x2096, 'M', u'k'),
+    (0x2097, 'M', u'l'),
+    (0x2098, 'M', u'm'),
+    (0x2099, 'M', u'n'),
+    (0x209A, 'M', u'p'),
+    (0x209B, 'M', u's'),
+    (0x209C, 'M', u't'),
+    (0x209D, 'X'),
+    (0x20A0, 'V'),
+    (0x20A8, 'M', u'rs'),
+    (0x20A9, 'V'),
+    (0x20BB, 'X'),
+    (0x20D0, 'V'),
+    (0x20F1, 'X'),
+    (0x2100, '3', u'a/c'),
+    (0x2101, '3', u'a/s'),
+    (0x2102, 'M', u'c'),
+    (0x2103, 'M', u'°c'),
+    (0x2104, 'V'),
+    (0x2105, '3', u'c/o'),
+    (0x2106, '3', u'c/u'),
+    (0x2107, 'M', u'É›'),
+    (0x2108, 'V'),
+    (0x2109, 'M', u'°f'),
+    (0x210A, 'M', u'g'),
+    (0x210B, 'M', u'h'),
+    (0x210F, 'M', u'ħ'),
+    (0x2110, 'M', u'i'),
+    (0x2112, 'M', u'l'),
+    (0x2114, 'V'),
+    (0x2115, 'M', u'n'),
+    (0x2116, 'M', u'no'),
+    (0x2117, 'V'),
+    (0x2119, 'M', u'p'),
+    (0x211A, 'M', u'q'),
+    (0x211B, 'M', u'r'),
+    (0x211E, 'V'),
+    (0x2120, 'M', u'sm'),
+    (0x2121, 'M', u'tel'),
+    (0x2122, 'M', u'tm'),
+    (0x2123, 'V'),
+    (0x2124, 'M', u'z'),
+    (0x2125, 'V'),
+    (0x2126, 'M', u'ω'),
+    (0x2127, 'V'),
+    (0x2128, 'M', u'z'),
+    (0x2129, 'V'),
+    (0x212A, 'M', u'k'),
+    (0x212B, 'M', u'Ã¥'),
+    (0x212C, 'M', u'b'),
+    (0x212D, 'M', u'c'),
+    (0x212E, 'V'),
+    (0x212F, 'M', u'e'),
+    (0x2131, 'M', u'f'),
+    (0x2132, 'X'),
+    (0x2133, 'M', u'm'),
+    (0x2134, 'M', u'o'),
+    (0x2135, 'M', u'א'),
+    ]
+
+def _seg_22():
+    return [
+    (0x2136, 'M', u'ב'),
+    (0x2137, 'M', u'×’'),
+    (0x2138, 'M', u'ד'),
+    (0x2139, 'M', u'i'),
+    (0x213A, 'V'),
+    (0x213B, 'M', u'fax'),
+    (0x213C, 'M', u'Ï€'),
+    (0x213D, 'M', u'γ'),
+    (0x213F, 'M', u'Ï€'),
+    (0x2140, 'M', u'∑'),
+    (0x2141, 'V'),
+    (0x2145, 'M', u'd'),
+    (0x2147, 'M', u'e'),
+    (0x2148, 'M', u'i'),
+    (0x2149, 'M', u'j'),
+    (0x214A, 'V'),
+    (0x2150, 'M', u'1⁄7'),
+    (0x2151, 'M', u'1⁄9'),
+    (0x2152, 'M', u'1⁄10'),
+    (0x2153, 'M', u'1⁄3'),
+    (0x2154, 'M', u'2⁄3'),
+    (0x2155, 'M', u'1⁄5'),
+    (0x2156, 'M', u'2⁄5'),
+    (0x2157, 'M', u'3⁄5'),
+    (0x2158, 'M', u'4⁄5'),
+    (0x2159, 'M', u'1⁄6'),
+    (0x215A, 'M', u'5⁄6'),
+    (0x215B, 'M', u'1⁄8'),
+    (0x215C, 'M', u'3⁄8'),
+    (0x215D, 'M', u'5⁄8'),
+    (0x215E, 'M', u'7⁄8'),
+    (0x215F, 'M', u'1⁄'),
+    (0x2160, 'M', u'i'),
+    (0x2161, 'M', u'ii'),
+    (0x2162, 'M', u'iii'),
+    (0x2163, 'M', u'iv'),
+    (0x2164, 'M', u'v'),
+    (0x2165, 'M', u'vi'),
+    (0x2166, 'M', u'vii'),
+    (0x2167, 'M', u'viii'),
+    (0x2168, 'M', u'ix'),
+    (0x2169, 'M', u'x'),
+    (0x216A, 'M', u'xi'),
+    (0x216B, 'M', u'xii'),
+    (0x216C, 'M', u'l'),
+    (0x216D, 'M', u'c'),
+    (0x216E, 'M', u'd'),
+    (0x216F, 'M', u'm'),
+    (0x2170, 'M', u'i'),
+    (0x2171, 'M', u'ii'),
+    (0x2172, 'M', u'iii'),
+    (0x2173, 'M', u'iv'),
+    (0x2174, 'M', u'v'),
+    (0x2175, 'M', u'vi'),
+    (0x2176, 'M', u'vii'),
+    (0x2177, 'M', u'viii'),
+    (0x2178, 'M', u'ix'),
+    (0x2179, 'M', u'x'),
+    (0x217A, 'M', u'xi'),
+    (0x217B, 'M', u'xii'),
+    (0x217C, 'M', u'l'),
+    (0x217D, 'M', u'c'),
+    (0x217E, 'M', u'd'),
+    (0x217F, 'M', u'm'),
+    (0x2180, 'V'),
+    (0x2183, 'X'),
+    (0x2184, 'V'),
+    (0x2189, 'M', u'0⁄3'),
+    (0x218A, 'X'),
+    (0x2190, 'V'),
+    (0x222C, 'M', u'∫∫'),
+    (0x222D, 'M', u'∫∫∫'),
+    (0x222E, 'V'),
+    (0x222F, 'M', u'∮∮'),
+    (0x2230, 'M', u'∮∮∮'),
+    (0x2231, 'V'),
+    (0x2260, '3'),
+    (0x2261, 'V'),
+    (0x226E, '3'),
+    (0x2270, 'V'),
+    (0x2329, 'M', u'〈'),
+    (0x232A, 'M', u'〉'),
+    (0x232B, 'V'),
+    (0x23F4, 'X'),
+    (0x2400, 'V'),
+    (0x2427, 'X'),
+    (0x2440, 'V'),
+    (0x244B, 'X'),
+    (0x2460, 'M', u'1'),
+    (0x2461, 'M', u'2'),
+    (0x2462, 'M', u'3'),
+    (0x2463, 'M', u'4'),
+    (0x2464, 'M', u'5'),
+    (0x2465, 'M', u'6'),
+    (0x2466, 'M', u'7'),
+    (0x2467, 'M', u'8'),
+    (0x2468, 'M', u'9'),
+    (0x2469, 'M', u'10'),
+    (0x246A, 'M', u'11'),
+    (0x246B, 'M', u'12'),
+    ]
+
+def _seg_23():
+    return [
+    (0x246C, 'M', u'13'),
+    (0x246D, 'M', u'14'),
+    (0x246E, 'M', u'15'),
+    (0x246F, 'M', u'16'),
+    (0x2470, 'M', u'17'),
+    (0x2471, 'M', u'18'),
+    (0x2472, 'M', u'19'),
+    (0x2473, 'M', u'20'),
+    (0x2474, '3', u'(1)'),
+    (0x2475, '3', u'(2)'),
+    (0x2476, '3', u'(3)'),
+    (0x2477, '3', u'(4)'),
+    (0x2478, '3', u'(5)'),
+    (0x2479, '3', u'(6)'),
+    (0x247A, '3', u'(7)'),
+    (0x247B, '3', u'(8)'),
+    (0x247C, '3', u'(9)'),
+    (0x247D, '3', u'(10)'),
+    (0x247E, '3', u'(11)'),
+    (0x247F, '3', u'(12)'),
+    (0x2480, '3', u'(13)'),
+    (0x2481, '3', u'(14)'),
+    (0x2482, '3', u'(15)'),
+    (0x2483, '3', u'(16)'),
+    (0x2484, '3', u'(17)'),
+    (0x2485, '3', u'(18)'),
+    (0x2486, '3', u'(19)'),
+    (0x2487, '3', u'(20)'),
+    (0x2488, 'X'),
+    (0x249C, '3', u'(a)'),
+    (0x249D, '3', u'(b)'),
+    (0x249E, '3', u'(c)'),
+    (0x249F, '3', u'(d)'),
+    (0x24A0, '3', u'(e)'),
+    (0x24A1, '3', u'(f)'),
+    (0x24A2, '3', u'(g)'),
+    (0x24A3, '3', u'(h)'),
+    (0x24A4, '3', u'(i)'),
+    (0x24A5, '3', u'(j)'),
+    (0x24A6, '3', u'(k)'),
+    (0x24A7, '3', u'(l)'),
+    (0x24A8, '3', u'(m)'),
+    (0x24A9, '3', u'(n)'),
+    (0x24AA, '3', u'(o)'),
+    (0x24AB, '3', u'(p)'),
+    (0x24AC, '3', u'(q)'),
+    (0x24AD, '3', u'(r)'),
+    (0x24AE, '3', u'(s)'),
+    (0x24AF, '3', u'(t)'),
+    (0x24B0, '3', u'(u)'),
+    (0x24B1, '3', u'(v)'),
+    (0x24B2, '3', u'(w)'),
+    (0x24B3, '3', u'(x)'),
+    (0x24B4, '3', u'(y)'),
+    (0x24B5, '3', u'(z)'),
+    (0x24B6, 'M', u'a'),
+    (0x24B7, 'M', u'b'),
+    (0x24B8, 'M', u'c'),
+    (0x24B9, 'M', u'd'),
+    (0x24BA, 'M', u'e'),
+    (0x24BB, 'M', u'f'),
+    (0x24BC, 'M', u'g'),
+    (0x24BD, 'M', u'h'),
+    (0x24BE, 'M', u'i'),
+    (0x24BF, 'M', u'j'),
+    (0x24C0, 'M', u'k'),
+    (0x24C1, 'M', u'l'),
+    (0x24C2, 'M', u'm'),
+    (0x24C3, 'M', u'n'),
+    (0x24C4, 'M', u'o'),
+    (0x24C5, 'M', u'p'),
+    (0x24C6, 'M', u'q'),
+    (0x24C7, 'M', u'r'),
+    (0x24C8, 'M', u's'),
+    (0x24C9, 'M', u't'),
+    (0x24CA, 'M', u'u'),
+    (0x24CB, 'M', u'v'),
+    (0x24CC, 'M', u'w'),
+    (0x24CD, 'M', u'x'),
+    (0x24CE, 'M', u'y'),
+    (0x24CF, 'M', u'z'),
+    (0x24D0, 'M', u'a'),
+    (0x24D1, 'M', u'b'),
+    (0x24D2, 'M', u'c'),
+    (0x24D3, 'M', u'd'),
+    (0x24D4, 'M', u'e'),
+    (0x24D5, 'M', u'f'),
+    (0x24D6, 'M', u'g'),
+    (0x24D7, 'M', u'h'),
+    (0x24D8, 'M', u'i'),
+    (0x24D9, 'M', u'j'),
+    (0x24DA, 'M', u'k'),
+    (0x24DB, 'M', u'l'),
+    (0x24DC, 'M', u'm'),
+    (0x24DD, 'M', u'n'),
+    (0x24DE, 'M', u'o'),
+    (0x24DF, 'M', u'p'),
+    (0x24E0, 'M', u'q'),
+    (0x24E1, 'M', u'r'),
+    (0x24E2, 'M', u's'),
+    ]
+
+def _seg_24():
+    return [
+    (0x24E3, 'M', u't'),
+    (0x24E4, 'M', u'u'),
+    (0x24E5, 'M', u'v'),
+    (0x24E6, 'M', u'w'),
+    (0x24E7, 'M', u'x'),
+    (0x24E8, 'M', u'y'),
+    (0x24E9, 'M', u'z'),
+    (0x24EA, 'M', u'0'),
+    (0x24EB, 'V'),
+    (0x2700, 'X'),
+    (0x2701, 'V'),
+    (0x2A0C, 'M', u'∫∫∫∫'),
+    (0x2A0D, 'V'),
+    (0x2A74, '3', u'::='),
+    (0x2A75, '3', u'=='),
+    (0x2A76, '3', u'==='),
+    (0x2A77, 'V'),
+    (0x2ADC, 'M', u'⫝̸'),
+    (0x2ADD, 'V'),
+    (0x2B4D, 'X'),
+    (0x2B50, 'V'),
+    (0x2B5A, 'X'),
+    (0x2C00, 'M', u'â°°'),
+    (0x2C01, 'M', u'â°±'),
+    (0x2C02, 'M', u'â°²'),
+    (0x2C03, 'M', u'â°³'),
+    (0x2C04, 'M', u'â°´'),
+    (0x2C05, 'M', u'â°µ'),
+    (0x2C06, 'M', u'â°¶'),
+    (0x2C07, 'M', u'â°·'),
+    (0x2C08, 'M', u'â°¸'),
+    (0x2C09, 'M', u'â°¹'),
+    (0x2C0A, 'M', u'â°º'),
+    (0x2C0B, 'M', u'â°»'),
+    (0x2C0C, 'M', u'â°¼'),
+    (0x2C0D, 'M', u'â°½'),
+    (0x2C0E, 'M', u'â°¾'),
+    (0x2C0F, 'M', u'â°¿'),
+    (0x2C10, 'M', u'â±€'),
+    (0x2C11, 'M', u'ⱁ'),
+    (0x2C12, 'M', u'ⱂ'),
+    (0x2C13, 'M', u'ⱃ'),
+    (0x2C14, 'M', u'ⱄ'),
+    (0x2C15, 'M', u'â±…'),
+    (0x2C16, 'M', u'ⱆ'),
+    (0x2C17, 'M', u'ⱇ'),
+    (0x2C18, 'M', u'ⱈ'),
+    (0x2C19, 'M', u'ⱉ'),
+    (0x2C1A, 'M', u'ⱊ'),
+    (0x2C1B, 'M', u'ⱋ'),
+    (0x2C1C, 'M', u'ⱌ'),
+    (0x2C1D, 'M', u'ⱍ'),
+    (0x2C1E, 'M', u'ⱎ'),
+    (0x2C1F, 'M', u'ⱏ'),
+    (0x2C20, 'M', u'ⱐ'),
+    (0x2C21, 'M', u'ⱑ'),
+    (0x2C22, 'M', u'â±’'),
+    (0x2C23, 'M', u'ⱓ'),
+    (0x2C24, 'M', u'â±”'),
+    (0x2C25, 'M', u'ⱕ'),
+    (0x2C26, 'M', u'â±–'),
+    (0x2C27, 'M', u'â±—'),
+    (0x2C28, 'M', u'ⱘ'),
+    (0x2C29, 'M', u'â±™'),
+    (0x2C2A, 'M', u'ⱚ'),
+    (0x2C2B, 'M', u'â±›'),
+    (0x2C2C, 'M', u'ⱜ'),
+    (0x2C2D, 'M', u'ⱝ'),
+    (0x2C2E, 'M', u'ⱞ'),
+    (0x2C2F, 'X'),
+    (0x2C30, 'V'),
+    (0x2C5F, 'X'),
+    (0x2C60, 'M', u'ⱡ'),
+    (0x2C61, 'V'),
+    (0x2C62, 'M', u'É«'),
+    (0x2C63, 'M', u'áµ½'),
+    (0x2C64, 'M', u'ɽ'),
+    (0x2C65, 'V'),
+    (0x2C67, 'M', u'ⱨ'),
+    (0x2C68, 'V'),
+    (0x2C69, 'M', u'ⱪ'),
+    (0x2C6A, 'V'),
+    (0x2C6B, 'M', u'ⱬ'),
+    (0x2C6C, 'V'),
+    (0x2C6D, 'M', u'É‘'),
+    (0x2C6E, 'M', u'ɱ'),
+    (0x2C6F, 'M', u'ɐ'),
+    (0x2C70, 'M', u'É’'),
+    (0x2C71, 'V'),
+    (0x2C72, 'M', u'â±³'),
+    (0x2C73, 'V'),
+    (0x2C75, 'M', u'â±¶'),
+    (0x2C76, 'V'),
+    (0x2C7C, 'M', u'j'),
+    (0x2C7D, 'M', u'v'),
+    (0x2C7E, 'M', u'È¿'),
+    (0x2C7F, 'M', u'É€'),
+    (0x2C80, 'M', u'ⲁ'),
+    (0x2C81, 'V'),
+    (0x2C82, 'M', u'ⲃ'),
+    ]
+
+def _seg_25():
+    return [
+    (0x2C83, 'V'),
+    (0x2C84, 'M', u'â²…'),
+    (0x2C85, 'V'),
+    (0x2C86, 'M', u'ⲇ'),
+    (0x2C87, 'V'),
+    (0x2C88, 'M', u'ⲉ'),
+    (0x2C89, 'V'),
+    (0x2C8A, 'M', u'ⲋ'),
+    (0x2C8B, 'V'),
+    (0x2C8C, 'M', u'ⲍ'),
+    (0x2C8D, 'V'),
+    (0x2C8E, 'M', u'ⲏ'),
+    (0x2C8F, 'V'),
+    (0x2C90, 'M', u'ⲑ'),
+    (0x2C91, 'V'),
+    (0x2C92, 'M', u'ⲓ'),
+    (0x2C93, 'V'),
+    (0x2C94, 'M', u'ⲕ'),
+    (0x2C95, 'V'),
+    (0x2C96, 'M', u'â²—'),
+    (0x2C97, 'V'),
+    (0x2C98, 'M', u'â²™'),
+    (0x2C99, 'V'),
+    (0x2C9A, 'M', u'â²›'),
+    (0x2C9B, 'V'),
+    (0x2C9C, 'M', u'ⲝ'),
+    (0x2C9D, 'V'),
+    (0x2C9E, 'M', u'ⲟ'),
+    (0x2C9F, 'V'),
+    (0x2CA0, 'M', u'ⲡ'),
+    (0x2CA1, 'V'),
+    (0x2CA2, 'M', u'â²£'),
+    (0x2CA3, 'V'),
+    (0x2CA4, 'M', u'â²¥'),
+    (0x2CA5, 'V'),
+    (0x2CA6, 'M', u'â²§'),
+    (0x2CA7, 'V'),
+    (0x2CA8, 'M', u'ⲩ'),
+    (0x2CA9, 'V'),
+    (0x2CAA, 'M', u'ⲫ'),
+    (0x2CAB, 'V'),
+    (0x2CAC, 'M', u'â²­'),
+    (0x2CAD, 'V'),
+    (0x2CAE, 'M', u'ⲯ'),
+    (0x2CAF, 'V'),
+    (0x2CB0, 'M', u'â²±'),
+    (0x2CB1, 'V'),
+    (0x2CB2, 'M', u'â²³'),
+    (0x2CB3, 'V'),
+    (0x2CB4, 'M', u'â²µ'),
+    (0x2CB5, 'V'),
+    (0x2CB6, 'M', u'â²·'),
+    (0x2CB7, 'V'),
+    (0x2CB8, 'M', u'â²¹'),
+    (0x2CB9, 'V'),
+    (0x2CBA, 'M', u'â²»'),
+    (0x2CBB, 'V'),
+    (0x2CBC, 'M', u'â²½'),
+    (0x2CBD, 'V'),
+    (0x2CBE, 'M', u'ⲿ'),
+    (0x2CBF, 'V'),
+    (0x2CC0, 'M', u'ⳁ'),
+    (0x2CC1, 'V'),
+    (0x2CC2, 'M', u'ⳃ'),
+    (0x2CC3, 'V'),
+    (0x2CC4, 'M', u'â³…'),
+    (0x2CC5, 'V'),
+    (0x2CC6, 'M', u'ⳇ'),
+    (0x2CC7, 'V'),
+    (0x2CC8, 'M', u'ⳉ'),
+    (0x2CC9, 'V'),
+    (0x2CCA, 'M', u'ⳋ'),
+    (0x2CCB, 'V'),
+    (0x2CCC, 'M', u'ⳍ'),
+    (0x2CCD, 'V'),
+    (0x2CCE, 'M', u'ⳏ'),
+    (0x2CCF, 'V'),
+    (0x2CD0, 'M', u'ⳑ'),
+    (0x2CD1, 'V'),
+    (0x2CD2, 'M', u'ⳓ'),
+    (0x2CD3, 'V'),
+    (0x2CD4, 'M', u'ⳕ'),
+    (0x2CD5, 'V'),
+    (0x2CD6, 'M', u'â³—'),
+    (0x2CD7, 'V'),
+    (0x2CD8, 'M', u'â³™'),
+    (0x2CD9, 'V'),
+    (0x2CDA, 'M', u'â³›'),
+    (0x2CDB, 'V'),
+    (0x2CDC, 'M', u'ⳝ'),
+    (0x2CDD, 'V'),
+    (0x2CDE, 'M', u'ⳟ'),
+    (0x2CDF, 'V'),
+    (0x2CE0, 'M', u'ⳡ'),
+    (0x2CE1, 'V'),
+    (0x2CE2, 'M', u'â³£'),
+    (0x2CE3, 'V'),
+    (0x2CEB, 'M', u'ⳬ'),
+    (0x2CEC, 'V'),
+    (0x2CED, 'M', u'â³®'),
+    ]
+
+def _seg_26():
+    return [
+    (0x2CEE, 'V'),
+    (0x2CF2, 'M', u'â³³'),
+    (0x2CF3, 'V'),
+    (0x2CF4, 'X'),
+    (0x2CF9, 'V'),
+    (0x2D26, 'X'),
+    (0x2D27, 'V'),
+    (0x2D28, 'X'),
+    (0x2D2D, 'V'),
+    (0x2D2E, 'X'),
+    (0x2D30, 'V'),
+    (0x2D68, 'X'),
+    (0x2D6F, 'M', u'ⵡ'),
+    (0x2D70, 'V'),
+    (0x2D71, 'X'),
+    (0x2D7F, 'V'),
+    (0x2D97, 'X'),
+    (0x2DA0, 'V'),
+    (0x2DA7, 'X'),
+    (0x2DA8, 'V'),
+    (0x2DAF, 'X'),
+    (0x2DB0, 'V'),
+    (0x2DB7, 'X'),
+    (0x2DB8, 'V'),
+    (0x2DBF, 'X'),
+    (0x2DC0, 'V'),
+    (0x2DC7, 'X'),
+    (0x2DC8, 'V'),
+    (0x2DCF, 'X'),
+    (0x2DD0, 'V'),
+    (0x2DD7, 'X'),
+    (0x2DD8, 'V'),
+    (0x2DDF, 'X'),
+    (0x2DE0, 'V'),
+    (0x2E3C, 'X'),
+    (0x2E80, 'V'),
+    (0x2E9A, 'X'),
+    (0x2E9B, 'V'),
+    (0x2E9F, 'M', u'母'),
+    (0x2EA0, 'V'),
+    (0x2EF3, 'M', u'龟'),
+    (0x2EF4, 'X'),
+    (0x2F00, 'M', u'一'),
+    (0x2F01, 'M', u'丨'),
+    (0x2F02, 'M', u'丶'),
+    (0x2F03, 'M', u'丿'),
+    (0x2F04, 'M', u'ä¹™'),
+    (0x2F05, 'M', u'亅'),
+    (0x2F06, 'M', u'二'),
+    (0x2F07, 'M', u'亠'),
+    (0x2F08, 'M', u'人'),
+    (0x2F09, 'M', u'å„¿'),
+    (0x2F0A, 'M', u'å…¥'),
+    (0x2F0B, 'M', u'å…«'),
+    (0x2F0C, 'M', u'冂'),
+    (0x2F0D, 'M', u'冖'),
+    (0x2F0E, 'M', u'冫'),
+    (0x2F0F, 'M', u'几'),
+    (0x2F10, 'M', u'凵'),
+    (0x2F11, 'M', u'刀'),
+    (0x2F12, 'M', u'力'),
+    (0x2F13, 'M', u'勹'),
+    (0x2F14, 'M', u'匕'),
+    (0x2F15, 'M', u'匚'),
+    (0x2F16, 'M', u'匸'),
+    (0x2F17, 'M', u'十'),
+    (0x2F18, 'M', u'卜'),
+    (0x2F19, 'M', u'卩'),
+    (0x2F1A, 'M', u'厂'),
+    (0x2F1B, 'M', u'厶'),
+    (0x2F1C, 'M', u'又'),
+    (0x2F1D, 'M', u'口'),
+    (0x2F1E, 'M', u'å›—'),
+    (0x2F1F, 'M', u'土'),
+    (0x2F20, 'M', u'士'),
+    (0x2F21, 'M', u'夂'),
+    (0x2F22, 'M', u'夊'),
+    (0x2F23, 'M', u'夕'),
+    (0x2F24, 'M', u'大'),
+    (0x2F25, 'M', u'女'),
+    (0x2F26, 'M', u'子'),
+    (0x2F27, 'M', u'宀'),
+    (0x2F28, 'M', u'寸'),
+    (0x2F29, 'M', u'小'),
+    (0x2F2A, 'M', u'å°¢'),
+    (0x2F2B, 'M', u'å°¸'),
+    (0x2F2C, 'M', u'å±®'),
+    (0x2F2D, 'M', u'å±±'),
+    (0x2F2E, 'M', u'å·›'),
+    (0x2F2F, 'M', u'å·¥'),
+    (0x2F30, 'M', u'å·±'),
+    (0x2F31, 'M', u'å·¾'),
+    (0x2F32, 'M', u'å¹²'),
+    (0x2F33, 'M', u'幺'),
+    (0x2F34, 'M', u'广'),
+    (0x2F35, 'M', u'å»´'),
+    (0x2F36, 'M', u'廾'),
+    (0x2F37, 'M', u'弋'),
+    (0x2F38, 'M', u'弓'),
+    (0x2F39, 'M', u'彐'),
+    ]
+
+def _seg_27():
+    return [
+    (0x2F3A, 'M', u'彡'),
+    (0x2F3B, 'M', u'å½³'),
+    (0x2F3C, 'M', u'心'),
+    (0x2F3D, 'M', u'戈'),
+    (0x2F3E, 'M', u'戶'),
+    (0x2F3F, 'M', u'手'),
+    (0x2F40, 'M', u'支'),
+    (0x2F41, 'M', u'æ”´'),
+    (0x2F42, 'M', u'æ–‡'),
+    (0x2F43, 'M', u'æ–—'),
+    (0x2F44, 'M', u'æ–¤'),
+    (0x2F45, 'M', u'æ–¹'),
+    (0x2F46, 'M', u'æ— '),
+    (0x2F47, 'M', u'æ—¥'),
+    (0x2F48, 'M', u'æ›°'),
+    (0x2F49, 'M', u'月'),
+    (0x2F4A, 'M', u'木'),
+    (0x2F4B, 'M', u'欠'),
+    (0x2F4C, 'M', u'æ­¢'),
+    (0x2F4D, 'M', u'æ­¹'),
+    (0x2F4E, 'M', u'殳'),
+    (0x2F4F, 'M', u'毋'),
+    (0x2F50, 'M', u'比'),
+    (0x2F51, 'M', u'毛'),
+    (0x2F52, 'M', u'氏'),
+    (0x2F53, 'M', u'æ°”'),
+    (0x2F54, 'M', u'æ°´'),
+    (0x2F55, 'M', u'火'),
+    (0x2F56, 'M', u'爪'),
+    (0x2F57, 'M', u'父'),
+    (0x2F58, 'M', u'爻'),
+    (0x2F59, 'M', u'爿'),
+    (0x2F5A, 'M', u'片'),
+    (0x2F5B, 'M', u'牙'),
+    (0x2F5C, 'M', u'牛'),
+    (0x2F5D, 'M', u'犬'),
+    (0x2F5E, 'M', u'玄'),
+    (0x2F5F, 'M', u'玉'),
+    (0x2F60, 'M', u'瓜'),
+    (0x2F61, 'M', u'瓦'),
+    (0x2F62, 'M', u'甘'),
+    (0x2F63, 'M', u'生'),
+    (0x2F64, 'M', u'用'),
+    (0x2F65, 'M', u'ç”°'),
+    (0x2F66, 'M', u'ç–‹'),
+    (0x2F67, 'M', u'ç–’'),
+    (0x2F68, 'M', u'ç™¶'),
+    (0x2F69, 'M', u'白'),
+    (0x2F6A, 'M', u'çš®'),
+    (0x2F6B, 'M', u'çš¿'),
+    (0x2F6C, 'M', u'ç›®'),
+    (0x2F6D, 'M', u'矛'),
+    (0x2F6E, 'M', u'矢'),
+    (0x2F6F, 'M', u'石'),
+    (0x2F70, 'M', u'示'),
+    (0x2F71, 'M', u'禸'),
+    (0x2F72, 'M', u'禾'),
+    (0x2F73, 'M', u'ç©´'),
+    (0x2F74, 'M', u'ç«‹'),
+    (0x2F75, 'M', u'竹'),
+    (0x2F76, 'M', u'ç±³'),
+    (0x2F77, 'M', u'糸'),
+    (0x2F78, 'M', u'ç¼¶'),
+    (0x2F79, 'M', u'网'),
+    (0x2F7A, 'M', u'羊'),
+    (0x2F7B, 'M', u'ç¾½'),
+    (0x2F7C, 'M', u'老'),
+    (0x2F7D, 'M', u'而'),
+    (0x2F7E, 'M', u'耒'),
+    (0x2F7F, 'M', u'耳'),
+    (0x2F80, 'M', u'聿'),
+    (0x2F81, 'M', u'肉'),
+    (0x2F82, 'M', u'臣'),
+    (0x2F83, 'M', u'自'),
+    (0x2F84, 'M', u'至'),
+    (0x2F85, 'M', u'臼'),
+    (0x2F86, 'M', u'舌'),
+    (0x2F87, 'M', u'舛'),
+    (0x2F88, 'M', u'舟'),
+    (0x2F89, 'M', u'艮'),
+    (0x2F8A, 'M', u'色'),
+    (0x2F8B, 'M', u'艸'),
+    (0x2F8C, 'M', u'虍'),
+    (0x2F8D, 'M', u'虫'),
+    (0x2F8E, 'M', u'è¡€'),
+    (0x2F8F, 'M', u'行'),
+    (0x2F90, 'M', u'è¡£'),
+    (0x2F91, 'M', u'襾'),
+    (0x2F92, 'M', u'見'),
+    (0x2F93, 'M', u'è§’'),
+    (0x2F94, 'M', u'言'),
+    (0x2F95, 'M', u'è°·'),
+    (0x2F96, 'M', u'豆'),
+    (0x2F97, 'M', u'豕'),
+    (0x2F98, 'M', u'豸'),
+    (0x2F99, 'M', u'貝'),
+    (0x2F9A, 'M', u'赤'),
+    (0x2F9B, 'M', u'èµ°'),
+    (0x2F9C, 'M', u'è¶³'),
+    (0x2F9D, 'M', u'身'),
+    ]
+
+def _seg_28():
+    return [
+    (0x2F9E, 'M', u'車'),
+    (0x2F9F, 'M', u'è¾›'),
+    (0x2FA0, 'M', u'è¾°'),
+    (0x2FA1, 'M', u'è¾µ'),
+    (0x2FA2, 'M', u'é‚‘'),
+    (0x2FA3, 'M', u'é…‰'),
+    (0x2FA4, 'M', u'釆'),
+    (0x2FA5, 'M', u'里'),
+    (0x2FA6, 'M', u'金'),
+    (0x2FA7, 'M', u'é•·'),
+    (0x2FA8, 'M', u'é–€'),
+    (0x2FA9, 'M', u'阜'),
+    (0x2FAA, 'M', u'éš¶'),
+    (0x2FAB, 'M', u'éš¹'),
+    (0x2FAC, 'M', u'雨'),
+    (0x2FAD, 'M', u'靑'),
+    (0x2FAE, 'M', u'非'),
+    (0x2FAF, 'M', u'面'),
+    (0x2FB0, 'M', u'革'),
+    (0x2FB1, 'M', u'韋'),
+    (0x2FB2, 'M', u'韭'),
+    (0x2FB3, 'M', u'音'),
+    (0x2FB4, 'M', u'頁'),
+    (0x2FB5, 'M', u'風'),
+    (0x2FB6, 'M', u'飛'),
+    (0x2FB7, 'M', u'食'),
+    (0x2FB8, 'M', u'首'),
+    (0x2FB9, 'M', u'香'),
+    (0x2FBA, 'M', u'馬'),
+    (0x2FBB, 'M', u'骨'),
+    (0x2FBC, 'M', u'高'),
+    (0x2FBD, 'M', u'髟'),
+    (0x2FBE, 'M', u'鬥'),
+    (0x2FBF, 'M', u'鬯'),
+    (0x2FC0, 'M', u'鬲'),
+    (0x2FC1, 'M', u'鬼'),
+    (0x2FC2, 'M', u'é­š'),
+    (0x2FC3, 'M', u'é³¥'),
+    (0x2FC4, 'M', u'é¹µ'),
+    (0x2FC5, 'M', u'鹿'),
+    (0x2FC6, 'M', u'麥'),
+    (0x2FC7, 'M', u'麻'),
+    (0x2FC8, 'M', u'黃'),
+    (0x2FC9, 'M', u'黍'),
+    (0x2FCA, 'M', u'黑'),
+    (0x2FCB, 'M', u'黹'),
+    (0x2FCC, 'M', u'黽'),
+    (0x2FCD, 'M', u'鼎'),
+    (0x2FCE, 'M', u'鼓'),
+    (0x2FCF, 'M', u'é¼ '),
+    (0x2FD0, 'M', u'é¼»'),
+    (0x2FD1, 'M', u'齊'),
+    (0x2FD2, 'M', u'é½’'),
+    (0x2FD3, 'M', u'龍'),
+    (0x2FD4, 'M', u'龜'),
+    (0x2FD5, 'M', u'é¾ '),
+    (0x2FD6, 'X'),
+    (0x3000, '3', u' '),
+    (0x3001, 'V'),
+    (0x3002, 'M', u'.'),
+    (0x3003, 'V'),
+    (0x3036, 'M', u'〒'),
+    (0x3037, 'V'),
+    (0x3038, 'M', u'十'),
+    (0x3039, 'M', u'卄'),
+    (0x303A, 'M', u'卅'),
+    (0x303B, 'V'),
+    (0x3040, 'X'),
+    (0x3041, 'V'),
+    (0x3097, 'X'),
+    (0x3099, 'V'),
+    (0x309B, '3', u' ã‚™'),
+    (0x309C, '3', u' ゚'),
+    (0x309D, 'V'),
+    (0x309F, 'M', u'より'),
+    (0x30A0, 'V'),
+    (0x30FF, 'M', u'コト'),
+    (0x3100, 'X'),
+    (0x3105, 'V'),
+    (0x312E, 'X'),
+    (0x3131, 'M', u'á„€'),
+    (0x3132, 'M', u'ᄁ'),
+    (0x3133, 'M', u'ᆪ'),
+    (0x3134, 'M', u'á„‚'),
+    (0x3135, 'M', u'ᆬ'),
+    (0x3136, 'M', u'ᆭ'),
+    (0x3137, 'M', u'ᄃ'),
+    (0x3138, 'M', u'á„„'),
+    (0x3139, 'M', u'á„…'),
+    (0x313A, 'M', u'ᆰ'),
+    (0x313B, 'M', u'ᆱ'),
+    (0x313C, 'M', u'ᆲ'),
+    (0x313D, 'M', u'ᆳ'),
+    (0x313E, 'M', u'ᆴ'),
+    (0x313F, 'M', u'ᆵ'),
+    (0x3140, 'M', u'ᄚ'),
+    (0x3141, 'M', u'ᄆ'),
+    (0x3142, 'M', u'ᄇ'),
+    (0x3143, 'M', u'ᄈ'),
+    (0x3144, 'M', u'á„¡'),
+    ]
+
+def _seg_29():
+    return [
+    (0x3145, 'M', u'ᄉ'),
+    (0x3146, 'M', u'ᄊ'),
+    (0x3147, 'M', u'á„‹'),
+    (0x3148, 'M', u'ᄌ'),
+    (0x3149, 'M', u'ᄍ'),
+    (0x314A, 'M', u'ᄎ'),
+    (0x314B, 'M', u'ᄏ'),
+    (0x314C, 'M', u'ᄐ'),
+    (0x314D, 'M', u'á„‘'),
+    (0x314E, 'M', u'á„’'),
+    (0x314F, 'M', u'á…¡'),
+    (0x3150, 'M', u'á…¢'),
+    (0x3151, 'M', u'á…£'),
+    (0x3152, 'M', u'á…¤'),
+    (0x3153, 'M', u'á…¥'),
+    (0x3154, 'M', u'á…¦'),
+    (0x3155, 'M', u'á…§'),
+    (0x3156, 'M', u'á…¨'),
+    (0x3157, 'M', u'á…©'),
+    (0x3158, 'M', u'á…ª'),
+    (0x3159, 'M', u'á…«'),
+    (0x315A, 'M', u'á…¬'),
+    (0x315B, 'M', u'á…­'),
+    (0x315C, 'M', u'á…®'),
+    (0x315D, 'M', u'á…¯'),
+    (0x315E, 'M', u'á…°'),
+    (0x315F, 'M', u'á…±'),
+    (0x3160, 'M', u'á…²'),
+    (0x3161, 'M', u'á…³'),
+    (0x3162, 'M', u'á…´'),
+    (0x3163, 'M', u'á…µ'),
+    (0x3164, 'X'),
+    (0x3165, 'M', u'á„”'),
+    (0x3166, 'M', u'á„•'),
+    (0x3167, 'M', u'ᇇ'),
+    (0x3168, 'M', u'ᇈ'),
+    (0x3169, 'M', u'ᇌ'),
+    (0x316A, 'M', u'ᇎ'),
+    (0x316B, 'M', u'ᇓ'),
+    (0x316C, 'M', u'ᇗ'),
+    (0x316D, 'M', u'ᇙ'),
+    (0x316E, 'M', u'ᄜ'),
+    (0x316F, 'M', u'ᇝ'),
+    (0x3170, 'M', u'ᇟ'),
+    (0x3171, 'M', u'ᄝ'),
+    (0x3172, 'M', u'ᄞ'),
+    (0x3173, 'M', u'á„ '),
+    (0x3174, 'M', u'á„¢'),
+    (0x3175, 'M', u'á„£'),
+    (0x3176, 'M', u'á„§'),
+    (0x3177, 'M', u'á„©'),
+    (0x3178, 'M', u'á„«'),
+    (0x3179, 'M', u'ᄬ'),
+    (0x317A, 'M', u'á„­'),
+    (0x317B, 'M', u'á„®'),
+    (0x317C, 'M', u'ᄯ'),
+    (0x317D, 'M', u'ᄲ'),
+    (0x317E, 'M', u'á„¶'),
+    (0x317F, 'M', u'á…€'),
+    (0x3180, 'M', u'á…‡'),
+    (0x3181, 'M', u'ᅌ'),
+    (0x3182, 'M', u'ᇱ'),
+    (0x3183, 'M', u'ᇲ'),
+    (0x3184, 'M', u'á…—'),
+    (0x3185, 'M', u'á…˜'),
+    (0x3186, 'M', u'á…™'),
+    (0x3187, 'M', u'ᆄ'),
+    (0x3188, 'M', u'ᆅ'),
+    (0x3189, 'M', u'ᆈ'),
+    (0x318A, 'M', u'ᆑ'),
+    (0x318B, 'M', u'ᆒ'),
+    (0x318C, 'M', u'ᆔ'),
+    (0x318D, 'M', u'ᆞ'),
+    (0x318E, 'M', u'ᆡ'),
+    (0x318F, 'X'),
+    (0x3190, 'V'),
+    (0x3192, 'M', u'一'),
+    (0x3193, 'M', u'二'),
+    (0x3194, 'M', u'三'),
+    (0x3195, 'M', u'å››'),
+    (0x3196, 'M', u'上'),
+    (0x3197, 'M', u'中'),
+    (0x3198, 'M', u'下'),
+    (0x3199, 'M', u'甲'),
+    (0x319A, 'M', u'ä¹™'),
+    (0x319B, 'M', u'丙'),
+    (0x319C, 'M', u'丁'),
+    (0x319D, 'M', u'天'),
+    (0x319E, 'M', u'地'),
+    (0x319F, 'M', u'人'),
+    (0x31A0, 'V'),
+    (0x31BB, 'X'),
+    (0x31C0, 'V'),
+    (0x31E4, 'X'),
+    (0x31F0, 'V'),
+    (0x3200, '3', u'(á„€)'),
+    (0x3201, '3', u'(á„‚)'),
+    (0x3202, '3', u'(ᄃ)'),
+    (0x3203, '3', u'(á„…)'),
+    (0x3204, '3', u'(ᄆ)'),
+    ]
+
+def _seg_30():
+    return [
+    (0x3205, '3', u'(ᄇ)'),
+    (0x3206, '3', u'(ᄉ)'),
+    (0x3207, '3', u'(á„‹)'),
+    (0x3208, '3', u'(ᄌ)'),
+    (0x3209, '3', u'(ᄎ)'),
+    (0x320A, '3', u'(ᄏ)'),
+    (0x320B, '3', u'(ᄐ)'),
+    (0x320C, '3', u'(á„‘)'),
+    (0x320D, '3', u'(á„’)'),
+    (0x320E, '3', u'(ê°€)'),
+    (0x320F, '3', u'(나)'),
+    (0x3210, '3', u'(다)'),
+    (0x3211, '3', u'(라)'),
+    (0x3212, '3', u'(마)'),
+    (0x3213, '3', u'(ë°”)'),
+    (0x3214, '3', u'(사)'),
+    (0x3215, '3', u'(ì•„)'),
+    (0x3216, '3', u'(자)'),
+    (0x3217, '3', u'(ì°¨)'),
+    (0x3218, '3', u'(ì¹´)'),
+    (0x3219, '3', u'(타)'),
+    (0x321A, '3', u'(파)'),
+    (0x321B, '3', u'(하)'),
+    (0x321C, '3', u'(주)'),
+    (0x321D, '3', u'(오전)'),
+    (0x321E, '3', u'(오후)'),
+    (0x321F, 'X'),
+    (0x3220, '3', u'(一)'),
+    (0x3221, '3', u'(二)'),
+    (0x3222, '3', u'(三)'),
+    (0x3223, '3', u'(å››)'),
+    (0x3224, '3', u'(五)'),
+    (0x3225, '3', u'(å…­)'),
+    (0x3226, '3', u'(七)'),
+    (0x3227, '3', u'(å…«)'),
+    (0x3228, '3', u'(九)'),
+    (0x3229, '3', u'(十)'),
+    (0x322A, '3', u'(月)'),
+    (0x322B, '3', u'(火)'),
+    (0x322C, '3', u'(æ°´)'),
+    (0x322D, '3', u'(木)'),
+    (0x322E, '3', u'(金)'),
+    (0x322F, '3', u'(土)'),
+    (0x3230, '3', u'(æ—¥)'),
+    (0x3231, '3', u'(æ ª)'),
+    (0x3232, '3', u'(有)'),
+    (0x3233, '3', u'(社)'),
+    (0x3234, '3', u'(名)'),
+    (0x3235, '3', u'(特)'),
+    (0x3236, '3', u'(財)'),
+    (0x3237, '3', u'(祝)'),
+    (0x3238, '3', u'(労)'),
+    (0x3239, '3', u'(代)'),
+    (0x323A, '3', u'(呼)'),
+    (0x323B, '3', u'(å­¦)'),
+    (0x323C, '3', u'(監)'),
+    (0x323D, '3', u'(企)'),
+    (0x323E, '3', u'(資)'),
+    (0x323F, '3', u'(協)'),
+    (0x3240, '3', u'(祭)'),
+    (0x3241, '3', u'(休)'),
+    (0x3242, '3', u'(自)'),
+    (0x3243, '3', u'(至)'),
+    (0x3244, 'M', u'問'),
+    (0x3245, 'M', u'å¹¼'),
+    (0x3246, 'M', u'æ–‡'),
+    (0x3247, 'M', u'箏'),
+    (0x3248, 'V'),
+    (0x3250, 'M', u'pte'),
+    (0x3251, 'M', u'21'),
+    (0x3252, 'M', u'22'),
+    (0x3253, 'M', u'23'),
+    (0x3254, 'M', u'24'),
+    (0x3255, 'M', u'25'),
+    (0x3256, 'M', u'26'),
+    (0x3257, 'M', u'27'),
+    (0x3258, 'M', u'28'),
+    (0x3259, 'M', u'29'),
+    (0x325A, 'M', u'30'),
+    (0x325B, 'M', u'31'),
+    (0x325C, 'M', u'32'),
+    (0x325D, 'M', u'33'),
+    (0x325E, 'M', u'34'),
+    (0x325F, 'M', u'35'),
+    (0x3260, 'M', u'á„€'),
+    (0x3261, 'M', u'á„‚'),
+    (0x3262, 'M', u'ᄃ'),
+    (0x3263, 'M', u'á„…'),
+    (0x3264, 'M', u'ᄆ'),
+    (0x3265, 'M', u'ᄇ'),
+    (0x3266, 'M', u'ᄉ'),
+    (0x3267, 'M', u'á„‹'),
+    (0x3268, 'M', u'ᄌ'),
+    (0x3269, 'M', u'ᄎ'),
+    (0x326A, 'M', u'ᄏ'),
+    (0x326B, 'M', u'ᄐ'),
+    (0x326C, 'M', u'á„‘'),
+    (0x326D, 'M', u'á„’'),
+    (0x326E, 'M', u'ê°€'),
+    (0x326F, 'M', u'나'),
+    ]
+
+def _seg_31():
+    return [
+    (0x3270, 'M', u'다'),
+    (0x3271, 'M', u'라'),
+    (0x3272, 'M', u'마'),
+    (0x3273, 'M', u'ë°”'),
+    (0x3274, 'M', u'사'),
+    (0x3275, 'M', u'ì•„'),
+    (0x3276, 'M', u'자'),
+    (0x3277, 'M', u'ì°¨'),
+    (0x3278, 'M', u'ì¹´'),
+    (0x3279, 'M', u'타'),
+    (0x327A, 'M', u'파'),
+    (0x327B, 'M', u'하'),
+    (0x327C, 'M', u'참고'),
+    (0x327D, 'M', u'주의'),
+    (0x327E, 'M', u'ìš°'),
+    (0x327F, 'V'),
+    (0x3280, 'M', u'一'),
+    (0x3281, 'M', u'二'),
+    (0x3282, 'M', u'三'),
+    (0x3283, 'M', u'å››'),
+    (0x3284, 'M', u'五'),
+    (0x3285, 'M', u'å…­'),
+    (0x3286, 'M', u'七'),
+    (0x3287, 'M', u'å…«'),
+    (0x3288, 'M', u'九'),
+    (0x3289, 'M', u'十'),
+    (0x328A, 'M', u'月'),
+    (0x328B, 'M', u'火'),
+    (0x328C, 'M', u'æ°´'),
+    (0x328D, 'M', u'木'),
+    (0x328E, 'M', u'金'),
+    (0x328F, 'M', u'土'),
+    (0x3290, 'M', u'æ—¥'),
+    (0x3291, 'M', u'æ ª'),
+    (0x3292, 'M', u'有'),
+    (0x3293, 'M', u'社'),
+    (0x3294, 'M', u'名'),
+    (0x3295, 'M', u'特'),
+    (0x3296, 'M', u'財'),
+    (0x3297, 'M', u'祝'),
+    (0x3298, 'M', u'労'),
+    (0x3299, 'M', u'秘'),
+    (0x329A, 'M', u'ç”·'),
+    (0x329B, 'M', u'女'),
+    (0x329C, 'M', u'適'),
+    (0x329D, 'M', u'優'),
+    (0x329E, 'M', u'印'),
+    (0x329F, 'M', u'注'),
+    (0x32A0, 'M', u'é …'),
+    (0x32A1, 'M', u'休'),
+    (0x32A2, 'M', u'写'),
+    (0x32A3, 'M', u'æ­£'),
+    (0x32A4, 'M', u'上'),
+    (0x32A5, 'M', u'中'),
+    (0x32A6, 'M', u'下'),
+    (0x32A7, 'M', u'å·¦'),
+    (0x32A8, 'M', u'右'),
+    (0x32A9, 'M', u'医'),
+    (0x32AA, 'M', u'å®—'),
+    (0x32AB, 'M', u'å­¦'),
+    (0x32AC, 'M', u'監'),
+    (0x32AD, 'M', u'企'),
+    (0x32AE, 'M', u'資'),
+    (0x32AF, 'M', u'協'),
+    (0x32B0, 'M', u'夜'),
+    (0x32B1, 'M', u'36'),
+    (0x32B2, 'M', u'37'),
+    (0x32B3, 'M', u'38'),
+    (0x32B4, 'M', u'39'),
+    (0x32B5, 'M', u'40'),
+    (0x32B6, 'M', u'41'),
+    (0x32B7, 'M', u'42'),
+    (0x32B8, 'M', u'43'),
+    (0x32B9, 'M', u'44'),
+    (0x32BA, 'M', u'45'),
+    (0x32BB, 'M', u'46'),
+    (0x32BC, 'M', u'47'),
+    (0x32BD, 'M', u'48'),
+    (0x32BE, 'M', u'49'),
+    (0x32BF, 'M', u'50'),
+    (0x32C0, 'M', u'1月'),
+    (0x32C1, 'M', u'2月'),
+    (0x32C2, 'M', u'3月'),
+    (0x32C3, 'M', u'4月'),
+    (0x32C4, 'M', u'5月'),
+    (0x32C5, 'M', u'6月'),
+    (0x32C6, 'M', u'7月'),
+    (0x32C7, 'M', u'8月'),
+    (0x32C8, 'M', u'9月'),
+    (0x32C9, 'M', u'10月'),
+    (0x32CA, 'M', u'11月'),
+    (0x32CB, 'M', u'12月'),
+    (0x32CC, 'M', u'hg'),
+    (0x32CD, 'M', u'erg'),
+    (0x32CE, 'M', u'ev'),
+    (0x32CF, 'M', u'ltd'),
+    (0x32D0, 'M', u'ã‚¢'),
+    (0x32D1, 'M', u'イ'),
+    (0x32D2, 'M', u'ウ'),
+    (0x32D3, 'M', u'エ'),
+    ]
+
+def _seg_32():
+    return [
+    (0x32D4, 'M', u'オ'),
+    (0x32D5, 'M', u'ã‚«'),
+    (0x32D6, 'M', u'ã‚­'),
+    (0x32D7, 'M', u'ク'),
+    (0x32D8, 'M', u'ケ'),
+    (0x32D9, 'M', u'コ'),
+    (0x32DA, 'M', u'サ'),
+    (0x32DB, 'M', u'ã‚·'),
+    (0x32DC, 'M', u'ス'),
+    (0x32DD, 'M', u'ã‚»'),
+    (0x32DE, 'M', u'ソ'),
+    (0x32DF, 'M', u'ã‚¿'),
+    (0x32E0, 'M', u'チ'),
+    (0x32E1, 'M', u'ツ'),
+    (0x32E2, 'M', u'テ'),
+    (0x32E3, 'M', u'ト'),
+    (0x32E4, 'M', u'ナ'),
+    (0x32E5, 'M', u'ニ'),
+    (0x32E6, 'M', u'ヌ'),
+    (0x32E7, 'M', u'ネ'),
+    (0x32E8, 'M', u'ノ'),
+    (0x32E9, 'M', u'ハ'),
+    (0x32EA, 'M', u'ヒ'),
+    (0x32EB, 'M', u'フ'),
+    (0x32EC, 'M', u'ヘ'),
+    (0x32ED, 'M', u'ホ'),
+    (0x32EE, 'M', u'マ'),
+    (0x32EF, 'M', u'ミ'),
+    (0x32F0, 'M', u'ム'),
+    (0x32F1, 'M', u'メ'),
+    (0x32F2, 'M', u'モ'),
+    (0x32F3, 'M', u'ヤ'),
+    (0x32F4, 'M', u'ユ'),
+    (0x32F5, 'M', u'ヨ'),
+    (0x32F6, 'M', u'ラ'),
+    (0x32F7, 'M', u'リ'),
+    (0x32F8, 'M', u'ル'),
+    (0x32F9, 'M', u'レ'),
+    (0x32FA, 'M', u'ロ'),
+    (0x32FB, 'M', u'ワ'),
+    (0x32FC, 'M', u'ヰ'),
+    (0x32FD, 'M', u'ヱ'),
+    (0x32FE, 'M', u'ヲ'),
+    (0x32FF, 'X'),
+    (0x3300, 'M', u'アパート'),
+    (0x3301, 'M', u'アルファ'),
+    (0x3302, 'M', u'アンペア'),
+    (0x3303, 'M', u'アール'),
+    (0x3304, 'M', u'イニング'),
+    (0x3305, 'M', u'インチ'),
+    (0x3306, 'M', u'ウォン'),
+    (0x3307, 'M', u'エスクード'),
+    (0x3308, 'M', u'エーカー'),
+    (0x3309, 'M', u'オンス'),
+    (0x330A, 'M', u'オーム'),
+    (0x330B, 'M', u'カイリ'),
+    (0x330C, 'M', u'カラット'),
+    (0x330D, 'M', u'カロリー'),
+    (0x330E, 'M', u'ガロン'),
+    (0x330F, 'M', u'ガンマ'),
+    (0x3310, 'M', u'ギガ'),
+    (0x3311, 'M', u'ギニー'),
+    (0x3312, 'M', u'キュリー'),
+    (0x3313, 'M', u'ギルダー'),
+    (0x3314, 'M', u'キロ'),
+    (0x3315, 'M', u'キログラム'),
+    (0x3316, 'M', u'キロメートル'),
+    (0x3317, 'M', u'キロワット'),
+    (0x3318, 'M', u'グラム'),
+    (0x3319, 'M', u'グラムトン'),
+    (0x331A, 'M', u'クルゼイロ'),
+    (0x331B, 'M', u'クローネ'),
+    (0x331C, 'M', u'ケース'),
+    (0x331D, 'M', u'コルナ'),
+    (0x331E, 'M', u'コーポ'),
+    (0x331F, 'M', u'サイクル'),
+    (0x3320, 'M', u'サンチーム'),
+    (0x3321, 'M', u'シリング'),
+    (0x3322, 'M', u'センチ'),
+    (0x3323, 'M', u'セント'),
+    (0x3324, 'M', u'ダース'),
+    (0x3325, 'M', u'デシ'),
+    (0x3326, 'M', u'ドル'),
+    (0x3327, 'M', u'トン'),
+    (0x3328, 'M', u'ナノ'),
+    (0x3329, 'M', u'ノット'),
+    (0x332A, 'M', u'ハイツ'),
+    (0x332B, 'M', u'パーセント'),
+    (0x332C, 'M', u'パーツ'),
+    (0x332D, 'M', u'バーレル'),
+    (0x332E, 'M', u'ピアストル'),
+    (0x332F, 'M', u'ピクル'),
+    (0x3330, 'M', u'ピコ'),
+    (0x3331, 'M', u'ビル'),
+    (0x3332, 'M', u'ファラッド'),
+    (0x3333, 'M', u'フィート'),
+    (0x3334, 'M', u'ブッシェル'),
+    (0x3335, 'M', u'フラン'),
+    (0x3336, 'M', u'ヘクタール'),
+    (0x3337, 'M', u'ペソ'),
+    ]
+
+def _seg_33():
+    return [
+    (0x3338, 'M', u'ペニヒ'),
+    (0x3339, 'M', u'ヘルツ'),
+    (0x333A, 'M', u'ペンス'),
+    (0x333B, 'M', u'ページ'),
+    (0x333C, 'M', u'ベータ'),
+    (0x333D, 'M', u'ポイント'),
+    (0x333E, 'M', u'ボルト'),
+    (0x333F, 'M', u'ホン'),
+    (0x3340, 'M', u'ポンド'),
+    (0x3341, 'M', u'ホール'),
+    (0x3342, 'M', u'ホーン'),
+    (0x3343, 'M', u'マイクロ'),
+    (0x3344, 'M', u'マイル'),
+    (0x3345, 'M', u'マッハ'),
+    (0x3346, 'M', u'マルク'),
+    (0x3347, 'M', u'マンション'),
+    (0x3348, 'M', u'ミクロン'),
+    (0x3349, 'M', u'ミリ'),
+    (0x334A, 'M', u'ミリバール'),
+    (0x334B, 'M', u'メガ'),
+    (0x334C, 'M', u'メガトン'),
+    (0x334D, 'M', u'メートル'),
+    (0x334E, 'M', u'ヤード'),
+    (0x334F, 'M', u'ヤール'),
+    (0x3350, 'M', u'ユアン'),
+    (0x3351, 'M', u'リットル'),
+    (0x3352, 'M', u'リラ'),
+    (0x3353, 'M', u'ルピー'),
+    (0x3354, 'M', u'ルーブル'),
+    (0x3355, 'M', u'レム'),
+    (0x3356, 'M', u'レントゲン'),
+    (0x3357, 'M', u'ワット'),
+    (0x3358, 'M', u'0点'),
+    (0x3359, 'M', u'1点'),
+    (0x335A, 'M', u'2点'),
+    (0x335B, 'M', u'3点'),
+    (0x335C, 'M', u'4点'),
+    (0x335D, 'M', u'5点'),
+    (0x335E, 'M', u'6点'),
+    (0x335F, 'M', u'7点'),
+    (0x3360, 'M', u'8点'),
+    (0x3361, 'M', u'9点'),
+    (0x3362, 'M', u'10点'),
+    (0x3363, 'M', u'11点'),
+    (0x3364, 'M', u'12点'),
+    (0x3365, 'M', u'13点'),
+    (0x3366, 'M', u'14点'),
+    (0x3367, 'M', u'15点'),
+    (0x3368, 'M', u'16点'),
+    (0x3369, 'M', u'17点'),
+    (0x336A, 'M', u'18点'),
+    (0x336B, 'M', u'19点'),
+    (0x336C, 'M', u'20点'),
+    (0x336D, 'M', u'21点'),
+    (0x336E, 'M', u'22点'),
+    (0x336F, 'M', u'23点'),
+    (0x3370, 'M', u'24点'),
+    (0x3371, 'M', u'hpa'),
+    (0x3372, 'M', u'da'),
+    (0x3373, 'M', u'au'),
+    (0x3374, 'M', u'bar'),
+    (0x3375, 'M', u'ov'),
+    (0x3376, 'M', u'pc'),
+    (0x3377, 'M', u'dm'),
+    (0x3378, 'M', u'dm2'),
+    (0x3379, 'M', u'dm3'),
+    (0x337A, 'M', u'iu'),
+    (0x337B, 'M', u'平成'),
+    (0x337C, 'M', u'昭和'),
+    (0x337D, 'M', u'大正'),
+    (0x337E, 'M', u'明治'),
+    (0x337F, 'M', u'株式会社'),
+    (0x3380, 'M', u'pa'),
+    (0x3381, 'M', u'na'),
+    (0x3382, 'M', u'μa'),
+    (0x3383, 'M', u'ma'),
+    (0x3384, 'M', u'ka'),
+    (0x3385, 'M', u'kb'),
+    (0x3386, 'M', u'mb'),
+    (0x3387, 'M', u'gb'),
+    (0x3388, 'M', u'cal'),
+    (0x3389, 'M', u'kcal'),
+    (0x338A, 'M', u'pf'),
+    (0x338B, 'M', u'nf'),
+    (0x338C, 'M', u'μf'),
+    (0x338D, 'M', u'μg'),
+    (0x338E, 'M', u'mg'),
+    (0x338F, 'M', u'kg'),
+    (0x3390, 'M', u'hz'),
+    (0x3391, 'M', u'khz'),
+    (0x3392, 'M', u'mhz'),
+    (0x3393, 'M', u'ghz'),
+    (0x3394, 'M', u'thz'),
+    (0x3395, 'M', u'μl'),
+    (0x3396, 'M', u'ml'),
+    (0x3397, 'M', u'dl'),
+    (0x3398, 'M', u'kl'),
+    (0x3399, 'M', u'fm'),
+    (0x339A, 'M', u'nm'),
+    (0x339B, 'M', u'μm'),
+    ]
+
+def _seg_34():
+    return [
+    (0x339C, 'M', u'mm'),
+    (0x339D, 'M', u'cm'),
+    (0x339E, 'M', u'km'),
+    (0x339F, 'M', u'mm2'),
+    (0x33A0, 'M', u'cm2'),
+    (0x33A1, 'M', u'm2'),
+    (0x33A2, 'M', u'km2'),
+    (0x33A3, 'M', u'mm3'),
+    (0x33A4, 'M', u'cm3'),
+    (0x33A5, 'M', u'm3'),
+    (0x33A6, 'M', u'km3'),
+    (0x33A7, 'M', u'm∕s'),
+    (0x33A8, 'M', u'm∕s2'),
+    (0x33A9, 'M', u'pa'),
+    (0x33AA, 'M', u'kpa'),
+    (0x33AB, 'M', u'mpa'),
+    (0x33AC, 'M', u'gpa'),
+    (0x33AD, 'M', u'rad'),
+    (0x33AE, 'M', u'rad∕s'),
+    (0x33AF, 'M', u'rad∕s2'),
+    (0x33B0, 'M', u'ps'),
+    (0x33B1, 'M', u'ns'),
+    (0x33B2, 'M', u'μs'),
+    (0x33B3, 'M', u'ms'),
+    (0x33B4, 'M', u'pv'),
+    (0x33B5, 'M', u'nv'),
+    (0x33B6, 'M', u'μv'),
+    (0x33B7, 'M', u'mv'),
+    (0x33B8, 'M', u'kv'),
+    (0x33B9, 'M', u'mv'),
+    (0x33BA, 'M', u'pw'),
+    (0x33BB, 'M', u'nw'),
+    (0x33BC, 'M', u'μw'),
+    (0x33BD, 'M', u'mw'),
+    (0x33BE, 'M', u'kw'),
+    (0x33BF, 'M', u'mw'),
+    (0x33C0, 'M', u'kω'),
+    (0x33C1, 'M', u'mω'),
+    (0x33C2, 'X'),
+    (0x33C3, 'M', u'bq'),
+    (0x33C4, 'M', u'cc'),
+    (0x33C5, 'M', u'cd'),
+    (0x33C6, 'M', u'c∕kg'),
+    (0x33C7, 'X'),
+    (0x33C8, 'M', u'db'),
+    (0x33C9, 'M', u'gy'),
+    (0x33CA, 'M', u'ha'),
+    (0x33CB, 'M', u'hp'),
+    (0x33CC, 'M', u'in'),
+    (0x33CD, 'M', u'kk'),
+    (0x33CE, 'M', u'km'),
+    (0x33CF, 'M', u'kt'),
+    (0x33D0, 'M', u'lm'),
+    (0x33D1, 'M', u'ln'),
+    (0x33D2, 'M', u'log'),
+    (0x33D3, 'M', u'lx'),
+    (0x33D4, 'M', u'mb'),
+    (0x33D5, 'M', u'mil'),
+    (0x33D6, 'M', u'mol'),
+    (0x33D7, 'M', u'ph'),
+    (0x33D8, 'X'),
+    (0x33D9, 'M', u'ppm'),
+    (0x33DA, 'M', u'pr'),
+    (0x33DB, 'M', u'sr'),
+    (0x33DC, 'M', u'sv'),
+    (0x33DD, 'M', u'wb'),
+    (0x33DE, 'M', u'v∕m'),
+    (0x33DF, 'M', u'a∕m'),
+    (0x33E0, 'M', u'1æ—¥'),
+    (0x33E1, 'M', u'2æ—¥'),
+    (0x33E2, 'M', u'3æ—¥'),
+    (0x33E3, 'M', u'4æ—¥'),
+    (0x33E4, 'M', u'5æ—¥'),
+    (0x33E5, 'M', u'6æ—¥'),
+    (0x33E6, 'M', u'7æ—¥'),
+    (0x33E7, 'M', u'8æ—¥'),
+    (0x33E8, 'M', u'9æ—¥'),
+    (0x33E9, 'M', u'10æ—¥'),
+    (0x33EA, 'M', u'11æ—¥'),
+    (0x33EB, 'M', u'12æ—¥'),
+    (0x33EC, 'M', u'13æ—¥'),
+    (0x33ED, 'M', u'14æ—¥'),
+    (0x33EE, 'M', u'15æ—¥'),
+    (0x33EF, 'M', u'16æ—¥'),
+    (0x33F0, 'M', u'17æ—¥'),
+    (0x33F1, 'M', u'18æ—¥'),
+    (0x33F2, 'M', u'19æ—¥'),
+    (0x33F3, 'M', u'20æ—¥'),
+    (0x33F4, 'M', u'21æ—¥'),
+    (0x33F5, 'M', u'22æ—¥'),
+    (0x33F6, 'M', u'23æ—¥'),
+    (0x33F7, 'M', u'24æ—¥'),
+    (0x33F8, 'M', u'25æ—¥'),
+    (0x33F9, 'M', u'26æ—¥'),
+    (0x33FA, 'M', u'27æ—¥'),
+    (0x33FB, 'M', u'28æ—¥'),
+    (0x33FC, 'M', u'29æ—¥'),
+    (0x33FD, 'M', u'30æ—¥'),
+    (0x33FE, 'M', u'31æ—¥'),
+    (0x33FF, 'M', u'gal'),
+    ]
+
+def _seg_35():
+    return [
+    (0x3400, 'V'),
+    (0x4DB6, 'X'),
+    (0x4DC0, 'V'),
+    (0x9FCD, 'X'),
+    (0xA000, 'V'),
+    (0xA48D, 'X'),
+    (0xA490, 'V'),
+    (0xA4C7, 'X'),
+    (0xA4D0, 'V'),
+    (0xA62C, 'X'),
+    (0xA640, 'M', u'ꙁ'),
+    (0xA641, 'V'),
+    (0xA642, 'M', u'ꙃ'),
+    (0xA643, 'V'),
+    (0xA644, 'M', u'ê™…'),
+    (0xA645, 'V'),
+    (0xA646, 'M', u'ꙇ'),
+    (0xA647, 'V'),
+    (0xA648, 'M', u'ꙉ'),
+    (0xA649, 'V'),
+    (0xA64A, 'M', u'ꙋ'),
+    (0xA64B, 'V'),
+    (0xA64C, 'M', u'ꙍ'),
+    (0xA64D, 'V'),
+    (0xA64E, 'M', u'ꙏ'),
+    (0xA64F, 'V'),
+    (0xA650, 'M', u'ꙑ'),
+    (0xA651, 'V'),
+    (0xA652, 'M', u'ꙓ'),
+    (0xA653, 'V'),
+    (0xA654, 'M', u'ꙕ'),
+    (0xA655, 'V'),
+    (0xA656, 'M', u'ê™—'),
+    (0xA657, 'V'),
+    (0xA658, 'M', u'ê™™'),
+    (0xA659, 'V'),
+    (0xA65A, 'M', u'ê™›'),
+    (0xA65B, 'V'),
+    (0xA65C, 'M', u'ꙝ'),
+    (0xA65D, 'V'),
+    (0xA65E, 'M', u'ꙟ'),
+    (0xA65F, 'V'),
+    (0xA660, 'M', u'ꙡ'),
+    (0xA661, 'V'),
+    (0xA662, 'M', u'ꙣ'),
+    (0xA663, 'V'),
+    (0xA664, 'M', u'ꙥ'),
+    (0xA665, 'V'),
+    (0xA666, 'M', u'ê™§'),
+    (0xA667, 'V'),
+    (0xA668, 'M', u'ꙩ'),
+    (0xA669, 'V'),
+    (0xA66A, 'M', u'ꙫ'),
+    (0xA66B, 'V'),
+    (0xA66C, 'M', u'ê™­'),
+    (0xA66D, 'V'),
+    (0xA680, 'M', u'ꚁ'),
+    (0xA681, 'V'),
+    (0xA682, 'M', u'ꚃ'),
+    (0xA683, 'V'),
+    (0xA684, 'M', u'êš…'),
+    (0xA685, 'V'),
+    (0xA686, 'M', u'ꚇ'),
+    (0xA687, 'V'),
+    (0xA688, 'M', u'ꚉ'),
+    (0xA689, 'V'),
+    (0xA68A, 'M', u'êš‹'),
+    (0xA68B, 'V'),
+    (0xA68C, 'M', u'ꚍ'),
+    (0xA68D, 'V'),
+    (0xA68E, 'M', u'ꚏ'),
+    (0xA68F, 'V'),
+    (0xA690, 'M', u'êš‘'),
+    (0xA691, 'V'),
+    (0xA692, 'M', u'êš“'),
+    (0xA693, 'V'),
+    (0xA694, 'M', u'êš•'),
+    (0xA695, 'V'),
+    (0xA696, 'M', u'êš—'),
+    (0xA697, 'V'),
+    (0xA698, 'X'),
+    (0xA69F, 'V'),
+    (0xA6F8, 'X'),
+    (0xA700, 'V'),
+    (0xA722, 'M', u'ꜣ'),
+    (0xA723, 'V'),
+    (0xA724, 'M', u'ꜥ'),
+    (0xA725, 'V'),
+    (0xA726, 'M', u'ꜧ'),
+    (0xA727, 'V'),
+    (0xA728, 'M', u'ꜩ'),
+    (0xA729, 'V'),
+    (0xA72A, 'M', u'ꜫ'),
+    (0xA72B, 'V'),
+    (0xA72C, 'M', u'ꜭ'),
+    (0xA72D, 'V'),
+    (0xA72E, 'M', u'ꜯ'),
+    (0xA72F, 'V'),
+    (0xA732, 'M', u'ꜳ'),
+    (0xA733, 'V'),
+    ]
+
+def _seg_36():
+    return [
+    (0xA734, 'M', u'ꜵ'),
+    (0xA735, 'V'),
+    (0xA736, 'M', u'ꜷ'),
+    (0xA737, 'V'),
+    (0xA738, 'M', u'ꜹ'),
+    (0xA739, 'V'),
+    (0xA73A, 'M', u'ꜻ'),
+    (0xA73B, 'V'),
+    (0xA73C, 'M', u'ꜽ'),
+    (0xA73D, 'V'),
+    (0xA73E, 'M', u'ꜿ'),
+    (0xA73F, 'V'),
+    (0xA740, 'M', u'ꝁ'),
+    (0xA741, 'V'),
+    (0xA742, 'M', u'ꝃ'),
+    (0xA743, 'V'),
+    (0xA744, 'M', u'ꝅ'),
+    (0xA745, 'V'),
+    (0xA746, 'M', u'ꝇ'),
+    (0xA747, 'V'),
+    (0xA748, 'M', u'ꝉ'),
+    (0xA749, 'V'),
+    (0xA74A, 'M', u'ꝋ'),
+    (0xA74B, 'V'),
+    (0xA74C, 'M', u'ꝍ'),
+    (0xA74D, 'V'),
+    (0xA74E, 'M', u'ꝏ'),
+    (0xA74F, 'V'),
+    (0xA750, 'M', u'ꝑ'),
+    (0xA751, 'V'),
+    (0xA752, 'M', u'ꝓ'),
+    (0xA753, 'V'),
+    (0xA754, 'M', u'ꝕ'),
+    (0xA755, 'V'),
+    (0xA756, 'M', u'ꝗ'),
+    (0xA757, 'V'),
+    (0xA758, 'M', u'ꝙ'),
+    (0xA759, 'V'),
+    (0xA75A, 'M', u'ꝛ'),
+    (0xA75B, 'V'),
+    (0xA75C, 'M', u'ꝝ'),
+    (0xA75D, 'V'),
+    (0xA75E, 'M', u'ꝟ'),
+    (0xA75F, 'V'),
+    (0xA760, 'M', u'ꝡ'),
+    (0xA761, 'V'),
+    (0xA762, 'M', u'ꝣ'),
+    (0xA763, 'V'),
+    (0xA764, 'M', u'ꝥ'),
+    (0xA765, 'V'),
+    (0xA766, 'M', u'ꝧ'),
+    (0xA767, 'V'),
+    (0xA768, 'M', u'ꝩ'),
+    (0xA769, 'V'),
+    (0xA76A, 'M', u'ꝫ'),
+    (0xA76B, 'V'),
+    (0xA76C, 'M', u'ꝭ'),
+    (0xA76D, 'V'),
+    (0xA76E, 'M', u'ꝯ'),
+    (0xA76F, 'V'),
+    (0xA770, 'M', u'ꝯ'),
+    (0xA771, 'V'),
+    (0xA779, 'M', u'ꝺ'),
+    (0xA77A, 'V'),
+    (0xA77B, 'M', u'ꝼ'),
+    (0xA77C, 'V'),
+    (0xA77D, 'M', u'áµ¹'),
+    (0xA77E, 'M', u'ꝿ'),
+    (0xA77F, 'V'),
+    (0xA780, 'M', u'ꞁ'),
+    (0xA781, 'V'),
+    (0xA782, 'M', u'ꞃ'),
+    (0xA783, 'V'),
+    (0xA784, 'M', u'êž…'),
+    (0xA785, 'V'),
+    (0xA786, 'M', u'ꞇ'),
+    (0xA787, 'V'),
+    (0xA78B, 'M', u'ꞌ'),
+    (0xA78C, 'V'),
+    (0xA78D, 'M', u'É¥'),
+    (0xA78E, 'V'),
+    (0xA78F, 'X'),
+    (0xA790, 'M', u'êž‘'),
+    (0xA791, 'V'),
+    (0xA792, 'M', u'êž“'),
+    (0xA793, 'V'),
+    (0xA794, 'X'),
+    (0xA7A0, 'M', u'êž¡'),
+    (0xA7A1, 'V'),
+    (0xA7A2, 'M', u'ꞣ'),
+    (0xA7A3, 'V'),
+    (0xA7A4, 'M', u'ꞥ'),
+    (0xA7A5, 'V'),
+    (0xA7A6, 'M', u'êž§'),
+    (0xA7A7, 'V'),
+    (0xA7A8, 'M', u'êž©'),
+    (0xA7A9, 'V'),
+    (0xA7AA, 'M', u'ɦ'),
+    (0xA7AB, 'X'),
+    (0xA7F8, 'M', u'ħ'),
+    ]
+
+def _seg_37():
+    return [
+    (0xA7F9, 'M', u'Å“'),
+    (0xA7FA, 'V'),
+    (0xA82C, 'X'),
+    (0xA830, 'V'),
+    (0xA83A, 'X'),
+    (0xA840, 'V'),
+    (0xA878, 'X'),
+    (0xA880, 'V'),
+    (0xA8C5, 'X'),
+    (0xA8CE, 'V'),
+    (0xA8DA, 'X'),
+    (0xA8E0, 'V'),
+    (0xA8FC, 'X'),
+    (0xA900, 'V'),
+    (0xA954, 'X'),
+    (0xA95F, 'V'),
+    (0xA97D, 'X'),
+    (0xA980, 'V'),
+    (0xA9CE, 'X'),
+    (0xA9CF, 'V'),
+    (0xA9DA, 'X'),
+    (0xA9DE, 'V'),
+    (0xA9E0, 'X'),
+    (0xAA00, 'V'),
+    (0xAA37, 'X'),
+    (0xAA40, 'V'),
+    (0xAA4E, 'X'),
+    (0xAA50, 'V'),
+    (0xAA5A, 'X'),
+    (0xAA5C, 'V'),
+    (0xAA7C, 'X'),
+    (0xAA80, 'V'),
+    (0xAAC3, 'X'),
+    (0xAADB, 'V'),
+    (0xAAF7, 'X'),
+    (0xAB01, 'V'),
+    (0xAB07, 'X'),
+    (0xAB09, 'V'),
+    (0xAB0F, 'X'),
+    (0xAB11, 'V'),
+    (0xAB17, 'X'),
+    (0xAB20, 'V'),
+    (0xAB27, 'X'),
+    (0xAB28, 'V'),
+    (0xAB2F, 'X'),
+    (0xABC0, 'V'),
+    (0xABEE, 'X'),
+    (0xABF0, 'V'),
+    (0xABFA, 'X'),
+    (0xAC00, 'V'),
+    (0xD7A4, 'X'),
+    (0xD7B0, 'V'),
+    (0xD7C7, 'X'),
+    (0xD7CB, 'V'),
+    (0xD7FC, 'X'),
+    (0xF900, 'M', u'豈'),
+    (0xF901, 'M', u'æ›´'),
+    (0xF902, 'M', u'車'),
+    (0xF903, 'M', u'賈'),
+    (0xF904, 'M', u'滑'),
+    (0xF905, 'M', u'串'),
+    (0xF906, 'M', u'句'),
+    (0xF907, 'M', u'龜'),
+    (0xF909, 'M', u'契'),
+    (0xF90A, 'M', u'金'),
+    (0xF90B, 'M', u'å–‡'),
+    (0xF90C, 'M', u'奈'),
+    (0xF90D, 'M', u'懶'),
+    (0xF90E, 'M', u'癩'),
+    (0xF90F, 'M', u'ç¾…'),
+    (0xF910, 'M', u'蘿'),
+    (0xF911, 'M', u'螺'),
+    (0xF912, 'M', u'裸'),
+    (0xF913, 'M', u'邏'),
+    (0xF914, 'M', u'樂'),
+    (0xF915, 'M', u'æ´›'),
+    (0xF916, 'M', u'烙'),
+    (0xF917, 'M', u'珞'),
+    (0xF918, 'M', u'落'),
+    (0xF919, 'M', u'é…ª'),
+    (0xF91A, 'M', u'é§±'),
+    (0xF91B, 'M', u'亂'),
+    (0xF91C, 'M', u'卵'),
+    (0xF91D, 'M', u'欄'),
+    (0xF91E, 'M', u'爛'),
+    (0xF91F, 'M', u'蘭'),
+    (0xF920, 'M', u'鸞'),
+    (0xF921, 'M', u'嵐'),
+    (0xF922, 'M', u'æ¿«'),
+    (0xF923, 'M', u'藍'),
+    (0xF924, 'M', u'襤'),
+    (0xF925, 'M', u'拉'),
+    (0xF926, 'M', u'臘'),
+    (0xF927, 'M', u'è Ÿ'),
+    (0xF928, 'M', u'廊'),
+    (0xF929, 'M', u'朗'),
+    (0xF92A, 'M', u'浪'),
+    (0xF92B, 'M', u'狼'),
+    (0xF92C, 'M', u'郎'),
+    (0xF92D, 'M', u'來'),
+    ]
+
+def _seg_38():
+    return [
+    (0xF92E, 'M', u'冷'),
+    (0xF92F, 'M', u'勞'),
+    (0xF930, 'M', u'æ“„'),
+    (0xF931, 'M', u'æ«“'),
+    (0xF932, 'M', u'爐'),
+    (0xF933, 'M', u'ç›§'),
+    (0xF934, 'M', u'老'),
+    (0xF935, 'M', u'蘆'),
+    (0xF936, 'M', u'虜'),
+    (0xF937, 'M', u'è·¯'),
+    (0xF938, 'M', u'露'),
+    (0xF939, 'M', u'é­¯'),
+    (0xF93A, 'M', u'é·º'),
+    (0xF93B, 'M', u'碌'),
+    (0xF93C, 'M', u'祿'),
+    (0xF93D, 'M', u'ç¶ '),
+    (0xF93E, 'M', u'菉'),
+    (0xF93F, 'M', u'錄'),
+    (0xF940, 'M', u'鹿'),
+    (0xF941, 'M', u'è«–'),
+    (0xF942, 'M', u'壟'),
+    (0xF943, 'M', u'弄'),
+    (0xF944, 'M', u'ç± '),
+    (0xF945, 'M', u'聾'),
+    (0xF946, 'M', u'牢'),
+    (0xF947, 'M', u'磊'),
+    (0xF948, 'M', u'賂'),
+    (0xF949, 'M', u'é›·'),
+    (0xF94A, 'M', u'壘'),
+    (0xF94B, 'M', u'å±¢'),
+    (0xF94C, 'M', u'樓'),
+    (0xF94D, 'M', u'æ·š'),
+    (0xF94E, 'M', u'漏'),
+    (0xF94F, 'M', u'ç´¯'),
+    (0xF950, 'M', u'縷'),
+    (0xF951, 'M', u'陋'),
+    (0xF952, 'M', u'å‹’'),
+    (0xF953, 'M', u'è‚‹'),
+    (0xF954, 'M', u'凜'),
+    (0xF955, 'M', u'凌'),
+    (0xF956, 'M', u'稜'),
+    (0xF957, 'M', u'ç¶¾'),
+    (0xF958, 'M', u'菱'),
+    (0xF959, 'M', u'陵'),
+    (0xF95A, 'M', u'讀'),
+    (0xF95B, 'M', u'拏'),
+    (0xF95C, 'M', u'樂'),
+    (0xF95D, 'M', u'諾'),
+    (0xF95E, 'M', u'丹'),
+    (0xF95F, 'M', u'寧'),
+    (0xF960, 'M', u'怒'),
+    (0xF961, 'M', u'率'),
+    (0xF962, 'M', u'ç•°'),
+    (0xF963, 'M', u'北'),
+    (0xF964, 'M', u'磻'),
+    (0xF965, 'M', u'便'),
+    (0xF966, 'M', u'復'),
+    (0xF967, 'M', u'不'),
+    (0xF968, 'M', u'泌'),
+    (0xF969, 'M', u'數'),
+    (0xF96A, 'M', u'ç´¢'),
+    (0xF96B, 'M', u'參'),
+    (0xF96C, 'M', u'塞'),
+    (0xF96D, 'M', u'省'),
+    (0xF96E, 'M', u'葉'),
+    (0xF96F, 'M', u'說'),
+    (0xF970, 'M', u'殺'),
+    (0xF971, 'M', u'è¾°'),
+    (0xF972, 'M', u'沈'),
+    (0xF973, 'M', u'拾'),
+    (0xF974, 'M', u'è‹¥'),
+    (0xF975, 'M', u'掠'),
+    (0xF976, 'M', u'ç•¥'),
+    (0xF977, 'M', u'亮'),
+    (0xF978, 'M', u'å…©'),
+    (0xF979, 'M', u'凉'),
+    (0xF97A, 'M', u'梁'),
+    (0xF97B, 'M', u'ç³§'),
+    (0xF97C, 'M', u'良'),
+    (0xF97D, 'M', u'è«’'),
+    (0xF97E, 'M', u'量'),
+    (0xF97F, 'M', u'勵'),
+    (0xF980, 'M', u'å‘‚'),
+    (0xF981, 'M', u'女'),
+    (0xF982, 'M', u'廬'),
+    (0xF983, 'M', u'æ—…'),
+    (0xF984, 'M', u'濾'),
+    (0xF985, 'M', u'礪'),
+    (0xF986, 'M', u'é–­'),
+    (0xF987, 'M', u'驪'),
+    (0xF988, 'M', u'麗'),
+    (0xF989, 'M', u'黎'),
+    (0xF98A, 'M', u'力'),
+    (0xF98B, 'M', u'曆'),
+    (0xF98C, 'M', u'æ­·'),
+    (0xF98D, 'M', u'è½¢'),
+    (0xF98E, 'M', u'å¹´'),
+    (0xF98F, 'M', u'憐'),
+    (0xF990, 'M', u'戀'),
+    (0xF991, 'M', u'æ’š'),
+    ]
+
+def _seg_39():
+    return [
+    (0xF992, 'M', u'æ¼£'),
+    (0xF993, 'M', u'ç…‰'),
+    (0xF994, 'M', u'ç’‰'),
+    (0xF995, 'M', u'ç§Š'),
+    (0xF996, 'M', u'ç·´'),
+    (0xF997, 'M', u'聯'),
+    (0xF998, 'M', u'輦'),
+    (0xF999, 'M', u'è“®'),
+    (0xF99A, 'M', u'連'),
+    (0xF99B, 'M', u'鍊'),
+    (0xF99C, 'M', u'列'),
+    (0xF99D, 'M', u'劣'),
+    (0xF99E, 'M', u'å’½'),
+    (0xF99F, 'M', u'烈'),
+    (0xF9A0, 'M', u'裂'),
+    (0xF9A1, 'M', u'說'),
+    (0xF9A2, 'M', u'廉'),
+    (0xF9A3, 'M', u'念'),
+    (0xF9A4, 'M', u'捻'),
+    (0xF9A5, 'M', u'æ®®'),
+    (0xF9A6, 'M', u'ç°¾'),
+    (0xF9A7, 'M', u'獵'),
+    (0xF9A8, 'M', u'令'),
+    (0xF9A9, 'M', u'囹'),
+    (0xF9AA, 'M', u'寧'),
+    (0xF9AB, 'M', u'嶺'),
+    (0xF9AC, 'M', u'怜'),
+    (0xF9AD, 'M', u'玲'),
+    (0xF9AE, 'M', u'ç‘©'),
+    (0xF9AF, 'M', u'羚'),
+    (0xF9B0, 'M', u'聆'),
+    (0xF9B1, 'M', u'鈴'),
+    (0xF9B2, 'M', u'é›¶'),
+    (0xF9B3, 'M', u'靈'),
+    (0xF9B4, 'M', u'é ˜'),
+    (0xF9B5, 'M', u'例'),
+    (0xF9B6, 'M', u'禮'),
+    (0xF9B7, 'M', u'醴'),
+    (0xF9B8, 'M', u'隸'),
+    (0xF9B9, 'M', u'惡'),
+    (0xF9BA, 'M', u'了'),
+    (0xF9BB, 'M', u'僚'),
+    (0xF9BC, 'M', u'寮'),
+    (0xF9BD, 'M', u'å°¿'),
+    (0xF9BE, 'M', u'æ–™'),
+    (0xF9BF, 'M', u'樂'),
+    (0xF9C0, 'M', u'燎'),
+    (0xF9C1, 'M', u'療'),
+    (0xF9C2, 'M', u'蓼'),
+    (0xF9C3, 'M', u'遼'),
+    (0xF9C4, 'M', u'龍'),
+    (0xF9C5, 'M', u'暈'),
+    (0xF9C6, 'M', u'阮'),
+    (0xF9C7, 'M', u'劉'),
+    (0xF9C8, 'M', u'杻'),
+    (0xF9C9, 'M', u'柳'),
+    (0xF9CA, 'M', u'流'),
+    (0xF9CB, 'M', u'溜'),
+    (0xF9CC, 'M', u'琉'),
+    (0xF9CD, 'M', u'ç•™'),
+    (0xF9CE, 'M', u'ç¡«'),
+    (0xF9CF, 'M', u'紐'),
+    (0xF9D0, 'M', u'類'),
+    (0xF9D1, 'M', u'å…­'),
+    (0xF9D2, 'M', u'戮'),
+    (0xF9D3, 'M', u'陸'),
+    (0xF9D4, 'M', u'倫'),
+    (0xF9D5, 'M', u'å´™'),
+    (0xF9D6, 'M', u'æ·ª'),
+    (0xF9D7, 'M', u'輪'),
+    (0xF9D8, 'M', u'律'),
+    (0xF9D9, 'M', u'æ…„'),
+    (0xF9DA, 'M', u'æ —'),
+    (0xF9DB, 'M', u'率'),
+    (0xF9DC, 'M', u'隆'),
+    (0xF9DD, 'M', u'利'),
+    (0xF9DE, 'M', u'吏'),
+    (0xF9DF, 'M', u'å±¥'),
+    (0xF9E0, 'M', u'易'),
+    (0xF9E1, 'M', u'李'),
+    (0xF9E2, 'M', u'梨'),
+    (0xF9E3, 'M', u'æ³¥'),
+    (0xF9E4, 'M', u'理'),
+    (0xF9E5, 'M', u'ç—¢'),
+    (0xF9E6, 'M', u'ç½¹'),
+    (0xF9E7, 'M', u'裏'),
+    (0xF9E8, 'M', u'裡'),
+    (0xF9E9, 'M', u'里'),
+    (0xF9EA, 'M', u'離'),
+    (0xF9EB, 'M', u'匿'),
+    (0xF9EC, 'M', u'溺'),
+    (0xF9ED, 'M', u'吝'),
+    (0xF9EE, 'M', u'燐'),
+    (0xF9EF, 'M', u'ç’˜'),
+    (0xF9F0, 'M', u'è—º'),
+    (0xF9F1, 'M', u'隣'),
+    (0xF9F2, 'M', u'é±—'),
+    (0xF9F3, 'M', u'麟'),
+    (0xF9F4, 'M', u'æž—'),
+    (0xF9F5, 'M', u'æ·‹'),
+    ]
+
+def _seg_40():
+    return [
+    (0xF9F6, 'M', u'臨'),
+    (0xF9F7, 'M', u'ç«‹'),
+    (0xF9F8, 'M', u'笠'),
+    (0xF9F9, 'M', u'ç²’'),
+    (0xF9FA, 'M', u'ç‹€'),
+    (0xF9FB, 'M', u'ç‚™'),
+    (0xF9FC, 'M', u'è­˜'),
+    (0xF9FD, 'M', u'什'),
+    (0xF9FE, 'M', u'茶'),
+    (0xF9FF, 'M', u'刺'),
+    (0xFA00, 'M', u'切'),
+    (0xFA01, 'M', u'度'),
+    (0xFA02, 'M', u'æ‹“'),
+    (0xFA03, 'M', u'ç³–'),
+    (0xFA04, 'M', u'å®…'),
+    (0xFA05, 'M', u'æ´ž'),
+    (0xFA06, 'M', u'æš´'),
+    (0xFA07, 'M', u'è¼»'),
+    (0xFA08, 'M', u'行'),
+    (0xFA09, 'M', u'降'),
+    (0xFA0A, 'M', u'見'),
+    (0xFA0B, 'M', u'廓'),
+    (0xFA0C, 'M', u'å…€'),
+    (0xFA0D, 'M', u'å—€'),
+    (0xFA0E, 'V'),
+    (0xFA10, 'M', u'塚'),
+    (0xFA11, 'V'),
+    (0xFA12, 'M', u'æ™´'),
+    (0xFA13, 'V'),
+    (0xFA15, 'M', u'凞'),
+    (0xFA16, 'M', u'猪'),
+    (0xFA17, 'M', u'益'),
+    (0xFA18, 'M', u'礼'),
+    (0xFA19, 'M', u'神'),
+    (0xFA1A, 'M', u'祥'),
+    (0xFA1B, 'M', u'福'),
+    (0xFA1C, 'M', u'靖'),
+    (0xFA1D, 'M', u'ç²¾'),
+    (0xFA1E, 'M', u'ç¾½'),
+    (0xFA1F, 'V'),
+    (0xFA20, 'M', u'蘒'),
+    (0xFA21, 'V'),
+    (0xFA22, 'M', u'諸'),
+    (0xFA23, 'V'),
+    (0xFA25, 'M', u'逸'),
+    (0xFA26, 'M', u'都'),
+    (0xFA27, 'V'),
+    (0xFA2A, 'M', u'飯'),
+    (0xFA2B, 'M', u'飼'),
+    (0xFA2C, 'M', u'館'),
+    (0xFA2D, 'M', u'é¶´'),
+    (0xFA2E, 'M', u'郞'),
+    (0xFA2F, 'M', u'éš·'),
+    (0xFA30, 'M', u'ä¾®'),
+    (0xFA31, 'M', u'僧'),
+    (0xFA32, 'M', u'免'),
+    (0xFA33, 'M', u'勉'),
+    (0xFA34, 'M', u'勤'),
+    (0xFA35, 'M', u'卑'),
+    (0xFA36, 'M', u'喝'),
+    (0xFA37, 'M', u'嘆'),
+    (0xFA38, 'M', u'器'),
+    (0xFA39, 'M', u'å¡€'),
+    (0xFA3A, 'M', u'墨'),
+    (0xFA3B, 'M', u'層'),
+    (0xFA3C, 'M', u'å±®'),
+    (0xFA3D, 'M', u'æ‚”'),
+    (0xFA3E, 'M', u'æ…¨'),
+    (0xFA3F, 'M', u'憎'),
+    (0xFA40, 'M', u'懲'),
+    (0xFA41, 'M', u'敏'),
+    (0xFA42, 'M', u'æ—¢'),
+    (0xFA43, 'M', u'æš‘'),
+    (0xFA44, 'M', u'梅'),
+    (0xFA45, 'M', u'æµ·'),
+    (0xFA46, 'M', u'渚'),
+    (0xFA47, 'M', u'æ¼¢'),
+    (0xFA48, 'M', u'ç…®'),
+    (0xFA49, 'M', u'爫'),
+    (0xFA4A, 'M', u'琢'),
+    (0xFA4B, 'M', u'碑'),
+    (0xFA4C, 'M', u'社'),
+    (0xFA4D, 'M', u'祉'),
+    (0xFA4E, 'M', u'祈'),
+    (0xFA4F, 'M', u'祐'),
+    (0xFA50, 'M', u'祖'),
+    (0xFA51, 'M', u'祝'),
+    (0xFA52, 'M', u'禍'),
+    (0xFA53, 'M', u'禎'),
+    (0xFA54, 'M', u'ç©€'),
+    (0xFA55, 'M', u'突'),
+    (0xFA56, 'M', u'節'),
+    (0xFA57, 'M', u'ç·´'),
+    (0xFA58, 'M', u'縉'),
+    (0xFA59, 'M', u'繁'),
+    (0xFA5A, 'M', u'ç½²'),
+    (0xFA5B, 'M', u'者'),
+    (0xFA5C, 'M', u'臭'),
+    (0xFA5D, 'M', u'艹'),
+    (0xFA5F, 'M', u'è‘—'),
+    ]
+
+def _seg_41():
+    return [
+    (0xFA60, 'M', u'褐'),
+    (0xFA61, 'M', u'視'),
+    (0xFA62, 'M', u'謁'),
+    (0xFA63, 'M', u'謹'),
+    (0xFA64, 'M', u'賓'),
+    (0xFA65, 'M', u'è´ˆ'),
+    (0xFA66, 'M', u'è¾¶'),
+    (0xFA67, 'M', u'逸'),
+    (0xFA68, 'M', u'難'),
+    (0xFA69, 'M', u'響'),
+    (0xFA6A, 'M', u'é »'),
+    (0xFA6B, 'M', u'恵'),
+    (0xFA6C, 'M', u'𤋮'),
+    (0xFA6D, 'M', u'舘'),
+    (0xFA6E, 'X'),
+    (0xFA70, 'M', u'並'),
+    (0xFA71, 'M', u'况'),
+    (0xFA72, 'M', u'å…¨'),
+    (0xFA73, 'M', u'ä¾€'),
+    (0xFA74, 'M', u'å……'),
+    (0xFA75, 'M', u'冀'),
+    (0xFA76, 'M', u'勇'),
+    (0xFA77, 'M', u'勺'),
+    (0xFA78, 'M', u'喝'),
+    (0xFA79, 'M', u'å••'),
+    (0xFA7A, 'M', u'å–™'),
+    (0xFA7B, 'M', u'å—¢'),
+    (0xFA7C, 'M', u'塚'),
+    (0xFA7D, 'M', u'墳'),
+    (0xFA7E, 'M', u'奄'),
+    (0xFA7F, 'M', u'奔'),
+    (0xFA80, 'M', u'å©¢'),
+    (0xFA81, 'M', u'嬨'),
+    (0xFA82, 'M', u'å»’'),
+    (0xFA83, 'M', u'å»™'),
+    (0xFA84, 'M', u'彩'),
+    (0xFA85, 'M', u'å¾­'),
+    (0xFA86, 'M', u'惘'),
+    (0xFA87, 'M', u'æ…Ž'),
+    (0xFA88, 'M', u'愈'),
+    (0xFA89, 'M', u'憎'),
+    (0xFA8A, 'M', u'æ… '),
+    (0xFA8B, 'M', u'懲'),
+    (0xFA8C, 'M', u'戴'),
+    (0xFA8D, 'M', u'揄'),
+    (0xFA8E, 'M', u'搜'),
+    (0xFA8F, 'M', u'æ‘’'),
+    (0xFA90, 'M', u'æ•–'),
+    (0xFA91, 'M', u'æ™´'),
+    (0xFA92, 'M', u'朗'),
+    (0xFA93, 'M', u'望'),
+    (0xFA94, 'M', u'杖'),
+    (0xFA95, 'M', u'æ­¹'),
+    (0xFA96, 'M', u'殺'),
+    (0xFA97, 'M', u'流'),
+    (0xFA98, 'M', u'æ»›'),
+    (0xFA99, 'M', u'滋'),
+    (0xFA9A, 'M', u'æ¼¢'),
+    (0xFA9B, 'M', u'瀞'),
+    (0xFA9C, 'M', u'ç…®'),
+    (0xFA9D, 'M', u'çž§'),
+    (0xFA9E, 'M', u'爵'),
+    (0xFA9F, 'M', u'犯'),
+    (0xFAA0, 'M', u'猪'),
+    (0xFAA1, 'M', u'瑱'),
+    (0xFAA2, 'M', u'甆'),
+    (0xFAA3, 'M', u'ç”»'),
+    (0xFAA4, 'M', u'瘝'),
+    (0xFAA5, 'M', u'瘟'),
+    (0xFAA6, 'M', u'益'),
+    (0xFAA7, 'M', u'ç››'),
+    (0xFAA8, 'M', u'ç›´'),
+    (0xFAA9, 'M', u'睊'),
+    (0xFAAA, 'M', u'着'),
+    (0xFAAB, 'M', u'磌'),
+    (0xFAAC, 'M', u'窱'),
+    (0xFAAD, 'M', u'節'),
+    (0xFAAE, 'M', u'ç±»'),
+    (0xFAAF, 'M', u'çµ›'),
+    (0xFAB0, 'M', u'ç·´'),
+    (0xFAB1, 'M', u'ç¼¾'),
+    (0xFAB2, 'M', u'者'),
+    (0xFAB3, 'M', u'荒'),
+    (0xFAB4, 'M', u'華'),
+    (0xFAB5, 'M', u'蝹'),
+    (0xFAB6, 'M', u'襁'),
+    (0xFAB7, 'M', u'覆'),
+    (0xFAB8, 'M', u'視'),
+    (0xFAB9, 'M', u'調'),
+    (0xFABA, 'M', u'諸'),
+    (0xFABB, 'M', u'è«‹'),
+    (0xFABC, 'M', u'謁'),
+    (0xFABD, 'M', u'諾'),
+    (0xFABE, 'M', u'è«­'),
+    (0xFABF, 'M', u'謹'),
+    (0xFAC0, 'M', u'變'),
+    (0xFAC1, 'M', u'è´ˆ'),
+    (0xFAC2, 'M', u'輸'),
+    (0xFAC3, 'M', u'遲'),
+    (0xFAC4, 'M', u'醙'),
+    ]
+
+def _seg_42():
+    return [
+    (0xFAC5, 'M', u'鉶'),
+    (0xFAC6, 'M', u'陼'),
+    (0xFAC7, 'M', u'難'),
+    (0xFAC8, 'M', u'靖'),
+    (0xFAC9, 'M', u'韛'),
+    (0xFACA, 'M', u'響'),
+    (0xFACB, 'M', u'é ‹'),
+    (0xFACC, 'M', u'é »'),
+    (0xFACD, 'M', u'鬒'),
+    (0xFACE, 'M', u'龜'),
+    (0xFACF, 'M', u'𢡊'),
+    (0xFAD0, 'M', u'𢡄'),
+    (0xFAD1, 'M', u'𣏕'),
+    (0xFAD2, 'M', u'㮝'),
+    (0xFAD3, 'M', u'䀘'),
+    (0xFAD4, 'M', u'䀹'),
+    (0xFAD5, 'M', u'𥉉'),
+    (0xFAD6, 'M', u'𥳐'),
+    (0xFAD7, 'M', u'𧻓'),
+    (0xFAD8, 'M', u'齃'),
+    (0xFAD9, 'M', u'龎'),
+    (0xFADA, 'X'),
+    (0xFB00, 'M', u'ff'),
+    (0xFB01, 'M', u'fi'),
+    (0xFB02, 'M', u'fl'),
+    (0xFB03, 'M', u'ffi'),
+    (0xFB04, 'M', u'ffl'),
+    (0xFB05, 'M', u'st'),
+    (0xFB07, 'X'),
+    (0xFB13, 'M', u'Õ´Õ¶'),
+    (0xFB14, 'M', u'Õ´Õ¥'),
+    (0xFB15, 'M', u'Õ´Õ«'),
+    (0xFB16, 'M', u'Õ¾Õ¶'),
+    (0xFB17, 'M', u'Õ´Õ­'),
+    (0xFB18, 'X'),
+    (0xFB1D, 'M', u'×™Ö´'),
+    (0xFB1E, 'V'),
+    (0xFB1F, 'M', u'ײַ'),
+    (0xFB20, 'M', u'×¢'),
+    (0xFB21, 'M', u'א'),
+    (0xFB22, 'M', u'ד'),
+    (0xFB23, 'M', u'×”'),
+    (0xFB24, 'M', u'×›'),
+    (0xFB25, 'M', u'ל'),
+    (0xFB26, 'M', u'ם'),
+    (0xFB27, 'M', u'ר'),
+    (0xFB28, 'M', u'ת'),
+    (0xFB29, '3', u'+'),
+    (0xFB2A, 'M', u'שׁ'),
+    (0xFB2B, 'M', u'שׂ'),
+    (0xFB2C, 'M', u'שּׁ'),
+    (0xFB2D, 'M', u'שּׂ'),
+    (0xFB2E, 'M', u'אַ'),
+    (0xFB2F, 'M', u'אָ'),
+    (0xFB30, 'M', u'אּ'),
+    (0xFB31, 'M', u'בּ'),
+    (0xFB32, 'M', u'×’Ö¼'),
+    (0xFB33, 'M', u'דּ'),
+    (0xFB34, 'M', u'×”Ö¼'),
+    (0xFB35, 'M', u'וּ'),
+    (0xFB36, 'M', u'×–Ö¼'),
+    (0xFB37, 'X'),
+    (0xFB38, 'M', u'טּ'),
+    (0xFB39, 'M', u'×™Ö¼'),
+    (0xFB3A, 'M', u'ךּ'),
+    (0xFB3B, 'M', u'×›Ö¼'),
+    (0xFB3C, 'M', u'לּ'),
+    (0xFB3D, 'X'),
+    (0xFB3E, 'M', u'מּ'),
+    (0xFB3F, 'X'),
+    (0xFB40, 'M', u'× Ö¼'),
+    (0xFB41, 'M', u'סּ'),
+    (0xFB42, 'X'),
+    (0xFB43, 'M', u'×£Ö¼'),
+    (0xFB44, 'M', u'פּ'),
+    (0xFB45, 'X'),
+    (0xFB46, 'M', u'צּ'),
+    (0xFB47, 'M', u'×§Ö¼'),
+    (0xFB48, 'M', u'רּ'),
+    (0xFB49, 'M', u'שּ'),
+    (0xFB4A, 'M', u'תּ'),
+    (0xFB4B, 'M', u'וֹ'),
+    (0xFB4C, 'M', u'בֿ'),
+    (0xFB4D, 'M', u'×›Ö¿'),
+    (0xFB4E, 'M', u'פֿ'),
+    (0xFB4F, 'M', u'אל'),
+    (0xFB50, 'M', u'Ù±'),
+    (0xFB52, 'M', u'Ù»'),
+    (0xFB56, 'M', u'Ù¾'),
+    (0xFB5A, 'M', u'Ú€'),
+    (0xFB5E, 'M', u'Ùº'),
+    (0xFB62, 'M', u'Ù¿'),
+    (0xFB66, 'M', u'Ù¹'),
+    (0xFB6A, 'M', u'Ú¤'),
+    (0xFB6E, 'M', u'Ú¦'),
+    (0xFB72, 'M', u'Ú„'),
+    (0xFB76, 'M', u'Úƒ'),
+    (0xFB7A, 'M', u'Ú†'),
+    (0xFB7E, 'M', u'Ú‡'),
+    (0xFB82, 'M', u'ڍ'),
+    ]
+
+def _seg_43():
+    return [
+    (0xFB84, 'M', u'ڌ'),
+    (0xFB86, 'M', u'ÚŽ'),
+    (0xFB88, 'M', u'Úˆ'),
+    (0xFB8A, 'M', u'Ú˜'),
+    (0xFB8C, 'M', u'Ú‘'),
+    (0xFB8E, 'M', u'Ú©'),
+    (0xFB92, 'M', u'Ú¯'),
+    (0xFB96, 'M', u'Ú³'),
+    (0xFB9A, 'M', u'Ú±'),
+    (0xFB9E, 'M', u'Úº'),
+    (0xFBA0, 'M', u'Ú»'),
+    (0xFBA4, 'M', u'Û€'),
+    (0xFBA6, 'M', u'ہ'),
+    (0xFBAA, 'M', u'Ú¾'),
+    (0xFBAE, 'M', u'Û’'),
+    (0xFBB0, 'M', u'Û“'),
+    (0xFBB2, 'V'),
+    (0xFBC2, 'X'),
+    (0xFBD3, 'M', u'Ú­'),
+    (0xFBD7, 'M', u'Û‡'),
+    (0xFBD9, 'M', u'Û†'),
+    (0xFBDB, 'M', u'Ûˆ'),
+    (0xFBDD, 'M', u'Û‡Ù´'),
+    (0xFBDE, 'M', u'Û‹'),
+    (0xFBE0, 'M', u'Û…'),
+    (0xFBE2, 'M', u'Û‰'),
+    (0xFBE4, 'M', u'ې'),
+    (0xFBE8, 'M', u'Ù‰'),
+    (0xFBEA, 'M', u'ئا'),
+    (0xFBEC, 'M', u'ئە'),
+    (0xFBEE, 'M', u'ئو'),
+    (0xFBF0, 'M', u'ئۇ'),
+    (0xFBF2, 'M', u'ئۆ'),
+    (0xFBF4, 'M', u'ئۈ'),
+    (0xFBF6, 'M', u'ئې'),
+    (0xFBF9, 'M', u'ئى'),
+    (0xFBFC, 'M', u'ی'),
+    (0xFC00, 'M', u'ئج'),
+    (0xFC01, 'M', u'ئح'),
+    (0xFC02, 'M', u'ئم'),
+    (0xFC03, 'M', u'ئى'),
+    (0xFC04, 'M', u'ئي'),
+    (0xFC05, 'M', u'بج'),
+    (0xFC06, 'M', u'بح'),
+    (0xFC07, 'M', u'بخ'),
+    (0xFC08, 'M', u'بم'),
+    (0xFC09, 'M', u'بى'),
+    (0xFC0A, 'M', u'بي'),
+    (0xFC0B, 'M', u'تج'),
+    (0xFC0C, 'M', u'تح'),
+    (0xFC0D, 'M', u'تخ'),
+    (0xFC0E, 'M', u'تم'),
+    (0xFC0F, 'M', u'تى'),
+    (0xFC10, 'M', u'تي'),
+    (0xFC11, 'M', u'ثج'),
+    (0xFC12, 'M', u'ثم'),
+    (0xFC13, 'M', u'ثى'),
+    (0xFC14, 'M', u'ثي'),
+    (0xFC15, 'M', u'جح'),
+    (0xFC16, 'M', u'جم'),
+    (0xFC17, 'M', u'حج'),
+    (0xFC18, 'M', u'حم'),
+    (0xFC19, 'M', u'خج'),
+    (0xFC1A, 'M', u'خح'),
+    (0xFC1B, 'M', u'خم'),
+    (0xFC1C, 'M', u'سج'),
+    (0xFC1D, 'M', u'سح'),
+    (0xFC1E, 'M', u'سخ'),
+    (0xFC1F, 'M', u'سم'),
+    (0xFC20, 'M', u'صح'),
+    (0xFC21, 'M', u'صم'),
+    (0xFC22, 'M', u'ضج'),
+    (0xFC23, 'M', u'ضح'),
+    (0xFC24, 'M', u'ضخ'),
+    (0xFC25, 'M', u'ضم'),
+    (0xFC26, 'M', u'طح'),
+    (0xFC27, 'M', u'طم'),
+    (0xFC28, 'M', u'ظم'),
+    (0xFC29, 'M', u'عج'),
+    (0xFC2A, 'M', u'عم'),
+    (0xFC2B, 'M', u'غج'),
+    (0xFC2C, 'M', u'غم'),
+    (0xFC2D, 'M', u'فج'),
+    (0xFC2E, 'M', u'فح'),
+    (0xFC2F, 'M', u'فخ'),
+    (0xFC30, 'M', u'فم'),
+    (0xFC31, 'M', u'فى'),
+    (0xFC32, 'M', u'في'),
+    (0xFC33, 'M', u'قح'),
+    (0xFC34, 'M', u'قم'),
+    (0xFC35, 'M', u'قى'),
+    (0xFC36, 'M', u'قي'),
+    (0xFC37, 'M', u'كا'),
+    (0xFC38, 'M', u'كج'),
+    (0xFC39, 'M', u'كح'),
+    (0xFC3A, 'M', u'كخ'),
+    (0xFC3B, 'M', u'كل'),
+    (0xFC3C, 'M', u'كم'),
+    (0xFC3D, 'M', u'كى'),
+    (0xFC3E, 'M', u'كي'),
+    ]
+
+def _seg_44():
+    return [
+    (0xFC3F, 'M', u'لج'),
+    (0xFC40, 'M', u'لح'),
+    (0xFC41, 'M', u'لخ'),
+    (0xFC42, 'M', u'لم'),
+    (0xFC43, 'M', u'لى'),
+    (0xFC44, 'M', u'لي'),
+    (0xFC45, 'M', u'مج'),
+    (0xFC46, 'M', u'مح'),
+    (0xFC47, 'M', u'مخ'),
+    (0xFC48, 'M', u'مم'),
+    (0xFC49, 'M', u'مى'),
+    (0xFC4A, 'M', u'مي'),
+    (0xFC4B, 'M', u'نج'),
+    (0xFC4C, 'M', u'نح'),
+    (0xFC4D, 'M', u'نخ'),
+    (0xFC4E, 'M', u'نم'),
+    (0xFC4F, 'M', u'نى'),
+    (0xFC50, 'M', u'ني'),
+    (0xFC51, 'M', u'هج'),
+    (0xFC52, 'M', u'هم'),
+    (0xFC53, 'M', u'هى'),
+    (0xFC54, 'M', u'هي'),
+    (0xFC55, 'M', u'يج'),
+    (0xFC56, 'M', u'يح'),
+    (0xFC57, 'M', u'يخ'),
+    (0xFC58, 'M', u'يم'),
+    (0xFC59, 'M', u'يى'),
+    (0xFC5A, 'M', u'يي'),
+    (0xFC5B, 'M', u'ذٰ'),
+    (0xFC5C, 'M', u'رٰ'),
+    (0xFC5D, 'M', u'ىٰ'),
+    (0xFC5E, '3', u' ٌّ'),
+    (0xFC5F, '3', u' ٍّ'),
+    (0xFC60, '3', u' ÙŽÙ‘'),
+    (0xFC61, '3', u' ُّ'),
+    (0xFC62, '3', u' ِّ'),
+    (0xFC63, '3', u' ّٰ'),
+    (0xFC64, 'M', u'ئر'),
+    (0xFC65, 'M', u'ئز'),
+    (0xFC66, 'M', u'ئم'),
+    (0xFC67, 'M', u'ئن'),
+    (0xFC68, 'M', u'ئى'),
+    (0xFC69, 'M', u'ئي'),
+    (0xFC6A, 'M', u'بر'),
+    (0xFC6B, 'M', u'بز'),
+    (0xFC6C, 'M', u'بم'),
+    (0xFC6D, 'M', u'بن'),
+    (0xFC6E, 'M', u'بى'),
+    (0xFC6F, 'M', u'بي'),
+    (0xFC70, 'M', u'تر'),
+    (0xFC71, 'M', u'تز'),
+    (0xFC72, 'M', u'تم'),
+    (0xFC73, 'M', u'تن'),
+    (0xFC74, 'M', u'تى'),
+    (0xFC75, 'M', u'تي'),
+    (0xFC76, 'M', u'ثر'),
+    (0xFC77, 'M', u'ثز'),
+    (0xFC78, 'M', u'ثم'),
+    (0xFC79, 'M', u'ثن'),
+    (0xFC7A, 'M', u'ثى'),
+    (0xFC7B, 'M', u'ثي'),
+    (0xFC7C, 'M', u'فى'),
+    (0xFC7D, 'M', u'في'),
+    (0xFC7E, 'M', u'قى'),
+    (0xFC7F, 'M', u'قي'),
+    (0xFC80, 'M', u'كا'),
+    (0xFC81, 'M', u'كل'),
+    (0xFC82, 'M', u'كم'),
+    (0xFC83, 'M', u'كى'),
+    (0xFC84, 'M', u'كي'),
+    (0xFC85, 'M', u'لم'),
+    (0xFC86, 'M', u'لى'),
+    (0xFC87, 'M', u'لي'),
+    (0xFC88, 'M', u'ما'),
+    (0xFC89, 'M', u'مم'),
+    (0xFC8A, 'M', u'نر'),
+    (0xFC8B, 'M', u'نز'),
+    (0xFC8C, 'M', u'نم'),
+    (0xFC8D, 'M', u'نن'),
+    (0xFC8E, 'M', u'نى'),
+    (0xFC8F, 'M', u'ني'),
+    (0xFC90, 'M', u'ىٰ'),
+    (0xFC91, 'M', u'ير'),
+    (0xFC92, 'M', u'يز'),
+    (0xFC93, 'M', u'يم'),
+    (0xFC94, 'M', u'ين'),
+    (0xFC95, 'M', u'يى'),
+    (0xFC96, 'M', u'يي'),
+    (0xFC97, 'M', u'ئج'),
+    (0xFC98, 'M', u'ئح'),
+    (0xFC99, 'M', u'ئخ'),
+    (0xFC9A, 'M', u'ئم'),
+    (0xFC9B, 'M', u'ئه'),
+    (0xFC9C, 'M', u'بج'),
+    (0xFC9D, 'M', u'بح'),
+    (0xFC9E, 'M', u'بخ'),
+    (0xFC9F, 'M', u'بم'),
+    (0xFCA0, 'M', u'به'),
+    (0xFCA1, 'M', u'تج'),
+    (0xFCA2, 'M', u'تح'),
+    ]
+
+def _seg_45():
+    return [
+    (0xFCA3, 'M', u'تخ'),
+    (0xFCA4, 'M', u'تم'),
+    (0xFCA5, 'M', u'ته'),
+    (0xFCA6, 'M', u'ثم'),
+    (0xFCA7, 'M', u'جح'),
+    (0xFCA8, 'M', u'جم'),
+    (0xFCA9, 'M', u'حج'),
+    (0xFCAA, 'M', u'حم'),
+    (0xFCAB, 'M', u'خج'),
+    (0xFCAC, 'M', u'خم'),
+    (0xFCAD, 'M', u'سج'),
+    (0xFCAE, 'M', u'سح'),
+    (0xFCAF, 'M', u'سخ'),
+    (0xFCB0, 'M', u'سم'),
+    (0xFCB1, 'M', u'صح'),
+    (0xFCB2, 'M', u'صخ'),
+    (0xFCB3, 'M', u'صم'),
+    (0xFCB4, 'M', u'ضج'),
+    (0xFCB5, 'M', u'ضح'),
+    (0xFCB6, 'M', u'ضخ'),
+    (0xFCB7, 'M', u'ضم'),
+    (0xFCB8, 'M', u'طح'),
+    (0xFCB9, 'M', u'ظم'),
+    (0xFCBA, 'M', u'عج'),
+    (0xFCBB, 'M', u'عم'),
+    (0xFCBC, 'M', u'غج'),
+    (0xFCBD, 'M', u'غم'),
+    (0xFCBE, 'M', u'فج'),
+    (0xFCBF, 'M', u'فح'),
+    (0xFCC0, 'M', u'فخ'),
+    (0xFCC1, 'M', u'فم'),
+    (0xFCC2, 'M', u'قح'),
+    (0xFCC3, 'M', u'قم'),
+    (0xFCC4, 'M', u'كج'),
+    (0xFCC5, 'M', u'كح'),
+    (0xFCC6, 'M', u'كخ'),
+    (0xFCC7, 'M', u'كل'),
+    (0xFCC8, 'M', u'كم'),
+    (0xFCC9, 'M', u'لج'),
+    (0xFCCA, 'M', u'لح'),
+    (0xFCCB, 'M', u'لخ'),
+    (0xFCCC, 'M', u'لم'),
+    (0xFCCD, 'M', u'له'),
+    (0xFCCE, 'M', u'مج'),
+    (0xFCCF, 'M', u'مح'),
+    (0xFCD0, 'M', u'مخ'),
+    (0xFCD1, 'M', u'مم'),
+    (0xFCD2, 'M', u'نج'),
+    (0xFCD3, 'M', u'نح'),
+    (0xFCD4, 'M', u'نخ'),
+    (0xFCD5, 'M', u'نم'),
+    (0xFCD6, 'M', u'نه'),
+    (0xFCD7, 'M', u'هج'),
+    (0xFCD8, 'M', u'هم'),
+    (0xFCD9, 'M', u'هٰ'),
+    (0xFCDA, 'M', u'يج'),
+    (0xFCDB, 'M', u'يح'),
+    (0xFCDC, 'M', u'يخ'),
+    (0xFCDD, 'M', u'يم'),
+    (0xFCDE, 'M', u'يه'),
+    (0xFCDF, 'M', u'ئم'),
+    (0xFCE0, 'M', u'ئه'),
+    (0xFCE1, 'M', u'بم'),
+    (0xFCE2, 'M', u'به'),
+    (0xFCE3, 'M', u'تم'),
+    (0xFCE4, 'M', u'ته'),
+    (0xFCE5, 'M', u'ثم'),
+    (0xFCE6, 'M', u'ثه'),
+    (0xFCE7, 'M', u'سم'),
+    (0xFCE8, 'M', u'سه'),
+    (0xFCE9, 'M', u'شم'),
+    (0xFCEA, 'M', u'شه'),
+    (0xFCEB, 'M', u'كل'),
+    (0xFCEC, 'M', u'كم'),
+    (0xFCED, 'M', u'لم'),
+    (0xFCEE, 'M', u'نم'),
+    (0xFCEF, 'M', u'نه'),
+    (0xFCF0, 'M', u'يم'),
+    (0xFCF1, 'M', u'يه'),
+    (0xFCF2, 'M', u'Ù€ÙŽÙ‘'),
+    (0xFCF3, 'M', u'ـُّ'),
+    (0xFCF4, 'M', u'ـِّ'),
+    (0xFCF5, 'M', u'طى'),
+    (0xFCF6, 'M', u'طي'),
+    (0xFCF7, 'M', u'عى'),
+    (0xFCF8, 'M', u'عي'),
+    (0xFCF9, 'M', u'غى'),
+    (0xFCFA, 'M', u'غي'),
+    (0xFCFB, 'M', u'سى'),
+    (0xFCFC, 'M', u'سي'),
+    (0xFCFD, 'M', u'شى'),
+    (0xFCFE, 'M', u'شي'),
+    (0xFCFF, 'M', u'حى'),
+    (0xFD00, 'M', u'حي'),
+    (0xFD01, 'M', u'جى'),
+    (0xFD02, 'M', u'جي'),
+    (0xFD03, 'M', u'خى'),
+    (0xFD04, 'M', u'خي'),
+    (0xFD05, 'M', u'صى'),
+    (0xFD06, 'M', u'صي'),
+    ]
+
+def _seg_46():
+    return [
+    (0xFD07, 'M', u'ضى'),
+    (0xFD08, 'M', u'ضي'),
+    (0xFD09, 'M', u'شج'),
+    (0xFD0A, 'M', u'شح'),
+    (0xFD0B, 'M', u'شخ'),
+    (0xFD0C, 'M', u'شم'),
+    (0xFD0D, 'M', u'شر'),
+    (0xFD0E, 'M', u'سر'),
+    (0xFD0F, 'M', u'صر'),
+    (0xFD10, 'M', u'ضر'),
+    (0xFD11, 'M', u'طى'),
+    (0xFD12, 'M', u'طي'),
+    (0xFD13, 'M', u'عى'),
+    (0xFD14, 'M', u'عي'),
+    (0xFD15, 'M', u'غى'),
+    (0xFD16, 'M', u'غي'),
+    (0xFD17, 'M', u'سى'),
+    (0xFD18, 'M', u'سي'),
+    (0xFD19, 'M', u'شى'),
+    (0xFD1A, 'M', u'شي'),
+    (0xFD1B, 'M', u'حى'),
+    (0xFD1C, 'M', u'حي'),
+    (0xFD1D, 'M', u'جى'),
+    (0xFD1E, 'M', u'جي'),
+    (0xFD1F, 'M', u'خى'),
+    (0xFD20, 'M', u'خي'),
+    (0xFD21, 'M', u'صى'),
+    (0xFD22, 'M', u'صي'),
+    (0xFD23, 'M', u'ضى'),
+    (0xFD24, 'M', u'ضي'),
+    (0xFD25, 'M', u'شج'),
+    (0xFD26, 'M', u'شح'),
+    (0xFD27, 'M', u'شخ'),
+    (0xFD28, 'M', u'شم'),
+    (0xFD29, 'M', u'شر'),
+    (0xFD2A, 'M', u'سر'),
+    (0xFD2B, 'M', u'صر'),
+    (0xFD2C, 'M', u'ضر'),
+    (0xFD2D, 'M', u'شج'),
+    (0xFD2E, 'M', u'شح'),
+    (0xFD2F, 'M', u'شخ'),
+    (0xFD30, 'M', u'شم'),
+    (0xFD31, 'M', u'سه'),
+    (0xFD32, 'M', u'شه'),
+    (0xFD33, 'M', u'طم'),
+    (0xFD34, 'M', u'سج'),
+    (0xFD35, 'M', u'سح'),
+    (0xFD36, 'M', u'سخ'),
+    (0xFD37, 'M', u'شج'),
+    (0xFD38, 'M', u'شح'),
+    (0xFD39, 'M', u'شخ'),
+    (0xFD3A, 'M', u'طم'),
+    (0xFD3B, 'M', u'ظم'),
+    (0xFD3C, 'M', u'اً'),
+    (0xFD3E, 'V'),
+    (0xFD40, 'X'),
+    (0xFD50, 'M', u'تجم'),
+    (0xFD51, 'M', u'تحج'),
+    (0xFD53, 'M', u'تحم'),
+    (0xFD54, 'M', u'تخم'),
+    (0xFD55, 'M', u'تمج'),
+    (0xFD56, 'M', u'تمح'),
+    (0xFD57, 'M', u'تمخ'),
+    (0xFD58, 'M', u'جمح'),
+    (0xFD5A, 'M', u'حمي'),
+    (0xFD5B, 'M', u'حمى'),
+    (0xFD5C, 'M', u'سحج'),
+    (0xFD5D, 'M', u'سجح'),
+    (0xFD5E, 'M', u'سجى'),
+    (0xFD5F, 'M', u'سمح'),
+    (0xFD61, 'M', u'سمج'),
+    (0xFD62, 'M', u'سمم'),
+    (0xFD64, 'M', u'صحح'),
+    (0xFD66, 'M', u'صمم'),
+    (0xFD67, 'M', u'شحم'),
+    (0xFD69, 'M', u'شجي'),
+    (0xFD6A, 'M', u'شمخ'),
+    (0xFD6C, 'M', u'شمم'),
+    (0xFD6E, 'M', u'ضحى'),
+    (0xFD6F, 'M', u'ضخم'),
+    (0xFD71, 'M', u'طمح'),
+    (0xFD73, 'M', u'طمم'),
+    (0xFD74, 'M', u'طمي'),
+    (0xFD75, 'M', u'عجم'),
+    (0xFD76, 'M', u'عمم'),
+    (0xFD78, 'M', u'عمى'),
+    (0xFD79, 'M', u'غمم'),
+    (0xFD7A, 'M', u'غمي'),
+    (0xFD7B, 'M', u'غمى'),
+    (0xFD7C, 'M', u'فخم'),
+    (0xFD7E, 'M', u'قمح'),
+    (0xFD7F, 'M', u'قمم'),
+    (0xFD80, 'M', u'لحم'),
+    (0xFD81, 'M', u'لحي'),
+    (0xFD82, 'M', u'لحى'),
+    (0xFD83, 'M', u'لجج'),
+    (0xFD85, 'M', u'لخم'),
+    (0xFD87, 'M', u'لمح'),
+    (0xFD89, 'M', u'محج'),
+    (0xFD8A, 'M', u'محم'),
+    ]
+
+def _seg_47():
+    return [
+    (0xFD8B, 'M', u'محي'),
+    (0xFD8C, 'M', u'مجح'),
+    (0xFD8D, 'M', u'مجم'),
+    (0xFD8E, 'M', u'مخج'),
+    (0xFD8F, 'M', u'مخم'),
+    (0xFD90, 'X'),
+    (0xFD92, 'M', u'مجخ'),
+    (0xFD93, 'M', u'همج'),
+    (0xFD94, 'M', u'همم'),
+    (0xFD95, 'M', u'نحم'),
+    (0xFD96, 'M', u'نحى'),
+    (0xFD97, 'M', u'نجم'),
+    (0xFD99, 'M', u'نجى'),
+    (0xFD9A, 'M', u'نمي'),
+    (0xFD9B, 'M', u'نمى'),
+    (0xFD9C, 'M', u'يمم'),
+    (0xFD9E, 'M', u'بخي'),
+    (0xFD9F, 'M', u'تجي'),
+    (0xFDA0, 'M', u'تجى'),
+    (0xFDA1, 'M', u'تخي'),
+    (0xFDA2, 'M', u'تخى'),
+    (0xFDA3, 'M', u'تمي'),
+    (0xFDA4, 'M', u'تمى'),
+    (0xFDA5, 'M', u'جمي'),
+    (0xFDA6, 'M', u'جحى'),
+    (0xFDA7, 'M', u'جمى'),
+    (0xFDA8, 'M', u'سخى'),
+    (0xFDA9, 'M', u'صحي'),
+    (0xFDAA, 'M', u'شحي'),
+    (0xFDAB, 'M', u'ضحي'),
+    (0xFDAC, 'M', u'لجي'),
+    (0xFDAD, 'M', u'لمي'),
+    (0xFDAE, 'M', u'يحي'),
+    (0xFDAF, 'M', u'يجي'),
+    (0xFDB0, 'M', u'يمي'),
+    (0xFDB1, 'M', u'ممي'),
+    (0xFDB2, 'M', u'قمي'),
+    (0xFDB3, 'M', u'نحي'),
+    (0xFDB4, 'M', u'قمح'),
+    (0xFDB5, 'M', u'لحم'),
+    (0xFDB6, 'M', u'عمي'),
+    (0xFDB7, 'M', u'كمي'),
+    (0xFDB8, 'M', u'نجح'),
+    (0xFDB9, 'M', u'مخي'),
+    (0xFDBA, 'M', u'لجم'),
+    (0xFDBB, 'M', u'كمم'),
+    (0xFDBC, 'M', u'لجم'),
+    (0xFDBD, 'M', u'نجح'),
+    (0xFDBE, 'M', u'جحي'),
+    (0xFDBF, 'M', u'حجي'),
+    (0xFDC0, 'M', u'مجي'),
+    (0xFDC1, 'M', u'فمي'),
+    (0xFDC2, 'M', u'بحي'),
+    (0xFDC3, 'M', u'كمم'),
+    (0xFDC4, 'M', u'عجم'),
+    (0xFDC5, 'M', u'صمم'),
+    (0xFDC6, 'M', u'سخي'),
+    (0xFDC7, 'M', u'نجي'),
+    (0xFDC8, 'X'),
+    (0xFDF0, 'M', u'صلے'),
+    (0xFDF1, 'M', u'قلے'),
+    (0xFDF2, 'M', u'الله'),
+    (0xFDF3, 'M', u'اكبر'),
+    (0xFDF4, 'M', u'محمد'),
+    (0xFDF5, 'M', u'صلعم'),
+    (0xFDF6, 'M', u'رسول'),
+    (0xFDF7, 'M', u'عليه'),
+    (0xFDF8, 'M', u'وسلم'),
+    (0xFDF9, 'M', u'صلى'),
+    (0xFDFA, '3', u'صلى الله عليه وسلم'),
+    (0xFDFB, '3', u'جل جلاله'),
+    (0xFDFC, 'M', u'ریال'),
+    (0xFDFD, 'V'),
+    (0xFDFE, 'X'),
+    (0xFE00, 'I'),
+    (0xFE10, '3', u','),
+    (0xFE11, 'M', u'、'),
+    (0xFE12, 'X'),
+    (0xFE13, '3', u':'),
+    (0xFE14, '3', u';'),
+    (0xFE15, '3', u'!'),
+    (0xFE16, '3', u'?'),
+    (0xFE17, 'M', u'〖'),
+    (0xFE18, 'M', u'〗'),
+    (0xFE19, 'X'),
+    (0xFE20, 'V'),
+    (0xFE27, 'X'),
+    (0xFE31, 'M', u'—'),
+    (0xFE32, 'M', u'–'),
+    (0xFE33, '3', u'_'),
+    (0xFE35, '3', u'('),
+    (0xFE36, '3', u')'),
+    (0xFE37, '3', u'{'),
+    (0xFE38, '3', u'}'),
+    (0xFE39, 'M', u'〔'),
+    (0xFE3A, 'M', u'〕'),
+    (0xFE3B, 'M', u'【'),
+    (0xFE3C, 'M', u'】'),
+    (0xFE3D, 'M', u'《'),
+    (0xFE3E, 'M', u'》'),
+    ]
+
+def _seg_48():
+    return [
+    (0xFE3F, 'M', u'〈'),
+    (0xFE40, 'M', u'〉'),
+    (0xFE41, 'M', u'「'),
+    (0xFE42, 'M', u'」'),
+    (0xFE43, 'M', u'『'),
+    (0xFE44, 'M', u'』'),
+    (0xFE45, 'V'),
+    (0xFE47, '3', u'['),
+    (0xFE48, '3', u']'),
+    (0xFE49, '3', u' Ì…'),
+    (0xFE4D, '3', u'_'),
+    (0xFE50, '3', u','),
+    (0xFE51, 'M', u'、'),
+    (0xFE52, 'X'),
+    (0xFE54, '3', u';'),
+    (0xFE55, '3', u':'),
+    (0xFE56, '3', u'?'),
+    (0xFE57, '3', u'!'),
+    (0xFE58, 'M', u'—'),
+    (0xFE59, '3', u'('),
+    (0xFE5A, '3', u')'),
+    (0xFE5B, '3', u'{'),
+    (0xFE5C, '3', u'}'),
+    (0xFE5D, 'M', u'〔'),
+    (0xFE5E, 'M', u'〕'),
+    (0xFE5F, '3', u'#'),
+    (0xFE60, '3', u'&'),
+    (0xFE61, '3', u'*'),
+    (0xFE62, '3', u'+'),
+    (0xFE63, 'M', u'-'),
+    (0xFE64, '3', u'<'),
+    (0xFE65, '3', u'>'),
+    (0xFE66, '3', u'='),
+    (0xFE67, 'X'),
+    (0xFE68, '3', u'\\'),
+    (0xFE69, '3', u'$'),
+    (0xFE6A, '3', u'%'),
+    (0xFE6B, '3', u'@'),
+    (0xFE6C, 'X'),
+    (0xFE70, '3', u' Ù‹'),
+    (0xFE71, 'M', u'ـً'),
+    (0xFE72, '3', u' ٌ'),
+    (0xFE73, 'V'),
+    (0xFE74, '3', u' ٍ'),
+    (0xFE75, 'X'),
+    (0xFE76, '3', u' ÙŽ'),
+    (0xFE77, 'M', u'Ù€ÙŽ'),
+    (0xFE78, '3', u' ُ'),
+    (0xFE79, 'M', u'ـُ'),
+    (0xFE7A, '3', u' ِ'),
+    (0xFE7B, 'M', u'ـِ'),
+    (0xFE7C, '3', u' Ù‘'),
+    (0xFE7D, 'M', u'ـّ'),
+    (0xFE7E, '3', u' Ù’'),
+    (0xFE7F, 'M', u'ـْ'),
+    (0xFE80, 'M', u'Ø¡'),
+    (0xFE81, 'M', u'Ø¢'),
+    (0xFE83, 'M', u'Ø£'),
+    (0xFE85, 'M', u'ؤ'),
+    (0xFE87, 'M', u'Ø¥'),
+    (0xFE89, 'M', u'ئ'),
+    (0xFE8D, 'M', u'ا'),
+    (0xFE8F, 'M', u'ب'),
+    (0xFE93, 'M', u'Ø©'),
+    (0xFE95, 'M', u'ت'),
+    (0xFE99, 'M', u'Ø«'),
+    (0xFE9D, 'M', u'ج'),
+    (0xFEA1, 'M', u'Ø­'),
+    (0xFEA5, 'M', u'Ø®'),
+    (0xFEA9, 'M', u'د'),
+    (0xFEAB, 'M', u'ذ'),
+    (0xFEAD, 'M', u'ر'),
+    (0xFEAF, 'M', u'ز'),
+    (0xFEB1, 'M', u'س'),
+    (0xFEB5, 'M', u'Ø´'),
+    (0xFEB9, 'M', u'ص'),
+    (0xFEBD, 'M', u'ض'),
+    (0xFEC1, 'M', u'Ø·'),
+    (0xFEC5, 'M', u'ظ'),
+    (0xFEC9, 'M', u'ع'),
+    (0xFECD, 'M', u'غ'),
+    (0xFED1, 'M', u'ف'),
+    (0xFED5, 'M', u'Ù‚'),
+    (0xFED9, 'M', u'Ùƒ'),
+    (0xFEDD, 'M', u'Ù„'),
+    (0xFEE1, 'M', u'Ù…'),
+    (0xFEE5, 'M', u'Ù†'),
+    (0xFEE9, 'M', u'Ù‡'),
+    (0xFEED, 'M', u'Ùˆ'),
+    (0xFEEF, 'M', u'Ù‰'),
+    (0xFEF1, 'M', u'ÙŠ'),
+    (0xFEF5, 'M', u'لآ'),
+    (0xFEF7, 'M', u'لأ'),
+    (0xFEF9, 'M', u'لإ'),
+    (0xFEFB, 'M', u'لا'),
+    (0xFEFD, 'X'),
+    (0xFEFF, 'I'),
+    (0xFF00, 'X'),
+    (0xFF01, '3', u'!'),
+    (0xFF02, '3', u'"'),
+    ]
+
+def _seg_49():
+    return [
+    (0xFF03, '3', u'#'),
+    (0xFF04, '3', u'$'),
+    (0xFF05, '3', u'%'),
+    (0xFF06, '3', u'&'),
+    (0xFF07, '3', u'\''),
+    (0xFF08, '3', u'('),
+    (0xFF09, '3', u')'),
+    (0xFF0A, '3', u'*'),
+    (0xFF0B, '3', u'+'),
+    (0xFF0C, '3', u','),
+    (0xFF0D, 'M', u'-'),
+    (0xFF0E, 'M', u'.'),
+    (0xFF0F, '3', u'/'),
+    (0xFF10, 'M', u'0'),
+    (0xFF11, 'M', u'1'),
+    (0xFF12, 'M', u'2'),
+    (0xFF13, 'M', u'3'),
+    (0xFF14, 'M', u'4'),
+    (0xFF15, 'M', u'5'),
+    (0xFF16, 'M', u'6'),
+    (0xFF17, 'M', u'7'),
+    (0xFF18, 'M', u'8'),
+    (0xFF19, 'M', u'9'),
+    (0xFF1A, '3', u':'),
+    (0xFF1B, '3', u';'),
+    (0xFF1C, '3', u'<'),
+    (0xFF1D, '3', u'='),
+    (0xFF1E, '3', u'>'),
+    (0xFF1F, '3', u'?'),
+    (0xFF20, '3', u'@'),
+    (0xFF21, 'M', u'a'),
+    (0xFF22, 'M', u'b'),
+    (0xFF23, 'M', u'c'),
+    (0xFF24, 'M', u'd'),
+    (0xFF25, 'M', u'e'),
+    (0xFF26, 'M', u'f'),
+    (0xFF27, 'M', u'g'),
+    (0xFF28, 'M', u'h'),
+    (0xFF29, 'M', u'i'),
+    (0xFF2A, 'M', u'j'),
+    (0xFF2B, 'M', u'k'),
+    (0xFF2C, 'M', u'l'),
+    (0xFF2D, 'M', u'm'),
+    (0xFF2E, 'M', u'n'),
+    (0xFF2F, 'M', u'o'),
+    (0xFF30, 'M', u'p'),
+    (0xFF31, 'M', u'q'),
+    (0xFF32, 'M', u'r'),
+    (0xFF33, 'M', u's'),
+    (0xFF34, 'M', u't'),
+    (0xFF35, 'M', u'u'),
+    (0xFF36, 'M', u'v'),
+    (0xFF37, 'M', u'w'),
+    (0xFF38, 'M', u'x'),
+    (0xFF39, 'M', u'y'),
+    (0xFF3A, 'M', u'z'),
+    (0xFF3B, '3', u'['),
+    (0xFF3C, '3', u'\\'),
+    (0xFF3D, '3', u']'),
+    (0xFF3E, '3', u'^'),
+    (0xFF3F, '3', u'_'),
+    (0xFF40, '3', u'`'),
+    (0xFF41, 'M', u'a'),
+    (0xFF42, 'M', u'b'),
+    (0xFF43, 'M', u'c'),
+    (0xFF44, 'M', u'd'),
+    (0xFF45, 'M', u'e'),
+    (0xFF46, 'M', u'f'),
+    (0xFF47, 'M', u'g'),
+    (0xFF48, 'M', u'h'),
+    (0xFF49, 'M', u'i'),
+    (0xFF4A, 'M', u'j'),
+    (0xFF4B, 'M', u'k'),
+    (0xFF4C, 'M', u'l'),
+    (0xFF4D, 'M', u'm'),
+    (0xFF4E, 'M', u'n'),
+    (0xFF4F, 'M', u'o'),
+    (0xFF50, 'M', u'p'),
+    (0xFF51, 'M', u'q'),
+    (0xFF52, 'M', u'r'),
+    (0xFF53, 'M', u's'),
+    (0xFF54, 'M', u't'),
+    (0xFF55, 'M', u'u'),
+    (0xFF56, 'M', u'v'),
+    (0xFF57, 'M', u'w'),
+    (0xFF58, 'M', u'x'),
+    (0xFF59, 'M', u'y'),
+    (0xFF5A, 'M', u'z'),
+    (0xFF5B, '3', u'{'),
+    (0xFF5C, '3', u'|'),
+    (0xFF5D, '3', u'}'),
+    (0xFF5E, '3', u'~'),
+    (0xFF5F, 'M', u'⦅'),
+    (0xFF60, 'M', u'⦆'),
+    (0xFF61, 'M', u'.'),
+    (0xFF62, 'M', u'「'),
+    (0xFF63, 'M', u'」'),
+    (0xFF64, 'M', u'、'),
+    (0xFF65, 'M', u'・'),
+    (0xFF66, 'M', u'ヲ'),
+    ]
+
+def _seg_50():
+    return [
+    (0xFF67, 'M', u'ã‚¡'),
+    (0xFF68, 'M', u'ã‚£'),
+    (0xFF69, 'M', u'ã‚¥'),
+    (0xFF6A, 'M', u'ã‚§'),
+    (0xFF6B, 'M', u'ã‚©'),
+    (0xFF6C, 'M', u'ャ'),
+    (0xFF6D, 'M', u'ュ'),
+    (0xFF6E, 'M', u'ョ'),
+    (0xFF6F, 'M', u'ッ'),
+    (0xFF70, 'M', u'ー'),
+    (0xFF71, 'M', u'ã‚¢'),
+    (0xFF72, 'M', u'イ'),
+    (0xFF73, 'M', u'ウ'),
+    (0xFF74, 'M', u'エ'),
+    (0xFF75, 'M', u'オ'),
+    (0xFF76, 'M', u'ã‚«'),
+    (0xFF77, 'M', u'ã‚­'),
+    (0xFF78, 'M', u'ク'),
+    (0xFF79, 'M', u'ケ'),
+    (0xFF7A, 'M', u'コ'),
+    (0xFF7B, 'M', u'サ'),
+    (0xFF7C, 'M', u'ã‚·'),
+    (0xFF7D, 'M', u'ス'),
+    (0xFF7E, 'M', u'ã‚»'),
+    (0xFF7F, 'M', u'ソ'),
+    (0xFF80, 'M', u'ã‚¿'),
+    (0xFF81, 'M', u'チ'),
+    (0xFF82, 'M', u'ツ'),
+    (0xFF83, 'M', u'テ'),
+    (0xFF84, 'M', u'ト'),
+    (0xFF85, 'M', u'ナ'),
+    (0xFF86, 'M', u'ニ'),
+    (0xFF87, 'M', u'ヌ'),
+    (0xFF88, 'M', u'ネ'),
+    (0xFF89, 'M', u'ノ'),
+    (0xFF8A, 'M', u'ハ'),
+    (0xFF8B, 'M', u'ヒ'),
+    (0xFF8C, 'M', u'フ'),
+    (0xFF8D, 'M', u'ヘ'),
+    (0xFF8E, 'M', u'ホ'),
+    (0xFF8F, 'M', u'マ'),
+    (0xFF90, 'M', u'ミ'),
+    (0xFF91, 'M', u'ム'),
+    (0xFF92, 'M', u'メ'),
+    (0xFF93, 'M', u'モ'),
+    (0xFF94, 'M', u'ヤ'),
+    (0xFF95, 'M', u'ユ'),
+    (0xFF96, 'M', u'ヨ'),
+    (0xFF97, 'M', u'ラ'),
+    (0xFF98, 'M', u'リ'),
+    (0xFF99, 'M', u'ル'),
+    (0xFF9A, 'M', u'レ'),
+    (0xFF9B, 'M', u'ロ'),
+    (0xFF9C, 'M', u'ワ'),
+    (0xFF9D, 'M', u'ン'),
+    (0xFF9E, 'M', u'ã‚™'),
+    (0xFF9F, 'M', u'゚'),
+    (0xFFA0, 'X'),
+    (0xFFA1, 'M', u'á„€'),
+    (0xFFA2, 'M', u'ᄁ'),
+    (0xFFA3, 'M', u'ᆪ'),
+    (0xFFA4, 'M', u'á„‚'),
+    (0xFFA5, 'M', u'ᆬ'),
+    (0xFFA6, 'M', u'ᆭ'),
+    (0xFFA7, 'M', u'ᄃ'),
+    (0xFFA8, 'M', u'á„„'),
+    (0xFFA9, 'M', u'á„…'),
+    (0xFFAA, 'M', u'ᆰ'),
+    (0xFFAB, 'M', u'ᆱ'),
+    (0xFFAC, 'M', u'ᆲ'),
+    (0xFFAD, 'M', u'ᆳ'),
+    (0xFFAE, 'M', u'ᆴ'),
+    (0xFFAF, 'M', u'ᆵ'),
+    (0xFFB0, 'M', u'ᄚ'),
+    (0xFFB1, 'M', u'ᄆ'),
+    (0xFFB2, 'M', u'ᄇ'),
+    (0xFFB3, 'M', u'ᄈ'),
+    (0xFFB4, 'M', u'á„¡'),
+    (0xFFB5, 'M', u'ᄉ'),
+    (0xFFB6, 'M', u'ᄊ'),
+    (0xFFB7, 'M', u'á„‹'),
+    (0xFFB8, 'M', u'ᄌ'),
+    (0xFFB9, 'M', u'ᄍ'),
+    (0xFFBA, 'M', u'ᄎ'),
+    (0xFFBB, 'M', u'ᄏ'),
+    (0xFFBC, 'M', u'ᄐ'),
+    (0xFFBD, 'M', u'á„‘'),
+    (0xFFBE, 'M', u'á„’'),
+    (0xFFBF, 'X'),
+    (0xFFC2, 'M', u'á…¡'),
+    (0xFFC3, 'M', u'á…¢'),
+    (0xFFC4, 'M', u'á…£'),
+    (0xFFC5, 'M', u'á…¤'),
+    (0xFFC6, 'M', u'á…¥'),
+    (0xFFC7, 'M', u'á…¦'),
+    (0xFFC8, 'X'),
+    (0xFFCA, 'M', u'á…§'),
+    (0xFFCB, 'M', u'á…¨'),
+    (0xFFCC, 'M', u'á…©'),
+    (0xFFCD, 'M', u'á…ª'),
+    ]
+
+def _seg_51():
+    return [
+    (0xFFCE, 'M', u'á…«'),
+    (0xFFCF, 'M', u'á…¬'),
+    (0xFFD0, 'X'),
+    (0xFFD2, 'M', u'á…­'),
+    (0xFFD3, 'M', u'á…®'),
+    (0xFFD4, 'M', u'á…¯'),
+    (0xFFD5, 'M', u'á…°'),
+    (0xFFD6, 'M', u'á…±'),
+    (0xFFD7, 'M', u'á…²'),
+    (0xFFD8, 'X'),
+    (0xFFDA, 'M', u'á…³'),
+    (0xFFDB, 'M', u'á…´'),
+    (0xFFDC, 'M', u'á…µ'),
+    (0xFFDD, 'X'),
+    (0xFFE0, 'M', u'¢'),
+    (0xFFE1, 'M', u'£'),
+    (0xFFE2, 'M', u'¬'),
+    (0xFFE3, '3', u' Ì„'),
+    (0xFFE4, 'M', u'¦'),
+    (0xFFE5, 'M', u'Â¥'),
+    (0xFFE6, 'M', u'â‚©'),
+    (0xFFE7, 'X'),
+    (0xFFE8, 'M', u'│'),
+    (0xFFE9, 'M', u'←'),
+    (0xFFEA, 'M', u'↑'),
+    (0xFFEB, 'M', u'→'),
+    (0xFFEC, 'M', u'↓'),
+    (0xFFED, 'M', u'â– '),
+    (0xFFEE, 'M', u'â—‹'),
+    (0xFFEF, 'X'),
+    (0x10000, 'V'),
+    (0x1000C, 'X'),
+    (0x1000D, 'V'),
+    (0x10027, 'X'),
+    (0x10028, 'V'),
+    (0x1003B, 'X'),
+    (0x1003C, 'V'),
+    (0x1003E, 'X'),
+    (0x1003F, 'V'),
+    (0x1004E, 'X'),
+    (0x10050, 'V'),
+    (0x1005E, 'X'),
+    (0x10080, 'V'),
+    (0x100FB, 'X'),
+    (0x10100, 'V'),
+    (0x10103, 'X'),
+    (0x10107, 'V'),
+    (0x10134, 'X'),
+    (0x10137, 'V'),
+    (0x1018B, 'X'),
+    (0x10190, 'V'),
+    (0x1019C, 'X'),
+    (0x101D0, 'V'),
+    (0x101FE, 'X'),
+    (0x10280, 'V'),
+    (0x1029D, 'X'),
+    (0x102A0, 'V'),
+    (0x102D1, 'X'),
+    (0x10300, 'V'),
+    (0x1031F, 'X'),
+    (0x10320, 'V'),
+    (0x10324, 'X'),
+    (0x10330, 'V'),
+    (0x1034B, 'X'),
+    (0x10380, 'V'),
+    (0x1039E, 'X'),
+    (0x1039F, 'V'),
+    (0x103C4, 'X'),
+    (0x103C8, 'V'),
+    (0x103D6, 'X'),
+    (0x10400, 'M', u'𐐨'),
+    (0x10401, 'M', u'𐐩'),
+    (0x10402, 'M', u'𐐪'),
+    (0x10403, 'M', u'𐐫'),
+    (0x10404, 'M', u'𐐬'),
+    (0x10405, 'M', u'𐐭'),
+    (0x10406, 'M', u'𐐮'),
+    (0x10407, 'M', u'𐐯'),
+    (0x10408, 'M', u'𐐰'),
+    (0x10409, 'M', u'𐐱'),
+    (0x1040A, 'M', u'𐐲'),
+    (0x1040B, 'M', u'𐐳'),
+    (0x1040C, 'M', u'𐐴'),
+    (0x1040D, 'M', u'𐐵'),
+    (0x1040E, 'M', u'𐐶'),
+    (0x1040F, 'M', u'𐐷'),
+    (0x10410, 'M', u'𐐸'),
+    (0x10411, 'M', u'𐐹'),
+    (0x10412, 'M', u'𐐺'),
+    (0x10413, 'M', u'𐐻'),
+    (0x10414, 'M', u'𐐼'),
+    (0x10415, 'M', u'𐐽'),
+    (0x10416, 'M', u'𐐾'),
+    (0x10417, 'M', u'𐐿'),
+    (0x10418, 'M', u'𐑀'),
+    (0x10419, 'M', u'𐑁'),
+    (0x1041A, 'M', u'𐑂'),
+    (0x1041B, 'M', u'𐑃'),
+    (0x1041C, 'M', u'𐑄'),
+    (0x1041D, 'M', u'𐑅'),
+    ]
+
+def _seg_52():
+    return [
+    (0x1041E, 'M', u'𐑆'),
+    (0x1041F, 'M', u'𐑇'),
+    (0x10420, 'M', u'𐑈'),
+    (0x10421, 'M', u'𐑉'),
+    (0x10422, 'M', u'𐑊'),
+    (0x10423, 'M', u'𐑋'),
+    (0x10424, 'M', u'𐑌'),
+    (0x10425, 'M', u'𐑍'),
+    (0x10426, 'M', u'𐑎'),
+    (0x10427, 'M', u'𐑏'),
+    (0x10428, 'V'),
+    (0x1049E, 'X'),
+    (0x104A0, 'V'),
+    (0x104AA, 'X'),
+    (0x10800, 'V'),
+    (0x10806, 'X'),
+    (0x10808, 'V'),
+    (0x10809, 'X'),
+    (0x1080A, 'V'),
+    (0x10836, 'X'),
+    (0x10837, 'V'),
+    (0x10839, 'X'),
+    (0x1083C, 'V'),
+    (0x1083D, 'X'),
+    (0x1083F, 'V'),
+    (0x10856, 'X'),
+    (0x10857, 'V'),
+    (0x10860, 'X'),
+    (0x10900, 'V'),
+    (0x1091C, 'X'),
+    (0x1091F, 'V'),
+    (0x1093A, 'X'),
+    (0x1093F, 'V'),
+    (0x10940, 'X'),
+    (0x10980, 'V'),
+    (0x109B8, 'X'),
+    (0x109BE, 'V'),
+    (0x109C0, 'X'),
+    (0x10A00, 'V'),
+    (0x10A04, 'X'),
+    (0x10A05, 'V'),
+    (0x10A07, 'X'),
+    (0x10A0C, 'V'),
+    (0x10A14, 'X'),
+    (0x10A15, 'V'),
+    (0x10A18, 'X'),
+    (0x10A19, 'V'),
+    (0x10A34, 'X'),
+    (0x10A38, 'V'),
+    (0x10A3B, 'X'),
+    (0x10A3F, 'V'),
+    (0x10A48, 'X'),
+    (0x10A50, 'V'),
+    (0x10A59, 'X'),
+    (0x10A60, 'V'),
+    (0x10A80, 'X'),
+    (0x10B00, 'V'),
+    (0x10B36, 'X'),
+    (0x10B39, 'V'),
+    (0x10B56, 'X'),
+    (0x10B58, 'V'),
+    (0x10B73, 'X'),
+    (0x10B78, 'V'),
+    (0x10B80, 'X'),
+    (0x10C00, 'V'),
+    (0x10C49, 'X'),
+    (0x10E60, 'V'),
+    (0x10E7F, 'X'),
+    (0x11000, 'V'),
+    (0x1104E, 'X'),
+    (0x11052, 'V'),
+    (0x11070, 'X'),
+    (0x11080, 'V'),
+    (0x110BD, 'X'),
+    (0x110BE, 'V'),
+    (0x110C2, 'X'),
+    (0x110D0, 'V'),
+    (0x110E9, 'X'),
+    (0x110F0, 'V'),
+    (0x110FA, 'X'),
+    (0x11100, 'V'),
+    (0x11135, 'X'),
+    (0x11136, 'V'),
+    (0x11144, 'X'),
+    (0x11180, 'V'),
+    (0x111C9, 'X'),
+    (0x111D0, 'V'),
+    (0x111DA, 'X'),
+    (0x11680, 'V'),
+    (0x116B8, 'X'),
+    (0x116C0, 'V'),
+    (0x116CA, 'X'),
+    (0x12000, 'V'),
+    (0x1236F, 'X'),
+    (0x12400, 'V'),
+    (0x12463, 'X'),
+    (0x12470, 'V'),
+    (0x12474, 'X'),
+    (0x13000, 'V'),
+    (0x1342F, 'X'),
+    ]
+
+def _seg_53():
+    return [
+    (0x16800, 'V'),
+    (0x16A39, 'X'),
+    (0x16F00, 'V'),
+    (0x16F45, 'X'),
+    (0x16F50, 'V'),
+    (0x16F7F, 'X'),
+    (0x16F8F, 'V'),
+    (0x16FA0, 'X'),
+    (0x1B000, 'V'),
+    (0x1B002, 'X'),
+    (0x1D000, 'V'),
+    (0x1D0F6, 'X'),
+    (0x1D100, 'V'),
+    (0x1D127, 'X'),
+    (0x1D129, 'V'),
+    (0x1D15E, 'M', u'𝅗𝅥'),
+    (0x1D15F, 'M', u'𝅘𝅥'),
+    (0x1D160, 'M', u'𝅘𝅥𝅮'),
+    (0x1D161, 'M', u'𝅘𝅥𝅯'),
+    (0x1D162, 'M', u'𝅘𝅥𝅰'),
+    (0x1D163, 'M', u'𝅘𝅥𝅱'),
+    (0x1D164, 'M', u'𝅘𝅥𝅲'),
+    (0x1D165, 'V'),
+    (0x1D173, 'X'),
+    (0x1D17B, 'V'),
+    (0x1D1BB, 'M', u'𝆹𝅥'),
+    (0x1D1BC, 'M', u'𝆺𝅥'),
+    (0x1D1BD, 'M', u'𝆹𝅥𝅮'),
+    (0x1D1BE, 'M', u'𝆺𝅥𝅮'),
+    (0x1D1BF, 'M', u'𝆹𝅥𝅯'),
+    (0x1D1C0, 'M', u'𝆺𝅥𝅯'),
+    (0x1D1C1, 'V'),
+    (0x1D1DE, 'X'),
+    (0x1D200, 'V'),
+    (0x1D246, 'X'),
+    (0x1D300, 'V'),
+    (0x1D357, 'X'),
+    (0x1D360, 'V'),
+    (0x1D372, 'X'),
+    (0x1D400, 'M', u'a'),
+    (0x1D401, 'M', u'b'),
+    (0x1D402, 'M', u'c'),
+    (0x1D403, 'M', u'd'),
+    (0x1D404, 'M', u'e'),
+    (0x1D405, 'M', u'f'),
+    (0x1D406, 'M', u'g'),
+    (0x1D407, 'M', u'h'),
+    (0x1D408, 'M', u'i'),
+    (0x1D409, 'M', u'j'),
+    (0x1D40A, 'M', u'k'),
+    (0x1D40B, 'M', u'l'),
+    (0x1D40C, 'M', u'm'),
+    (0x1D40D, 'M', u'n'),
+    (0x1D40E, 'M', u'o'),
+    (0x1D40F, 'M', u'p'),
+    (0x1D410, 'M', u'q'),
+    (0x1D411, 'M', u'r'),
+    (0x1D412, 'M', u's'),
+    (0x1D413, 'M', u't'),
+    (0x1D414, 'M', u'u'),
+    (0x1D415, 'M', u'v'),
+    (0x1D416, 'M', u'w'),
+    (0x1D417, 'M', u'x'),
+    (0x1D418, 'M', u'y'),
+    (0x1D419, 'M', u'z'),
+    (0x1D41A, 'M', u'a'),
+    (0x1D41B, 'M', u'b'),
+    (0x1D41C, 'M', u'c'),
+    (0x1D41D, 'M', u'd'),
+    (0x1D41E, 'M', u'e'),
+    (0x1D41F, 'M', u'f'),
+    (0x1D420, 'M', u'g'),
+    (0x1D421, 'M', u'h'),
+    (0x1D422, 'M', u'i'),
+    (0x1D423, 'M', u'j'),
+    (0x1D424, 'M', u'k'),
+    (0x1D425, 'M', u'l'),
+    (0x1D426, 'M', u'm'),
+    (0x1D427, 'M', u'n'),
+    (0x1D428, 'M', u'o'),
+    (0x1D429, 'M', u'p'),
+    (0x1D42A, 'M', u'q'),
+    (0x1D42B, 'M', u'r'),
+    (0x1D42C, 'M', u's'),
+    (0x1D42D, 'M', u't'),
+    (0x1D42E, 'M', u'u'),
+    (0x1D42F, 'M', u'v'),
+    (0x1D430, 'M', u'w'),
+    (0x1D431, 'M', u'x'),
+    (0x1D432, 'M', u'y'),
+    (0x1D433, 'M', u'z'),
+    (0x1D434, 'M', u'a'),
+    (0x1D435, 'M', u'b'),
+    (0x1D436, 'M', u'c'),
+    (0x1D437, 'M', u'd'),
+    (0x1D438, 'M', u'e'),
+    (0x1D439, 'M', u'f'),
+    (0x1D43A, 'M', u'g'),
+    (0x1D43B, 'M', u'h'),
+    (0x1D43C, 'M', u'i'),
+    ]
+
+def _seg_54():
+    return [
+    (0x1D43D, 'M', u'j'),
+    (0x1D43E, 'M', u'k'),
+    (0x1D43F, 'M', u'l'),
+    (0x1D440, 'M', u'm'),
+    (0x1D441, 'M', u'n'),
+    (0x1D442, 'M', u'o'),
+    (0x1D443, 'M', u'p'),
+    (0x1D444, 'M', u'q'),
+    (0x1D445, 'M', u'r'),
+    (0x1D446, 'M', u's'),
+    (0x1D447, 'M', u't'),
+    (0x1D448, 'M', u'u'),
+    (0x1D449, 'M', u'v'),
+    (0x1D44A, 'M', u'w'),
+    (0x1D44B, 'M', u'x'),
+    (0x1D44C, 'M', u'y'),
+    (0x1D44D, 'M', u'z'),
+    (0x1D44E, 'M', u'a'),
+    (0x1D44F, 'M', u'b'),
+    (0x1D450, 'M', u'c'),
+    (0x1D451, 'M', u'd'),
+    (0x1D452, 'M', u'e'),
+    (0x1D453, 'M', u'f'),
+    (0x1D454, 'M', u'g'),
+    (0x1D455, 'X'),
+    (0x1D456, 'M', u'i'),
+    (0x1D457, 'M', u'j'),
+    (0x1D458, 'M', u'k'),
+    (0x1D459, 'M', u'l'),
+    (0x1D45A, 'M', u'm'),
+    (0x1D45B, 'M', u'n'),
+    (0x1D45C, 'M', u'o'),
+    (0x1D45D, 'M', u'p'),
+    (0x1D45E, 'M', u'q'),
+    (0x1D45F, 'M', u'r'),
+    (0x1D460, 'M', u's'),
+    (0x1D461, 'M', u't'),
+    (0x1D462, 'M', u'u'),
+    (0x1D463, 'M', u'v'),
+    (0x1D464, 'M', u'w'),
+    (0x1D465, 'M', u'x'),
+    (0x1D466, 'M', u'y'),
+    (0x1D467, 'M', u'z'),
+    (0x1D468, 'M', u'a'),
+    (0x1D469, 'M', u'b'),
+    (0x1D46A, 'M', u'c'),
+    (0x1D46B, 'M', u'd'),
+    (0x1D46C, 'M', u'e'),
+    (0x1D46D, 'M', u'f'),
+    (0x1D46E, 'M', u'g'),
+    (0x1D46F, 'M', u'h'),
+    (0x1D470, 'M', u'i'),
+    (0x1D471, 'M', u'j'),
+    (0x1D472, 'M', u'k'),
+    (0x1D473, 'M', u'l'),
+    (0x1D474, 'M', u'm'),
+    (0x1D475, 'M', u'n'),
+    (0x1D476, 'M', u'o'),
+    (0x1D477, 'M', u'p'),
+    (0x1D478, 'M', u'q'),
+    (0x1D479, 'M', u'r'),
+    (0x1D47A, 'M', u's'),
+    (0x1D47B, 'M', u't'),
+    (0x1D47C, 'M', u'u'),
+    (0x1D47D, 'M', u'v'),
+    (0x1D47E, 'M', u'w'),
+    (0x1D47F, 'M', u'x'),
+    (0x1D480, 'M', u'y'),
+    (0x1D481, 'M', u'z'),
+    (0x1D482, 'M', u'a'),
+    (0x1D483, 'M', u'b'),
+    (0x1D484, 'M', u'c'),
+    (0x1D485, 'M', u'd'),
+    (0x1D486, 'M', u'e'),
+    (0x1D487, 'M', u'f'),
+    (0x1D488, 'M', u'g'),
+    (0x1D489, 'M', u'h'),
+    (0x1D48A, 'M', u'i'),
+    (0x1D48B, 'M', u'j'),
+    (0x1D48C, 'M', u'k'),
+    (0x1D48D, 'M', u'l'),
+    (0x1D48E, 'M', u'm'),
+    (0x1D48F, 'M', u'n'),
+    (0x1D490, 'M', u'o'),
+    (0x1D491, 'M', u'p'),
+    (0x1D492, 'M', u'q'),
+    (0x1D493, 'M', u'r'),
+    (0x1D494, 'M', u's'),
+    (0x1D495, 'M', u't'),
+    (0x1D496, 'M', u'u'),
+    (0x1D497, 'M', u'v'),
+    (0x1D498, 'M', u'w'),
+    (0x1D499, 'M', u'x'),
+    (0x1D49A, 'M', u'y'),
+    (0x1D49B, 'M', u'z'),
+    (0x1D49C, 'M', u'a'),
+    (0x1D49D, 'X'),
+    (0x1D49E, 'M', u'c'),
+    (0x1D49F, 'M', u'd'),
+    (0x1D4A0, 'X'),
+    ]
+
+def _seg_55():
+    return [
+    (0x1D4A2, 'M', u'g'),
+    (0x1D4A3, 'X'),
+    (0x1D4A5, 'M', u'j'),
+    (0x1D4A6, 'M', u'k'),
+    (0x1D4A7, 'X'),
+    (0x1D4A9, 'M', u'n'),
+    (0x1D4AA, 'M', u'o'),
+    (0x1D4AB, 'M', u'p'),
+    (0x1D4AC, 'M', u'q'),
+    (0x1D4AD, 'X'),
+    (0x1D4AE, 'M', u's'),
+    (0x1D4AF, 'M', u't'),
+    (0x1D4B0, 'M', u'u'),
+    (0x1D4B1, 'M', u'v'),
+    (0x1D4B2, 'M', u'w'),
+    (0x1D4B3, 'M', u'x'),
+    (0x1D4B4, 'M', u'y'),
+    (0x1D4B5, 'M', u'z'),
+    (0x1D4B6, 'M', u'a'),
+    (0x1D4B7, 'M', u'b'),
+    (0x1D4B8, 'M', u'c'),
+    (0x1D4B9, 'M', u'd'),
+    (0x1D4BA, 'X'),
+    (0x1D4BB, 'M', u'f'),
+    (0x1D4BC, 'X'),
+    (0x1D4BD, 'M', u'h'),
+    (0x1D4BE, 'M', u'i'),
+    (0x1D4BF, 'M', u'j'),
+    (0x1D4C0, 'M', u'k'),
+    (0x1D4C1, 'M', u'l'),
+    (0x1D4C2, 'M', u'm'),
+    (0x1D4C3, 'M', u'n'),
+    (0x1D4C4, 'X'),
+    (0x1D4C5, 'M', u'p'),
+    (0x1D4C6, 'M', u'q'),
+    (0x1D4C7, 'M', u'r'),
+    (0x1D4C8, 'M', u's'),
+    (0x1D4C9, 'M', u't'),
+    (0x1D4CA, 'M', u'u'),
+    (0x1D4CB, 'M', u'v'),
+    (0x1D4CC, 'M', u'w'),
+    (0x1D4CD, 'M', u'x'),
+    (0x1D4CE, 'M', u'y'),
+    (0x1D4CF, 'M', u'z'),
+    (0x1D4D0, 'M', u'a'),
+    (0x1D4D1, 'M', u'b'),
+    (0x1D4D2, 'M', u'c'),
+    (0x1D4D3, 'M', u'd'),
+    (0x1D4D4, 'M', u'e'),
+    (0x1D4D5, 'M', u'f'),
+    (0x1D4D6, 'M', u'g'),
+    (0x1D4D7, 'M', u'h'),
+    (0x1D4D8, 'M', u'i'),
+    (0x1D4D9, 'M', u'j'),
+    (0x1D4DA, 'M', u'k'),
+    (0x1D4DB, 'M', u'l'),
+    (0x1D4DC, 'M', u'm'),
+    (0x1D4DD, 'M', u'n'),
+    (0x1D4DE, 'M', u'o'),
+    (0x1D4DF, 'M', u'p'),
+    (0x1D4E0, 'M', u'q'),
+    (0x1D4E1, 'M', u'r'),
+    (0x1D4E2, 'M', u's'),
+    (0x1D4E3, 'M', u't'),
+    (0x1D4E4, 'M', u'u'),
+    (0x1D4E5, 'M', u'v'),
+    (0x1D4E6, 'M', u'w'),
+    (0x1D4E7, 'M', u'x'),
+    (0x1D4E8, 'M', u'y'),
+    (0x1D4E9, 'M', u'z'),
+    (0x1D4EA, 'M', u'a'),
+    (0x1D4EB, 'M', u'b'),
+    (0x1D4EC, 'M', u'c'),
+    (0x1D4ED, 'M', u'd'),
+    (0x1D4EE, 'M', u'e'),
+    (0x1D4EF, 'M', u'f'),
+    (0x1D4F0, 'M', u'g'),
+    (0x1D4F1, 'M', u'h'),
+    (0x1D4F2, 'M', u'i'),
+    (0x1D4F3, 'M', u'j'),
+    (0x1D4F4, 'M', u'k'),
+    (0x1D4F5, 'M', u'l'),
+    (0x1D4F6, 'M', u'm'),
+    (0x1D4F7, 'M', u'n'),
+    (0x1D4F8, 'M', u'o'),
+    (0x1D4F9, 'M', u'p'),
+    (0x1D4FA, 'M', u'q'),
+    (0x1D4FB, 'M', u'r'),
+    (0x1D4FC, 'M', u's'),
+    (0x1D4FD, 'M', u't'),
+    (0x1D4FE, 'M', u'u'),
+    (0x1D4FF, 'M', u'v'),
+    (0x1D500, 'M', u'w'),
+    (0x1D501, 'M', u'x'),
+    (0x1D502, 'M', u'y'),
+    (0x1D503, 'M', u'z'),
+    (0x1D504, 'M', u'a'),
+    (0x1D505, 'M', u'b'),
+    (0x1D506, 'X'),
+    (0x1D507, 'M', u'd'),
+    ]
+
+def _seg_56():
+    return [
+    (0x1D508, 'M', u'e'),
+    (0x1D509, 'M', u'f'),
+    (0x1D50A, 'M', u'g'),
+    (0x1D50B, 'X'),
+    (0x1D50D, 'M', u'j'),
+    (0x1D50E, 'M', u'k'),
+    (0x1D50F, 'M', u'l'),
+    (0x1D510, 'M', u'm'),
+    (0x1D511, 'M', u'n'),
+    (0x1D512, 'M', u'o'),
+    (0x1D513, 'M', u'p'),
+    (0x1D514, 'M', u'q'),
+    (0x1D515, 'X'),
+    (0x1D516, 'M', u's'),
+    (0x1D517, 'M', u't'),
+    (0x1D518, 'M', u'u'),
+    (0x1D519, 'M', u'v'),
+    (0x1D51A, 'M', u'w'),
+    (0x1D51B, 'M', u'x'),
+    (0x1D51C, 'M', u'y'),
+    (0x1D51D, 'X'),
+    (0x1D51E, 'M', u'a'),
+    (0x1D51F, 'M', u'b'),
+    (0x1D520, 'M', u'c'),
+    (0x1D521, 'M', u'd'),
+    (0x1D522, 'M', u'e'),
+    (0x1D523, 'M', u'f'),
+    (0x1D524, 'M', u'g'),
+    (0x1D525, 'M', u'h'),
+    (0x1D526, 'M', u'i'),
+    (0x1D527, 'M', u'j'),
+    (0x1D528, 'M', u'k'),
+    (0x1D529, 'M', u'l'),
+    (0x1D52A, 'M', u'm'),
+    (0x1D52B, 'M', u'n'),
+    (0x1D52C, 'M', u'o'),
+    (0x1D52D, 'M', u'p'),
+    (0x1D52E, 'M', u'q'),
+    (0x1D52F, 'M', u'r'),
+    (0x1D530, 'M', u's'),
+    (0x1D531, 'M', u't'),
+    (0x1D532, 'M', u'u'),
+    (0x1D533, 'M', u'v'),
+    (0x1D534, 'M', u'w'),
+    (0x1D535, 'M', u'x'),
+    (0x1D536, 'M', u'y'),
+    (0x1D537, 'M', u'z'),
+    (0x1D538, 'M', u'a'),
+    (0x1D539, 'M', u'b'),
+    (0x1D53A, 'X'),
+    (0x1D53B, 'M', u'd'),
+    (0x1D53C, 'M', u'e'),
+    (0x1D53D, 'M', u'f'),
+    (0x1D53E, 'M', u'g'),
+    (0x1D53F, 'X'),
+    (0x1D540, 'M', u'i'),
+    (0x1D541, 'M', u'j'),
+    (0x1D542, 'M', u'k'),
+    (0x1D543, 'M', u'l'),
+    (0x1D544, 'M', u'm'),
+    (0x1D545, 'X'),
+    (0x1D546, 'M', u'o'),
+    (0x1D547, 'X'),
+    (0x1D54A, 'M', u's'),
+    (0x1D54B, 'M', u't'),
+    (0x1D54C, 'M', u'u'),
+    (0x1D54D, 'M', u'v'),
+    (0x1D54E, 'M', u'w'),
+    (0x1D54F, 'M', u'x'),
+    (0x1D550, 'M', u'y'),
+    (0x1D551, 'X'),
+    (0x1D552, 'M', u'a'),
+    (0x1D553, 'M', u'b'),
+    (0x1D554, 'M', u'c'),
+    (0x1D555, 'M', u'd'),
+    (0x1D556, 'M', u'e'),
+    (0x1D557, 'M', u'f'),
+    (0x1D558, 'M', u'g'),
+    (0x1D559, 'M', u'h'),
+    (0x1D55A, 'M', u'i'),
+    (0x1D55B, 'M', u'j'),
+    (0x1D55C, 'M', u'k'),
+    (0x1D55D, 'M', u'l'),
+    (0x1D55E, 'M', u'm'),
+    (0x1D55F, 'M', u'n'),
+    (0x1D560, 'M', u'o'),
+    (0x1D561, 'M', u'p'),
+    (0x1D562, 'M', u'q'),
+    (0x1D563, 'M', u'r'),
+    (0x1D564, 'M', u's'),
+    (0x1D565, 'M', u't'),
+    (0x1D566, 'M', u'u'),
+    (0x1D567, 'M', u'v'),
+    (0x1D568, 'M', u'w'),
+    (0x1D569, 'M', u'x'),
+    (0x1D56A, 'M', u'y'),
+    (0x1D56B, 'M', u'z'),
+    (0x1D56C, 'M', u'a'),
+    (0x1D56D, 'M', u'b'),
+    (0x1D56E, 'M', u'c'),
+    ]
+
+def _seg_57():
+    return [
+    (0x1D56F, 'M', u'd'),
+    (0x1D570, 'M', u'e'),
+    (0x1D571, 'M', u'f'),
+    (0x1D572, 'M', u'g'),
+    (0x1D573, 'M', u'h'),
+    (0x1D574, 'M', u'i'),
+    (0x1D575, 'M', u'j'),
+    (0x1D576, 'M', u'k'),
+    (0x1D577, 'M', u'l'),
+    (0x1D578, 'M', u'm'),
+    (0x1D579, 'M', u'n'),
+    (0x1D57A, 'M', u'o'),
+    (0x1D57B, 'M', u'p'),
+    (0x1D57C, 'M', u'q'),
+    (0x1D57D, 'M', u'r'),
+    (0x1D57E, 'M', u's'),
+    (0x1D57F, 'M', u't'),
+    (0x1D580, 'M', u'u'),
+    (0x1D581, 'M', u'v'),
+    (0x1D582, 'M', u'w'),
+    (0x1D583, 'M', u'x'),
+    (0x1D584, 'M', u'y'),
+    (0x1D585, 'M', u'z'),
+    (0x1D586, 'M', u'a'),
+    (0x1D587, 'M', u'b'),
+    (0x1D588, 'M', u'c'),
+    (0x1D589, 'M', u'd'),
+    (0x1D58A, 'M', u'e'),
+    (0x1D58B, 'M', u'f'),
+    (0x1D58C, 'M', u'g'),
+    (0x1D58D, 'M', u'h'),
+    (0x1D58E, 'M', u'i'),
+    (0x1D58F, 'M', u'j'),
+    (0x1D590, 'M', u'k'),
+    (0x1D591, 'M', u'l'),
+    (0x1D592, 'M', u'm'),
+    (0x1D593, 'M', u'n'),
+    (0x1D594, 'M', u'o'),
+    (0x1D595, 'M', u'p'),
+    (0x1D596, 'M', u'q'),
+    (0x1D597, 'M', u'r'),
+    (0x1D598, 'M', u's'),
+    (0x1D599, 'M', u't'),
+    (0x1D59A, 'M', u'u'),
+    (0x1D59B, 'M', u'v'),
+    (0x1D59C, 'M', u'w'),
+    (0x1D59D, 'M', u'x'),
+    (0x1D59E, 'M', u'y'),
+    (0x1D59F, 'M', u'z'),
+    (0x1D5A0, 'M', u'a'),
+    (0x1D5A1, 'M', u'b'),
+    (0x1D5A2, 'M', u'c'),
+    (0x1D5A3, 'M', u'd'),
+    (0x1D5A4, 'M', u'e'),
+    (0x1D5A5, 'M', u'f'),
+    (0x1D5A6, 'M', u'g'),
+    (0x1D5A7, 'M', u'h'),
+    (0x1D5A8, 'M', u'i'),
+    (0x1D5A9, 'M', u'j'),
+    (0x1D5AA, 'M', u'k'),
+    (0x1D5AB, 'M', u'l'),
+    (0x1D5AC, 'M', u'm'),
+    (0x1D5AD, 'M', u'n'),
+    (0x1D5AE, 'M', u'o'),
+    (0x1D5AF, 'M', u'p'),
+    (0x1D5B0, 'M', u'q'),
+    (0x1D5B1, 'M', u'r'),
+    (0x1D5B2, 'M', u's'),
+    (0x1D5B3, 'M', u't'),
+    (0x1D5B4, 'M', u'u'),
+    (0x1D5B5, 'M', u'v'),
+    (0x1D5B6, 'M', u'w'),
+    (0x1D5B7, 'M', u'x'),
+    (0x1D5B8, 'M', u'y'),
+    (0x1D5B9, 'M', u'z'),
+    (0x1D5BA, 'M', u'a'),
+    (0x1D5BB, 'M', u'b'),
+    (0x1D5BC, 'M', u'c'),
+    (0x1D5BD, 'M', u'd'),
+    (0x1D5BE, 'M', u'e'),
+    (0x1D5BF, 'M', u'f'),
+    (0x1D5C0, 'M', u'g'),
+    (0x1D5C1, 'M', u'h'),
+    (0x1D5C2, 'M', u'i'),
+    (0x1D5C3, 'M', u'j'),
+    (0x1D5C4, 'M', u'k'),
+    (0x1D5C5, 'M', u'l'),
+    (0x1D5C6, 'M', u'm'),
+    (0x1D5C7, 'M', u'n'),
+    (0x1D5C8, 'M', u'o'),
+    (0x1D5C9, 'M', u'p'),
+    (0x1D5CA, 'M', u'q'),
+    (0x1D5CB, 'M', u'r'),
+    (0x1D5CC, 'M', u's'),
+    (0x1D5CD, 'M', u't'),
+    (0x1D5CE, 'M', u'u'),
+    (0x1D5CF, 'M', u'v'),
+    (0x1D5D0, 'M', u'w'),
+    (0x1D5D1, 'M', u'x'),
+    (0x1D5D2, 'M', u'y'),
+    ]
+
+def _seg_58():
+    return [
+    (0x1D5D3, 'M', u'z'),
+    (0x1D5D4, 'M', u'a'),
+    (0x1D5D5, 'M', u'b'),
+    (0x1D5D6, 'M', u'c'),
+    (0x1D5D7, 'M', u'd'),
+    (0x1D5D8, 'M', u'e'),
+    (0x1D5D9, 'M', u'f'),
+    (0x1D5DA, 'M', u'g'),
+    (0x1D5DB, 'M', u'h'),
+    (0x1D5DC, 'M', u'i'),
+    (0x1D5DD, 'M', u'j'),
+    (0x1D5DE, 'M', u'k'),
+    (0x1D5DF, 'M', u'l'),
+    (0x1D5E0, 'M', u'm'),
+    (0x1D5E1, 'M', u'n'),
+    (0x1D5E2, 'M', u'o'),
+    (0x1D5E3, 'M', u'p'),
+    (0x1D5E4, 'M', u'q'),
+    (0x1D5E5, 'M', u'r'),
+    (0x1D5E6, 'M', u's'),
+    (0x1D5E7, 'M', u't'),
+    (0x1D5E8, 'M', u'u'),
+    (0x1D5E9, 'M', u'v'),
+    (0x1D5EA, 'M', u'w'),
+    (0x1D5EB, 'M', u'x'),
+    (0x1D5EC, 'M', u'y'),
+    (0x1D5ED, 'M', u'z'),
+    (0x1D5EE, 'M', u'a'),
+    (0x1D5EF, 'M', u'b'),
+    (0x1D5F0, 'M', u'c'),
+    (0x1D5F1, 'M', u'd'),
+    (0x1D5F2, 'M', u'e'),
+    (0x1D5F3, 'M', u'f'),
+    (0x1D5F4, 'M', u'g'),
+    (0x1D5F5, 'M', u'h'),
+    (0x1D5F6, 'M', u'i'),
+    (0x1D5F7, 'M', u'j'),
+    (0x1D5F8, 'M', u'k'),
+    (0x1D5F9, 'M', u'l'),
+    (0x1D5FA, 'M', u'm'),
+    (0x1D5FB, 'M', u'n'),
+    (0x1D5FC, 'M', u'o'),
+    (0x1D5FD, 'M', u'p'),
+    (0x1D5FE, 'M', u'q'),
+    (0x1D5FF, 'M', u'r'),
+    (0x1D600, 'M', u's'),
+    (0x1D601, 'M', u't'),
+    (0x1D602, 'M', u'u'),
+    (0x1D603, 'M', u'v'),
+    (0x1D604, 'M', u'w'),
+    (0x1D605, 'M', u'x'),
+    (0x1D606, 'M', u'y'),
+    (0x1D607, 'M', u'z'),
+    (0x1D608, 'M', u'a'),
+    (0x1D609, 'M', u'b'),
+    (0x1D60A, 'M', u'c'),
+    (0x1D60B, 'M', u'd'),
+    (0x1D60C, 'M', u'e'),
+    (0x1D60D, 'M', u'f'),
+    (0x1D60E, 'M', u'g'),
+    (0x1D60F, 'M', u'h'),
+    (0x1D610, 'M', u'i'),
+    (0x1D611, 'M', u'j'),
+    (0x1D612, 'M', u'k'),
+    (0x1D613, 'M', u'l'),
+    (0x1D614, 'M', u'm'),
+    (0x1D615, 'M', u'n'),
+    (0x1D616, 'M', u'o'),
+    (0x1D617, 'M', u'p'),
+    (0x1D618, 'M', u'q'),
+    (0x1D619, 'M', u'r'),
+    (0x1D61A, 'M', u's'),
+    (0x1D61B, 'M', u't'),
+    (0x1D61C, 'M', u'u'),
+    (0x1D61D, 'M', u'v'),
+    (0x1D61E, 'M', u'w'),
+    (0x1D61F, 'M', u'x'),
+    (0x1D620, 'M', u'y'),
+    (0x1D621, 'M', u'z'),
+    (0x1D622, 'M', u'a'),
+    (0x1D623, 'M', u'b'),
+    (0x1D624, 'M', u'c'),
+    (0x1D625, 'M', u'd'),
+    (0x1D626, 'M', u'e'),
+    (0x1D627, 'M', u'f'),
+    (0x1D628, 'M', u'g'),
+    (0x1D629, 'M', u'h'),
+    (0x1D62A, 'M', u'i'),
+    (0x1D62B, 'M', u'j'),
+    (0x1D62C, 'M', u'k'),
+    (0x1D62D, 'M', u'l'),
+    (0x1D62E, 'M', u'm'),
+    (0x1D62F, 'M', u'n'),
+    (0x1D630, 'M', u'o'),
+    (0x1D631, 'M', u'p'),
+    (0x1D632, 'M', u'q'),
+    (0x1D633, 'M', u'r'),
+    (0x1D634, 'M', u's'),
+    (0x1D635, 'M', u't'),
+    (0x1D636, 'M', u'u'),
+    ]
+
+def _seg_59():
+    return [
+    (0x1D637, 'M', u'v'),
+    (0x1D638, 'M', u'w'),
+    (0x1D639, 'M', u'x'),
+    (0x1D63A, 'M', u'y'),
+    (0x1D63B, 'M', u'z'),
+    (0x1D63C, 'M', u'a'),
+    (0x1D63D, 'M', u'b'),
+    (0x1D63E, 'M', u'c'),
+    (0x1D63F, 'M', u'd'),
+    (0x1D640, 'M', u'e'),
+    (0x1D641, 'M', u'f'),
+    (0x1D642, 'M', u'g'),
+    (0x1D643, 'M', u'h'),
+    (0x1D644, 'M', u'i'),
+    (0x1D645, 'M', u'j'),
+    (0x1D646, 'M', u'k'),
+    (0x1D647, 'M', u'l'),
+    (0x1D648, 'M', u'm'),
+    (0x1D649, 'M', u'n'),
+    (0x1D64A, 'M', u'o'),
+    (0x1D64B, 'M', u'p'),
+    (0x1D64C, 'M', u'q'),
+    (0x1D64D, 'M', u'r'),
+    (0x1D64E, 'M', u's'),
+    (0x1D64F, 'M', u't'),
+    (0x1D650, 'M', u'u'),
+    (0x1D651, 'M', u'v'),
+    (0x1D652, 'M', u'w'),
+    (0x1D653, 'M', u'x'),
+    (0x1D654, 'M', u'y'),
+    (0x1D655, 'M', u'z'),
+    (0x1D656, 'M', u'a'),
+    (0x1D657, 'M', u'b'),
+    (0x1D658, 'M', u'c'),
+    (0x1D659, 'M', u'd'),
+    (0x1D65A, 'M', u'e'),
+    (0x1D65B, 'M', u'f'),
+    (0x1D65C, 'M', u'g'),
+    (0x1D65D, 'M', u'h'),
+    (0x1D65E, 'M', u'i'),
+    (0x1D65F, 'M', u'j'),
+    (0x1D660, 'M', u'k'),
+    (0x1D661, 'M', u'l'),
+    (0x1D662, 'M', u'm'),
+    (0x1D663, 'M', u'n'),
+    (0x1D664, 'M', u'o'),
+    (0x1D665, 'M', u'p'),
+    (0x1D666, 'M', u'q'),
+    (0x1D667, 'M', u'r'),
+    (0x1D668, 'M', u's'),
+    (0x1D669, 'M', u't'),
+    (0x1D66A, 'M', u'u'),
+    (0x1D66B, 'M', u'v'),
+    (0x1D66C, 'M', u'w'),
+    (0x1D66D, 'M', u'x'),
+    (0x1D66E, 'M', u'y'),
+    (0x1D66F, 'M', u'z'),
+    (0x1D670, 'M', u'a'),
+    (0x1D671, 'M', u'b'),
+    (0x1D672, 'M', u'c'),
+    (0x1D673, 'M', u'd'),
+    (0x1D674, 'M', u'e'),
+    (0x1D675, 'M', u'f'),
+    (0x1D676, 'M', u'g'),
+    (0x1D677, 'M', u'h'),
+    (0x1D678, 'M', u'i'),
+    (0x1D679, 'M', u'j'),
+    (0x1D67A, 'M', u'k'),
+    (0x1D67B, 'M', u'l'),
+    (0x1D67C, 'M', u'm'),
+    (0x1D67D, 'M', u'n'),
+    (0x1D67E, 'M', u'o'),
+    (0x1D67F, 'M', u'p'),
+    (0x1D680, 'M', u'q'),
+    (0x1D681, 'M', u'r'),
+    (0x1D682, 'M', u's'),
+    (0x1D683, 'M', u't'),
+    (0x1D684, 'M', u'u'),
+    (0x1D685, 'M', u'v'),
+    (0x1D686, 'M', u'w'),
+    (0x1D687, 'M', u'x'),
+    (0x1D688, 'M', u'y'),
+    (0x1D689, 'M', u'z'),
+    (0x1D68A, 'M', u'a'),
+    (0x1D68B, 'M', u'b'),
+    (0x1D68C, 'M', u'c'),
+    (0x1D68D, 'M', u'd'),
+    (0x1D68E, 'M', u'e'),
+    (0x1D68F, 'M', u'f'),
+    (0x1D690, 'M', u'g'),
+    (0x1D691, 'M', u'h'),
+    (0x1D692, 'M', u'i'),
+    (0x1D693, 'M', u'j'),
+    (0x1D694, 'M', u'k'),
+    (0x1D695, 'M', u'l'),
+    (0x1D696, 'M', u'm'),
+    (0x1D697, 'M', u'n'),
+    (0x1D698, 'M', u'o'),
+    (0x1D699, 'M', u'p'),
+    (0x1D69A, 'M', u'q'),
+    ]
+
+def _seg_60():
+    return [
+    (0x1D69B, 'M', u'r'),
+    (0x1D69C, 'M', u's'),
+    (0x1D69D, 'M', u't'),
+    (0x1D69E, 'M', u'u'),
+    (0x1D69F, 'M', u'v'),
+    (0x1D6A0, 'M', u'w'),
+    (0x1D6A1, 'M', u'x'),
+    (0x1D6A2, 'M', u'y'),
+    (0x1D6A3, 'M', u'z'),
+    (0x1D6A4, 'M', u'ı'),
+    (0x1D6A5, 'M', u'È·'),
+    (0x1D6A6, 'X'),
+    (0x1D6A8, 'M', u'α'),
+    (0x1D6A9, 'M', u'β'),
+    (0x1D6AA, 'M', u'γ'),
+    (0x1D6AB, 'M', u'δ'),
+    (0x1D6AC, 'M', u'ε'),
+    (0x1D6AD, 'M', u'ζ'),
+    (0x1D6AE, 'M', u'η'),
+    (0x1D6AF, 'M', u'θ'),
+    (0x1D6B0, 'M', u'ι'),
+    (0x1D6B1, 'M', u'κ'),
+    (0x1D6B2, 'M', u'λ'),
+    (0x1D6B3, 'M', u'μ'),
+    (0x1D6B4, 'M', u'ν'),
+    (0x1D6B5, 'M', u'ξ'),
+    (0x1D6B6, 'M', u'ο'),
+    (0x1D6B7, 'M', u'Ï€'),
+    (0x1D6B8, 'M', u'ρ'),
+    (0x1D6B9, 'M', u'θ'),
+    (0x1D6BA, 'M', u'σ'),
+    (0x1D6BB, 'M', u'Ï„'),
+    (0x1D6BC, 'M', u'Ï…'),
+    (0x1D6BD, 'M', u'φ'),
+    (0x1D6BE, 'M', u'χ'),
+    (0x1D6BF, 'M', u'ψ'),
+    (0x1D6C0, 'M', u'ω'),
+    (0x1D6C1, 'M', u'∇'),
+    (0x1D6C2, 'M', u'α'),
+    (0x1D6C3, 'M', u'β'),
+    (0x1D6C4, 'M', u'γ'),
+    (0x1D6C5, 'M', u'δ'),
+    (0x1D6C6, 'M', u'ε'),
+    (0x1D6C7, 'M', u'ζ'),
+    (0x1D6C8, 'M', u'η'),
+    (0x1D6C9, 'M', u'θ'),
+    (0x1D6CA, 'M', u'ι'),
+    (0x1D6CB, 'M', u'κ'),
+    (0x1D6CC, 'M', u'λ'),
+    (0x1D6CD, 'M', u'μ'),
+    (0x1D6CE, 'M', u'ν'),
+    (0x1D6CF, 'M', u'ξ'),
+    (0x1D6D0, 'M', u'ο'),
+    (0x1D6D1, 'M', u'Ï€'),
+    (0x1D6D2, 'M', u'ρ'),
+    (0x1D6D3, 'M', u'σ'),
+    (0x1D6D5, 'M', u'Ï„'),
+    (0x1D6D6, 'M', u'Ï…'),
+    (0x1D6D7, 'M', u'φ'),
+    (0x1D6D8, 'M', u'χ'),
+    (0x1D6D9, 'M', u'ψ'),
+    (0x1D6DA, 'M', u'ω'),
+    (0x1D6DB, 'M', u'∂'),
+    (0x1D6DC, 'M', u'ε'),
+    (0x1D6DD, 'M', u'θ'),
+    (0x1D6DE, 'M', u'κ'),
+    (0x1D6DF, 'M', u'φ'),
+    (0x1D6E0, 'M', u'ρ'),
+    (0x1D6E1, 'M', u'Ï€'),
+    (0x1D6E2, 'M', u'α'),
+    (0x1D6E3, 'M', u'β'),
+    (0x1D6E4, 'M', u'γ'),
+    (0x1D6E5, 'M', u'δ'),
+    (0x1D6E6, 'M', u'ε'),
+    (0x1D6E7, 'M', u'ζ'),
+    (0x1D6E8, 'M', u'η'),
+    (0x1D6E9, 'M', u'θ'),
+    (0x1D6EA, 'M', u'ι'),
+    (0x1D6EB, 'M', u'κ'),
+    (0x1D6EC, 'M', u'λ'),
+    (0x1D6ED, 'M', u'μ'),
+    (0x1D6EE, 'M', u'ν'),
+    (0x1D6EF, 'M', u'ξ'),
+    (0x1D6F0, 'M', u'ο'),
+    (0x1D6F1, 'M', u'Ï€'),
+    (0x1D6F2, 'M', u'ρ'),
+    (0x1D6F3, 'M', u'θ'),
+    (0x1D6F4, 'M', u'σ'),
+    (0x1D6F5, 'M', u'Ï„'),
+    (0x1D6F6, 'M', u'Ï…'),
+    (0x1D6F7, 'M', u'φ'),
+    (0x1D6F8, 'M', u'χ'),
+    (0x1D6F9, 'M', u'ψ'),
+    (0x1D6FA, 'M', u'ω'),
+    (0x1D6FB, 'M', u'∇'),
+    (0x1D6FC, 'M', u'α'),
+    (0x1D6FD, 'M', u'β'),
+    (0x1D6FE, 'M', u'γ'),
+    (0x1D6FF, 'M', u'δ'),
+    (0x1D700, 'M', u'ε'),
+    ]
+
+def _seg_61():
+    return [
+    (0x1D701, 'M', u'ζ'),
+    (0x1D702, 'M', u'η'),
+    (0x1D703, 'M', u'θ'),
+    (0x1D704, 'M', u'ι'),
+    (0x1D705, 'M', u'κ'),
+    (0x1D706, 'M', u'λ'),
+    (0x1D707, 'M', u'μ'),
+    (0x1D708, 'M', u'ν'),
+    (0x1D709, 'M', u'ξ'),
+    (0x1D70A, 'M', u'ο'),
+    (0x1D70B, 'M', u'Ï€'),
+    (0x1D70C, 'M', u'ρ'),
+    (0x1D70D, 'M', u'σ'),
+    (0x1D70F, 'M', u'Ï„'),
+    (0x1D710, 'M', u'Ï…'),
+    (0x1D711, 'M', u'φ'),
+    (0x1D712, 'M', u'χ'),
+    (0x1D713, 'M', u'ψ'),
+    (0x1D714, 'M', u'ω'),
+    (0x1D715, 'M', u'∂'),
+    (0x1D716, 'M', u'ε'),
+    (0x1D717, 'M', u'θ'),
+    (0x1D718, 'M', u'κ'),
+    (0x1D719, 'M', u'φ'),
+    (0x1D71A, 'M', u'ρ'),
+    (0x1D71B, 'M', u'Ï€'),
+    (0x1D71C, 'M', u'α'),
+    (0x1D71D, 'M', u'β'),
+    (0x1D71E, 'M', u'γ'),
+    (0x1D71F, 'M', u'δ'),
+    (0x1D720, 'M', u'ε'),
+    (0x1D721, 'M', u'ζ'),
+    (0x1D722, 'M', u'η'),
+    (0x1D723, 'M', u'θ'),
+    (0x1D724, 'M', u'ι'),
+    (0x1D725, 'M', u'κ'),
+    (0x1D726, 'M', u'λ'),
+    (0x1D727, 'M', u'μ'),
+    (0x1D728, 'M', u'ν'),
+    (0x1D729, 'M', u'ξ'),
+    (0x1D72A, 'M', u'ο'),
+    (0x1D72B, 'M', u'Ï€'),
+    (0x1D72C, 'M', u'ρ'),
+    (0x1D72D, 'M', u'θ'),
+    (0x1D72E, 'M', u'σ'),
+    (0x1D72F, 'M', u'Ï„'),
+    (0x1D730, 'M', u'Ï…'),
+    (0x1D731, 'M', u'φ'),
+    (0x1D732, 'M', u'χ'),
+    (0x1D733, 'M', u'ψ'),
+    (0x1D734, 'M', u'ω'),
+    (0x1D735, 'M', u'∇'),
+    (0x1D736, 'M', u'α'),
+    (0x1D737, 'M', u'β'),
+    (0x1D738, 'M', u'γ'),
+    (0x1D739, 'M', u'δ'),
+    (0x1D73A, 'M', u'ε'),
+    (0x1D73B, 'M', u'ζ'),
+    (0x1D73C, 'M', u'η'),
+    (0x1D73D, 'M', u'θ'),
+    (0x1D73E, 'M', u'ι'),
+    (0x1D73F, 'M', u'κ'),
+    (0x1D740, 'M', u'λ'),
+    (0x1D741, 'M', u'μ'),
+    (0x1D742, 'M', u'ν'),
+    (0x1D743, 'M', u'ξ'),
+    (0x1D744, 'M', u'ο'),
+    (0x1D745, 'M', u'Ï€'),
+    (0x1D746, 'M', u'ρ'),
+    (0x1D747, 'M', u'σ'),
+    (0x1D749, 'M', u'Ï„'),
+    (0x1D74A, 'M', u'Ï…'),
+    (0x1D74B, 'M', u'φ'),
+    (0x1D74C, 'M', u'χ'),
+    (0x1D74D, 'M', u'ψ'),
+    (0x1D74E, 'M', u'ω'),
+    (0x1D74F, 'M', u'∂'),
+    (0x1D750, 'M', u'ε'),
+    (0x1D751, 'M', u'θ'),
+    (0x1D752, 'M', u'κ'),
+    (0x1D753, 'M', u'φ'),
+    (0x1D754, 'M', u'ρ'),
+    (0x1D755, 'M', u'Ï€'),
+    (0x1D756, 'M', u'α'),
+    (0x1D757, 'M', u'β'),
+    (0x1D758, 'M', u'γ'),
+    (0x1D759, 'M', u'δ'),
+    (0x1D75A, 'M', u'ε'),
+    (0x1D75B, 'M', u'ζ'),
+    (0x1D75C, 'M', u'η'),
+    (0x1D75D, 'M', u'θ'),
+    (0x1D75E, 'M', u'ι'),
+    (0x1D75F, 'M', u'κ'),
+    (0x1D760, 'M', u'λ'),
+    (0x1D761, 'M', u'μ'),
+    (0x1D762, 'M', u'ν'),
+    (0x1D763, 'M', u'ξ'),
+    (0x1D764, 'M', u'ο'),
+    (0x1D765, 'M', u'Ï€'),
+    (0x1D766, 'M', u'ρ'),
+    ]
+
+def _seg_62():
+    return [
+    (0x1D767, 'M', u'θ'),
+    (0x1D768, 'M', u'σ'),
+    (0x1D769, 'M', u'Ï„'),
+    (0x1D76A, 'M', u'Ï…'),
+    (0x1D76B, 'M', u'φ'),
+    (0x1D76C, 'M', u'χ'),
+    (0x1D76D, 'M', u'ψ'),
+    (0x1D76E, 'M', u'ω'),
+    (0x1D76F, 'M', u'∇'),
+    (0x1D770, 'M', u'α'),
+    (0x1D771, 'M', u'β'),
+    (0x1D772, 'M', u'γ'),
+    (0x1D773, 'M', u'δ'),
+    (0x1D774, 'M', u'ε'),
+    (0x1D775, 'M', u'ζ'),
+    (0x1D776, 'M', u'η'),
+    (0x1D777, 'M', u'θ'),
+    (0x1D778, 'M', u'ι'),
+    (0x1D779, 'M', u'κ'),
+    (0x1D77A, 'M', u'λ'),
+    (0x1D77B, 'M', u'μ'),
+    (0x1D77C, 'M', u'ν'),
+    (0x1D77D, 'M', u'ξ'),
+    (0x1D77E, 'M', u'ο'),
+    (0x1D77F, 'M', u'Ï€'),
+    (0x1D780, 'M', u'ρ'),
+    (0x1D781, 'M', u'σ'),
+    (0x1D783, 'M', u'Ï„'),
+    (0x1D784, 'M', u'Ï…'),
+    (0x1D785, 'M', u'φ'),
+    (0x1D786, 'M', u'χ'),
+    (0x1D787, 'M', u'ψ'),
+    (0x1D788, 'M', u'ω'),
+    (0x1D789, 'M', u'∂'),
+    (0x1D78A, 'M', u'ε'),
+    (0x1D78B, 'M', u'θ'),
+    (0x1D78C, 'M', u'κ'),
+    (0x1D78D, 'M', u'φ'),
+    (0x1D78E, 'M', u'ρ'),
+    (0x1D78F, 'M', u'Ï€'),
+    (0x1D790, 'M', u'α'),
+    (0x1D791, 'M', u'β'),
+    (0x1D792, 'M', u'γ'),
+    (0x1D793, 'M', u'δ'),
+    (0x1D794, 'M', u'ε'),
+    (0x1D795, 'M', u'ζ'),
+    (0x1D796, 'M', u'η'),
+    (0x1D797, 'M', u'θ'),
+    (0x1D798, 'M', u'ι'),
+    (0x1D799, 'M', u'κ'),
+    (0x1D79A, 'M', u'λ'),
+    (0x1D79B, 'M', u'μ'),
+    (0x1D79C, 'M', u'ν'),
+    (0x1D79D, 'M', u'ξ'),
+    (0x1D79E, 'M', u'ο'),
+    (0x1D79F, 'M', u'Ï€'),
+    (0x1D7A0, 'M', u'ρ'),
+    (0x1D7A1, 'M', u'θ'),
+    (0x1D7A2, 'M', u'σ'),
+    (0x1D7A3, 'M', u'Ï„'),
+    (0x1D7A4, 'M', u'Ï…'),
+    (0x1D7A5, 'M', u'φ'),
+    (0x1D7A6, 'M', u'χ'),
+    (0x1D7A7, 'M', u'ψ'),
+    (0x1D7A8, 'M', u'ω'),
+    (0x1D7A9, 'M', u'∇'),
+    (0x1D7AA, 'M', u'α'),
+    (0x1D7AB, 'M', u'β'),
+    (0x1D7AC, 'M', u'γ'),
+    (0x1D7AD, 'M', u'δ'),
+    (0x1D7AE, 'M', u'ε'),
+    (0x1D7AF, 'M', u'ζ'),
+    (0x1D7B0, 'M', u'η'),
+    (0x1D7B1, 'M', u'θ'),
+    (0x1D7B2, 'M', u'ι'),
+    (0x1D7B3, 'M', u'κ'),
+    (0x1D7B4, 'M', u'λ'),
+    (0x1D7B5, 'M', u'μ'),
+    (0x1D7B6, 'M', u'ν'),
+    (0x1D7B7, 'M', u'ξ'),
+    (0x1D7B8, 'M', u'ο'),
+    (0x1D7B9, 'M', u'Ï€'),
+    (0x1D7BA, 'M', u'ρ'),
+    (0x1D7BB, 'M', u'σ'),
+    (0x1D7BD, 'M', u'Ï„'),
+    (0x1D7BE, 'M', u'Ï…'),
+    (0x1D7BF, 'M', u'φ'),
+    (0x1D7C0, 'M', u'χ'),
+    (0x1D7C1, 'M', u'ψ'),
+    (0x1D7C2, 'M', u'ω'),
+    (0x1D7C3, 'M', u'∂'),
+    (0x1D7C4, 'M', u'ε'),
+    (0x1D7C5, 'M', u'θ'),
+    (0x1D7C6, 'M', u'κ'),
+    (0x1D7C7, 'M', u'φ'),
+    (0x1D7C8, 'M', u'ρ'),
+    (0x1D7C9, 'M', u'Ï€'),
+    (0x1D7CA, 'M', u'ϝ'),
+    (0x1D7CC, 'X'),
+    (0x1D7CE, 'M', u'0'),
+    ]
+
+def _seg_63():
+    return [
+    (0x1D7CF, 'M', u'1'),
+    (0x1D7D0, 'M', u'2'),
+    (0x1D7D1, 'M', u'3'),
+    (0x1D7D2, 'M', u'4'),
+    (0x1D7D3, 'M', u'5'),
+    (0x1D7D4, 'M', u'6'),
+    (0x1D7D5, 'M', u'7'),
+    (0x1D7D6, 'M', u'8'),
+    (0x1D7D7, 'M', u'9'),
+    (0x1D7D8, 'M', u'0'),
+    (0x1D7D9, 'M', u'1'),
+    (0x1D7DA, 'M', u'2'),
+    (0x1D7DB, 'M', u'3'),
+    (0x1D7DC, 'M', u'4'),
+    (0x1D7DD, 'M', u'5'),
+    (0x1D7DE, 'M', u'6'),
+    (0x1D7DF, 'M', u'7'),
+    (0x1D7E0, 'M', u'8'),
+    (0x1D7E1, 'M', u'9'),
+    (0x1D7E2, 'M', u'0'),
+    (0x1D7E3, 'M', u'1'),
+    (0x1D7E4, 'M', u'2'),
+    (0x1D7E5, 'M', u'3'),
+    (0x1D7E6, 'M', u'4'),
+    (0x1D7E7, 'M', u'5'),
+    (0x1D7E8, 'M', u'6'),
+    (0x1D7E9, 'M', u'7'),
+    (0x1D7EA, 'M', u'8'),
+    (0x1D7EB, 'M', u'9'),
+    (0x1D7EC, 'M', u'0'),
+    (0x1D7ED, 'M', u'1'),
+    (0x1D7EE, 'M', u'2'),
+    (0x1D7EF, 'M', u'3'),
+    (0x1D7F0, 'M', u'4'),
+    (0x1D7F1, 'M', u'5'),
+    (0x1D7F2, 'M', u'6'),
+    (0x1D7F3, 'M', u'7'),
+    (0x1D7F4, 'M', u'8'),
+    (0x1D7F5, 'M', u'9'),
+    (0x1D7F6, 'M', u'0'),
+    (0x1D7F7, 'M', u'1'),
+    (0x1D7F8, 'M', u'2'),
+    (0x1D7F9, 'M', u'3'),
+    (0x1D7FA, 'M', u'4'),
+    (0x1D7FB, 'M', u'5'),
+    (0x1D7FC, 'M', u'6'),
+    (0x1D7FD, 'M', u'7'),
+    (0x1D7FE, 'M', u'8'),
+    (0x1D7FF, 'M', u'9'),
+    (0x1D800, 'X'),
+    (0x1EE00, 'M', u'ا'),
+    (0x1EE01, 'M', u'ب'),
+    (0x1EE02, 'M', u'ج'),
+    (0x1EE03, 'M', u'د'),
+    (0x1EE04, 'X'),
+    (0x1EE05, 'M', u'Ùˆ'),
+    (0x1EE06, 'M', u'ز'),
+    (0x1EE07, 'M', u'Ø­'),
+    (0x1EE08, 'M', u'Ø·'),
+    (0x1EE09, 'M', u'ÙŠ'),
+    (0x1EE0A, 'M', u'Ùƒ'),
+    (0x1EE0B, 'M', u'Ù„'),
+    (0x1EE0C, 'M', u'Ù…'),
+    (0x1EE0D, 'M', u'Ù†'),
+    (0x1EE0E, 'M', u'س'),
+    (0x1EE0F, 'M', u'ع'),
+    (0x1EE10, 'M', u'ف'),
+    (0x1EE11, 'M', u'ص'),
+    (0x1EE12, 'M', u'Ù‚'),
+    (0x1EE13, 'M', u'ر'),
+    (0x1EE14, 'M', u'Ø´'),
+    (0x1EE15, 'M', u'ت'),
+    (0x1EE16, 'M', u'Ø«'),
+    (0x1EE17, 'M', u'Ø®'),
+    (0x1EE18, 'M', u'ذ'),
+    (0x1EE19, 'M', u'ض'),
+    (0x1EE1A, 'M', u'ظ'),
+    (0x1EE1B, 'M', u'غ'),
+    (0x1EE1C, 'M', u'Ù®'),
+    (0x1EE1D, 'M', u'Úº'),
+    (0x1EE1E, 'M', u'Ú¡'),
+    (0x1EE1F, 'M', u'Ù¯'),
+    (0x1EE20, 'X'),
+    (0x1EE21, 'M', u'ب'),
+    (0x1EE22, 'M', u'ج'),
+    (0x1EE23, 'X'),
+    (0x1EE24, 'M', u'Ù‡'),
+    (0x1EE25, 'X'),
+    (0x1EE27, 'M', u'Ø­'),
+    (0x1EE28, 'X'),
+    (0x1EE29, 'M', u'ÙŠ'),
+    (0x1EE2A, 'M', u'Ùƒ'),
+    (0x1EE2B, 'M', u'Ù„'),
+    (0x1EE2C, 'M', u'Ù…'),
+    (0x1EE2D, 'M', u'Ù†'),
+    (0x1EE2E, 'M', u'س'),
+    (0x1EE2F, 'M', u'ع'),
+    (0x1EE30, 'M', u'ف'),
+    (0x1EE31, 'M', u'ص'),
+    (0x1EE32, 'M', u'Ù‚'),
+    ]
+
+def _seg_64():
+    return [
+    (0x1EE33, 'X'),
+    (0x1EE34, 'M', u'Ø´'),
+    (0x1EE35, 'M', u'ت'),
+    (0x1EE36, 'M', u'Ø«'),
+    (0x1EE37, 'M', u'Ø®'),
+    (0x1EE38, 'X'),
+    (0x1EE39, 'M', u'ض'),
+    (0x1EE3A, 'X'),
+    (0x1EE3B, 'M', u'غ'),
+    (0x1EE3C, 'X'),
+    (0x1EE42, 'M', u'ج'),
+    (0x1EE43, 'X'),
+    (0x1EE47, 'M', u'Ø­'),
+    (0x1EE48, 'X'),
+    (0x1EE49, 'M', u'ÙŠ'),
+    (0x1EE4A, 'X'),
+    (0x1EE4B, 'M', u'Ù„'),
+    (0x1EE4C, 'X'),
+    (0x1EE4D, 'M', u'Ù†'),
+    (0x1EE4E, 'M', u'س'),
+    (0x1EE4F, 'M', u'ع'),
+    (0x1EE50, 'X'),
+    (0x1EE51, 'M', u'ص'),
+    (0x1EE52, 'M', u'Ù‚'),
+    (0x1EE53, 'X'),
+    (0x1EE54, 'M', u'Ø´'),
+    (0x1EE55, 'X'),
+    (0x1EE57, 'M', u'Ø®'),
+    (0x1EE58, 'X'),
+    (0x1EE59, 'M', u'ض'),
+    (0x1EE5A, 'X'),
+    (0x1EE5B, 'M', u'غ'),
+    (0x1EE5C, 'X'),
+    (0x1EE5D, 'M', u'Úº'),
+    (0x1EE5E, 'X'),
+    (0x1EE5F, 'M', u'Ù¯'),
+    (0x1EE60, 'X'),
+    (0x1EE61, 'M', u'ب'),
+    (0x1EE62, 'M', u'ج'),
+    (0x1EE63, 'X'),
+    (0x1EE64, 'M', u'Ù‡'),
+    (0x1EE65, 'X'),
+    (0x1EE67, 'M', u'Ø­'),
+    (0x1EE68, 'M', u'Ø·'),
+    (0x1EE69, 'M', u'ÙŠ'),
+    (0x1EE6A, 'M', u'Ùƒ'),
+    (0x1EE6B, 'X'),
+    (0x1EE6C, 'M', u'Ù…'),
+    (0x1EE6D, 'M', u'Ù†'),
+    (0x1EE6E, 'M', u'س'),
+    (0x1EE6F, 'M', u'ع'),
+    (0x1EE70, 'M', u'ف'),
+    (0x1EE71, 'M', u'ص'),
+    (0x1EE72, 'M', u'Ù‚'),
+    (0x1EE73, 'X'),
+    (0x1EE74, 'M', u'Ø´'),
+    (0x1EE75, 'M', u'ت'),
+    (0x1EE76, 'M', u'Ø«'),
+    (0x1EE77, 'M', u'Ø®'),
+    (0x1EE78, 'X'),
+    (0x1EE79, 'M', u'ض'),
+    (0x1EE7A, 'M', u'ظ'),
+    (0x1EE7B, 'M', u'غ'),
+    (0x1EE7C, 'M', u'Ù®'),
+    (0x1EE7D, 'X'),
+    (0x1EE7E, 'M', u'Ú¡'),
+    (0x1EE7F, 'X'),
+    (0x1EE80, 'M', u'ا'),
+    (0x1EE81, 'M', u'ب'),
+    (0x1EE82, 'M', u'ج'),
+    (0x1EE83, 'M', u'د'),
+    (0x1EE84, 'M', u'Ù‡'),
+    (0x1EE85, 'M', u'Ùˆ'),
+    (0x1EE86, 'M', u'ز'),
+    (0x1EE87, 'M', u'Ø­'),
+    (0x1EE88, 'M', u'Ø·'),
+    (0x1EE89, 'M', u'ÙŠ'),
+    (0x1EE8A, 'X'),
+    (0x1EE8B, 'M', u'Ù„'),
+    (0x1EE8C, 'M', u'Ù…'),
+    (0x1EE8D, 'M', u'Ù†'),
+    (0x1EE8E, 'M', u'س'),
+    (0x1EE8F, 'M', u'ع'),
+    (0x1EE90, 'M', u'ف'),
+    (0x1EE91, 'M', u'ص'),
+    (0x1EE92, 'M', u'Ù‚'),
+    (0x1EE93, 'M', u'ر'),
+    (0x1EE94, 'M', u'Ø´'),
+    (0x1EE95, 'M', u'ت'),
+    (0x1EE96, 'M', u'Ø«'),
+    (0x1EE97, 'M', u'Ø®'),
+    (0x1EE98, 'M', u'ذ'),
+    (0x1EE99, 'M', u'ض'),
+    (0x1EE9A, 'M', u'ظ'),
+    (0x1EE9B, 'M', u'غ'),
+    (0x1EE9C, 'X'),
+    (0x1EEA1, 'M', u'ب'),
+    (0x1EEA2, 'M', u'ج'),
+    (0x1EEA3, 'M', u'د'),
+    (0x1EEA4, 'X'),
+    ]
+
+def _seg_65():
+    return [
+    (0x1EEA5, 'M', u'Ùˆ'),
+    (0x1EEA6, 'M', u'ز'),
+    (0x1EEA7, 'M', u'Ø­'),
+    (0x1EEA8, 'M', u'Ø·'),
+    (0x1EEA9, 'M', u'ÙŠ'),
+    (0x1EEAA, 'X'),
+    (0x1EEAB, 'M', u'Ù„'),
+    (0x1EEAC, 'M', u'Ù…'),
+    (0x1EEAD, 'M', u'Ù†'),
+    (0x1EEAE, 'M', u'س'),
+    (0x1EEAF, 'M', u'ع'),
+    (0x1EEB0, 'M', u'ف'),
+    (0x1EEB1, 'M', u'ص'),
+    (0x1EEB2, 'M', u'Ù‚'),
+    (0x1EEB3, 'M', u'ر'),
+    (0x1EEB4, 'M', u'Ø´'),
+    (0x1EEB5, 'M', u'ت'),
+    (0x1EEB6, 'M', u'Ø«'),
+    (0x1EEB7, 'M', u'Ø®'),
+    (0x1EEB8, 'M', u'ذ'),
+    (0x1EEB9, 'M', u'ض'),
+    (0x1EEBA, 'M', u'ظ'),
+    (0x1EEBB, 'M', u'غ'),
+    (0x1EEBC, 'X'),
+    (0x1EEF0, 'V'),
+    (0x1EEF2, 'X'),
+    (0x1F000, 'V'),
+    (0x1F02C, 'X'),
+    (0x1F030, 'V'),
+    (0x1F094, 'X'),
+    (0x1F0A0, 'V'),
+    (0x1F0AF, 'X'),
+    (0x1F0B1, 'V'),
+    (0x1F0BF, 'X'),
+    (0x1F0C1, 'V'),
+    (0x1F0D0, 'X'),
+    (0x1F0D1, 'V'),
+    (0x1F0E0, 'X'),
+    (0x1F101, '3', u'0,'),
+    (0x1F102, '3', u'1,'),
+    (0x1F103, '3', u'2,'),
+    (0x1F104, '3', u'3,'),
+    (0x1F105, '3', u'4,'),
+    (0x1F106, '3', u'5,'),
+    (0x1F107, '3', u'6,'),
+    (0x1F108, '3', u'7,'),
+    (0x1F109, '3', u'8,'),
+    (0x1F10A, '3', u'9,'),
+    (0x1F10B, 'X'),
+    (0x1F110, '3', u'(a)'),
+    (0x1F111, '3', u'(b)'),
+    (0x1F112, '3', u'(c)'),
+    (0x1F113, '3', u'(d)'),
+    (0x1F114, '3', u'(e)'),
+    (0x1F115, '3', u'(f)'),
+    (0x1F116, '3', u'(g)'),
+    (0x1F117, '3', u'(h)'),
+    (0x1F118, '3', u'(i)'),
+    (0x1F119, '3', u'(j)'),
+    (0x1F11A, '3', u'(k)'),
+    (0x1F11B, '3', u'(l)'),
+    (0x1F11C, '3', u'(m)'),
+    (0x1F11D, '3', u'(n)'),
+    (0x1F11E, '3', u'(o)'),
+    (0x1F11F, '3', u'(p)'),
+    (0x1F120, '3', u'(q)'),
+    (0x1F121, '3', u'(r)'),
+    (0x1F122, '3', u'(s)'),
+    (0x1F123, '3', u'(t)'),
+    (0x1F124, '3', u'(u)'),
+    (0x1F125, '3', u'(v)'),
+    (0x1F126, '3', u'(w)'),
+    (0x1F127, '3', u'(x)'),
+    (0x1F128, '3', u'(y)'),
+    (0x1F129, '3', u'(z)'),
+    (0x1F12A, 'M', u'〔s〕'),
+    (0x1F12B, 'M', u'c'),
+    (0x1F12C, 'M', u'r'),
+    (0x1F12D, 'M', u'cd'),
+    (0x1F12E, 'M', u'wz'),
+    (0x1F12F, 'X'),
+    (0x1F130, 'M', u'a'),
+    (0x1F131, 'M', u'b'),
+    (0x1F132, 'M', u'c'),
+    (0x1F133, 'M', u'd'),
+    (0x1F134, 'M', u'e'),
+    (0x1F135, 'M', u'f'),
+    (0x1F136, 'M', u'g'),
+    (0x1F137, 'M', u'h'),
+    (0x1F138, 'M', u'i'),
+    (0x1F139, 'M', u'j'),
+    (0x1F13A, 'M', u'k'),
+    (0x1F13B, 'M', u'l'),
+    (0x1F13C, 'M', u'm'),
+    (0x1F13D, 'M', u'n'),
+    (0x1F13E, 'M', u'o'),
+    (0x1F13F, 'M', u'p'),
+    (0x1F140, 'M', u'q'),
+    (0x1F141, 'M', u'r'),
+    (0x1F142, 'M', u's'),
+    ]
+
+def _seg_66():
+    return [
+    (0x1F143, 'M', u't'),
+    (0x1F144, 'M', u'u'),
+    (0x1F145, 'M', u'v'),
+    (0x1F146, 'M', u'w'),
+    (0x1F147, 'M', u'x'),
+    (0x1F148, 'M', u'y'),
+    (0x1F149, 'M', u'z'),
+    (0x1F14A, 'M', u'hv'),
+    (0x1F14B, 'M', u'mv'),
+    (0x1F14C, 'M', u'sd'),
+    (0x1F14D, 'M', u'ss'),
+    (0x1F14E, 'M', u'ppv'),
+    (0x1F14F, 'M', u'wc'),
+    (0x1F150, 'V'),
+    (0x1F16A, 'M', u'mc'),
+    (0x1F16B, 'M', u'md'),
+    (0x1F16C, 'X'),
+    (0x1F170, 'V'),
+    (0x1F190, 'M', u'dj'),
+    (0x1F191, 'V'),
+    (0x1F19B, 'X'),
+    (0x1F1E6, 'V'),
+    (0x1F200, 'M', u'ほか'),
+    (0x1F201, 'M', u'ココ'),
+    (0x1F202, 'M', u'サ'),
+    (0x1F203, 'X'),
+    (0x1F210, 'M', u'手'),
+    (0x1F211, 'M', u'å­—'),
+    (0x1F212, 'M', u'双'),
+    (0x1F213, 'M', u'デ'),
+    (0x1F214, 'M', u'二'),
+    (0x1F215, 'M', u'多'),
+    (0x1F216, 'M', u'è§£'),
+    (0x1F217, 'M', u'天'),
+    (0x1F218, 'M', u'交'),
+    (0x1F219, 'M', u'映'),
+    (0x1F21A, 'M', u'ç„¡'),
+    (0x1F21B, 'M', u'æ–™'),
+    (0x1F21C, 'M', u'前'),
+    (0x1F21D, 'M', u'後'),
+    (0x1F21E, 'M', u'再'),
+    (0x1F21F, 'M', u'æ–°'),
+    (0x1F220, 'M', u'初'),
+    (0x1F221, 'M', u'終'),
+    (0x1F222, 'M', u'生'),
+    (0x1F223, 'M', u'販'),
+    (0x1F224, 'M', u'声'),
+    (0x1F225, 'M', u'吹'),
+    (0x1F226, 'M', u'æ¼”'),
+    (0x1F227, 'M', u'投'),
+    (0x1F228, 'M', u'捕'),
+    (0x1F229, 'M', u'一'),
+    (0x1F22A, 'M', u'三'),
+    (0x1F22B, 'M', u'遊'),
+    (0x1F22C, 'M', u'å·¦'),
+    (0x1F22D, 'M', u'中'),
+    (0x1F22E, 'M', u'右'),
+    (0x1F22F, 'M', u'指'),
+    (0x1F230, 'M', u'èµ°'),
+    (0x1F231, 'M', u'打'),
+    (0x1F232, 'M', u'禁'),
+    (0x1F233, 'M', u'空'),
+    (0x1F234, 'M', u'合'),
+    (0x1F235, 'M', u'満'),
+    (0x1F236, 'M', u'有'),
+    (0x1F237, 'M', u'月'),
+    (0x1F238, 'M', u'申'),
+    (0x1F239, 'M', u'割'),
+    (0x1F23A, 'M', u'å–¶'),
+    (0x1F23B, 'X'),
+    (0x1F240, 'M', u'〔本〕'),
+    (0x1F241, 'M', u'〔三〕'),
+    (0x1F242, 'M', u'〔二〕'),
+    (0x1F243, 'M', u'〔安〕'),
+    (0x1F244, 'M', u'〔点〕'),
+    (0x1F245, 'M', u'〔打〕'),
+    (0x1F246, 'M', u'〔盗〕'),
+    (0x1F247, 'M', u'〔勝〕'),
+    (0x1F248, 'M', u'〔敗〕'),
+    (0x1F249, 'X'),
+    (0x1F250, 'M', u'å¾—'),
+    (0x1F251, 'M', u'可'),
+    (0x1F252, 'X'),
+    (0x1F300, 'V'),
+    (0x1F321, 'X'),
+    (0x1F330, 'V'),
+    (0x1F336, 'X'),
+    (0x1F337, 'V'),
+    (0x1F37D, 'X'),
+    (0x1F380, 'V'),
+    (0x1F394, 'X'),
+    (0x1F3A0, 'V'),
+    (0x1F3C5, 'X'),
+    (0x1F3C6, 'V'),
+    (0x1F3CB, 'X'),
+    (0x1F3E0, 'V'),
+    (0x1F3F1, 'X'),
+    (0x1F400, 'V'),
+    (0x1F43F, 'X'),
+    (0x1F440, 'V'),
+    ]
+
+def _seg_67():
+    return [
+    (0x1F441, 'X'),
+    (0x1F442, 'V'),
+    (0x1F4F8, 'X'),
+    (0x1F4F9, 'V'),
+    (0x1F4FD, 'X'),
+    (0x1F500, 'V'),
+    (0x1F53E, 'X'),
+    (0x1F540, 'V'),
+    (0x1F544, 'X'),
+    (0x1F550, 'V'),
+    (0x1F568, 'X'),
+    (0x1F5FB, 'V'),
+    (0x1F641, 'X'),
+    (0x1F645, 'V'),
+    (0x1F650, 'X'),
+    (0x1F680, 'V'),
+    (0x1F6C6, 'X'),
+    (0x1F700, 'V'),
+    (0x1F774, 'X'),
+    (0x20000, 'V'),
+    (0x2A6D7, 'X'),
+    (0x2A700, 'V'),
+    (0x2B735, 'X'),
+    (0x2B740, 'V'),
+    (0x2B81E, 'X'),
+    (0x2F800, 'M', u'丽'),
+    (0x2F801, 'M', u'丸'),
+    (0x2F802, 'M', u'乁'),
+    (0x2F803, 'M', u'ð „¢'),
+    (0x2F804, 'M', u'ä½ '),
+    (0x2F805, 'M', u'ä¾®'),
+    (0x2F806, 'M', u'ä¾»'),
+    (0x2F807, 'M', u'倂'),
+    (0x2F808, 'M', u'偺'),
+    (0x2F809, 'M', u'å‚™'),
+    (0x2F80A, 'M', u'僧'),
+    (0x2F80B, 'M', u'像'),
+    (0x2F80C, 'M', u'ã’ž'),
+    (0x2F80D, 'M', u'𠘺'),
+    (0x2F80E, 'M', u'免'),
+    (0x2F80F, 'M', u'å…”'),
+    (0x2F810, 'M', u'å…¤'),
+    (0x2F811, 'M', u'å…·'),
+    (0x2F812, 'M', u'𠔜'),
+    (0x2F813, 'M', u'ã’¹'),
+    (0x2F814, 'M', u'å…§'),
+    (0x2F815, 'M', u'再'),
+    (0x2F816, 'M', u'ð •‹'),
+    (0x2F817, 'M', u'冗'),
+    (0x2F818, 'M', u'冤'),
+    (0x2F819, 'M', u'仌'),
+    (0x2F81A, 'M', u'冬'),
+    (0x2F81B, 'M', u'况'),
+    (0x2F81C, 'M', u'𩇟'),
+    (0x2F81D, 'M', u'凵'),
+    (0x2F81E, 'M', u'刃'),
+    (0x2F81F, 'M', u'㓟'),
+    (0x2F820, 'M', u'刻'),
+    (0x2F821, 'M', u'剆'),
+    (0x2F822, 'M', u'割'),
+    (0x2F823, 'M', u'剷'),
+    (0x2F824, 'M', u'㔕'),
+    (0x2F825, 'M', u'勇'),
+    (0x2F826, 'M', u'勉'),
+    (0x2F827, 'M', u'勤'),
+    (0x2F828, 'M', u'勺'),
+    (0x2F829, 'M', u'包'),
+    (0x2F82A, 'M', u'匆'),
+    (0x2F82B, 'M', u'北'),
+    (0x2F82C, 'M', u'卉'),
+    (0x2F82D, 'M', u'卑'),
+    (0x2F82E, 'M', u'博'),
+    (0x2F82F, 'M', u'即'),
+    (0x2F830, 'M', u'卽'),
+    (0x2F831, 'M', u'卿'),
+    (0x2F834, 'M', u'𠨬'),
+    (0x2F835, 'M', u'灰'),
+    (0x2F836, 'M', u'及'),
+    (0x2F837, 'M', u'叟'),
+    (0x2F838, 'M', u'ð ­£'),
+    (0x2F839, 'M', u'叫'),
+    (0x2F83A, 'M', u'叱'),
+    (0x2F83B, 'M', u'吆'),
+    (0x2F83C, 'M', u'å’ž'),
+    (0x2F83D, 'M', u'吸'),
+    (0x2F83E, 'M', u'呈'),
+    (0x2F83F, 'M', u'周'),
+    (0x2F840, 'M', u'å’¢'),
+    (0x2F841, 'M', u'å“¶'),
+    (0x2F842, 'M', u'唐'),
+    (0x2F843, 'M', u'å•“'),
+    (0x2F844, 'M', u'å•£'),
+    (0x2F845, 'M', u'å–„'),
+    (0x2F847, 'M', u'å–™'),
+    (0x2F848, 'M', u'å–«'),
+    (0x2F849, 'M', u'å–³'),
+    (0x2F84A, 'M', u'å—‚'),
+    (0x2F84B, 'M', u'圖'),
+    (0x2F84C, 'M', u'嘆'),
+    (0x2F84D, 'M', u'圗'),
+    ]
+
+def _seg_68():
+    return [
+    (0x2F84E, 'M', u'噑'),
+    (0x2F84F, 'M', u'å™´'),
+    (0x2F850, 'M', u'切'),
+    (0x2F851, 'M', u'壮'),
+    (0x2F852, 'M', u'城'),
+    (0x2F853, 'M', u'埴'),
+    (0x2F854, 'M', u'堍'),
+    (0x2F855, 'M', u'åž‹'),
+    (0x2F856, 'M', u'å ²'),
+    (0x2F857, 'M', u'å ±'),
+    (0x2F858, 'M', u'墬'),
+    (0x2F859, 'M', u'𡓤'),
+    (0x2F85A, 'M', u'売'),
+    (0x2F85B, 'M', u'壷'),
+    (0x2F85C, 'M', u'夆'),
+    (0x2F85D, 'M', u'多'),
+    (0x2F85E, 'M', u'夢'),
+    (0x2F85F, 'M', u'奢'),
+    (0x2F860, 'M', u'𡚨'),
+    (0x2F861, 'M', u'𡛪'),
+    (0x2F862, 'M', u'姬'),
+    (0x2F863, 'M', u'娛'),
+    (0x2F864, 'M', u'娧'),
+    (0x2F865, 'M', u'姘'),
+    (0x2F866, 'M', u'婦'),
+    (0x2F867, 'M', u'ã›®'),
+    (0x2F868, 'X'),
+    (0x2F869, 'M', u'嬈'),
+    (0x2F86A, 'M', u'嬾'),
+    (0x2F86C, 'M', u'𡧈'),
+    (0x2F86D, 'M', u'寃'),
+    (0x2F86E, 'M', u'寘'),
+    (0x2F86F, 'M', u'寧'),
+    (0x2F870, 'M', u'寳'),
+    (0x2F871, 'M', u'𡬘'),
+    (0x2F872, 'M', u'寿'),
+    (0x2F873, 'M', u'å°†'),
+    (0x2F874, 'X'),
+    (0x2F875, 'M', u'å°¢'),
+    (0x2F876, 'M', u'㞁'),
+    (0x2F877, 'M', u'å± '),
+    (0x2F878, 'M', u'å±®'),
+    (0x2F879, 'M', u'å³€'),
+    (0x2F87A, 'M', u'岍'),
+    (0x2F87B, 'M', u'ð¡·¤'),
+    (0x2F87C, 'M', u'嵃'),
+    (0x2F87D, 'M', u'ð¡·¦'),
+    (0x2F87E, 'M', u'åµ®'),
+    (0x2F87F, 'M', u'嵫'),
+    (0x2F880, 'M', u'åµ¼'),
+    (0x2F881, 'M', u'å·¡'),
+    (0x2F882, 'M', u'å·¢'),
+    (0x2F883, 'M', u'ã ¯'),
+    (0x2F884, 'M', u'å·½'),
+    (0x2F885, 'M', u'帨'),
+    (0x2F886, 'M', u'帽'),
+    (0x2F887, 'M', u'幩'),
+    (0x2F888, 'M', u'ã¡¢'),
+    (0x2F889, 'M', u'𢆃'),
+    (0x2F88A, 'M', u'㡼'),
+    (0x2F88B, 'M', u'庰'),
+    (0x2F88C, 'M', u'庳'),
+    (0x2F88D, 'M', u'庶'),
+    (0x2F88E, 'M', u'廊'),
+    (0x2F88F, 'M', u'𪎒'),
+    (0x2F890, 'M', u'廾'),
+    (0x2F891, 'M', u'𢌱'),
+    (0x2F893, 'M', u'舁'),
+    (0x2F894, 'M', u'å¼¢'),
+    (0x2F896, 'M', u'㣇'),
+    (0x2F897, 'M', u'𣊸'),
+    (0x2F898, 'M', u'𦇚'),
+    (0x2F899, 'M', u'å½¢'),
+    (0x2F89A, 'M', u'彫'),
+    (0x2F89B, 'M', u'㣣'),
+    (0x2F89C, 'M', u'徚'),
+    (0x2F89D, 'M', u'忍'),
+    (0x2F89E, 'M', u'å¿—'),
+    (0x2F89F, 'M', u'忹'),
+    (0x2F8A0, 'M', u'悁'),
+    (0x2F8A1, 'M', u'㤺'),
+    (0x2F8A2, 'M', u'㤜'),
+    (0x2F8A3, 'M', u'æ‚”'),
+    (0x2F8A4, 'M', u'𢛔'),
+    (0x2F8A5, 'M', u'惇'),
+    (0x2F8A6, 'M', u'æ…ˆ'),
+    (0x2F8A7, 'M', u'慌'),
+    (0x2F8A8, 'M', u'æ…Ž'),
+    (0x2F8A9, 'M', u'慌'),
+    (0x2F8AA, 'M', u'æ…º'),
+    (0x2F8AB, 'M', u'憎'),
+    (0x2F8AC, 'M', u'憲'),
+    (0x2F8AD, 'M', u'憤'),
+    (0x2F8AE, 'M', u'憯'),
+    (0x2F8AF, 'M', u'懞'),
+    (0x2F8B0, 'M', u'懲'),
+    (0x2F8B1, 'M', u'懶'),
+    (0x2F8B2, 'M', u'成'),
+    (0x2F8B3, 'M', u'戛'),
+    (0x2F8B4, 'M', u'扝'),
+    ]
+
+def _seg_69():
+    return [
+    (0x2F8B5, 'M', u'抱'),
+    (0x2F8B6, 'M', u'æ‹”'),
+    (0x2F8B7, 'M', u'捐'),
+    (0x2F8B8, 'M', u'𢬌'),
+    (0x2F8B9, 'M', u'挽'),
+    (0x2F8BA, 'M', u'拼'),
+    (0x2F8BB, 'M', u'捨'),
+    (0x2F8BC, 'M', u'掃'),
+    (0x2F8BD, 'M', u'揤'),
+    (0x2F8BE, 'M', u'𢯱'),
+    (0x2F8BF, 'M', u'搢'),
+    (0x2F8C0, 'M', u'揅'),
+    (0x2F8C1, 'M', u'掩'),
+    (0x2F8C2, 'M', u'㨮'),
+    (0x2F8C3, 'M', u'æ‘©'),
+    (0x2F8C4, 'M', u'摾'),
+    (0x2F8C5, 'M', u'撝'),
+    (0x2F8C6, 'M', u'æ‘·'),
+    (0x2F8C7, 'M', u'㩬'),
+    (0x2F8C8, 'M', u'敏'),
+    (0x2F8C9, 'M', u'敬'),
+    (0x2F8CA, 'M', u'𣀊'),
+    (0x2F8CB, 'M', u'æ—£'),
+    (0x2F8CC, 'M', u'書'),
+    (0x2F8CD, 'M', u'晉'),
+    (0x2F8CE, 'M', u'㬙'),
+    (0x2F8CF, 'M', u'æš‘'),
+    (0x2F8D0, 'M', u'㬈'),
+    (0x2F8D1, 'M', u'㫤'),
+    (0x2F8D2, 'M', u'冒'),
+    (0x2F8D3, 'M', u'冕'),
+    (0x2F8D4, 'M', u'最'),
+    (0x2F8D5, 'M', u'暜'),
+    (0x2F8D6, 'M', u'è‚­'),
+    (0x2F8D7, 'M', u'䏙'),
+    (0x2F8D8, 'M', u'朗'),
+    (0x2F8D9, 'M', u'望'),
+    (0x2F8DA, 'M', u'朡'),
+    (0x2F8DB, 'M', u'杞'),
+    (0x2F8DC, 'M', u'杓'),
+    (0x2F8DD, 'M', u'𣏃'),
+    (0x2F8DE, 'M', u'ã­‰'),
+    (0x2F8DF, 'M', u'柺'),
+    (0x2F8E0, 'M', u'æž…'),
+    (0x2F8E1, 'M', u'æ¡’'),
+    (0x2F8E2, 'M', u'梅'),
+    (0x2F8E3, 'M', u'𣑭'),
+    (0x2F8E4, 'M', u'梎'),
+    (0x2F8E5, 'M', u'æ Ÿ'),
+    (0x2F8E6, 'M', u'椔'),
+    (0x2F8E7, 'M', u'㮝'),
+    (0x2F8E8, 'M', u'楂'),
+    (0x2F8E9, 'M', u'榣'),
+    (0x2F8EA, 'M', u'槪'),
+    (0x2F8EB, 'M', u'檨'),
+    (0x2F8EC, 'M', u'𣚣'),
+    (0x2F8ED, 'M', u'æ«›'),
+    (0x2F8EE, 'M', u'ã°˜'),
+    (0x2F8EF, 'M', u'次'),
+    (0x2F8F0, 'M', u'𣢧'),
+    (0x2F8F1, 'M', u'æ­”'),
+    (0x2F8F2, 'M', u'㱎'),
+    (0x2F8F3, 'M', u'æ­²'),
+    (0x2F8F4, 'M', u'殟'),
+    (0x2F8F5, 'M', u'殺'),
+    (0x2F8F6, 'M', u'æ®»'),
+    (0x2F8F7, 'M', u'𣪍'),
+    (0x2F8F8, 'M', u'ð¡´‹'),
+    (0x2F8F9, 'M', u'𣫺'),
+    (0x2F8FA, 'M', u'汎'),
+    (0x2F8FB, 'M', u'𣲼'),
+    (0x2F8FC, 'M', u'沿'),
+    (0x2F8FD, 'M', u'泍'),
+    (0x2F8FE, 'M', u'æ±§'),
+    (0x2F8FF, 'M', u'æ´–'),
+    (0x2F900, 'M', u'æ´¾'),
+    (0x2F901, 'M', u'æµ·'),
+    (0x2F902, 'M', u'流'),
+    (0x2F903, 'M', u'浩'),
+    (0x2F904, 'M', u'浸'),
+    (0x2F905, 'M', u'æ¶…'),
+    (0x2F906, 'M', u'𣴞'),
+    (0x2F907, 'M', u'æ´´'),
+    (0x2F908, 'M', u'港'),
+    (0x2F909, 'M', u'æ¹®'),
+    (0x2F90A, 'M', u'ã´³'),
+    (0x2F90B, 'M', u'滋'),
+    (0x2F90C, 'M', u'滇'),
+    (0x2F90D, 'M', u'𣻑'),
+    (0x2F90E, 'M', u'æ·¹'),
+    (0x2F90F, 'M', u'æ½®'),
+    (0x2F910, 'M', u'𣽞'),
+    (0x2F911, 'M', u'𣾎'),
+    (0x2F912, 'M', u'濆'),
+    (0x2F913, 'M', u'瀹'),
+    (0x2F914, 'M', u'瀞'),
+    (0x2F915, 'M', u'瀛'),
+    (0x2F916, 'M', u'ã¶–'),
+    (0x2F917, 'M', u'灊'),
+    (0x2F918, 'M', u'災'),
+    ]
+
+def _seg_70():
+    return [
+    (0x2F919, 'M', u'灷'),
+    (0x2F91A, 'M', u'ç‚­'),
+    (0x2F91B, 'M', u'𠔥'),
+    (0x2F91C, 'M', u'ç……'),
+    (0x2F91D, 'M', u'𤉣'),
+    (0x2F91E, 'M', u'熜'),
+    (0x2F91F, 'X'),
+    (0x2F920, 'M', u'爨'),
+    (0x2F921, 'M', u'爵'),
+    (0x2F922, 'M', u'牐'),
+    (0x2F923, 'M', u'𤘈'),
+    (0x2F924, 'M', u'犀'),
+    (0x2F925, 'M', u'犕'),
+    (0x2F926, 'M', u'𤜵'),
+    (0x2F927, 'M', u'𤠔'),
+    (0x2F928, 'M', u'獺'),
+    (0x2F929, 'M', u'王'),
+    (0x2F92A, 'M', u'㺬'),
+    (0x2F92B, 'M', u'玥'),
+    (0x2F92C, 'M', u'㺸'),
+    (0x2F92E, 'M', u'瑇'),
+    (0x2F92F, 'M', u'瑜'),
+    (0x2F930, 'M', u'瑱'),
+    (0x2F931, 'M', u'ç’…'),
+    (0x2F932, 'M', u'瓊'),
+    (0x2F933, 'M', u'ã¼›'),
+    (0x2F934, 'M', u'甤'),
+    (0x2F935, 'M', u'𤰶'),
+    (0x2F936, 'M', u'甾'),
+    (0x2F937, 'M', u'𤲒'),
+    (0x2F938, 'M', u'ç•°'),
+    (0x2F939, 'M', u'𢆟'),
+    (0x2F93A, 'M', u'瘐'),
+    (0x2F93B, 'M', u'𤾡'),
+    (0x2F93C, 'M', u'𤾸'),
+    (0x2F93D, 'M', u'𥁄'),
+    (0x2F93E, 'M', u'㿼'),
+    (0x2F93F, 'M', u'䀈'),
+    (0x2F940, 'M', u'ç›´'),
+    (0x2F941, 'M', u'𥃳'),
+    (0x2F942, 'M', u'𥃲'),
+    (0x2F943, 'M', u'𥄙'),
+    (0x2F944, 'M', u'𥄳'),
+    (0x2F945, 'M', u'眞'),
+    (0x2F946, 'M', u'真'),
+    (0x2F948, 'M', u'睊'),
+    (0x2F949, 'M', u'䀹'),
+    (0x2F94A, 'M', u'çž‹'),
+    (0x2F94B, 'M', u'䁆'),
+    (0x2F94C, 'M', u'ä‚–'),
+    (0x2F94D, 'M', u'𥐝'),
+    (0x2F94E, 'M', u'硎'),
+    (0x2F94F, 'M', u'碌'),
+    (0x2F950, 'M', u'磌'),
+    (0x2F951, 'M', u'䃣'),
+    (0x2F952, 'M', u'𥘦'),
+    (0x2F953, 'M', u'祖'),
+    (0x2F954, 'M', u'𥚚'),
+    (0x2F955, 'M', u'𥛅'),
+    (0x2F956, 'M', u'福'),
+    (0x2F957, 'M', u'ç§«'),
+    (0x2F958, 'M', u'䄯'),
+    (0x2F959, 'M', u'ç©€'),
+    (0x2F95A, 'M', u'穊'),
+    (0x2F95B, 'M', u'穏'),
+    (0x2F95C, 'M', u'𥥼'),
+    (0x2F95D, 'M', u'𥪧'),
+    (0x2F95F, 'X'),
+    (0x2F960, 'M', u'䈂'),
+    (0x2F961, 'M', u'𥮫'),
+    (0x2F962, 'M', u'篆'),
+    (0x2F963, 'M', u'築'),
+    (0x2F964, 'M', u'䈧'),
+    (0x2F965, 'M', u'𥲀'),
+    (0x2F966, 'M', u'ç³’'),
+    (0x2F967, 'M', u'䊠'),
+    (0x2F968, 'M', u'糨'),
+    (0x2F969, 'M', u'ç³£'),
+    (0x2F96A, 'M', u'ç´€'),
+    (0x2F96B, 'M', u'𥾆'),
+    (0x2F96C, 'M', u'çµ£'),
+    (0x2F96D, 'M', u'䌁'),
+    (0x2F96E, 'M', u'ç·‡'),
+    (0x2F96F, 'M', u'縂'),
+    (0x2F970, 'M', u'ç¹…'),
+    (0x2F971, 'M', u'䌴'),
+    (0x2F972, 'M', u'𦈨'),
+    (0x2F973, 'M', u'𦉇'),
+    (0x2F974, 'M', u'䍙'),
+    (0x2F975, 'M', u'𦋙'),
+    (0x2F976, 'M', u'罺'),
+    (0x2F977, 'M', u'𦌾'),
+    (0x2F978, 'M', u'羕'),
+    (0x2F979, 'M', u'翺'),
+    (0x2F97A, 'M', u'者'),
+    (0x2F97B, 'M', u'𦓚'),
+    (0x2F97C, 'M', u'𦔣'),
+    (0x2F97D, 'M', u'聠'),
+    (0x2F97E, 'M', u'𦖨'),
+    (0x2F97F, 'M', u'聰'),
+    ]
+
+def _seg_71():
+    return [
+    (0x2F980, 'M', u'𣍟'),
+    (0x2F981, 'M', u'䏕'),
+    (0x2F982, 'M', u'育'),
+    (0x2F983, 'M', u'脃'),
+    (0x2F984, 'M', u'䐋'),
+    (0x2F985, 'M', u'脾'),
+    (0x2F986, 'M', u'媵'),
+    (0x2F987, 'M', u'𦞧'),
+    (0x2F988, 'M', u'𦞵'),
+    (0x2F989, 'M', u'𣎓'),
+    (0x2F98A, 'M', u'𣎜'),
+    (0x2F98B, 'M', u'舁'),
+    (0x2F98C, 'M', u'舄'),
+    (0x2F98D, 'M', u'辞'),
+    (0x2F98E, 'M', u'ä‘«'),
+    (0x2F98F, 'M', u'芑'),
+    (0x2F990, 'M', u'芋'),
+    (0x2F991, 'M', u'芝'),
+    (0x2F992, 'M', u'劳'),
+    (0x2F993, 'M', u'花'),
+    (0x2F994, 'M', u'芳'),
+    (0x2F995, 'M', u'芽'),
+    (0x2F996, 'M', u'苦'),
+    (0x2F997, 'M', u'𦬼'),
+    (0x2F998, 'M', u'è‹¥'),
+    (0x2F999, 'M', u'茝'),
+    (0x2F99A, 'M', u'荣'),
+    (0x2F99B, 'M', u'莭'),
+    (0x2F99C, 'M', u'茣'),
+    (0x2F99D, 'M', u'莽'),
+    (0x2F99E, 'M', u'菧'),
+    (0x2F99F, 'M', u'è‘—'),
+    (0x2F9A0, 'M', u'荓'),
+    (0x2F9A1, 'M', u'菊'),
+    (0x2F9A2, 'M', u'菌'),
+    (0x2F9A3, 'M', u'菜'),
+    (0x2F9A4, 'M', u'𦰶'),
+    (0x2F9A5, 'M', u'𦵫'),
+    (0x2F9A6, 'M', u'𦳕'),
+    (0x2F9A7, 'M', u'䔫'),
+    (0x2F9A8, 'M', u'蓱'),
+    (0x2F9A9, 'M', u'蓳'),
+    (0x2F9AA, 'M', u'è”–'),
+    (0x2F9AB, 'M', u'𧏊'),
+    (0x2F9AC, 'M', u'蕤'),
+    (0x2F9AD, 'M', u'𦼬'),
+    (0x2F9AE, 'M', u'䕝'),
+    (0x2F9AF, 'M', u'ä•¡'),
+    (0x2F9B0, 'M', u'𦾱'),
+    (0x2F9B1, 'M', u'𧃒'),
+    (0x2F9B2, 'M', u'ä•«'),
+    (0x2F9B3, 'M', u'虐'),
+    (0x2F9B4, 'M', u'虜'),
+    (0x2F9B5, 'M', u'è™§'),
+    (0x2F9B6, 'M', u'虩'),
+    (0x2F9B7, 'M', u'èš©'),
+    (0x2F9B8, 'M', u'蚈'),
+    (0x2F9B9, 'M', u'蜎'),
+    (0x2F9BA, 'M', u'蛢'),
+    (0x2F9BB, 'M', u'蝹'),
+    (0x2F9BC, 'M', u'蜨'),
+    (0x2F9BD, 'M', u'蝫'),
+    (0x2F9BE, 'M', u'螆'),
+    (0x2F9BF, 'X'),
+    (0x2F9C0, 'M', u'蟡'),
+    (0x2F9C1, 'M', u'蠁'),
+    (0x2F9C2, 'M', u'ä—¹'),
+    (0x2F9C3, 'M', u'è¡ '),
+    (0x2F9C4, 'M', u'è¡£'),
+    (0x2F9C5, 'M', u'ð§™§'),
+    (0x2F9C6, 'M', u'裗'),
+    (0x2F9C7, 'M', u'裞'),
+    (0x2F9C8, 'M', u'䘵'),
+    (0x2F9C9, 'M', u'裺'),
+    (0x2F9CA, 'M', u'ã’»'),
+    (0x2F9CB, 'M', u'ð§¢®'),
+    (0x2F9CC, 'M', u'𧥦'),
+    (0x2F9CD, 'M', u'äš¾'),
+    (0x2F9CE, 'M', u'䛇'),
+    (0x2F9CF, 'M', u'誠'),
+    (0x2F9D0, 'M', u'è«­'),
+    (0x2F9D1, 'M', u'變'),
+    (0x2F9D2, 'M', u'豕'),
+    (0x2F9D3, 'M', u'𧲨'),
+    (0x2F9D4, 'M', u'貫'),
+    (0x2F9D5, 'M', u'賁'),
+    (0x2F9D6, 'M', u'è´›'),
+    (0x2F9D7, 'M', u'èµ·'),
+    (0x2F9D8, 'M', u'𧼯'),
+    (0x2F9D9, 'M', u'ð  „'),
+    (0x2F9DA, 'M', u'è·‹'),
+    (0x2F9DB, 'M', u'è¶¼'),
+    (0x2F9DC, 'M', u'è·°'),
+    (0x2F9DD, 'M', u'𠣞'),
+    (0x2F9DE, 'M', u'è»”'),
+    (0x2F9DF, 'M', u'輸'),
+    (0x2F9E0, 'M', u'𨗒'),
+    (0x2F9E1, 'M', u'𨗭'),
+    (0x2F9E2, 'M', u'é‚”'),
+    (0x2F9E3, 'M', u'郱'),
+    ]
+
+def _seg_72():
+    return [
+    (0x2F9E4, 'M', u'é„‘'),
+    (0x2F9E5, 'M', u'𨜮'),
+    (0x2F9E6, 'M', u'é„›'),
+    (0x2F9E7, 'M', u'鈸'),
+    (0x2F9E8, 'M', u'é‹—'),
+    (0x2F9E9, 'M', u'鋘'),
+    (0x2F9EA, 'M', u'鉼'),
+    (0x2F9EB, 'M', u'鏹'),
+    (0x2F9EC, 'M', u'鐕'),
+    (0x2F9ED, 'M', u'𨯺'),
+    (0x2F9EE, 'M', u'é–‹'),
+    (0x2F9EF, 'M', u'䦕'),
+    (0x2F9F0, 'M', u'é–·'),
+    (0x2F9F1, 'M', u'𨵷'),
+    (0x2F9F2, 'M', u'䧦'),
+    (0x2F9F3, 'M', u'雃'),
+    (0x2F9F4, 'M', u'å¶²'),
+    (0x2F9F5, 'M', u'霣'),
+    (0x2F9F6, 'M', u'ð©……'),
+    (0x2F9F7, 'M', u'𩈚'),
+    (0x2F9F8, 'M', u'ä©®'),
+    (0x2F9F9, 'M', u'ä©¶'),
+    (0x2F9FA, 'M', u'韠'),
+    (0x2F9FB, 'M', u'𩐊'),
+    (0x2F9FC, 'M', u'䪲'),
+    (0x2F9FD, 'M', u'ð©’–'),
+    (0x2F9FE, 'M', u'é ‹'),
+    (0x2FA00, 'M', u'é ©'),
+    (0x2FA01, 'M', u'ð©–¶'),
+    (0x2FA02, 'M', u'飢'),
+    (0x2FA03, 'M', u'䬳'),
+    (0x2FA04, 'M', u'餩'),
+    (0x2FA05, 'M', u'馧'),
+    (0x2FA06, 'M', u'é§‚'),
+    (0x2FA07, 'M', u'é§¾'),
+    (0x2FA08, 'M', u'䯎'),
+    (0x2FA09, 'M', u'𩬰'),
+    (0x2FA0A, 'M', u'鬒'),
+    (0x2FA0B, 'M', u'é±€'),
+    (0x2FA0C, 'M', u'é³½'),
+    (0x2FA0D, 'M', u'䳎'),
+    (0x2FA0E, 'M', u'ä³­'),
+    (0x2FA0F, 'M', u'éµ§'),
+    (0x2FA10, 'M', u'𪃎'),
+    (0x2FA11, 'M', u'䳸'),
+    (0x2FA12, 'M', u'𪄅'),
+    (0x2FA13, 'M', u'𪈎'),
+    (0x2FA14, 'M', u'𪊑'),
+    (0x2FA15, 'M', u'麻'),
+    (0x2FA16, 'M', u'äµ–'),
+    (0x2FA17, 'M', u'黹'),
+    (0x2FA18, 'M', u'黾'),
+    (0x2FA19, 'M', u'é¼…'),
+    (0x2FA1A, 'M', u'鼏'),
+    (0x2FA1B, 'M', u'é¼–'),
+    (0x2FA1C, 'M', u'é¼»'),
+    (0x2FA1D, 'M', u'𪘀'),
+    (0x2FA1E, 'X'),
+    (0xE0100, 'I'),
+    (0xE01F0, 'X'),
+    ]
+
+uts46data = tuple(
+    _seg_0()
+    + _seg_1()
+    + _seg_2()
+    + _seg_3()
+    + _seg_4()
+    + _seg_5()
+    + _seg_6()
+    + _seg_7()
+    + _seg_8()
+    + _seg_9()
+    + _seg_10()
+    + _seg_11()
+    + _seg_12()
+    + _seg_13()
+    + _seg_14()
+    + _seg_15()
+    + _seg_16()
+    + _seg_17()
+    + _seg_18()
+    + _seg_19()
+    + _seg_20()
+    + _seg_21()
+    + _seg_22()
+    + _seg_23()
+    + _seg_24()
+    + _seg_25()
+    + _seg_26()
+    + _seg_27()
+    + _seg_28()
+    + _seg_29()
+    + _seg_30()
+    + _seg_31()
+    + _seg_32()
+    + _seg_33()
+    + _seg_34()
+    + _seg_35()
+    + _seg_36()
+    + _seg_37()
+    + _seg_38()
+    + _seg_39()
+    + _seg_40()
+    + _seg_41()
+    + _seg_42()
+    + _seg_43()
+    + _seg_44()
+    + _seg_45()
+    + _seg_46()
+    + _seg_47()
+    + _seg_48()
+    + _seg_49()
+    + _seg_50()
+    + _seg_51()
+    + _seg_52()
+    + _seg_53()
+    + _seg_54()
+    + _seg_55()
+    + _seg_56()
+    + _seg_57()
+    + _seg_58()
+    + _seg_59()
+    + _seg_60()
+    + _seg_61()
+    + _seg_62()
+    + _seg_63()
+    + _seg_64()
+    + _seg_65()
+    + _seg_66()
+    + _seg_67()
+    + _seg_68()
+    + _seg_69()
+    + _seg_70()
+    + _seg_71()
+    + _seg_72()
+)
diff --git a/vendor/pip-9.0.3/pip/_vendor/ipaddress.py b/vendor/pip-9.0.3/pip/_vendor/ipaddress.py
new file mode 100644
index 0000000000000000000000000000000000000000..9cf71a744bc79d33bb62b0477d56e664d6f49356
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/ipaddress.py
@@ -0,0 +1,2425 @@
+# Copyright 2007 Google Inc.
+#  Licensed to PSF under a Contributor Agreement.
+
+"""A fast, lightweight IPv4/IPv6 manipulation library in Python.
+
+This library is used to create/poke/manipulate IPv4 and IPv6 addresses
+and networks.
+
+"""
+
+from __future__ import unicode_literals
+
+
+import itertools
+import struct
+
+__version__ = '1.0.17'
+
+# Compatibility functions
+_compat_int_types = (int,)
+try:
+    _compat_int_types = (int, long)
+except NameError:
+    pass
+try:
+    _compat_str = unicode
+except NameError:
+    _compat_str = str
+    assert bytes != str
+if b'\0'[0] == 0:  # Python 3 semantics
+    def _compat_bytes_to_byte_vals(byt):
+        return byt
+else:
+    def _compat_bytes_to_byte_vals(byt):
+        return [struct.unpack(b'!B', b)[0] for b in byt]
+try:
+    _compat_int_from_byte_vals = int.from_bytes
+except AttributeError:
+    def _compat_int_from_byte_vals(bytvals, endianess):
+        assert endianess == 'big'
+        res = 0
+        for bv in bytvals:
+            assert isinstance(bv, _compat_int_types)
+            res = (res << 8) + bv
+        return res
+
+
+def _compat_to_bytes(intval, length, endianess):
+    assert isinstance(intval, _compat_int_types)
+    assert endianess == 'big'
+    if length == 4:
+        if intval < 0 or intval >= 2 ** 32:
+            raise struct.error("integer out of range for 'I' format code")
+        return struct.pack(b'!I', intval)
+    elif length == 16:
+        if intval < 0 or intval >= 2 ** 128:
+            raise struct.error("integer out of range for 'QQ' format code")
+        return struct.pack(b'!QQ', intval >> 64, intval & 0xffffffffffffffff)
+    else:
+        raise NotImplementedError()
+if hasattr(int, 'bit_length'):
+    # Not int.bit_length , since that won't work in 2.7 where long exists
+    def _compat_bit_length(i):
+        return i.bit_length()
+else:
+    def _compat_bit_length(i):
+        for res in itertools.count():
+            if i >> res == 0:
+                return res
+
+
+def _compat_range(start, end, step=1):
+    assert step > 0
+    i = start
+    while i < end:
+        yield i
+        i += step
+
+
+class _TotalOrderingMixin(object):
+    __slots__ = ()
+
+    # Helper that derives the other comparison operations from
+    # __lt__ and __eq__
+    # We avoid functools.total_ordering because it doesn't handle
+    # NotImplemented correctly yet (http://bugs.python.org/issue10042)
+    def __eq__(self, other):
+        raise NotImplementedError
+
+    def __ne__(self, other):
+        equal = self.__eq__(other)
+        if equal is NotImplemented:
+            return NotImplemented
+        return not equal
+
+    def __lt__(self, other):
+        raise NotImplementedError
+
+    def __le__(self, other):
+        less = self.__lt__(other)
+        if less is NotImplemented or not less:
+            return self.__eq__(other)
+        return less
+
+    def __gt__(self, other):
+        less = self.__lt__(other)
+        if less is NotImplemented:
+            return NotImplemented
+        equal = self.__eq__(other)
+        if equal is NotImplemented:
+            return NotImplemented
+        return not (less or equal)
+
+    def __ge__(self, other):
+        less = self.__lt__(other)
+        if less is NotImplemented:
+            return NotImplemented
+        return not less
+
+
+IPV4LENGTH = 32
+IPV6LENGTH = 128
+
+
+class AddressValueError(ValueError):
+    """A Value Error related to the address."""
+
+
+class NetmaskValueError(ValueError):
+    """A Value Error related to the netmask."""
+
+
+def ip_address(address):
+    """Take an IP string/int and return an object of the correct type.
+
+    Args:
+        address: A string or integer, the IP address.  Either IPv4 or
+          IPv6 addresses may be supplied; integers less than 2**32 will
+          be considered to be IPv4 by default.
+
+    Returns:
+        An IPv4Address or IPv6Address object.
+
+    Raises:
+        ValueError: if the *address* passed isn't either a v4 or a v6
+          address
+
+    """
+    try:
+        return IPv4Address(address)
+    except (AddressValueError, NetmaskValueError):
+        pass
+
+    try:
+        return IPv6Address(address)
+    except (AddressValueError, NetmaskValueError):
+        pass
+
+    if isinstance(address, bytes):
+        raise AddressValueError(
+            '%r does not appear to be an IPv4 or IPv6 address. '
+            'Did you pass in a bytes (str in Python 2) instead of'
+            ' a unicode object?' % address)
+
+    raise ValueError('%r does not appear to be an IPv4 or IPv6 address' %
+                     address)
+
+
+def ip_network(address, strict=True):
+    """Take an IP string/int and return an object of the correct type.
+
+    Args:
+        address: A string or integer, the IP network.  Either IPv4 or
+          IPv6 networks may be supplied; integers less than 2**32 will
+          be considered to be IPv4 by default.
+
+    Returns:
+        An IPv4Network or IPv6Network object.
+
+    Raises:
+        ValueError: if the string passed isn't either a v4 or a v6
+          address. Or if the network has host bits set.
+
+    """
+    try:
+        return IPv4Network(address, strict)
+    except (AddressValueError, NetmaskValueError):
+        pass
+
+    try:
+        return IPv6Network(address, strict)
+    except (AddressValueError, NetmaskValueError):
+        pass
+
+    if isinstance(address, bytes):
+        raise AddressValueError(
+            '%r does not appear to be an IPv4 or IPv6 network. '
+            'Did you pass in a bytes (str in Python 2) instead of'
+            ' a unicode object?' % address)
+
+    raise ValueError('%r does not appear to be an IPv4 or IPv6 network' %
+                     address)
+
+
+def ip_interface(address):
+    """Take an IP string/int and return an object of the correct type.
+
+    Args:
+        address: A string or integer, the IP address.  Either IPv4 or
+          IPv6 addresses may be supplied; integers less than 2**32 will
+          be considered to be IPv4 by default.
+
+    Returns:
+        An IPv4Interface or IPv6Interface object.
+
+    Raises:
+        ValueError: if the string passed isn't either a v4 or a v6
+          address.
+
+    Notes:
+        The IPv?Interface classes describe an Address on a particular
+        Network, so they're basically a combination of both the Address
+        and Network classes.
+
+    """
+    try:
+        return IPv4Interface(address)
+    except (AddressValueError, NetmaskValueError):
+        pass
+
+    try:
+        return IPv6Interface(address)
+    except (AddressValueError, NetmaskValueError):
+        pass
+
+    raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' %
+                     address)
+
+
+def v4_int_to_packed(address):
+    """Represent an address as 4 packed bytes in network (big-endian) order.
+
+    Args:
+        address: An integer representation of an IPv4 IP address.
+
+    Returns:
+        The integer address packed as 4 bytes in network (big-endian) order.
+
+    Raises:
+        ValueError: If the integer is negative or too large to be an
+          IPv4 IP address.
+
+    """
+    try:
+        return _compat_to_bytes(address, 4, 'big')
+    except (struct.error, OverflowError):
+        raise ValueError("Address negative or too large for IPv4")
+
+
+def v6_int_to_packed(address):
+    """Represent an address as 16 packed bytes in network (big-endian) order.
+
+    Args:
+        address: An integer representation of an IPv6 IP address.
+
+    Returns:
+        The integer address packed as 16 bytes in network (big-endian) order.
+
+    """
+    try:
+        return _compat_to_bytes(address, 16, 'big')
+    except (struct.error, OverflowError):
+        raise ValueError("Address negative or too large for IPv6")
+
+
+def _split_optional_netmask(address):
+    """Helper to split the netmask and raise AddressValueError if needed"""
+    addr = _compat_str(address).split('/')
+    if len(addr) > 2:
+        raise AddressValueError("Only one '/' permitted in %r" % address)
+    return addr
+
+
+def _find_address_range(addresses):
+    """Find a sequence of sorted deduplicated IPv#Address.
+
+    Args:
+        addresses: a list of IPv#Address objects.
+
+    Yields:
+        A tuple containing the first and last IP addresses in the sequence.
+
+    """
+    it = iter(addresses)
+    first = last = next(it)
+    for ip in it:
+        if ip._ip != last._ip + 1:
+            yield first, last
+            first = ip
+        last = ip
+    yield first, last
+
+
+def _count_righthand_zero_bits(number, bits):
+    """Count the number of zero bits on the right hand side.
+
+    Args:
+        number: an integer.
+        bits: maximum number of bits to count.
+
+    Returns:
+        The number of zero bits on the right hand side of the number.
+
+    """
+    if number == 0:
+        return bits
+    return min(bits, _compat_bit_length(~number & (number - 1)))
+
+
+def summarize_address_range(first, last):
+    """Summarize a network range given the first and last IP addresses.
+
+    Example:
+        >>> list(summarize_address_range(IPv4Address('192.0.2.0'),
+        ...                              IPv4Address('192.0.2.130')))
+        ...                                #doctest: +NORMALIZE_WHITESPACE
+        [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'),
+         IPv4Network('192.0.2.130/32')]
+
+    Args:
+        first: the first IPv4Address or IPv6Address in the range.
+        last: the last IPv4Address or IPv6Address in the range.
+
+    Returns:
+        An iterator of the summarized IPv(4|6) network objects.
+
+    Raise:
+        TypeError:
+            If the first and last objects are not IP addresses.
+            If the first and last objects are not the same version.
+        ValueError:
+            If the last object is not greater than the first.
+            If the version of the first address is not 4 or 6.
+
+    """
+    if (not (isinstance(first, _BaseAddress) and
+             isinstance(last, _BaseAddress))):
+        raise TypeError('first and last must be IP addresses, not networks')
+    if first.version != last.version:
+        raise TypeError("%s and %s are not of the same version" % (
+                        first, last))
+    if first > last:
+        raise ValueError('last IP address must be greater than first')
+
+    if first.version == 4:
+        ip = IPv4Network
+    elif first.version == 6:
+        ip = IPv6Network
+    else:
+        raise ValueError('unknown IP version')
+
+    ip_bits = first._max_prefixlen
+    first_int = first._ip
+    last_int = last._ip
+    while first_int <= last_int:
+        nbits = min(_count_righthand_zero_bits(first_int, ip_bits),
+                    _compat_bit_length(last_int - first_int + 1) - 1)
+        net = ip((first_int, ip_bits - nbits))
+        yield net
+        first_int += 1 << nbits
+        if first_int - 1 == ip._ALL_ONES:
+            break
+
+
+def _collapse_addresses_internal(addresses):
+    """Loops through the addresses, collapsing concurrent netblocks.
+
+    Example:
+
+        ip1 = IPv4Network('192.0.2.0/26')
+        ip2 = IPv4Network('192.0.2.64/26')
+        ip3 = IPv4Network('192.0.2.128/26')
+        ip4 = IPv4Network('192.0.2.192/26')
+
+        _collapse_addresses_internal([ip1, ip2, ip3, ip4]) ->
+          [IPv4Network('192.0.2.0/24')]
+
+        This shouldn't be called directly; it is called via
+          collapse_addresses([]).
+
+    Args:
+        addresses: A list of IPv4Network's or IPv6Network's
+
+    Returns:
+        A list of IPv4Network's or IPv6Network's depending on what we were
+        passed.
+
+    """
+    # First merge
+    to_merge = list(addresses)
+    subnets = {}
+    while to_merge:
+        net = to_merge.pop()
+        supernet = net.supernet()
+        existing = subnets.get(supernet)
+        if existing is None:
+            subnets[supernet] = net
+        elif existing != net:
+            # Merge consecutive subnets
+            del subnets[supernet]
+            to_merge.append(supernet)
+    # Then iterate over resulting networks, skipping subsumed subnets
+    last = None
+    for net in sorted(subnets.values()):
+        if last is not None:
+            # Since they are sorted,
+            # last.network_address <= net.network_address is a given.
+            if last.broadcast_address >= net.broadcast_address:
+                continue
+        yield net
+        last = net
+
+
+def collapse_addresses(addresses):
+    """Collapse a list of IP objects.
+
+    Example:
+        collapse_addresses([IPv4Network('192.0.2.0/25'),
+                            IPv4Network('192.0.2.128/25')]) ->
+                           [IPv4Network('192.0.2.0/24')]
+
+    Args:
+        addresses: An iterator of IPv4Network or IPv6Network objects.
+
+    Returns:
+        An iterator of the collapsed IPv(4|6)Network objects.
+
+    Raises:
+        TypeError: If passed a list of mixed version objects.
+
+    """
+    addrs = []
+    ips = []
+    nets = []
+
+    # split IP addresses and networks
+    for ip in addresses:
+        if isinstance(ip, _BaseAddress):
+            if ips and ips[-1]._version != ip._version:
+                raise TypeError("%s and %s are not of the same version" % (
+                                ip, ips[-1]))
+            ips.append(ip)
+        elif ip._prefixlen == ip._max_prefixlen:
+            if ips and ips[-1]._version != ip._version:
+                raise TypeError("%s and %s are not of the same version" % (
+                                ip, ips[-1]))
+            try:
+                ips.append(ip.ip)
+            except AttributeError:
+                ips.append(ip.network_address)
+        else:
+            if nets and nets[-1]._version != ip._version:
+                raise TypeError("%s and %s are not of the same version" % (
+                                ip, nets[-1]))
+            nets.append(ip)
+
+    # sort and dedup
+    ips = sorted(set(ips))
+
+    # find consecutive address ranges in the sorted sequence and summarize them
+    if ips:
+        for first, last in _find_address_range(ips):
+            addrs.extend(summarize_address_range(first, last))
+
+    return _collapse_addresses_internal(addrs + nets)
+
+
+def get_mixed_type_key(obj):
+    """Return a key suitable for sorting between networks and addresses.
+
+    Address and Network objects are not sortable by default; they're
+    fundamentally different so the expression
+
+        IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
+
+    doesn't make any sense.  There are some times however, where you may wish
+    to have ipaddress sort these for you anyway. If you need to do this, you
+    can use this function as the key= argument to sorted().
+
+    Args:
+      obj: either a Network or Address object.
+    Returns:
+      appropriate key.
+
+    """
+    if isinstance(obj, _BaseNetwork):
+        return obj._get_networks_key()
+    elif isinstance(obj, _BaseAddress):
+        return obj._get_address_key()
+    return NotImplemented
+
+
+class _IPAddressBase(_TotalOrderingMixin):
+
+    """The mother class."""
+
+    __slots__ = ()
+
+    @property
+    def exploded(self):
+        """Return the longhand version of the IP address as a string."""
+        return self._explode_shorthand_ip_string()
+
+    @property
+    def compressed(self):
+        """Return the shorthand version of the IP address as a string."""
+        return _compat_str(self)
+
+    @property
+    def reverse_pointer(self):
+        """The name of the reverse DNS pointer for the IP address, e.g.:
+            >>> ipaddress.ip_address("127.0.0.1").reverse_pointer
+            '1.0.0.127.in-addr.arpa'
+            >>> ipaddress.ip_address("2001:db8::1").reverse_pointer
+            '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa'
+
+        """
+        return self._reverse_pointer()
+
+    @property
+    def version(self):
+        msg = '%200s has no version specified' % (type(self),)
+        raise NotImplementedError(msg)
+
+    def _check_int_address(self, address):
+        if address < 0:
+            msg = "%d (< 0) is not permitted as an IPv%d address"
+            raise AddressValueError(msg % (address, self._version))
+        if address > self._ALL_ONES:
+            msg = "%d (>= 2**%d) is not permitted as an IPv%d address"
+            raise AddressValueError(msg % (address, self._max_prefixlen,
+                                           self._version))
+
+    def _check_packed_address(self, address, expected_len):
+        address_len = len(address)
+        if address_len != expected_len:
+            msg = (
+                '%r (len %d != %d) is not permitted as an IPv%d address. '
+                'Did you pass in a bytes (str in Python 2) instead of'
+                ' a unicode object?'
+            )
+            raise AddressValueError(msg % (address, address_len,
+                                           expected_len, self._version))
+
+    @classmethod
+    def _ip_int_from_prefix(cls, prefixlen):
+        """Turn the prefix length into a bitwise netmask
+
+        Args:
+            prefixlen: An integer, the prefix length.
+
+        Returns:
+            An integer.
+
+        """
+        return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen)
+
+    @classmethod
+    def _prefix_from_ip_int(cls, ip_int):
+        """Return prefix length from the bitwise netmask.
+
+        Args:
+            ip_int: An integer, the netmask in expanded bitwise format
+
+        Returns:
+            An integer, the prefix length.
+
+        Raises:
+            ValueError: If the input intermingles zeroes & ones
+        """
+        trailing_zeroes = _count_righthand_zero_bits(ip_int,
+                                                     cls._max_prefixlen)
+        prefixlen = cls._max_prefixlen - trailing_zeroes
+        leading_ones = ip_int >> trailing_zeroes
+        all_ones = (1 << prefixlen) - 1
+        if leading_ones != all_ones:
+            byteslen = cls._max_prefixlen // 8
+            details = _compat_to_bytes(ip_int, byteslen, 'big')
+            msg = 'Netmask pattern %r mixes zeroes & ones'
+            raise ValueError(msg % details)
+        return prefixlen
+
+    @classmethod
+    def _report_invalid_netmask(cls, netmask_str):
+        msg = '%r is not a valid netmask' % netmask_str
+        raise NetmaskValueError(msg)
+
+    @classmethod
+    def _prefix_from_prefix_string(cls, prefixlen_str):
+        """Return prefix length from a numeric string
+
+        Args:
+            prefixlen_str: The string to be converted
+
+        Returns:
+            An integer, the prefix length.
+
+        Raises:
+            NetmaskValueError: If the input is not a valid netmask
+        """
+        # int allows a leading +/- as well as surrounding whitespace,
+        # so we ensure that isn't the case
+        if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str):
+            cls._report_invalid_netmask(prefixlen_str)
+        try:
+            prefixlen = int(prefixlen_str)
+        except ValueError:
+            cls._report_invalid_netmask(prefixlen_str)
+        if not (0 <= prefixlen <= cls._max_prefixlen):
+            cls._report_invalid_netmask(prefixlen_str)
+        return prefixlen
+
+    @classmethod
+    def _prefix_from_ip_string(cls, ip_str):
+        """Turn a netmask/hostmask string into a prefix length
+
+        Args:
+            ip_str: The netmask/hostmask to be converted
+
+        Returns:
+            An integer, the prefix length.
+
+        Raises:
+            NetmaskValueError: If the input is not a valid netmask/hostmask
+        """
+        # Parse the netmask/hostmask like an IP address.
+        try:
+            ip_int = cls._ip_int_from_string(ip_str)
+        except AddressValueError:
+            cls._report_invalid_netmask(ip_str)
+
+        # Try matching a netmask (this would be /1*0*/ as a bitwise regexp).
+        # Note that the two ambiguous cases (all-ones and all-zeroes) are
+        # treated as netmasks.
+        try:
+            return cls._prefix_from_ip_int(ip_int)
+        except ValueError:
+            pass
+
+        # Invert the bits, and try matching a /0+1+/ hostmask instead.
+        ip_int ^= cls._ALL_ONES
+        try:
+            return cls._prefix_from_ip_int(ip_int)
+        except ValueError:
+            cls._report_invalid_netmask(ip_str)
+
+    def __reduce__(self):
+        return self.__class__, (_compat_str(self),)
+
+
+class _BaseAddress(_IPAddressBase):
+
+    """A generic IP object.
+
+    This IP class contains the version independent methods which are
+    used by single IP addresses.
+    """
+
+    __slots__ = ()
+
+    def __int__(self):
+        return self._ip
+
+    def __eq__(self, other):
+        try:
+            return (self._ip == other._ip and
+                    self._version == other._version)
+        except AttributeError:
+            return NotImplemented
+
+    def __lt__(self, other):
+        if not isinstance(other, _IPAddressBase):
+            return NotImplemented
+        if not isinstance(other, _BaseAddress):
+            raise TypeError('%s and %s are not of the same type' % (
+                self, other))
+        if self._version != other._version:
+            raise TypeError('%s and %s are not of the same version' % (
+                self, other))
+        if self._ip != other._ip:
+            return self._ip < other._ip
+        return False
+
+    # Shorthand for Integer addition and subtraction. This is not
+    # meant to ever support addition/subtraction of addresses.
+    def __add__(self, other):
+        if not isinstance(other, _compat_int_types):
+            return NotImplemented
+        return self.__class__(int(self) + other)
+
+    def __sub__(self, other):
+        if not isinstance(other, _compat_int_types):
+            return NotImplemented
+        return self.__class__(int(self) - other)
+
+    def __repr__(self):
+        return '%s(%r)' % (self.__class__.__name__, _compat_str(self))
+
+    def __str__(self):
+        return _compat_str(self._string_from_ip_int(self._ip))
+
+    def __hash__(self):
+        return hash(hex(int(self._ip)))
+
+    def _get_address_key(self):
+        return (self._version, self)
+
+    def __reduce__(self):
+        return self.__class__, (self._ip,)
+
+
+class _BaseNetwork(_IPAddressBase):
+
+    """A generic IP network object.
+
+    This IP class contains the version independent methods which are
+    used by networks.
+
+    """
+    def __init__(self, address):
+        self._cache = {}
+
+    def __repr__(self):
+        return '%s(%r)' % (self.__class__.__name__, _compat_str(self))
+
+    def __str__(self):
+        return '%s/%d' % (self.network_address, self.prefixlen)
+
+    def hosts(self):
+        """Generate Iterator over usable hosts in a network.
+
+        This is like __iter__ except it doesn't return the network
+        or broadcast addresses.
+
+        """
+        network = int(self.network_address)
+        broadcast = int(self.broadcast_address)
+        for x in _compat_range(network + 1, broadcast):
+            yield self._address_class(x)
+
+    def __iter__(self):
+        network = int(self.network_address)
+        broadcast = int(self.broadcast_address)
+        for x in _compat_range(network, broadcast + 1):
+            yield self._address_class(x)
+
+    def __getitem__(self, n):
+        network = int(self.network_address)
+        broadcast = int(self.broadcast_address)
+        if n >= 0:
+            if network + n > broadcast:
+                raise IndexError('address out of range')
+            return self._address_class(network + n)
+        else:
+            n += 1
+            if broadcast + n < network:
+                raise IndexError('address out of range')
+            return self._address_class(broadcast + n)
+
+    def __lt__(self, other):
+        if not isinstance(other, _IPAddressBase):
+            return NotImplemented
+        if not isinstance(other, _BaseNetwork):
+            raise TypeError('%s and %s are not of the same type' % (
+                            self, other))
+        if self._version != other._version:
+            raise TypeError('%s and %s are not of the same version' % (
+                            self, other))
+        if self.network_address != other.network_address:
+            return self.network_address < other.network_address
+        if self.netmask != other.netmask:
+            return self.netmask < other.netmask
+        return False
+
+    def __eq__(self, other):
+        try:
+            return (self._version == other._version and
+                    self.network_address == other.network_address and
+                    int(self.netmask) == int(other.netmask))
+        except AttributeError:
+            return NotImplemented
+
+    def __hash__(self):
+        return hash(int(self.network_address) ^ int(self.netmask))
+
+    def __contains__(self, other):
+        # always false if one is v4 and the other is v6.
+        if self._version != other._version:
+            return False
+        # dealing with another network.
+        if isinstance(other, _BaseNetwork):
+            return False
+        # dealing with another address
+        else:
+            # address
+            return (int(self.network_address) <= int(other._ip) <=
+                    int(self.broadcast_address))
+
+    def overlaps(self, other):
+        """Tell if self is partly contained in other."""
+        return self.network_address in other or (
+            self.broadcast_address in other or (
+                other.network_address in self or (
+                    other.broadcast_address in self)))
+
+    @property
+    def broadcast_address(self):
+        x = self._cache.get('broadcast_address')
+        if x is None:
+            x = self._address_class(int(self.network_address) |
+                                    int(self.hostmask))
+            self._cache['broadcast_address'] = x
+        return x
+
+    @property
+    def hostmask(self):
+        x = self._cache.get('hostmask')
+        if x is None:
+            x = self._address_class(int(self.netmask) ^ self._ALL_ONES)
+            self._cache['hostmask'] = x
+        return x
+
+    @property
+    def with_prefixlen(self):
+        return '%s/%d' % (self.network_address, self._prefixlen)
+
+    @property
+    def with_netmask(self):
+        return '%s/%s' % (self.network_address, self.netmask)
+
+    @property
+    def with_hostmask(self):
+        return '%s/%s' % (self.network_address, self.hostmask)
+
+    @property
+    def num_addresses(self):
+        """Number of hosts in the current subnet."""
+        return int(self.broadcast_address) - int(self.network_address) + 1
+
+    @property
+    def _address_class(self):
+        # Returning bare address objects (rather than interfaces) allows for
+        # more consistent behaviour across the network address, broadcast
+        # address and individual host addresses.
+        msg = '%200s has no associated address class' % (type(self),)
+        raise NotImplementedError(msg)
+
+    @property
+    def prefixlen(self):
+        return self._prefixlen
+
+    def address_exclude(self, other):
+        """Remove an address from a larger block.
+
+        For example:
+
+            addr1 = ip_network('192.0.2.0/28')
+            addr2 = ip_network('192.0.2.1/32')
+            list(addr1.address_exclude(addr2)) =
+                [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'),
+                 IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')]
+
+        or IPv6:
+
+            addr1 = ip_network('2001:db8::1/32')
+            addr2 = ip_network('2001:db8::1/128')
+            list(addr1.address_exclude(addr2)) =
+                [ip_network('2001:db8::1/128'),
+                 ip_network('2001:db8::2/127'),
+                 ip_network('2001:db8::4/126'),
+                 ip_network('2001:db8::8/125'),
+                 ...
+                 ip_network('2001:db8:8000::/33')]
+
+        Args:
+            other: An IPv4Network or IPv6Network object of the same type.
+
+        Returns:
+            An iterator of the IPv(4|6)Network objects which is self
+            minus other.
+
+        Raises:
+            TypeError: If self and other are of differing address
+              versions, or if other is not a network object.
+            ValueError: If other is not completely contained by self.
+
+        """
+        if not self._version == other._version:
+            raise TypeError("%s and %s are not of the same version" % (
+                            self, other))
+
+        if not isinstance(other, _BaseNetwork):
+            raise TypeError("%s is not a network object" % other)
+
+        if not other.subnet_of(self):
+            raise ValueError('%s not contained in %s' % (other, self))
+        if other == self:
+            return
+
+        # Make sure we're comparing the network of other.
+        other = other.__class__('%s/%s' % (other.network_address,
+                                           other.prefixlen))
+
+        s1, s2 = self.subnets()
+        while s1 != other and s2 != other:
+            if other.subnet_of(s1):
+                yield s2
+                s1, s2 = s1.subnets()
+            elif other.subnet_of(s2):
+                yield s1
+                s1, s2 = s2.subnets()
+            else:
+                # If we got here, there's a bug somewhere.
+                raise AssertionError('Error performing exclusion: '
+                                     's1: %s s2: %s other: %s' %
+                                     (s1, s2, other))
+        if s1 == other:
+            yield s2
+        elif s2 == other:
+            yield s1
+        else:
+            # If we got here, there's a bug somewhere.
+            raise AssertionError('Error performing exclusion: '
+                                 's1: %s s2: %s other: %s' %
+                                 (s1, s2, other))
+
+    def compare_networks(self, other):
+        """Compare two IP objects.
+
+        This is only concerned about the comparison of the integer
+        representation of the network addresses.  This means that the
+        host bits aren't considered at all in this method.  If you want
+        to compare host bits, you can easily enough do a
+        'HostA._ip < HostB._ip'
+
+        Args:
+            other: An IP object.
+
+        Returns:
+            If the IP versions of self and other are the same, returns:
+
+            -1 if self < other:
+              eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25')
+              IPv6Network('2001:db8::1000/124') <
+                  IPv6Network('2001:db8::2000/124')
+            0 if self == other
+              eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24')
+              IPv6Network('2001:db8::1000/124') ==
+                  IPv6Network('2001:db8::1000/124')
+            1 if self > other
+              eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25')
+                  IPv6Network('2001:db8::2000/124') >
+                      IPv6Network('2001:db8::1000/124')
+
+          Raises:
+              TypeError if the IP versions are different.
+
+        """
+        # does this need to raise a ValueError?
+        if self._version != other._version:
+            raise TypeError('%s and %s are not of the same type' % (
+                            self, other))
+        # self._version == other._version below here:
+        if self.network_address < other.network_address:
+            return -1
+        if self.network_address > other.network_address:
+            return 1
+        # self.network_address == other.network_address below here:
+        if self.netmask < other.netmask:
+            return -1
+        if self.netmask > other.netmask:
+            return 1
+        return 0
+
+    def _get_networks_key(self):
+        """Network-only key function.
+
+        Returns an object that identifies this address' network and
+        netmask. This function is a suitable "key" argument for sorted()
+        and list.sort().
+
+        """
+        return (self._version, self.network_address, self.netmask)
+
+    def subnets(self, prefixlen_diff=1, new_prefix=None):
+        """The subnets which join to make the current subnet.
+
+        In the case that self contains only one IP
+        (self._prefixlen == 32 for IPv4 or self._prefixlen == 128
+        for IPv6), yield an iterator with just ourself.
+
+        Args:
+            prefixlen_diff: An integer, the amount the prefix length
+              should be increased by. This should not be set if
+              new_prefix is also set.
+            new_prefix: The desired new prefix length. This must be a
+              larger number (smaller prefix) than the existing prefix.
+              This should not be set if prefixlen_diff is also set.
+
+        Returns:
+            An iterator of IPv(4|6) objects.
+
+        Raises:
+            ValueError: The prefixlen_diff is too small or too large.
+                OR
+            prefixlen_diff and new_prefix are both set or new_prefix
+              is a smaller number than the current prefix (smaller
+              number means a larger network)
+
+        """
+        if self._prefixlen == self._max_prefixlen:
+            yield self
+            return
+
+        if new_prefix is not None:
+            if new_prefix < self._prefixlen:
+                raise ValueError('new prefix must be longer')
+            if prefixlen_diff != 1:
+                raise ValueError('cannot set prefixlen_diff and new_prefix')
+            prefixlen_diff = new_prefix - self._prefixlen
+
+        if prefixlen_diff < 0:
+            raise ValueError('prefix length diff must be > 0')
+        new_prefixlen = self._prefixlen + prefixlen_diff
+
+        if new_prefixlen > self._max_prefixlen:
+            raise ValueError(
+                'prefix length diff %d is invalid for netblock %s' % (
+                    new_prefixlen, self))
+
+        start = int(self.network_address)
+        end = int(self.broadcast_address) + 1
+        step = (int(self.hostmask) + 1) >> prefixlen_diff
+        for new_addr in _compat_range(start, end, step):
+            current = self.__class__((new_addr, new_prefixlen))
+            yield current
+
+    def supernet(self, prefixlen_diff=1, new_prefix=None):
+        """The supernet containing the current network.
+
+        Args:
+            prefixlen_diff: An integer, the amount the prefix length of
+              the network should be decreased by.  For example, given a
+              /24 network and a prefixlen_diff of 3, a supernet with a
+              /21 netmask is returned.
+
+        Returns:
+            An IPv4 network object.
+
+        Raises:
+            ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have
+              a negative prefix length.
+                OR
+            If prefixlen_diff and new_prefix are both set or new_prefix is a
+              larger number than the current prefix (larger number means a
+              smaller network)
+
+        """
+        if self._prefixlen == 0:
+            return self
+
+        if new_prefix is not None:
+            if new_prefix > self._prefixlen:
+                raise ValueError('new prefix must be shorter')
+            if prefixlen_diff != 1:
+                raise ValueError('cannot set prefixlen_diff and new_prefix')
+            prefixlen_diff = self._prefixlen - new_prefix
+
+        new_prefixlen = self.prefixlen - prefixlen_diff
+        if new_prefixlen < 0:
+            raise ValueError(
+                'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
+                (self.prefixlen, prefixlen_diff))
+        return self.__class__((
+            int(self.network_address) & (int(self.netmask) << prefixlen_diff),
+            new_prefixlen
+        ))
+
+    @property
+    def is_multicast(self):
+        """Test if the address is reserved for multicast use.
+
+        Returns:
+            A boolean, True if the address is a multicast address.
+            See RFC 2373 2.7 for details.
+
+        """
+        return (self.network_address.is_multicast and
+                self.broadcast_address.is_multicast)
+
+    def subnet_of(self, other):
+        # always false if one is v4 and the other is v6.
+        if self._version != other._version:
+            return False
+        # dealing with another network.
+        if (hasattr(other, 'network_address') and
+                hasattr(other, 'broadcast_address')):
+            return (other.network_address <= self.network_address and
+                    other.broadcast_address >= self.broadcast_address)
+        # dealing with another address
+        else:
+            raise TypeError('Unable to test subnet containment with element '
+                            'of type %s' % type(other))
+
+    def supernet_of(self, other):
+        # always false if one is v4 and the other is v6.
+        if self._version != other._version:
+            return False
+        # dealing with another network.
+        if (hasattr(other, 'network_address') and
+                hasattr(other, 'broadcast_address')):
+            return (other.network_address >= self.network_address and
+                    other.broadcast_address <= self.broadcast_address)
+        # dealing with another address
+        else:
+            raise TypeError('Unable to test subnet containment with element '
+                            'of type %s' % type(other))
+
+    @property
+    def is_reserved(self):
+        """Test if the address is otherwise IETF reserved.
+
+        Returns:
+            A boolean, True if the address is within one of the
+            reserved IPv6 Network ranges.
+
+        """
+        return (self.network_address.is_reserved and
+                self.broadcast_address.is_reserved)
+
+    @property
+    def is_link_local(self):
+        """Test if the address is reserved for link-local.
+
+        Returns:
+            A boolean, True if the address is reserved per RFC 4291.
+
+        """
+        return (self.network_address.is_link_local and
+                self.broadcast_address.is_link_local)
+
+    @property
+    def is_private(self):
+        """Test if this address is allocated for private networks.
+
+        Returns:
+            A boolean, True if the address is reserved per
+            iana-ipv4-special-registry or iana-ipv6-special-registry.
+
+        """
+        return (self.network_address.is_private and
+                self.broadcast_address.is_private)
+
+    @property
+    def is_global(self):
+        """Test if this address is allocated for public networks.
+
+        Returns:
+            A boolean, True if the address is not reserved per
+            iana-ipv4-special-registry or iana-ipv6-special-registry.
+
+        """
+        return not self.is_private
+
+    @property
+    def is_unspecified(self):
+        """Test if the address is unspecified.
+
+        Returns:
+            A boolean, True if this is the unspecified address as defined in
+            RFC 2373 2.5.2.
+
+        """
+        return (self.network_address.is_unspecified and
+                self.broadcast_address.is_unspecified)
+
+    @property
+    def is_loopback(self):
+        """Test if the address is a loopback address.
+
+        Returns:
+            A boolean, True if the address is a loopback address as defined in
+            RFC 2373 2.5.3.
+
+        """
+        return (self.network_address.is_loopback and
+                self.broadcast_address.is_loopback)
+
+
+class _BaseV4(object):
+
+    """Base IPv4 object.
+
+    The following methods are used by IPv4 objects in both single IP
+    addresses and networks.
+
+    """
+
+    __slots__ = ()
+    _version = 4
+    # Equivalent to 255.255.255.255 or 32 bits of 1's.
+    _ALL_ONES = (2 ** IPV4LENGTH) - 1
+    _DECIMAL_DIGITS = frozenset('0123456789')
+
+    # the valid octets for host and netmasks. only useful for IPv4.
+    _valid_mask_octets = frozenset([255, 254, 252, 248, 240, 224, 192, 128, 0])
+
+    _max_prefixlen = IPV4LENGTH
+    # There are only a handful of valid v4 netmasks, so we cache them all
+    # when constructed (see _make_netmask()).
+    _netmask_cache = {}
+
+    def _explode_shorthand_ip_string(self):
+        return _compat_str(self)
+
+    @classmethod
+    def _make_netmask(cls, arg):
+        """Make a (netmask, prefix_len) tuple from the given argument.
+
+        Argument can be:
+        - an integer (the prefix length)
+        - a string representing the prefix length (e.g. "24")
+        - a string representing the prefix netmask (e.g. "255.255.255.0")
+        """
+        if arg not in cls._netmask_cache:
+            if isinstance(arg, _compat_int_types):
+                prefixlen = arg
+            else:
+                try:
+                    # Check for a netmask in prefix length form
+                    prefixlen = cls._prefix_from_prefix_string(arg)
+                except NetmaskValueError:
+                    # Check for a netmask or hostmask in dotted-quad form.
+                    # This may raise NetmaskValueError.
+                    prefixlen = cls._prefix_from_ip_string(arg)
+            netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen))
+            cls._netmask_cache[arg] = netmask, prefixlen
+        return cls._netmask_cache[arg]
+
+    @classmethod
+    def _ip_int_from_string(cls, ip_str):
+        """Turn the given IP string into an integer for comparison.
+
+        Args:
+            ip_str: A string, the IP ip_str.
+
+        Returns:
+            The IP ip_str as an integer.
+
+        Raises:
+            AddressValueError: if ip_str isn't a valid IPv4 Address.
+
+        """
+        if not ip_str:
+            raise AddressValueError('Address cannot be empty')
+
+        octets = ip_str.split('.')
+        if len(octets) != 4:
+            raise AddressValueError("Expected 4 octets in %r" % ip_str)
+
+        try:
+            return _compat_int_from_byte_vals(
+                map(cls._parse_octet, octets), 'big')
+        except ValueError as exc:
+            raise AddressValueError("%s in %r" % (exc, ip_str))
+
+    @classmethod
+    def _parse_octet(cls, octet_str):
+        """Convert a decimal octet into an integer.
+
+        Args:
+            octet_str: A string, the number to parse.
+
+        Returns:
+            The octet as an integer.
+
+        Raises:
+            ValueError: if the octet isn't strictly a decimal from [0..255].
+
+        """
+        if not octet_str:
+            raise ValueError("Empty octet not permitted")
+        # Whitelist the characters, since int() allows a lot of bizarre stuff.
+        if not cls._DECIMAL_DIGITS.issuperset(octet_str):
+            msg = "Only decimal digits permitted in %r"
+            raise ValueError(msg % octet_str)
+        # We do the length check second, since the invalid character error
+        # is likely to be more informative for the user
+        if len(octet_str) > 3:
+            msg = "At most 3 characters permitted in %r"
+            raise ValueError(msg % octet_str)
+        # Convert to integer (we know digits are legal)
+        octet_int = int(octet_str, 10)
+        # Any octets that look like they *might* be written in octal,
+        # and which don't look exactly the same in both octal and
+        # decimal are rejected as ambiguous
+        if octet_int > 7 and octet_str[0] == '0':
+            msg = "Ambiguous (octal/decimal) value in %r not permitted"
+            raise ValueError(msg % octet_str)
+        if octet_int > 255:
+            raise ValueError("Octet %d (> 255) not permitted" % octet_int)
+        return octet_int
+
+    @classmethod
+    def _string_from_ip_int(cls, ip_int):
+        """Turns a 32-bit integer into dotted decimal notation.
+
+        Args:
+            ip_int: An integer, the IP address.
+
+        Returns:
+            The IP address as a string in dotted decimal notation.
+
+        """
+        return '.'.join(_compat_str(struct.unpack(b'!B', b)[0]
+                                    if isinstance(b, bytes)
+                                    else b)
+                        for b in _compat_to_bytes(ip_int, 4, 'big'))
+
+    def _is_hostmask(self, ip_str):
+        """Test if the IP string is a hostmask (rather than a netmask).
+
+        Args:
+            ip_str: A string, the potential hostmask.
+
+        Returns:
+            A boolean, True if the IP string is a hostmask.
+
+        """
+        bits = ip_str.split('.')
+        try:
+            parts = [x for x in map(int, bits) if x in self._valid_mask_octets]
+        except ValueError:
+            return False
+        if len(parts) != len(bits):
+            return False
+        if parts[0] < parts[-1]:
+            return True
+        return False
+
+    def _reverse_pointer(self):
+        """Return the reverse DNS pointer name for the IPv4 address.
+
+        This implements the method described in RFC1035 3.5.
+
+        """
+        reverse_octets = _compat_str(self).split('.')[::-1]
+        return '.'.join(reverse_octets) + '.in-addr.arpa'
+
+    @property
+    def max_prefixlen(self):
+        return self._max_prefixlen
+
+    @property
+    def version(self):
+        return self._version
+
+
+class IPv4Address(_BaseV4, _BaseAddress):
+
+    """Represent and manipulate single IPv4 Addresses."""
+
+    __slots__ = ('_ip', '__weakref__')
+
+    def __init__(self, address):
+
+        """
+        Args:
+            address: A string or integer representing the IP
+
+              Additionally, an integer can be passed, so
+              IPv4Address('192.0.2.1') == IPv4Address(3221225985).
+              or, more generally
+              IPv4Address(int(IPv4Address('192.0.2.1'))) ==
+                IPv4Address('192.0.2.1')
+
+        Raises:
+            AddressValueError: If ipaddress isn't a valid IPv4 address.
+
+        """
+        # Efficient constructor from integer.
+        if isinstance(address, _compat_int_types):
+            self._check_int_address(address)
+            self._ip = address
+            return
+
+        # Constructing from a packed address
+        if isinstance(address, bytes):
+            self._check_packed_address(address, 4)
+            bvs = _compat_bytes_to_byte_vals(address)
+            self._ip = _compat_int_from_byte_vals(bvs, 'big')
+            return
+
+        # Assume input argument to be string or any object representation
+        # which converts into a formatted IP string.
+        addr_str = _compat_str(address)
+        if '/' in addr_str:
+            raise AddressValueError("Unexpected '/' in %r" % address)
+        self._ip = self._ip_int_from_string(addr_str)
+
+    @property
+    def packed(self):
+        """The binary representation of this address."""
+        return v4_int_to_packed(self._ip)
+
+    @property
+    def is_reserved(self):
+        """Test if the address is otherwise IETF reserved.
+
+         Returns:
+             A boolean, True if the address is within the
+             reserved IPv4 Network range.
+
+        """
+        return self in self._constants._reserved_network
+
+    @property
+    def is_private(self):
+        """Test if this address is allocated for private networks.
+
+        Returns:
+            A boolean, True if the address is reserved per
+            iana-ipv4-special-registry.
+
+        """
+        return any(self in net for net in self._constants._private_networks)
+
+    @property
+    def is_global(self):
+        return (
+            self not in self._constants._public_network and
+            not self.is_private)
+
+    @property
+    def is_multicast(self):
+        """Test if the address is reserved for multicast use.
+
+        Returns:
+            A boolean, True if the address is multicast.
+            See RFC 3171 for details.
+
+        """
+        return self in self._constants._multicast_network
+
+    @property
+    def is_unspecified(self):
+        """Test if the address is unspecified.
+
+        Returns:
+            A boolean, True if this is the unspecified address as defined in
+            RFC 5735 3.
+
+        """
+        return self == self._constants._unspecified_address
+
+    @property
+    def is_loopback(self):
+        """Test if the address is a loopback address.
+
+        Returns:
+            A boolean, True if the address is a loopback per RFC 3330.
+
+        """
+        return self in self._constants._loopback_network
+
+    @property
+    def is_link_local(self):
+        """Test if the address is reserved for link-local.
+
+        Returns:
+            A boolean, True if the address is link-local per RFC 3927.
+
+        """
+        return self in self._constants._linklocal_network
+
+
+class IPv4Interface(IPv4Address):
+
+    def __init__(self, address):
+        if isinstance(address, (bytes, _compat_int_types)):
+            IPv4Address.__init__(self, address)
+            self.network = IPv4Network(self._ip)
+            self._prefixlen = self._max_prefixlen
+            return
+
+        if isinstance(address, tuple):
+            IPv4Address.__init__(self, address[0])
+            if len(address) > 1:
+                self._prefixlen = int(address[1])
+            else:
+                self._prefixlen = self._max_prefixlen
+
+            self.network = IPv4Network(address, strict=False)
+            self.netmask = self.network.netmask
+            self.hostmask = self.network.hostmask
+            return
+
+        addr = _split_optional_netmask(address)
+        IPv4Address.__init__(self, addr[0])
+
+        self.network = IPv4Network(address, strict=False)
+        self._prefixlen = self.network._prefixlen
+
+        self.netmask = self.network.netmask
+        self.hostmask = self.network.hostmask
+
+    def __str__(self):
+        return '%s/%d' % (self._string_from_ip_int(self._ip),
+                          self.network.prefixlen)
+
+    def __eq__(self, other):
+        address_equal = IPv4Address.__eq__(self, other)
+        if not address_equal or address_equal is NotImplemented:
+            return address_equal
+        try:
+            return self.network == other.network
+        except AttributeError:
+            # An interface with an associated network is NOT the
+            # same as an unassociated address. That's why the hash
+            # takes the extra info into account.
+            return False
+
+    def __lt__(self, other):
+        address_less = IPv4Address.__lt__(self, other)
+        if address_less is NotImplemented:
+            return NotImplemented
+        try:
+            return self.network < other.network
+        except AttributeError:
+            # We *do* allow addresses and interfaces to be sorted. The
+            # unassociated address is considered less than all interfaces.
+            return False
+
+    def __hash__(self):
+        return self._ip ^ self._prefixlen ^ int(self.network.network_address)
+
+    __reduce__ = _IPAddressBase.__reduce__
+
+    @property
+    def ip(self):
+        return IPv4Address(self._ip)
+
+    @property
+    def with_prefixlen(self):
+        return '%s/%s' % (self._string_from_ip_int(self._ip),
+                          self._prefixlen)
+
+    @property
+    def with_netmask(self):
+        return '%s/%s' % (self._string_from_ip_int(self._ip),
+                          self.netmask)
+
+    @property
+    def with_hostmask(self):
+        return '%s/%s' % (self._string_from_ip_int(self._ip),
+                          self.hostmask)
+
+
+class IPv4Network(_BaseV4, _BaseNetwork):
+
+    """This class represents and manipulates 32-bit IPv4 network + addresses..
+
+    Attributes: [examples for IPv4Network('192.0.2.0/27')]
+        .network_address: IPv4Address('192.0.2.0')
+        .hostmask: IPv4Address('0.0.0.31')
+        .broadcast_address: IPv4Address('192.0.2.32')
+        .netmask: IPv4Address('255.255.255.224')
+        .prefixlen: 27
+
+    """
+    # Class to use when creating address objects
+    _address_class = IPv4Address
+
+    def __init__(self, address, strict=True):
+
+        """Instantiate a new IPv4 network object.
+
+        Args:
+            address: A string or integer representing the IP [& network].
+              '192.0.2.0/24'
+              '192.0.2.0/255.255.255.0'
+              '192.0.0.2/0.0.0.255'
+              are all functionally the same in IPv4. Similarly,
+              '192.0.2.1'
+              '192.0.2.1/255.255.255.255'
+              '192.0.2.1/32'
+              are also functionally equivalent. That is to say, failing to
+              provide a subnetmask will create an object with a mask of /32.
+
+              If the mask (portion after the / in the argument) is given in
+              dotted quad form, it is treated as a netmask if it starts with a
+              non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it
+              starts with a zero field (e.g. 0.255.255.255 == /8), with the
+              single exception of an all-zero mask which is treated as a
+              netmask == /0. If no mask is given, a default of /32 is used.
+
+              Additionally, an integer can be passed, so
+              IPv4Network('192.0.2.1') == IPv4Network(3221225985)
+              or, more generally
+              IPv4Interface(int(IPv4Interface('192.0.2.1'))) ==
+                IPv4Interface('192.0.2.1')
+
+        Raises:
+            AddressValueError: If ipaddress isn't a valid IPv4 address.
+            NetmaskValueError: If the netmask isn't valid for
+              an IPv4 address.
+            ValueError: If strict is True and a network address is not
+              supplied.
+
+        """
+        _BaseNetwork.__init__(self, address)
+
+        # Constructing from a packed address or integer
+        if isinstance(address, (_compat_int_types, bytes)):
+            self.network_address = IPv4Address(address)
+            self.netmask, self._prefixlen = self._make_netmask(
+                self._max_prefixlen)
+            # fixme: address/network test here.
+            return
+
+        if isinstance(address, tuple):
+            if len(address) > 1:
+                arg = address[1]
+            else:
+                # We weren't given an address[1]
+                arg = self._max_prefixlen
+            self.network_address = IPv4Address(address[0])
+            self.netmask, self._prefixlen = self._make_netmask(arg)
+            packed = int(self.network_address)
+            if packed & int(self.netmask) != packed:
+                if strict:
+                    raise ValueError('%s has host bits set' % self)
+                else:
+                    self.network_address = IPv4Address(packed &
+                                                       int(self.netmask))
+            return
+
+        # Assume input argument to be string or any object representation
+        # which converts into a formatted IP prefix string.
+        addr = _split_optional_netmask(address)
+        self.network_address = IPv4Address(self._ip_int_from_string(addr[0]))
+
+        if len(addr) == 2:
+            arg = addr[1]
+        else:
+            arg = self._max_prefixlen
+        self.netmask, self._prefixlen = self._make_netmask(arg)
+
+        if strict:
+            if (IPv4Address(int(self.network_address) & int(self.netmask)) !=
+                    self.network_address):
+                raise ValueError('%s has host bits set' % self)
+        self.network_address = IPv4Address(int(self.network_address) &
+                                           int(self.netmask))
+
+        if self._prefixlen == (self._max_prefixlen - 1):
+            self.hosts = self.__iter__
+
+    @property
+    def is_global(self):
+        """Test if this address is allocated for public networks.
+
+        Returns:
+            A boolean, True if the address is not reserved per
+            iana-ipv4-special-registry.
+
+        """
+        return (not (self.network_address in IPv4Network('100.64.0.0/10') and
+                self.broadcast_address in IPv4Network('100.64.0.0/10')) and
+                not self.is_private)
+
+
+class _IPv4Constants(object):
+
+    _linklocal_network = IPv4Network('169.254.0.0/16')
+
+    _loopback_network = IPv4Network('127.0.0.0/8')
+
+    _multicast_network = IPv4Network('224.0.0.0/4')
+
+    _public_network = IPv4Network('100.64.0.0/10')
+
+    _private_networks = [
+        IPv4Network('0.0.0.0/8'),
+        IPv4Network('10.0.0.0/8'),
+        IPv4Network('127.0.0.0/8'),
+        IPv4Network('169.254.0.0/16'),
+        IPv4Network('172.16.0.0/12'),
+        IPv4Network('192.0.0.0/29'),
+        IPv4Network('192.0.0.170/31'),
+        IPv4Network('192.0.2.0/24'),
+        IPv4Network('192.168.0.0/16'),
+        IPv4Network('198.18.0.0/15'),
+        IPv4Network('198.51.100.0/24'),
+        IPv4Network('203.0.113.0/24'),
+        IPv4Network('240.0.0.0/4'),
+        IPv4Network('255.255.255.255/32'),
+    ]
+
+    _reserved_network = IPv4Network('240.0.0.0/4')
+
+    _unspecified_address = IPv4Address('0.0.0.0')
+
+
+IPv4Address._constants = _IPv4Constants
+
+
+class _BaseV6(object):
+
+    """Base IPv6 object.
+
+    The following methods are used by IPv6 objects in both single IP
+    addresses and networks.
+
+    """
+
+    __slots__ = ()
+    _version = 6
+    _ALL_ONES = (2 ** IPV6LENGTH) - 1
+    _HEXTET_COUNT = 8
+    _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef')
+    _max_prefixlen = IPV6LENGTH
+
+    # There are only a bunch of valid v6 netmasks, so we cache them all
+    # when constructed (see _make_netmask()).
+    _netmask_cache = {}
+
+    @classmethod
+    def _make_netmask(cls, arg):
+        """Make a (netmask, prefix_len) tuple from the given argument.
+
+        Argument can be:
+        - an integer (the prefix length)
+        - a string representing the prefix length (e.g. "24")
+        - a string representing the prefix netmask (e.g. "255.255.255.0")
+        """
+        if arg not in cls._netmask_cache:
+            if isinstance(arg, _compat_int_types):
+                prefixlen = arg
+            else:
+                prefixlen = cls._prefix_from_prefix_string(arg)
+            netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen))
+            cls._netmask_cache[arg] = netmask, prefixlen
+        return cls._netmask_cache[arg]
+
+    @classmethod
+    def _ip_int_from_string(cls, ip_str):
+        """Turn an IPv6 ip_str into an integer.
+
+        Args:
+            ip_str: A string, the IPv6 ip_str.
+
+        Returns:
+            An int, the IPv6 address
+
+        Raises:
+            AddressValueError: if ip_str isn't a valid IPv6 Address.
+
+        """
+        if not ip_str:
+            raise AddressValueError('Address cannot be empty')
+
+        parts = ip_str.split(':')
+
+        # An IPv6 address needs at least 2 colons (3 parts).
+        _min_parts = 3
+        if len(parts) < _min_parts:
+            msg = "At least %d parts expected in %r" % (_min_parts, ip_str)
+            raise AddressValueError(msg)
+
+        # If the address has an IPv4-style suffix, convert it to hexadecimal.
+        if '.' in parts[-1]:
+            try:
+                ipv4_int = IPv4Address(parts.pop())._ip
+            except AddressValueError as exc:
+                raise AddressValueError("%s in %r" % (exc, ip_str))
+            parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF))
+            parts.append('%x' % (ipv4_int & 0xFFFF))
+
+        # An IPv6 address can't have more than 8 colons (9 parts).
+        # The extra colon comes from using the "::" notation for a single
+        # leading or trailing zero part.
+        _max_parts = cls._HEXTET_COUNT + 1
+        if len(parts) > _max_parts:
+            msg = "At most %d colons permitted in %r" % (
+                _max_parts - 1, ip_str)
+            raise AddressValueError(msg)
+
+        # Disregarding the endpoints, find '::' with nothing in between.
+        # This indicates that a run of zeroes has been skipped.
+        skip_index = None
+        for i in _compat_range(1, len(parts) - 1):
+            if not parts[i]:
+                if skip_index is not None:
+                    # Can't have more than one '::'
+                    msg = "At most one '::' permitted in %r" % ip_str
+                    raise AddressValueError(msg)
+                skip_index = i
+
+        # parts_hi is the number of parts to copy from above/before the '::'
+        # parts_lo is the number of parts to copy from below/after the '::'
+        if skip_index is not None:
+            # If we found a '::', then check if it also covers the endpoints.
+            parts_hi = skip_index
+            parts_lo = len(parts) - skip_index - 1
+            if not parts[0]:
+                parts_hi -= 1
+                if parts_hi:
+                    msg = "Leading ':' only permitted as part of '::' in %r"
+                    raise AddressValueError(msg % ip_str)  # ^: requires ^::
+            if not parts[-1]:
+                parts_lo -= 1
+                if parts_lo:
+                    msg = "Trailing ':' only permitted as part of '::' in %r"
+                    raise AddressValueError(msg % ip_str)  # :$ requires ::$
+            parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo)
+            if parts_skipped < 1:
+                msg = "Expected at most %d other parts with '::' in %r"
+                raise AddressValueError(msg % (cls._HEXTET_COUNT - 1, ip_str))
+        else:
+            # Otherwise, allocate the entire address to parts_hi.  The
+            # endpoints could still be empty, but _parse_hextet() will check
+            # for that.
+            if len(parts) != cls._HEXTET_COUNT:
+                msg = "Exactly %d parts expected without '::' in %r"
+                raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str))
+            if not parts[0]:
+                msg = "Leading ':' only permitted as part of '::' in %r"
+                raise AddressValueError(msg % ip_str)  # ^: requires ^::
+            if not parts[-1]:
+                msg = "Trailing ':' only permitted as part of '::' in %r"
+                raise AddressValueError(msg % ip_str)  # :$ requires ::$
+            parts_hi = len(parts)
+            parts_lo = 0
+            parts_skipped = 0
+
+        try:
+            # Now, parse the hextets into a 128-bit integer.
+            ip_int = 0
+            for i in range(parts_hi):
+                ip_int <<= 16
+                ip_int |= cls._parse_hextet(parts[i])
+            ip_int <<= 16 * parts_skipped
+            for i in range(-parts_lo, 0):
+                ip_int <<= 16
+                ip_int |= cls._parse_hextet(parts[i])
+            return ip_int
+        except ValueError as exc:
+            raise AddressValueError("%s in %r" % (exc, ip_str))
+
+    @classmethod
+    def _parse_hextet(cls, hextet_str):
+        """Convert an IPv6 hextet string into an integer.
+
+        Args:
+            hextet_str: A string, the number to parse.
+
+        Returns:
+            The hextet as an integer.
+
+        Raises:
+            ValueError: if the input isn't strictly a hex number from
+              [0..FFFF].
+
+        """
+        # Whitelist the characters, since int() allows a lot of bizarre stuff.
+        if not cls._HEX_DIGITS.issuperset(hextet_str):
+            raise ValueError("Only hex digits permitted in %r" % hextet_str)
+        # We do the length check second, since the invalid character error
+        # is likely to be more informative for the user
+        if len(hextet_str) > 4:
+            msg = "At most 4 characters permitted in %r"
+            raise ValueError(msg % hextet_str)
+        # Length check means we can skip checking the integer value
+        return int(hextet_str, 16)
+
+    @classmethod
+    def _compress_hextets(cls, hextets):
+        """Compresses a list of hextets.
+
+        Compresses a list of strings, replacing the longest continuous
+        sequence of "0" in the list with "" and adding empty strings at
+        the beginning or at the end of the string such that subsequently
+        calling ":".join(hextets) will produce the compressed version of
+        the IPv6 address.
+
+        Args:
+            hextets: A list of strings, the hextets to compress.
+
+        Returns:
+            A list of strings.
+
+        """
+        best_doublecolon_start = -1
+        best_doublecolon_len = 0
+        doublecolon_start = -1
+        doublecolon_len = 0
+        for index, hextet in enumerate(hextets):
+            if hextet == '0':
+                doublecolon_len += 1
+                if doublecolon_start == -1:
+                    # Start of a sequence of zeros.
+                    doublecolon_start = index
+                if doublecolon_len > best_doublecolon_len:
+                    # This is the longest sequence of zeros so far.
+                    best_doublecolon_len = doublecolon_len
+                    best_doublecolon_start = doublecolon_start
+            else:
+                doublecolon_len = 0
+                doublecolon_start = -1
+
+        if best_doublecolon_len > 1:
+            best_doublecolon_end = (best_doublecolon_start +
+                                    best_doublecolon_len)
+            # For zeros at the end of the address.
+            if best_doublecolon_end == len(hextets):
+                hextets += ['']
+            hextets[best_doublecolon_start:best_doublecolon_end] = ['']
+            # For zeros at the beginning of the address.
+            if best_doublecolon_start == 0:
+                hextets = [''] + hextets
+
+        return hextets
+
+    @classmethod
+    def _string_from_ip_int(cls, ip_int=None):
+        """Turns a 128-bit integer into hexadecimal notation.
+
+        Args:
+            ip_int: An integer, the IP address.
+
+        Returns:
+            A string, the hexadecimal representation of the address.
+
+        Raises:
+            ValueError: The address is bigger than 128 bits of all ones.
+
+        """
+        if ip_int is None:
+            ip_int = int(cls._ip)
+
+        if ip_int > cls._ALL_ONES:
+            raise ValueError('IPv6 address is too large')
+
+        hex_str = '%032x' % ip_int
+        hextets = ['%x' % int(hex_str[x:x + 4], 16) for x in range(0, 32, 4)]
+
+        hextets = cls._compress_hextets(hextets)
+        return ':'.join(hextets)
+
+    def _explode_shorthand_ip_string(self):
+        """Expand a shortened IPv6 address.
+
+        Args:
+            ip_str: A string, the IPv6 address.
+
+        Returns:
+            A string, the expanded IPv6 address.
+
+        """
+        if isinstance(self, IPv6Network):
+            ip_str = _compat_str(self.network_address)
+        elif isinstance(self, IPv6Interface):
+            ip_str = _compat_str(self.ip)
+        else:
+            ip_str = _compat_str(self)
+
+        ip_int = self._ip_int_from_string(ip_str)
+        hex_str = '%032x' % ip_int
+        parts = [hex_str[x:x + 4] for x in range(0, 32, 4)]
+        if isinstance(self, (_BaseNetwork, IPv6Interface)):
+            return '%s/%d' % (':'.join(parts), self._prefixlen)
+        return ':'.join(parts)
+
+    def _reverse_pointer(self):
+        """Return the reverse DNS pointer name for the IPv6 address.
+
+        This implements the method described in RFC3596 2.5.
+
+        """
+        reverse_chars = self.exploded[::-1].replace(':', '')
+        return '.'.join(reverse_chars) + '.ip6.arpa'
+
+    @property
+    def max_prefixlen(self):
+        return self._max_prefixlen
+
+    @property
+    def version(self):
+        return self._version
+
+
+class IPv6Address(_BaseV6, _BaseAddress):
+
+    """Represent and manipulate single IPv6 Addresses."""
+
+    __slots__ = ('_ip', '__weakref__')
+
+    def __init__(self, address):
+        """Instantiate a new IPv6 address object.
+
+        Args:
+            address: A string or integer representing the IP
+
+              Additionally, an integer can be passed, so
+              IPv6Address('2001:db8::') ==
+                IPv6Address(42540766411282592856903984951653826560)
+              or, more generally
+              IPv6Address(int(IPv6Address('2001:db8::'))) ==
+                IPv6Address('2001:db8::')
+
+        Raises:
+            AddressValueError: If address isn't a valid IPv6 address.
+
+        """
+        # Efficient constructor from integer.
+        if isinstance(address, _compat_int_types):
+            self._check_int_address(address)
+            self._ip = address
+            return
+
+        # Constructing from a packed address
+        if isinstance(address, bytes):
+            self._check_packed_address(address, 16)
+            bvs = _compat_bytes_to_byte_vals(address)
+            self._ip = _compat_int_from_byte_vals(bvs, 'big')
+            return
+
+        # Assume input argument to be string or any object representation
+        # which converts into a formatted IP string.
+        addr_str = _compat_str(address)
+        if '/' in addr_str:
+            raise AddressValueError("Unexpected '/' in %r" % address)
+        self._ip = self._ip_int_from_string(addr_str)
+
+    @property
+    def packed(self):
+        """The binary representation of this address."""
+        return v6_int_to_packed(self._ip)
+
+    @property
+    def is_multicast(self):
+        """Test if the address is reserved for multicast use.
+
+        Returns:
+            A boolean, True if the address is a multicast address.
+            See RFC 2373 2.7 for details.
+
+        """
+        return self in self._constants._multicast_network
+
+    @property
+    def is_reserved(self):
+        """Test if the address is otherwise IETF reserved.
+
+        Returns:
+            A boolean, True if the address is within one of the
+            reserved IPv6 Network ranges.
+
+        """
+        return any(self in x for x in self._constants._reserved_networks)
+
+    @property
+    def is_link_local(self):
+        """Test if the address is reserved for link-local.
+
+        Returns:
+            A boolean, True if the address is reserved per RFC 4291.
+
+        """
+        return self in self._constants._linklocal_network
+
+    @property
+    def is_site_local(self):
+        """Test if the address is reserved for site-local.
+
+        Note that the site-local address space has been deprecated by RFC 3879.
+        Use is_private to test if this address is in the space of unique local
+        addresses as defined by RFC 4193.
+
+        Returns:
+            A boolean, True if the address is reserved per RFC 3513 2.5.6.
+
+        """
+        return self in self._constants._sitelocal_network
+
+    @property
+    def is_private(self):
+        """Test if this address is allocated for private networks.
+
+        Returns:
+            A boolean, True if the address is reserved per
+            iana-ipv6-special-registry.
+
+        """
+        return any(self in net for net in self._constants._private_networks)
+
+    @property
+    def is_global(self):
+        """Test if this address is allocated for public networks.
+
+        Returns:
+            A boolean, true if the address is not reserved per
+            iana-ipv6-special-registry.
+
+        """
+        return not self.is_private
+
+    @property
+    def is_unspecified(self):
+        """Test if the address is unspecified.
+
+        Returns:
+            A boolean, True if this is the unspecified address as defined in
+            RFC 2373 2.5.2.
+
+        """
+        return self._ip == 0
+
+    @property
+    def is_loopback(self):
+        """Test if the address is a loopback address.
+
+        Returns:
+            A boolean, True if the address is a loopback address as defined in
+            RFC 2373 2.5.3.
+
+        """
+        return self._ip == 1
+
+    @property
+    def ipv4_mapped(self):
+        """Return the IPv4 mapped address.
+
+        Returns:
+            If the IPv6 address is a v4 mapped address, return the
+            IPv4 mapped address. Return None otherwise.
+
+        """
+        if (self._ip >> 32) != 0xFFFF:
+            return None
+        return IPv4Address(self._ip & 0xFFFFFFFF)
+
+    @property
+    def teredo(self):
+        """Tuple of embedded teredo IPs.
+
+        Returns:
+            Tuple of the (server, client) IPs or None if the address
+            doesn't appear to be a teredo address (doesn't start with
+            2001::/32)
+
+        """
+        if (self._ip >> 96) != 0x20010000:
+            return None
+        return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF),
+                IPv4Address(~self._ip & 0xFFFFFFFF))
+
+    @property
+    def sixtofour(self):
+        """Return the IPv4 6to4 embedded address.
+
+        Returns:
+            The IPv4 6to4-embedded address if present or None if the
+            address doesn't appear to contain a 6to4 embedded address.
+
+        """
+        if (self._ip >> 112) != 0x2002:
+            return None
+        return IPv4Address((self._ip >> 80) & 0xFFFFFFFF)
+
+
+class IPv6Interface(IPv6Address):
+
+    def __init__(self, address):
+        if isinstance(address, (bytes, _compat_int_types)):
+            IPv6Address.__init__(self, address)
+            self.network = IPv6Network(self._ip)
+            self._prefixlen = self._max_prefixlen
+            return
+        if isinstance(address, tuple):
+            IPv6Address.__init__(self, address[0])
+            if len(address) > 1:
+                self._prefixlen = int(address[1])
+            else:
+                self._prefixlen = self._max_prefixlen
+            self.network = IPv6Network(address, strict=False)
+            self.netmask = self.network.netmask
+            self.hostmask = self.network.hostmask
+            return
+
+        addr = _split_optional_netmask(address)
+        IPv6Address.__init__(self, addr[0])
+        self.network = IPv6Network(address, strict=False)
+        self.netmask = self.network.netmask
+        self._prefixlen = self.network._prefixlen
+        self.hostmask = self.network.hostmask
+
+    def __str__(self):
+        return '%s/%d' % (self._string_from_ip_int(self._ip),
+                          self.network.prefixlen)
+
+    def __eq__(self, other):
+        address_equal = IPv6Address.__eq__(self, other)
+        if not address_equal or address_equal is NotImplemented:
+            return address_equal
+        try:
+            return self.network == other.network
+        except AttributeError:
+            # An interface with an associated network is NOT the
+            # same as an unassociated address. That's why the hash
+            # takes the extra info into account.
+            return False
+
+    def __lt__(self, other):
+        address_less = IPv6Address.__lt__(self, other)
+        if address_less is NotImplemented:
+            return NotImplemented
+        try:
+            return self.network < other.network
+        except AttributeError:
+            # We *do* allow addresses and interfaces to be sorted. The
+            # unassociated address is considered less than all interfaces.
+            return False
+
+    def __hash__(self):
+        return self._ip ^ self._prefixlen ^ int(self.network.network_address)
+
+    __reduce__ = _IPAddressBase.__reduce__
+
+    @property
+    def ip(self):
+        return IPv6Address(self._ip)
+
+    @property
+    def with_prefixlen(self):
+        return '%s/%s' % (self._string_from_ip_int(self._ip),
+                          self._prefixlen)
+
+    @property
+    def with_netmask(self):
+        return '%s/%s' % (self._string_from_ip_int(self._ip),
+                          self.netmask)
+
+    @property
+    def with_hostmask(self):
+        return '%s/%s' % (self._string_from_ip_int(self._ip),
+                          self.hostmask)
+
+    @property
+    def is_unspecified(self):
+        return self._ip == 0 and self.network.is_unspecified
+
+    @property
+    def is_loopback(self):
+        return self._ip == 1 and self.network.is_loopback
+
+
+class IPv6Network(_BaseV6, _BaseNetwork):
+
+    """This class represents and manipulates 128-bit IPv6 networks.
+
+    Attributes: [examples for IPv6('2001:db8::1000/124')]
+        .network_address: IPv6Address('2001:db8::1000')
+        .hostmask: IPv6Address('::f')
+        .broadcast_address: IPv6Address('2001:db8::100f')
+        .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0')
+        .prefixlen: 124
+
+    """
+
+    # Class to use when creating address objects
+    _address_class = IPv6Address
+
+    def __init__(self, address, strict=True):
+        """Instantiate a new IPv6 Network object.
+
+        Args:
+            address: A string or integer representing the IPv6 network or the
+              IP and prefix/netmask.
+              '2001:db8::/128'
+              '2001:db8:0000:0000:0000:0000:0000:0000/128'
+              '2001:db8::'
+              are all functionally the same in IPv6.  That is to say,
+              failing to provide a subnetmask will create an object with
+              a mask of /128.
+
+              Additionally, an integer can be passed, so
+              IPv6Network('2001:db8::') ==
+                IPv6Network(42540766411282592856903984951653826560)
+              or, more generally
+              IPv6Network(int(IPv6Network('2001:db8::'))) ==
+                IPv6Network('2001:db8::')
+
+            strict: A boolean. If true, ensure that we have been passed
+              A true network address, eg, 2001:db8::1000/124 and not an
+              IP address on a network, eg, 2001:db8::1/124.
+
+        Raises:
+            AddressValueError: If address isn't a valid IPv6 address.
+            NetmaskValueError: If the netmask isn't valid for
+              an IPv6 address.
+            ValueError: If strict was True and a network address was not
+              supplied.
+
+        """
+        _BaseNetwork.__init__(self, address)
+
+        # Efficient constructor from integer or packed address
+        if isinstance(address, (bytes, _compat_int_types)):
+            self.network_address = IPv6Address(address)
+            self.netmask, self._prefixlen = self._make_netmask(
+                self._max_prefixlen)
+            return
+
+        if isinstance(address, tuple):
+            if len(address) > 1:
+                arg = address[1]
+            else:
+                arg = self._max_prefixlen
+            self.netmask, self._prefixlen = self._make_netmask(arg)
+            self.network_address = IPv6Address(address[0])
+            packed = int(self.network_address)
+            if packed & int(self.netmask) != packed:
+                if strict:
+                    raise ValueError('%s has host bits set' % self)
+                else:
+                    self.network_address = IPv6Address(packed &
+                                                       int(self.netmask))
+            return
+
+        # Assume input argument to be string or any object representation
+        # which converts into a formatted IP prefix string.
+        addr = _split_optional_netmask(address)
+
+        self.network_address = IPv6Address(self._ip_int_from_string(addr[0]))
+
+        if len(addr) == 2:
+            arg = addr[1]
+        else:
+            arg = self._max_prefixlen
+        self.netmask, self._prefixlen = self._make_netmask(arg)
+
+        if strict:
+            if (IPv6Address(int(self.network_address) & int(self.netmask)) !=
+                    self.network_address):
+                raise ValueError('%s has host bits set' % self)
+        self.network_address = IPv6Address(int(self.network_address) &
+                                           int(self.netmask))
+
+        if self._prefixlen == (self._max_prefixlen - 1):
+            self.hosts = self.__iter__
+
+    def hosts(self):
+        """Generate Iterator over usable hosts in a network.
+
+          This is like __iter__ except it doesn't return the
+          Subnet-Router anycast address.
+
+        """
+        network = int(self.network_address)
+        broadcast = int(self.broadcast_address)
+        for x in _compat_range(network + 1, broadcast + 1):
+            yield self._address_class(x)
+
+    @property
+    def is_site_local(self):
+        """Test if the address is reserved for site-local.
+
+        Note that the site-local address space has been deprecated by RFC 3879.
+        Use is_private to test if this address is in the space of unique local
+        addresses as defined by RFC 4193.
+
+        Returns:
+            A boolean, True if the address is reserved per RFC 3513 2.5.6.
+
+        """
+        return (self.network_address.is_site_local and
+                self.broadcast_address.is_site_local)
+
+
+class _IPv6Constants(object):
+
+    _linklocal_network = IPv6Network('fe80::/10')
+
+    _multicast_network = IPv6Network('ff00::/8')
+
+    _private_networks = [
+        IPv6Network('::1/128'),
+        IPv6Network('::/128'),
+        IPv6Network('::ffff:0:0/96'),
+        IPv6Network('100::/64'),
+        IPv6Network('2001::/23'),
+        IPv6Network('2001:2::/48'),
+        IPv6Network('2001:db8::/32'),
+        IPv6Network('2001:10::/28'),
+        IPv6Network('fc00::/7'),
+        IPv6Network('fe80::/10'),
+    ]
+
+    _reserved_networks = [
+        IPv6Network('::/8'), IPv6Network('100::/8'),
+        IPv6Network('200::/7'), IPv6Network('400::/6'),
+        IPv6Network('800::/5'), IPv6Network('1000::/4'),
+        IPv6Network('4000::/3'), IPv6Network('6000::/3'),
+        IPv6Network('8000::/3'), IPv6Network('A000::/3'),
+        IPv6Network('C000::/3'), IPv6Network('E000::/4'),
+        IPv6Network('F000::/5'), IPv6Network('F800::/6'),
+        IPv6Network('FE00::/9'),
+    ]
+
+    _sitelocal_network = IPv6Network('fec0::/10')
+
+
+IPv6Address._constants = _IPv6Constants
diff --git a/vendor/pip-9.0.3/pip/_vendor/lockfile/__init__.py b/vendor/pip-9.0.3/pip/_vendor/lockfile/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..a6f44a55c6377c746ec8ca831999fdde5e401aa6
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/lockfile/__init__.py
@@ -0,0 +1,347 @@
+# -*- coding: utf-8 -*-
+
+"""
+lockfile.py - Platform-independent advisory file locks.
+
+Requires Python 2.5 unless you apply 2.4.diff
+Locking is done on a per-thread basis instead of a per-process basis.
+
+Usage:
+
+>>> lock = LockFile('somefile')
+>>> try:
+...     lock.acquire()
+... except AlreadyLocked:
+...     print 'somefile', 'is locked already.'
+... except LockFailed:
+...     print 'somefile', 'can\\'t be locked.'
+... else:
+...     print 'got lock'
+got lock
+>>> print lock.is_locked()
+True
+>>> lock.release()
+
+>>> lock = LockFile('somefile')
+>>> print lock.is_locked()
+False
+>>> with lock:
+...    print lock.is_locked()
+True
+>>> print lock.is_locked()
+False
+
+>>> lock = LockFile('somefile')
+>>> # It is okay to lock twice from the same thread...
+>>> with lock:
+...     lock.acquire()
+...
+>>> # Though no counter is kept, so you can't unlock multiple times...
+>>> print lock.is_locked()
+False
+
+Exceptions:
+
+    Error - base class for other exceptions
+        LockError - base class for all locking exceptions
+            AlreadyLocked - Another thread or process already holds the lock
+            LockFailed - Lock failed for some other reason
+        UnlockError - base class for all unlocking exceptions
+            AlreadyUnlocked - File was not locked.
+            NotMyLock - File was locked but not by the current thread/process
+"""
+
+from __future__ import absolute_import
+
+import functools
+import os
+import socket
+import threading
+import warnings
+
+# Work with PEP8 and non-PEP8 versions of threading module.
+if not hasattr(threading, "current_thread"):
+    threading.current_thread = threading.currentThread
+if not hasattr(threading.Thread, "get_name"):
+    threading.Thread.get_name = threading.Thread.getName
+
+__all__ = ['Error', 'LockError', 'LockTimeout', 'AlreadyLocked',
+           'LockFailed', 'UnlockError', 'NotLocked', 'NotMyLock',
+           'LinkFileLock', 'MkdirFileLock', 'SQLiteFileLock',
+           'LockBase', 'locked']
+
+
+class Error(Exception):
+    """
+    Base class for other exceptions.
+
+    >>> try:
+    ...   raise Error
+    ... except Exception:
+    ...   pass
+    """
+    pass
+
+
+class LockError(Error):
+    """
+    Base class for error arising from attempts to acquire the lock.
+
+    >>> try:
+    ...   raise LockError
+    ... except Error:
+    ...   pass
+    """
+    pass
+
+
+class LockTimeout(LockError):
+    """Raised when lock creation fails within a user-defined period of time.
+
+    >>> try:
+    ...   raise LockTimeout
+    ... except LockError:
+    ...   pass
+    """
+    pass
+
+
+class AlreadyLocked(LockError):
+    """Some other thread/process is locking the file.
+
+    >>> try:
+    ...   raise AlreadyLocked
+    ... except LockError:
+    ...   pass
+    """
+    pass
+
+
+class LockFailed(LockError):
+    """Lock file creation failed for some other reason.
+
+    >>> try:
+    ...   raise LockFailed
+    ... except LockError:
+    ...   pass
+    """
+    pass
+
+
+class UnlockError(Error):
+    """
+    Base class for errors arising from attempts to release the lock.
+
+    >>> try:
+    ...   raise UnlockError
+    ... except Error:
+    ...   pass
+    """
+    pass
+
+
+class NotLocked(UnlockError):
+    """Raised when an attempt is made to unlock an unlocked file.
+
+    >>> try:
+    ...   raise NotLocked
+    ... except UnlockError:
+    ...   pass
+    """
+    pass
+
+
+class NotMyLock(UnlockError):
+    """Raised when an attempt is made to unlock a file someone else locked.
+
+    >>> try:
+    ...   raise NotMyLock
+    ... except UnlockError:
+    ...   pass
+    """
+    pass
+
+
+class _SharedBase(object):
+    def __init__(self, path):
+        self.path = path
+
+    def acquire(self, timeout=None):
+        """
+        Acquire the lock.
+
+        * If timeout is omitted (or None), wait forever trying to lock the
+          file.
+
+        * If timeout > 0, try to acquire the lock for that many seconds.  If
+          the lock period expires and the file is still locked, raise
+          LockTimeout.
+
+        * If timeout <= 0, raise AlreadyLocked immediately if the file is
+          already locked.
+        """
+        raise NotImplemented("implement in subclass")
+
+    def release(self):
+        """
+        Release the lock.
+
+        If the file is not locked, raise NotLocked.
+        """
+        raise NotImplemented("implement in subclass")
+
+    def __enter__(self):
+        """
+        Context manager support.
+        """
+        self.acquire()
+        return self
+
+    def __exit__(self, *_exc):
+        """
+        Context manager support.
+        """
+        self.release()
+
+    def __repr__(self):
+        return "<%s: %r>" % (self.__class__.__name__, self.path)
+
+
+class LockBase(_SharedBase):
+    """Base class for platform-specific lock classes."""
+    def __init__(self, path, threaded=True, timeout=None):
+        """
+        >>> lock = LockBase('somefile')
+        >>> lock = LockBase('somefile', threaded=False)
+        """
+        super(LockBase, self).__init__(path)
+        self.lock_file = os.path.abspath(path) + ".lock"
+        self.hostname = socket.gethostname()
+        self.pid = os.getpid()
+        if threaded:
+            t = threading.current_thread()
+            # Thread objects in Python 2.4 and earlier do not have ident
+            # attrs.  Worm around that.
+            ident = getattr(t, "ident", hash(t))
+            self.tname = "-%x" % (ident & 0xffffffff)
+        else:
+            self.tname = ""
+        dirname = os.path.dirname(self.lock_file)
+
+        # unique name is mostly about the current process, but must
+        # also contain the path -- otherwise, two adjacent locked
+        # files conflict (one file gets locked, creating lock-file and
+        # unique file, the other one gets locked, creating lock-file
+        # and overwriting the already existing lock-file, then one
+        # gets unlocked, deleting both lock-file and unique file,
+        # finally the last lock errors out upon releasing.
+        self.unique_name = os.path.join(dirname,
+                                        "%s%s.%s%s" % (self.hostname,
+                                                       self.tname,
+                                                       self.pid,
+                                                       hash(self.path)))
+        self.timeout = timeout
+
+    def is_locked(self):
+        """
+        Tell whether or not the file is locked.
+        """
+        raise NotImplemented("implement in subclass")
+
+    def i_am_locking(self):
+        """
+        Return True if this object is locking the file.
+        """
+        raise NotImplemented("implement in subclass")
+
+    def break_lock(self):
+        """
+        Remove a lock.  Useful if a locking thread failed to unlock.
+        """
+        raise NotImplemented("implement in subclass")
+
+    def __repr__(self):
+        return "<%s: %r -- %r>" % (self.__class__.__name__, self.unique_name,
+                                   self.path)
+
+
+def _fl_helper(cls, mod, *args, **kwds):
+    warnings.warn("Import from %s module instead of lockfile package" % mod,
+                  DeprecationWarning, stacklevel=2)
+    # This is a bit funky, but it's only for awhile.  The way the unit tests
+    # are constructed this function winds up as an unbound method, so it
+    # actually takes three args, not two.  We want to toss out self.
+    if not isinstance(args[0], str):
+        # We are testing, avoid the first arg
+        args = args[1:]
+    if len(args) == 1 and not kwds:
+        kwds["threaded"] = True
+    return cls(*args, **kwds)
+
+
+def LinkFileLock(*args, **kwds):
+    """Factory function provided for backwards compatibility.
+
+    Do not use in new code.  Instead, import LinkLockFile from the
+    lockfile.linklockfile module.
+    """
+    from . import linklockfile
+    return _fl_helper(linklockfile.LinkLockFile, "lockfile.linklockfile",
+                      *args, **kwds)
+
+
+def MkdirFileLock(*args, **kwds):
+    """Factory function provided for backwards compatibility.
+
+    Do not use in new code.  Instead, import MkdirLockFile from the
+    lockfile.mkdirlockfile module.
+    """
+    from . import mkdirlockfile
+    return _fl_helper(mkdirlockfile.MkdirLockFile, "lockfile.mkdirlockfile",
+                      *args, **kwds)
+
+
+def SQLiteFileLock(*args, **kwds):
+    """Factory function provided for backwards compatibility.
+
+    Do not use in new code.  Instead, import SQLiteLockFile from the
+    lockfile.mkdirlockfile module.
+    """
+    from . import sqlitelockfile
+    return _fl_helper(sqlitelockfile.SQLiteLockFile, "lockfile.sqlitelockfile",
+                      *args, **kwds)
+
+
+def locked(path, timeout=None):
+    """Decorator which enables locks for decorated function.
+
+    Arguments:
+     - path: path for lockfile.
+     - timeout (optional): Timeout for acquiring lock.
+
+     Usage:
+         @locked('/var/run/myname', timeout=0)
+         def myname(...):
+             ...
+    """
+    def decor(func):
+        @functools.wraps(func)
+        def wrapper(*args, **kwargs):
+            lock = FileLock(path, timeout=timeout)
+            lock.acquire()
+            try:
+                return func(*args, **kwargs)
+            finally:
+                lock.release()
+        return wrapper
+    return decor
+
+
+if hasattr(os, "link"):
+    from . import linklockfile as _llf
+    LockFile = _llf.LinkLockFile
+else:
+    from . import mkdirlockfile as _mlf
+    LockFile = _mlf.MkdirLockFile
+
+FileLock = LockFile
diff --git a/vendor/pip-9.0.3/pip/_vendor/lockfile/linklockfile.py b/vendor/pip-9.0.3/pip/_vendor/lockfile/linklockfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..2ca9be0423591e61b3382b559473fcc56363cc46
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/lockfile/linklockfile.py
@@ -0,0 +1,73 @@
+from __future__ import absolute_import
+
+import time
+import os
+
+from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout,
+               AlreadyLocked)
+
+
+class LinkLockFile(LockBase):
+    """Lock access to a file using atomic property of link(2).
+
+    >>> lock = LinkLockFile('somefile')
+    >>> lock = LinkLockFile('somefile', threaded=False)
+    """
+
+    def acquire(self, timeout=None):
+        try:
+            open(self.unique_name, "wb").close()
+        except IOError:
+            raise LockFailed("failed to create %s" % self.unique_name)
+
+        timeout = timeout if timeout is not None else self.timeout
+        end_time = time.time()
+        if timeout is not None and timeout > 0:
+            end_time += timeout
+
+        while True:
+            # Try and create a hard link to it.
+            try:
+                os.link(self.unique_name, self.lock_file)
+            except OSError:
+                # Link creation failed.  Maybe we've double-locked?
+                nlinks = os.stat(self.unique_name).st_nlink
+                if nlinks == 2:
+                    # The original link plus the one I created == 2.  We're
+                    # good to go.
+                    return
+                else:
+                    # Otherwise the lock creation failed.
+                    if timeout is not None and time.time() > end_time:
+                        os.unlink(self.unique_name)
+                        if timeout > 0:
+                            raise LockTimeout("Timeout waiting to acquire"
+                                              " lock for %s" %
+                                              self.path)
+                        else:
+                            raise AlreadyLocked("%s is already locked" %
+                                                self.path)
+                    time.sleep(timeout is not None and timeout / 10 or 0.1)
+            else:
+                # Link creation succeeded.  We're good to go.
+                return
+
+    def release(self):
+        if not self.is_locked():
+            raise NotLocked("%s is not locked" % self.path)
+        elif not os.path.exists(self.unique_name):
+            raise NotMyLock("%s is locked, but not by me" % self.path)
+        os.unlink(self.unique_name)
+        os.unlink(self.lock_file)
+
+    def is_locked(self):
+        return os.path.exists(self.lock_file)
+
+    def i_am_locking(self):
+        return (self.is_locked() and
+                os.path.exists(self.unique_name) and
+                os.stat(self.unique_name).st_nlink == 2)
+
+    def break_lock(self):
+        if os.path.exists(self.lock_file):
+            os.unlink(self.lock_file)
diff --git a/vendor/pip-9.0.3/pip/_vendor/lockfile/mkdirlockfile.py b/vendor/pip-9.0.3/pip/_vendor/lockfile/mkdirlockfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..05a8c96ca517271bbd4953d0cf83dc4173521b2e
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/lockfile/mkdirlockfile.py
@@ -0,0 +1,84 @@
+from __future__ import absolute_import, division
+
+import time
+import os
+import sys
+import errno
+
+from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout,
+               AlreadyLocked)
+
+
+class MkdirLockFile(LockBase):
+    """Lock file by creating a directory."""
+    def __init__(self, path, threaded=True, timeout=None):
+        """
+        >>> lock = MkdirLockFile('somefile')
+        >>> lock = MkdirLockFile('somefile', threaded=False)
+        """
+        LockBase.__init__(self, path, threaded, timeout)
+        # Lock file itself is a directory.  Place the unique file name into
+        # it.
+        self.unique_name = os.path.join(self.lock_file,
+                                        "%s.%s%s" % (self.hostname,
+                                                     self.tname,
+                                                     self.pid))
+
+    def acquire(self, timeout=None):
+        timeout = timeout if timeout is not None else self.timeout
+        end_time = time.time()
+        if timeout is not None and timeout > 0:
+            end_time += timeout
+
+        if timeout is None:
+            wait = 0.1
+        else:
+            wait = max(0, timeout / 10)
+
+        while True:
+            try:
+                os.mkdir(self.lock_file)
+            except OSError:
+                err = sys.exc_info()[1]
+                if err.errno == errno.EEXIST:
+                    # Already locked.
+                    if os.path.exists(self.unique_name):
+                        # Already locked by me.
+                        return
+                    if timeout is not None and time.time() > end_time:
+                        if timeout > 0:
+                            raise LockTimeout("Timeout waiting to acquire"
+                                              " lock for %s" %
+                                              self.path)
+                        else:
+                            # Someone else has the lock.
+                            raise AlreadyLocked("%s is already locked" %
+                                                self.path)
+                    time.sleep(wait)
+                else:
+                    # Couldn't create the lock for some other reason
+                    raise LockFailed("failed to create %s" % self.lock_file)
+            else:
+                open(self.unique_name, "wb").close()
+                return
+
+    def release(self):
+        if not self.is_locked():
+            raise NotLocked("%s is not locked" % self.path)
+        elif not os.path.exists(self.unique_name):
+            raise NotMyLock("%s is locked, but not by me" % self.path)
+        os.unlink(self.unique_name)
+        os.rmdir(self.lock_file)
+
+    def is_locked(self):
+        return os.path.exists(self.lock_file)
+
+    def i_am_locking(self):
+        return (self.is_locked() and
+                os.path.exists(self.unique_name))
+
+    def break_lock(self):
+        if os.path.exists(self.lock_file):
+            for name in os.listdir(self.lock_file):
+                os.unlink(os.path.join(self.lock_file, name))
+            os.rmdir(self.lock_file)
diff --git a/vendor/pip-9.0.3/pip/_vendor/lockfile/pidlockfile.py b/vendor/pip-9.0.3/pip/_vendor/lockfile/pidlockfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..069e85b15bdfcb4fd7042222516fbfb046db06c9
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/lockfile/pidlockfile.py
@@ -0,0 +1,190 @@
+# -*- coding: utf-8 -*-
+
+# pidlockfile.py
+#
+# Copyright © 2008–2009 Ben Finney <ben+python@benfinney.id.au>
+#
+# This is free software: you may copy, modify, and/or distribute this work
+# under the terms of the Python Software Foundation License, version 2 or
+# later as published by the Python Software Foundation.
+# No warranty expressed or implied. See the file LICENSE.PSF-2 for details.
+
+""" Lockfile behaviour implemented via Unix PID files.
+    """
+
+from __future__ import absolute_import
+
+import errno
+import os
+import time
+
+from . import (LockBase, AlreadyLocked, LockFailed, NotLocked, NotMyLock,
+               LockTimeout)
+
+
+class PIDLockFile(LockBase):
+    """ Lockfile implemented as a Unix PID file.
+
+    The lock file is a normal file named by the attribute `path`.
+    A lock's PID file contains a single line of text, containing
+    the process ID (PID) of the process that acquired the lock.
+
+    >>> lock = PIDLockFile('somefile')
+    >>> lock = PIDLockFile('somefile')
+    """
+
+    def __init__(self, path, threaded=False, timeout=None):
+        # pid lockfiles don't support threaded operation, so always force
+        # False as the threaded arg.
+        LockBase.__init__(self, path, False, timeout)
+        self.unique_name = self.path
+
+    def read_pid(self):
+        """ Get the PID from the lock file.
+            """
+        return read_pid_from_pidfile(self.path)
+
+    def is_locked(self):
+        """ Test if the lock is currently held.
+
+            The lock is held if the PID file for this lock exists.
+
+            """
+        return os.path.exists(self.path)
+
+    def i_am_locking(self):
+        """ Test if the lock is held by the current process.
+
+        Returns ``True`` if the current process ID matches the
+        number stored in the PID file.
+        """
+        return self.is_locked() and os.getpid() == self.read_pid()
+
+    def acquire(self, timeout=None):
+        """ Acquire the lock.
+
+        Creates the PID file for this lock, or raises an error if
+        the lock could not be acquired.
+        """
+
+        timeout = timeout if timeout is not None else self.timeout
+        end_time = time.time()
+        if timeout is not None and timeout > 0:
+            end_time += timeout
+
+        while True:
+            try:
+                write_pid_to_pidfile(self.path)
+            except OSError as exc:
+                if exc.errno == errno.EEXIST:
+                    # The lock creation failed.  Maybe sleep a bit.
+                    if time.time() > end_time:
+                        if timeout is not None and timeout > 0:
+                            raise LockTimeout("Timeout waiting to acquire"
+                                              " lock for %s" %
+                                              self.path)
+                        else:
+                            raise AlreadyLocked("%s is already locked" %
+                                                self.path)
+                    time.sleep(timeout is not None and timeout / 10 or 0.1)
+                else:
+                    raise LockFailed("failed to create %s" % self.path)
+            else:
+                return
+
+    def release(self):
+        """ Release the lock.
+
+            Removes the PID file to release the lock, or raises an
+            error if the current process does not hold the lock.
+
+            """
+        if not self.is_locked():
+            raise NotLocked("%s is not locked" % self.path)
+        if not self.i_am_locking():
+            raise NotMyLock("%s is locked, but not by me" % self.path)
+        remove_existing_pidfile(self.path)
+
+    def break_lock(self):
+        """ Break an existing lock.
+
+            Removes the PID file if it already exists, otherwise does
+            nothing.
+
+            """
+        remove_existing_pidfile(self.path)
+
+
+def read_pid_from_pidfile(pidfile_path):
+    """ Read the PID recorded in the named PID file.
+
+        Read and return the numeric PID recorded as text in the named
+        PID file. If the PID file cannot be read, or if the content is
+        not a valid PID, return ``None``.
+
+        """
+    pid = None
+    try:
+        pidfile = open(pidfile_path, 'r')
+    except IOError:
+        pass
+    else:
+        # According to the FHS 2.3 section on PID files in /var/run:
+        #
+        #   The file must consist of the process identifier in
+        #   ASCII-encoded decimal, followed by a newline character.
+        #
+        #   Programs that read PID files should be somewhat flexible
+        #   in what they accept; i.e., they should ignore extra
+        #   whitespace, leading zeroes, absence of the trailing
+        #   newline, or additional lines in the PID file.
+
+        line = pidfile.readline().strip()
+        try:
+            pid = int(line)
+        except ValueError:
+            pass
+        pidfile.close()
+
+    return pid
+
+
+def write_pid_to_pidfile(pidfile_path):
+    """ Write the PID in the named PID file.
+
+        Get the numeric process ID (“PID”) of the current process
+        and write it to the named file as a line of text.
+
+        """
+    open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY)
+    open_mode = 0o644
+    pidfile_fd = os.open(pidfile_path, open_flags, open_mode)
+    pidfile = os.fdopen(pidfile_fd, 'w')
+
+    # According to the FHS 2.3 section on PID files in /var/run:
+    #
+    #   The file must consist of the process identifier in
+    #   ASCII-encoded decimal, followed by a newline character. For
+    #   example, if crond was process number 25, /var/run/crond.pid
+    #   would contain three characters: two, five, and newline.
+
+    pid = os.getpid()
+    pidfile.write("%s\n" % pid)
+    pidfile.close()
+
+
+def remove_existing_pidfile(pidfile_path):
+    """ Remove the named PID file if it exists.
+
+        Removing a PID file that doesn't already exist puts us in the
+        desired state, so we ignore the condition if the file does not
+        exist.
+
+        """
+    try:
+        os.remove(pidfile_path)
+    except OSError as exc:
+        if exc.errno == errno.ENOENT:
+            pass
+        else:
+            raise
diff --git a/vendor/pip-9.0.3/pip/_vendor/lockfile/sqlitelockfile.py b/vendor/pip-9.0.3/pip/_vendor/lockfile/sqlitelockfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..f997e2444e75b176761965bbf3e1f82c5c3ad0e2
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/lockfile/sqlitelockfile.py
@@ -0,0 +1,156 @@
+from __future__ import absolute_import, division
+
+import time
+import os
+
+try:
+    unicode
+except NameError:
+    unicode = str
+
+from . import LockBase, NotLocked, NotMyLock, LockTimeout, AlreadyLocked
+
+
+class SQLiteLockFile(LockBase):
+    "Demonstrate SQL-based locking."
+
+    testdb = None
+
+    def __init__(self, path, threaded=True, timeout=None):
+        """
+        >>> lock = SQLiteLockFile('somefile')
+        >>> lock = SQLiteLockFile('somefile', threaded=False)
+        """
+        LockBase.__init__(self, path, threaded, timeout)
+        self.lock_file = unicode(self.lock_file)
+        self.unique_name = unicode(self.unique_name)
+
+        if SQLiteLockFile.testdb is None:
+            import tempfile
+            _fd, testdb = tempfile.mkstemp()
+            os.close(_fd)
+            os.unlink(testdb)
+            del _fd, tempfile
+            SQLiteLockFile.testdb = testdb
+
+        import sqlite3
+        self.connection = sqlite3.connect(SQLiteLockFile.testdb)
+
+        c = self.connection.cursor()
+        try:
+            c.execute("create table locks"
+                      "("
+                      "   lock_file varchar(32),"
+                      "   unique_name varchar(32)"
+                      ")")
+        except sqlite3.OperationalError:
+            pass
+        else:
+            self.connection.commit()
+            import atexit
+            atexit.register(os.unlink, SQLiteLockFile.testdb)
+
+    def acquire(self, timeout=None):
+        timeout = timeout if timeout is not None else self.timeout
+        end_time = time.time()
+        if timeout is not None and timeout > 0:
+            end_time += timeout
+
+        if timeout is None:
+            wait = 0.1
+        elif timeout <= 0:
+            wait = 0
+        else:
+            wait = timeout / 10
+
+        cursor = self.connection.cursor()
+
+        while True:
+            if not self.is_locked():
+                # Not locked.  Try to lock it.
+                cursor.execute("insert into locks"
+                               "  (lock_file, unique_name)"
+                               "  values"
+                               "  (?, ?)",
+                               (self.lock_file, self.unique_name))
+                self.connection.commit()
+
+                # Check to see if we are the only lock holder.
+                cursor.execute("select * from locks"
+                               "  where unique_name = ?",
+                               (self.unique_name,))
+                rows = cursor.fetchall()
+                if len(rows) > 1:
+                    # Nope.  Someone else got there.  Remove our lock.
+                    cursor.execute("delete from locks"
+                                   "  where unique_name = ?",
+                                   (self.unique_name,))
+                    self.connection.commit()
+                else:
+                    # Yup.  We're done, so go home.
+                    return
+            else:
+                # Check to see if we are the only lock holder.
+                cursor.execute("select * from locks"
+                               "  where unique_name = ?",
+                               (self.unique_name,))
+                rows = cursor.fetchall()
+                if len(rows) == 1:
+                    # We're the locker, so go home.
+                    return
+
+            # Maybe we should wait a bit longer.
+            if timeout is not None and time.time() > end_time:
+                if timeout > 0:
+                    # No more waiting.
+                    raise LockTimeout("Timeout waiting to acquire"
+                                      " lock for %s" %
+                                      self.path)
+                else:
+                    # Someone else has the lock and we are impatient..
+                    raise AlreadyLocked("%s is already locked" % self.path)
+
+            # Well, okay.  We'll give it a bit longer.
+            time.sleep(wait)
+
+    def release(self):
+        if not self.is_locked():
+            raise NotLocked("%s is not locked" % self.path)
+        if not self.i_am_locking():
+            raise NotMyLock("%s is locked, but not by me (by %s)" %
+                            (self.unique_name, self._who_is_locking()))
+        cursor = self.connection.cursor()
+        cursor.execute("delete from locks"
+                       "  where unique_name = ?",
+                       (self.unique_name,))
+        self.connection.commit()
+
+    def _who_is_locking(self):
+        cursor = self.connection.cursor()
+        cursor.execute("select unique_name from locks"
+                       "  where lock_file = ?",
+                       (self.lock_file,))
+        return cursor.fetchone()[0]
+
+    def is_locked(self):
+        cursor = self.connection.cursor()
+        cursor.execute("select * from locks"
+                       "  where lock_file = ?",
+                       (self.lock_file,))
+        rows = cursor.fetchall()
+        return not not rows
+
+    def i_am_locking(self):
+        cursor = self.connection.cursor()
+        cursor.execute("select * from locks"
+                       "  where lock_file = ?"
+                       "    and unique_name = ?",
+                       (self.lock_file, self.unique_name))
+        return not not cursor.fetchall()
+
+    def break_lock(self):
+        cursor = self.connection.cursor()
+        cursor.execute("delete from locks"
+                       "  where lock_file = ?",
+                       (self.lock_file,))
+        self.connection.commit()
diff --git a/vendor/pip-9.0.3/pip/_vendor/lockfile/symlinklockfile.py b/vendor/pip-9.0.3/pip/_vendor/lockfile/symlinklockfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..23b41f582b9f8d40a1375b47ed1fb25da12d0c3b
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/lockfile/symlinklockfile.py
@@ -0,0 +1,70 @@
+from __future__ import absolute_import
+
+import os
+import time
+
+from . import (LockBase, NotLocked, NotMyLock, LockTimeout,
+               AlreadyLocked)
+
+
+class SymlinkLockFile(LockBase):
+    """Lock access to a file using symlink(2)."""
+
+    def __init__(self, path, threaded=True, timeout=None):
+        # super(SymlinkLockFile).__init(...)
+        LockBase.__init__(self, path, threaded, timeout)
+        # split it back!
+        self.unique_name = os.path.split(self.unique_name)[1]
+
+    def acquire(self, timeout=None):
+        # Hopefully unnecessary for symlink.
+        # try:
+        #     open(self.unique_name, "wb").close()
+        # except IOError:
+        #     raise LockFailed("failed to create %s" % self.unique_name)
+        timeout = timeout if timeout is not None else self.timeout
+        end_time = time.time()
+        if timeout is not None and timeout > 0:
+            end_time += timeout
+
+        while True:
+            # Try and create a symbolic link to it.
+            try:
+                os.symlink(self.unique_name, self.lock_file)
+            except OSError:
+                # Link creation failed.  Maybe we've double-locked?
+                if self.i_am_locking():
+                    # Linked to out unique name. Proceed.
+                    return
+                else:
+                    # Otherwise the lock creation failed.
+                    if timeout is not None and time.time() > end_time:
+                        if timeout > 0:
+                            raise LockTimeout("Timeout waiting to acquire"
+                                              " lock for %s" %
+                                              self.path)
+                        else:
+                            raise AlreadyLocked("%s is already locked" %
+                                                self.path)
+                    time.sleep(timeout / 10 if timeout is not None else 0.1)
+            else:
+                # Link creation succeeded.  We're good to go.
+                return
+
+    def release(self):
+        if not self.is_locked():
+            raise NotLocked("%s is not locked" % self.path)
+        elif not self.i_am_locking():
+            raise NotMyLock("%s is locked, but not by me" % self.path)
+        os.unlink(self.lock_file)
+
+    def is_locked(self):
+        return os.path.islink(self.lock_file)
+
+    def i_am_locking(self):
+        return (os.path.islink(self.lock_file)
+                and os.readlink(self.lock_file) == self.unique_name)
+
+    def break_lock(self):
+        if os.path.islink(self.lock_file):  # exists && link
+            os.unlink(self.lock_file)
diff --git a/vendor/pip-9.0.3/pip/_vendor/ordereddict.py b/vendor/pip-9.0.3/pip/_vendor/ordereddict.py
new file mode 100644
index 0000000000000000000000000000000000000000..7242b5060de134c3e4b7cd41fa10843d7c2e4cdb
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/ordereddict.py
@@ -0,0 +1,127 @@
+# Copyright (c) 2009 Raymond Hettinger
+#
+# 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.
+
+from UserDict import DictMixin
+
+class OrderedDict(dict, DictMixin):
+
+    def __init__(self, *args, **kwds):
+        if len(args) > 1:
+            raise TypeError('expected at most 1 arguments, got %d' % len(args))
+        try:
+            self.__end
+        except AttributeError:
+            self.clear()
+        self.update(*args, **kwds)
+
+    def clear(self):
+        self.__end = end = []
+        end += [None, end, end]         # sentinel node for doubly linked list
+        self.__map = {}                 # key --> [key, prev, next]
+        dict.clear(self)
+
+    def __setitem__(self, key, value):
+        if key not in self:
+            end = self.__end
+            curr = end[1]
+            curr[2] = end[1] = self.__map[key] = [key, curr, end]
+        dict.__setitem__(self, key, value)
+
+    def __delitem__(self, key):
+        dict.__delitem__(self, key)
+        key, prev, next = self.__map.pop(key)
+        prev[2] = next
+        next[1] = prev
+
+    def __iter__(self):
+        end = self.__end
+        curr = end[2]
+        while curr is not end:
+            yield curr[0]
+            curr = curr[2]
+
+    def __reversed__(self):
+        end = self.__end
+        curr = end[1]
+        while curr is not end:
+            yield curr[0]
+            curr = curr[1]
+
+    def popitem(self, last=True):
+        if not self:
+            raise KeyError('dictionary is empty')
+        if last:
+            key = reversed(self).next()
+        else:
+            key = iter(self).next()
+        value = self.pop(key)
+        return key, value
+
+    def __reduce__(self):
+        items = [[k, self[k]] for k in self]
+        tmp = self.__map, self.__end
+        del self.__map, self.__end
+        inst_dict = vars(self).copy()
+        self.__map, self.__end = tmp
+        if inst_dict:
+            return (self.__class__, (items,), inst_dict)
+        return self.__class__, (items,)
+
+    def keys(self):
+        return list(self)
+
+    setdefault = DictMixin.setdefault
+    update = DictMixin.update
+    pop = DictMixin.pop
+    values = DictMixin.values
+    items = DictMixin.items
+    iterkeys = DictMixin.iterkeys
+    itervalues = DictMixin.itervalues
+    iteritems = DictMixin.iteritems
+
+    def __repr__(self):
+        if not self:
+            return '%s()' % (self.__class__.__name__,)
+        return '%s(%r)' % (self.__class__.__name__, self.items())
+
+    def copy(self):
+        return self.__class__(self)
+
+    @classmethod
+    def fromkeys(cls, iterable, value=None):
+        d = cls()
+        for key in iterable:
+            d[key] = value
+        return d
+
+    def __eq__(self, other):
+        if isinstance(other, OrderedDict):
+            if len(self) != len(other):
+                return False
+            for p, q in  zip(self.items(), other.items()):
+                if p != q:
+                    return False
+            return True
+        return dict.__eq__(self, other)
+
+    def __ne__(self, other):
+        return not self == other
diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/__about__.py b/vendor/pip-9.0.3/pip/_vendor/packaging/__about__.py
new file mode 100644
index 0000000000000000000000000000000000000000..95d330ef823aa2e12f7846bc63c0955b25df6029
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/packaging/__about__.py
@@ -0,0 +1,21 @@
+# This file is dual licensed under the terms of the Apache License, Version
+# 2.0, and the BSD License. See the LICENSE file in the root of this repository
+# for complete details.
+from __future__ import absolute_import, division, print_function
+
+__all__ = [
+    "__title__", "__summary__", "__uri__", "__version__", "__author__",
+    "__email__", "__license__", "__copyright__",
+]
+
+__title__ = "packaging"
+__summary__ = "Core utilities for Python packages"
+__uri__ = "https://github.com/pypa/packaging"
+
+__version__ = "16.8"
+
+__author__ = "Donald Stufft and individual contributors"
+__email__ = "donald@stufft.io"
+
+__license__ = "BSD or Apache License, Version 2.0"
+__copyright__ = "Copyright 2014-2016 %s" % __author__
diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/__init__.py b/vendor/pip-9.0.3/pip/_vendor/packaging/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..5ee6220203e5425f900fb5a43676c24ea377c2fa
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/packaging/__init__.py
@@ -0,0 +1,14 @@
+# This file is dual licensed under the terms of the Apache License, Version
+# 2.0, and the BSD License. See the LICENSE file in the root of this repository
+# for complete details.
+from __future__ import absolute_import, division, print_function
+
+from .__about__ import (
+    __author__, __copyright__, __email__, __license__, __summary__, __title__,
+    __uri__, __version__
+)
+
+__all__ = [
+    "__title__", "__summary__", "__uri__", "__version__", "__author__",
+    "__email__", "__license__", "__copyright__",
+]
diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/_compat.py b/vendor/pip-9.0.3/pip/_vendor/packaging/_compat.py
new file mode 100644
index 0000000000000000000000000000000000000000..210bb80b7e7b64cb79f7e7cdf3e42819fe3471fe
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/packaging/_compat.py
@@ -0,0 +1,30 @@
+# This file is dual licensed under the terms of the Apache License, Version
+# 2.0, and the BSD License. See the LICENSE file in the root of this repository
+# for complete details.
+from __future__ import absolute_import, division, print_function
+
+import sys
+
+
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+
+# flake8: noqa
+
+if PY3:
+    string_types = str,
+else:
+    string_types = basestring,
+
+
+def with_metaclass(meta, *bases):
+    """
+    Create a base class with a metaclass.
+    """
+    # This requires a bit of explanation: the basic idea is to make a dummy
+    # metaclass for one level of class instantiation that replaces itself with
+    # the actual metaclass.
+    class metaclass(meta):
+        def __new__(cls, name, this_bases, d):
+            return meta(name, bases, d)
+    return type.__new__(metaclass, 'temporary_class', (), {})
diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/_structures.py b/vendor/pip-9.0.3/pip/_vendor/packaging/_structures.py
new file mode 100644
index 0000000000000000000000000000000000000000..ccc27861c3a4d9efaa3db753c77c4515a627bd98
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/packaging/_structures.py
@@ -0,0 +1,68 @@
+# This file is dual licensed under the terms of the Apache License, Version
+# 2.0, and the BSD License. See the LICENSE file in the root of this repository
+# for complete details.
+from __future__ import absolute_import, division, print_function
+
+
+class Infinity(object):
+
+    def __repr__(self):
+        return "Infinity"
+
+    def __hash__(self):
+        return hash(repr(self))
+
+    def __lt__(self, other):
+        return False
+
+    def __le__(self, other):
+        return False
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__)
+
+    def __ne__(self, other):
+        return not isinstance(other, self.__class__)
+
+    def __gt__(self, other):
+        return True
+
+    def __ge__(self, other):
+        return True
+
+    def __neg__(self):
+        return NegativeInfinity
+
+Infinity = Infinity()
+
+
+class NegativeInfinity(object):
+
+    def __repr__(self):
+        return "-Infinity"
+
+    def __hash__(self):
+        return hash(repr(self))
+
+    def __lt__(self, other):
+        return True
+
+    def __le__(self, other):
+        return True
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__)
+
+    def __ne__(self, other):
+        return not isinstance(other, self.__class__)
+
+    def __gt__(self, other):
+        return False
+
+    def __ge__(self, other):
+        return False
+
+    def __neg__(self):
+        return Infinity
+
+NegativeInfinity = NegativeInfinity()
diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/markers.py b/vendor/pip-9.0.3/pip/_vendor/packaging/markers.py
new file mode 100644
index 0000000000000000000000000000000000000000..f9ca1ffa36c3de41e93b1b32b9b171679d89678f
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/packaging/markers.py
@@ -0,0 +1,303 @@
+# This file is dual licensed under the terms of the Apache License, Version
+# 2.0, and the BSD License. See the LICENSE file in the root of this repository
+# for complete details.
+from __future__ import absolute_import, division, print_function
+
+import operator
+import os
+import platform
+import sys
+
+from pip._vendor.pyparsing import (
+    ParseException, ParseResults, stringStart, stringEnd,
+)
+from pip._vendor.pyparsing import ZeroOrMore, Group, Forward, QuotedString
+from pip._vendor.pyparsing import Literal as L  # noqa
+
+from ._compat import string_types
+from .specifiers import Specifier, InvalidSpecifier
+
+
+__all__ = [
+    "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName",
+    "Marker", "default_environment",
+]
+
+
+class InvalidMarker(ValueError):
+    """
+    An invalid marker was found, users should refer to PEP 508.
+    """
+
+
+class UndefinedComparison(ValueError):
+    """
+    An invalid operation was attempted on a value that doesn't support it.
+    """
+
+
+class UndefinedEnvironmentName(ValueError):
+    """
+    A name was attempted to be used that does not exist inside of the
+    environment.
+    """
+
+
+class Node(object):
+
+    def __init__(self, value):
+        self.value = value
+
+    def __str__(self):
+        return str(self.value)
+
+    def __repr__(self):
+        return "<{0}({1!r})>".format(self.__class__.__name__, str(self))
+
+    def serialize(self):
+        raise NotImplementedError
+
+
+class Variable(Node):
+
+    def serialize(self):
+        return str(self)
+
+
+class Value(Node):
+
+    def serialize(self):
+        return '"{0}"'.format(self)
+
+
+class Op(Node):
+
+    def serialize(self):
+        return str(self)
+
+
+VARIABLE = (
+    L("implementation_version") |
+    L("platform_python_implementation") |
+    L("implementation_name") |
+    L("python_full_version") |
+    L("platform_release") |
+    L("platform_version") |
+    L("platform_machine") |
+    L("platform_system") |
+    L("python_version") |
+    L("sys_platform") |
+    L("os_name") |
+    L("os.name") |  # PEP-345
+    L("sys.platform") |  # PEP-345
+    L("platform.version") |  # PEP-345
+    L("platform.machine") |  # PEP-345
+    L("platform.python_implementation") |  # PEP-345
+    L("python_implementation") |  # undocumented setuptools legacy
+    L("extra")
+)
+ALIASES = {
+    'os.name': 'os_name',
+    'sys.platform': 'sys_platform',
+    'platform.version': 'platform_version',
+    'platform.machine': 'platform_machine',
+    'platform.python_implementation': 'platform_python_implementation',
+    'python_implementation': 'platform_python_implementation'
+}
+VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0])))
+
+VERSION_CMP = (
+    L("===") |
+    L("==") |
+    L(">=") |
+    L("<=") |
+    L("!=") |
+    L("~=") |
+    L(">") |
+    L("<")
+)
+
+MARKER_OP = VERSION_CMP | L("not in") | L("in")
+MARKER_OP.setParseAction(lambda s, l, t: Op(t[0]))
+
+MARKER_VALUE = QuotedString("'") | QuotedString('"')
+MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0]))
+
+BOOLOP = L("and") | L("or")
+
+MARKER_VAR = VARIABLE | MARKER_VALUE
+
+MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR)
+MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0]))
+
+LPAREN = L("(").suppress()
+RPAREN = L(")").suppress()
+
+MARKER_EXPR = Forward()
+MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN)
+MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR)
+
+MARKER = stringStart + MARKER_EXPR + stringEnd
+
+
+def _coerce_parse_result(results):
+    if isinstance(results, ParseResults):
+        return [_coerce_parse_result(i) for i in results]
+    else:
+        return results
+
+
+def _format_marker(marker, first=True):
+    assert isinstance(marker, (list, tuple, string_types))
+
+    # Sometimes we have a structure like [[...]] which is a single item list
+    # where the single item is itself it's own list. In that case we want skip
+    # the rest of this function so that we don't get extraneous () on the
+    # outside.
+    if (isinstance(marker, list) and len(marker) == 1 and
+            isinstance(marker[0], (list, tuple))):
+        return _format_marker(marker[0])
+
+    if isinstance(marker, list):
+        inner = (_format_marker(m, first=False) for m in marker)
+        if first:
+            return " ".join(inner)
+        else:
+            return "(" + " ".join(inner) + ")"
+    elif isinstance(marker, tuple):
+        return " ".join([m.serialize() for m in marker])
+    else:
+        return marker
+
+
+_operators = {
+    "in": lambda lhs, rhs: lhs in rhs,
+    "not in": lambda lhs, rhs: lhs not in rhs,
+    "<": operator.lt,
+    "<=": operator.le,
+    "==": operator.eq,
+    "!=": operator.ne,
+    ">=": operator.ge,
+    ">": operator.gt,
+}
+
+
+def _eval_op(lhs, op, rhs):
+    try:
+        spec = Specifier("".join([op.serialize(), rhs]))
+    except InvalidSpecifier:
+        pass
+    else:
+        return spec.contains(lhs)
+
+    oper = _operators.get(op.serialize())
+    if oper is None:
+        raise UndefinedComparison(
+            "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs)
+        )
+
+    return oper(lhs, rhs)
+
+
+_undefined = object()
+
+
+def _get_env(environment, name):
+    value = environment.get(name, _undefined)
+
+    if value is _undefined:
+        raise UndefinedEnvironmentName(
+            "{0!r} does not exist in evaluation environment.".format(name)
+        )
+
+    return value
+
+
+def _evaluate_markers(markers, environment):
+    groups = [[]]
+
+    for marker in markers:
+        assert isinstance(marker, (list, tuple, string_types))
+
+        if isinstance(marker, list):
+            groups[-1].append(_evaluate_markers(marker, environment))
+        elif isinstance(marker, tuple):
+            lhs, op, rhs = marker
+
+            if isinstance(lhs, Variable):
+                lhs_value = _get_env(environment, lhs.value)
+                rhs_value = rhs.value
+            else:
+                lhs_value = lhs.value
+                rhs_value = _get_env(environment, rhs.value)
+
+            groups[-1].append(_eval_op(lhs_value, op, rhs_value))
+        else:
+            assert marker in ["and", "or"]
+            if marker == "or":
+                groups.append([])
+
+    return any(all(item) for item in groups)
+
+
+def format_full_version(info):
+    version = '{0.major}.{0.minor}.{0.micro}'.format(info)
+    kind = info.releaselevel
+    if kind != 'final':
+        version += kind[0] + str(info.serial)
+    return version
+
+
+def default_environment():
+    if hasattr(sys, 'implementation'):
+        iver = format_full_version(sys.implementation.version)
+        implementation_name = sys.implementation.name
+    else:
+        iver = '0'
+        implementation_name = ''
+
+    return {
+        "implementation_name": implementation_name,
+        "implementation_version": iver,
+        "os_name": os.name,
+        "platform_machine": platform.machine(),
+        "platform_release": platform.release(),
+        "platform_system": platform.system(),
+        "platform_version": platform.version(),
+        "python_full_version": platform.python_version(),
+        "platform_python_implementation": platform.python_implementation(),
+        "python_version": platform.python_version()[:3],
+        "sys_platform": sys.platform,
+    }
+
+
+class Marker(object):
+
+    def __init__(self, marker):
+        try:
+            self._markers = _coerce_parse_result(MARKER.parseString(marker))
+        except ParseException as e:
+            err_str = "Invalid marker: {0!r}, parse error at {1!r}".format(
+                marker, marker[e.loc:e.loc + 8])
+            raise InvalidMarker(err_str)
+
+    def __str__(self):
+        return _format_marker(self._markers)
+
+    def __repr__(self):
+        return "<Marker({0!r})>".format(str(self))
+
+    def evaluate(self, environment=None):
+        """Evaluate a marker.
+
+        Return the boolean from evaluating the given marker against the
+        environment. environment is an optional argument to override all or
+        part of the determined environment.
+
+        The environment is determined from the current Python process.
+        """
+        current_environment = default_environment()
+        if environment is not None:
+            current_environment.update(environment)
+
+        return _evaluate_markers(self._markers, current_environment)
diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/requirements.py b/vendor/pip-9.0.3/pip/_vendor/packaging/requirements.py
new file mode 100644
index 0000000000000000000000000000000000000000..49a4385be7e8be84a7d4be4b9efbfaae2fe5f986
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/packaging/requirements.py
@@ -0,0 +1,129 @@
+# This file is dual licensed under the terms of the Apache License, Version
+# 2.0, and the BSD License. See the LICENSE file in the root of this repository
+# for complete details.
+from __future__ import absolute_import, division, print_function
+
+import string
+import re
+
+from pip._vendor.pyparsing import (
+    stringStart, stringEnd, originalTextFor, ParseException
+)
+from pip._vendor.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine
+from pip._vendor.pyparsing import Literal as L  # noqa
+from pip._vendor.six.moves.urllib import parse as urlparse
+
+from .markers import MARKER_EXPR, Marker
+from .specifiers import LegacySpecifier, Specifier, SpecifierSet
+
+
+class InvalidRequirement(ValueError):
+    """
+    An invalid requirement was found, users should refer to PEP 508.
+    """
+
+
+ALPHANUM = Word(string.ascii_letters + string.digits)
+
+LBRACKET = L("[").suppress()
+RBRACKET = L("]").suppress()
+LPAREN = L("(").suppress()
+RPAREN = L(")").suppress()
+COMMA = L(",").suppress()
+SEMICOLON = L(";").suppress()
+AT = L("@").suppress()
+
+PUNCTUATION = Word("-_.")
+IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM)
+IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END))
+
+NAME = IDENTIFIER("name")
+EXTRA = IDENTIFIER
+
+URI = Regex(r'[^ ]+')("url")
+URL = (AT + URI)
+
+EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA)
+EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras")
+
+VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE)
+VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE)
+
+VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY
+VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE),
+                       joinString=",", adjacent=False)("_raw_spec")
+_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY))
+_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '')
+
+VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier")
+VERSION_SPEC.setParseAction(lambda s, l, t: t[1])
+
+MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker")
+MARKER_EXPR.setParseAction(
+    lambda s, l, t: Marker(s[t._original_start:t._original_end])
+)
+MARKER_SEPERATOR = SEMICOLON
+MARKER = MARKER_SEPERATOR + MARKER_EXPR
+
+VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER)
+URL_AND_MARKER = URL + Optional(MARKER)
+
+NAMED_REQUIREMENT = \
+    NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER)
+
+REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd
+
+
+class Requirement(object):
+    """Parse a requirement.
+
+    Parse a given requirement string into its parts, such as name, specifier,
+    URL, and extras. Raises InvalidRequirement on a badly-formed requirement
+    string.
+    """
+
+    # TODO: Can we test whether something is contained within a requirement?
+    #       If so how do we do that? Do we need to test against the _name_ of
+    #       the thing as well as the version? What about the markers?
+    # TODO: Can we normalize the name and extra name?
+
+    def __init__(self, requirement_string):
+        try:
+            req = REQUIREMENT.parseString(requirement_string)
+        except ParseException as e:
+            raise InvalidRequirement(
+                "Invalid requirement, parse error at \"{0!r}\"".format(
+                    requirement_string[e.loc:e.loc + 8]))
+
+        self.name = req.name
+        if req.url:
+            parsed_url = urlparse.urlparse(req.url)
+            if not (parsed_url.scheme and parsed_url.netloc) or (
+                    not parsed_url.scheme and not parsed_url.netloc):
+                raise InvalidRequirement("Invalid URL given")
+            self.url = req.url
+        else:
+            self.url = None
+        self.extras = set(req.extras.asList() if req.extras else [])
+        self.specifier = SpecifierSet(req.specifier)
+        self.marker = req.marker if req.marker else None
+
+    def __str__(self):
+        parts = [self.name]
+
+        if self.extras:
+            parts.append("[{0}]".format(",".join(sorted(self.extras))))
+
+        if self.specifier:
+            parts.append(str(self.specifier))
+
+        if self.url:
+            parts.append("@ {0}".format(self.url))
+
+        if self.marker:
+            parts.append("; {0}".format(self.marker))
+
+        return "".join(parts)
+
+    def __repr__(self):
+        return "<Requirement({0!r})>".format(str(self))
diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/specifiers.py b/vendor/pip-9.0.3/pip/_vendor/packaging/specifiers.py
new file mode 100644
index 0000000000000000000000000000000000000000..7f5a76cfd63f47dcce29b3ea82f59d10f4e8d771
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/packaging/specifiers.py
@@ -0,0 +1,774 @@
+# This file is dual licensed under the terms of the Apache License, Version
+# 2.0, and the BSD License. See the LICENSE file in the root of this repository
+# for complete details.
+from __future__ import absolute_import, division, print_function
+
+import abc
+import functools
+import itertools
+import re
+
+from ._compat import string_types, with_metaclass
+from .version import Version, LegacyVersion, parse
+
+
+class InvalidSpecifier(ValueError):
+    """
+    An invalid specifier was found, users should refer to PEP 440.
+    """
+
+
+class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
+
+    @abc.abstractmethod
+    def __str__(self):
+        """
+        Returns the str representation of this Specifier like object. This
+        should be representative of the Specifier itself.
+        """
+
+    @abc.abstractmethod
+    def __hash__(self):
+        """
+        Returns a hash value for this Specifier like object.
+        """
+
+    @abc.abstractmethod
+    def __eq__(self, other):
+        """
+        Returns a boolean representing whether or not the two Specifier like
+        objects are equal.
+        """
+
+    @abc.abstractmethod
+    def __ne__(self, other):
+        """
+        Returns a boolean representing whether or not the two Specifier like
+        objects are not equal.
+        """
+
+    @abc.abstractproperty
+    def prereleases(self):
+        """
+        Returns whether or not pre-releases as a whole are allowed by this
+        specifier.
+        """
+
+    @prereleases.setter
+    def prereleases(self, value):
+        """
+        Sets whether or not pre-releases as a whole are allowed by this
+        specifier.
+        """
+
+    @abc.abstractmethod
+    def contains(self, item, prereleases=None):
+        """
+        Determines if the given item is contained within this specifier.
+        """
+
+    @abc.abstractmethod
+    def filter(self, iterable, prereleases=None):
+        """
+        Takes an iterable of items and filters them so that only items which
+        are contained within this specifier are allowed in it.
+        """
+
+
+class _IndividualSpecifier(BaseSpecifier):
+
+    _operators = {}
+
+    def __init__(self, spec="", prereleases=None):
+        match = self._regex.search(spec)
+        if not match:
+            raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec))
+
+        self._spec = (
+            match.group("operator").strip(),
+            match.group("version").strip(),
+        )
+
+        # Store whether or not this Specifier should accept prereleases
+        self._prereleases = prereleases
+
+    def __repr__(self):
+        pre = (
+            ", prereleases={0!r}".format(self.prereleases)
+            if self._prereleases is not None
+            else ""
+        )
+
+        return "<{0}({1!r}{2})>".format(
+            self.__class__.__name__,
+            str(self),
+            pre,
+        )
+
+    def __str__(self):
+        return "{0}{1}".format(*self._spec)
+
+    def __hash__(self):
+        return hash(self._spec)
+
+    def __eq__(self, other):
+        if isinstance(other, string_types):
+            try:
+                other = self.__class__(other)
+            except InvalidSpecifier:
+                return NotImplemented
+        elif not isinstance(other, self.__class__):
+            return NotImplemented
+
+        return self._spec == other._spec
+
+    def __ne__(self, other):
+        if isinstance(other, string_types):
+            try:
+                other = self.__class__(other)
+            except InvalidSpecifier:
+                return NotImplemented
+        elif not isinstance(other, self.__class__):
+            return NotImplemented
+
+        return self._spec != other._spec
+
+    def _get_operator(self, op):
+        return getattr(self, "_compare_{0}".format(self._operators[op]))
+
+    def _coerce_version(self, version):
+        if not isinstance(version, (LegacyVersion, Version)):
+            version = parse(version)
+        return version
+
+    @property
+    def operator(self):
+        return self._spec[0]
+
+    @property
+    def version(self):
+        return self._spec[1]
+
+    @property
+    def prereleases(self):
+        return self._prereleases
+
+    @prereleases.setter
+    def prereleases(self, value):
+        self._prereleases = value
+
+    def __contains__(self, item):
+        return self.contains(item)
+
+    def contains(self, item, prereleases=None):
+        # Determine if prereleases are to be allowed or not.
+        if prereleases is None:
+            prereleases = self.prereleases
+
+        # Normalize item to a Version or LegacyVersion, this allows us to have
+        # a shortcut for ``"2.0" in Specifier(">=2")
+        item = self._coerce_version(item)
+
+        # Determine if we should be supporting prereleases in this specifier
+        # or not, if we do not support prereleases than we can short circuit
+        # logic if this version is a prereleases.
+        if item.is_prerelease and not prereleases:
+            return False
+
+        # Actually do the comparison to determine if this item is contained
+        # within this Specifier or not.
+        return self._get_operator(self.operator)(item, self.version)
+
+    def filter(self, iterable, prereleases=None):
+        yielded = False
+        found_prereleases = []
+
+        kw = {"prereleases": prereleases if prereleases is not None else True}
+
+        # Attempt to iterate over all the values in the iterable and if any of
+        # them match, yield them.
+        for version in iterable:
+            parsed_version = self._coerce_version(version)
+
+            if self.contains(parsed_version, **kw):
+                # If our version is a prerelease, and we were not set to allow
+                # prereleases, then we'll store it for later incase nothing
+                # else matches this specifier.
+                if (parsed_version.is_prerelease and not
+                        (prereleases or self.prereleases)):
+                    found_prereleases.append(version)
+                # Either this is not a prerelease, or we should have been
+                # accepting prereleases from the begining.
+                else:
+                    yielded = True
+                    yield version
+
+        # Now that we've iterated over everything, determine if we've yielded
+        # any values, and if we have not and we have any prereleases stored up
+        # then we will go ahead and yield the prereleases.
+        if not yielded and found_prereleases:
+            for version in found_prereleases:
+                yield version
+
+
+class LegacySpecifier(_IndividualSpecifier):
+
+    _regex_str = (
+        r"""
+        (?P<operator>(==|!=|<=|>=|<|>))
+        \s*
+        (?P<version>
+            [^,;\s)]* # Since this is a "legacy" specifier, and the version
+                      # string can be just about anything, we match everything
+                      # except for whitespace, a semi-colon for marker support,
+                      # a closing paren since versions can be enclosed in
+                      # them, and a comma since it's a version separator.
+        )
+        """
+    )
+
+    _regex = re.compile(
+        r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
+
+    _operators = {
+        "==": "equal",
+        "!=": "not_equal",
+        "<=": "less_than_equal",
+        ">=": "greater_than_equal",
+        "<": "less_than",
+        ">": "greater_than",
+    }
+
+    def _coerce_version(self, version):
+        if not isinstance(version, LegacyVersion):
+            version = LegacyVersion(str(version))
+        return version
+
+    def _compare_equal(self, prospective, spec):
+        return prospective == self._coerce_version(spec)
+
+    def _compare_not_equal(self, prospective, spec):
+        return prospective != self._coerce_version(spec)
+
+    def _compare_less_than_equal(self, prospective, spec):
+        return prospective <= self._coerce_version(spec)
+
+    def _compare_greater_than_equal(self, prospective, spec):
+        return prospective >= self._coerce_version(spec)
+
+    def _compare_less_than(self, prospective, spec):
+        return prospective < self._coerce_version(spec)
+
+    def _compare_greater_than(self, prospective, spec):
+        return prospective > self._coerce_version(spec)
+
+
+def _require_version_compare(fn):
+    @functools.wraps(fn)
+    def wrapped(self, prospective, spec):
+        if not isinstance(prospective, Version):
+            return False
+        return fn(self, prospective, spec)
+    return wrapped
+
+
+class Specifier(_IndividualSpecifier):
+
+    _regex_str = (
+        r"""
+        (?P<operator>(~=|==|!=|<=|>=|<|>|===))
+        (?P<version>
+            (?:
+                # The identity operators allow for an escape hatch that will
+                # do an exact string match of the version you wish to install.
+                # This will not be parsed by PEP 440 and we cannot determine
+                # any semantic meaning from it. This operator is discouraged
+                # but included entirely as an escape hatch.
+                (?<====)  # Only match for the identity operator
+                \s*
+                [^\s]*    # We just match everything, except for whitespace
+                          # since we are only testing for strict identity.
+            )
+            |
+            (?:
+                # The (non)equality operators allow for wild card and local
+                # versions to be specified so we have to define these two
+                # operators separately to enable that.
+                (?<===|!=)            # Only match for equals and not equals
+
+                \s*
+                v?
+                (?:[0-9]+!)?          # epoch
+                [0-9]+(?:\.[0-9]+)*   # release
+                (?:                   # pre release
+                    [-_\.]?
+                    (a|b|c|rc|alpha|beta|pre|preview)
+                    [-_\.]?
+                    [0-9]*
+                )?
+                (?:                   # post release
+                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
+                )?
+
+                # You cannot use a wild card and a dev or local version
+                # together so group them with a | and make them optional.
+                (?:
+                    (?:[-_\.]?dev[-_\.]?[0-9]*)?         # dev release
+                    (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local
+                    |
+                    \.\*  # Wild card syntax of .*
+                )?
+            )
+            |
+            (?:
+                # The compatible operator requires at least two digits in the
+                # release segment.
+                (?<=~=)               # Only match for the compatible operator
+
+                \s*
+                v?
+                (?:[0-9]+!)?          # epoch
+                [0-9]+(?:\.[0-9]+)+   # release  (We have a + instead of a *)
+                (?:                   # pre release
+                    [-_\.]?
+                    (a|b|c|rc|alpha|beta|pre|preview)
+                    [-_\.]?
+                    [0-9]*
+                )?
+                (?:                                   # post release
+                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
+                )?
+                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
+            )
+            |
+            (?:
+                # All other operators only allow a sub set of what the
+                # (non)equality operators do. Specifically they do not allow
+                # local versions to be specified nor do they allow the prefix
+                # matching wild cards.
+                (?<!==|!=|~=)         # We have special cases for these
+                                      # operators so we want to make sure they
+                                      # don't match here.
+
+                \s*
+                v?
+                (?:[0-9]+!)?          # epoch
+                [0-9]+(?:\.[0-9]+)*   # release
+                (?:                   # pre release
+                    [-_\.]?
+                    (a|b|c|rc|alpha|beta|pre|preview)
+                    [-_\.]?
+                    [0-9]*
+                )?
+                (?:                                   # post release
+                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
+                )?
+                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
+            )
+        )
+        """
+    )
+
+    _regex = re.compile(
+        r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
+
+    _operators = {
+        "~=": "compatible",
+        "==": "equal",
+        "!=": "not_equal",
+        "<=": "less_than_equal",
+        ">=": "greater_than_equal",
+        "<": "less_than",
+        ">": "greater_than",
+        "===": "arbitrary",
+    }
+
+    @_require_version_compare
+    def _compare_compatible(self, prospective, spec):
+        # Compatible releases have an equivalent combination of >= and ==. That
+        # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to
+        # implement this in terms of the other specifiers instead of
+        # implementing it ourselves. The only thing we need to do is construct
+        # the other specifiers.
+
+        # We want everything but the last item in the version, but we want to
+        # ignore post and dev releases and we want to treat the pre-release as
+        # it's own separate segment.
+        prefix = ".".join(
+            list(
+                itertools.takewhile(
+                    lambda x: (not x.startswith("post") and not
+                               x.startswith("dev")),
+                    _version_split(spec),
+                )
+            )[:-1]
+        )
+
+        # Add the prefix notation to the end of our string
+        prefix += ".*"
+
+        return (self._get_operator(">=")(prospective, spec) and
+                self._get_operator("==")(prospective, prefix))
+
+    @_require_version_compare
+    def _compare_equal(self, prospective, spec):
+        # We need special logic to handle prefix matching
+        if spec.endswith(".*"):
+            # In the case of prefix matching we want to ignore local segment.
+            prospective = Version(prospective.public)
+            # Split the spec out by dots, and pretend that there is an implicit
+            # dot in between a release segment and a pre-release segment.
+            spec = _version_split(spec[:-2])  # Remove the trailing .*
+
+            # Split the prospective version out by dots, and pretend that there
+            # is an implicit dot in between a release segment and a pre-release
+            # segment.
+            prospective = _version_split(str(prospective))
+
+            # Shorten the prospective version to be the same length as the spec
+            # so that we can determine if the specifier is a prefix of the
+            # prospective version or not.
+            prospective = prospective[:len(spec)]
+
+            # Pad out our two sides with zeros so that they both equal the same
+            # length.
+            spec, prospective = _pad_version(spec, prospective)
+        else:
+            # Convert our spec string into a Version
+            spec = Version(spec)
+
+            # If the specifier does not have a local segment, then we want to
+            # act as if the prospective version also does not have a local
+            # segment.
+            if not spec.local:
+                prospective = Version(prospective.public)
+
+        return prospective == spec
+
+    @_require_version_compare
+    def _compare_not_equal(self, prospective, spec):
+        return not self._compare_equal(prospective, spec)
+
+    @_require_version_compare
+    def _compare_less_than_equal(self, prospective, spec):
+        return prospective <= Version(spec)
+
+    @_require_version_compare
+    def _compare_greater_than_equal(self, prospective, spec):
+        return prospective >= Version(spec)
+
+    @_require_version_compare
+    def _compare_less_than(self, prospective, spec):
+        # Convert our spec to a Version instance, since we'll want to work with
+        # it as a version.
+        spec = Version(spec)
+
+        # Check to see if the prospective version is less than the spec
+        # version. If it's not we can short circuit and just return False now
+        # instead of doing extra unneeded work.
+        if not prospective < spec:
+            return False
+
+        # This special case is here so that, unless the specifier itself
+        # includes is a pre-release version, that we do not accept pre-release
+        # versions for the version mentioned in the specifier (e.g. <3.1 should
+        # not match 3.1.dev0, but should match 3.0.dev0).
+        if not spec.is_prerelease and prospective.is_prerelease:
+            if Version(prospective.base_version) == Version(spec.base_version):
+                return False
+
+        # If we've gotten to here, it means that prospective version is both
+        # less than the spec version *and* it's not a pre-release of the same
+        # version in the spec.
+        return True
+
+    @_require_version_compare
+    def _compare_greater_than(self, prospective, spec):
+        # Convert our spec to a Version instance, since we'll want to work with
+        # it as a version.
+        spec = Version(spec)
+
+        # Check to see if the prospective version is greater than the spec
+        # version. If it's not we can short circuit and just return False now
+        # instead of doing extra unneeded work.
+        if not prospective > spec:
+            return False
+
+        # This special case is here so that, unless the specifier itself
+        # includes is a post-release version, that we do not accept
+        # post-release versions for the version mentioned in the specifier
+        # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0).
+        if not spec.is_postrelease and prospective.is_postrelease:
+            if Version(prospective.base_version) == Version(spec.base_version):
+                return False
+
+        # Ensure that we do not allow a local version of the version mentioned
+        # in the specifier, which is techincally greater than, to match.
+        if prospective.local is not None:
+            if Version(prospective.base_version) == Version(spec.base_version):
+                return False
+
+        # If we've gotten to here, it means that prospective version is both
+        # greater than the spec version *and* it's not a pre-release of the
+        # same version in the spec.
+        return True
+
+    def _compare_arbitrary(self, prospective, spec):
+        return str(prospective).lower() == str(spec).lower()
+
+    @property
+    def prereleases(self):
+        # If there is an explicit prereleases set for this, then we'll just
+        # blindly use that.
+        if self._prereleases is not None:
+            return self._prereleases
+
+        # Look at all of our specifiers and determine if they are inclusive
+        # operators, and if they are if they are including an explicit
+        # prerelease.
+        operator, version = self._spec
+        if operator in ["==", ">=", "<=", "~=", "==="]:
+            # The == specifier can include a trailing .*, if it does we
+            # want to remove before parsing.
+            if operator == "==" and version.endswith(".*"):
+                version = version[:-2]
+
+            # Parse the version, and if it is a pre-release than this
+            # specifier allows pre-releases.
+            if parse(version).is_prerelease:
+                return True
+
+        return False
+
+    @prereleases.setter
+    def prereleases(self, value):
+        self._prereleases = value
+
+
+_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$")
+
+
+def _version_split(version):
+    result = []
+    for item in version.split("."):
+        match = _prefix_regex.search(item)
+        if match:
+            result.extend(match.groups())
+        else:
+            result.append(item)
+    return result
+
+
+def _pad_version(left, right):
+    left_split, right_split = [], []
+
+    # Get the release segment of our versions
+    left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left)))
+    right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right)))
+
+    # Get the rest of our versions
+    left_split.append(left[len(left_split[0]):])
+    right_split.append(right[len(right_split[0]):])
+
+    # Insert our padding
+    left_split.insert(
+        1,
+        ["0"] * max(0, len(right_split[0]) - len(left_split[0])),
+    )
+    right_split.insert(
+        1,
+        ["0"] * max(0, len(left_split[0]) - len(right_split[0])),
+    )
+
+    return (
+        list(itertools.chain(*left_split)),
+        list(itertools.chain(*right_split)),
+    )
+
+
+class SpecifierSet(BaseSpecifier):
+
+    def __init__(self, specifiers="", prereleases=None):
+        # Split on , to break each indidivual specifier into it's own item, and
+        # strip each item to remove leading/trailing whitespace.
+        specifiers = [s.strip() for s in specifiers.split(",") if s.strip()]
+
+        # Parsed each individual specifier, attempting first to make it a
+        # Specifier and falling back to a LegacySpecifier.
+        parsed = set()
+        for specifier in specifiers:
+            try:
+                parsed.add(Specifier(specifier))
+            except InvalidSpecifier:
+                parsed.add(LegacySpecifier(specifier))
+
+        # Turn our parsed specifiers into a frozen set and save them for later.
+        self._specs = frozenset(parsed)
+
+        # Store our prereleases value so we can use it later to determine if
+        # we accept prereleases or not.
+        self._prereleases = prereleases
+
+    def __repr__(self):
+        pre = (
+            ", prereleases={0!r}".format(self.prereleases)
+            if self._prereleases is not None
+            else ""
+        )
+
+        return "<SpecifierSet({0!r}{1})>".format(str(self), pre)
+
+    def __str__(self):
+        return ",".join(sorted(str(s) for s in self._specs))
+
+    def __hash__(self):
+        return hash(self._specs)
+
+    def __and__(self, other):
+        if isinstance(other, string_types):
+            other = SpecifierSet(other)
+        elif not isinstance(other, SpecifierSet):
+            return NotImplemented
+
+        specifier = SpecifierSet()
+        specifier._specs = frozenset(self._specs | other._specs)
+
+        if self._prereleases is None and other._prereleases is not None:
+            specifier._prereleases = other._prereleases
+        elif self._prereleases is not None and other._prereleases is None:
+            specifier._prereleases = self._prereleases
+        elif self._prereleases == other._prereleases:
+            specifier._prereleases = self._prereleases
+        else:
+            raise ValueError(
+                "Cannot combine SpecifierSets with True and False prerelease "
+                "overrides."
+            )
+
+        return specifier
+
+    def __eq__(self, other):
+        if isinstance(other, string_types):
+            other = SpecifierSet(other)
+        elif isinstance(other, _IndividualSpecifier):
+            other = SpecifierSet(str(other))
+        elif not isinstance(other, SpecifierSet):
+            return NotImplemented
+
+        return self._specs == other._specs
+
+    def __ne__(self, other):
+        if isinstance(other, string_types):
+            other = SpecifierSet(other)
+        elif isinstance(other, _IndividualSpecifier):
+            other = SpecifierSet(str(other))
+        elif not isinstance(other, SpecifierSet):
+            return NotImplemented
+
+        return self._specs != other._specs
+
+    def __len__(self):
+        return len(self._specs)
+
+    def __iter__(self):
+        return iter(self._specs)
+
+    @property
+    def prereleases(self):
+        # If we have been given an explicit prerelease modifier, then we'll
+        # pass that through here.
+        if self._prereleases is not None:
+            return self._prereleases
+
+        # If we don't have any specifiers, and we don't have a forced value,
+        # then we'll just return None since we don't know if this should have
+        # pre-releases or not.
+        if not self._specs:
+            return None
+
+        # Otherwise we'll see if any of the given specifiers accept
+        # prereleases, if any of them do we'll return True, otherwise False.
+        return any(s.prereleases for s in self._specs)
+
+    @prereleases.setter
+    def prereleases(self, value):
+        self._prereleases = value
+
+    def __contains__(self, item):
+        return self.contains(item)
+
+    def contains(self, item, prereleases=None):
+        # Ensure that our item is a Version or LegacyVersion instance.
+        if not isinstance(item, (LegacyVersion, Version)):
+            item = parse(item)
+
+        # Determine if we're forcing a prerelease or not, if we're not forcing
+        # one for this particular filter call, then we'll use whatever the
+        # SpecifierSet thinks for whether or not we should support prereleases.
+        if prereleases is None:
+            prereleases = self.prereleases
+
+        # We can determine if we're going to allow pre-releases by looking to
+        # see if any of the underlying items supports them. If none of them do
+        # and this item is a pre-release then we do not allow it and we can
+        # short circuit that here.
+        # Note: This means that 1.0.dev1 would not be contained in something
+        #       like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0
+        if not prereleases and item.is_prerelease:
+            return False
+
+        # We simply dispatch to the underlying specs here to make sure that the
+        # given version is contained within all of them.
+        # Note: This use of all() here means that an empty set of specifiers
+        #       will always return True, this is an explicit design decision.
+        return all(
+            s.contains(item, prereleases=prereleases)
+            for s in self._specs
+        )
+
+    def filter(self, iterable, prereleases=None):
+        # Determine if we're forcing a prerelease or not, if we're not forcing
+        # one for this particular filter call, then we'll use whatever the
+        # SpecifierSet thinks for whether or not we should support prereleases.
+        if prereleases is None:
+            prereleases = self.prereleases
+
+        # If we have any specifiers, then we want to wrap our iterable in the
+        # filter method for each one, this will act as a logical AND amongst
+        # each specifier.
+        if self._specs:
+            for spec in self._specs:
+                iterable = spec.filter(iterable, prereleases=bool(prereleases))
+            return iterable
+        # If we do not have any specifiers, then we need to have a rough filter
+        # which will filter out any pre-releases, unless there are no final
+        # releases, and which will filter out LegacyVersion in general.
+        else:
+            filtered = []
+            found_prereleases = []
+
+            for item in iterable:
+                # Ensure that we some kind of Version class for this item.
+                if not isinstance(item, (LegacyVersion, Version)):
+                    parsed_version = parse(item)
+                else:
+                    parsed_version = item
+
+                # Filter out any item which is parsed as a LegacyVersion
+                if isinstance(parsed_version, LegacyVersion):
+                    continue
+
+                # Store any item which is a pre-release for later unless we've
+                # already found a final version or we are accepting prereleases
+                if parsed_version.is_prerelease and not prereleases:
+                    if not filtered:
+                        found_prereleases.append(item)
+                else:
+                    filtered.append(item)
+
+            # If we've found no items except for pre-releases, then we'll go
+            # ahead and use the pre-releases
+            if not filtered and found_prereleases and prereleases is None:
+                return found_prereleases
+
+            return filtered
diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/utils.py b/vendor/pip-9.0.3/pip/_vendor/packaging/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..942387cef5d75f299a769b1eb43b6c7679e7a3a0
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/packaging/utils.py
@@ -0,0 +1,14 @@
+# This file is dual licensed under the terms of the Apache License, Version
+# 2.0, and the BSD License. See the LICENSE file in the root of this repository
+# for complete details.
+from __future__ import absolute_import, division, print_function
+
+import re
+
+
+_canonicalize_regex = re.compile(r"[-_.]+")
+
+
+def canonicalize_name(name):
+    # This is taken from PEP 503.
+    return _canonicalize_regex.sub("-", name).lower()
diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/version.py b/vendor/pip-9.0.3/pip/_vendor/packaging/version.py
new file mode 100644
index 0000000000000000000000000000000000000000..83b5ee8c5efadf22ce2f16ff08c8a8d75f1eb5df
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/packaging/version.py
@@ -0,0 +1,393 @@
+# This file is dual licensed under the terms of the Apache License, Version
+# 2.0, and the BSD License. See the LICENSE file in the root of this repository
+# for complete details.
+from __future__ import absolute_import, division, print_function
+
+import collections
+import itertools
+import re
+
+from ._structures import Infinity
+
+
+__all__ = [
+    "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"
+]
+
+
+_Version = collections.namedtuple(
+    "_Version",
+    ["epoch", "release", "dev", "pre", "post", "local"],
+)
+
+
+def parse(version):
+    """
+    Parse the given version string and return either a :class:`Version` object
+    or a :class:`LegacyVersion` object depending on if the given version is
+    a valid PEP 440 version or a legacy version.
+    """
+    try:
+        return Version(version)
+    except InvalidVersion:
+        return LegacyVersion(version)
+
+
+class InvalidVersion(ValueError):
+    """
+    An invalid version was found, users should refer to PEP 440.
+    """
+
+
+class _BaseVersion(object):
+
+    def __hash__(self):
+        return hash(self._key)
+
+    def __lt__(self, other):
+        return self._compare(other, lambda s, o: s < o)
+
+    def __le__(self, other):
+        return self._compare(other, lambda s, o: s <= o)
+
+    def __eq__(self, other):
+        return self._compare(other, lambda s, o: s == o)
+
+    def __ge__(self, other):
+        return self._compare(other, lambda s, o: s >= o)
+
+    def __gt__(self, other):
+        return self._compare(other, lambda s, o: s > o)
+
+    def __ne__(self, other):
+        return self._compare(other, lambda s, o: s != o)
+
+    def _compare(self, other, method):
+        if not isinstance(other, _BaseVersion):
+            return NotImplemented
+
+        return method(self._key, other._key)
+
+
+class LegacyVersion(_BaseVersion):
+
+    def __init__(self, version):
+        self._version = str(version)
+        self._key = _legacy_cmpkey(self._version)
+
+    def __str__(self):
+        return self._version
+
+    def __repr__(self):
+        return "<LegacyVersion({0})>".format(repr(str(self)))
+
+    @property
+    def public(self):
+        return self._version
+
+    @property
+    def base_version(self):
+        return self._version
+
+    @property
+    def local(self):
+        return None
+
+    @property
+    def is_prerelease(self):
+        return False
+
+    @property
+    def is_postrelease(self):
+        return False
+
+
+_legacy_version_component_re = re.compile(
+    r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE,
+)
+
+_legacy_version_replacement_map = {
+    "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@",
+}
+
+
+def _parse_version_parts(s):
+    for part in _legacy_version_component_re.split(s):
+        part = _legacy_version_replacement_map.get(part, part)
+
+        if not part or part == ".":
+            continue
+
+        if part[:1] in "0123456789":
+            # pad for numeric comparison
+            yield part.zfill(8)
+        else:
+            yield "*" + part
+
+    # ensure that alpha/beta/candidate are before final
+    yield "*final"
+
+
+def _legacy_cmpkey(version):
+    # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch
+    # greater than or equal to 0. This will effectively put the LegacyVersion,
+    # which uses the defacto standard originally implemented by setuptools,
+    # as before all PEP 440 versions.
+    epoch = -1
+
+    # This scheme is taken from pkg_resources.parse_version setuptools prior to
+    # it's adoption of the packaging library.
+    parts = []
+    for part in _parse_version_parts(version.lower()):
+        if part.startswith("*"):
+            # remove "-" before a prerelease tag
+            if part < "*final":
+                while parts and parts[-1] == "*final-":
+                    parts.pop()
+
+            # remove trailing zeros from each series of numeric parts
+            while parts and parts[-1] == "00000000":
+                parts.pop()
+
+        parts.append(part)
+    parts = tuple(parts)
+
+    return epoch, parts
+
+# Deliberately not anchored to the start and end of the string, to make it
+# easier for 3rd party code to reuse
+VERSION_PATTERN = r"""
+    v?
+    (?:
+        (?:(?P<epoch>[0-9]+)!)?                           # epoch
+        (?P<release>[0-9]+(?:\.[0-9]+)*)                  # release segment
+        (?P<pre>                                          # pre-release
+            [-_\.]?
+            (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
+            [-_\.]?
+            (?P<pre_n>[0-9]+)?
+        )?
+        (?P<post>                                         # post release
+            (?:-(?P<post_n1>[0-9]+))
+            |
+            (?:
+                [-_\.]?
+                (?P<post_l>post|rev|r)
+                [-_\.]?
+                (?P<post_n2>[0-9]+)?
+            )
+        )?
+        (?P<dev>                                          # dev release
+            [-_\.]?
+            (?P<dev_l>dev)
+            [-_\.]?
+            (?P<dev_n>[0-9]+)?
+        )?
+    )
+    (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
+"""
+
+
+class Version(_BaseVersion):
+
+    _regex = re.compile(
+        r"^\s*" + VERSION_PATTERN + r"\s*$",
+        re.VERBOSE | re.IGNORECASE,
+    )
+
+    def __init__(self, version):
+        # Validate the version and parse it into pieces
+        match = self._regex.search(version)
+        if not match:
+            raise InvalidVersion("Invalid version: '{0}'".format(version))
+
+        # Store the parsed out pieces of the version
+        self._version = _Version(
+            epoch=int(match.group("epoch")) if match.group("epoch") else 0,
+            release=tuple(int(i) for i in match.group("release").split(".")),
+            pre=_parse_letter_version(
+                match.group("pre_l"),
+                match.group("pre_n"),
+            ),
+            post=_parse_letter_version(
+                match.group("post_l"),
+                match.group("post_n1") or match.group("post_n2"),
+            ),
+            dev=_parse_letter_version(
+                match.group("dev_l"),
+                match.group("dev_n"),
+            ),
+            local=_parse_local_version(match.group("local")),
+        )
+
+        # Generate a key which will be used for sorting
+        self._key = _cmpkey(
+            self._version.epoch,
+            self._version.release,
+            self._version.pre,
+            self._version.post,
+            self._version.dev,
+            self._version.local,
+        )
+
+    def __repr__(self):
+        return "<Version({0})>".format(repr(str(self)))
+
+    def __str__(self):
+        parts = []
+
+        # Epoch
+        if self._version.epoch != 0:
+            parts.append("{0}!".format(self._version.epoch))
+
+        # Release segment
+        parts.append(".".join(str(x) for x in self._version.release))
+
+        # Pre-release
+        if self._version.pre is not None:
+            parts.append("".join(str(x) for x in self._version.pre))
+
+        # Post-release
+        if self._version.post is not None:
+            parts.append(".post{0}".format(self._version.post[1]))
+
+        # Development release
+        if self._version.dev is not None:
+            parts.append(".dev{0}".format(self._version.dev[1]))
+
+        # Local version segment
+        if self._version.local is not None:
+            parts.append(
+                "+{0}".format(".".join(str(x) for x in self._version.local))
+            )
+
+        return "".join(parts)
+
+    @property
+    def public(self):
+        return str(self).split("+", 1)[0]
+
+    @property
+    def base_version(self):
+        parts = []
+
+        # Epoch
+        if self._version.epoch != 0:
+            parts.append("{0}!".format(self._version.epoch))
+
+        # Release segment
+        parts.append(".".join(str(x) for x in self._version.release))
+
+        return "".join(parts)
+
+    @property
+    def local(self):
+        version_string = str(self)
+        if "+" in version_string:
+            return version_string.split("+", 1)[1]
+
+    @property
+    def is_prerelease(self):
+        return bool(self._version.dev or self._version.pre)
+
+    @property
+    def is_postrelease(self):
+        return bool(self._version.post)
+
+
+def _parse_letter_version(letter, number):
+    if letter:
+        # We consider there to be an implicit 0 in a pre-release if there is
+        # not a numeral associated with it.
+        if number is None:
+            number = 0
+
+        # We normalize any letters to their lower case form
+        letter = letter.lower()
+
+        # We consider some words to be alternate spellings of other words and
+        # in those cases we want to normalize the spellings to our preferred
+        # spelling.
+        if letter == "alpha":
+            letter = "a"
+        elif letter == "beta":
+            letter = "b"
+        elif letter in ["c", "pre", "preview"]:
+            letter = "rc"
+        elif letter in ["rev", "r"]:
+            letter = "post"
+
+        return letter, int(number)
+    if not letter and number:
+        # We assume if we are given a number, but we are not given a letter
+        # then this is using the implicit post release syntax (e.g. 1.0-1)
+        letter = "post"
+
+        return letter, int(number)
+
+
+_local_version_seperators = re.compile(r"[\._-]")
+
+
+def _parse_local_version(local):
+    """
+    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
+    """
+    if local is not None:
+        return tuple(
+            part.lower() if not part.isdigit() else int(part)
+            for part in _local_version_seperators.split(local)
+        )
+
+
+def _cmpkey(epoch, release, pre, post, dev, local):
+    # When we compare a release version, we want to compare it with all of the
+    # trailing zeros removed. So we'll use a reverse the list, drop all the now
+    # leading zeros until we come to something non zero, then take the rest
+    # re-reverse it back into the correct order and make it a tuple and use
+    # that for our sorting key.
+    release = tuple(
+        reversed(list(
+            itertools.dropwhile(
+                lambda x: x == 0,
+                reversed(release),
+            )
+        ))
+    )
+
+    # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0.
+    # We'll do this by abusing the pre segment, but we _only_ want to do this
+    # if there is not a pre or a post segment. If we have one of those then
+    # the normal sorting rules will handle this case correctly.
+    if pre is None and post is None and dev is not None:
+        pre = -Infinity
+    # Versions without a pre-release (except as noted above) should sort after
+    # those with one.
+    elif pre is None:
+        pre = Infinity
+
+    # Versions without a post segment should sort before those with one.
+    if post is None:
+        post = -Infinity
+
+    # Versions without a development segment should sort after those with one.
+    if dev is None:
+        dev = Infinity
+
+    if local is None:
+        # Versions without a local segment should sort before those with one.
+        local = -Infinity
+    else:
+        # Versions with a local segment need that segment parsed to implement
+        # the sorting rules in PEP440.
+        # - Alpha numeric segments sort before numeric segments
+        # - Alpha numeric segments sort lexicographically
+        # - Numeric segments sort numerically
+        # - Shorter versions sort before longer versions when the prefixes
+        #   match exactly
+        local = tuple(
+            (i, "") if isinstance(i, int) else (-Infinity, i)
+            for i in local
+        )
+
+    return epoch, release, pre, post, dev, local
diff --git a/vendor/pip-9.0.3/pip/_vendor/pkg_resources/__init__.py b/vendor/pip-9.0.3/pip/_vendor/pkg_resources/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..b8e598b92a82b02b53ebf9e1d7ad9a80be6e806c
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/pkg_resources/__init__.py
@@ -0,0 +1,3052 @@
+# coding: utf-8
+"""
+Package resource API
+--------------------
+
+A resource is a logical file contained within a package, or a logical
+subdirectory thereof.  The package resource API expects resource names
+to have their path parts separated with ``/``, *not* whatever the local
+path separator is.  Do not use os.path operations to manipulate resource
+names being passed into the API.
+
+The package resource API is designed to work with normal filesystem packages,
+.egg files, and unpacked .egg files.  It can also work in a limited way with
+.zip files and with custom PEP 302 loaders that support the ``get_data()``
+method.
+"""
+
+from __future__ import absolute_import
+
+import sys
+import os
+import io
+import time
+import re
+import types
+import zipfile
+import zipimport
+import warnings
+import stat
+import functools
+import pkgutil
+import operator
+import platform
+import collections
+import plistlib
+import email.parser
+import tempfile
+import textwrap
+import itertools
+from pkgutil import get_importer
+
+try:
+    import _imp
+except ImportError:
+    # Python 3.2 compatibility
+    import imp as _imp
+
+from pip._vendor import six
+from pip._vendor.six.moves import urllib, map, filter
+
+# capture these to bypass sandboxing
+from os import utime
+try:
+    from os import mkdir, rename, unlink
+    WRITE_SUPPORT = True
+except ImportError:
+    # no write support, probably under GAE
+    WRITE_SUPPORT = False
+
+from os import open as os_open
+from os.path import isdir, split
+
+try:
+    import importlib.machinery as importlib_machinery
+    # access attribute to force import under delayed import mechanisms.
+    importlib_machinery.__name__
+except ImportError:
+    importlib_machinery = None
+
+from pip._vendor import appdirs
+from pip._vendor import packaging
+__import__('pip._vendor.packaging.version')
+__import__('pip._vendor.packaging.specifiers')
+__import__('pip._vendor.packaging.requirements')
+__import__('pip._vendor.packaging.markers')
+
+
+if (3, 0) < sys.version_info < (3, 3):
+    msg = (
+        "Support for Python 3.0-3.2 has been dropped. Future versions "
+        "will fail here."
+    )
+    warnings.warn(msg)
+
+# declare some globals that will be defined later to
+# satisfy the linters.
+require = None
+working_set = None
+
+
+class PEP440Warning(RuntimeWarning):
+    """
+    Used when there is an issue with a version or specifier not complying with
+    PEP 440.
+    """
+
+
+class _SetuptoolsVersionMixin(object):
+    def __hash__(self):
+        return super(_SetuptoolsVersionMixin, self).__hash__()
+
+    def __lt__(self, other):
+        if isinstance(other, tuple):
+            return tuple(self) < other
+        else:
+            return super(_SetuptoolsVersionMixin, self).__lt__(other)
+
+    def __le__(self, other):
+        if isinstance(other, tuple):
+            return tuple(self) <= other
+        else:
+            return super(_SetuptoolsVersionMixin, self).__le__(other)
+
+    def __eq__(self, other):
+        if isinstance(other, tuple):
+            return tuple(self) == other
+        else:
+            return super(_SetuptoolsVersionMixin, self).__eq__(other)
+
+    def __ge__(self, other):
+        if isinstance(other, tuple):
+            return tuple(self) >= other
+        else:
+            return super(_SetuptoolsVersionMixin, self).__ge__(other)
+
+    def __gt__(self, other):
+        if isinstance(other, tuple):
+            return tuple(self) > other
+        else:
+            return super(_SetuptoolsVersionMixin, self).__gt__(other)
+
+    def __ne__(self, other):
+        if isinstance(other, tuple):
+            return tuple(self) != other
+        else:
+            return super(_SetuptoolsVersionMixin, self).__ne__(other)
+
+    def __getitem__(self, key):
+        return tuple(self)[key]
+
+    def __iter__(self):
+        component_re = re.compile(r'(\d+ | [a-z]+ | \.| -)', re.VERBOSE)
+        replace = {
+            'pre': 'c',
+            'preview': 'c',
+            '-': 'final-',
+            'rc': 'c',
+            'dev': '@',
+        }.get
+
+        def _parse_version_parts(s):
+            for part in component_re.split(s):
+                part = replace(part, part)
+                if not part or part == '.':
+                    continue
+                if part[:1] in '0123456789':
+                    # pad for numeric comparison
+                    yield part.zfill(8)
+                else:
+                    yield '*' + part
+
+            # ensure that alpha/beta/candidate are before final
+            yield '*final'
+
+        def old_parse_version(s):
+            parts = []
+            for part in _parse_version_parts(s.lower()):
+                if part.startswith('*'):
+                    # remove '-' before a prerelease tag
+                    if part < '*final':
+                        while parts and parts[-1] == '*final-':
+                            parts.pop()
+                    # remove trailing zeros from each series of numeric parts
+                    while parts and parts[-1] == '00000000':
+                        parts.pop()
+                parts.append(part)
+            return tuple(parts)
+
+        # Warn for use of this function
+        warnings.warn(
+            "You have iterated over the result of "
+            "pkg_resources.parse_version. This is a legacy behavior which is "
+            "inconsistent with the new version class introduced in setuptools "
+            "8.0. In most cases, conversion to a tuple is unnecessary. For "
+            "comparison of versions, sort the Version instances directly. If "
+            "you have another use case requiring the tuple, please file a "
+            "bug with the setuptools project describing that need.",
+            RuntimeWarning,
+            stacklevel=1,
+        )
+
+        for part in old_parse_version(str(self)):
+            yield part
+
+
+class SetuptoolsVersion(_SetuptoolsVersionMixin, packaging.version.Version):
+    pass
+
+
+class SetuptoolsLegacyVersion(_SetuptoolsVersionMixin,
+                              packaging.version.LegacyVersion):
+    pass
+
+
+def parse_version(v):
+    try:
+        return SetuptoolsVersion(v)
+    except packaging.version.InvalidVersion:
+        return SetuptoolsLegacyVersion(v)
+
+
+_state_vars = {}
+
+
+def _declare_state(vartype, **kw):
+    globals().update(kw)
+    _state_vars.update(dict.fromkeys(kw, vartype))
+
+
+def __getstate__():
+    state = {}
+    g = globals()
+    for k, v in _state_vars.items():
+        state[k] = g['_sget_' + v](g[k])
+    return state
+
+
+def __setstate__(state):
+    g = globals()
+    for k, v in state.items():
+        g['_sset_' + _state_vars[k]](k, g[k], v)
+    return state
+
+
+def _sget_dict(val):
+    return val.copy()
+
+
+def _sset_dict(key, ob, state):
+    ob.clear()
+    ob.update(state)
+
+
+def _sget_object(val):
+    return val.__getstate__()
+
+
+def _sset_object(key, ob, state):
+    ob.__setstate__(state)
+
+
+_sget_none = _sset_none = lambda *args: None
+
+
+def get_supported_platform():
+    """Return this platform's maximum compatible version.
+
+    distutils.util.get_platform() normally reports the minimum version
+    of Mac OS X that would be required to *use* extensions produced by
+    distutils.  But what we want when checking compatibility is to know the
+    version of Mac OS X that we are *running*.  To allow usage of packages that
+    explicitly require a newer version of Mac OS X, we must also know the
+    current version of the OS.
+
+    If this condition occurs for any other platform with a version in its
+    platform strings, this function should be extended accordingly.
+    """
+    plat = get_build_platform()
+    m = macosVersionString.match(plat)
+    if m is not None and sys.platform == "darwin":
+        try:
+            plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3))
+        except ValueError:
+            # not Mac OS X
+            pass
+    return plat
+
+
+__all__ = [
+    # Basic resource access and distribution/entry point discovery
+    'require', 'run_script', 'get_provider', 'get_distribution',
+    'load_entry_point', 'get_entry_map', 'get_entry_info',
+    'iter_entry_points',
+    'resource_string', 'resource_stream', 'resource_filename',
+    'resource_listdir', 'resource_exists', 'resource_isdir',
+
+    # Environmental control
+    'declare_namespace', 'working_set', 'add_activation_listener',
+    'find_distributions', 'set_extraction_path', 'cleanup_resources',
+    'get_default_cache',
+
+    # Primary implementation classes
+    'Environment', 'WorkingSet', 'ResourceManager',
+    'Distribution', 'Requirement', 'EntryPoint',
+
+    # Exceptions
+    'ResolutionError', 'VersionConflict', 'DistributionNotFound',
+    'UnknownExtra', 'ExtractionError',
+
+    # Warnings
+    'PEP440Warning',
+
+    # Parsing functions and string utilities
+    'parse_requirements', 'parse_version', 'safe_name', 'safe_version',
+    'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections',
+    'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker',
+
+    # filesystem utilities
+    'ensure_directory', 'normalize_path',
+
+    # Distribution "precedence" constants
+    'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST',
+
+    # "Provider" interfaces, implementations, and registration/lookup APIs
+    'IMetadataProvider', 'IResourceProvider', 'FileMetadata',
+    'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider',
+    'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider',
+    'register_finder', 'register_namespace_handler', 'register_loader_type',
+    'fixup_namespace_packages', 'get_importer',
+
+    # Deprecated/backward compatibility only
+    'run_main', 'AvailableDistributions',
+]
+
+
+class ResolutionError(Exception):
+    """Abstract base for dependency resolution errors"""
+
+    def __repr__(self):
+        return self.__class__.__name__ + repr(self.args)
+
+
+class VersionConflict(ResolutionError):
+    """
+    An already-installed version conflicts with the requested version.
+
+    Should be initialized with the installed Distribution and the requested
+    Requirement.
+    """
+
+    _template = "{self.dist} is installed but {self.req} is required"
+
+    @property
+    def dist(self):
+        return self.args[0]
+
+    @property
+    def req(self):
+        return self.args[1]
+
+    def report(self):
+        return self._template.format(**locals())
+
+    def with_context(self, required_by):
+        """
+        If required_by is non-empty, return a version of self that is a
+        ContextualVersionConflict.
+        """
+        if not required_by:
+            return self
+        args = self.args + (required_by,)
+        return ContextualVersionConflict(*args)
+
+
+class ContextualVersionConflict(VersionConflict):
+    """
+    A VersionConflict that accepts a third parameter, the set of the
+    requirements that required the installed Distribution.
+    """
+
+    _template = VersionConflict._template + ' by {self.required_by}'
+
+    @property
+    def required_by(self):
+        return self.args[2]
+
+
+class DistributionNotFound(ResolutionError):
+    """A requested distribution was not found"""
+
+    _template = ("The '{self.req}' distribution was not found "
+                 "and is required by {self.requirers_str}")
+
+    @property
+    def req(self):
+        return self.args[0]
+
+    @property
+    def requirers(self):
+        return self.args[1]
+
+    @property
+    def requirers_str(self):
+        if not self.requirers:
+            return 'the application'
+        return ', '.join(self.requirers)
+
+    def report(self):
+        return self._template.format(**locals())
+
+    def __str__(self):
+        return self.report()
+
+
+class UnknownExtra(ResolutionError):
+    """Distribution doesn't have an "extra feature" of the given name"""
+
+
+_provider_factories = {}
+
+PY_MAJOR = sys.version[:3]
+EGG_DIST = 3
+BINARY_DIST = 2
+SOURCE_DIST = 1
+CHECKOUT_DIST = 0
+DEVELOP_DIST = -1
+
+
+def register_loader_type(loader_type, provider_factory):
+    """Register `provider_factory` to make providers for `loader_type`
+
+    `loader_type` is the type or class of a PEP 302 ``module.__loader__``,
+    and `provider_factory` is a function that, passed a *module* object,
+    returns an ``IResourceProvider`` for that module.
+    """
+    _provider_factories[loader_type] = provider_factory
+
+
+def get_provider(moduleOrReq):
+    """Return an IResourceProvider for the named module or requirement"""
+    if isinstance(moduleOrReq, Requirement):
+        return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
+    try:
+        module = sys.modules[moduleOrReq]
+    except KeyError:
+        __import__(moduleOrReq)
+        module = sys.modules[moduleOrReq]
+    loader = getattr(module, '__loader__', None)
+    return _find_adapter(_provider_factories, loader)(module)
+
+
+def _macosx_vers(_cache=[]):
+    if not _cache:
+        version = platform.mac_ver()[0]
+        # fallback for MacPorts
+        if version == '':
+            plist = '/System/Library/CoreServices/SystemVersion.plist'
+            if os.path.exists(plist):
+                if hasattr(plistlib, 'readPlist'):
+                    plist_content = plistlib.readPlist(plist)
+                    if 'ProductVersion' in plist_content:
+                        version = plist_content['ProductVersion']
+
+        _cache.append(version.split('.'))
+    return _cache[0]
+
+
+def _macosx_arch(machine):
+    return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine)
+
+
+def get_build_platform():
+    """Return this platform's string for platform-specific distributions
+
+    XXX Currently this is the same as ``distutils.util.get_platform()``, but it
+    needs some hacks for Linux and Mac OS X.
+    """
+    try:
+        # Python 2.7 or >=3.2
+        from sysconfig import get_platform
+    except ImportError:
+        from distutils.util import get_platform
+
+    plat = get_platform()
+    if sys.platform == "darwin" and not plat.startswith('macosx-'):
+        try:
+            version = _macosx_vers()
+            machine = os.uname()[4].replace(" ", "_")
+            return "macosx-%d.%d-%s" % (int(version[0]), int(version[1]),
+                _macosx_arch(machine))
+        except ValueError:
+            # if someone is running a non-Mac darwin system, this will fall
+            # through to the default implementation
+            pass
+    return plat
+
+
+macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)")
+darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)")
+# XXX backward compat
+get_platform = get_build_platform
+
+
+def compatible_platforms(provided, required):
+    """Can code for the `provided` platform run on the `required` platform?
+
+    Returns true if either platform is ``None``, or the platforms are equal.
+
+    XXX Needs compatibility checks for Linux and other unixy OSes.
+    """
+    if provided is None or required is None or provided == required:
+        # easy case
+        return True
+
+    # Mac OS X special cases
+    reqMac = macosVersionString.match(required)
+    if reqMac:
+        provMac = macosVersionString.match(provided)
+
+        # is this a Mac package?
+        if not provMac:
+            # this is backwards compatibility for packages built before
+            # setuptools 0.6. All packages built after this point will
+            # use the new macosx designation.
+            provDarwin = darwinVersionString.match(provided)
+            if provDarwin:
+                dversion = int(provDarwin.group(1))
+                macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2))
+                if dversion == 7 and macosversion >= "10.3" or \
+                        dversion == 8 and macosversion >= "10.4":
+                    return True
+            # egg isn't macosx or legacy darwin
+            return False
+
+        # are they the same major version and machine type?
+        if provMac.group(1) != reqMac.group(1) or \
+                provMac.group(3) != reqMac.group(3):
+            return False
+
+        # is the required OS major update >= the provided one?
+        if int(provMac.group(2)) > int(reqMac.group(2)):
+            return False
+
+        return True
+
+    # XXX Linux and other platforms' special cases should go here
+    return False
+
+
+def run_script(dist_spec, script_name):
+    """Locate distribution `dist_spec` and run its `script_name` script"""
+    ns = sys._getframe(1).f_globals
+    name = ns['__name__']
+    ns.clear()
+    ns['__name__'] = name
+    require(dist_spec)[0].run_script(script_name, ns)
+
+
+# backward compatibility
+run_main = run_script
+
+
+def get_distribution(dist):
+    """Return a current distribution object for a Requirement or string"""
+    if isinstance(dist, six.string_types):
+        dist = Requirement.parse(dist)
+    if isinstance(dist, Requirement):
+        dist = get_provider(dist)
+    if not isinstance(dist, Distribution):
+        raise TypeError("Expected string, Requirement, or Distribution", dist)
+    return dist
+
+
+def load_entry_point(dist, group, name):
+    """Return `name` entry point of `group` for `dist` or raise ImportError"""
+    return get_distribution(dist).load_entry_point(group, name)
+
+
+def get_entry_map(dist, group=None):
+    """Return the entry point map for `group`, or the full entry map"""
+    return get_distribution(dist).get_entry_map(group)
+
+
+def get_entry_info(dist, group, name):
+    """Return the EntryPoint object for `group`+`name`, or ``None``"""
+    return get_distribution(dist).get_entry_info(group, name)
+
+
+class IMetadataProvider:
+    def has_metadata(name):
+        """Does the package's distribution contain the named metadata?"""
+
+    def get_metadata(name):
+        """The named metadata resource as a string"""
+
+    def get_metadata_lines(name):
+        """Yield named metadata resource as list of non-blank non-comment lines
+
+       Leading and trailing whitespace is stripped from each line, and lines
+       with ``#`` as the first non-blank character are omitted."""
+
+    def metadata_isdir(name):
+        """Is the named metadata a directory?  (like ``os.path.isdir()``)"""
+
+    def metadata_listdir(name):
+        """List of metadata names in the directory (like ``os.listdir()``)"""
+
+    def run_script(script_name, namespace):
+        """Execute the named script in the supplied namespace dictionary"""
+
+
+class IResourceProvider(IMetadataProvider):
+    """An object that provides access to package resources"""
+
+    def get_resource_filename(manager, resource_name):
+        """Return a true filesystem path for `resource_name`
+
+        `manager` must be an ``IResourceManager``"""
+
+    def get_resource_stream(manager, resource_name):
+        """Return a readable file-like object for `resource_name`
+
+        `manager` must be an ``IResourceManager``"""
+
+    def get_resource_string(manager, resource_name):
+        """Return a string containing the contents of `resource_name`
+
+        `manager` must be an ``IResourceManager``"""
+
+    def has_resource(resource_name):
+        """Does the package contain the named resource?"""
+
+    def resource_isdir(resource_name):
+        """Is the named resource a directory?  (like ``os.path.isdir()``)"""
+
+    def resource_listdir(resource_name):
+        """List of resource names in the directory (like ``os.listdir()``)"""
+
+
+class WorkingSet(object):
+    """A collection of active distributions on sys.path (or a similar list)"""
+
+    def __init__(self, entries=None):
+        """Create working set from list of path entries (default=sys.path)"""
+        self.entries = []
+        self.entry_keys = {}
+        self.by_key = {}
+        self.callbacks = []
+
+        if entries is None:
+            entries = sys.path
+
+        for entry in entries:
+            self.add_entry(entry)
+
+    @classmethod
+    def _build_master(cls):
+        """
+        Prepare the master working set.
+        """
+        ws = cls()
+        try:
+            from __main__ import __requires__
+        except ImportError:
+            # The main program does not list any requirements
+            return ws
+
+        # ensure the requirements are met
+        try:
+            ws.require(__requires__)
+        except VersionConflict:
+            return cls._build_from_requirements(__requires__)
+
+        return ws
+
+    @classmethod
+    def _build_from_requirements(cls, req_spec):
+        """
+        Build a working set from a requirement spec. Rewrites sys.path.
+        """
+        # try it without defaults already on sys.path
+        # by starting with an empty path
+        ws = cls([])
+        reqs = parse_requirements(req_spec)
+        dists = ws.resolve(reqs, Environment())
+        for dist in dists:
+            ws.add(dist)
+
+        # add any missing entries from sys.path
+        for entry in sys.path:
+            if entry not in ws.entries:
+                ws.add_entry(entry)
+
+        # then copy back to sys.path
+        sys.path[:] = ws.entries
+        return ws
+
+    def add_entry(self, entry):
+        """Add a path item to ``.entries``, finding any distributions on it
+
+        ``find_distributions(entry, True)`` is used to find distributions
+        corresponding to the path entry, and they are added.  `entry` is
+        always appended to ``.entries``, even if it is already present.
+        (This is because ``sys.path`` can contain the same value more than
+        once, and the ``.entries`` of the ``sys.path`` WorkingSet should always
+        equal ``sys.path``.)
+        """
+        self.entry_keys.setdefault(entry, [])
+        self.entries.append(entry)
+        for dist in find_distributions(entry, True):
+            self.add(dist, entry, False)
+
+    def __contains__(self, dist):
+        """True if `dist` is the active distribution for its project"""
+        return self.by_key.get(dist.key) == dist
+
+    def find(self, req):
+        """Find a distribution matching requirement `req`
+
+        If there is an active distribution for the requested project, this
+        returns it as long as it meets the version requirement specified by
+        `req`.  But, if there is an active distribution for the project and it
+        does *not* meet the `req` requirement, ``VersionConflict`` is raised.
+        If there is no active distribution for the requested project, ``None``
+        is returned.
+        """
+        dist = self.by_key.get(req.key)
+        if dist is not None and dist not in req:
+            # XXX add more info
+            raise VersionConflict(dist, req)
+        return dist
+
+    def iter_entry_points(self, group, name=None):
+        """Yield entry point objects from `group` matching `name`
+
+        If `name` is None, yields all entry points in `group` from all
+        distributions in the working set, otherwise only ones matching
+        both `group` and `name` are yielded (in distribution order).
+        """
+        for dist in self:
+            entries = dist.get_entry_map(group)
+            if name is None:
+                for ep in entries.values():
+                    yield ep
+            elif name in entries:
+                yield entries[name]
+
+    def run_script(self, requires, script_name):
+        """Locate distribution for `requires` and run `script_name` script"""
+        ns = sys._getframe(1).f_globals
+        name = ns['__name__']
+        ns.clear()
+        ns['__name__'] = name
+        self.require(requires)[0].run_script(script_name, ns)
+
+    def __iter__(self):
+        """Yield distributions for non-duplicate projects in the working set
+
+        The yield order is the order in which the items' path entries were
+        added to the working set.
+        """
+        seen = {}
+        for item in self.entries:
+            if item not in self.entry_keys:
+                # workaround a cache issue
+                continue
+
+            for key in self.entry_keys[item]:
+                if key not in seen:
+                    seen[key] = 1
+                    yield self.by_key[key]
+
+    def add(self, dist, entry=None, insert=True, replace=False):
+        """Add `dist` to working set, associated with `entry`
+
+        If `entry` is unspecified, it defaults to the ``.location`` of `dist`.
+        On exit from this routine, `entry` is added to the end of the working
+        set's ``.entries`` (if it wasn't already present).
+
+        `dist` is only added to the working set if it's for a project that
+        doesn't already have a distribution in the set, unless `replace=True`.
+        If it's added, any callbacks registered with the ``subscribe()`` method
+        will be called.
+        """
+        if insert:
+            dist.insert_on(self.entries, entry, replace=replace)
+
+        if entry is None:
+            entry = dist.location
+        keys = self.entry_keys.setdefault(entry, [])
+        keys2 = self.entry_keys.setdefault(dist.location, [])
+        if not replace and dist.key in self.by_key:
+            # ignore hidden distros
+            return
+
+        self.by_key[dist.key] = dist
+        if dist.key not in keys:
+            keys.append(dist.key)
+        if dist.key not in keys2:
+            keys2.append(dist.key)
+        self._added_new(dist)
+
+    def resolve(self, requirements, env=None, installer=None,
+            replace_conflicting=False):
+        """List all distributions needed to (recursively) meet `requirements`
+
+        `requirements` must be a sequence of ``Requirement`` objects.  `env`,
+        if supplied, should be an ``Environment`` instance.  If
+        not supplied, it defaults to all distributions available within any
+        entry or distribution in the working set.  `installer`, if supplied,
+        will be invoked with each requirement that cannot be met by an
+        already-installed distribution; it should return a ``Distribution`` or
+        ``None``.
+
+        Unless `replace_conflicting=True`, raises a VersionConflict exception if
+        any requirements are found on the path that have the correct name but
+        the wrong version.  Otherwise, if an `installer` is supplied it will be
+        invoked to obtain the correct version of the requirement and activate
+        it.
+        """
+
+        # set up the stack
+        requirements = list(requirements)[::-1]
+        # set of processed requirements
+        processed = {}
+        # key -> dist
+        best = {}
+        to_activate = []
+
+        req_extras = _ReqExtras()
+
+        # Mapping of requirement to set of distributions that required it;
+        # useful for reporting info about conflicts.
+        required_by = collections.defaultdict(set)
+
+        while requirements:
+            # process dependencies breadth-first
+            req = requirements.pop(0)
+            if req in processed:
+                # Ignore cyclic or redundant dependencies
+                continue
+
+            if not req_extras.markers_pass(req):
+                continue
+
+            dist = best.get(req.key)
+            if dist is None:
+                # Find the best distribution and add it to the map
+                dist = self.by_key.get(req.key)
+                if dist is None or (dist not in req and replace_conflicting):
+                    ws = self
+                    if env is None:
+                        if dist is None:
+                            env = Environment(self.entries)
+                        else:
+                            # Use an empty environment and workingset to avoid
+                            # any further conflicts with the conflicting
+                            # distribution
+                            env = Environment([])
+                            ws = WorkingSet([])
+                    dist = best[req.key] = env.best_match(req, ws, installer)
+                    if dist is None:
+                        requirers = required_by.get(req, None)
+                        raise DistributionNotFound(req, requirers)
+                to_activate.append(dist)
+            if dist not in req:
+                # Oops, the "best" so far conflicts with a dependency
+                dependent_req = required_by[req]
+                raise VersionConflict(dist, req).with_context(dependent_req)
+
+            # push the new requirements onto the stack
+            new_requirements = dist.requires(req.extras)[::-1]
+            requirements.extend(new_requirements)
+
+            # Register the new requirements needed by req
+            for new_requirement in new_requirements:
+                required_by[new_requirement].add(req.project_name)
+                req_extras[new_requirement] = req.extras
+
+            processed[req] = True
+
+        # return list of distros to activate
+        return to_activate
+
+    def find_plugins(self, plugin_env, full_env=None, installer=None,
+            fallback=True):
+        """Find all activatable distributions in `plugin_env`
+
+        Example usage::
+
+            distributions, errors = working_set.find_plugins(
+                Environment(plugin_dirlist)
+            )
+            # add plugins+libs to sys.path
+            map(working_set.add, distributions)
+            # display errors
+            print('Could not load', errors)
+
+        The `plugin_env` should be an ``Environment`` instance that contains
+        only distributions that are in the project's "plugin directory" or
+        directories. The `full_env`, if supplied, should be an ``Environment``
+        contains all currently-available distributions.  If `full_env` is not
+        supplied, one is created automatically from the ``WorkingSet`` this
+        method is called on, which will typically mean that every directory on
+        ``sys.path`` will be scanned for distributions.
+
+        `installer` is a standard installer callback as used by the
+        ``resolve()`` method. The `fallback` flag indicates whether we should
+        attempt to resolve older versions of a plugin if the newest version
+        cannot be resolved.
+
+        This method returns a 2-tuple: (`distributions`, `error_info`), where
+        `distributions` is a list of the distributions found in `plugin_env`
+        that were loadable, along with any other distributions that are needed
+        to resolve their dependencies.  `error_info` is a dictionary mapping
+        unloadable plugin distributions to an exception instance describing the
+        error that occurred. Usually this will be a ``DistributionNotFound`` or
+        ``VersionConflict`` instance.
+        """
+
+        plugin_projects = list(plugin_env)
+        # scan project names in alphabetic order
+        plugin_projects.sort()
+
+        error_info = {}
+        distributions = {}
+
+        if full_env is None:
+            env = Environment(self.entries)
+            env += plugin_env
+        else:
+            env = full_env + plugin_env
+
+        shadow_set = self.__class__([])
+        # put all our entries in shadow_set
+        list(map(shadow_set.add, self))
+
+        for project_name in plugin_projects:
+
+            for dist in plugin_env[project_name]:
+
+                req = [dist.as_requirement()]
+
+                try:
+                    resolvees = shadow_set.resolve(req, env, installer)
+
+                except ResolutionError as v:
+                    # save error info
+                    error_info[dist] = v
+                    if fallback:
+                        # try the next older version of project
+                        continue
+                    else:
+                        # give up on this project, keep going
+                        break
+
+                else:
+                    list(map(shadow_set.add, resolvees))
+                    distributions.update(dict.fromkeys(resolvees))
+
+                    # success, no need to try any more versions of this project
+                    break
+
+        distributions = list(distributions)
+        distributions.sort()
+
+        return distributions, error_info
+
+    def require(self, *requirements):
+        """Ensure that distributions matching `requirements` are activated
+
+        `requirements` must be a string or a (possibly-nested) sequence
+        thereof, specifying the distributions and versions required.  The
+        return value is a sequence of the distributions that needed to be
+        activated to fulfill the requirements; all relevant distributions are
+        included, even if they were already activated in this working set.
+        """
+        needed = self.resolve(parse_requirements(requirements))
+
+        for dist in needed:
+            self.add(dist)
+
+        return needed
+
+    def subscribe(self, callback, existing=True):
+        """Invoke `callback` for all distributions
+
+        If `existing=True` (default),
+        call on all existing ones, as well.
+        """
+        if callback in self.callbacks:
+            return
+        self.callbacks.append(callback)
+        if not existing:
+            return
+        for dist in self:
+            callback(dist)
+
+    def _added_new(self, dist):
+        for callback in self.callbacks:
+            callback(dist)
+
+    def __getstate__(self):
+        return (
+            self.entries[:], self.entry_keys.copy(), self.by_key.copy(),
+            self.callbacks[:]
+        )
+
+    def __setstate__(self, e_k_b_c):
+        entries, keys, by_key, callbacks = e_k_b_c
+        self.entries = entries[:]
+        self.entry_keys = keys.copy()
+        self.by_key = by_key.copy()
+        self.callbacks = callbacks[:]
+
+
+class _ReqExtras(dict):
+    """
+    Map each requirement to the extras that demanded it.
+    """
+
+    def markers_pass(self, req):
+        """
+        Evaluate markers for req against each extra that
+        demanded it.
+
+        Return False if the req has a marker and fails
+        evaluation. Otherwise, return True.
+        """
+        extra_evals = (
+            req.marker.evaluate({'extra': extra})
+            for extra in self.get(req, ()) + (None,)
+        )
+        return not req.marker or any(extra_evals)
+
+
+class Environment(object):
+    """Searchable snapshot of distributions on a search path"""
+
+    def __init__(self, search_path=None, platform=get_supported_platform(),
+            python=PY_MAJOR):
+        """Snapshot distributions available on a search path
+
+        Any distributions found on `search_path` are added to the environment.
+        `search_path` should be a sequence of ``sys.path`` items.  If not
+        supplied, ``sys.path`` is used.
+
+        `platform` is an optional string specifying the name of the platform
+        that platform-specific distributions must be compatible with.  If
+        unspecified, it defaults to the current platform.  `python` is an
+        optional string naming the desired version of Python (e.g. ``'3.3'``);
+        it defaults to the current version.
+
+        You may explicitly set `platform` (and/or `python`) to ``None`` if you
+        wish to map *all* distributions, not just those compatible with the
+        running platform or Python version.
+        """
+        self._distmap = {}
+        self.platform = platform
+        self.python = python
+        self.scan(search_path)
+
+    def can_add(self, dist):
+        """Is distribution `dist` acceptable for this environment?
+
+        The distribution must match the platform and python version
+        requirements specified when this environment was created, or False
+        is returned.
+        """
+        return (self.python is None or dist.py_version is None
+            or dist.py_version == self.python) \
+            and compatible_platforms(dist.platform, self.platform)
+
+    def remove(self, dist):
+        """Remove `dist` from the environment"""
+        self._distmap[dist.key].remove(dist)
+
+    def scan(self, search_path=None):
+        """Scan `search_path` for distributions usable in this environment
+
+        Any distributions found are added to the environment.
+        `search_path` should be a sequence of ``sys.path`` items.  If not
+        supplied, ``sys.path`` is used.  Only distributions conforming to
+        the platform/python version defined at initialization are added.
+        """
+        if search_path is None:
+            search_path = sys.path
+
+        for item in search_path:
+            for dist in find_distributions(item):
+                self.add(dist)
+
+    def __getitem__(self, project_name):
+        """Return a newest-to-oldest list of distributions for `project_name`
+
+        Uses case-insensitive `project_name` comparison, assuming all the
+        project's distributions use their project's name converted to all
+        lowercase as their key.
+
+        """
+        distribution_key = project_name.lower()
+        return self._distmap.get(distribution_key, [])
+
+    def add(self, dist):
+        """Add `dist` if we ``can_add()`` it and it has not already been added
+        """
+        if self.can_add(dist) and dist.has_version():
+            dists = self._distmap.setdefault(dist.key, [])
+            if dist not in dists:
+                dists.append(dist)
+                dists.sort(key=operator.attrgetter('hashcmp'), reverse=True)
+
+    def best_match(self, req, working_set, installer=None):
+        """Find distribution best matching `req` and usable on `working_set`
+
+        This calls the ``find(req)`` method of the `working_set` to see if a
+        suitable distribution is already active.  (This may raise
+        ``VersionConflict`` if an unsuitable version of the project is already
+        active in the specified `working_set`.)  If a suitable distribution
+        isn't active, this method returns the newest distribution in the
+        environment that meets the ``Requirement`` in `req`.  If no suitable
+        distribution is found, and `installer` is supplied, then the result of
+        calling the environment's ``obtain(req, installer)`` method will be
+        returned.
+        """
+        dist = working_set.find(req)
+        if dist is not None:
+            return dist
+        for dist in self[req.key]:
+            if dist in req:
+                return dist
+        # try to download/install
+        return self.obtain(req, installer)
+
+    def obtain(self, requirement, installer=None):
+        """Obtain a distribution matching `requirement` (e.g. via download)
+
+        Obtain a distro that matches requirement (e.g. via download).  In the
+        base ``Environment`` class, this routine just returns
+        ``installer(requirement)``, unless `installer` is None, in which case
+        None is returned instead.  This method is a hook that allows subclasses
+        to attempt other ways of obtaining a distribution before falling back
+        to the `installer` argument."""
+        if installer is not None:
+            return installer(requirement)
+
+    def __iter__(self):
+        """Yield the unique project names of the available distributions"""
+        for key in self._distmap.keys():
+            if self[key]:
+                yield key
+
+    def __iadd__(self, other):
+        """In-place addition of a distribution or environment"""
+        if isinstance(other, Distribution):
+            self.add(other)
+        elif isinstance(other, Environment):
+            for project in other:
+                for dist in other[project]:
+                    self.add(dist)
+        else:
+            raise TypeError("Can't add %r to environment" % (other,))
+        return self
+
+    def __add__(self, other):
+        """Add an environment or distribution to an environment"""
+        new = self.__class__([], platform=None, python=None)
+        for env in self, other:
+            new += env
+        return new
+
+
+# XXX backward compatibility
+AvailableDistributions = Environment
+
+
+class ExtractionError(RuntimeError):
+    """An error occurred extracting a resource
+
+    The following attributes are available from instances of this exception:
+
+    manager
+        The resource manager that raised this exception
+
+    cache_path
+        The base directory for resource extraction
+
+    original_error
+        The exception instance that caused extraction to fail
+    """
+
+
+class ResourceManager:
+    """Manage resource extraction and packages"""
+    extraction_path = None
+
+    def __init__(self):
+        self.cached_files = {}
+
+    def resource_exists(self, package_or_requirement, resource_name):
+        """Does the named resource exist?"""
+        return get_provider(package_or_requirement).has_resource(resource_name)
+
+    def resource_isdir(self, package_or_requirement, resource_name):
+        """Is the named resource an existing directory?"""
+        return get_provider(package_or_requirement).resource_isdir(
+            resource_name
+        )
+
+    def resource_filename(self, package_or_requirement, resource_name):
+        """Return a true filesystem path for specified resource"""
+        return get_provider(package_or_requirement).get_resource_filename(
+            self, resource_name
+        )
+
+    def resource_stream(self, package_or_requirement, resource_name):
+        """Return a readable file-like object for specified resource"""
+        return get_provider(package_or_requirement).get_resource_stream(
+            self, resource_name
+        )
+
+    def resource_string(self, package_or_requirement, resource_name):
+        """Return specified resource as a string"""
+        return get_provider(package_or_requirement).get_resource_string(
+            self, resource_name
+        )
+
+    def resource_listdir(self, package_or_requirement, resource_name):
+        """List the contents of the named resource directory"""
+        return get_provider(package_or_requirement).resource_listdir(
+            resource_name
+        )
+
+    def extraction_error(self):
+        """Give an error message for problems extracting file(s)"""
+
+        old_exc = sys.exc_info()[1]
+        cache_path = self.extraction_path or get_default_cache()
+
+        tmpl = textwrap.dedent("""
+            Can't extract file(s) to egg cache
+
+            The following error occurred while trying to extract file(s) to the Python egg
+            cache:
+
+              {old_exc}
+
+            The Python egg cache directory is currently set to:
+
+              {cache_path}
+
+            Perhaps your account does not have write access to this directory?  You can
+            change the cache directory by setting the PYTHON_EGG_CACHE environment
+            variable to point to an accessible directory.
+            """).lstrip()
+        err = ExtractionError(tmpl.format(**locals()))
+        err.manager = self
+        err.cache_path = cache_path
+        err.original_error = old_exc
+        raise err
+
+    def get_cache_path(self, archive_name, names=()):
+        """Return absolute location in cache for `archive_name` and `names`
+
+        The parent directory of the resulting path will be created if it does
+        not already exist.  `archive_name` should be the base filename of the
+        enclosing egg (which may not be the name of the enclosing zipfile!),
+        including its ".egg" extension.  `names`, if provided, should be a
+        sequence of path name parts "under" the egg's extraction location.
+
+        This method should only be called by resource providers that need to
+        obtain an extraction location, and only for names they intend to
+        extract, as it tracks the generated names for possible cleanup later.
+        """
+        extract_path = self.extraction_path or get_default_cache()
+        target_path = os.path.join(extract_path, archive_name + '-tmp', *names)
+        try:
+            _bypass_ensure_directory(target_path)
+        except:
+            self.extraction_error()
+
+        self._warn_unsafe_extraction_path(extract_path)
+
+        self.cached_files[target_path] = 1
+        return target_path
+
+    @staticmethod
+    def _warn_unsafe_extraction_path(path):
+        """
+        If the default extraction path is overridden and set to an insecure
+        location, such as /tmp, it opens up an opportunity for an attacker to
+        replace an extracted file with an unauthorized payload. Warn the user
+        if a known insecure location is used.
+
+        See Distribute #375 for more details.
+        """
+        if os.name == 'nt' and not path.startswith(os.environ['windir']):
+            # On Windows, permissions are generally restrictive by default
+            #  and temp directories are not writable by other users, so
+            #  bypass the warning.
+            return
+        mode = os.stat(path).st_mode
+        if mode & stat.S_IWOTH or mode & stat.S_IWGRP:
+            msg = ("%s is writable by group/others and vulnerable to attack "
+                "when "
+                "used with get_resource_filename. Consider a more secure "
+                "location (set with .set_extraction_path or the "
+                "PYTHON_EGG_CACHE environment variable)." % path)
+            warnings.warn(msg, UserWarning)
+
+    def postprocess(self, tempname, filename):
+        """Perform any platform-specific postprocessing of `tempname`
+
+        This is where Mac header rewrites should be done; other platforms don't
+        have anything special they should do.
+
+        Resource providers should call this method ONLY after successfully
+        extracting a compressed resource.  They must NOT call it on resources
+        that are already in the filesystem.
+
+        `tempname` is the current (temporary) name of the file, and `filename`
+        is the name it will be renamed to by the caller after this routine
+        returns.
+        """
+
+        if os.name == 'posix':
+            # Make the resource executable
+            mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777
+            os.chmod(tempname, mode)
+
+    def set_extraction_path(self, path):
+        """Set the base path where resources will be extracted to, if needed.
+
+        If you do not call this routine before any extractions take place, the
+        path defaults to the return value of ``get_default_cache()``.  (Which
+        is based on the ``PYTHON_EGG_CACHE`` environment variable, with various
+        platform-specific fallbacks.  See that routine's documentation for more
+        details.)
+
+        Resources are extracted to subdirectories of this path based upon
+        information given by the ``IResourceProvider``.  You may set this to a
+        temporary directory, but then you must call ``cleanup_resources()`` to
+        delete the extracted files when done.  There is no guarantee that
+        ``cleanup_resources()`` will be able to remove all extracted files.
+
+        (Note: you may not change the extraction path for a given resource
+        manager once resources have been extracted, unless you first call
+        ``cleanup_resources()``.)
+        """
+        if self.cached_files:
+            raise ValueError(
+                "Can't change extraction path, files already extracted"
+            )
+
+        self.extraction_path = path
+
+    def cleanup_resources(self, force=False):
+        """
+        Delete all extracted resource files and directories, returning a list
+        of the file and directory names that could not be successfully removed.
+        This function does not have any concurrency protection, so it should
+        generally only be called when the extraction path is a temporary
+        directory exclusive to a single process.  This method is not
+        automatically called; you must call it explicitly or register it as an
+        ``atexit`` function if you wish to ensure cleanup of a temporary
+        directory used for extractions.
+        """
+        # XXX
+
+
+def get_default_cache():
+    """
+    Return the ``PYTHON_EGG_CACHE`` environment variable
+    or a platform-relevant user cache dir for an app
+    named "Python-Eggs".
+    """
+    return (
+        os.environ.get('PYTHON_EGG_CACHE')
+        or appdirs.user_cache_dir(appname='Python-Eggs')
+    )
+
+
+def safe_name(name):
+    """Convert an arbitrary string to a standard distribution name
+
+    Any runs of non-alphanumeric/. characters are replaced with a single '-'.
+    """
+    return re.sub('[^A-Za-z0-9.]+', '-', name)
+
+
+def safe_version(version):
+    """
+    Convert an arbitrary string to a standard version string
+    """
+    try:
+        # normalize the version
+        return str(packaging.version.Version(version))
+    except packaging.version.InvalidVersion:
+        version = version.replace(' ', '.')
+        return re.sub('[^A-Za-z0-9.]+', '-', version)
+
+
+def safe_extra(extra):
+    """Convert an arbitrary string to a standard 'extra' name
+
+    Any runs of non-alphanumeric characters are replaced with a single '_',
+    and the result is always lowercased.
+    """
+    return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower()
+
+
+def to_filename(name):
+    """Convert a project or version name to its filename-escaped form
+
+    Any '-' characters are currently replaced with '_'.
+    """
+    return name.replace('-', '_')
+
+
+def invalid_marker(text):
+    """
+    Validate text as a PEP 508 environment marker; return an exception
+    if invalid or False otherwise.
+    """
+    try:
+        evaluate_marker(text)
+    except SyntaxError as e:
+        e.filename = None
+        e.lineno = None
+        return e
+    return False
+
+
+def evaluate_marker(text, extra=None):
+    """
+    Evaluate a PEP 508 environment marker.
+    Return a boolean indicating the marker result in this environment.
+    Raise SyntaxError if marker is invalid.
+
+    This implementation uses the 'pyparsing' module.
+    """
+    try:
+        marker = packaging.markers.Marker(text)
+        return marker.evaluate()
+    except packaging.markers.InvalidMarker as e:
+        raise SyntaxError(e)
+
+
+class NullProvider:
+    """Try to implement resources and metadata for arbitrary PEP 302 loaders"""
+
+    egg_name = None
+    egg_info = None
+    loader = None
+
+    def __init__(self, module):
+        self.loader = getattr(module, '__loader__', None)
+        self.module_path = os.path.dirname(getattr(module, '__file__', ''))
+
+    def get_resource_filename(self, manager, resource_name):
+        return self._fn(self.module_path, resource_name)
+
+    def get_resource_stream(self, manager, resource_name):
+        return io.BytesIO(self.get_resource_string(manager, resource_name))
+
+    def get_resource_string(self, manager, resource_name):
+        return self._get(self._fn(self.module_path, resource_name))
+
+    def has_resource(self, resource_name):
+        return self._has(self._fn(self.module_path, resource_name))
+
+    def has_metadata(self, name):
+        return self.egg_info and self._has(self._fn(self.egg_info, name))
+
+    def get_metadata(self, name):
+        if not self.egg_info:
+            return ""
+        value = self._get(self._fn(self.egg_info, name))
+        return value.decode('utf-8') if six.PY3 else value
+
+    def get_metadata_lines(self, name):
+        return yield_lines(self.get_metadata(name))
+
+    def resource_isdir(self, resource_name):
+        return self._isdir(self._fn(self.module_path, resource_name))
+
+    def metadata_isdir(self, name):
+        return self.egg_info and self._isdir(self._fn(self.egg_info, name))
+
+    def resource_listdir(self, resource_name):
+        return self._listdir(self._fn(self.module_path, resource_name))
+
+    def metadata_listdir(self, name):
+        if self.egg_info:
+            return self._listdir(self._fn(self.egg_info, name))
+        return []
+
+    def run_script(self, script_name, namespace):
+        script = 'scripts/' + script_name
+        if not self.has_metadata(script):
+            raise ResolutionError("No script named %r" % script_name)
+        script_text = self.get_metadata(script).replace('\r\n', '\n')
+        script_text = script_text.replace('\r', '\n')
+        script_filename = self._fn(self.egg_info, script)
+        namespace['__file__'] = script_filename
+        if os.path.exists(script_filename):
+            source = open(script_filename).read()
+            code = compile(source, script_filename, 'exec')
+            exec(code, namespace, namespace)
+        else:
+            from linecache import cache
+            cache[script_filename] = (
+                len(script_text), 0, script_text.split('\n'), script_filename
+            )
+            script_code = compile(script_text, script_filename, 'exec')
+            exec(script_code, namespace, namespace)
+
+    def _has(self, path):
+        raise NotImplementedError(
+            "Can't perform this operation for unregistered loader type"
+        )
+
+    def _isdir(self, path):
+        raise NotImplementedError(
+            "Can't perform this operation for unregistered loader type"
+        )
+
+    def _listdir(self, path):
+        raise NotImplementedError(
+            "Can't perform this operation for unregistered loader type"
+        )
+
+    def _fn(self, base, resource_name):
+        if resource_name:
+            return os.path.join(base, *resource_name.split('/'))
+        return base
+
+    def _get(self, path):
+        if hasattr(self.loader, 'get_data'):
+            return self.loader.get_data(path)
+        raise NotImplementedError(
+            "Can't perform this operation for loaders without 'get_data()'"
+        )
+
+
+register_loader_type(object, NullProvider)
+
+
+class EggProvider(NullProvider):
+    """Provider based on a virtual filesystem"""
+
+    def __init__(self, module):
+        NullProvider.__init__(self, module)
+        self._setup_prefix()
+
+    def _setup_prefix(self):
+        # we assume here that our metadata may be nested inside a "basket"
+        # of multiple eggs; that's why we use module_path instead of .archive
+        path = self.module_path
+        old = None
+        while path != old:
+            if _is_unpacked_egg(path):
+                self.egg_name = os.path.basename(path)
+                self.egg_info = os.path.join(path, 'EGG-INFO')
+                self.egg_root = path
+                break
+            old = path
+            path, base = os.path.split(path)
+
+
+class DefaultProvider(EggProvider):
+    """Provides access to package resources in the filesystem"""
+
+    def _has(self, path):
+        return os.path.exists(path)
+
+    def _isdir(self, path):
+        return os.path.isdir(path)
+
+    def _listdir(self, path):
+        return os.listdir(path)
+
+    def get_resource_stream(self, manager, resource_name):
+        return open(self._fn(self.module_path, resource_name), 'rb')
+
+    def _get(self, path):
+        with open(path, 'rb') as stream:
+            return stream.read()
+
+    @classmethod
+    def _register(cls):
+        loader_cls = getattr(importlib_machinery, 'SourceFileLoader',
+            type(None))
+        register_loader_type(loader_cls, cls)
+
+
+DefaultProvider._register()
+
+
+class EmptyProvider(NullProvider):
+    """Provider that returns nothing for all requests"""
+
+    _isdir = _has = lambda self, path: False
+    _get = lambda self, path: ''
+    _listdir = lambda self, path: []
+    module_path = None
+
+    def __init__(self):
+        pass
+
+
+empty_provider = EmptyProvider()
+
+
+class ZipManifests(dict):
+    """
+    zip manifest builder
+    """
+
+    @classmethod
+    def build(cls, path):
+        """
+        Build a dictionary similar to the zipimport directory
+        caches, except instead of tuples, store ZipInfo objects.
+
+        Use a platform-specific path separator (os.sep) for the path keys
+        for compatibility with pypy on Windows.
+        """
+        with ContextualZipFile(path) as zfile:
+            items = (
+                (
+                    name.replace('/', os.sep),
+                    zfile.getinfo(name),
+                )
+                for name in zfile.namelist()
+            )
+            return dict(items)
+
+    load = build
+
+
+class MemoizedZipManifests(ZipManifests):
+    """
+    Memoized zipfile manifests.
+    """
+    manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime')
+
+    def load(self, path):
+        """
+        Load a manifest at path or return a suitable manifest already loaded.
+        """
+        path = os.path.normpath(path)
+        mtime = os.stat(path).st_mtime
+
+        if path not in self or self[path].mtime != mtime:
+            manifest = self.build(path)
+            self[path] = self.manifest_mod(manifest, mtime)
+
+        return self[path].manifest
+
+
+class ContextualZipFile(zipfile.ZipFile):
+    """
+    Supplement ZipFile class to support context manager for Python 2.6
+    """
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, type, value, traceback):
+        self.close()
+
+    def __new__(cls, *args, **kwargs):
+        """
+        Construct a ZipFile or ContextualZipFile as appropriate
+        """
+        if hasattr(zipfile.ZipFile, '__exit__'):
+            return zipfile.ZipFile(*args, **kwargs)
+        return super(ContextualZipFile, cls).__new__(cls)
+
+
+class ZipProvider(EggProvider):
+    """Resource support for zips and eggs"""
+
+    eagers = None
+    _zip_manifests = MemoizedZipManifests()
+
+    def __init__(self, module):
+        EggProvider.__init__(self, module)
+        self.zip_pre = self.loader.archive + os.sep
+
+    def _zipinfo_name(self, fspath):
+        # Convert a virtual filename (full path to file) into a zipfile subpath
+        # usable with the zipimport directory cache for our target archive
+        if fspath.startswith(self.zip_pre):
+            return fspath[len(self.zip_pre):]
+        raise AssertionError(
+            "%s is not a subpath of %s" % (fspath, self.zip_pre)
+        )
+
+    def _parts(self, zip_path):
+        # Convert a zipfile subpath into an egg-relative path part list.
+        # pseudo-fs path
+        fspath = self.zip_pre + zip_path
+        if fspath.startswith(self.egg_root + os.sep):
+            return fspath[len(self.egg_root) + 1:].split(os.sep)
+        raise AssertionError(
+            "%s is not a subpath of %s" % (fspath, self.egg_root)
+        )
+
+    @property
+    def zipinfo(self):
+        return self._zip_manifests.load(self.loader.archive)
+
+    def get_resource_filename(self, manager, resource_name):
+        if not self.egg_name:
+            raise NotImplementedError(
+                "resource_filename() only supported for .egg, not .zip"
+            )
+        # no need to lock for extraction, since we use temp names
+        zip_path = self._resource_to_zip(resource_name)
+        eagers = self._get_eager_resources()
+        if '/'.join(self._parts(zip_path)) in eagers:
+            for name in eagers:
+                self._extract_resource(manager, self._eager_to_zip(name))
+        return self._extract_resource(manager, zip_path)
+
+    @staticmethod
+    def _get_date_and_size(zip_stat):
+        size = zip_stat.file_size
+        # ymdhms+wday, yday, dst
+        date_time = zip_stat.date_time + (0, 0, -1)
+        # 1980 offset already done
+        timestamp = time.mktime(date_time)
+        return timestamp, size
+
+    def _extract_resource(self, manager, zip_path):
+
+        if zip_path in self._index():
+            for name in self._index()[zip_path]:
+                last = self._extract_resource(
+                    manager, os.path.join(zip_path, name)
+                )
+            # return the extracted directory name
+            return os.path.dirname(last)
+
+        timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])
+
+        if not WRITE_SUPPORT:
+            raise IOError('"os.rename" and "os.unlink" are not supported '
+                          'on this platform')
+        try:
+
+            real_path = manager.get_cache_path(
+                self.egg_name, self._parts(zip_path)
+            )
+
+            if self._is_current(real_path, zip_path):
+                return real_path
+
+            outf, tmpnam = _mkstemp(".$extract", dir=os.path.dirname(real_path))
+            os.write(outf, self.loader.get_data(zip_path))
+            os.close(outf)
+            utime(tmpnam, (timestamp, timestamp))
+            manager.postprocess(tmpnam, real_path)
+
+            try:
+                rename(tmpnam, real_path)
+
+            except os.error:
+                if os.path.isfile(real_path):
+                    if self._is_current(real_path, zip_path):
+                        # the file became current since it was checked above,
+                        #  so proceed.
+                        return real_path
+                    # Windows, del old file and retry
+                    elif os.name == 'nt':
+                        unlink(real_path)
+                        rename(tmpnam, real_path)
+                        return real_path
+                raise
+
+        except os.error:
+            # report a user-friendly error
+            manager.extraction_error()
+
+        return real_path
+
+    def _is_current(self, file_path, zip_path):
+        """
+        Return True if the file_path is current for this zip_path
+        """
+        timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])
+        if not os.path.isfile(file_path):
+            return False
+        stat = os.stat(file_path)
+        if stat.st_size != size or stat.st_mtime != timestamp:
+            return False
+        # check that the contents match
+        zip_contents = self.loader.get_data(zip_path)
+        with open(file_path, 'rb') as f:
+            file_contents = f.read()
+        return zip_contents == file_contents
+
+    def _get_eager_resources(self):
+        if self.eagers is None:
+            eagers = []
+            for name in ('native_libs.txt', 'eager_resources.txt'):
+                if self.has_metadata(name):
+                    eagers.extend(self.get_metadata_lines(name))
+            self.eagers = eagers
+        return self.eagers
+
+    def _index(self):
+        try:
+            return self._dirindex
+        except AttributeError:
+            ind = {}
+            for path in self.zipinfo:
+                parts = path.split(os.sep)
+                while parts:
+                    parent = os.sep.join(parts[:-1])
+                    if parent in ind:
+                        ind[parent].append(parts[-1])
+                        break
+                    else:
+                        ind[parent] = [parts.pop()]
+            self._dirindex = ind
+            return ind
+
+    def _has(self, fspath):
+        zip_path = self._zipinfo_name(fspath)
+        return zip_path in self.zipinfo or zip_path in self._index()
+
+    def _isdir(self, fspath):
+        return self._zipinfo_name(fspath) in self._index()
+
+    def _listdir(self, fspath):
+        return list(self._index().get(self._zipinfo_name(fspath), ()))
+
+    def _eager_to_zip(self, resource_name):
+        return self._zipinfo_name(self._fn(self.egg_root, resource_name))
+
+    def _resource_to_zip(self, resource_name):
+        return self._zipinfo_name(self._fn(self.module_path, resource_name))
+
+
+register_loader_type(zipimport.zipimporter, ZipProvider)
+
+
+class FileMetadata(EmptyProvider):
+    """Metadata handler for standalone PKG-INFO files
+
+    Usage::
+
+        metadata = FileMetadata("/path/to/PKG-INFO")
+
+    This provider rejects all data and metadata requests except for PKG-INFO,
+    which is treated as existing, and will be the contents of the file at
+    the provided location.
+    """
+
+    def __init__(self, path):
+        self.path = path
+
+    def has_metadata(self, name):
+        return name == 'PKG-INFO' and os.path.isfile(self.path)
+
+    def get_metadata(self, name):
+        if name != 'PKG-INFO':
+            raise KeyError("No metadata except PKG-INFO is available")
+
+        with io.open(self.path, encoding='utf-8', errors="replace") as f:
+            metadata = f.read()
+        self._warn_on_replacement(metadata)
+        return metadata
+
+    def _warn_on_replacement(self, metadata):
+        # Python 2.6 and 3.2 compat for: replacement_char = '�'
+        replacement_char = b'\xef\xbf\xbd'.decode('utf-8')
+        if replacement_char in metadata:
+            tmpl = "{self.path} could not be properly decoded in UTF-8"
+            msg = tmpl.format(**locals())
+            warnings.warn(msg)
+
+    def get_metadata_lines(self, name):
+        return yield_lines(self.get_metadata(name))
+
+
+class PathMetadata(DefaultProvider):
+    """Metadata provider for egg directories
+
+    Usage::
+
+        # Development eggs:
+
+        egg_info = "/path/to/PackageName.egg-info"
+        base_dir = os.path.dirname(egg_info)
+        metadata = PathMetadata(base_dir, egg_info)
+        dist_name = os.path.splitext(os.path.basename(egg_info))[0]
+        dist = Distribution(basedir, project_name=dist_name, metadata=metadata)
+
+        # Unpacked egg directories:
+
+        egg_path = "/path/to/PackageName-ver-pyver-etc.egg"
+        metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO'))
+        dist = Distribution.from_filename(egg_path, metadata=metadata)
+    """
+
+    def __init__(self, path, egg_info):
+        self.module_path = path
+        self.egg_info = egg_info
+
+
+class EggMetadata(ZipProvider):
+    """Metadata provider for .egg files"""
+
+    def __init__(self, importer):
+        """Create a metadata provider from a zipimporter"""
+
+        self.zip_pre = importer.archive + os.sep
+        self.loader = importer
+        if importer.prefix:
+            self.module_path = os.path.join(importer.archive, importer.prefix)
+        else:
+            self.module_path = importer.archive
+        self._setup_prefix()
+
+
+_declare_state('dict', _distribution_finders={})
+
+
+def register_finder(importer_type, distribution_finder):
+    """Register `distribution_finder` to find distributions in sys.path items
+
+    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
+    handler), and `distribution_finder` is a callable that, passed a path
+    item and the importer instance, yields ``Distribution`` instances found on
+    that path item.  See ``pkg_resources.find_on_path`` for an example."""
+    _distribution_finders[importer_type] = distribution_finder
+
+
+def find_distributions(path_item, only=False):
+    """Yield distributions accessible via `path_item`"""
+    importer = get_importer(path_item)
+    finder = _find_adapter(_distribution_finders, importer)
+    return finder(importer, path_item, only)
+
+
+def find_eggs_in_zip(importer, path_item, only=False):
+    """
+    Find eggs in zip files; possibly multiple nested eggs.
+    """
+    if importer.archive.endswith('.whl'):
+        # wheels are not supported with this finder
+        # they don't have PKG-INFO metadata, and won't ever contain eggs
+        return
+    metadata = EggMetadata(importer)
+    if metadata.has_metadata('PKG-INFO'):
+        yield Distribution.from_filename(path_item, metadata=metadata)
+    if only:
+        # don't yield nested distros
+        return
+    for subitem in metadata.resource_listdir('/'):
+        if _is_unpacked_egg(subitem):
+            subpath = os.path.join(path_item, subitem)
+            for dist in find_eggs_in_zip(zipimport.zipimporter(subpath), subpath):
+                yield dist
+
+
+register_finder(zipimport.zipimporter, find_eggs_in_zip)
+
+
+def find_nothing(importer, path_item, only=False):
+    return ()
+
+
+register_finder(object, find_nothing)
+
+
+def _by_version_descending(names):
+    """
+    Given a list of filenames, return them in descending order
+    by version number.
+
+    >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg'
+    >>> _by_version_descending(names)
+    ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar']
+    >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg'
+    >>> _by_version_descending(names)
+    ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg']
+    >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg'
+    >>> _by_version_descending(names)
+    ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg']
+    """
+    def _by_version(name):
+        """
+        Parse each component of the filename
+        """
+        name, ext = os.path.splitext(name)
+        parts = itertools.chain(name.split('-'), [ext])
+        return [packaging.version.parse(part) for part in parts]
+
+    return sorted(names, key=_by_version, reverse=True)
+
+
+def find_on_path(importer, path_item, only=False):
+    """Yield distributions accessible on a sys.path directory"""
+    path_item = _normalize_cached(path_item)
+
+    if os.path.isdir(path_item) and os.access(path_item, os.R_OK):
+        if _is_unpacked_egg(path_item):
+            yield Distribution.from_filename(
+                path_item, metadata=PathMetadata(
+                    path_item, os.path.join(path_item, 'EGG-INFO')
+                )
+            )
+        else:
+            # scan for .egg and .egg-info in directory
+            path_item_entries = _by_version_descending(os.listdir(path_item))
+            for entry in path_item_entries:
+                lower = entry.lower()
+                if lower.endswith('.egg-info') or lower.endswith('.dist-info'):
+                    fullpath = os.path.join(path_item, entry)
+                    if os.path.isdir(fullpath):
+                        # egg-info directory, allow getting metadata
+                        if len(os.listdir(fullpath)) == 0:
+                            # Empty egg directory, skip.
+                            continue
+                        metadata = PathMetadata(path_item, fullpath)
+                    else:
+                        metadata = FileMetadata(fullpath)
+                    yield Distribution.from_location(
+                        path_item, entry, metadata, precedence=DEVELOP_DIST
+                    )
+                elif not only and _is_unpacked_egg(entry):
+                    dists = find_distributions(os.path.join(path_item, entry))
+                    for dist in dists:
+                        yield dist
+                elif not only and lower.endswith('.egg-link'):
+                    with open(os.path.join(path_item, entry)) as entry_file:
+                        entry_lines = entry_file.readlines()
+                    for line in entry_lines:
+                        if not line.strip():
+                            continue
+                        path = os.path.join(path_item, line.rstrip())
+                        dists = find_distributions(path)
+                        for item in dists:
+                            yield item
+                        break
+
+
+register_finder(pkgutil.ImpImporter, find_on_path)
+
+if hasattr(importlib_machinery, 'FileFinder'):
+    register_finder(importlib_machinery.FileFinder, find_on_path)
+
+_declare_state('dict', _namespace_handlers={})
+_declare_state('dict', _namespace_packages={})
+
+
+def register_namespace_handler(importer_type, namespace_handler):
+    """Register `namespace_handler` to declare namespace packages
+
+    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
+    handler), and `namespace_handler` is a callable like this::
+
+        def namespace_handler(importer, path_entry, moduleName, module):
+            # return a path_entry to use for child packages
+
+    Namespace handlers are only called if the importer object has already
+    agreed that it can handle the relevant path item, and they should only
+    return a subpath if the module __path__ does not already contain an
+    equivalent subpath.  For an example namespace handler, see
+    ``pkg_resources.file_ns_handler``.
+    """
+    _namespace_handlers[importer_type] = namespace_handler
+
+
+def _handle_ns(packageName, path_item):
+    """Ensure that named package includes a subpath of path_item (if needed)"""
+
+    importer = get_importer(path_item)
+    if importer is None:
+        return None
+    loader = importer.find_module(packageName)
+    if loader is None:
+        return None
+    module = sys.modules.get(packageName)
+    if module is None:
+        module = sys.modules[packageName] = types.ModuleType(packageName)
+        module.__path__ = []
+        _set_parent_ns(packageName)
+    elif not hasattr(module, '__path__'):
+        raise TypeError("Not a package:", packageName)
+    handler = _find_adapter(_namespace_handlers, importer)
+    subpath = handler(importer, path_item, packageName, module)
+    if subpath is not None:
+        path = module.__path__
+        path.append(subpath)
+        loader.load_module(packageName)
+        _rebuild_mod_path(path, packageName, module)
+    return subpath
+
+
+def _rebuild_mod_path(orig_path, package_name, module):
+    """
+    Rebuild module.__path__ ensuring that all entries are ordered
+    corresponding to their sys.path order
+    """
+    sys_path = [_normalize_cached(p) for p in sys.path]
+
+    def safe_sys_path_index(entry):
+        """
+        Workaround for #520 and #513.
+        """
+        try:
+            return sys_path.index(entry)
+        except ValueError:
+            return float('inf')
+
+    def position_in_sys_path(path):
+        """
+        Return the ordinal of the path based on its position in sys.path
+        """
+        path_parts = path.split(os.sep)
+        module_parts = package_name.count('.') + 1
+        parts = path_parts[:-module_parts]
+        return safe_sys_path_index(_normalize_cached(os.sep.join(parts)))
+
+    orig_path.sort(key=position_in_sys_path)
+    module.__path__[:] = [_normalize_cached(p) for p in orig_path]
+
+
+def declare_namespace(packageName):
+    """Declare that package 'packageName' is a namespace package"""
+
+    _imp.acquire_lock()
+    try:
+        if packageName in _namespace_packages:
+            return
+
+        path, parent = sys.path, None
+        if '.' in packageName:
+            parent = '.'.join(packageName.split('.')[:-1])
+            declare_namespace(parent)
+            if parent not in _namespace_packages:
+                __import__(parent)
+            try:
+                path = sys.modules[parent].__path__
+            except AttributeError:
+                raise TypeError("Not a package:", parent)
+
+        # Track what packages are namespaces, so when new path items are added,
+        # they can be updated
+        _namespace_packages.setdefault(parent, []).append(packageName)
+        _namespace_packages.setdefault(packageName, [])
+
+        for path_item in path:
+            # Ensure all the parent's path items are reflected in the child,
+            # if they apply
+            _handle_ns(packageName, path_item)
+
+    finally:
+        _imp.release_lock()
+
+
+def fixup_namespace_packages(path_item, parent=None):
+    """Ensure that previously-declared namespace packages include path_item"""
+    _imp.acquire_lock()
+    try:
+        for package in _namespace_packages.get(parent, ()):
+            subpath = _handle_ns(package, path_item)
+            if subpath:
+                fixup_namespace_packages(subpath, package)
+    finally:
+        _imp.release_lock()
+
+
+def file_ns_handler(importer, path_item, packageName, module):
+    """Compute an ns-package subpath for a filesystem or zipfile importer"""
+
+    subpath = os.path.join(path_item, packageName.split('.')[-1])
+    normalized = _normalize_cached(subpath)
+    for item in module.__path__:
+        if _normalize_cached(item) == normalized:
+            break
+    else:
+        # Only return the path if it's not already there
+        return subpath
+
+
+register_namespace_handler(pkgutil.ImpImporter, file_ns_handler)
+register_namespace_handler(zipimport.zipimporter, file_ns_handler)
+
+if hasattr(importlib_machinery, 'FileFinder'):
+    register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler)
+
+
+def null_ns_handler(importer, path_item, packageName, module):
+    return None
+
+
+register_namespace_handler(object, null_ns_handler)
+
+
+def normalize_path(filename):
+    """Normalize a file/dir name for comparison purposes"""
+    return os.path.normcase(os.path.realpath(filename))
+
+
+def _normalize_cached(filename, _cache={}):
+    try:
+        return _cache[filename]
+    except KeyError:
+        _cache[filename] = result = normalize_path(filename)
+        return result
+
+
+def _is_unpacked_egg(path):
+    """
+    Determine if given path appears to be an unpacked egg.
+    """
+    return (
+        path.lower().endswith('.egg')
+    )
+
+
+def _set_parent_ns(packageName):
+    parts = packageName.split('.')
+    name = parts.pop()
+    if parts:
+        parent = '.'.join(parts)
+        setattr(sys.modules[parent], name, sys.modules[packageName])
+
+
+def yield_lines(strs):
+    """Yield non-empty/non-comment lines of a string or sequence"""
+    if isinstance(strs, six.string_types):
+        for s in strs.splitlines():
+            s = s.strip()
+            # skip blank lines/comments
+            if s and not s.startswith('#'):
+                yield s
+    else:
+        for ss in strs:
+            for s in yield_lines(ss):
+                yield s
+
+
+MODULE = re.compile(r"\w+(\.\w+)*$").match
+EGG_NAME = re.compile(
+    r"""
+    (?P<name>[^-]+) (
+        -(?P<ver>[^-]+) (
+            -py(?P<pyver>[^-]+) (
+                -(?P<plat>.+)
+            )?
+        )?
+    )?
+    """,
+    re.VERBOSE | re.IGNORECASE,
+).match
+
+
+class EntryPoint(object):
+    """Object representing an advertised importable object"""
+
+    def __init__(self, name, module_name, attrs=(), extras=(), dist=None):
+        if not MODULE(module_name):
+            raise ValueError("Invalid module name", module_name)
+        self.name = name
+        self.module_name = module_name
+        self.attrs = tuple(attrs)
+        self.extras = Requirement.parse(("x[%s]" % ','.join(extras))).extras
+        self.dist = dist
+
+    def __str__(self):
+        s = "%s = %s" % (self.name, self.module_name)
+        if self.attrs:
+            s += ':' + '.'.join(self.attrs)
+        if self.extras:
+            s += ' [%s]' % ','.join(self.extras)
+        return s
+
+    def __repr__(self):
+        return "EntryPoint.parse(%r)" % str(self)
+
+    def load(self, require=True, *args, **kwargs):
+        """
+        Require packages for this EntryPoint, then resolve it.
+        """
+        if not require or args or kwargs:
+            warnings.warn(
+                "Parameters to load are deprecated.  Call .resolve and "
+                ".require separately.",
+                DeprecationWarning,
+                stacklevel=2,
+            )
+        if require:
+            self.require(*args, **kwargs)
+        return self.resolve()
+
+    def resolve(self):
+        """
+        Resolve the entry point from its module and attrs.
+        """
+        module = __import__(self.module_name, fromlist=['__name__'], level=0)
+        try:
+            return functools.reduce(getattr, self.attrs, module)
+        except AttributeError as exc:
+            raise ImportError(str(exc))
+
+    def require(self, env=None, installer=None):
+        if self.extras and not self.dist:
+            raise UnknownExtra("Can't require() without a distribution", self)
+        reqs = self.dist.requires(self.extras)
+        items = working_set.resolve(reqs, env, installer)
+        list(map(working_set.add, items))
+
+    pattern = re.compile(
+        r'\s*'
+        r'(?P<name>.+?)\s*'
+        r'=\s*'
+        r'(?P<module>[\w.]+)\s*'
+        r'(:\s*(?P<attr>[\w.]+))?\s*'
+        r'(?P<extras>\[.*\])?\s*$'
+    )
+
+    @classmethod
+    def parse(cls, src, dist=None):
+        """Parse a single entry point from string `src`
+
+        Entry point syntax follows the form::
+
+            name = some.module:some.attr [extra1, extra2]
+
+        The entry name and module name are required, but the ``:attrs`` and
+        ``[extras]`` parts are optional
+        """
+        m = cls.pattern.match(src)
+        if not m:
+            msg = "EntryPoint must be in 'name=module:attrs [extras]' format"
+            raise ValueError(msg, src)
+        res = m.groupdict()
+        extras = cls._parse_extras(res['extras'])
+        attrs = res['attr'].split('.') if res['attr'] else ()
+        return cls(res['name'], res['module'], attrs, extras, dist)
+
+    @classmethod
+    def _parse_extras(cls, extras_spec):
+        if not extras_spec:
+            return ()
+        req = Requirement.parse('x' + extras_spec)
+        if req.specs:
+            raise ValueError()
+        return req.extras
+
+    @classmethod
+    def parse_group(cls, group, lines, dist=None):
+        """Parse an entry point group"""
+        if not MODULE(group):
+            raise ValueError("Invalid group name", group)
+        this = {}
+        for line in yield_lines(lines):
+            ep = cls.parse(line, dist)
+            if ep.name in this:
+                raise ValueError("Duplicate entry point", group, ep.name)
+            this[ep.name] = ep
+        return this
+
+    @classmethod
+    def parse_map(cls, data, dist=None):
+        """Parse a map of entry point groups"""
+        if isinstance(data, dict):
+            data = data.items()
+        else:
+            data = split_sections(data)
+        maps = {}
+        for group, lines in data:
+            if group is None:
+                if not lines:
+                    continue
+                raise ValueError("Entry points must be listed in groups")
+            group = group.strip()
+            if group in maps:
+                raise ValueError("Duplicate group name", group)
+            maps[group] = cls.parse_group(group, lines, dist)
+        return maps
+
+
+def _remove_md5_fragment(location):
+    if not location:
+        return ''
+    parsed = urllib.parse.urlparse(location)
+    if parsed[-1].startswith('md5='):
+        return urllib.parse.urlunparse(parsed[:-1] + ('',))
+    return location
+
+
+def _version_from_file(lines):
+    """
+    Given an iterable of lines from a Metadata file, return
+    the value of the Version field, if present, or None otherwise.
+    """
+    is_version_line = lambda line: line.lower().startswith('version:')
+    version_lines = filter(is_version_line, lines)
+    line = next(iter(version_lines), '')
+    _, _, value = line.partition(':')
+    return safe_version(value.strip()) or None
+
+
+class Distribution(object):
+    """Wrap an actual or potential sys.path entry w/metadata"""
+    PKG_INFO = 'PKG-INFO'
+
+    def __init__(self, location=None, metadata=None, project_name=None,
+            version=None, py_version=PY_MAJOR, platform=None,
+            precedence=EGG_DIST):
+        self.project_name = safe_name(project_name or 'Unknown')
+        if version is not None:
+            self._version = safe_version(version)
+        self.py_version = py_version
+        self.platform = platform
+        self.location = location
+        self.precedence = precedence
+        self._provider = metadata or empty_provider
+
+    @classmethod
+    def from_location(cls, location, basename, metadata=None, **kw):
+        project_name, version, py_version, platform = [None] * 4
+        basename, ext = os.path.splitext(basename)
+        if ext.lower() in _distributionImpl:
+            cls = _distributionImpl[ext.lower()]
+
+            match = EGG_NAME(basename)
+            if match:
+                project_name, version, py_version, platform = match.group(
+                    'name', 'ver', 'pyver', 'plat'
+                )
+        return cls(
+            location, metadata, project_name=project_name, version=version,
+            py_version=py_version, platform=platform, **kw
+        )._reload_version()
+
+    def _reload_version(self):
+        return self
+
+    @property
+    def hashcmp(self):
+        return (
+            self.parsed_version,
+            self.precedence,
+            self.key,
+            _remove_md5_fragment(self.location),
+            self.py_version or '',
+            self.platform or '',
+        )
+
+    def __hash__(self):
+        return hash(self.hashcmp)
+
+    def __lt__(self, other):
+        return self.hashcmp < other.hashcmp
+
+    def __le__(self, other):
+        return self.hashcmp <= other.hashcmp
+
+    def __gt__(self, other):
+        return self.hashcmp > other.hashcmp
+
+    def __ge__(self, other):
+        return self.hashcmp >= other.hashcmp
+
+    def __eq__(self, other):
+        if not isinstance(other, self.__class__):
+            # It's not a Distribution, so they are not equal
+            return False
+        return self.hashcmp == other.hashcmp
+
+    def __ne__(self, other):
+        return not self == other
+
+    # These properties have to be lazy so that we don't have to load any
+    # metadata until/unless it's actually needed.  (i.e., some distributions
+    # may not know their name or version without loading PKG-INFO)
+
+    @property
+    def key(self):
+        try:
+            return self._key
+        except AttributeError:
+            self._key = key = self.project_name.lower()
+            return key
+
+    @property
+    def parsed_version(self):
+        if not hasattr(self, "_parsed_version"):
+            self._parsed_version = parse_version(self.version)
+
+        return self._parsed_version
+
+    def _warn_legacy_version(self):
+        LV = packaging.version.LegacyVersion
+        is_legacy = isinstance(self._parsed_version, LV)
+        if not is_legacy:
+            return
+
+        # While an empty version is technically a legacy version and
+        # is not a valid PEP 440 version, it's also unlikely to
+        # actually come from someone and instead it is more likely that
+        # it comes from setuptools attempting to parse a filename and
+        # including it in the list. So for that we'll gate this warning
+        # on if the version is anything at all or not.
+        if not self.version:
+            return
+
+        tmpl = textwrap.dedent("""
+            '{project_name} ({version})' is being parsed as a legacy,
+            non PEP 440,
+            version. You may find odd behavior and sort order.
+            In particular it will be sorted as less than 0.0. It
+            is recommended to migrate to PEP 440 compatible
+            versions.
+            """).strip().replace('\n', ' ')
+
+        warnings.warn(tmpl.format(**vars(self)), PEP440Warning)
+
+    @property
+    def version(self):
+        try:
+            return self._version
+        except AttributeError:
+            version = _version_from_file(self._get_metadata(self.PKG_INFO))
+            if version is None:
+                tmpl = "Missing 'Version:' header and/or %s file"
+                raise ValueError(tmpl % self.PKG_INFO, self)
+            return version
+
+    @property
+    def _dep_map(self):
+        try:
+            return self.__dep_map
+        except AttributeError:
+            dm = self.__dep_map = {None: []}
+            for name in 'requires.txt', 'depends.txt':
+                for extra, reqs in split_sections(self._get_metadata(name)):
+                    if extra:
+                        if ':' in extra:
+                            extra, marker = extra.split(':', 1)
+                            if invalid_marker(marker):
+                                # XXX warn
+                                reqs = []
+                            elif not evaluate_marker(marker):
+                                reqs = []
+                        extra = safe_extra(extra) or None
+                    dm.setdefault(extra, []).extend(parse_requirements(reqs))
+            return dm
+
+    def requires(self, extras=()):
+        """List of Requirements needed for this distro if `extras` are used"""
+        dm = self._dep_map
+        deps = []
+        deps.extend(dm.get(None, ()))
+        for ext in extras:
+            try:
+                deps.extend(dm[safe_extra(ext)])
+            except KeyError:
+                raise UnknownExtra(
+                    "%s has no such extra feature %r" % (self, ext)
+                )
+        return deps
+
+    def _get_metadata(self, name):
+        if self.has_metadata(name):
+            for line in self.get_metadata_lines(name):
+                yield line
+
+    def activate(self, path=None, replace=False):
+        """Ensure distribution is importable on `path` (default=sys.path)"""
+        if path is None:
+            path = sys.path
+        self.insert_on(path, replace=replace)
+        if path is sys.path:
+            fixup_namespace_packages(self.location)
+            for pkg in self._get_metadata('namespace_packages.txt'):
+                if pkg in sys.modules:
+                    declare_namespace(pkg)
+
+    def egg_name(self):
+        """Return what this distribution's standard .egg filename should be"""
+        filename = "%s-%s-py%s" % (
+            to_filename(self.project_name), to_filename(self.version),
+            self.py_version or PY_MAJOR
+        )
+
+        if self.platform:
+            filename += '-' + self.platform
+        return filename
+
+    def __repr__(self):
+        if self.location:
+            return "%s (%s)" % (self, self.location)
+        else:
+            return str(self)
+
+    def __str__(self):
+        try:
+            version = getattr(self, 'version', None)
+        except ValueError:
+            version = None
+        version = version or "[unknown version]"
+        return "%s %s" % (self.project_name, version)
+
+    def __getattr__(self, attr):
+        """Delegate all unrecognized public attributes to .metadata provider"""
+        if attr.startswith('_'):
+            raise AttributeError(attr)
+        return getattr(self._provider, attr)
+
+    @classmethod
+    def from_filename(cls, filename, metadata=None, **kw):
+        return cls.from_location(
+            _normalize_cached(filename), os.path.basename(filename), metadata,
+            **kw
+        )
+
+    def as_requirement(self):
+        """Return a ``Requirement`` that matches this distribution exactly"""
+        if isinstance(self.parsed_version, packaging.version.Version):
+            spec = "%s==%s" % (self.project_name, self.parsed_version)
+        else:
+            spec = "%s===%s" % (self.project_name, self.parsed_version)
+
+        return Requirement.parse(spec)
+
+    def load_entry_point(self, group, name):
+        """Return the `name` entry point of `group` or raise ImportError"""
+        ep = self.get_entry_info(group, name)
+        if ep is None:
+            raise ImportError("Entry point %r not found" % ((group, name),))
+        return ep.load()
+
+    def get_entry_map(self, group=None):
+        """Return the entry point map for `group`, or the full entry map"""
+        try:
+            ep_map = self._ep_map
+        except AttributeError:
+            ep_map = self._ep_map = EntryPoint.parse_map(
+                self._get_metadata('entry_points.txt'), self
+            )
+        if group is not None:
+            return ep_map.get(group, {})
+        return ep_map
+
+    def get_entry_info(self, group, name):
+        """Return the EntryPoint object for `group`+`name`, or ``None``"""
+        return self.get_entry_map(group).get(name)
+
+    def insert_on(self, path, loc=None, replace=False):
+        """Ensure self.location is on path
+
+        If replace=False (default):
+            - If location is already in path anywhere, do nothing.
+            - Else:
+              - If it's an egg and its parent directory is on path,
+                insert just ahead of the parent.
+              - Else: add to the end of path.
+        If replace=True:
+            - If location is already on path anywhere (not eggs)
+              or higher priority than its parent (eggs)
+              do nothing.
+            - Else:
+              - If it's an egg and its parent directory is on path,
+                insert just ahead of the parent,
+                removing any lower-priority entries.
+              - Else: add it to the front of path.
+        """
+
+        loc = loc or self.location
+        if not loc:
+            return
+
+        nloc = _normalize_cached(loc)
+        bdir = os.path.dirname(nloc)
+        npath = [(p and _normalize_cached(p) or p) for p in path]
+
+        for p, item in enumerate(npath):
+            if item == nloc:
+                if replace:
+                    break
+                else:
+                    # don't modify path (even removing duplicates) if found and not replace
+                    return
+            elif item == bdir and self.precedence == EGG_DIST:
+                # if it's an .egg, give it precedence over its directory
+                # UNLESS it's already been added to sys.path and replace=False
+                if (not replace) and nloc in npath[p:]:
+                    return
+                if path is sys.path:
+                    self.check_version_conflict()
+                path.insert(p, loc)
+                npath.insert(p, nloc)
+                break
+        else:
+            if path is sys.path:
+                self.check_version_conflict()
+            if replace:
+                path.insert(0, loc)
+            else:
+                path.append(loc)
+            return
+
+        # p is the spot where we found or inserted loc; now remove duplicates
+        while True:
+            try:
+                np = npath.index(nloc, p + 1)
+            except ValueError:
+                break
+            else:
+                del npath[np], path[np]
+                # ha!
+                p = np
+
+        return
+
+    def check_version_conflict(self):
+        if self.key == 'setuptools':
+            # ignore the inevitable setuptools self-conflicts  :(
+            return
+
+        nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt'))
+        loc = normalize_path(self.location)
+        for modname in self._get_metadata('top_level.txt'):
+            if (modname not in sys.modules or modname in nsp
+                    or modname in _namespace_packages):
+                continue
+            if modname in ('pkg_resources', 'setuptools', 'site'):
+                continue
+            fn = getattr(sys.modules[modname], '__file__', None)
+            if fn and (normalize_path(fn).startswith(loc) or
+                       fn.startswith(self.location)):
+                continue
+            issue_warning(
+                "Module %s was already imported from %s, but %s is being added"
+                " to sys.path" % (modname, fn, self.location),
+            )
+
+    def has_version(self):
+        try:
+            self.version
+        except ValueError:
+            issue_warning("Unbuilt egg for " + repr(self))
+            return False
+        return True
+
+    def clone(self, **kw):
+        """Copy this distribution, substituting in any changed keyword args"""
+        names = 'project_name version py_version platform location precedence'
+        for attr in names.split():
+            kw.setdefault(attr, getattr(self, attr, None))
+        kw.setdefault('metadata', self._provider)
+        return self.__class__(**kw)
+
+    @property
+    def extras(self):
+        return [dep for dep in self._dep_map if dep]
+
+
+class EggInfoDistribution(Distribution):
+    def _reload_version(self):
+        """
+        Packages installed by distutils (e.g. numpy or scipy),
+        which uses an old safe_version, and so
+        their version numbers can get mangled when
+        converted to filenames (e.g., 1.11.0.dev0+2329eae to
+        1.11.0.dev0_2329eae). These distributions will not be
+        parsed properly
+        downstream by Distribution and safe_version, so
+        take an extra step and try to get the version number from
+        the metadata file itself instead of the filename.
+        """
+        md_version = _version_from_file(self._get_metadata(self.PKG_INFO))
+        if md_version:
+            self._version = md_version
+        return self
+
+
+class DistInfoDistribution(Distribution):
+    """Wrap an actual or potential sys.path entry w/metadata, .dist-info style"""
+    PKG_INFO = 'METADATA'
+    EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])")
+
+    @property
+    def _parsed_pkg_info(self):
+        """Parse and cache metadata"""
+        try:
+            return self._pkg_info
+        except AttributeError:
+            metadata = self.get_metadata(self.PKG_INFO)
+            self._pkg_info = email.parser.Parser().parsestr(metadata)
+            return self._pkg_info
+
+    @property
+    def _dep_map(self):
+        try:
+            return self.__dep_map
+        except AttributeError:
+            self.__dep_map = self._compute_dependencies()
+            return self.__dep_map
+
+    def _compute_dependencies(self):
+        """Recompute this distribution's dependencies."""
+        dm = self.__dep_map = {None: []}
+
+        reqs = []
+        # Including any condition expressions
+        for req in self._parsed_pkg_info.get_all('Requires-Dist') or []:
+            reqs.extend(parse_requirements(req))
+
+        def reqs_for_extra(extra):
+            for req in reqs:
+                if not req.marker or req.marker.evaluate({'extra': extra}):
+                    yield req
+
+        common = frozenset(reqs_for_extra(None))
+        dm[None].extend(common)
+
+        for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []:
+            s_extra = safe_extra(extra.strip())
+            dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common)
+
+        return dm
+
+
+_distributionImpl = {
+    '.egg': Distribution,
+    '.egg-info': EggInfoDistribution,
+    '.dist-info': DistInfoDistribution,
+    }
+
+
+def issue_warning(*args, **kw):
+    level = 1
+    g = globals()
+    try:
+        # find the first stack frame that is *not* code in
+        # the pkg_resources module, to use for the warning
+        while sys._getframe(level).f_globals is g:
+            level += 1
+    except ValueError:
+        pass
+    warnings.warn(stacklevel=level + 1, *args, **kw)
+
+
+class RequirementParseError(ValueError):
+    def __str__(self):
+        return ' '.join(self.args)
+
+
+def parse_requirements(strs):
+    """Yield ``Requirement`` objects for each specification in `strs`
+
+    `strs` must be a string, or a (possibly-nested) iterable thereof.
+    """
+    # create a steppable iterator, so we can handle \-continuations
+    lines = iter(yield_lines(strs))
+
+    for line in lines:
+        # Drop comments -- a hash without a space may be in a URL.
+        if ' #' in line:
+            line = line[:line.find(' #')]
+        # If there is a line continuation, drop it, and append the next line.
+        if line.endswith('\\'):
+            line = line[:-2].strip()
+            line += next(lines)
+        yield Requirement(line)
+
+
+class Requirement(packaging.requirements.Requirement):
+    def __init__(self, requirement_string):
+        """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!"""
+        try:
+            super(Requirement, self).__init__(requirement_string)
+        except packaging.requirements.InvalidRequirement as e:
+            raise RequirementParseError(str(e))
+        self.unsafe_name = self.name
+        project_name = safe_name(self.name)
+        self.project_name, self.key = project_name, project_name.lower()
+        self.specs = [
+            (spec.operator, spec.version) for spec in self.specifier]
+        self.extras = tuple(map(safe_extra, self.extras))
+        self.hashCmp = (
+            self.key,
+            self.specifier,
+            frozenset(self.extras),
+            str(self.marker) if self.marker else None,
+        )
+        self.__hash = hash(self.hashCmp)
+
+    def __eq__(self, other):
+        return (
+            isinstance(other, Requirement) and
+            self.hashCmp == other.hashCmp
+        )
+
+    def __ne__(self, other):
+        return not self == other
+
+    def __contains__(self, item):
+        if isinstance(item, Distribution):
+            if item.key != self.key:
+                return False
+
+            item = item.version
+
+        # Allow prereleases always in order to match the previous behavior of
+        # this method. In the future this should be smarter and follow PEP 440
+        # more accurately.
+        return self.specifier.contains(item, prereleases=True)
+
+    def __hash__(self):
+        return self.__hash
+
+    def __repr__(self): return "Requirement.parse(%r)" % str(self)
+
+    @staticmethod
+    def parse(s):
+        req, = parse_requirements(s)
+        return req
+
+
+def _get_mro(cls):
+    """Get an mro for a type or classic class"""
+    if not isinstance(cls, type):
+
+        class cls(cls, object):
+            pass
+
+        return cls.__mro__[1:]
+    return cls.__mro__
+
+
+def _find_adapter(registry, ob):
+    """Return an adapter factory for `ob` from `registry`"""
+    for t in _get_mro(getattr(ob, '__class__', type(ob))):
+        if t in registry:
+            return registry[t]
+
+
+def ensure_directory(path):
+    """Ensure that the parent directory of `path` exists"""
+    dirname = os.path.dirname(path)
+    if not os.path.isdir(dirname):
+        os.makedirs(dirname)
+
+
+def _bypass_ensure_directory(path):
+    """Sandbox-bypassing version of ensure_directory()"""
+    if not WRITE_SUPPORT:
+        raise IOError('"os.mkdir" not supported on this platform.')
+    dirname, filename = split(path)
+    if dirname and filename and not isdir(dirname):
+        _bypass_ensure_directory(dirname)
+        mkdir(dirname, 0o755)
+
+
+def split_sections(s):
+    """Split a string or iterable thereof into (section, content) pairs
+
+    Each ``section`` is a stripped version of the section header ("[section]")
+    and each ``content`` is a list of stripped lines excluding blank lines and
+    comment-only lines.  If there are any such lines before the first section
+    header, they're returned in a first ``section`` of ``None``.
+    """
+    section = None
+    content = []
+    for line in yield_lines(s):
+        if line.startswith("["):
+            if line.endswith("]"):
+                if section or content:
+                    yield section, content
+                section = line[1:-1].strip()
+                content = []
+            else:
+                raise ValueError("Invalid section heading", line)
+        else:
+            content.append(line)
+
+    # wrap up last segment
+    yield section, content
+
+
+def _mkstemp(*args, **kw):
+    old_open = os.open
+    try:
+        # temporarily bypass sandboxing
+        os.open = os_open
+        return tempfile.mkstemp(*args, **kw)
+    finally:
+        # and then put it back
+        os.open = old_open
+
+
+# Silence the PEP440Warning by default, so that end users don't get hit by it
+# randomly just because they use pkg_resources. We want to append the rule
+# because we want earlier uses of filterwarnings to take precedence over this
+# one.
+warnings.filterwarnings("ignore", category=PEP440Warning, append=True)
+
+
+# from jaraco.functools 1.3
+def _call_aside(f, *args, **kwargs):
+    f(*args, **kwargs)
+    return f
+
+
+@_call_aside
+def _initialize(g=globals()):
+    "Set up global resource manager (deliberately not state-saved)"
+    manager = ResourceManager()
+    g['_manager'] = manager
+    for name in dir(manager):
+        if not name.startswith('_'):
+            g[name] = getattr(manager, name)
+
+
+@_call_aside
+def _initialize_master_working_set():
+    """
+    Prepare the master working set and make the ``require()``
+    API available.
+
+    This function has explicit effects on the global state
+    of pkg_resources. It is intended to be invoked once at
+    the initialization of this module.
+
+    Invocation by other packages is unsupported and done
+    at their own risk.
+    """
+    working_set = WorkingSet._build_master()
+    _declare_state('object', working_set=working_set)
+
+    require = working_set.require
+    iter_entry_points = working_set.iter_entry_points
+    add_activation_listener = working_set.subscribe
+    run_script = working_set.run_script
+    # backward compatibility
+    run_main = run_script
+    # Activate all distributions already on sys.path with replace=False and
+    # ensure that all distributions added to the working set in the future
+    # (e.g. by calling ``require()``) will get activated as well,
+    # with higher priority (replace=True).
+    dist = None  # ensure dist is defined for del dist below
+    for dist in working_set:
+        dist.activate(replace=False)
+    del dist
+    add_activation_listener(lambda dist: dist.activate(replace=True), existing=False)
+    working_set.entries = []
+    # match order
+    list(map(working_set.add_entry, sys.path))
+    globals().update(locals())
diff --git a/vendor/pip-9.0.3/pip/_vendor/progress/__init__.py b/vendor/pip-9.0.3/pip/_vendor/progress/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..5107bc0a7968d9f8357aa013f01248b15f785bb5
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/progress/__init__.py
@@ -0,0 +1,123 @@
+# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+from __future__ import division
+
+from collections import deque
+from datetime import timedelta
+from math import ceil
+from sys import stderr
+from time import time
+
+
+__version__ = '1.2'
+
+
+class Infinite(object):
+    file = stderr
+    sma_window = 10
+
+    def __init__(self, *args, **kwargs):
+        self.index = 0
+        self.start_ts = time()
+        self._ts = self.start_ts
+        self._dt = deque(maxlen=self.sma_window)
+        for key, val in kwargs.items():
+            setattr(self, key, val)
+
+    def __getitem__(self, key):
+        if key.startswith('_'):
+            return None
+        return getattr(self, key, None)
+
+    @property
+    def avg(self):
+        return sum(self._dt) / len(self._dt) if self._dt else 0
+
+    @property
+    def elapsed(self):
+        return int(time() - self.start_ts)
+
+    @property
+    def elapsed_td(self):
+        return timedelta(seconds=self.elapsed)
+
+    def update(self):
+        pass
+
+    def start(self):
+        pass
+
+    def finish(self):
+        pass
+
+    def next(self, n=1):
+        if n > 0:
+            now = time()
+            dt = (now - self._ts) / n
+            self._dt.append(dt)
+            self._ts = now
+
+        self.index = self.index + n
+        self.update()
+
+    def iter(self, it):
+        for x in it:
+            yield x
+            self.next()
+        self.finish()
+
+
+class Progress(Infinite):
+    def __init__(self, *args, **kwargs):
+        super(Progress, self).__init__(*args, **kwargs)
+        self.max = kwargs.get('max', 100)
+
+    @property
+    def eta(self):
+        return int(ceil(self.avg * self.remaining))
+
+    @property
+    def eta_td(self):
+        return timedelta(seconds=self.eta)
+
+    @property
+    def percent(self):
+        return self.progress * 100
+
+    @property
+    def progress(self):
+        return min(1, self.index / self.max)
+
+    @property
+    def remaining(self):
+        return max(self.max - self.index, 0)
+
+    def start(self):
+        self.update()
+
+    def goto(self, index):
+        incr = index - self.index
+        self.next(incr)
+
+    def iter(self, it):
+        try:
+            self.max = len(it)
+        except TypeError:
+            pass
+
+        for x in it:
+            yield x
+            self.next()
+        self.finish()
diff --git a/vendor/pip-9.0.3/pip/_vendor/progress/bar.py b/vendor/pip-9.0.3/pip/_vendor/progress/bar.py
new file mode 100644
index 0000000000000000000000000000000000000000..8ce1461004668676b884d3f5972e3ea00a679b98
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/progress/bar.py
@@ -0,0 +1,83 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+from . import Progress
+from .helpers import WritelnMixin
+
+
+class Bar(WritelnMixin, Progress):
+    width = 32
+    message = ''
+    suffix = '%(index)d/%(max)d'
+    bar_prefix = ' |'
+    bar_suffix = '| '
+    empty_fill = ' '
+    fill = '#'
+    hide_cursor = True
+
+    def update(self):
+        filled_length = int(self.width * self.progress)
+        empty_length = self.width - filled_length
+
+        message = self.message % self
+        bar = self.fill * filled_length
+        empty = self.empty_fill * empty_length
+        suffix = self.suffix % self
+        line = ''.join([message, self.bar_prefix, bar, empty, self.bar_suffix,
+                        suffix])
+        self.writeln(line)
+
+
+class ChargingBar(Bar):
+    suffix = '%(percent)d%%'
+    bar_prefix = ' '
+    bar_suffix = ' '
+    empty_fill = u'∙'
+    fill = u'â–ˆ'
+
+
+class FillingSquaresBar(ChargingBar):
+    empty_fill = u'â–¢'
+    fill = u'â–£'
+
+
+class FillingCirclesBar(ChargingBar):
+    empty_fill = u'â—¯'
+    fill = u'â—‰'
+
+
+class IncrementalBar(Bar):
+    phases = (u' ', u'▏', u'▎', u'▍', u'▌', u'▋', u'▊', u'▉', u'█')
+
+    def update(self):
+        nphases = len(self.phases)
+        expanded_length = int(nphases * self.width * self.progress)
+        filled_length = int(self.width * self.progress)
+        empty_length = self.width - filled_length
+        phase = expanded_length - (filled_length * nphases)
+
+        message = self.message % self
+        bar = self.phases[-1] * filled_length
+        current = self.phases[phase] if phase > 0 else ''
+        empty = self.empty_fill * max(0, empty_length - len(current))
+        suffix = self.suffix % self
+        line = ''.join([message, self.bar_prefix, bar, current, empty,
+                        self.bar_suffix, suffix])
+        self.writeln(line)
+
+
+class ShadyBar(IncrementalBar):
+    phases = (u' ', u'â–‘', u'â–’', u'â–“', u'â–ˆ')
diff --git a/vendor/pip-9.0.3/pip/_vendor/progress/counter.py b/vendor/pip-9.0.3/pip/_vendor/progress/counter.py
new file mode 100644
index 0000000000000000000000000000000000000000..caaddc680d31f646f9ebc1cfba1da2ed7e101a5a
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/progress/counter.py
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+from . import Infinite, Progress
+from .helpers import WriteMixin
+
+
+class Counter(WriteMixin, Infinite):
+    message = ''
+    hide_cursor = True
+
+    def update(self):
+        self.write(str(self.index))
+
+
+class Countdown(WriteMixin, Progress):
+    hide_cursor = True
+
+    def update(self):
+        self.write(str(self.remaining))
+
+
+class Stack(WriteMixin, Progress):
+    phases = (u' ', u'▁', u'▂', u'▃', u'▄', u'▅', u'▆', u'▇', u'█')
+    hide_cursor = True
+
+    def update(self):
+        nphases = len(self.phases)
+        i = min(nphases - 1, int(self.progress * nphases))
+        self.write(self.phases[i])
+
+
+class Pie(Stack):
+    phases = (u'○', u'◔', u'◑', u'◕', u'●')
diff --git a/vendor/pip-9.0.3/pip/_vendor/progress/helpers.py b/vendor/pip-9.0.3/pip/_vendor/progress/helpers.py
new file mode 100644
index 0000000000000000000000000000000000000000..9ed90b2bc4c90c506a0e9bc2452e3765c323fe66
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/progress/helpers.py
@@ -0,0 +1,91 @@
+# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+from __future__ import print_function
+
+
+HIDE_CURSOR = '\x1b[?25l'
+SHOW_CURSOR = '\x1b[?25h'
+
+
+class WriteMixin(object):
+    hide_cursor = False
+
+    def __init__(self, message=None, **kwargs):
+        super(WriteMixin, self).__init__(**kwargs)
+        self._width = 0
+        if message:
+            self.message = message
+
+        if self.file.isatty():
+            if self.hide_cursor:
+                print(HIDE_CURSOR, end='', file=self.file)
+            print(self.message, end='', file=self.file)
+            self.file.flush()
+
+    def write(self, s):
+        if self.file.isatty():
+            b = '\b' * self._width
+            c = s.ljust(self._width)
+            print(b + c, end='', file=self.file)
+            self._width = max(self._width, len(s))
+            self.file.flush()
+
+    def finish(self):
+        if self.file.isatty() and self.hide_cursor:
+            print(SHOW_CURSOR, end='', file=self.file)
+
+
+class WritelnMixin(object):
+    hide_cursor = False
+
+    def __init__(self, message=None, **kwargs):
+        super(WritelnMixin, self).__init__(**kwargs)
+        if message:
+            self.message = message
+
+        if self.file.isatty() and self.hide_cursor:
+            print(HIDE_CURSOR, end='', file=self.file)
+
+    def clearln(self):
+        if self.file.isatty():
+            print('\r\x1b[K', end='', file=self.file)
+
+    def writeln(self, line):
+        if self.file.isatty():
+            self.clearln()
+            print(line, end='', file=self.file)
+            self.file.flush()
+
+    def finish(self):
+        if self.file.isatty():
+            print(file=self.file)
+            if self.hide_cursor:
+                print(SHOW_CURSOR, end='', file=self.file)
+
+
+from signal import signal, SIGINT
+from sys import exit
+
+
+class SigIntMixin(object):
+    """Registers a signal handler that calls finish on SIGINT"""
+
+    def __init__(self, *args, **kwargs):
+        super(SigIntMixin, self).__init__(*args, **kwargs)
+        signal(SIGINT, self._sigint_handler)
+
+    def _sigint_handler(self, signum, frame):
+        self.finish()
+        exit(0)
diff --git a/vendor/pip-9.0.3/pip/_vendor/progress/spinner.py b/vendor/pip-9.0.3/pip/_vendor/progress/spinner.py
new file mode 100644
index 0000000000000000000000000000000000000000..969bfbb5c80e5625bb6ffc83b93f629127951a61
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/progress/spinner.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+from . import Infinite
+from .helpers import WriteMixin
+
+
+class Spinner(WriteMixin, Infinite):
+    message = ''
+    phases = ('-', '\\', '|', '/')
+    hide_cursor = True
+
+    def update(self):
+        i = self.index % len(self.phases)
+        self.write(self.phases[i])
+
+
+class PieSpinner(Spinner):
+    phases = [u'â—·', u'â—¶', u'â—µ', u'â—´']
+
+
+class MoonSpinner(Spinner):
+    phases = [u'◑', u'◒', u'◐', u'◓']
+
+
+class LineSpinner(Spinner):
+    phases = [u'⎺', u'⎻', u'⎼', u'⎽', u'⎼', u'⎻']
diff --git a/vendor/pip-9.0.3/pip/_vendor/pyparsing.py b/vendor/pip-9.0.3/pip/_vendor/pyparsing.py
new file mode 100644
index 0000000000000000000000000000000000000000..cb46d411ab9212b54eaab6163e0feb3b39609e7c
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/pyparsing.py
@@ -0,0 +1,5696 @@
+# module pyparsing.py
+#
+# Copyright (c) 2003-2016  Paul T. McGuire
+#
+# 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.
+#
+
+__doc__ = \
+"""
+pyparsing module - Classes and methods to define and execute parsing grammars
+
+The pyparsing module is an alternative approach to creating and executing simple grammars,
+vs. the traditional lex/yacc approach, or the use of regular expressions.  With pyparsing, you
+don't need to learn a new syntax for defining grammars or matching expressions - the parsing module
+provides a library of classes that you use to construct the grammar directly in Python.
+
+Here is a program to parse "Hello, World!" (or any greeting of the form 
+C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements 
+(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to
+L{Literal} expressions)::
+
+    from pyparsing import Word, alphas
+
+    # define grammar of a greeting
+    greet = Word(alphas) + "," + Word(alphas) + "!"
+
+    hello = "Hello, World!"
+    print (hello, "->", greet.parseString(hello))
+
+The program outputs the following::
+
+    Hello, World! -> ['Hello', ',', 'World', '!']
+
+The Python representation of the grammar is quite readable, owing to the self-explanatory
+class names, and the use of '+', '|' and '^' operators.
+
+The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an
+object with named attributes.
+
+The pyparsing module handles some of the problems that are typically vexing when writing text parsers:
+ - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello  ,  World  !", etc.)
+ - quoted strings
+ - embedded comments
+"""
+
+__version__ = "2.1.10"
+__versionTime__ = "07 Oct 2016 01:31 UTC"
+__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>"
+
+import string
+from weakref import ref as wkref
+import copy
+import sys
+import warnings
+import re
+import sre_constants
+import collections
+import pprint
+import traceback
+import types
+from datetime import datetime
+
+try:
+    from _thread import RLock
+except ImportError:
+    from threading import RLock
+
+try:
+    from collections import OrderedDict as _OrderedDict
+except ImportError:
+    try:
+        from ordereddict import OrderedDict as _OrderedDict
+    except ImportError:
+        _OrderedDict = None
+
+#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) )
+
+__all__ = [
+'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty',
+'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal',
+'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or',
+'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException',
+'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException',
+'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', 
+'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore',
+'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col',
+'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString',
+'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums',
+'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno',
+'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral',
+'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables',
+'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', 
+'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd',
+'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute',
+'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass',
+'CloseMatch', 'tokenMap', 'pyparsing_common',
+]
+
+system_version = tuple(sys.version_info)[:3]
+PY_3 = system_version[0] == 3
+if PY_3:
+    _MAX_INT = sys.maxsize
+    basestring = str
+    unichr = chr
+    _ustr = str
+
+    # build list of single arg builtins, that can be used as parse actions
+    singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max]
+
+else:
+    _MAX_INT = sys.maxint
+    range = xrange
+
+    def _ustr(obj):
+        """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries
+           str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It
+           then < returns the unicode object | encodes it with the default encoding | ... >.
+        """
+        if isinstance(obj,unicode):
+            return obj
+
+        try:
+            # If this works, then _ustr(obj) has the same behaviour as str(obj), so
+            # it won't break any existing code.
+            return str(obj)
+
+        except UnicodeEncodeError:
+            # Else encode it
+            ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace')
+            xmlcharref = Regex('&#\d+;')
+            xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:])
+            return xmlcharref.transformString(ret)
+
+    # build list of single arg builtins, tolerant of Python version, that can be used as parse actions
+    singleArgBuiltins = []
+    import __builtin__
+    for fname in "sum len sorted reversed list tuple set any all min max".split():
+        try:
+            singleArgBuiltins.append(getattr(__builtin__,fname))
+        except AttributeError:
+            continue
+            
+_generatorType = type((y for y in range(1)))
+ 
+def _xml_escape(data):
+    """Escape &, <, >, ", ', etc. in a string of data."""
+
+    # ampersand must be replaced first
+    from_symbols = '&><"\''
+    to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split())
+    for from_,to_ in zip(from_symbols, to_symbols):
+        data = data.replace(from_, to_)
+    return data
+
+class _Constants(object):
+    pass
+
+alphas     = string.ascii_uppercase + string.ascii_lowercase
+nums       = "0123456789"
+hexnums    = nums + "ABCDEFabcdef"
+alphanums  = alphas + nums
+_bslash    = chr(92)
+printables = "".join(c for c in string.printable if c not in string.whitespace)
+
+class ParseBaseException(Exception):
+    """base exception class for all parsing runtime exceptions"""
+    # Performance tuning: we construct a *lot* of these, so keep this
+    # constructor as small and fast as possible
+    def __init__( self, pstr, loc=0, msg=None, elem=None ):
+        self.loc = loc
+        if msg is None:
+            self.msg = pstr
+            self.pstr = ""
+        else:
+            self.msg = msg
+            self.pstr = pstr
+        self.parserElement = elem
+        self.args = (pstr, loc, msg)
+
+    @classmethod
+    def _from_exception(cls, pe):
+        """
+        internal factory method to simplify creating one type of ParseException 
+        from another - avoids having __init__ signature conflicts among subclasses
+        """
+        return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement)
+
+    def __getattr__( self, aname ):
+        """supported attributes by name are:
+            - lineno - returns the line number of the exception text
+            - col - returns the column number of the exception text
+            - line - returns the line containing the exception text
+        """
+        if( aname == "lineno" ):
+            return lineno( self.loc, self.pstr )
+        elif( aname in ("col", "column") ):
+            return col( self.loc, self.pstr )
+        elif( aname == "line" ):
+            return line( self.loc, self.pstr )
+        else:
+            raise AttributeError(aname)
+
+    def __str__( self ):
+        return "%s (at char %d), (line:%d, col:%d)" % \
+                ( self.msg, self.loc, self.lineno, self.column )
+    def __repr__( self ):
+        return _ustr(self)
+    def markInputline( self, markerString = ">!<" ):
+        """Extracts the exception line from the input string, and marks
+           the location of the exception with a special symbol.
+        """
+        line_str = self.line
+        line_column = self.column - 1
+        if markerString:
+            line_str = "".join((line_str[:line_column],
+                                markerString, line_str[line_column:]))
+        return line_str.strip()
+    def __dir__(self):
+        return "lineno col line".split() + dir(type(self))
+
+class ParseException(ParseBaseException):
+    """
+    Exception thrown when parse expressions don't match class;
+    supported attributes by name are:
+     - lineno - returns the line number of the exception text
+     - col - returns the column number of the exception text
+     - line - returns the line containing the exception text
+        
+    Example::
+        try:
+            Word(nums).setName("integer").parseString("ABC")
+        except ParseException as pe:
+            print(pe)
+            print("column: {}".format(pe.col))
+            
+    prints::
+       Expected integer (at char 0), (line:1, col:1)
+        column: 1
+    """
+    pass
+
+class ParseFatalException(ParseBaseException):
+    """user-throwable exception thrown when inconsistent parse content
+       is found; stops all parsing immediately"""
+    pass
+
+class ParseSyntaxException(ParseFatalException):
+    """just like L{ParseFatalException}, but thrown internally when an
+       L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop 
+       immediately because an unbacktrackable syntax error has been found"""
+    pass
+
+#~ class ReparseException(ParseBaseException):
+    #~ """Experimental class - parse actions can raise this exception to cause
+       #~ pyparsing to reparse the input string:
+        #~ - with a modified input string, and/or
+        #~ - with a modified start location
+       #~ Set the values of the ReparseException in the constructor, and raise the
+       #~ exception in a parse action to cause pyparsing to use the new string/location.
+       #~ Setting the values as None causes no change to be made.
+       #~ """
+    #~ def __init_( self, newstring, restartLoc ):
+        #~ self.newParseText = newstring
+        #~ self.reparseLoc = restartLoc
+
+class RecursiveGrammarException(Exception):
+    """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive"""
+    def __init__( self, parseElementList ):
+        self.parseElementTrace = parseElementList
+
+    def __str__( self ):
+        return "RecursiveGrammarException: %s" % self.parseElementTrace
+
+class _ParseResultsWithOffset(object):
+    def __init__(self,p1,p2):
+        self.tup = (p1,p2)
+    def __getitem__(self,i):
+        return self.tup[i]
+    def __repr__(self):
+        return repr(self.tup[0])
+    def setOffset(self,i):
+        self.tup = (self.tup[0],i)
+
+class ParseResults(object):
+    """
+    Structured parse results, to provide multiple means of access to the parsed data:
+       - as a list (C{len(results)})
+       - by list index (C{results[0], results[1]}, etc.)
+       - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName})
+
+    Example::
+        integer = Word(nums)
+        date_str = (integer.setResultsName("year") + '/' 
+                        + integer.setResultsName("month") + '/' 
+                        + integer.setResultsName("day"))
+        # equivalent form:
+        # date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+
+        # parseString returns a ParseResults object
+        result = date_str.parseString("1999/12/31")
+
+        def test(s, fn=repr):
+            print("%s -> %s" % (s, fn(eval(s))))
+        test("list(result)")
+        test("result[0]")
+        test("result['month']")
+        test("result.day")
+        test("'month' in result")
+        test("'minutes' in result")
+        test("result.dump()", str)
+    prints::
+        list(result) -> ['1999', '/', '12', '/', '31']
+        result[0] -> '1999'
+        result['month'] -> '12'
+        result.day -> '31'
+        'month' in result -> True
+        'minutes' in result -> False
+        result.dump() -> ['1999', '/', '12', '/', '31']
+        - day: 31
+        - month: 12
+        - year: 1999
+    """
+    def __new__(cls, toklist=None, name=None, asList=True, modal=True ):
+        if isinstance(toklist, cls):
+            return toklist
+        retobj = object.__new__(cls)
+        retobj.__doinit = True
+        return retobj
+
+    # Performance tuning: we construct a *lot* of these, so keep this
+    # constructor as small and fast as possible
+    def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ):
+        if self.__doinit:
+            self.__doinit = False
+            self.__name = None
+            self.__parent = None
+            self.__accumNames = {}
+            self.__asList = asList
+            self.__modal = modal
+            if toklist is None:
+                toklist = []
+            if isinstance(toklist, list):
+                self.__toklist = toklist[:]
+            elif isinstance(toklist, _generatorType):
+                self.__toklist = list(toklist)
+            else:
+                self.__toklist = [toklist]
+            self.__tokdict = dict()
+
+        if name is not None and name:
+            if not modal:
+                self.__accumNames[name] = 0
+            if isinstance(name,int):
+                name = _ustr(name) # will always return a str, but use _ustr for consistency
+            self.__name = name
+            if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])):
+                if isinstance(toklist,basestring):
+                    toklist = [ toklist ]
+                if asList:
+                    if isinstance(toklist,ParseResults):
+                        self[name] = _ParseResultsWithOffset(toklist.copy(),0)
+                    else:
+                        self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0)
+                    self[name].__name = name
+                else:
+                    try:
+                        self[name] = toklist[0]
+                    except (KeyError,TypeError,IndexError):
+                        self[name] = toklist
+
+    def __getitem__( self, i ):
+        if isinstance( i, (int,slice) ):
+            return self.__toklist[i]
+        else:
+            if i not in self.__accumNames:
+                return self.__tokdict[i][-1][0]
+            else:
+                return ParseResults([ v[0] for v in self.__tokdict[i] ])
+
+    def __setitem__( self, k, v, isinstance=isinstance ):
+        if isinstance(v,_ParseResultsWithOffset):
+            self.__tokdict[k] = self.__tokdict.get(k,list()) + [v]
+            sub = v[0]
+        elif isinstance(k,(int,slice)):
+            self.__toklist[k] = v
+            sub = v
+        else:
+            self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)]
+            sub = v
+        if isinstance(sub,ParseResults):
+            sub.__parent = wkref(self)
+
+    def __delitem__( self, i ):
+        if isinstance(i,(int,slice)):
+            mylen = len( self.__toklist )
+            del self.__toklist[i]
+
+            # convert int to slice
+            if isinstance(i, int):
+                if i < 0:
+                    i += mylen
+                i = slice(i, i+1)
+            # get removed indices
+            removed = list(range(*i.indices(mylen)))
+            removed.reverse()
+            # fixup indices in token dictionary
+            for name,occurrences in self.__tokdict.items():
+                for j in removed:
+                    for k, (value, position) in enumerate(occurrences):
+                        occurrences[k] = _ParseResultsWithOffset(value, position - (position > j))
+        else:
+            del self.__tokdict[i]
+
+    def __contains__( self, k ):
+        return k in self.__tokdict
+
+    def __len__( self ): return len( self.__toklist )
+    def __bool__(self): return ( not not self.__toklist )
+    __nonzero__ = __bool__
+    def __iter__( self ): return iter( self.__toklist )
+    def __reversed__( self ): return iter( self.__toklist[::-1] )
+    def _iterkeys( self ):
+        if hasattr(self.__tokdict, "iterkeys"):
+            return self.__tokdict.iterkeys()
+        else:
+            return iter(self.__tokdict)
+
+    def _itervalues( self ):
+        return (self[k] for k in self._iterkeys())
+            
+    def _iteritems( self ):
+        return ((k, self[k]) for k in self._iterkeys())
+
+    if PY_3:
+        keys = _iterkeys       
+        """Returns an iterator of all named result keys (Python 3.x only)."""
+
+        values = _itervalues
+        """Returns an iterator of all named result values (Python 3.x only)."""
+
+        items = _iteritems
+        """Returns an iterator of all named result key-value tuples (Python 3.x only)."""
+
+    else:
+        iterkeys = _iterkeys
+        """Returns an iterator of all named result keys (Python 2.x only)."""
+
+        itervalues = _itervalues
+        """Returns an iterator of all named result values (Python 2.x only)."""
+
+        iteritems = _iteritems
+        """Returns an iterator of all named result key-value tuples (Python 2.x only)."""
+
+        def keys( self ):
+            """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x)."""
+            return list(self.iterkeys())
+
+        def values( self ):
+            """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x)."""
+            return list(self.itervalues())
+                
+        def items( self ):
+            """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x)."""
+            return list(self.iteritems())
+
+    def haskeys( self ):
+        """Since keys() returns an iterator, this method is helpful in bypassing
+           code that looks for the existence of any defined results names."""
+        return bool(self.__tokdict)
+        
+    def pop( self, *args, **kwargs):
+        """
+        Removes and returns item at specified index (default=C{last}).
+        Supports both C{list} and C{dict} semantics for C{pop()}. If passed no
+        argument or an integer argument, it will use C{list} semantics
+        and pop tokens from the list of parsed tokens. If passed a 
+        non-integer argument (most likely a string), it will use C{dict}
+        semantics and pop the corresponding value from any defined 
+        results names. A second default return value argument is 
+        supported, just as in C{dict.pop()}.
+
+        Example::
+            def remove_first(tokens):
+                tokens.pop(0)
+            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
+            print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321']
+
+            label = Word(alphas)
+            patt = label("LABEL") + OneOrMore(Word(nums))
+            print(patt.parseString("AAB 123 321").dump())
+
+            # Use pop() in a parse action to remove named result (note that corresponding value is not
+            # removed from list form of results)
+            def remove_LABEL(tokens):
+                tokens.pop("LABEL")
+                return tokens
+            patt.addParseAction(remove_LABEL)
+            print(patt.parseString("AAB 123 321").dump())
+        prints::
+            ['AAB', '123', '321']
+            - LABEL: AAB
+
+            ['AAB', '123', '321']
+        """
+        if not args:
+            args = [-1]
+        for k,v in kwargs.items():
+            if k == 'default':
+                args = (args[0], v)
+            else:
+                raise TypeError("pop() got an unexpected keyword argument '%s'" % k)
+        if (isinstance(args[0], int) or 
+                        len(args) == 1 or 
+                        args[0] in self):
+            index = args[0]
+            ret = self[index]
+            del self[index]
+            return ret
+        else:
+            defaultvalue = args[1]
+            return defaultvalue
+
+    def get(self, key, defaultValue=None):
+        """
+        Returns named result matching the given key, or if there is no
+        such name, then returns the given C{defaultValue} or C{None} if no
+        C{defaultValue} is specified.
+
+        Similar to C{dict.get()}.
+        
+        Example::
+            integer = Word(nums)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           
+
+            result = date_str.parseString("1999/12/31")
+            print(result.get("year")) # -> '1999'
+            print(result.get("hour", "not specified")) # -> 'not specified'
+            print(result.get("hour")) # -> None
+        """
+        if key in self:
+            return self[key]
+        else:
+            return defaultValue
+
+    def insert( self, index, insStr ):
+        """
+        Inserts new element at location index in the list of parsed tokens.
+        
+        Similar to C{list.insert()}.
+
+        Example::
+            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
+
+            # use a parse action to insert the parse location in the front of the parsed results
+            def insert_locn(locn, tokens):
+                tokens.insert(0, locn)
+            print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321']
+        """
+        self.__toklist.insert(index, insStr)
+        # fixup indices in token dictionary
+        for name,occurrences in self.__tokdict.items():
+            for k, (value, position) in enumerate(occurrences):
+                occurrences[k] = _ParseResultsWithOffset(value, position + (position > index))
+
+    def append( self, item ):
+        """
+        Add single element to end of ParseResults list of elements.
+
+        Example::
+            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
+            
+            # use a parse action to compute the sum of the parsed integers, and add it to the end
+            def append_sum(tokens):
+                tokens.append(sum(map(int, tokens)))
+            print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444]
+        """
+        self.__toklist.append(item)
+
+    def extend( self, itemseq ):
+        """
+        Add sequence of elements to end of ParseResults list of elements.
+
+        Example::
+            patt = OneOrMore(Word(alphas))
+            
+            # use a parse action to append the reverse of the matched strings, to make a palindrome
+            def make_palindrome(tokens):
+                tokens.extend(reversed([t[::-1] for t in tokens]))
+                return ''.join(tokens)
+            print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl'
+        """
+        if isinstance(itemseq, ParseResults):
+            self += itemseq
+        else:
+            self.__toklist.extend(itemseq)
+
+    def clear( self ):
+        """
+        Clear all elements and results names.
+        """
+        del self.__toklist[:]
+        self.__tokdict.clear()
+
+    def __getattr__( self, name ):
+        try:
+            return self[name]
+        except KeyError:
+            return ""
+            
+        if name in self.__tokdict:
+            if name not in self.__accumNames:
+                return self.__tokdict[name][-1][0]
+            else:
+                return ParseResults([ v[0] for v in self.__tokdict[name] ])
+        else:
+            return ""
+
+    def __add__( self, other ):
+        ret = self.copy()
+        ret += other
+        return ret
+
+    def __iadd__( self, other ):
+        if other.__tokdict:
+            offset = len(self.__toklist)
+            addoffset = lambda a: offset if a<0 else a+offset
+            otheritems = other.__tokdict.items()
+            otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) )
+                                for (k,vlist) in otheritems for v in vlist]
+            for k,v in otherdictitems:
+                self[k] = v
+                if isinstance(v[0],ParseResults):
+                    v[0].__parent = wkref(self)
+            
+        self.__toklist += other.__toklist
+        self.__accumNames.update( other.__accumNames )
+        return self
+
+    def __radd__(self, other):
+        if isinstance(other,int) and other == 0:
+            # useful for merging many ParseResults using sum() builtin
+            return self.copy()
+        else:
+            # this may raise a TypeError - so be it
+            return other + self
+        
+    def __repr__( self ):
+        return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) )
+
+    def __str__( self ):
+        return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']'
+
+    def _asStringList( self, sep='' ):
+        out = []
+        for item in self.__toklist:
+            if out and sep:
+                out.append(sep)
+            if isinstance( item, ParseResults ):
+                out += item._asStringList()
+            else:
+                out.append( _ustr(item) )
+        return out
+
+    def asList( self ):
+        """
+        Returns the parse results as a nested list of matching tokens, all converted to strings.
+
+        Example::
+            patt = OneOrMore(Word(alphas))
+            result = patt.parseString("sldkj lsdkj sldkj")
+            # even though the result prints in string-like form, it is actually a pyparsing ParseResults
+            print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj']
+            
+            # Use asList() to create an actual list
+            result_list = result.asList()
+            print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj']
+        """
+        return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist]
+
+    def asDict( self ):
+        """
+        Returns the named parse results as a nested dictionary.
+
+        Example::
+            integer = Word(nums)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+            
+            result = date_str.parseString('12/31/1999')
+            print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]})
+            
+            result_dict = result.asDict()
+            print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'}
+
+            # even though a ParseResults supports dict-like access, sometime you just need to have a dict
+            import json
+            print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable
+            print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"}
+        """
+        if PY_3:
+            item_fn = self.items
+        else:
+            item_fn = self.iteritems
+            
+        def toItem(obj):
+            if isinstance(obj, ParseResults):
+                if obj.haskeys():
+                    return obj.asDict()
+                else:
+                    return [toItem(v) for v in obj]
+            else:
+                return obj
+                
+        return dict((k,toItem(v)) for k,v in item_fn())
+
+    def copy( self ):
+        """
+        Returns a new copy of a C{ParseResults} object.
+        """
+        ret = ParseResults( self.__toklist )
+        ret.__tokdict = self.__tokdict.copy()
+        ret.__parent = self.__parent
+        ret.__accumNames.update( self.__accumNames )
+        ret.__name = self.__name
+        return ret
+
+    def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ):
+        """
+        (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names.
+        """
+        nl = "\n"
+        out = []
+        namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items()
+                                                            for v in vlist)
+        nextLevelIndent = indent + "  "
+
+        # collapse out indents if formatting is not desired
+        if not formatted:
+            indent = ""
+            nextLevelIndent = ""
+            nl = ""
+
+        selfTag = None
+        if doctag is not None:
+            selfTag = doctag
+        else:
+            if self.__name:
+                selfTag = self.__name
+
+        if not selfTag:
+            if namedItemsOnly:
+                return ""
+            else:
+                selfTag = "ITEM"
+
+        out += [ nl, indent, "<", selfTag, ">" ]
+
+        for i,res in enumerate(self.__toklist):
+            if isinstance(res,ParseResults):
+                if i in namedItems:
+                    out += [ res.asXML(namedItems[i],
+                                        namedItemsOnly and doctag is None,
+                                        nextLevelIndent,
+                                        formatted)]
+                else:
+                    out += [ res.asXML(None,
+                                        namedItemsOnly and doctag is None,
+                                        nextLevelIndent,
+                                        formatted)]
+            else:
+                # individual token, see if there is a name for it
+                resTag = None
+                if i in namedItems:
+                    resTag = namedItems[i]
+                if not resTag:
+                    if namedItemsOnly:
+                        continue
+                    else:
+                        resTag = "ITEM"
+                xmlBodyText = _xml_escape(_ustr(res))
+                out += [ nl, nextLevelIndent, "<", resTag, ">",
+                                                xmlBodyText,
+                                                "</", resTag, ">" ]
+
+        out += [ nl, indent, "</", selfTag, ">" ]
+        return "".join(out)
+
+    def __lookup(self,sub):
+        for k,vlist in self.__tokdict.items():
+            for v,loc in vlist:
+                if sub is v:
+                    return k
+        return None
+
+    def getName(self):
+        """
+        Returns the results name for this token expression. Useful when several 
+        different expressions might match at a particular location.
+
+        Example::
+            integer = Word(nums)
+            ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d")
+            house_number_expr = Suppress('#') + Word(nums, alphanums)
+            user_data = (Group(house_number_expr)("house_number") 
+                        | Group(ssn_expr)("ssn")
+                        | Group(integer)("age"))
+            user_info = OneOrMore(user_data)
+            
+            result = user_info.parseString("22 111-22-3333 #221B")
+            for item in result:
+                print(item.getName(), ':', item[0])
+        prints::
+            age : 22
+            ssn : 111-22-3333
+            house_number : 221B
+        """
+        if self.__name:
+            return self.__name
+        elif self.__parent:
+            par = self.__parent()
+            if par:
+                return par.__lookup(self)
+            else:
+                return None
+        elif (len(self) == 1 and
+               len(self.__tokdict) == 1 and
+               next(iter(self.__tokdict.values()))[0][1] in (0,-1)):
+            return next(iter(self.__tokdict.keys()))
+        else:
+            return None
+
+    def dump(self, indent='', depth=0, full=True):
+        """
+        Diagnostic method for listing out the contents of a C{ParseResults}.
+        Accepts an optional C{indent} argument so that this string can be embedded
+        in a nested display of other data.
+
+        Example::
+            integer = Word(nums)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+            
+            result = date_str.parseString('12/31/1999')
+            print(result.dump())
+        prints::
+            ['12', '/', '31', '/', '1999']
+            - day: 1999
+            - month: 31
+            - year: 12
+        """
+        out = []
+        NL = '\n'
+        out.append( indent+_ustr(self.asList()) )
+        if full:
+            if self.haskeys():
+                items = sorted((str(k), v) for k,v in self.items())
+                for k,v in items:
+                    if out:
+                        out.append(NL)
+                    out.append( "%s%s- %s: " % (indent,('  '*depth), k) )
+                    if isinstance(v,ParseResults):
+                        if v:
+                            out.append( v.dump(indent,depth+1) )
+                        else:
+                            out.append(_ustr(v))
+                    else:
+                        out.append(repr(v))
+            elif any(isinstance(vv,ParseResults) for vv in self):
+                v = self
+                for i,vv in enumerate(v):
+                    if isinstance(vv,ParseResults):
+                        out.append("\n%s%s[%d]:\n%s%s%s" % (indent,('  '*(depth)),i,indent,('  '*(depth+1)),vv.dump(indent,depth+1) ))
+                    else:
+                        out.append("\n%s%s[%d]:\n%s%s%s" % (indent,('  '*(depth)),i,indent,('  '*(depth+1)),_ustr(vv)))
+            
+        return "".join(out)
+
+    def pprint(self, *args, **kwargs):
+        """
+        Pretty-printer for parsed results as a list, using the C{pprint} module.
+        Accepts additional positional or keyword args as defined for the 
+        C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint})
+
+        Example::
+            ident = Word(alphas, alphanums)
+            num = Word(nums)
+            func = Forward()
+            term = ident | num | Group('(' + func + ')')
+            func <<= ident + Group(Optional(delimitedList(term)))
+            result = func.parseString("fna a,b,(fnb c,d,200),100")
+            result.pprint(width=40)
+        prints::
+            ['fna',
+             ['a',
+              'b',
+              ['(', 'fnb', ['c', 'd', '200'], ')'],
+              '100']]
+        """
+        pprint.pprint(self.asList(), *args, **kwargs)
+
+    # add support for pickle protocol
+    def __getstate__(self):
+        return ( self.__toklist,
+                 ( self.__tokdict.copy(),
+                   self.__parent is not None and self.__parent() or None,
+                   self.__accumNames,
+                   self.__name ) )
+
+    def __setstate__(self,state):
+        self.__toklist = state[0]
+        (self.__tokdict,
+         par,
+         inAccumNames,
+         self.__name) = state[1]
+        self.__accumNames = {}
+        self.__accumNames.update(inAccumNames)
+        if par is not None:
+            self.__parent = wkref(par)
+        else:
+            self.__parent = None
+
+    def __getnewargs__(self):
+        return self.__toklist, self.__name, self.__asList, self.__modal
+
+    def __dir__(self):
+        return (dir(type(self)) + list(self.keys()))
+
+collections.MutableMapping.register(ParseResults)
+
+def col (loc,strg):
+    """Returns current column within a string, counting newlines as line separators.
+   The first column is number 1.
+
+   Note: the default parsing behavior is to expand tabs in the input string
+   before starting the parsing process.  See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information
+   on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
+   consistent view of the parsed string, the parse location, and line and column
+   positions within the parsed string.
+   """
+    s = strg
+    return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc)
+
+def lineno(loc,strg):
+    """Returns current line number within a string, counting newlines as line separators.
+   The first line is number 1.
+
+   Note: the default parsing behavior is to expand tabs in the input string
+   before starting the parsing process.  See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information
+   on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
+   consistent view of the parsed string, the parse location, and line and column
+   positions within the parsed string.
+   """
+    return strg.count("\n",0,loc) + 1
+
+def line( loc, strg ):
+    """Returns the line of text containing loc within a string, counting newlines as line separators.
+       """
+    lastCR = strg.rfind("\n", 0, loc)
+    nextCR = strg.find("\n", loc)
+    if nextCR >= 0:
+        return strg[lastCR+1:nextCR]
+    else:
+        return strg[lastCR+1:]
+
+def _defaultStartDebugAction( instring, loc, expr ):
+    print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )))
+
+def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ):
+    print ("Matched " + _ustr(expr) + " -> " + str(toks.asList()))
+
+def _defaultExceptionDebugAction( instring, loc, expr, exc ):
+    print ("Exception raised:" + _ustr(exc))
+
+def nullDebugAction(*args):
+    """'Do-nothing' debug action, to suppress debugging output during parsing."""
+    pass
+
+# Only works on Python 3.x - nonlocal is toxic to Python 2 installs
+#~ 'decorator to trim function calls to match the arity of the target'
+#~ def _trim_arity(func, maxargs=3):
+    #~ if func in singleArgBuiltins:
+        #~ return lambda s,l,t: func(t)
+    #~ limit = 0
+    #~ foundArity = False
+    #~ def wrapper(*args):
+        #~ nonlocal limit,foundArity
+        #~ while 1:
+            #~ try:
+                #~ ret = func(*args[limit:])
+                #~ foundArity = True
+                #~ return ret
+            #~ except TypeError:
+                #~ if limit == maxargs or foundArity:
+                    #~ raise
+                #~ limit += 1
+                #~ continue
+    #~ return wrapper
+
+# this version is Python 2.x-3.x cross-compatible
+'decorator to trim function calls to match the arity of the target'
+def _trim_arity(func, maxargs=2):
+    if func in singleArgBuiltins:
+        return lambda s,l,t: func(t)
+    limit = [0]
+    foundArity = [False]
+    
+    # traceback return data structure changed in Py3.5 - normalize back to plain tuples
+    if system_version[:2] >= (3,5):
+        def extract_stack(limit=0):
+            # special handling for Python 3.5.0 - extra deep call stack by 1
+            offset = -3 if system_version == (3,5,0) else -2
+            frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset]
+            return [(frame_summary.filename, frame_summary.lineno)]
+        def extract_tb(tb, limit=0):
+            frames = traceback.extract_tb(tb, limit=limit)
+            frame_summary = frames[-1]
+            return [(frame_summary.filename, frame_summary.lineno)]
+    else:
+        extract_stack = traceback.extract_stack
+        extract_tb = traceback.extract_tb
+    
+    # synthesize what would be returned by traceback.extract_stack at the call to 
+    # user's parse action 'func', so that we don't incur call penalty at parse time
+    
+    LINE_DIFF = 6
+    # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND 
+    # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!!
+    this_line = extract_stack(limit=2)[-1]
+    pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF)
+
+    def wrapper(*args):
+        while 1:
+            try:
+                ret = func(*args[limit[0]:])
+                foundArity[0] = True
+                return ret
+            except TypeError:
+                # re-raise TypeErrors if they did not come from our arity testing
+                if foundArity[0]:
+                    raise
+                else:
+                    try:
+                        tb = sys.exc_info()[-1]
+                        if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth:
+                            raise
+                    finally:
+                        del tb
+
+                if limit[0] <= maxargs:
+                    limit[0] += 1
+                    continue
+                raise
+
+    # copy func name to wrapper for sensible debug output
+    func_name = "<parse action>"
+    try:
+        func_name = getattr(func, '__name__', 
+                            getattr(func, '__class__').__name__)
+    except Exception:
+        func_name = str(func)
+    wrapper.__name__ = func_name
+
+    return wrapper
+
+class ParserElement(object):
+    """Abstract base level parser element class."""
+    DEFAULT_WHITE_CHARS = " \n\t\r"
+    verbose_stacktrace = False
+
+    @staticmethod
+    def setDefaultWhitespaceChars( chars ):
+        r"""
+        Overrides the default whitespace chars
+
+        Example::
+            # default whitespace chars are space, <TAB> and newline
+            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def', 'ghi', 'jkl']
+            
+            # change to just treat newline as significant
+            ParserElement.setDefaultWhitespaceChars(" \t")
+            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def']
+        """
+        ParserElement.DEFAULT_WHITE_CHARS = chars
+
+    @staticmethod
+    def inlineLiteralsUsing(cls):
+        """
+        Set class to be used for inclusion of string literals into a parser.
+        
+        Example::
+            # default literal class used is Literal
+            integer = Word(nums)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           
+
+            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']
+
+
+            # change to Suppress
+            ParserElement.inlineLiteralsUsing(Suppress)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           
+
+            date_str.parseString("1999/12/31")  # -> ['1999', '12', '31']
+        """
+        ParserElement._literalStringClass = cls
+
+    def __init__( self, savelist=False ):
+        self.parseAction = list()
+        self.failAction = None
+        #~ self.name = "<unknown>"  # don't define self.name, let subclasses try/except upcall
+        self.strRepr = None
+        self.resultsName = None
+        self.saveAsList = savelist
+        self.skipWhitespace = True
+        self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS
+        self.copyDefaultWhiteChars = True
+        self.mayReturnEmpty = False # used when checking for left-recursion
+        self.keepTabs = False
+        self.ignoreExprs = list()
+        self.debug = False
+        self.streamlined = False
+        self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index
+        self.errmsg = ""
+        self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all)
+        self.debugActions = ( None, None, None ) #custom debug actions
+        self.re = None
+        self.callPreparse = True # used to avoid redundant calls to preParse
+        self.callDuringTry = False
+
+    def copy( self ):
+        """
+        Make a copy of this C{ParserElement}.  Useful for defining different parse actions
+        for the same parsing pattern, using copies of the original parse element.
+        
+        Example::
+            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
+            integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K")
+            integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
+            
+            print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M"))
+        prints::
+            [5120, 100, 655360, 268435456]
+        Equivalent form of C{expr.copy()} is just C{expr()}::
+            integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
+        """
+        cpy = copy.copy( self )
+        cpy.parseAction = self.parseAction[:]
+        cpy.ignoreExprs = self.ignoreExprs[:]
+        if self.copyDefaultWhiteChars:
+            cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS
+        return cpy
+
+    def setName( self, name ):
+        """
+        Define name for this expression, makes debugging and exception messages clearer.
+        
+        Example::
+            Word(nums).parseString("ABC")  # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1)
+            Word(nums).setName("integer").parseString("ABC")  # -> Exception: Expected integer (at char 0), (line:1, col:1)
+        """
+        self.name = name
+        self.errmsg = "Expected " + self.name
+        if hasattr(self,"exception"):
+            self.exception.msg = self.errmsg
+        return self
+
+    def setResultsName( self, name, listAllMatches=False ):
+        """
+        Define name for referencing matching tokens as a nested attribute
+        of the returned parse results.
+        NOTE: this returns a *copy* of the original C{ParserElement} object;
+        this is so that the client can define a basic element, such as an
+        integer, and reference it in multiple places with different names.
+
+        You can also set results names using the abbreviated syntax,
+        C{expr("name")} in place of C{expr.setResultsName("name")} - 
+        see L{I{__call__}<__call__>}.
+
+        Example::
+            date_str = (integer.setResultsName("year") + '/' 
+                        + integer.setResultsName("month") + '/' 
+                        + integer.setResultsName("day"))
+
+            # equivalent form:
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+        """
+        newself = self.copy()
+        if name.endswith("*"):
+            name = name[:-1]
+            listAllMatches=True
+        newself.resultsName = name
+        newself.modalResults = not listAllMatches
+        return newself
+
+    def setBreak(self,breakFlag = True):
+        """Method to invoke the Python pdb debugger when this element is
+           about to be parsed. Set C{breakFlag} to True to enable, False to
+           disable.
+        """
+        if breakFlag:
+            _parseMethod = self._parse
+            def breaker(instring, loc, doActions=True, callPreParse=True):
+                import pdb
+                pdb.set_trace()
+                return _parseMethod( instring, loc, doActions, callPreParse )
+            breaker._originalParseMethod = _parseMethod
+            self._parse = breaker
+        else:
+            if hasattr(self._parse,"_originalParseMethod"):
+                self._parse = self._parse._originalParseMethod
+        return self
+
+    def setParseAction( self, *fns, **kwargs ):
+        """
+        Define action to perform when successfully matching parse element definition.
+        Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)},
+        C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where:
+         - s   = the original string being parsed (see note below)
+         - loc = the location of the matching substring
+         - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object
+        If the functions in fns modify the tokens, they can return them as the return
+        value from fn, and the modified list of tokens will replace the original.
+        Otherwise, fn does not need to return any value.
+
+        Optional keyword arguments:
+         - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing
+
+        Note: the default parsing behavior is to expand tabs in the input string
+        before starting the parsing process.  See L{I{parseString}<parseString>} for more information
+        on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
+        consistent view of the parsed string, the parse location, and line and column
+        positions within the parsed string.
+        
+        Example::
+            integer = Word(nums)
+            date_str = integer + '/' + integer + '/' + integer
+
+            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']
+
+            # use parse action to convert to ints at parse time
+            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
+            date_str = integer + '/' + integer + '/' + integer
+
+            # note that integer fields are now ints, not strings
+            date_str.parseString("1999/12/31")  # -> [1999, '/', 12, '/', 31]
+        """
+        self.parseAction = list(map(_trim_arity, list(fns)))
+        self.callDuringTry = kwargs.get("callDuringTry", False)
+        return self
+
+    def addParseAction( self, *fns, **kwargs ):
+        """
+        Add parse action to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}.
+        
+        See examples in L{I{copy}<copy>}.
+        """
+        self.parseAction += list(map(_trim_arity, list(fns)))
+        self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False)
+        return self
+
+    def addCondition(self, *fns, **kwargs):
+        """Add a boolean predicate function to expression's list of parse actions. See 
+        L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, 
+        functions passed to C{addCondition} need to return boolean success/fail of the condition.
+
+        Optional keyword arguments:
+         - message = define a custom message to be used in the raised exception
+         - fatal   = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException
+         
+        Example::
+            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
+            year_int = integer.copy()
+            year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later")
+            date_str = year_int + '/' + integer + '/' + integer
+
+            result = date_str.parseString("1999/12/31")  # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1)
+        """
+        msg = kwargs.get("message", "failed user-defined condition")
+        exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException
+        for fn in fns:
+            def pa(s,l,t):
+                if not bool(_trim_arity(fn)(s,l,t)):
+                    raise exc_type(s,l,msg)
+            self.parseAction.append(pa)
+        self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False)
+        return self
+
+    def setFailAction( self, fn ):
+        """Define action to perform if parsing fails at this expression.
+           Fail acton fn is a callable function that takes the arguments
+           C{fn(s,loc,expr,err)} where:
+            - s = string being parsed
+            - loc = location where expression match was attempted and failed
+            - expr = the parse expression that failed
+            - err = the exception thrown
+           The function returns no value.  It may throw C{L{ParseFatalException}}
+           if it is desired to stop parsing immediately."""
+        self.failAction = fn
+        return self
+
+    def _skipIgnorables( self, instring, loc ):
+        exprsFound = True
+        while exprsFound:
+            exprsFound = False
+            for e in self.ignoreExprs:
+                try:
+                    while 1:
+                        loc,dummy = e._parse( instring, loc )
+                        exprsFound = True
+                except ParseException:
+                    pass
+        return loc
+
+    def preParse( self, instring, loc ):
+        if self.ignoreExprs:
+            loc = self._skipIgnorables( instring, loc )
+
+        if self.skipWhitespace:
+            wt = self.whiteChars
+            instrlen = len(instring)
+            while loc < instrlen and instring[loc] in wt:
+                loc += 1
+
+        return loc
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        return loc, []
+
+    def postParse( self, instring, loc, tokenlist ):
+        return tokenlist
+
+    #~ @profile
+    def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ):
+        debugging = ( self.debug ) #and doActions )
+
+        if debugging or self.failAction:
+            #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))
+            if (self.debugActions[0] ):
+                self.debugActions[0]( instring, loc, self )
+            if callPreParse and self.callPreparse:
+                preloc = self.preParse( instring, loc )
+            else:
+                preloc = loc
+            tokensStart = preloc
+            try:
+                try:
+                    loc,tokens = self.parseImpl( instring, preloc, doActions )
+                except IndexError:
+                    raise ParseException( instring, len(instring), self.errmsg, self )
+            except ParseBaseException as err:
+                #~ print ("Exception raised:", err)
+                if self.debugActions[2]:
+                    self.debugActions[2]( instring, tokensStart, self, err )
+                if self.failAction:
+                    self.failAction( instring, tokensStart, self, err )
+                raise
+        else:
+            if callPreParse and self.callPreparse:
+                preloc = self.preParse( instring, loc )
+            else:
+                preloc = loc
+            tokensStart = preloc
+            if self.mayIndexError or loc >= len(instring):
+                try:
+                    loc,tokens = self.parseImpl( instring, preloc, doActions )
+                except IndexError:
+                    raise ParseException( instring, len(instring), self.errmsg, self )
+            else:
+                loc,tokens = self.parseImpl( instring, preloc, doActions )
+
+        tokens = self.postParse( instring, loc, tokens )
+
+        retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults )
+        if self.parseAction and (doActions or self.callDuringTry):
+            if debugging:
+                try:
+                    for fn in self.parseAction:
+                        tokens = fn( instring, tokensStart, retTokens )
+                        if tokens is not None:
+                            retTokens = ParseResults( tokens,
+                                                      self.resultsName,
+                                                      asList=self.saveAsList and isinstance(tokens,(ParseResults,list)),
+                                                      modal=self.modalResults )
+                except ParseBaseException as err:
+                    #~ print "Exception raised in user parse action:", err
+                    if (self.debugActions[2] ):
+                        self.debugActions[2]( instring, tokensStart, self, err )
+                    raise
+            else:
+                for fn in self.parseAction:
+                    tokens = fn( instring, tokensStart, retTokens )
+                    if tokens is not None:
+                        retTokens = ParseResults( tokens,
+                                                  self.resultsName,
+                                                  asList=self.saveAsList and isinstance(tokens,(ParseResults,list)),
+                                                  modal=self.modalResults )
+
+        if debugging:
+            #~ print ("Matched",self,"->",retTokens.asList())
+            if (self.debugActions[1] ):
+                self.debugActions[1]( instring, tokensStart, loc, self, retTokens )
+
+        return loc, retTokens
+
+    def tryParse( self, instring, loc ):
+        try:
+            return self._parse( instring, loc, doActions=False )[0]
+        except ParseFatalException:
+            raise ParseException( instring, loc, self.errmsg, self)
+    
+    def canParseNext(self, instring, loc):
+        try:
+            self.tryParse(instring, loc)
+        except (ParseException, IndexError):
+            return False
+        else:
+            return True
+
+    class _UnboundedCache(object):
+        def __init__(self):
+            cache = {}
+            self.not_in_cache = not_in_cache = object()
+
+            def get(self, key):
+                return cache.get(key, not_in_cache)
+
+            def set(self, key, value):
+                cache[key] = value
+
+            def clear(self):
+                cache.clear()
+
+            self.get = types.MethodType(get, self)
+            self.set = types.MethodType(set, self)
+            self.clear = types.MethodType(clear, self)
+
+    if _OrderedDict is not None:
+        class _FifoCache(object):
+            def __init__(self, size):
+                self.not_in_cache = not_in_cache = object()
+
+                cache = _OrderedDict()
+
+                def get(self, key):
+                    return cache.get(key, not_in_cache)
+
+                def set(self, key, value):
+                    cache[key] = value
+                    if len(cache) > size:
+                        cache.popitem(False)
+
+                def clear(self):
+                    cache.clear()
+
+                self.get = types.MethodType(get, self)
+                self.set = types.MethodType(set, self)
+                self.clear = types.MethodType(clear, self)
+
+    else:
+        class _FifoCache(object):
+            def __init__(self, size):
+                self.not_in_cache = not_in_cache = object()
+
+                cache = {}
+                key_fifo = collections.deque([], size)
+
+                def get(self, key):
+                    return cache.get(key, not_in_cache)
+
+                def set(self, key, value):
+                    cache[key] = value
+                    if len(cache) > size:
+                        cache.pop(key_fifo.popleft(), None)
+                    key_fifo.append(key)
+
+                def clear(self):
+                    cache.clear()
+                    key_fifo.clear()
+
+                self.get = types.MethodType(get, self)
+                self.set = types.MethodType(set, self)
+                self.clear = types.MethodType(clear, self)
+
+    # argument cache for optimizing repeated calls when backtracking through recursive expressions
+    packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail
+    packrat_cache_lock = RLock()
+    packrat_cache_stats = [0, 0]
+
+    # this method gets repeatedly called during backtracking with the same arguments -
+    # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression
+    def _parseCache( self, instring, loc, doActions=True, callPreParse=True ):
+        HIT, MISS = 0, 1
+        lookup = (self, instring, loc, callPreParse, doActions)
+        with ParserElement.packrat_cache_lock:
+            cache = ParserElement.packrat_cache
+            value = cache.get(lookup)
+            if value is cache.not_in_cache:
+                ParserElement.packrat_cache_stats[MISS] += 1
+                try:
+                    value = self._parseNoCache(instring, loc, doActions, callPreParse)
+                except ParseBaseException as pe:
+                    # cache a copy of the exception, without the traceback
+                    cache.set(lookup, pe.__class__(*pe.args))
+                    raise
+                else:
+                    cache.set(lookup, (value[0], value[1].copy()))
+                    return value
+            else:
+                ParserElement.packrat_cache_stats[HIT] += 1
+                if isinstance(value, Exception):
+                    raise value
+                return (value[0], value[1].copy())
+
+    _parse = _parseNoCache
+
+    @staticmethod
+    def resetCache():
+        ParserElement.packrat_cache.clear()
+        ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats)
+
+    _packratEnabled = False
+    @staticmethod
+    def enablePackrat(cache_size_limit=128):
+        """Enables "packrat" parsing, which adds memoizing to the parsing logic.
+           Repeated parse attempts at the same string location (which happens
+           often in many complex grammars) can immediately return a cached value,
+           instead of re-executing parsing/validating code.  Memoizing is done of
+           both valid results and parsing exceptions.
+           
+           Parameters:
+            - cache_size_limit - (default=C{128}) - if an integer value is provided
+              will limit the size of the packrat cache; if None is passed, then
+              the cache size will be unbounded; if 0 is passed, the cache will
+              be effectively disabled.
+            
+           This speedup may break existing programs that use parse actions that
+           have side-effects.  For this reason, packrat parsing is disabled when
+           you first import pyparsing.  To activate the packrat feature, your
+           program must call the class method C{ParserElement.enablePackrat()}.  If
+           your program uses C{psyco} to "compile as you go", you must call
+           C{enablePackrat} before calling C{psyco.full()}.  If you do not do this,
+           Python will crash.  For best results, call C{enablePackrat()} immediately
+           after importing pyparsing.
+           
+           Example::
+               import pyparsing
+               pyparsing.ParserElement.enablePackrat()
+        """
+        if not ParserElement._packratEnabled:
+            ParserElement._packratEnabled = True
+            if cache_size_limit is None:
+                ParserElement.packrat_cache = ParserElement._UnboundedCache()
+            else:
+                ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit)
+            ParserElement._parse = ParserElement._parseCache
+
+    def parseString( self, instring, parseAll=False ):
+        """
+        Execute the parse expression with the given string.
+        This is the main interface to the client code, once the complete
+        expression has been built.
+
+        If you want the grammar to require that the entire input string be
+        successfully parsed, then set C{parseAll} to True (equivalent to ending
+        the grammar with C{L{StringEnd()}}).
+
+        Note: C{parseString} implicitly calls C{expandtabs()} on the input string,
+        in order to report proper column numbers in parse actions.
+        If the input string contains tabs and
+        the grammar uses parse actions that use the C{loc} argument to index into the
+        string being parsed, you can ensure you have a consistent view of the input
+        string by:
+         - calling C{parseWithTabs} on your grammar before calling C{parseString}
+           (see L{I{parseWithTabs}<parseWithTabs>})
+         - define your parse action using the full C{(s,loc,toks)} signature, and
+           reference the input string using the parse action's C{s} argument
+         - explictly expand the tabs in your input string before calling
+           C{parseString}
+        
+        Example::
+            Word('a').parseString('aaaaabaaa')  # -> ['aaaaa']
+            Word('a').parseString('aaaaabaaa', parseAll=True)  # -> Exception: Expected end of text
+        """
+        ParserElement.resetCache()
+        if not self.streamlined:
+            self.streamline()
+            #~ self.saveAsList = True
+        for e in self.ignoreExprs:
+            e.streamline()
+        if not self.keepTabs:
+            instring = instring.expandtabs()
+        try:
+            loc, tokens = self._parse( instring, 0 )
+            if parseAll:
+                loc = self.preParse( instring, loc )
+                se = Empty() + StringEnd()
+                se._parse( instring, loc )
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+        else:
+            return tokens
+
+    def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ):
+        """
+        Scan the input string for expression matches.  Each match will return the
+        matching tokens, start location, and end location.  May be called with optional
+        C{maxMatches} argument, to clip scanning after 'n' matches are found.  If
+        C{overlap} is specified, then overlapping matches will be reported.
+
+        Note that the start and end locations are reported relative to the string
+        being parsed.  See L{I{parseString}<parseString>} for more information on parsing
+        strings with embedded tabs.
+
+        Example::
+            source = "sldjf123lsdjjkf345sldkjf879lkjsfd987"
+            print(source)
+            for tokens,start,end in Word(alphas).scanString(source):
+                print(' '*start + '^'*(end-start))
+                print(' '*start + tokens[0])
+        
+        prints::
+        
+            sldjf123lsdjjkf345sldkjf879lkjsfd987
+            ^^^^^
+            sldjf
+                    ^^^^^^^
+                    lsdjjkf
+                              ^^^^^^
+                              sldkjf
+                                       ^^^^^^
+                                       lkjsfd
+        """
+        if not self.streamlined:
+            self.streamline()
+        for e in self.ignoreExprs:
+            e.streamline()
+
+        if not self.keepTabs:
+            instring = _ustr(instring).expandtabs()
+        instrlen = len(instring)
+        loc = 0
+        preparseFn = self.preParse
+        parseFn = self._parse
+        ParserElement.resetCache()
+        matches = 0
+        try:
+            while loc <= instrlen and matches < maxMatches:
+                try:
+                    preloc = preparseFn( instring, loc )
+                    nextLoc,tokens = parseFn( instring, preloc, callPreParse=False )
+                except ParseException:
+                    loc = preloc+1
+                else:
+                    if nextLoc > loc:
+                        matches += 1
+                        yield tokens, preloc, nextLoc
+                        if overlap:
+                            nextloc = preparseFn( instring, loc )
+                            if nextloc > loc:
+                                loc = nextLoc
+                            else:
+                                loc += 1
+                        else:
+                            loc = nextLoc
+                    else:
+                        loc = preloc+1
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+
+    def transformString( self, instring ):
+        """
+        Extension to C{L{scanString}}, to modify matching text with modified tokens that may
+        be returned from a parse action.  To use C{transformString}, define a grammar and
+        attach a parse action to it that modifies the returned token list.
+        Invoking C{transformString()} on a target string will then scan for matches,
+        and replace the matched text patterns according to the logic in the parse
+        action.  C{transformString()} returns the resulting transformed string.
+        
+        Example::
+            wd = Word(alphas)
+            wd.setParseAction(lambda toks: toks[0].title())
+            
+            print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york."))
+        Prints::
+            Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York.
+        """
+        out = []
+        lastE = 0
+        # force preservation of <TAB>s, to minimize unwanted transformation of string, and to
+        # keep string locs straight between transformString and scanString
+        self.keepTabs = True
+        try:
+            for t,s,e in self.scanString( instring ):
+                out.append( instring[lastE:s] )
+                if t:
+                    if isinstance(t,ParseResults):
+                        out += t.asList()
+                    elif isinstance(t,list):
+                        out += t
+                    else:
+                        out.append(t)
+                lastE = e
+            out.append(instring[lastE:])
+            out = [o for o in out if o]
+            return "".join(map(_ustr,_flatten(out)))
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+
+    def searchString( self, instring, maxMatches=_MAX_INT ):
+        """
+        Another extension to C{L{scanString}}, simplifying the access to the tokens found
+        to match the given parse expression.  May be called with optional
+        C{maxMatches} argument, to clip searching after 'n' matches are found.
+        
+        Example::
+            # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters
+            cap_word = Word(alphas.upper(), alphas.lower())
+            
+            print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))
+        prints::
+            ['More', 'Iron', 'Lead', 'Gold', 'I']
+        """
+        try:
+            return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ])
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+
+    def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False):
+        """
+        Generator method to split a string using the given expression as a separator.
+        May be called with optional C{maxsplit} argument, to limit the number of splits;
+        and the optional C{includeSeparators} argument (default=C{False}), if the separating
+        matching text should be included in the split results.
+        
+        Example::        
+            punc = oneOf(list(".,;:/-!?"))
+            print(list(punc.split("This, this?, this sentence, is badly punctuated!")))
+        prints::
+            ['This', ' this', '', ' this sentence', ' is badly punctuated', '']
+        """
+        splits = 0
+        last = 0
+        for t,s,e in self.scanString(instring, maxMatches=maxsplit):
+            yield instring[last:s]
+            if includeSeparators:
+                yield t[0]
+            last = e
+        yield instring[last:]
+
+    def __add__(self, other ):
+        """
+        Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement
+        converts them to L{Literal}s by default.
+        
+        Example::
+            greet = Word(alphas) + "," + Word(alphas) + "!"
+            hello = "Hello, World!"
+            print (hello, "->", greet.parseString(hello))
+        Prints::
+            Hello, World! -> ['Hello', ',', 'World', '!']
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return And( [ self, other ] )
+
+    def __radd__(self, other ):
+        """
+        Implementation of + operator when left operand is not a C{L{ParserElement}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other + self
+
+    def __sub__(self, other):
+        """
+        Implementation of - operator, returns C{L{And}} with error stop
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return And( [ self, And._ErrorStop(), other ] )
+
+    def __rsub__(self, other ):
+        """
+        Implementation of - operator when left operand is not a C{L{ParserElement}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other - self
+
+    def __mul__(self,other):
+        """
+        Implementation of * operator, allows use of C{expr * 3} in place of
+        C{expr + expr + expr}.  Expressions may also me multiplied by a 2-integer
+        tuple, similar to C{{min,max}} multipliers in regular expressions.  Tuples
+        may also include C{None} as in:
+         - C{expr*(n,None)} or C{expr*(n,)} is equivalent
+              to C{expr*n + L{ZeroOrMore}(expr)}
+              (read as "at least n instances of C{expr}")
+         - C{expr*(None,n)} is equivalent to C{expr*(0,n)}
+              (read as "0 to n instances of C{expr}")
+         - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)}
+         - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)}
+
+        Note that C{expr*(None,n)} does not raise an exception if
+        more than n exprs exist in the input stream; that is,
+        C{expr*(None,n)} does not enforce a maximum number of expr
+        occurrences.  If this behavior is desired, then write
+        C{expr*(None,n) + ~expr}
+        """
+        if isinstance(other,int):
+            minElements, optElements = other,0
+        elif isinstance(other,tuple):
+            other = (other + (None, None))[:2]
+            if other[0] is None:
+                other = (0, other[1])
+            if isinstance(other[0],int) and other[1] is None:
+                if other[0] == 0:
+                    return ZeroOrMore(self)
+                if other[0] == 1:
+                    return OneOrMore(self)
+                else:
+                    return self*other[0] + ZeroOrMore(self)
+            elif isinstance(other[0],int) and isinstance(other[1],int):
+                minElements, optElements = other
+                optElements -= minElements
+            else:
+                raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1]))
+        else:
+            raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other))
+
+        if minElements < 0:
+            raise ValueError("cannot multiply ParserElement by negative value")
+        if optElements < 0:
+            raise ValueError("second tuple value must be greater or equal to first tuple value")
+        if minElements == optElements == 0:
+            raise ValueError("cannot multiply ParserElement by 0 or (0,0)")
+
+        if (optElements):
+            def makeOptionalList(n):
+                if n>1:
+                    return Optional(self + makeOptionalList(n-1))
+                else:
+                    return Optional(self)
+            if minElements:
+                if minElements == 1:
+                    ret = self + makeOptionalList(optElements)
+                else:
+                    ret = And([self]*minElements) + makeOptionalList(optElements)
+            else:
+                ret = makeOptionalList(optElements)
+        else:
+            if minElements == 1:
+                ret = self
+            else:
+                ret = And([self]*minElements)
+        return ret
+
+    def __rmul__(self, other):
+        return self.__mul__(other)
+
+    def __or__(self, other ):
+        """
+        Implementation of | operator - returns C{L{MatchFirst}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return MatchFirst( [ self, other ] )
+
+    def __ror__(self, other ):
+        """
+        Implementation of | operator when left operand is not a C{L{ParserElement}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other | self
+
+    def __xor__(self, other ):
+        """
+        Implementation of ^ operator - returns C{L{Or}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return Or( [ self, other ] )
+
+    def __rxor__(self, other ):
+        """
+        Implementation of ^ operator when left operand is not a C{L{ParserElement}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other ^ self
+
+    def __and__(self, other ):
+        """
+        Implementation of & operator - returns C{L{Each}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return Each( [ self, other ] )
+
+    def __rand__(self, other ):
+        """
+        Implementation of & operator when left operand is not a C{L{ParserElement}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other & self
+
+    def __invert__( self ):
+        """
+        Implementation of ~ operator - returns C{L{NotAny}}
+        """
+        return NotAny( self )
+
+    def __call__(self, name=None):
+        """
+        Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}.
+        
+        If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be
+        passed as C{True}.
+           
+        If C{name} is omitted, same as calling C{L{copy}}.
+
+        Example::
+            # these are equivalent
+            userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno")
+            userdata = Word(alphas)("name") + Word(nums+"-")("socsecno")             
+        """
+        if name is not None:
+            return self.setResultsName(name)
+        else:
+            return self.copy()
+
+    def suppress( self ):
+        """
+        Suppresses the output of this C{ParserElement}; useful to keep punctuation from
+        cluttering up returned output.
+        """
+        return Suppress( self )
+
+    def leaveWhitespace( self ):
+        """
+        Disables the skipping of whitespace before matching the characters in the
+        C{ParserElement}'s defined pattern.  This is normally only used internally by
+        the pyparsing module, but may be needed in some whitespace-sensitive grammars.
+        """
+        self.skipWhitespace = False
+        return self
+
+    def setWhitespaceChars( self, chars ):
+        """
+        Overrides the default whitespace chars
+        """
+        self.skipWhitespace = True
+        self.whiteChars = chars
+        self.copyDefaultWhiteChars = False
+        return self
+
+    def parseWithTabs( self ):
+        """
+        Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string.
+        Must be called before C{parseString} when the input grammar contains elements that
+        match C{<TAB>} characters.
+        """
+        self.keepTabs = True
+        return self
+
+    def ignore( self, other ):
+        """
+        Define expression to be ignored (e.g., comments) while doing pattern
+        matching; may be called repeatedly, to define multiple comment or other
+        ignorable patterns.
+        
+        Example::
+            patt = OneOrMore(Word(alphas))
+            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj']
+            
+            patt.ignore(cStyleComment)
+            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd']
+        """
+        if isinstance(other, basestring):
+            other = Suppress(other)
+
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                self.ignoreExprs.append(other)
+        else:
+            self.ignoreExprs.append( Suppress( other.copy() ) )
+        return self
+
+    def setDebugActions( self, startAction, successAction, exceptionAction ):
+        """
+        Enable display of debugging messages while doing pattern matching.
+        """
+        self.debugActions = (startAction or _defaultStartDebugAction,
+                             successAction or _defaultSuccessDebugAction,
+                             exceptionAction or _defaultExceptionDebugAction)
+        self.debug = True
+        return self
+
+    def setDebug( self, flag=True ):
+        """
+        Enable display of debugging messages while doing pattern matching.
+        Set C{flag} to True to enable, False to disable.
+
+        Example::
+            wd = Word(alphas).setName("alphaword")
+            integer = Word(nums).setName("numword")
+            term = wd | integer
+            
+            # turn on debugging for wd
+            wd.setDebug()
+
+            OneOrMore(term).parseString("abc 123 xyz 890")
+        
+        prints::
+            Match alphaword at loc 0(1,1)
+            Matched alphaword -> ['abc']
+            Match alphaword at loc 3(1,4)
+            Exception raised:Expected alphaword (at char 4), (line:1, col:5)
+            Match alphaword at loc 7(1,8)
+            Matched alphaword -> ['xyz']
+            Match alphaword at loc 11(1,12)
+            Exception raised:Expected alphaword (at char 12), (line:1, col:13)
+            Match alphaword at loc 15(1,16)
+            Exception raised:Expected alphaword (at char 15), (line:1, col:16)
+
+        The output shown is that produced by the default debug actions - custom debug actions can be
+        specified using L{setDebugActions}. Prior to attempting
+        to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"}
+        is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"}
+        message is shown. Also note the use of L{setName} to assign a human-readable name to the expression,
+        which makes debugging and exception messages easier to understand - for instance, the default
+        name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}.
+        """
+        if flag:
+            self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction )
+        else:
+            self.debug = False
+        return self
+
+    def __str__( self ):
+        return self.name
+
+    def __repr__( self ):
+        return _ustr(self)
+
+    def streamline( self ):
+        self.streamlined = True
+        self.strRepr = None
+        return self
+
+    def checkRecursion( self, parseElementList ):
+        pass
+
+    def validate( self, validateTrace=[] ):
+        """
+        Check defined expressions for valid structure, check for infinite recursive definitions.
+        """
+        self.checkRecursion( [] )
+
+    def parseFile( self, file_or_filename, parseAll=False ):
+        """
+        Execute the parse expression on the given file or filename.
+        If a filename is specified (instead of a file object),
+        the entire file is opened, read, and closed before parsing.
+        """
+        try:
+            file_contents = file_or_filename.read()
+        except AttributeError:
+            with open(file_or_filename, "r") as f:
+                file_contents = f.read()
+        try:
+            return self.parseString(file_contents, parseAll)
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+
+    def __eq__(self,other):
+        if isinstance(other, ParserElement):
+            return self is other or vars(self) == vars(other)
+        elif isinstance(other, basestring):
+            return self.matches(other)
+        else:
+            return super(ParserElement,self)==other
+
+    def __ne__(self,other):
+        return not (self == other)
+
+    def __hash__(self):
+        return hash(id(self))
+
+    def __req__(self,other):
+        return self == other
+
+    def __rne__(self,other):
+        return not (self == other)
+
+    def matches(self, testString, parseAll=True):
+        """
+        Method for quick testing of a parser against a test string. Good for simple 
+        inline microtests of sub expressions while building up larger parser.
+           
+        Parameters:
+         - testString - to test against this expression for a match
+         - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests
+            
+        Example::
+            expr = Word(nums)
+            assert expr.matches("100")
+        """
+        try:
+            self.parseString(_ustr(testString), parseAll=parseAll)
+            return True
+        except ParseBaseException:
+            return False
+                
+    def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False):
+        """
+        Execute the parse expression on a series of test strings, showing each
+        test, the parsed results or where the parse failed. Quick and easy way to
+        run a parse expression against a list of sample strings.
+           
+        Parameters:
+         - tests - a list of separate test strings, or a multiline string of test strings
+         - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests           
+         - comment - (default=C{'#'}) - expression for indicating embedded comments in the test 
+              string; pass None to disable comment filtering
+         - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline;
+              if False, only dump nested list
+         - printResults - (default=C{True}) prints test output to stdout
+         - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing
+
+        Returns: a (success, results) tuple, where success indicates that all tests succeeded
+        (or failed if C{failureTests} is True), and the results contain a list of lines of each 
+        test's output
+        
+        Example::
+            number_expr = pyparsing_common.number.copy()
+
+            result = number_expr.runTests('''
+                # unsigned integer
+                100
+                # negative integer
+                -100
+                # float with scientific notation
+                6.02e23
+                # integer with scientific notation
+                1e-12
+                ''')
+            print("Success" if result[0] else "Failed!")
+
+            result = number_expr.runTests('''
+                # stray character
+                100Z
+                # missing leading digit before '.'
+                -.100
+                # too many '.'
+                3.14.159
+                ''', failureTests=True)
+            print("Success" if result[0] else "Failed!")
+        prints::
+            # unsigned integer
+            100
+            [100]
+
+            # negative integer
+            -100
+            [-100]
+
+            # float with scientific notation
+            6.02e23
+            [6.02e+23]
+
+            # integer with scientific notation
+            1e-12
+            [1e-12]
+
+            Success
+            
+            # stray character
+            100Z
+               ^
+            FAIL: Expected end of text (at char 3), (line:1, col:4)
+
+            # missing leading digit before '.'
+            -.100
+            ^
+            FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1)
+
+            # too many '.'
+            3.14.159
+                ^
+            FAIL: Expected end of text (at char 4), (line:1, col:5)
+
+            Success
+
+        Each test string must be on a single line. If you want to test a string that spans multiple
+        lines, create a test like this::
+
+            expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines")
+        
+        (Note that this is a raw string literal, you must include the leading 'r'.)
+        """
+        if isinstance(tests, basestring):
+            tests = list(map(str.strip, tests.rstrip().splitlines()))
+        if isinstance(comment, basestring):
+            comment = Literal(comment)
+        allResults = []
+        comments = []
+        success = True
+        for t in tests:
+            if comment is not None and comment.matches(t, False) or comments and not t:
+                comments.append(t)
+                continue
+            if not t:
+                continue
+            out = ['\n'.join(comments), t]
+            comments = []
+            try:
+                t = t.replace(r'\n','\n')
+                result = self.parseString(t, parseAll=parseAll)
+                out.append(result.dump(full=fullDump))
+                success = success and not failureTests
+            except ParseBaseException as pe:
+                fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else ""
+                if '\n' in t:
+                    out.append(line(pe.loc, t))
+                    out.append(' '*(col(pe.loc,t)-1) + '^' + fatal)
+                else:
+                    out.append(' '*pe.loc + '^' + fatal)
+                out.append("FAIL: " + str(pe))
+                success = success and failureTests
+                result = pe
+            except Exception as exc:
+                out.append("FAIL-EXCEPTION: " + str(exc))
+                success = success and failureTests
+                result = exc
+
+            if printResults:
+                if fullDump:
+                    out.append('')
+                print('\n'.join(out))
+
+            allResults.append((t, result))
+        
+        return success, allResults
+
+        
+class Token(ParserElement):
+    """
+    Abstract C{ParserElement} subclass, for defining atomic matching patterns.
+    """
+    def __init__( self ):
+        super(Token,self).__init__( savelist=False )
+
+
+class Empty(Token):
+    """
+    An empty token, will always match.
+    """
+    def __init__( self ):
+        super(Empty,self).__init__()
+        self.name = "Empty"
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+
+
+class NoMatch(Token):
+    """
+    A token that will never match.
+    """
+    def __init__( self ):
+        super(NoMatch,self).__init__()
+        self.name = "NoMatch"
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+        self.errmsg = "Unmatchable token"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        raise ParseException(instring, loc, self.errmsg, self)
+
+
+class Literal(Token):
+    """
+    Token to exactly match a specified string.
+    
+    Example::
+        Literal('blah').parseString('blah')  # -> ['blah']
+        Literal('blah').parseString('blahfooblah')  # -> ['blah']
+        Literal('blah').parseString('bla')  # -> Exception: Expected "blah"
+    
+    For case-insensitive matching, use L{CaselessLiteral}.
+    
+    For keyword matching (force word break before and after the matched string),
+    use L{Keyword} or L{CaselessKeyword}.
+    """
+    def __init__( self, matchString ):
+        super(Literal,self).__init__()
+        self.match = matchString
+        self.matchLen = len(matchString)
+        try:
+            self.firstMatchChar = matchString[0]
+        except IndexError:
+            warnings.warn("null string passed to Literal; use Empty() instead",
+                            SyntaxWarning, stacklevel=2)
+            self.__class__ = Empty
+        self.name = '"%s"' % _ustr(self.match)
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = False
+        self.mayIndexError = False
+
+    # Performance tuning: this routine gets called a *lot*
+    # if this is a single character match string  and the first character matches,
+    # short-circuit as quickly as possible, and avoid calling startswith
+    #~ @profile
+    def parseImpl( self, instring, loc, doActions=True ):
+        if (instring[loc] == self.firstMatchChar and
+            (self.matchLen==1 or instring.startswith(self.match,loc)) ):
+            return loc+self.matchLen, self.match
+        raise ParseException(instring, loc, self.errmsg, self)
+_L = Literal
+ParserElement._literalStringClass = Literal
+
+class Keyword(Token):
+    """
+    Token to exactly match a specified string as a keyword, that is, it must be
+    immediately followed by a non-keyword character.  Compare with C{L{Literal}}:
+     - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}.
+     - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'}
+    Accepts two optional constructor arguments in addition to the keyword string:
+     - C{identChars} is a string of characters that would be valid identifier characters,
+          defaulting to all alphanumerics + "_" and "$"
+     - C{caseless} allows case-insensitive matching, default is C{False}.
+       
+    Example::
+        Keyword("start").parseString("start")  # -> ['start']
+        Keyword("start").parseString("starting")  # -> Exception
+
+    For case-insensitive matching, use L{CaselessKeyword}.
+    """
+    DEFAULT_KEYWORD_CHARS = alphanums+"_$"
+
+    def __init__( self, matchString, identChars=None, caseless=False ):
+        super(Keyword,self).__init__()
+        if identChars is None:
+            identChars = Keyword.DEFAULT_KEYWORD_CHARS
+        self.match = matchString
+        self.matchLen = len(matchString)
+        try:
+            self.firstMatchChar = matchString[0]
+        except IndexError:
+            warnings.warn("null string passed to Keyword; use Empty() instead",
+                            SyntaxWarning, stacklevel=2)
+        self.name = '"%s"' % self.match
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = False
+        self.mayIndexError = False
+        self.caseless = caseless
+        if caseless:
+            self.caselessmatch = matchString.upper()
+            identChars = identChars.upper()
+        self.identChars = set(identChars)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.caseless:
+            if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and
+                 (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and
+                 (loc == 0 or instring[loc-1].upper() not in self.identChars) ):
+                return loc+self.matchLen, self.match
+        else:
+            if (instring[loc] == self.firstMatchChar and
+                (self.matchLen==1 or instring.startswith(self.match,loc)) and
+                (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and
+                (loc == 0 or instring[loc-1] not in self.identChars) ):
+                return loc+self.matchLen, self.match
+        raise ParseException(instring, loc, self.errmsg, self)
+
+    def copy(self):
+        c = super(Keyword,self).copy()
+        c.identChars = Keyword.DEFAULT_KEYWORD_CHARS
+        return c
+
+    @staticmethod
+    def setDefaultKeywordChars( chars ):
+        """Overrides the default Keyword chars
+        """
+        Keyword.DEFAULT_KEYWORD_CHARS = chars
+
+class CaselessLiteral(Literal):
+    """
+    Token to match a specified string, ignoring case of letters.
+    Note: the matched results will always be in the case of the given
+    match string, NOT the case of the input text.
+
+    Example::
+        OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD']
+        
+    (Contrast with example for L{CaselessKeyword}.)
+    """
+    def __init__( self, matchString ):
+        super(CaselessLiteral,self).__init__( matchString.upper() )
+        # Preserve the defining literal.
+        self.returnString = matchString
+        self.name = "'%s'" % self.returnString
+        self.errmsg = "Expected " + self.name
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if instring[ loc:loc+self.matchLen ].upper() == self.match:
+            return loc+self.matchLen, self.returnString
+        raise ParseException(instring, loc, self.errmsg, self)
+
+class CaselessKeyword(Keyword):
+    """
+    Caseless version of L{Keyword}.
+
+    Example::
+        OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD']
+        
+    (Contrast with example for L{CaselessLiteral}.)
+    """
+    def __init__( self, matchString, identChars=None ):
+        super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True )
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and
+             (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ):
+            return loc+self.matchLen, self.match
+        raise ParseException(instring, loc, self.errmsg, self)
+
+class CloseMatch(Token):
+    """
+    A variation on L{Literal} which matches "close" matches, that is, 
+    strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters:
+     - C{match_string} - string to be matched
+     - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match
+    
+    The results from a successful parse will contain the matched text from the input string and the following named results:
+     - C{mismatches} - a list of the positions within the match_string where mismatches were found
+     - C{original} - the original match_string used to compare against the input string
+    
+    If C{mismatches} is an empty list, then the match was an exact match.
+    
+    Example::
+        patt = CloseMatch("ATCATCGAATGGA")
+        patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']})
+        patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1)
+
+        # exact match
+        patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']})
+
+        # close match allowing up to 2 mismatches
+        patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2)
+        patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']})
+    """
+    def __init__(self, match_string, maxMismatches=1):
+        super(CloseMatch,self).__init__()
+        self.name = match_string
+        self.match_string = match_string
+        self.maxMismatches = maxMismatches
+        self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches)
+        self.mayIndexError = False
+        self.mayReturnEmpty = False
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        start = loc
+        instrlen = len(instring)
+        maxloc = start + len(self.match_string)
+
+        if maxloc <= instrlen:
+            match_string = self.match_string
+            match_stringloc = 0
+            mismatches = []
+            maxMismatches = self.maxMismatches
+
+            for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)):
+                src,mat = s_m
+                if src != mat:
+                    mismatches.append(match_stringloc)
+                    if len(mismatches) > maxMismatches:
+                        break
+            else:
+                loc = match_stringloc + 1
+                results = ParseResults([instring[start:loc]])
+                results['original'] = self.match_string
+                results['mismatches'] = mismatches
+                return loc, results
+
+        raise ParseException(instring, loc, self.errmsg, self)
+
+
+class Word(Token):
+    """
+    Token for matching words composed of allowed character sets.
+    Defined with string containing all allowed initial characters,
+    an optional string containing allowed body characters (if omitted,
+    defaults to the initial character set), and an optional minimum,
+    maximum, and/or exact length.  The default value for C{min} is 1 (a
+    minimum value < 1 is not valid); the default values for C{max} and C{exact}
+    are 0, meaning no maximum or exact length restriction. An optional
+    C{excludeChars} parameter can list characters that might be found in 
+    the input C{bodyChars} string; useful to define a word of all printables
+    except for one or two characters, for instance.
+    
+    L{srange} is useful for defining custom character set strings for defining 
+    C{Word} expressions, using range notation from regular expression character sets.
+    
+    A common mistake is to use C{Word} to match a specific literal string, as in 
+    C{Word("Address")}. Remember that C{Word} uses the string argument to define
+    I{sets} of matchable characters. This expression would match "Add", "AAA",
+    "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'.
+    To match an exact literal string, use L{Literal} or L{Keyword}.
+
+    pyparsing includes helper strings for building Words:
+     - L{alphas}
+     - L{nums}
+     - L{alphanums}
+     - L{hexnums}
+     - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.)
+     - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.)
+     - L{printables} (any non-whitespace character)
+
+    Example::
+        # a word composed of digits
+        integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9"))
+        
+        # a word with a leading capital, and zero or more lowercase
+        capital_word = Word(alphas.upper(), alphas.lower())
+
+        # hostnames are alphanumeric, with leading alpha, and '-'
+        hostname = Word(alphas, alphanums+'-')
+        
+        # roman numeral (not a strict parser, accepts invalid mix of characters)
+        roman = Word("IVXLCDM")
+        
+        # any string of non-whitespace characters, except for ','
+        csv_value = Word(printables, excludeChars=",")
+    """
+    def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ):
+        super(Word,self).__init__()
+        if excludeChars:
+            initChars = ''.join(c for c in initChars if c not in excludeChars)
+            if bodyChars:
+                bodyChars = ''.join(c for c in bodyChars if c not in excludeChars)
+        self.initCharsOrig = initChars
+        self.initChars = set(initChars)
+        if bodyChars :
+            self.bodyCharsOrig = bodyChars
+            self.bodyChars = set(bodyChars)
+        else:
+            self.bodyCharsOrig = initChars
+            self.bodyChars = set(initChars)
+
+        self.maxSpecified = max > 0
+
+        if min < 1:
+            raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted")
+
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = _MAX_INT
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayIndexError = False
+        self.asKeyword = asKeyword
+
+        if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0):
+            if self.bodyCharsOrig == self.initCharsOrig:
+                self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig)
+            elif len(self.initCharsOrig) == 1:
+                self.reString = "%s[%s]*" % \
+                                      (re.escape(self.initCharsOrig),
+                                      _escapeRegexRangeChars(self.bodyCharsOrig),)
+            else:
+                self.reString = "[%s][%s]*" % \
+                                      (_escapeRegexRangeChars(self.initCharsOrig),
+                                      _escapeRegexRangeChars(self.bodyCharsOrig),)
+            if self.asKeyword:
+                self.reString = r"\b"+self.reString+r"\b"
+            try:
+                self.re = re.compile( self.reString )
+            except Exception:
+                self.re = None
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.re:
+            result = self.re.match(instring,loc)
+            if not result:
+                raise ParseException(instring, loc, self.errmsg, self)
+
+            loc = result.end()
+            return loc, result.group()
+
+        if not(instring[ loc ] in self.initChars):
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        start = loc
+        loc += 1
+        instrlen = len(instring)
+        bodychars = self.bodyChars
+        maxloc = start + self.maxLen
+        maxloc = min( maxloc, instrlen )
+        while loc < maxloc and instring[loc] in bodychars:
+            loc += 1
+
+        throwException = False
+        if loc - start < self.minLen:
+            throwException = True
+        if self.maxSpecified and loc < instrlen and instring[loc] in bodychars:
+            throwException = True
+        if self.asKeyword:
+            if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars):
+                throwException = True
+
+        if throwException:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        return loc, instring[start:loc]
+
+    def __str__( self ):
+        try:
+            return super(Word,self).__str__()
+        except Exception:
+            pass
+
+
+        if self.strRepr is None:
+
+            def charsAsStr(s):
+                if len(s)>4:
+                    return s[:4]+"..."
+                else:
+                    return s
+
+            if ( self.initCharsOrig != self.bodyCharsOrig ):
+                self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) )
+            else:
+                self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig)
+
+        return self.strRepr
+
+
+class Regex(Token):
+    """
+    Token for matching strings that match a given regular expression.
+    Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module.
+    If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as 
+    named parse results.
+
+    Example::
+        realnum = Regex(r"[+-]?\d+\.\d*")
+        date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)')
+        # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression
+        roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})")
+    """
+    compiledREtype = type(re.compile("[A-Z]"))
+    def __init__( self, pattern, flags=0):
+        """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags."""
+        super(Regex,self).__init__()
+
+        if isinstance(pattern, basestring):
+            if not pattern:
+                warnings.warn("null string passed to Regex; use Empty() instead",
+                        SyntaxWarning, stacklevel=2)
+
+            self.pattern = pattern
+            self.flags = flags
+
+            try:
+                self.re = re.compile(self.pattern, self.flags)
+                self.reString = self.pattern
+            except sre_constants.error:
+                warnings.warn("invalid pattern (%s) passed to Regex" % pattern,
+                    SyntaxWarning, stacklevel=2)
+                raise
+
+        elif isinstance(pattern, Regex.compiledREtype):
+            self.re = pattern
+            self.pattern = \
+            self.reString = str(pattern)
+            self.flags = flags
+            
+        else:
+            raise ValueError("Regex may only be constructed with a string or a compiled RE object")
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayIndexError = False
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        result = self.re.match(instring,loc)
+        if not result:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        loc = result.end()
+        d = result.groupdict()
+        ret = ParseResults(result.group())
+        if d:
+            for k in d:
+                ret[k] = d[k]
+        return loc,ret
+
+    def __str__( self ):
+        try:
+            return super(Regex,self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None:
+            self.strRepr = "Re:(%s)" % repr(self.pattern)
+
+        return self.strRepr
+
+
+class QuotedString(Token):
+    r"""
+    Token for matching strings that are delimited by quoting characters.
+    
+    Defined with the following parameters:
+        - quoteChar - string of one or more characters defining the quote delimiting string
+        - escChar - character to escape quotes, typically backslash (default=C{None})
+        - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None})
+        - multiline - boolean indicating whether quotes can span multiple lines (default=C{False})
+        - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True})
+        - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar)
+        - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True})
+
+    Example::
+        qs = QuotedString('"')
+        print(qs.searchString('lsjdf "This is the quote" sldjf'))
+        complex_qs = QuotedString('{{', endQuoteChar='}}')
+        print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf'))
+        sql_qs = QuotedString('"', escQuote='""')
+        print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf'))
+    prints::
+        [['This is the quote']]
+        [['This is the "quote"']]
+        [['This is the quote with "embedded" quotes']]
+    """
+    def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True):
+        super(QuotedString,self).__init__()
+
+        # remove white space from quote chars - wont work anyway
+        quoteChar = quoteChar.strip()
+        if not quoteChar:
+            warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2)
+            raise SyntaxError()
+
+        if endQuoteChar is None:
+            endQuoteChar = quoteChar
+        else:
+            endQuoteChar = endQuoteChar.strip()
+            if not endQuoteChar:
+                warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2)
+                raise SyntaxError()
+
+        self.quoteChar = quoteChar
+        self.quoteCharLen = len(quoteChar)
+        self.firstQuoteChar = quoteChar[0]
+        self.endQuoteChar = endQuoteChar
+        self.endQuoteCharLen = len(endQuoteChar)
+        self.escChar = escChar
+        self.escQuote = escQuote
+        self.unquoteResults = unquoteResults
+        self.convertWhitespaceEscapes = convertWhitespaceEscapes
+
+        if multiline:
+            self.flags = re.MULTILINE | re.DOTALL
+            self.pattern = r'%s(?:[^%s%s]' % \
+                ( re.escape(self.quoteChar),
+                  _escapeRegexRangeChars(self.endQuoteChar[0]),
+                  (escChar is not None and _escapeRegexRangeChars(escChar) or '') )
+        else:
+            self.flags = 0
+            self.pattern = r'%s(?:[^%s\n\r%s]' % \
+                ( re.escape(self.quoteChar),
+                  _escapeRegexRangeChars(self.endQuoteChar[0]),
+                  (escChar is not None and _escapeRegexRangeChars(escChar) or '') )
+        if len(self.endQuoteChar) > 1:
+            self.pattern += (
+                '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]),
+                                               _escapeRegexRangeChars(self.endQuoteChar[i]))
+                                    for i in range(len(self.endQuoteChar)-1,0,-1)) + ')'
+                )
+        if escQuote:
+            self.pattern += (r'|(?:%s)' % re.escape(escQuote))
+        if escChar:
+            self.pattern += (r'|(?:%s.)' % re.escape(escChar))
+            self.escCharReplacePattern = re.escape(self.escChar)+"(.)"
+        self.pattern += (r')*%s' % re.escape(self.endQuoteChar))
+
+        try:
+            self.re = re.compile(self.pattern, self.flags)
+            self.reString = self.pattern
+        except sre_constants.error:
+            warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern,
+                SyntaxWarning, stacklevel=2)
+            raise
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayIndexError = False
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None
+        if not result:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        loc = result.end()
+        ret = result.group()
+
+        if self.unquoteResults:
+
+            # strip off quotes
+            ret = ret[self.quoteCharLen:-self.endQuoteCharLen]
+
+            if isinstance(ret,basestring):
+                # replace escaped whitespace
+                if '\\' in ret and self.convertWhitespaceEscapes:
+                    ws_map = {
+                        r'\t' : '\t',
+                        r'\n' : '\n',
+                        r'\f' : '\f',
+                        r'\r' : '\r',
+                    }
+                    for wslit,wschar in ws_map.items():
+                        ret = ret.replace(wslit, wschar)
+
+                # replace escaped characters
+                if self.escChar:
+                    ret = re.sub(self.escCharReplacePattern,"\g<1>",ret)
+
+                # replace escaped quotes
+                if self.escQuote:
+                    ret = ret.replace(self.escQuote, self.endQuoteChar)
+
+        return loc, ret
+
+    def __str__( self ):
+        try:
+            return super(QuotedString,self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None:
+            self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar)
+
+        return self.strRepr
+
+
+class CharsNotIn(Token):
+    """
+    Token for matching words composed of characters I{not} in a given set (will
+    include whitespace in matched characters if not listed in the provided exclusion set - see example).
+    Defined with string containing all disallowed characters, and an optional
+    minimum, maximum, and/or exact length.  The default value for C{min} is 1 (a
+    minimum value < 1 is not valid); the default values for C{max} and C{exact}
+    are 0, meaning no maximum or exact length restriction.
+
+    Example::
+        # define a comma-separated-value as anything that is not a ','
+        csv_value = CharsNotIn(',')
+        print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213"))
+    prints::
+        ['dkls', 'lsdkjf', 's12 34', '@!#', '213']
+    """
+    def __init__( self, notChars, min=1, max=0, exact=0 ):
+        super(CharsNotIn,self).__init__()
+        self.skipWhitespace = False
+        self.notChars = notChars
+
+        if min < 1:
+            raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted")
+
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = _MAX_INT
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = ( self.minLen == 0 )
+        self.mayIndexError = False
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if instring[loc] in self.notChars:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        start = loc
+        loc += 1
+        notchars = self.notChars
+        maxlen = min( start+self.maxLen, len(instring) )
+        while loc < maxlen and \
+              (instring[loc] not in notchars):
+            loc += 1
+
+        if loc - start < self.minLen:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        return loc, instring[start:loc]
+
+    def __str__( self ):
+        try:
+            return super(CharsNotIn, self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None:
+            if len(self.notChars) > 4:
+                self.strRepr = "!W:(%s...)" % self.notChars[:4]
+            else:
+                self.strRepr = "!W:(%s)" % self.notChars
+
+        return self.strRepr
+
+class White(Token):
+    """
+    Special matching class for matching whitespace.  Normally, whitespace is ignored
+    by pyparsing grammars.  This class is included when some whitespace structures
+    are significant.  Define with a string containing the whitespace characters to be
+    matched; default is C{" \\t\\r\\n"}.  Also takes optional C{min}, C{max}, and C{exact} arguments,
+    as defined for the C{L{Word}} class.
+    """
+    whiteStrs = {
+        " " : "<SPC>",
+        "\t": "<TAB>",
+        "\n": "<LF>",
+        "\r": "<CR>",
+        "\f": "<FF>",
+        }
+    def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0):
+        super(White,self).__init__()
+        self.matchWhite = ws
+        self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) )
+        #~ self.leaveWhitespace()
+        self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite))
+        self.mayReturnEmpty = True
+        self.errmsg = "Expected " + self.name
+
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = _MAX_INT
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if not(instring[ loc ] in self.matchWhite):
+            raise ParseException(instring, loc, self.errmsg, self)
+        start = loc
+        loc += 1
+        maxloc = start + self.maxLen
+        maxloc = min( maxloc, len(instring) )
+        while loc < maxloc and instring[loc] in self.matchWhite:
+            loc += 1
+
+        if loc - start < self.minLen:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        return loc, instring[start:loc]
+
+
+class _PositionToken(Token):
+    def __init__( self ):
+        super(_PositionToken,self).__init__()
+        self.name=self.__class__.__name__
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+
+class GoToColumn(_PositionToken):
+    """
+    Token to advance to a specific column of input text; useful for tabular report scraping.
+    """
+    def __init__( self, colno ):
+        super(GoToColumn,self).__init__()
+        self.col = colno
+
+    def preParse( self, instring, loc ):
+        if col(loc,instring) != self.col:
+            instrlen = len(instring)
+            if self.ignoreExprs:
+                loc = self._skipIgnorables( instring, loc )
+            while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col :
+                loc += 1
+        return loc
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        thiscol = col( loc, instring )
+        if thiscol > self.col:
+            raise ParseException( instring, loc, "Text not in expected column", self )
+        newloc = loc + self.col - thiscol
+        ret = instring[ loc: newloc ]
+        return newloc, ret
+
+
+class LineStart(_PositionToken):
+    """
+    Matches if current position is at the beginning of a line within the parse string
+    
+    Example::
+    
+        test = '''\
+        AAA this line
+        AAA and this line
+          AAA but not this one
+        B AAA and definitely not this one
+        '''
+
+        for t in (LineStart() + 'AAA' + restOfLine).searchString(test):
+            print(t)
+    
+    Prints::
+        ['AAA', ' this line']
+        ['AAA', ' and this line']    
+
+    """
+    def __init__( self ):
+        super(LineStart,self).__init__()
+        self.errmsg = "Expected start of line"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if col(loc, instring) == 1:
+            return loc, []
+        raise ParseException(instring, loc, self.errmsg, self)
+
+class LineEnd(_PositionToken):
+    """
+    Matches if current position is at the end of a line within the parse string
+    """
+    def __init__( self ):
+        super(LineEnd,self).__init__()
+        self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") )
+        self.errmsg = "Expected end of line"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc<len(instring):
+            if instring[loc] == "\n":
+                return loc+1, "\n"
+            else:
+                raise ParseException(instring, loc, self.errmsg, self)
+        elif loc == len(instring):
+            return loc+1, []
+        else:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+class StringStart(_PositionToken):
+    """
+    Matches if current position is at the beginning of the parse string
+    """
+    def __init__( self ):
+        super(StringStart,self).__init__()
+        self.errmsg = "Expected start of text"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc != 0:
+            # see if entire string up to here is just whitespace and ignoreables
+            if loc != self.preParse( instring, 0 ):
+                raise ParseException(instring, loc, self.errmsg, self)
+        return loc, []
+
+class StringEnd(_PositionToken):
+    """
+    Matches if current position is at the end of the parse string
+    """
+    def __init__( self ):
+        super(StringEnd,self).__init__()
+        self.errmsg = "Expected end of text"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc < len(instring):
+            raise ParseException(instring, loc, self.errmsg, self)
+        elif loc == len(instring):
+            return loc+1, []
+        elif loc > len(instring):
+            return loc, []
+        else:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+class WordStart(_PositionToken):
+    """
+    Matches if the current position is at the beginning of a Word, and
+    is not preceded by any character in a given set of C{wordChars}
+    (default=C{printables}). To emulate the C{\b} behavior of regular expressions,
+    use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of
+    the string being parsed, or at the beginning of a line.
+    """
+    def __init__(self, wordChars = printables):
+        super(WordStart,self).__init__()
+        self.wordChars = set(wordChars)
+        self.errmsg = "Not at the start of a word"
+
+    def parseImpl(self, instring, loc, doActions=True ):
+        if loc != 0:
+            if (instring[loc-1] in self.wordChars or
+                instring[loc] not in self.wordChars):
+                raise ParseException(instring, loc, self.errmsg, self)
+        return loc, []
+
+class WordEnd(_PositionToken):
+    """
+    Matches if the current position is at the end of a Word, and
+    is not followed by any character in a given set of C{wordChars}
+    (default=C{printables}). To emulate the C{\b} behavior of regular expressions,
+    use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of
+    the string being parsed, or at the end of a line.
+    """
+    def __init__(self, wordChars = printables):
+        super(WordEnd,self).__init__()
+        self.wordChars = set(wordChars)
+        self.skipWhitespace = False
+        self.errmsg = "Not at the end of a word"
+
+    def parseImpl(self, instring, loc, doActions=True ):
+        instrlen = len(instring)
+        if instrlen>0 and loc<instrlen:
+            if (instring[loc] in self.wordChars or
+                instring[loc-1] not in self.wordChars):
+                raise ParseException(instring, loc, self.errmsg, self)
+        return loc, []
+
+
+class ParseExpression(ParserElement):
+    """
+    Abstract subclass of ParserElement, for combining and post-processing parsed tokens.
+    """
+    def __init__( self, exprs, savelist = False ):
+        super(ParseExpression,self).__init__(savelist)
+        if isinstance( exprs, _generatorType ):
+            exprs = list(exprs)
+
+        if isinstance( exprs, basestring ):
+            self.exprs = [ ParserElement._literalStringClass( exprs ) ]
+        elif isinstance( exprs, collections.Iterable ):
+            exprs = list(exprs)
+            # if sequence of strings provided, wrap with Literal
+            if all(isinstance(expr, basestring) for expr in exprs):
+                exprs = map(ParserElement._literalStringClass, exprs)
+            self.exprs = list(exprs)
+        else:
+            try:
+                self.exprs = list( exprs )
+            except TypeError:
+                self.exprs = [ exprs ]
+        self.callPreparse = False
+
+    def __getitem__( self, i ):
+        return self.exprs[i]
+
+    def append( self, other ):
+        self.exprs.append( other )
+        self.strRepr = None
+        return self
+
+    def leaveWhitespace( self ):
+        """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on
+           all contained expressions."""
+        self.skipWhitespace = False
+        self.exprs = [ e.copy() for e in self.exprs ]
+        for e in self.exprs:
+            e.leaveWhitespace()
+        return self
+
+    def ignore( self, other ):
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                super( ParseExpression, self).ignore( other )
+                for e in self.exprs:
+                    e.ignore( self.ignoreExprs[-1] )
+        else:
+            super( ParseExpression, self).ignore( other )
+            for e in self.exprs:
+                e.ignore( self.ignoreExprs[-1] )
+        return self
+
+    def __str__( self ):
+        try:
+            return super(ParseExpression,self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None:
+            self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) )
+        return self.strRepr
+
+    def streamline( self ):
+        super(ParseExpression,self).streamline()
+
+        for e in self.exprs:
+            e.streamline()
+
+        # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d )
+        # but only if there are no parse actions or resultsNames on the nested And's
+        # (likewise for Or's and MatchFirst's)
+        if ( len(self.exprs) == 2 ):
+            other = self.exprs[0]
+            if ( isinstance( other, self.__class__ ) and
+                  not(other.parseAction) and
+                  other.resultsName is None and
+                  not other.debug ):
+                self.exprs = other.exprs[:] + [ self.exprs[1] ]
+                self.strRepr = None
+                self.mayReturnEmpty |= other.mayReturnEmpty
+                self.mayIndexError  |= other.mayIndexError
+
+            other = self.exprs[-1]
+            if ( isinstance( other, self.__class__ ) and
+                  not(other.parseAction) and
+                  other.resultsName is None and
+                  not other.debug ):
+                self.exprs = self.exprs[:-1] + other.exprs[:]
+                self.strRepr = None
+                self.mayReturnEmpty |= other.mayReturnEmpty
+                self.mayIndexError  |= other.mayIndexError
+
+        self.errmsg = "Expected " + _ustr(self)
+        
+        return self
+
+    def setResultsName( self, name, listAllMatches=False ):
+        ret = super(ParseExpression,self).setResultsName(name,listAllMatches)
+        return ret
+
+    def validate( self, validateTrace=[] ):
+        tmp = validateTrace[:]+[self]
+        for e in self.exprs:
+            e.validate(tmp)
+        self.checkRecursion( [] )
+        
+    def copy(self):
+        ret = super(ParseExpression,self).copy()
+        ret.exprs = [e.copy() for e in self.exprs]
+        return ret
+
+class And(ParseExpression):
+    """
+    Requires all given C{ParseExpression}s to be found in the given order.
+    Expressions may be separated by whitespace.
+    May be constructed using the C{'+'} operator.
+    May also be constructed using the C{'-'} operator, which will suppress backtracking.
+
+    Example::
+        integer = Word(nums)
+        name_expr = OneOrMore(Word(alphas))
+
+        expr = And([integer("id"),name_expr("name"),integer("age")])
+        # more easily written as:
+        expr = integer("id") + name_expr("name") + integer("age")
+    """
+
+    class _ErrorStop(Empty):
+        def __init__(self, *args, **kwargs):
+            super(And._ErrorStop,self).__init__(*args, **kwargs)
+            self.name = '-'
+            self.leaveWhitespace()
+
+    def __init__( self, exprs, savelist = True ):
+        super(And,self).__init__(exprs, savelist)
+        self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs)
+        self.setWhitespaceChars( self.exprs[0].whiteChars )
+        self.skipWhitespace = self.exprs[0].skipWhitespace
+        self.callPreparse = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        # pass False as last arg to _parse for first element, since we already
+        # pre-parsed the string as part of our And pre-parsing
+        loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False )
+        errorStop = False
+        for e in self.exprs[1:]:
+            if isinstance(e, And._ErrorStop):
+                errorStop = True
+                continue
+            if errorStop:
+                try:
+                    loc, exprtokens = e._parse( instring, loc, doActions )
+                except ParseSyntaxException:
+                    raise
+                except ParseBaseException as pe:
+                    pe.__traceback__ = None
+                    raise ParseSyntaxException._from_exception(pe)
+                except IndexError:
+                    raise ParseSyntaxException(instring, len(instring), self.errmsg, self)
+            else:
+                loc, exprtokens = e._parse( instring, loc, doActions )
+            if exprtokens or exprtokens.haskeys():
+                resultlist += exprtokens
+        return loc, resultlist
+
+    def __iadd__(self, other ):
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        return self.append( other ) #And( [ self, other ] )
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+            if not e.mayReturnEmpty:
+                break
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}"
+
+        return self.strRepr
+
+
+class Or(ParseExpression):
+    """
+    Requires that at least one C{ParseExpression} is found.
+    If two expressions match, the expression that matches the longest string will be used.
+    May be constructed using the C{'^'} operator.
+
+    Example::
+        # construct Or using '^' operator
+        
+        number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums))
+        print(number.searchString("123 3.1416 789"))
+    prints::
+        [['123'], ['3.1416'], ['789']]
+    """
+    def __init__( self, exprs, savelist = False ):
+        super(Or,self).__init__(exprs, savelist)
+        if self.exprs:
+            self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs)
+        else:
+            self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        maxExcLoc = -1
+        maxException = None
+        matches = []
+        for e in self.exprs:
+            try:
+                loc2 = e.tryParse( instring, loc )
+            except ParseException as err:
+                err.__traceback__ = None
+                if err.loc > maxExcLoc:
+                    maxException = err
+                    maxExcLoc = err.loc
+            except IndexError:
+                if len(instring) > maxExcLoc:
+                    maxException = ParseException(instring,len(instring),e.errmsg,self)
+                    maxExcLoc = len(instring)
+            else:
+                # save match among all matches, to retry longest to shortest
+                matches.append((loc2, e))
+
+        if matches:
+            matches.sort(key=lambda x: -x[0])
+            for _,e in matches:
+                try:
+                    return e._parse( instring, loc, doActions )
+                except ParseException as err:
+                    err.__traceback__ = None
+                    if err.loc > maxExcLoc:
+                        maxException = err
+                        maxExcLoc = err.loc
+
+        if maxException is not None:
+            maxException.msg = self.errmsg
+            raise maxException
+        else:
+            raise ParseException(instring, loc, "no defined alternatives to match", self)
+
+
+    def __ixor__(self, other ):
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        return self.append( other ) #Or( [ self, other ] )
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}"
+
+        return self.strRepr
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+
+class MatchFirst(ParseExpression):
+    """
+    Requires that at least one C{ParseExpression} is found.
+    If two expressions match, the first one listed is the one that will match.
+    May be constructed using the C{'|'} operator.
+
+    Example::
+        # construct MatchFirst using '|' operator
+        
+        # watch the order of expressions to match
+        number = Word(nums) | Combine(Word(nums) + '.' + Word(nums))
+        print(number.searchString("123 3.1416 789")) #  Fail! -> [['123'], ['3'], ['1416'], ['789']]
+
+        # put more selective expression first
+        number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums)
+        print(number.searchString("123 3.1416 789")) #  Better -> [['123'], ['3.1416'], ['789']]
+    """
+    def __init__( self, exprs, savelist = False ):
+        super(MatchFirst,self).__init__(exprs, savelist)
+        if self.exprs:
+            self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs)
+        else:
+            self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        maxExcLoc = -1
+        maxException = None
+        for e in self.exprs:
+            try:
+                ret = e._parse( instring, loc, doActions )
+                return ret
+            except ParseException as err:
+                if err.loc > maxExcLoc:
+                    maxException = err
+                    maxExcLoc = err.loc
+            except IndexError:
+                if len(instring) > maxExcLoc:
+                    maxException = ParseException(instring,len(instring),e.errmsg,self)
+                    maxExcLoc = len(instring)
+
+        # only got here if no expression matched, raise exception for match that made it the furthest
+        else:
+            if maxException is not None:
+                maxException.msg = self.errmsg
+                raise maxException
+            else:
+                raise ParseException(instring, loc, "no defined alternatives to match", self)
+
+    def __ior__(self, other ):
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        return self.append( other ) #MatchFirst( [ self, other ] )
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}"
+
+        return self.strRepr
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+
+class Each(ParseExpression):
+    """
+    Requires all given C{ParseExpression}s to be found, but in any order.
+    Expressions may be separated by whitespace.
+    May be constructed using the C{'&'} operator.
+
+    Example::
+        color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN")
+        shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON")
+        integer = Word(nums)
+        shape_attr = "shape:" + shape_type("shape")
+        posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn")
+        color_attr = "color:" + color("color")
+        size_attr = "size:" + integer("size")
+
+        # use Each (using operator '&') to accept attributes in any order 
+        # (shape and posn are required, color and size are optional)
+        shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr)
+
+        shape_spec.runTests('''
+            shape: SQUARE color: BLACK posn: 100, 120
+            shape: CIRCLE size: 50 color: BLUE posn: 50,80
+            color:GREEN size:20 shape:TRIANGLE posn:20,40
+            '''
+            )
+    prints::
+        shape: SQUARE color: BLACK posn: 100, 120
+        ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']]
+        - color: BLACK
+        - posn: ['100', ',', '120']
+          - x: 100
+          - y: 120
+        - shape: SQUARE
+
+
+        shape: CIRCLE size: 50 color: BLUE posn: 50,80
+        ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']]
+        - color: BLUE
+        - posn: ['50', ',', '80']
+          - x: 50
+          - y: 80
+        - shape: CIRCLE
+        - size: 50
+
+
+        color: GREEN size: 20 shape: TRIANGLE posn: 20,40
+        ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']]
+        - color: GREEN
+        - posn: ['20', ',', '40']
+          - x: 20
+          - y: 40
+        - shape: TRIANGLE
+        - size: 20
+    """
+    def __init__( self, exprs, savelist = True ):
+        super(Each,self).__init__(exprs, savelist)
+        self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs)
+        self.skipWhitespace = True
+        self.initExprGroups = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.initExprGroups:
+            self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional))
+            opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ]
+            opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)]
+            self.optionals = opt1 + opt2
+            self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ]
+            self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ]
+            self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ]
+            self.required += self.multirequired
+            self.initExprGroups = False
+        tmpLoc = loc
+        tmpReqd = self.required[:]
+        tmpOpt  = self.optionals[:]
+        matchOrder = []
+
+        keepMatching = True
+        while keepMatching:
+            tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired
+            failed = []
+            for e in tmpExprs:
+                try:
+                    tmpLoc = e.tryParse( instring, tmpLoc )
+                except ParseException:
+                    failed.append(e)
+                else:
+                    matchOrder.append(self.opt1map.get(id(e),e))
+                    if e in tmpReqd:
+                        tmpReqd.remove(e)
+                    elif e in tmpOpt:
+                        tmpOpt.remove(e)
+            if len(failed) == len(tmpExprs):
+                keepMatching = False
+
+        if tmpReqd:
+            missing = ", ".join(_ustr(e) for e in tmpReqd)
+            raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing )
+
+        # add any unmatched Optionals, in case they have default values defined
+        matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt]
+
+        resultlist = []
+        for e in matchOrder:
+            loc,results = e._parse(instring,loc,doActions)
+            resultlist.append(results)
+
+        finalResults = sum(resultlist, ParseResults([]))
+        return loc, finalResults
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}"
+
+        return self.strRepr
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+
+class ParseElementEnhance(ParserElement):
+    """
+    Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens.
+    """
+    def __init__( self, expr, savelist=False ):
+        super(ParseElementEnhance,self).__init__(savelist)
+        if isinstance( expr, basestring ):
+            if issubclass(ParserElement._literalStringClass, Token):
+                expr = ParserElement._literalStringClass(expr)
+            else:
+                expr = ParserElement._literalStringClass(Literal(expr))
+        self.expr = expr
+        self.strRepr = None
+        if expr is not None:
+            self.mayIndexError = expr.mayIndexError
+            self.mayReturnEmpty = expr.mayReturnEmpty
+            self.setWhitespaceChars( expr.whiteChars )
+            self.skipWhitespace = expr.skipWhitespace
+            self.saveAsList = expr.saveAsList
+            self.callPreparse = expr.callPreparse
+            self.ignoreExprs.extend(expr.ignoreExprs)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.expr is not None:
+            return self.expr._parse( instring, loc, doActions, callPreParse=False )
+        else:
+            raise ParseException("",loc,self.errmsg,self)
+
+    def leaveWhitespace( self ):
+        self.skipWhitespace = False
+        self.expr = self.expr.copy()
+        if self.expr is not None:
+            self.expr.leaveWhitespace()
+        return self
+
+    def ignore( self, other ):
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                super( ParseElementEnhance, self).ignore( other )
+                if self.expr is not None:
+                    self.expr.ignore( self.ignoreExprs[-1] )
+        else:
+            super( ParseElementEnhance, self).ignore( other )
+            if self.expr is not None:
+                self.expr.ignore( self.ignoreExprs[-1] )
+        return self
+
+    def streamline( self ):
+        super(ParseElementEnhance,self).streamline()
+        if self.expr is not None:
+            self.expr.streamline()
+        return self
+
+    def checkRecursion( self, parseElementList ):
+        if self in parseElementList:
+            raise RecursiveGrammarException( parseElementList+[self] )
+        subRecCheckList = parseElementList[:] + [ self ]
+        if self.expr is not None:
+            self.expr.checkRecursion( subRecCheckList )
+
+    def validate( self, validateTrace=[] ):
+        tmp = validateTrace[:]+[self]
+        if self.expr is not None:
+            self.expr.validate(tmp)
+        self.checkRecursion( [] )
+
+    def __str__( self ):
+        try:
+            return super(ParseElementEnhance,self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None and self.expr is not None:
+            self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) )
+        return self.strRepr
+
+
+class FollowedBy(ParseElementEnhance):
+    """
+    Lookahead matching of the given parse expression.  C{FollowedBy}
+    does I{not} advance the parsing position within the input string, it only
+    verifies that the specified parse expression matches at the current
+    position.  C{FollowedBy} always returns a null token list.
+
+    Example::
+        # use FollowedBy to match a label only if it is followed by a ':'
+        data_word = Word(alphas)
+        label = data_word + FollowedBy(':')
+        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
+        
+        OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint()
+    prints::
+        [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']]
+    """
+    def __init__( self, expr ):
+        super(FollowedBy,self).__init__(expr)
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        self.expr.tryParse( instring, loc )
+        return loc, []
+
+
+class NotAny(ParseElementEnhance):
+    """
+    Lookahead to disallow matching with the given parse expression.  C{NotAny}
+    does I{not} advance the parsing position within the input string, it only
+    verifies that the specified parse expression does I{not} match at the current
+    position.  Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny}
+    always returns a null token list.  May be constructed using the '~' operator.
+
+    Example::
+        
+    """
+    def __init__( self, expr ):
+        super(NotAny,self).__init__(expr)
+        #~ self.leaveWhitespace()
+        self.skipWhitespace = False  # do NOT use self.leaveWhitespace(), don't want to propagate to exprs
+        self.mayReturnEmpty = True
+        self.errmsg = "Found unwanted token, "+_ustr(self.expr)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.expr.canParseNext(instring, loc):
+            raise ParseException(instring, loc, self.errmsg, self)
+        return loc, []
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "~{" + _ustr(self.expr) + "}"
+
+        return self.strRepr
+
+class _MultipleMatch(ParseElementEnhance):
+    def __init__( self, expr, stopOn=None):
+        super(_MultipleMatch, self).__init__(expr)
+        self.saveAsList = True
+        ender = stopOn
+        if isinstance(ender, basestring):
+            ender = ParserElement._literalStringClass(ender)
+        self.not_ender = ~ender if ender is not None else None
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        self_expr_parse = self.expr._parse
+        self_skip_ignorables = self._skipIgnorables
+        check_ender = self.not_ender is not None
+        if check_ender:
+            try_not_ender = self.not_ender.tryParse
+        
+        # must be at least one (but first see if we are the stopOn sentinel;
+        # if so, fail)
+        if check_ender:
+            try_not_ender(instring, loc)
+        loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False )
+        try:
+            hasIgnoreExprs = (not not self.ignoreExprs)
+            while 1:
+                if check_ender:
+                    try_not_ender(instring, loc)
+                if hasIgnoreExprs:
+                    preloc = self_skip_ignorables( instring, loc )
+                else:
+                    preloc = loc
+                loc, tmptokens = self_expr_parse( instring, preloc, doActions )
+                if tmptokens or tmptokens.haskeys():
+                    tokens += tmptokens
+        except (ParseException,IndexError):
+            pass
+
+        return loc, tokens
+        
+class OneOrMore(_MultipleMatch):
+    """
+    Repetition of one or more of the given expression.
+    
+    Parameters:
+     - expr - expression that must match one or more times
+     - stopOn - (default=C{None}) - expression for a terminating sentinel
+          (only required if the sentinel would ordinarily match the repetition 
+          expression)          
+
+    Example::
+        data_word = Word(alphas)
+        label = data_word + FollowedBy(':')
+        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))
+
+        text = "shape: SQUARE posn: upper left color: BLACK"
+        OneOrMore(attr_expr).parseString(text).pprint()  # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']]
+
+        # use stopOn attribute for OneOrMore to avoid reading label string as part of the data
+        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
+        OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']]
+        
+        # could also be written as
+        (attr_expr * (1,)).parseString(text).pprint()
+    """
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + _ustr(self.expr) + "}..."
+
+        return self.strRepr
+
+class ZeroOrMore(_MultipleMatch):
+    """
+    Optional repetition of zero or more of the given expression.
+    
+    Parameters:
+     - expr - expression that must match zero or more times
+     - stopOn - (default=C{None}) - expression for a terminating sentinel
+          (only required if the sentinel would ordinarily match the repetition 
+          expression)          
+
+    Example: similar to L{OneOrMore}
+    """
+    def __init__( self, expr, stopOn=None):
+        super(ZeroOrMore,self).__init__(expr, stopOn=stopOn)
+        self.mayReturnEmpty = True
+        
+    def parseImpl( self, instring, loc, doActions=True ):
+        try:
+            return super(ZeroOrMore, self).parseImpl(instring, loc, doActions)
+        except (ParseException,IndexError):
+            return loc, []
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "[" + _ustr(self.expr) + "]..."
+
+        return self.strRepr
+
+class _NullToken(object):
+    def __bool__(self):
+        return False
+    __nonzero__ = __bool__
+    def __str__(self):
+        return ""
+
+_optionalNotMatched = _NullToken()
+class Optional(ParseElementEnhance):
+    """
+    Optional matching of the given expression.
+
+    Parameters:
+     - expr - expression that must match zero or more times
+     - default (optional) - value to be returned if the optional expression is not found.
+
+    Example::
+        # US postal code can be a 5-digit zip, plus optional 4-digit qualifier
+        zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4)))
+        zip.runTests('''
+            # traditional ZIP code
+            12345
+            
+            # ZIP+4 form
+            12101-0001
+            
+            # invalid ZIP
+            98765-
+            ''')
+    prints::
+        # traditional ZIP code
+        12345
+        ['12345']
+
+        # ZIP+4 form
+        12101-0001
+        ['12101-0001']
+
+        # invalid ZIP
+        98765-
+             ^
+        FAIL: Expected end of text (at char 5), (line:1, col:6)
+    """
+    def __init__( self, expr, default=_optionalNotMatched ):
+        super(Optional,self).__init__( expr, savelist=False )
+        self.saveAsList = self.expr.saveAsList
+        self.defaultValue = default
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        try:
+            loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False )
+        except (ParseException,IndexError):
+            if self.defaultValue is not _optionalNotMatched:
+                if self.expr.resultsName:
+                    tokens = ParseResults([ self.defaultValue ])
+                    tokens[self.expr.resultsName] = self.defaultValue
+                else:
+                    tokens = [ self.defaultValue ]
+            else:
+                tokens = []
+        return loc, tokens
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "[" + _ustr(self.expr) + "]"
+
+        return self.strRepr
+
+class SkipTo(ParseElementEnhance):
+    """
+    Token for skipping over all undefined text until the matched expression is found.
+
+    Parameters:
+     - expr - target expression marking the end of the data to be skipped
+     - include - (default=C{False}) if True, the target expression is also parsed 
+          (the skipped text and target expression are returned as a 2-element list).
+     - ignore - (default=C{None}) used to define grammars (typically quoted strings and 
+          comments) that might contain false matches to the target expression
+     - failOn - (default=C{None}) define expressions that are not allowed to be 
+          included in the skipped test; if found before the target expression is found, 
+          the SkipTo is not a match
+
+    Example::
+        report = '''
+            Outstanding Issues Report - 1 Jan 2000
+
+               # | Severity | Description                               |  Days Open
+            -----+----------+-------------------------------------------+-----------
+             101 | Critical | Intermittent system crash                 |          6
+              94 | Cosmetic | Spelling error on Login ('log|n')         |         14
+              79 | Minor    | System slow when running too many reports |         47
+            '''
+        integer = Word(nums)
+        SEP = Suppress('|')
+        # use SkipTo to simply match everything up until the next SEP
+        # - ignore quoted strings, so that a '|' character inside a quoted string does not match
+        # - parse action will call token.strip() for each matched token, i.e., the description body
+        string_data = SkipTo(SEP, ignore=quotedString)
+        string_data.setParseAction(tokenMap(str.strip))
+        ticket_expr = (integer("issue_num") + SEP 
+                      + string_data("sev") + SEP 
+                      + string_data("desc") + SEP 
+                      + integer("days_open"))
+        
+        for tkt in ticket_expr.searchString(report):
+            print tkt.dump()
+    prints::
+        ['101', 'Critical', 'Intermittent system crash', '6']
+        - days_open: 6
+        - desc: Intermittent system crash
+        - issue_num: 101
+        - sev: Critical
+        ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14']
+        - days_open: 14
+        - desc: Spelling error on Login ('log|n')
+        - issue_num: 94
+        - sev: Cosmetic
+        ['79', 'Minor', 'System slow when running too many reports', '47']
+        - days_open: 47
+        - desc: System slow when running too many reports
+        - issue_num: 79
+        - sev: Minor
+    """
+    def __init__( self, other, include=False, ignore=None, failOn=None ):
+        super( SkipTo, self ).__init__( other )
+        self.ignoreExpr = ignore
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+        self.includeMatch = include
+        self.asList = False
+        if isinstance(failOn, basestring):
+            self.failOn = ParserElement._literalStringClass(failOn)
+        else:
+            self.failOn = failOn
+        self.errmsg = "No match found for "+_ustr(self.expr)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        startloc = loc
+        instrlen = len(instring)
+        expr = self.expr
+        expr_parse = self.expr._parse
+        self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None
+        self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None
+        
+        tmploc = loc
+        while tmploc <= instrlen:
+            if self_failOn_canParseNext is not None:
+                # break if failOn expression matches
+                if self_failOn_canParseNext(instring, tmploc):
+                    break
+                    
+            if self_ignoreExpr_tryParse is not None:
+                # advance past ignore expressions
+                while 1:
+                    try:
+                        tmploc = self_ignoreExpr_tryParse(instring, tmploc)
+                    except ParseBaseException:
+                        break
+            
+            try:
+                expr_parse(instring, tmploc, doActions=False, callPreParse=False)
+            except (ParseException, IndexError):
+                # no match, advance loc in string
+                tmploc += 1
+            else:
+                # matched skipto expr, done
+                break
+
+        else:
+            # ran off the end of the input string without matching skipto expr, fail
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        # build up return values
+        loc = tmploc
+        skiptext = instring[startloc:loc]
+        skipresult = ParseResults(skiptext)
+        
+        if self.includeMatch:
+            loc, mat = expr_parse(instring,loc,doActions,callPreParse=False)
+            skipresult += mat
+
+        return loc, skipresult
+
+class Forward(ParseElementEnhance):
+    """
+    Forward declaration of an expression to be defined later -
+    used for recursive grammars, such as algebraic infix notation.
+    When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator.
+
+    Note: take care when assigning to C{Forward} not to overlook precedence of operators.
+    Specifically, '|' has a lower precedence than '<<', so that::
+        fwdExpr << a | b | c
+    will actually be evaluated as::
+        (fwdExpr << a) | b | c
+    thereby leaving b and c out as parseable alternatives.  It is recommended that you
+    explicitly group the values inserted into the C{Forward}::
+        fwdExpr << (a | b | c)
+    Converting to use the '<<=' operator instead will avoid this problem.
+
+    See L{ParseResults.pprint} for an example of a recursive parser created using
+    C{Forward}.
+    """
+    def __init__( self, other=None ):
+        super(Forward,self).__init__( other, savelist=False )
+
+    def __lshift__( self, other ):
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass(other)
+        self.expr = other
+        self.strRepr = None
+        self.mayIndexError = self.expr.mayIndexError
+        self.mayReturnEmpty = self.expr.mayReturnEmpty
+        self.setWhitespaceChars( self.expr.whiteChars )
+        self.skipWhitespace = self.expr.skipWhitespace
+        self.saveAsList = self.expr.saveAsList
+        self.ignoreExprs.extend(self.expr.ignoreExprs)
+        return self
+        
+    def __ilshift__(self, other):
+        return self << other
+    
+    def leaveWhitespace( self ):
+        self.skipWhitespace = False
+        return self
+
+    def streamline( self ):
+        if not self.streamlined:
+            self.streamlined = True
+            if self.expr is not None:
+                self.expr.streamline()
+        return self
+
+    def validate( self, validateTrace=[] ):
+        if self not in validateTrace:
+            tmp = validateTrace[:]+[self]
+            if self.expr is not None:
+                self.expr.validate(tmp)
+        self.checkRecursion([])
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+        return self.__class__.__name__ + ": ..."
+
+        # stubbed out for now - creates awful memory and perf issues
+        self._revertClass = self.__class__
+        self.__class__ = _ForwardNoRecurse
+        try:
+            if self.expr is not None:
+                retString = _ustr(self.expr)
+            else:
+                retString = "None"
+        finally:
+            self.__class__ = self._revertClass
+        return self.__class__.__name__ + ": " + retString
+
+    def copy(self):
+        if self.expr is not None:
+            return super(Forward,self).copy()
+        else:
+            ret = Forward()
+            ret <<= self
+            return ret
+
+class _ForwardNoRecurse(Forward):
+    def __str__( self ):
+        return "..."
+
+class TokenConverter(ParseElementEnhance):
+    """
+    Abstract subclass of C{ParseExpression}, for converting parsed results.
+    """
+    def __init__( self, expr, savelist=False ):
+        super(TokenConverter,self).__init__( expr )#, savelist )
+        self.saveAsList = False
+
+class Combine(TokenConverter):
+    """
+    Converter to concatenate all matching tokens to a single string.
+    By default, the matching patterns must also be contiguous in the input string;
+    this can be disabled by specifying C{'adjacent=False'} in the constructor.
+
+    Example::
+        real = Word(nums) + '.' + Word(nums)
+        print(real.parseString('3.1416')) # -> ['3', '.', '1416']
+        # will also erroneously match the following
+        print(real.parseString('3. 1416')) # -> ['3', '.', '1416']
+
+        real = Combine(Word(nums) + '.' + Word(nums))
+        print(real.parseString('3.1416')) # -> ['3.1416']
+        # no match when there are internal spaces
+        print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...)
+    """
+    def __init__( self, expr, joinString="", adjacent=True ):
+        super(Combine,self).__init__( expr )
+        # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself
+        if adjacent:
+            self.leaveWhitespace()
+        self.adjacent = adjacent
+        self.skipWhitespace = True
+        self.joinString = joinString
+        self.callPreparse = True
+
+    def ignore( self, other ):
+        if self.adjacent:
+            ParserElement.ignore(self, other)
+        else:
+            super( Combine, self).ignore( other )
+        return self
+
+    def postParse( self, instring, loc, tokenlist ):
+        retToks = tokenlist.copy()
+        del retToks[:]
+        retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults)
+
+        if self.resultsName and retToks.haskeys():
+            return [ retToks ]
+        else:
+            return retToks
+
+class Group(TokenConverter):
+    """
+    Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions.
+
+    Example::
+        ident = Word(alphas)
+        num = Word(nums)
+        term = ident | num
+        func = ident + Optional(delimitedList(term))
+        print(func.parseString("fn a,b,100"))  # -> ['fn', 'a', 'b', '100']
+
+        func = ident + Group(Optional(delimitedList(term)))
+        print(func.parseString("fn a,b,100"))  # -> ['fn', ['a', 'b', '100']]
+    """
+    def __init__( self, expr ):
+        super(Group,self).__init__( expr )
+        self.saveAsList = True
+
+    def postParse( self, instring, loc, tokenlist ):
+        return [ tokenlist ]
+
+class Dict(TokenConverter):
+    """
+    Converter to return a repetitive expression as a list, but also as a dictionary.
+    Each element can also be referenced using the first token in the expression as its key.
+    Useful for tabular report scraping when the first column can be used as a item key.
+
+    Example::
+        data_word = Word(alphas)
+        label = data_word + FollowedBy(':')
+        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))
+
+        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
+        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
+        
+        # print attributes as plain groups
+        print(OneOrMore(attr_expr).parseString(text).dump())
+        
+        # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names
+        result = Dict(OneOrMore(Group(attr_expr))).parseString(text)
+        print(result.dump())
+        
+        # access named fields as dict entries, or output as dict
+        print(result['shape'])        
+        print(result.asDict())
+    prints::
+        ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap']
+
+        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
+        - color: light blue
+        - posn: upper left
+        - shape: SQUARE
+        - texture: burlap
+        SQUARE
+        {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'}
+    See more examples at L{ParseResults} of accessing fields by results name.
+    """
+    def __init__( self, expr ):
+        super(Dict,self).__init__( expr )
+        self.saveAsList = True
+
+    def postParse( self, instring, loc, tokenlist ):
+        for i,tok in enumerate(tokenlist):
+            if len(tok) == 0:
+                continue
+            ikey = tok[0]
+            if isinstance(ikey,int):
+                ikey = _ustr(tok[0]).strip()
+            if len(tok)==1:
+                tokenlist[ikey] = _ParseResultsWithOffset("",i)
+            elif len(tok)==2 and not isinstance(tok[1],ParseResults):
+                tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i)
+            else:
+                dictvalue = tok.copy() #ParseResults(i)
+                del dictvalue[0]
+                if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()):
+                    tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i)
+                else:
+                    tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i)
+
+        if self.resultsName:
+            return [ tokenlist ]
+        else:
+            return tokenlist
+
+
+class Suppress(TokenConverter):
+    """
+    Converter for ignoring the results of a parsed expression.
+
+    Example::
+        source = "a, b, c,d"
+        wd = Word(alphas)
+        wd_list1 = wd + ZeroOrMore(',' + wd)
+        print(wd_list1.parseString(source))
+
+        # often, delimiters that are useful during parsing are just in the
+        # way afterward - use Suppress to keep them out of the parsed output
+        wd_list2 = wd + ZeroOrMore(Suppress(',') + wd)
+        print(wd_list2.parseString(source))
+    prints::
+        ['a', ',', 'b', ',', 'c', ',', 'd']
+        ['a', 'b', 'c', 'd']
+    (See also L{delimitedList}.)
+    """
+    def postParse( self, instring, loc, tokenlist ):
+        return []
+
+    def suppress( self ):
+        return self
+
+
+class OnlyOnce(object):
+    """
+    Wrapper for parse actions, to ensure they are only called once.
+    """
+    def __init__(self, methodCall):
+        self.callable = _trim_arity(methodCall)
+        self.called = False
+    def __call__(self,s,l,t):
+        if not self.called:
+            results = self.callable(s,l,t)
+            self.called = True
+            return results
+        raise ParseException(s,l,"")
+    def reset(self):
+        self.called = False
+
+def traceParseAction(f):
+    """
+    Decorator for debugging parse actions. 
+    
+    When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".}
+    When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised.
+
+    Example::
+        wd = Word(alphas)
+
+        @traceParseAction
+        def remove_duplicate_chars(tokens):
+            return ''.join(sorted(set(''.join(tokens)))
+
+        wds = OneOrMore(wd).setParseAction(remove_duplicate_chars)
+        print(wds.parseString("slkdjs sld sldd sdlf sdljf"))
+    prints::
+        >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {}))
+        <<leaving remove_duplicate_chars (ret: 'dfjkls')
+        ['dfjkls']
+    """
+    f = _trim_arity(f)
+    def z(*paArgs):
+        thisFunc = f.__name__
+        s,l,t = paArgs[-3:]
+        if len(paArgs)>3:
+            thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc
+        sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) )
+        try:
+            ret = f(*paArgs)
+        except Exception as exc:
+            sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) )
+            raise
+        sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) )
+        return ret
+    try:
+        z.__name__ = f.__name__
+    except AttributeError:
+        pass
+    return z
+
+#
+# global helpers
+#
+def delimitedList( expr, delim=",", combine=False ):
+    """
+    Helper to define a delimited list of expressions - the delimiter defaults to ','.
+    By default, the list elements and delimiters can have intervening whitespace, and
+    comments, but this can be overridden by passing C{combine=True} in the constructor.
+    If C{combine} is set to C{True}, the matching tokens are returned as a single token
+    string, with the delimiters included; otherwise, the matching tokens are returned
+    as a list of tokens, with the delimiters suppressed.
+
+    Example::
+        delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc']
+        delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE']
+    """
+    dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..."
+    if combine:
+        return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName)
+    else:
+        return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName)
+
+def countedArray( expr, intExpr=None ):
+    """
+    Helper to define a counted list of expressions.
+    This helper defines a pattern of the form::
+        integer expr expr expr...
+    where the leading integer tells how many expr expressions follow.
+    The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed.
+    
+    If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value.
+
+    Example::
+        countedArray(Word(alphas)).parseString('2 ab cd ef')  # -> ['ab', 'cd']
+
+        # in this parser, the leading integer value is given in binary,
+        # '10' indicating that 2 values are in the array
+        binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2))
+        countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef')  # -> ['ab', 'cd']
+    """
+    arrayExpr = Forward()
+    def countFieldParseAction(s,l,t):
+        n = t[0]
+        arrayExpr << (n and Group(And([expr]*n)) or Group(empty))
+        return []
+    if intExpr is None:
+        intExpr = Word(nums).setParseAction(lambda t:int(t[0]))
+    else:
+        intExpr = intExpr.copy()
+    intExpr.setName("arrayLen")
+    intExpr.addParseAction(countFieldParseAction, callDuringTry=True)
+    return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...')
+
+def _flatten(L):
+    ret = []
+    for i in L:
+        if isinstance(i,list):
+            ret.extend(_flatten(i))
+        else:
+            ret.append(i)
+    return ret
+
+def matchPreviousLiteral(expr):
+    """
+    Helper to define an expression that is indirectly defined from
+    the tokens matched in a previous expression, that is, it looks
+    for a 'repeat' of a previous expression.  For example::
+        first = Word(nums)
+        second = matchPreviousLiteral(first)
+        matchExpr = first + ":" + second
+    will match C{"1:1"}, but not C{"1:2"}.  Because this matches a
+    previous literal, will also match the leading C{"1:1"} in C{"1:10"}.
+    If this is not desired, use C{matchPreviousExpr}.
+    Do I{not} use with packrat parsing enabled.
+    """
+    rep = Forward()
+    def copyTokenToRepeater(s,l,t):
+        if t:
+            if len(t) == 1:
+                rep << t[0]
+            else:
+                # flatten t tokens
+                tflat = _flatten(t.asList())
+                rep << And(Literal(tt) for tt in tflat)
+        else:
+            rep << Empty()
+    expr.addParseAction(copyTokenToRepeater, callDuringTry=True)
+    rep.setName('(prev) ' + _ustr(expr))
+    return rep
+
+def matchPreviousExpr(expr):
+    """
+    Helper to define an expression that is indirectly defined from
+    the tokens matched in a previous expression, that is, it looks
+    for a 'repeat' of a previous expression.  For example::
+        first = Word(nums)
+        second = matchPreviousExpr(first)
+        matchExpr = first + ":" + second
+    will match C{"1:1"}, but not C{"1:2"}.  Because this matches by
+    expressions, will I{not} match the leading C{"1:1"} in C{"1:10"};
+    the expressions are evaluated first, and then compared, so
+    C{"1"} is compared with C{"10"}.
+    Do I{not} use with packrat parsing enabled.
+    """
+    rep = Forward()
+    e2 = expr.copy()
+    rep <<= e2
+    def copyTokenToRepeater(s,l,t):
+        matchTokens = _flatten(t.asList())
+        def mustMatchTheseTokens(s,l,t):
+            theseTokens = _flatten(t.asList())
+            if  theseTokens != matchTokens:
+                raise ParseException("",0,"")
+        rep.setParseAction( mustMatchTheseTokens, callDuringTry=True )
+    expr.addParseAction(copyTokenToRepeater, callDuringTry=True)
+    rep.setName('(prev) ' + _ustr(expr))
+    return rep
+
+def _escapeRegexRangeChars(s):
+    #~  escape these chars: ^-]
+    for c in r"\^-]":
+        s = s.replace(c,_bslash+c)
+    s = s.replace("\n",r"\n")
+    s = s.replace("\t",r"\t")
+    return _ustr(s)
+
+def oneOf( strs, caseless=False, useRegex=True ):
+    """
+    Helper to quickly define a set of alternative Literals, and makes sure to do
+    longest-first testing when there is a conflict, regardless of the input order,
+    but returns a C{L{MatchFirst}} for best performance.
+
+    Parameters:
+     - strs - a string of space-delimited literals, or a collection of string literals
+     - caseless - (default=C{False}) - treat all literals as caseless
+     - useRegex - (default=C{True}) - as an optimization, will generate a Regex
+          object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or
+          if creating a C{Regex} raises an exception)
+
+    Example::
+        comp_oper = oneOf("< = > <= >= !=")
+        var = Word(alphas)
+        number = Word(nums)
+        term = var | number
+        comparison_expr = term + comp_oper + term
+        print(comparison_expr.searchString("B = 12  AA=23 B<=AA AA>12"))
+    prints::
+        [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']]
+    """
+    if caseless:
+        isequal = ( lambda a,b: a.upper() == b.upper() )
+        masks = ( lambda a,b: b.upper().startswith(a.upper()) )
+        parseElementClass = CaselessLiteral
+    else:
+        isequal = ( lambda a,b: a == b )
+        masks = ( lambda a,b: b.startswith(a) )
+        parseElementClass = Literal
+
+    symbols = []
+    if isinstance(strs,basestring):
+        symbols = strs.split()
+    elif isinstance(strs, collections.Iterable):
+        symbols = list(strs)
+    else:
+        warnings.warn("Invalid argument to oneOf, expected string or iterable",
+                SyntaxWarning, stacklevel=2)
+    if not symbols:
+        return NoMatch()
+
+    i = 0
+    while i < len(symbols)-1:
+        cur = symbols[i]
+        for j,other in enumerate(symbols[i+1:]):
+            if ( isequal(other, cur) ):
+                del symbols[i+j+1]
+                break
+            elif ( masks(cur, other) ):
+                del symbols[i+j+1]
+                symbols.insert(i,other)
+                cur = other
+                break
+        else:
+            i += 1
+
+    if not caseless and useRegex:
+        #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] ))
+        try:
+            if len(symbols)==len("".join(symbols)):
+                return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols))
+            else:
+                return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols))
+        except Exception:
+            warnings.warn("Exception creating Regex for oneOf, building MatchFirst",
+                    SyntaxWarning, stacklevel=2)
+
+
+    # last resort, just use MatchFirst
+    return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols))
+
+def dictOf( key, value ):
+    """
+    Helper to easily and clearly define a dictionary by specifying the respective patterns
+    for the key and value.  Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens
+    in the proper order.  The key pattern can include delimiting markers or punctuation,
+    as long as they are suppressed, thereby leaving the significant key text.  The value
+    pattern can include named results, so that the C{Dict} results can include named token
+    fields.
+
+    Example::
+        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
+        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
+        print(OneOrMore(attr_expr).parseString(text).dump())
+        
+        attr_label = label
+        attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)
+
+        # similar to Dict, but simpler call format
+        result = dictOf(attr_label, attr_value).parseString(text)
+        print(result.dump())
+        print(result['shape'])
+        print(result.shape)  # object attribute access works too
+        print(result.asDict())
+    prints::
+        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
+        - color: light blue
+        - posn: upper left
+        - shape: SQUARE
+        - texture: burlap
+        SQUARE
+        SQUARE
+        {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'}
+    """
+    return Dict( ZeroOrMore( Group ( key + value ) ) )
+
+def originalTextFor(expr, asString=True):
+    """
+    Helper to return the original, untokenized text for a given expression.  Useful to
+    restore the parsed fields of an HTML start tag into the raw tag text itself, or to
+    revert separate tokens with intervening whitespace back to the original matching
+    input text. By default, returns astring containing the original parsed text.  
+       
+    If the optional C{asString} argument is passed as C{False}, then the return value is a 
+    C{L{ParseResults}} containing any results names that were originally matched, and a 
+    single token containing the original matched text from the input string.  So if 
+    the expression passed to C{L{originalTextFor}} contains expressions with defined
+    results names, you must set C{asString} to C{False} if you want to preserve those
+    results name values.
+
+    Example::
+        src = "this is test <b> bold <i>text</i> </b> normal text "
+        for tag in ("b","i"):
+            opener,closer = makeHTMLTags(tag)
+            patt = originalTextFor(opener + SkipTo(closer) + closer)
+            print(patt.searchString(src)[0])
+    prints::
+        ['<b> bold <i>text</i> </b>']
+        ['<i>text</i>']
+    """
+    locMarker = Empty().setParseAction(lambda s,loc,t: loc)
+    endlocMarker = locMarker.copy()
+    endlocMarker.callPreparse = False
+    matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end")
+    if asString:
+        extractText = lambda s,l,t: s[t._original_start:t._original_end]
+    else:
+        def extractText(s,l,t):
+            t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]]
+    matchExpr.setParseAction(extractText)
+    matchExpr.ignoreExprs = expr.ignoreExprs
+    return matchExpr
+
+def ungroup(expr): 
+    """
+    Helper to undo pyparsing's default grouping of And expressions, even
+    if all but one are non-empty.
+    """
+    return TokenConverter(expr).setParseAction(lambda t:t[0])
+
+def locatedExpr(expr):
+    """
+    Helper to decorate a returned token with its starting and ending locations in the input string.
+    This helper adds the following results names:
+     - locn_start = location where matched expression begins
+     - locn_end = location where matched expression ends
+     - value = the actual parsed results
+
+    Be careful if the input text contains C{<TAB>} characters, you may want to call
+    C{L{ParserElement.parseWithTabs}}
+
+    Example::
+        wd = Word(alphas)
+        for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"):
+            print(match)
+    prints::
+        [[0, 'ljsdf', 5]]
+        [[8, 'lksdjjf', 15]]
+        [[18, 'lkkjj', 23]]
+    """
+    locator = Empty().setParseAction(lambda s,l,t: l)
+    return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end"))
+
+
+# convenience constants for positional expressions
+empty       = Empty().setName("empty")
+lineStart   = LineStart().setName("lineStart")
+lineEnd     = LineEnd().setName("lineEnd")
+stringStart = StringStart().setName("stringStart")
+stringEnd   = StringEnd().setName("stringEnd")
+
+_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1])
+_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16)))
+_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8)))
+_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | Word(printables, excludeChars=r'\]', exact=1) | Regex(r"\w", re.UNICODE)
+_charRange = Group(_singleChar + Suppress("-") + _singleChar)
+_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]"
+
+def srange(s):
+    r"""
+    Helper to easily define string ranges for use in Word construction.  Borrows
+    syntax from regexp '[]' string range definitions::
+        srange("[0-9]")   -> "0123456789"
+        srange("[a-z]")   -> "abcdefghijklmnopqrstuvwxyz"
+        srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_"
+    The input string must be enclosed in []'s, and the returned string is the expanded
+    character set joined into a single string.
+    The values enclosed in the []'s may be:
+     - a single character
+     - an escaped character with a leading backslash (such as C{\-} or C{\]})
+     - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) 
+         (C{\0x##} is also supported for backwards compatibility) 
+     - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character)
+     - a range of any of the above, separated by a dash (C{'a-z'}, etc.)
+     - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.)
+    """
+    _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1))
+    try:
+        return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body)
+    except Exception:
+        return ""
+
+def matchOnlyAtCol(n):
+    """
+    Helper method for defining parse actions that require matching at a specific
+    column in the input text.
+    """
+    def verifyCol(strg,locn,toks):
+        if col(locn,strg) != n:
+            raise ParseException(strg,locn,"matched token not at column %d" % n)
+    return verifyCol
+
+def replaceWith(replStr):
+    """
+    Helper method for common parse actions that simply return a literal value.  Especially
+    useful when used with C{L{transformString<ParserElement.transformString>}()}.
+
+    Example::
+        num = Word(nums).setParseAction(lambda toks: int(toks[0]))
+        na = oneOf("N/A NA").setParseAction(replaceWith(math.nan))
+        term = na | num
+        
+        OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234]
+    """
+    return lambda s,l,t: [replStr]
+
+def removeQuotes(s,l,t):
+    """
+    Helper parse action for removing quotation marks from parsed quoted strings.
+
+    Example::
+        # by default, quotation marks are included in parsed results
+        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"]
+
+        # use removeQuotes to strip quotation marks from parsed results
+        quotedString.setParseAction(removeQuotes)
+        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"]
+    """
+    return t[0][1:-1]
+
+def tokenMap(func, *args):
+    """
+    Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional 
+    args are passed, they are forwarded to the given function as additional arguments after
+    the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the
+    parsed data to an integer using base 16.
+
+    Example (compare the last to example in L{ParserElement.transformString}::
+        hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16))
+        hex_ints.runTests('''
+            00 11 22 aa FF 0a 0d 1a
+            ''')
+        
+        upperword = Word(alphas).setParseAction(tokenMap(str.upper))
+        OneOrMore(upperword).runTests('''
+            my kingdom for a horse
+            ''')
+
+        wd = Word(alphas).setParseAction(tokenMap(str.title))
+        OneOrMore(wd).setParseAction(' '.join).runTests('''
+            now is the winter of our discontent made glorious summer by this sun of york
+            ''')
+    prints::
+        00 11 22 aa FF 0a 0d 1a
+        [0, 17, 34, 170, 255, 10, 13, 26]
+
+        my kingdom for a horse
+        ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE']
+
+        now is the winter of our discontent made glorious summer by this sun of york
+        ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York']
+    """
+    def pa(s,l,t):
+        return [func(tokn, *args) for tokn in t]
+
+    try:
+        func_name = getattr(func, '__name__', 
+                            getattr(func, '__class__').__name__)
+    except Exception:
+        func_name = str(func)
+    pa.__name__ = func_name
+
+    return pa
+
+upcaseTokens = tokenMap(lambda t: _ustr(t).upper())
+"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}"""
+
+downcaseTokens = tokenMap(lambda t: _ustr(t).lower())
+"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}"""
+    
+def _makeTags(tagStr, xml):
+    """Internal helper to construct opening and closing tag expressions, given a tag name"""
+    if isinstance(tagStr,basestring):
+        resname = tagStr
+        tagStr = Keyword(tagStr, caseless=not xml)
+    else:
+        resname = tagStr.name
+
+    tagAttrName = Word(alphas,alphanums+"_-:")
+    if (xml):
+        tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes )
+        openTag = Suppress("<") + tagStr("tag") + \
+                Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \
+                Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">")
+    else:
+        printablesLessRAbrack = "".join(c for c in printables if c not in ">")
+        tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack)
+        openTag = Suppress("<") + tagStr("tag") + \
+                Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \
+                Optional( Suppress("=") + tagAttrValue ) ))) + \
+                Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">")
+    closeTag = Combine(_L("</") + tagStr + ">")
+
+    openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname)
+    closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname)
+    openTag.tag = resname
+    closeTag.tag = resname
+    return openTag, closeTag
+
+def makeHTMLTags(tagStr):
+    """
+    Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches
+    tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values.
+
+    Example::
+        text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>'
+        # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple
+        a,a_end = makeHTMLTags("A")
+        link_expr = a + SkipTo(a_end)("link_text") + a_end
+        
+        for link in link_expr.searchString(text):
+            # attributes in the <A> tag (like "href" shown here) are also accessible as named results
+            print(link.link_text, '->', link.href)
+    prints::
+        pyparsing -> http://pyparsing.wikispaces.com
+    """
+    return _makeTags( tagStr, False )
+
+def makeXMLTags(tagStr):
+    """
+    Helper to construct opening and closing tag expressions for XML, given a tag name. Matches
+    tags only in the given upper/lower case.
+
+    Example: similar to L{makeHTMLTags}
+    """
+    return _makeTags( tagStr, True )
+
+def withAttribute(*args,**attrDict):
+    """
+    Helper to create a validating parse action to be used with start tags created
+    with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag
+    with a required attribute value, to avoid false matches on common tags such as
+    C{<TD>} or C{<DIV>}.
+
+    Call C{withAttribute} with a series of attribute names and values. Specify the list
+    of filter attributes names and values as:
+     - keyword arguments, as in C{(align="right")}, or
+     - as an explicit dict with C{**} operator, when an attribute name is also a Python
+          reserved word, as in C{**{"class":"Customer", "align":"right"}}
+     - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") )
+    For attribute names with a namespace prefix, you must use the second form.  Attribute
+    names are matched insensitive to upper/lower case.
+       
+    If just testing for C{class} (with or without a namespace), use C{L{withClass}}.
+
+    To verify that the attribute exists, but without specifying a value, pass
+    C{withAttribute.ANY_VALUE} as the value.
+
+    Example::
+        html = '''
+            <div>
+            Some text
+            <div type="grid">1 4 0 1 0</div>
+            <div type="graph">1,3 2,3 1,1</div>
+            <div>this has no type</div>
+            </div>
+                
+        '''
+        div,div_end = makeHTMLTags("div")
+
+        # only match div tag having a type attribute with value "grid"
+        div_grid = div().setParseAction(withAttribute(type="grid"))
+        grid_expr = div_grid + SkipTo(div | div_end)("body")
+        for grid_header in grid_expr.searchString(html):
+            print(grid_header.body)
+        
+        # construct a match with any div tag having a type attribute, regardless of the value
+        div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE))
+        div_expr = div_any_type + SkipTo(div | div_end)("body")
+        for div_header in div_expr.searchString(html):
+            print(div_header.body)
+    prints::
+        1 4 0 1 0
+
+        1 4 0 1 0
+        1,3 2,3 1,1
+    """
+    if args:
+        attrs = args[:]
+    else:
+        attrs = attrDict.items()
+    attrs = [(k,v) for k,v in attrs]
+    def pa(s,l,tokens):
+        for attrName,attrValue in attrs:
+            if attrName not in tokens:
+                raise ParseException(s,l,"no matching attribute " + attrName)
+            if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue:
+                raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" %
+                                            (attrName, tokens[attrName], attrValue))
+    return pa
+withAttribute.ANY_VALUE = object()
+
+def withClass(classname, namespace=''):
+    """
+    Simplified version of C{L{withAttribute}} when matching on a div class - made
+    difficult because C{class} is a reserved word in Python.
+
+    Example::
+        html = '''
+            <div>
+            Some text
+            <div class="grid">1 4 0 1 0</div>
+            <div class="graph">1,3 2,3 1,1</div>
+            <div>this &lt;div&gt; has no class</div>
+            </div>
+                
+        '''
+        div,div_end = makeHTMLTags("div")
+        div_grid = div().setParseAction(withClass("grid"))
+        
+        grid_expr = div_grid + SkipTo(div | div_end)("body")
+        for grid_header in grid_expr.searchString(html):
+            print(grid_header.body)
+        
+        div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE))
+        div_expr = div_any_type + SkipTo(div | div_end)("body")
+        for div_header in div_expr.searchString(html):
+            print(div_header.body)
+    prints::
+        1 4 0 1 0
+
+        1 4 0 1 0
+        1,3 2,3 1,1
+    """
+    classattr = "%s:class" % namespace if namespace else "class"
+    return withAttribute(**{classattr : classname})        
+
+opAssoc = _Constants()
+opAssoc.LEFT = object()
+opAssoc.RIGHT = object()
+
+def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ):
+    """
+    Helper method for constructing grammars of expressions made up of
+    operators working in a precedence hierarchy.  Operators may be unary or
+    binary, left- or right-associative.  Parse actions can also be attached
+    to operator expressions. The generated parser will also recognize the use 
+    of parentheses to override operator precedences (see example below).
+    
+    Note: if you define a deep operator list, you may see performance issues
+    when using infixNotation. See L{ParserElement.enablePackrat} for a
+    mechanism to potentially improve your parser performance.
+
+    Parameters:
+     - baseExpr - expression representing the most basic element for the nested
+     - opList - list of tuples, one for each operator precedence level in the
+      expression grammar; each tuple is of the form
+      (opExpr, numTerms, rightLeftAssoc, parseAction), where:
+       - opExpr is the pyparsing expression for the operator;
+          may also be a string, which will be converted to a Literal;
+          if numTerms is 3, opExpr is a tuple of two expressions, for the
+          two operators separating the 3 terms
+       - numTerms is the number of terms for this operator (must
+          be 1, 2, or 3)
+       - rightLeftAssoc is the indicator whether the operator is
+          right or left associative, using the pyparsing-defined
+          constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}.
+       - parseAction is the parse action to be associated with
+          expressions matching this operator expression (the
+          parse action tuple member may be omitted)
+     - lpar - expression for matching left-parentheses (default=C{Suppress('(')})
+     - rpar - expression for matching right-parentheses (default=C{Suppress(')')})
+
+    Example::
+        # simple example of four-function arithmetic with ints and variable names
+        integer = pyparsing_common.signed_integer
+        varname = pyparsing_common.identifier 
+        
+        arith_expr = infixNotation(integer | varname,
+            [
+            ('-', 1, opAssoc.RIGHT),
+            (oneOf('* /'), 2, opAssoc.LEFT),
+            (oneOf('+ -'), 2, opAssoc.LEFT),
+            ])
+        
+        arith_expr.runTests('''
+            5+3*6
+            (5+3)*6
+            -2--11
+            ''', fullDump=False)
+    prints::
+        5+3*6
+        [[5, '+', [3, '*', 6]]]
+
+        (5+3)*6
+        [[[5, '+', 3], '*', 6]]
+
+        -2--11
+        [[['-', 2], '-', ['-', 11]]]
+    """
+    ret = Forward()
+    lastExpr = baseExpr | ( lpar + ret + rpar )
+    for i,operDef in enumerate(opList):
+        opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4]
+        termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr
+        if arity == 3:
+            if opExpr is None or len(opExpr) != 2:
+                raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions")
+            opExpr1, opExpr2 = opExpr
+        thisExpr = Forward().setName(termName)
+        if rightLeftAssoc == opAssoc.LEFT:
+            if arity == 1:
+                matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) )
+            elif arity == 2:
+                if opExpr is not None:
+                    matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) )
+                else:
+                    matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) )
+            elif arity == 3:
+                matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \
+                            Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr )
+            else:
+                raise ValueError("operator must be unary (1), binary (2), or ternary (3)")
+        elif rightLeftAssoc == opAssoc.RIGHT:
+            if arity == 1:
+                # try to avoid LR with this extra test
+                if not isinstance(opExpr, Optional):
+                    opExpr = Optional(opExpr)
+                matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr )
+            elif arity == 2:
+                if opExpr is not None:
+                    matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) )
+                else:
+                    matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) )
+            elif arity == 3:
+                matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \
+                            Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr )
+            else:
+                raise ValueError("operator must be unary (1), binary (2), or ternary (3)")
+        else:
+            raise ValueError("operator must indicate right or left associativity")
+        if pa:
+            matchExpr.setParseAction( pa )
+        thisExpr <<= ( matchExpr.setName(termName) | lastExpr )
+        lastExpr = thisExpr
+    ret <<= lastExpr
+    return ret
+
+operatorPrecedence = infixNotation
+"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release."""
+
+dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes")
+sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes")
+quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'|
+                       Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes")
+unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal")
+
+def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()):
+    """
+    Helper method for defining nested lists enclosed in opening and closing
+    delimiters ("(" and ")" are the default).
+
+    Parameters:
+     - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression
+     - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression
+     - content - expression for items within the nested lists (default=C{None})
+     - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString})
+
+    If an expression is not provided for the content argument, the nested
+    expression will capture all whitespace-delimited content between delimiters
+    as a list of separate values.
+
+    Use the C{ignoreExpr} argument to define expressions that may contain
+    opening or closing characters that should not be treated as opening
+    or closing characters for nesting, such as quotedString or a comment
+    expression.  Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}.
+    The default is L{quotedString}, but if no expressions are to be ignored,
+    then pass C{None} for this argument.
+
+    Example::
+        data_type = oneOf("void int short long char float double")
+        decl_data_type = Combine(data_type + Optional(Word('*')))
+        ident = Word(alphas+'_', alphanums+'_')
+        number = pyparsing_common.number
+        arg = Group(decl_data_type + ident)
+        LPAR,RPAR = map(Suppress, "()")
+
+        code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment))
+
+        c_function = (decl_data_type("type") 
+                      + ident("name")
+                      + LPAR + Optional(delimitedList(arg), [])("args") + RPAR 
+                      + code_body("body"))
+        c_function.ignore(cStyleComment)
+        
+        source_code = '''
+            int is_odd(int x) { 
+                return (x%2); 
+            }
+                
+            int dec_to_hex(char hchar) { 
+                if (hchar >= '0' && hchar <= '9') { 
+                    return (ord(hchar)-ord('0')); 
+                } else { 
+                    return (10+ord(hchar)-ord('A'));
+                } 
+            }
+        '''
+        for func in c_function.searchString(source_code):
+            print("%(name)s (%(type)s) args: %(args)s" % func)
+
+    prints::
+        is_odd (int) args: [['int', 'x']]
+        dec_to_hex (int) args: [['char', 'hchar']]
+    """
+    if opener == closer:
+        raise ValueError("opening and closing strings cannot be the same")
+    if content is None:
+        if isinstance(opener,basestring) and isinstance(closer,basestring):
+            if len(opener) == 1 and len(closer)==1:
+                if ignoreExpr is not None:
+                    content = (Combine(OneOrMore(~ignoreExpr +
+                                    CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1))
+                                ).setParseAction(lambda t:t[0].strip()))
+                else:
+                    content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS
+                                ).setParseAction(lambda t:t[0].strip()))
+            else:
+                if ignoreExpr is not None:
+                    content = (Combine(OneOrMore(~ignoreExpr + 
+                                    ~Literal(opener) + ~Literal(closer) +
+                                    CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1))
+                                ).setParseAction(lambda t:t[0].strip()))
+                else:
+                    content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) +
+                                    CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1))
+                                ).setParseAction(lambda t:t[0].strip()))
+        else:
+            raise ValueError("opening and closing arguments must be strings if no content expression is given")
+    ret = Forward()
+    if ignoreExpr is not None:
+        ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) )
+    else:
+        ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content )  + Suppress(closer) )
+    ret.setName('nested %s%s expression' % (opener,closer))
+    return ret
+
+def indentedBlock(blockStatementExpr, indentStack, indent=True):
+    """
+    Helper method for defining space-delimited indentation blocks, such as
+    those used to define block statements in Python source code.
+
+    Parameters:
+     - blockStatementExpr - expression defining syntax of statement that
+            is repeated within the indented block
+     - indentStack - list created by caller to manage indentation stack
+            (multiple statementWithIndentedBlock expressions within a single grammar
+            should share a common indentStack)
+     - indent - boolean indicating whether block must be indented beyond the
+            the current level; set to False for block of left-most statements
+            (default=C{True})
+
+    A valid block must contain at least one C{blockStatement}.
+
+    Example::
+        data = '''
+        def A(z):
+          A1
+          B = 100
+          G = A2
+          A2
+          A3
+        B
+        def BB(a,b,c):
+          BB1
+          def BBA():
+            bba1
+            bba2
+            bba3
+        C
+        D
+        def spam(x,y):
+             def eggs(z):
+                 pass
+        '''
+
+
+        indentStack = [1]
+        stmt = Forward()
+
+        identifier = Word(alphas, alphanums)
+        funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":")
+        func_body = indentedBlock(stmt, indentStack)
+        funcDef = Group( funcDecl + func_body )
+
+        rvalue = Forward()
+        funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")")
+        rvalue << (funcCall | identifier | Word(nums))
+        assignment = Group(identifier + "=" + rvalue)
+        stmt << ( funcDef | assignment | identifier )
+
+        module_body = OneOrMore(stmt)
+
+        parseTree = module_body.parseString(data)
+        parseTree.pprint()
+    prints::
+        [['def',
+          'A',
+          ['(', 'z', ')'],
+          ':',
+          [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]],
+         'B',
+         ['def',
+          'BB',
+          ['(', 'a', 'b', 'c', ')'],
+          ':',
+          [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]],
+         'C',
+         'D',
+         ['def',
+          'spam',
+          ['(', 'x', 'y', ')'],
+          ':',
+          [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] 
+    """
+    def checkPeerIndent(s,l,t):
+        if l >= len(s): return
+        curCol = col(l,s)
+        if curCol != indentStack[-1]:
+            if curCol > indentStack[-1]:
+                raise ParseFatalException(s,l,"illegal nesting")
+            raise ParseException(s,l,"not a peer entry")
+
+    def checkSubIndent(s,l,t):
+        curCol = col(l,s)
+        if curCol > indentStack[-1]:
+            indentStack.append( curCol )
+        else:
+            raise ParseException(s,l,"not a subentry")
+
+    def checkUnindent(s,l,t):
+        if l >= len(s): return
+        curCol = col(l,s)
+        if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]):
+            raise ParseException(s,l,"not an unindent")
+        indentStack.pop()
+
+    NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress())
+    INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT')
+    PEER   = Empty().setParseAction(checkPeerIndent).setName('')
+    UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT')
+    if indent:
+        smExpr = Group( Optional(NL) +
+            #~ FollowedBy(blockStatementExpr) +
+            INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT)
+    else:
+        smExpr = Group( Optional(NL) +
+            (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) )
+    blockStatementExpr.ignore(_bslash + LineEnd())
+    return smExpr.setName('indented block')
+
+alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]")
+punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]")
+
+anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag'))
+_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\''))
+commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity")
+def replaceHTMLEntity(t):
+    """Helper parser action to replace common HTML entities with their special characters"""
+    return _htmlEntityMap.get(t.entity)
+
+# it's easy to get these comment structures wrong - they're very common, so may as well make them available
+cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment")
+"Comment of the form C{/* ... */}"
+
+htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment")
+"Comment of the form C{<!-- ... -->}"
+
+restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line")
+dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment")
+"Comment of the form C{// ... (to end of line)}"
+
+cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment")
+"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}"
+
+javaStyleComment = cppStyleComment
+"Same as C{L{cppStyleComment}}"
+
+pythonStyleComment = Regex(r"#.*").setName("Python style comment")
+"Comment of the form C{# ... (to end of line)}"
+
+_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') +
+                                  Optional( Word(" \t") +
+                                            ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem")
+commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList")
+"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas.
+   This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}."""
+
+# some other useful expressions - using lower-case class name since we are really using this as a namespace
+class pyparsing_common:
+    """
+    Here are some common low-level expressions that may be useful in jump-starting parser development:
+     - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>})
+     - common L{programming identifiers<identifier>}
+     - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>})
+     - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>}
+     - L{UUID<uuid>}
+     - L{comma-separated list<comma_separated_list>}
+    Parse actions:
+     - C{L{convertToInteger}}
+     - C{L{convertToFloat}}
+     - C{L{convertToDate}}
+     - C{L{convertToDatetime}}
+     - C{L{stripHTMLTags}}
+     - C{L{upcaseTokens}}
+     - C{L{downcaseTokens}}
+
+    Example::
+        pyparsing_common.number.runTests('''
+            # any int or real number, returned as the appropriate type
+            100
+            -100
+            +100
+            3.14159
+            6.02e23
+            1e-12
+            ''')
+
+        pyparsing_common.fnumber.runTests('''
+            # any int or real number, returned as float
+            100
+            -100
+            +100
+            3.14159
+            6.02e23
+            1e-12
+            ''')
+
+        pyparsing_common.hex_integer.runTests('''
+            # hex numbers
+            100
+            FF
+            ''')
+
+        pyparsing_common.fraction.runTests('''
+            # fractions
+            1/2
+            -3/4
+            ''')
+
+        pyparsing_common.mixed_integer.runTests('''
+            # mixed fractions
+            1
+            1/2
+            -3/4
+            1-3/4
+            ''')
+
+        import uuid
+        pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID))
+        pyparsing_common.uuid.runTests('''
+            # uuid
+            12345678-1234-5678-1234-567812345678
+            ''')
+    prints::
+        # any int or real number, returned as the appropriate type
+        100
+        [100]
+
+        -100
+        [-100]
+
+        +100
+        [100]
+
+        3.14159
+        [3.14159]
+
+        6.02e23
+        [6.02e+23]
+
+        1e-12
+        [1e-12]
+
+        # any int or real number, returned as float
+        100
+        [100.0]
+
+        -100
+        [-100.0]
+
+        +100
+        [100.0]
+
+        3.14159
+        [3.14159]
+
+        6.02e23
+        [6.02e+23]
+
+        1e-12
+        [1e-12]
+
+        # hex numbers
+        100
+        [256]
+
+        FF
+        [255]
+
+        # fractions
+        1/2
+        [0.5]
+
+        -3/4
+        [-0.75]
+
+        # mixed fractions
+        1
+        [1]
+
+        1/2
+        [0.5]
+
+        -3/4
+        [-0.75]
+
+        1-3/4
+        [1.75]
+
+        # uuid
+        12345678-1234-5678-1234-567812345678
+        [UUID('12345678-1234-5678-1234-567812345678')]
+    """
+
+    convertToInteger = tokenMap(int)
+    """
+    Parse action for converting parsed integers to Python int
+    """
+
+    convertToFloat = tokenMap(float)
+    """
+    Parse action for converting parsed numbers to Python float
+    """
+
+    integer = Word(nums).setName("integer").setParseAction(convertToInteger)
+    """expression that parses an unsigned integer, returns an int"""
+
+    hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16))
+    """expression that parses a hexadecimal integer, returns an int"""
+
+    signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger)
+    """expression that parses an integer with optional leading sign, returns an int"""
+
+    fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction")
+    """fractional expression of an integer divided by an integer, returns a float"""
+    fraction.addParseAction(lambda t: t[0]/t[-1])
+
+    mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction")
+    """mixed integer of the form 'integer - fraction', with optional leading integer, returns float"""
+    mixed_integer.addParseAction(sum)
+
+    real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat)
+    """expression that parses a floating point number and returns a float"""
+
+    sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat)
+    """expression that parses a floating point number with optional scientific notation and returns a float"""
+
+    # streamlining this expression makes the docs nicer-looking
+    number = (sci_real | real | signed_integer).streamline()
+    """any numeric expression, returns the corresponding Python type"""
+
+    fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat)
+    """any int or real number, returned as float"""
+    
+    identifier = Word(alphas+'_', alphanums+'_').setName("identifier")
+    """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')"""
+    
+    ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address")
+    "IPv4 address (C{0.0.0.0 - 255.255.255.255})"
+
+    _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer")
+    _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address")
+    _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address")
+    _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8)
+    _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address")
+    ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address")
+    "IPv6 address (long, short, or mixed form)"
+    
+    mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address")
+    "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)"
+
+    @staticmethod
+    def convertToDate(fmt="%Y-%m-%d"):
+        """
+        Helper to create a parse action for converting parsed date string to Python datetime.date
+
+        Params -
+         - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"})
+
+        Example::
+            date_expr = pyparsing_common.iso8601_date.copy()
+            date_expr.setParseAction(pyparsing_common.convertToDate())
+            print(date_expr.parseString("1999-12-31"))
+        prints::
+            [datetime.date(1999, 12, 31)]
+        """
+        def cvt_fn(s,l,t):
+            try:
+                return datetime.strptime(t[0], fmt).date()
+            except ValueError as ve:
+                raise ParseException(s, l, str(ve))
+        return cvt_fn
+
+    @staticmethod
+    def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"):
+        """
+        Helper to create a parse action for converting parsed datetime string to Python datetime.datetime
+
+        Params -
+         - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"})
+
+        Example::
+            dt_expr = pyparsing_common.iso8601_datetime.copy()
+            dt_expr.setParseAction(pyparsing_common.convertToDatetime())
+            print(dt_expr.parseString("1999-12-31T23:59:59.999"))
+        prints::
+            [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)]
+        """
+        def cvt_fn(s,l,t):
+            try:
+                return datetime.strptime(t[0], fmt)
+            except ValueError as ve:
+                raise ParseException(s, l, str(ve))
+        return cvt_fn
+
+    iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date")
+    "ISO8601 date (C{yyyy-mm-dd})"
+
+    iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime")
+    "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}"
+
+    uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID")
+    "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})"
+
+    _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress()
+    @staticmethod
+    def stripHTMLTags(s, l, tokens):
+        """
+        Parse action to remove HTML tags from web page HTML source
+
+        Example::
+            # strip HTML links from normal text 
+            text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>'
+            td,td_end = makeHTMLTags("TD")
+            table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end
+            
+            print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page'
+        """
+        return pyparsing_common._html_stripper.transformString(tokens[0])
+
+    _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') 
+                                        + Optional( White(" \t") ) ) ).streamline().setName("commaItem")
+    comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list")
+    """Predefined expression of 1 or more printable words or quoted strings, separated by commas."""
+
+    upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper()))
+    """Parse action to convert tokens to upper case."""
+
+    downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower()))
+    """Parse action to convert tokens to lower case."""
+
+
+if __name__ == "__main__":
+
+    selectToken    = CaselessLiteral("select")
+    fromToken      = CaselessLiteral("from")
+
+    ident          = Word(alphas, alphanums + "_$")
+
+    columnName     = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens)
+    columnNameList = Group(delimitedList(columnName)).setName("columns")
+    columnSpec     = ('*' | columnNameList)
+
+    tableName      = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens)
+    tableNameList  = Group(delimitedList(tableName)).setName("tables")
+    
+    simpleSQL      = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables")
+
+    # demo runTests method, including embedded comments in test string
+    simpleSQL.runTests("""
+        # '*' as column list and dotted table name
+        select * from SYS.XYZZY
+
+        # caseless match on "SELECT", and casts back to "select"
+        SELECT * from XYZZY, ABC
+
+        # list of column names, and mixed case SELECT keyword
+        Select AA,BB,CC from Sys.dual
+
+        # multiple tables
+        Select A, B, C from Sys.dual, Table2
+
+        # invalid SELECT keyword - should fail
+        Xelect A, B, C from Sys.dual
+
+        # incomplete command - should fail
+        Select
+
+        # invalid column name - should fail
+        Select ^^^ frox Sys.dual
+
+        """)
+
+    pyparsing_common.number.runTests("""
+        100
+        -100
+        +100
+        3.14159
+        6.02e23
+        1e-12
+        """)
+
+    # any int or real number, returned as float
+    pyparsing_common.fnumber.runTests("""
+        100
+        -100
+        +100
+        3.14159
+        6.02e23
+        1e-12
+        """)
+
+    pyparsing_common.hex_integer.runTests("""
+        100
+        FF
+        """)
+
+    import uuid
+    pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID))
+    pyparsing_common.uuid.runTests("""
+        12345678-1234-5678-1234-567812345678
+        """)
diff --git a/vendor/pip-9.0.3/pip/_vendor/re-vendor.py b/vendor/pip-9.0.3/pip/_vendor/re-vendor.py
new file mode 100644
index 0000000000000000000000000000000000000000..0a52123e4f248648117bc4599da04dd4634e5253
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/re-vendor.py
@@ -0,0 +1,34 @@
+import os
+import sys
+import pip
+import glob
+import shutil
+
+here = os.path.abspath(os.path.dirname(__file__))
+
+def usage():
+    print("Usage: re-vendor.py [clean|vendor]")
+    sys.exit(1)
+
+def clean():
+    for fn in os.listdir(here):
+        dirname = os.path.join(here, fn)
+        if os.path.isdir(dirname):
+            shutil.rmtree(dirname)
+    # six is a single file, not a package
+    os.unlink(os.path.join(here, 'six.py'))
+
+def vendor():
+    pip.main(['install', '-t', here, '-r', 'vendor.txt'])
+    for dirname in glob.glob('*.egg-info'):
+        shutil.rmtree(dirname)
+
+if __name__ == '__main__':
+    if len(sys.argv) != 2:
+        usage()
+    if sys.argv[1] == 'clean':
+        clean()
+    elif sys.argv[1] == 'vendor':
+        vendor()
+    else:
+        usage()
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/__init__.py b/vendor/pip-9.0.3/pip/_vendor/requests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..d679f2f93aa42455eadc14d161b511b1398871c3
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/__init__.py
@@ -0,0 +1,121 @@
+# -*- coding: utf-8 -*-
+
+#   __
+#  /__)  _  _     _   _ _/   _
+# / (   (- (/ (/ (- _)  /  _)
+#          /
+
+"""
+Requests HTTP Library
+~~~~~~~~~~~~~~~~~~~~~
+
+Requests is an HTTP library, written in Python, for human beings. Basic GET
+usage:
+
+   >>> import requests
+   >>> r = requests.get('https://www.python.org')
+   >>> r.status_code
+   200
+   >>> 'Python is a programming language' in r.content
+   True
+
+... or POST:
+
+   >>> payload = dict(key1='value1', key2='value2')
+   >>> r = requests.post('http://httpbin.org/post', data=payload)
+   >>> print(r.text)
+   {
+     ...
+     "form": {
+       "key2": "value2",
+       "key1": "value1"
+     },
+     ...
+   }
+
+The other HTTP methods are supported - see `requests.api`. Full documentation
+is at <http://python-requests.org>.
+
+:copyright: (c) 2017 by Kenneth Reitz.
+:license: Apache 2.0, see LICENSE for more details.
+"""
+
+from pip._vendor import urllib3
+from pip._vendor import chardet
+import warnings
+from .exceptions import RequestsDependencyWarning
+
+
+def check_compatibility(urllib3_version, chardet_version):
+    urllib3_version = urllib3_version.split('.')
+    assert urllib3_version != ['dev']  # Verify urllib3 isn't installed from git.
+
+    # Sometimes, urllib3 only reports its version as 16.1.
+    if len(urllib3_version) == 2:
+        urllib3_version.append('0')
+
+    # Check urllib3 for compatibility.
+    major, minor, patch = urllib3_version  # noqa: F811
+    major, minor, patch = int(major), int(minor), int(patch)
+    # urllib3 >= 1.21.1, <= 1.22
+    assert major == 1
+    assert minor >= 21
+    assert minor <= 22
+
+    # Check chardet for compatibility.
+    major, minor, patch = chardet_version.split('.')[:3]
+    major, minor, patch = int(major), int(minor), int(patch)
+    # chardet >= 3.0.2, < 3.1.0
+    assert major == 3
+    assert minor < 1
+    assert patch >= 2
+
+
+# Check imported dependencies for compatibility.
+try:
+    check_compatibility(urllib3.__version__, chardet.__version__)
+except (AssertionError, ValueError):
+    warnings.warn("urllib3 ({0}) or chardet ({1}) doesn't match a supported "
+                  "version!".format(urllib3.__version__, chardet.__version__),
+                  RequestsDependencyWarning)
+
+# Attempt to enable urllib3's SNI support, if possible
+# try:
+#     from pip._vendor.urllib3.contrib import pyopenssl
+#     pyopenssl.inject_into_urllib3()
+# except ImportError:
+#     pass
+
+# urllib3's DependencyWarnings should be silenced.
+from pip._vendor.urllib3.exceptions import DependencyWarning
+warnings.simplefilter('ignore', DependencyWarning)
+
+from .__version__ import __title__, __description__, __url__, __version__
+from .__version__ import __build__, __author__, __author_email__, __license__
+from .__version__ import __copyright__, __cake__
+
+from . import utils
+from . import packages
+from .models import Request, Response, PreparedRequest
+from .api import request, get, head, post, patch, put, delete, options
+from .sessions import session, Session
+from .status_codes import codes
+from .exceptions import (
+    RequestException, Timeout, URLRequired,
+    TooManyRedirects, HTTPError, ConnectionError,
+    FileModeWarning, ConnectTimeout, ReadTimeout
+)
+
+# Set default logging handler to avoid "No handler found" warnings.
+import logging
+try:  # Python 2.7+
+    from logging import NullHandler
+except ImportError:
+    class NullHandler(logging.Handler):
+        def emit(self, record):
+            pass
+
+logging.getLogger(__name__).addHandler(NullHandler())
+
+# FileModeWarnings go off per the default.
+warnings.simplefilter('default', FileModeWarning, append=True)
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/__version__.py b/vendor/pip-9.0.3/pip/_vendor/requests/__version__.py
new file mode 100644
index 0000000000000000000000000000000000000000..dc33eef651134203a7b98323015f606bbacdbbbb
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/__version__.py
@@ -0,0 +1,14 @@
+# .-. .-. .-. . . .-. .-. .-. .-.
+# |(  |-  |.| | | |-  `-.  |  `-.
+# ' ' `-' `-`.`-' `-' `-'  '  `-'
+
+__title__ = 'requests'
+__description__ = 'Python HTTP for Humans.'
+__url__ = 'http://python-requests.org'
+__version__ = '2.18.4'
+__build__ = 0x021804
+__author__ = 'Kenneth Reitz'
+__author_email__ = 'me@kennethreitz.org'
+__license__ = 'Apache 2.0'
+__copyright__ = 'Copyright 2017 Kenneth Reitz'
+__cake__ = u'\u2728 \U0001f370 \u2728'
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/_internal_utils.py b/vendor/pip-9.0.3/pip/_vendor/requests/_internal_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..759d9a56ba0102bb3b7b3abfcfae6731a2ecc243
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/_internal_utils.py
@@ -0,0 +1,42 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests._internal_utils
+~~~~~~~~~~~~~~
+
+Provides utility functions that are consumed internally by Requests
+which depend on extremely few external helpers (such as compat)
+"""
+
+from .compat import is_py2, builtin_str, str
+
+
+def to_native_string(string, encoding='ascii'):
+    """Given a string object, regardless of type, returns a representation of
+    that string in the native string type, encoding and decoding where
+    necessary. This assumes ASCII unless told otherwise.
+    """
+    if isinstance(string, builtin_str):
+        out = string
+    else:
+        if is_py2:
+            out = string.encode(encoding)
+        else:
+            out = string.decode(encoding)
+
+    return out
+
+
+def unicode_is_ascii(u_string):
+    """Determine if unicode string only contains ASCII characters.
+
+    :param str u_string: unicode string to check. Must be unicode
+        and not Python 2 `str`.
+    :rtype: bool
+    """
+    assert isinstance(u_string, str)
+    try:
+        u_string.encode('ascii')
+        return True
+    except UnicodeEncodeError:
+        return False
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/adapters.py b/vendor/pip-9.0.3/pip/_vendor/requests/adapters.py
new file mode 100644
index 0000000000000000000000000000000000000000..57876383c8baa2b4926e9b2792fe18744fd8b8d1
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/adapters.py
@@ -0,0 +1,525 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.adapters
+~~~~~~~~~~~~~~~~~
+
+This module contains the transport adapters that Requests uses to define
+and maintain connections.
+"""
+
+import os.path
+import socket
+
+from pip._vendor.urllib3.poolmanager import PoolManager, proxy_from_url
+from pip._vendor.urllib3.response import HTTPResponse
+from pip._vendor.urllib3.util import Timeout as TimeoutSauce
+from pip._vendor.urllib3.util.retry import Retry
+from pip._vendor.urllib3.exceptions import ClosedPoolError
+from pip._vendor.urllib3.exceptions import ConnectTimeoutError
+from pip._vendor.urllib3.exceptions import HTTPError as _HTTPError
+from pip._vendor.urllib3.exceptions import MaxRetryError
+from pip._vendor.urllib3.exceptions import NewConnectionError
+from pip._vendor.urllib3.exceptions import ProxyError as _ProxyError
+from pip._vendor.urllib3.exceptions import ProtocolError
+from pip._vendor.urllib3.exceptions import ReadTimeoutError
+from pip._vendor.urllib3.exceptions import SSLError as _SSLError
+from pip._vendor.urllib3.exceptions import ResponseError
+
+from .models import Response
+from .compat import urlparse, basestring
+from .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers,
+                    prepend_scheme_if_needed, get_auth_from_url, urldefragauth,
+                    select_proxy)
+from .structures import CaseInsensitiveDict
+from .cookies import extract_cookies_to_jar
+from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError,
+                         ProxyError, RetryError, InvalidSchema)
+from .auth import _basic_auth_str
+
+try:
+    from pip._vendor.urllib3.contrib.socks import SOCKSProxyManager
+except ImportError:
+    def SOCKSProxyManager(*args, **kwargs):
+        raise InvalidSchema("Missing dependencies for SOCKS support.")
+
+DEFAULT_POOLBLOCK = False
+DEFAULT_POOLSIZE = 10
+DEFAULT_RETRIES = 0
+DEFAULT_POOL_TIMEOUT = None
+
+
+class BaseAdapter(object):
+    """The Base Transport Adapter"""
+
+    def __init__(self):
+        super(BaseAdapter, self).__init__()
+
+    def send(self, request, stream=False, timeout=None, verify=True,
+             cert=None, proxies=None):
+        """Sends PreparedRequest object. Returns Response object.
+
+        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
+        :param stream: (optional) Whether to stream the request content.
+        :param timeout: (optional) How long to wait for the server to send
+            data before giving up, as a float, or a :ref:`(connect timeout,
+            read timeout) <timeouts>` tuple.
+        :type timeout: float or tuple
+        :param verify: (optional) Either a boolean, in which case it controls whether we verify
+            the server's TLS certificate, or a string, in which case it must be a path
+            to a CA bundle to use
+        :param cert: (optional) Any user-provided SSL certificate to be trusted.
+        :param proxies: (optional) The proxies dictionary to apply to the request.
+        """
+        raise NotImplementedError
+
+    def close(self):
+        """Cleans up adapter specific items."""
+        raise NotImplementedError
+
+
+class HTTPAdapter(BaseAdapter):
+    """The built-in HTTP Adapter for urllib3.
+
+    Provides a general-case interface for Requests sessions to contact HTTP and
+    HTTPS urls by implementing the Transport Adapter interface. This class will
+    usually be created by the :class:`Session <Session>` class under the
+    covers.
+
+    :param pool_connections: The number of urllib3 connection pools to cache.
+    :param pool_maxsize: The maximum number of connections to save in the pool.
+    :param max_retries: The maximum number of retries each connection
+        should attempt. Note, this applies only to failed DNS lookups, socket
+        connections and connection timeouts, never to requests where data has
+        made it to the server. By default, Requests does not retry failed
+        connections. If you need granular control over the conditions under
+        which we retry a request, import urllib3's ``Retry`` class and pass
+        that instead.
+    :param pool_block: Whether the connection pool should block for connections.
+
+    Usage::
+
+      >>> import requests
+      >>> s = requests.Session()
+      >>> a = requests.adapters.HTTPAdapter(max_retries=3)
+      >>> s.mount('http://', a)
+    """
+    __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize',
+                 '_pool_block']
+
+    def __init__(self, pool_connections=DEFAULT_POOLSIZE,
+                 pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES,
+                 pool_block=DEFAULT_POOLBLOCK):
+        if max_retries == DEFAULT_RETRIES:
+            self.max_retries = Retry(0, read=False)
+        else:
+            self.max_retries = Retry.from_int(max_retries)
+        self.config = {}
+        self.proxy_manager = {}
+
+        super(HTTPAdapter, self).__init__()
+
+        self._pool_connections = pool_connections
+        self._pool_maxsize = pool_maxsize
+        self._pool_block = pool_block
+
+        self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block)
+
+    def __getstate__(self):
+        return dict((attr, getattr(self, attr, None)) for attr in
+                    self.__attrs__)
+
+    def __setstate__(self, state):
+        # Can't handle by adding 'proxy_manager' to self.__attrs__ because
+        # self.poolmanager uses a lambda function, which isn't pickleable.
+        self.proxy_manager = {}
+        self.config = {}
+
+        for attr, value in state.items():
+            setattr(self, attr, value)
+
+        self.init_poolmanager(self._pool_connections, self._pool_maxsize,
+                              block=self._pool_block)
+
+    def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs):
+        """Initializes a urllib3 PoolManager.
+
+        This method should not be called from user code, and is only
+        exposed for use when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param connections: The number of urllib3 connection pools to cache.
+        :param maxsize: The maximum number of connections to save in the pool.
+        :param block: Block when no free connections are available.
+        :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager.
+        """
+        # save these values for pickling
+        self._pool_connections = connections
+        self._pool_maxsize = maxsize
+        self._pool_block = block
+
+        self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize,
+                                       block=block, strict=True, **pool_kwargs)
+
+    def proxy_manager_for(self, proxy, **proxy_kwargs):
+        """Return urllib3 ProxyManager for the given proxy.
+
+        This method should not be called from user code, and is only
+        exposed for use when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param proxy: The proxy to return a urllib3 ProxyManager for.
+        :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager.
+        :returns: ProxyManager
+        :rtype: urllib3.ProxyManager
+        """
+        if proxy in self.proxy_manager:
+            manager = self.proxy_manager[proxy]
+        elif proxy.lower().startswith('socks'):
+            username, password = get_auth_from_url(proxy)
+            manager = self.proxy_manager[proxy] = SOCKSProxyManager(
+                proxy,
+                username=username,
+                password=password,
+                num_pools=self._pool_connections,
+                maxsize=self._pool_maxsize,
+                block=self._pool_block,
+                **proxy_kwargs
+            )
+        else:
+            proxy_headers = self.proxy_headers(proxy)
+            manager = self.proxy_manager[proxy] = proxy_from_url(
+                proxy,
+                proxy_headers=proxy_headers,
+                num_pools=self._pool_connections,
+                maxsize=self._pool_maxsize,
+                block=self._pool_block,
+                **proxy_kwargs)
+
+        return manager
+
+    def cert_verify(self, conn, url, verify, cert):
+        """Verify a SSL certificate. This method should not be called from user
+        code, and is only exposed for use when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param conn: The urllib3 connection object associated with the cert.
+        :param url: The requested URL.
+        :param verify: Either a boolean, in which case it controls whether we verify
+            the server's TLS certificate, or a string, in which case it must be a path
+            to a CA bundle to use
+        :param cert: The SSL certificate to verify.
+        """
+        if url.lower().startswith('https') and verify:
+
+            cert_loc = None
+
+            # Allow self-specified cert location.
+            if verify is not True:
+                cert_loc = verify
+
+            if not cert_loc:
+                cert_loc = DEFAULT_CA_BUNDLE_PATH
+
+            if not cert_loc or not os.path.exists(cert_loc):
+                raise IOError("Could not find a suitable TLS CA certificate bundle, "
+                              "invalid path: {0}".format(cert_loc))
+
+            conn.cert_reqs = 'CERT_REQUIRED'
+
+            if not os.path.isdir(cert_loc):
+                conn.ca_certs = cert_loc
+            else:
+                conn.ca_cert_dir = cert_loc
+        else:
+            conn.cert_reqs = 'CERT_NONE'
+            conn.ca_certs = None
+            conn.ca_cert_dir = None
+
+        if cert:
+            if not isinstance(cert, basestring):
+                conn.cert_file = cert[0]
+                conn.key_file = cert[1]
+            else:
+                conn.cert_file = cert
+                conn.key_file = None
+            if conn.cert_file and not os.path.exists(conn.cert_file):
+                raise IOError("Could not find the TLS certificate file, "
+                              "invalid path: {0}".format(conn.cert_file))
+            if conn.key_file and not os.path.exists(conn.key_file):
+                raise IOError("Could not find the TLS key file, "
+                              "invalid path: {0}".format(conn.key_file))
+
+    def build_response(self, req, resp):
+        """Builds a :class:`Response <requests.Response>` object from a urllib3
+        response. This should not be called from user code, and is only exposed
+        for use when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`
+
+        :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response.
+        :param resp: The urllib3 response object.
+        :rtype: requests.Response
+        """
+        response = Response()
+
+        # Fallback to None if there's no status_code, for whatever reason.
+        response.status_code = getattr(resp, 'status', None)
+
+        # Make headers case-insensitive.
+        response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {}))
+
+        # Set encoding.
+        response.encoding = get_encoding_from_headers(response.headers)
+        response.raw = resp
+        response.reason = response.raw.reason
+
+        if isinstance(req.url, bytes):
+            response.url = req.url.decode('utf-8')
+        else:
+            response.url = req.url
+
+        # Add new cookies from the server.
+        extract_cookies_to_jar(response.cookies, req, resp)
+
+        # Give the Response some context.
+        response.request = req
+        response.connection = self
+
+        return response
+
+    def get_connection(self, url, proxies=None):
+        """Returns a urllib3 connection for the given URL. This should not be
+        called from user code, and is only exposed for use when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param url: The URL to connect to.
+        :param proxies: (optional) A Requests-style dictionary of proxies used on this request.
+        :rtype: urllib3.ConnectionPool
+        """
+        proxy = select_proxy(url, proxies)
+
+        if proxy:
+            proxy = prepend_scheme_if_needed(proxy, 'http')
+            proxy_manager = self.proxy_manager_for(proxy)
+            conn = proxy_manager.connection_from_url(url)
+        else:
+            # Only scheme should be lower case
+            parsed = urlparse(url)
+            url = parsed.geturl()
+            conn = self.poolmanager.connection_from_url(url)
+
+        return conn
+
+    def close(self):
+        """Disposes of any internal state.
+
+        Currently, this closes the PoolManager and any active ProxyManager,
+        which closes any pooled connections.
+        """
+        self.poolmanager.clear()
+        for proxy in self.proxy_manager.values():
+            proxy.clear()
+
+    def request_url(self, request, proxies):
+        """Obtain the url to use when making the final request.
+
+        If the message is being sent through a HTTP proxy, the full URL has to
+        be used. Otherwise, we should only use the path portion of the URL.
+
+        This should not be called from user code, and is only exposed for use
+        when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
+        :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs.
+        :rtype: str
+        """
+        proxy = select_proxy(request.url, proxies)
+        scheme = urlparse(request.url).scheme
+
+        is_proxied_http_request = (proxy and scheme != 'https')
+        using_socks_proxy = False
+        if proxy:
+            proxy_scheme = urlparse(proxy).scheme.lower()
+            using_socks_proxy = proxy_scheme.startswith('socks')
+
+        url = request.path_url
+        if is_proxied_http_request and not using_socks_proxy:
+            url = urldefragauth(request.url)
+
+        return url
+
+    def add_headers(self, request, **kwargs):
+        """Add any headers needed by the connection. As of v2.0 this does
+        nothing by default, but is left for overriding by users that subclass
+        the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        This should not be called from user code, and is only exposed for use
+        when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to.
+        :param kwargs: The keyword arguments from the call to send().
+        """
+        pass
+
+    def proxy_headers(self, proxy):
+        """Returns a dictionary of the headers to add to any request sent
+        through a proxy. This works with urllib3 magic to ensure that they are
+        correctly sent to the proxy, rather than in a tunnelled request if
+        CONNECT is being used.
+
+        This should not be called from user code, and is only exposed for use
+        when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param proxies: The url of the proxy being used for this request.
+        :rtype: dict
+        """
+        headers = {}
+        username, password = get_auth_from_url(proxy)
+
+        if username:
+            headers['Proxy-Authorization'] = _basic_auth_str(username,
+                                                             password)
+
+        return headers
+
+    def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None):
+        """Sends PreparedRequest object. Returns Response object.
+
+        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
+        :param stream: (optional) Whether to stream the request content.
+        :param timeout: (optional) How long to wait for the server to send
+            data before giving up, as a float, or a :ref:`(connect timeout,
+            read timeout) <timeouts>` tuple.
+        :type timeout: float or tuple or urllib3 Timeout object
+        :param verify: (optional) Either a boolean, in which case it controls whether
+            we verify the server's TLS certificate, or a string, in which case it
+            must be a path to a CA bundle to use
+        :param cert: (optional) Any user-provided SSL certificate to be trusted.
+        :param proxies: (optional) The proxies dictionary to apply to the request.
+        :rtype: requests.Response
+        """
+
+        conn = self.get_connection(request.url, proxies)
+
+        self.cert_verify(conn, request.url, verify, cert)
+        url = self.request_url(request, proxies)
+        self.add_headers(request)
+
+        chunked = not (request.body is None or 'Content-Length' in request.headers)
+
+        if isinstance(timeout, tuple):
+            try:
+                connect, read = timeout
+                timeout = TimeoutSauce(connect=connect, read=read)
+            except ValueError as e:
+                # this may raise a string formatting error.
+                err = ("Invalid timeout {0}. Pass a (connect, read) "
+                       "timeout tuple, or a single float to set "
+                       "both timeouts to the same value".format(timeout))
+                raise ValueError(err)
+        elif isinstance(timeout, TimeoutSauce):
+            pass
+        else:
+            timeout = TimeoutSauce(connect=timeout, read=timeout)
+
+        try:
+            if not chunked:
+                resp = conn.urlopen(
+                    method=request.method,
+                    url=url,
+                    body=request.body,
+                    headers=request.headers,
+                    redirect=False,
+                    assert_same_host=False,
+                    preload_content=False,
+                    decode_content=False,
+                    retries=self.max_retries,
+                    timeout=timeout
+                )
+
+            # Send the request.
+            else:
+                if hasattr(conn, 'proxy_pool'):
+                    conn = conn.proxy_pool
+
+                low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT)
+
+                try:
+                    low_conn.putrequest(request.method,
+                                        url,
+                                        skip_accept_encoding=True)
+
+                    for header, value in request.headers.items():
+                        low_conn.putheader(header, value)
+
+                    low_conn.endheaders()
+
+                    for i in request.body:
+                        low_conn.send(hex(len(i))[2:].encode('utf-8'))
+                        low_conn.send(b'\r\n')
+                        low_conn.send(i)
+                        low_conn.send(b'\r\n')
+                    low_conn.send(b'0\r\n\r\n')
+
+                    # Receive the response from the server
+                    try:
+                        # For Python 2.7+ versions, use buffering of HTTP
+                        # responses
+                        r = low_conn.getresponse(buffering=True)
+                    except TypeError:
+                        # For compatibility with Python 2.6 versions and back
+                        r = low_conn.getresponse()
+
+                    resp = HTTPResponse.from_httplib(
+                        r,
+                        pool=conn,
+                        connection=low_conn,
+                        preload_content=False,
+                        decode_content=False
+                    )
+                except:
+                    # If we hit any problems here, clean up the connection.
+                    # Then, reraise so that we can handle the actual exception.
+                    low_conn.close()
+                    raise
+
+        except (ProtocolError, socket.error) as err:
+            raise ConnectionError(err, request=request)
+
+        except MaxRetryError as e:
+            if isinstance(e.reason, ConnectTimeoutError):
+                # TODO: Remove this in 3.0.0: see #2811
+                if not isinstance(e.reason, NewConnectionError):
+                    raise ConnectTimeout(e, request=request)
+
+            if isinstance(e.reason, ResponseError):
+                raise RetryError(e, request=request)
+
+            if isinstance(e.reason, _ProxyError):
+                raise ProxyError(e, request=request)
+
+            if isinstance(e.reason, _SSLError):
+                # This branch is for urllib3 v1.22 and later.
+                raise SSLError(e, request=request)
+
+            raise ConnectionError(e, request=request)
+
+        except ClosedPoolError as e:
+            raise ConnectionError(e, request=request)
+
+        except _ProxyError as e:
+            raise ProxyError(e)
+
+        except (_SSLError, _HTTPError) as e:
+            if isinstance(e, _SSLError):
+                # This branch is for urllib3 versions earlier than v1.22
+                raise SSLError(e, request=request)
+            elif isinstance(e, ReadTimeoutError):
+                raise ReadTimeout(e, request=request)
+            else:
+                raise
+
+        return self.build_response(request, resp)
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/api.py b/vendor/pip-9.0.3/pip/_vendor/requests/api.py
new file mode 100644
index 0000000000000000000000000000000000000000..bc2115c150f2d1248820b6671111e29e2b5163a7
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/api.py
@@ -0,0 +1,152 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.api
+~~~~~~~~~~~~
+
+This module implements the Requests API.
+
+:copyright: (c) 2012 by Kenneth Reitz.
+:license: Apache2, see LICENSE for more details.
+"""
+
+from . import sessions
+
+
+def request(method, url, **kwargs):
+    """Constructs and sends a :class:`Request <Request>`.
+
+    :param method: method for the new :class:`Request` object.
+    :param url: URL for the new :class:`Request` object.
+    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
+    :param data: (optional) Dictionary or list of tuples ``[(key, value)]`` (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`.
+    :param json: (optional) json data to send in the body of the :class:`Request`.
+    :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
+    :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
+    :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload.
+        ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')``
+        or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string
+        defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers
+        to add for the file.
+    :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
+    :param timeout: (optional) How many seconds to wait for the server to send data
+        before giving up, as a float, or a :ref:`(connect timeout, read
+        timeout) <timeouts>` tuple.
+    :type timeout: float or tuple
+    :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``.
+    :type allow_redirects: bool
+    :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
+    :param verify: (optional) Either a boolean, in which case it controls whether we verify
+            the server's TLS certificate, or a string, in which case it must be a path
+            to a CA bundle to use. Defaults to ``True``.
+    :param stream: (optional) if ``False``, the response content will be immediately downloaded.
+    :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+
+    Usage::
+
+      >>> import requests
+      >>> req = requests.request('GET', 'http://httpbin.org/get')
+      <Response [200]>
+    """
+
+    # By using the 'with' statement we are sure the session is closed, thus we
+    # avoid leaving sockets open which can trigger a ResourceWarning in some
+    # cases, and look like a memory leak in others.
+    with sessions.Session() as session:
+        return session.request(method=method, url=url, **kwargs)
+
+
+def get(url, params=None, **kwargs):
+    r"""Sends a GET request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    kwargs.setdefault('allow_redirects', True)
+    return request('get', url, params=params, **kwargs)
+
+
+def options(url, **kwargs):
+    r"""Sends an OPTIONS request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    kwargs.setdefault('allow_redirects', True)
+    return request('options', url, **kwargs)
+
+
+def head(url, **kwargs):
+    r"""Sends a HEAD request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    kwargs.setdefault('allow_redirects', False)
+    return request('head', url, **kwargs)
+
+
+def post(url, data=None, json=None, **kwargs):
+    r"""Sends a POST request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`.
+    :param json: (optional) json data to send in the body of the :class:`Request`.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    return request('post', url, data=data, json=json, **kwargs)
+
+
+def put(url, data=None, **kwargs):
+    r"""Sends a PUT request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`.
+    :param json: (optional) json data to send in the body of the :class:`Request`.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    return request('put', url, data=data, **kwargs)
+
+
+def patch(url, data=None, **kwargs):
+    r"""Sends a PATCH request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`.
+    :param json: (optional) json data to send in the body of the :class:`Request`.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    return request('patch', url, data=data, **kwargs)
+
+
+def delete(url, **kwargs):
+    r"""Sends a DELETE request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    return request('delete', url, **kwargs)
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/auth.py b/vendor/pip-9.0.3/pip/_vendor/requests/auth.py
new file mode 100644
index 0000000000000000000000000000000000000000..1a182dffdd3f89a2e64e5bf6fdc288fcbbf242b0
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/auth.py
@@ -0,0 +1,293 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.auth
+~~~~~~~~~~~~~
+
+This module contains the authentication handlers for Requests.
+"""
+
+import os
+import re
+import time
+import hashlib
+import threading
+import warnings
+
+from base64 import b64encode
+
+from .compat import urlparse, str, basestring
+from .cookies import extract_cookies_to_jar
+from ._internal_utils import to_native_string
+from .utils import parse_dict_header
+
+CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded'
+CONTENT_TYPE_MULTI_PART = 'multipart/form-data'
+
+
+def _basic_auth_str(username, password):
+    """Returns a Basic Auth string."""
+
+    # "I want us to put a big-ol' comment on top of it that
+    # says that this behaviour is dumb but we need to preserve
+    # it because people are relying on it."
+    #    - Lukasa
+    #
+    # These are here solely to maintain backwards compatibility
+    # for things like ints. This will be removed in 3.0.0.
+    if not isinstance(username, basestring):
+        warnings.warn(
+            "Non-string usernames will no longer be supported in Requests "
+            "3.0.0. Please convert the object you've passed in ({0!r}) to "
+            "a string or bytes object in the near future to avoid "
+            "problems.".format(username),
+            category=DeprecationWarning,
+        )
+        username = str(username)
+
+    if not isinstance(password, basestring):
+        warnings.warn(
+            "Non-string passwords will no longer be supported in Requests "
+            "3.0.0. Please convert the object you've passed in ({0!r}) to "
+            "a string or bytes object in the near future to avoid "
+            "problems.".format(password),
+            category=DeprecationWarning,
+        )
+        password = str(password)
+    # -- End Removal --
+
+    if isinstance(username, str):
+        username = username.encode('latin1')
+
+    if isinstance(password, str):
+        password = password.encode('latin1')
+
+    authstr = 'Basic ' + to_native_string(
+        b64encode(b':'.join((username, password))).strip()
+    )
+
+    return authstr
+
+
+class AuthBase(object):
+    """Base class that all auth implementations derive from"""
+
+    def __call__(self, r):
+        raise NotImplementedError('Auth hooks must be callable.')
+
+
+class HTTPBasicAuth(AuthBase):
+    """Attaches HTTP Basic Authentication to the given Request object."""
+
+    def __init__(self, username, password):
+        self.username = username
+        self.password = password
+
+    def __eq__(self, other):
+        return all([
+            self.username == getattr(other, 'username', None),
+            self.password == getattr(other, 'password', None)
+        ])
+
+    def __ne__(self, other):
+        return not self == other
+
+    def __call__(self, r):
+        r.headers['Authorization'] = _basic_auth_str(self.username, self.password)
+        return r
+
+
+class HTTPProxyAuth(HTTPBasicAuth):
+    """Attaches HTTP Proxy Authentication to a given Request object."""
+
+    def __call__(self, r):
+        r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password)
+        return r
+
+
+class HTTPDigestAuth(AuthBase):
+    """Attaches HTTP Digest Authentication to the given Request object."""
+
+    def __init__(self, username, password):
+        self.username = username
+        self.password = password
+        # Keep state in per-thread local storage
+        self._thread_local = threading.local()
+
+    def init_per_thread_state(self):
+        # Ensure state is initialized just once per-thread
+        if not hasattr(self._thread_local, 'init'):
+            self._thread_local.init = True
+            self._thread_local.last_nonce = ''
+            self._thread_local.nonce_count = 0
+            self._thread_local.chal = {}
+            self._thread_local.pos = None
+            self._thread_local.num_401_calls = None
+
+    def build_digest_header(self, method, url):
+        """
+        :rtype: str
+        """
+
+        realm = self._thread_local.chal['realm']
+        nonce = self._thread_local.chal['nonce']
+        qop = self._thread_local.chal.get('qop')
+        algorithm = self._thread_local.chal.get('algorithm')
+        opaque = self._thread_local.chal.get('opaque')
+        hash_utf8 = None
+
+        if algorithm is None:
+            _algorithm = 'MD5'
+        else:
+            _algorithm = algorithm.upper()
+        # lambdas assume digest modules are imported at the top level
+        if _algorithm == 'MD5' or _algorithm == 'MD5-SESS':
+            def md5_utf8(x):
+                if isinstance(x, str):
+                    x = x.encode('utf-8')
+                return hashlib.md5(x).hexdigest()
+            hash_utf8 = md5_utf8
+        elif _algorithm == 'SHA':
+            def sha_utf8(x):
+                if isinstance(x, str):
+                    x = x.encode('utf-8')
+                return hashlib.sha1(x).hexdigest()
+            hash_utf8 = sha_utf8
+
+        KD = lambda s, d: hash_utf8("%s:%s" % (s, d))
+
+        if hash_utf8 is None:
+            return None
+
+        # XXX not implemented yet
+        entdig = None
+        p_parsed = urlparse(url)
+        #: path is request-uri defined in RFC 2616 which should not be empty
+        path = p_parsed.path or "/"
+        if p_parsed.query:
+            path += '?' + p_parsed.query
+
+        A1 = '%s:%s:%s' % (self.username, realm, self.password)
+        A2 = '%s:%s' % (method, path)
+
+        HA1 = hash_utf8(A1)
+        HA2 = hash_utf8(A2)
+
+        if nonce == self._thread_local.last_nonce:
+            self._thread_local.nonce_count += 1
+        else:
+            self._thread_local.nonce_count = 1
+        ncvalue = '%08x' % self._thread_local.nonce_count
+        s = str(self._thread_local.nonce_count).encode('utf-8')
+        s += nonce.encode('utf-8')
+        s += time.ctime().encode('utf-8')
+        s += os.urandom(8)
+
+        cnonce = (hashlib.sha1(s).hexdigest()[:16])
+        if _algorithm == 'MD5-SESS':
+            HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce))
+
+        if not qop:
+            respdig = KD(HA1, "%s:%s" % (nonce, HA2))
+        elif qop == 'auth' or 'auth' in qop.split(','):
+            noncebit = "%s:%s:%s:%s:%s" % (
+                nonce, ncvalue, cnonce, 'auth', HA2
+            )
+            respdig = KD(HA1, noncebit)
+        else:
+            # XXX handle auth-int.
+            return None
+
+        self._thread_local.last_nonce = nonce
+
+        # XXX should the partial digests be encoded too?
+        base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \
+               'response="%s"' % (self.username, realm, nonce, path, respdig)
+        if opaque:
+            base += ', opaque="%s"' % opaque
+        if algorithm:
+            base += ', algorithm="%s"' % algorithm
+        if entdig:
+            base += ', digest="%s"' % entdig
+        if qop:
+            base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce)
+
+        return 'Digest %s' % (base)
+
+    def handle_redirect(self, r, **kwargs):
+        """Reset num_401_calls counter on redirects."""
+        if r.is_redirect:
+            self._thread_local.num_401_calls = 1
+
+    def handle_401(self, r, **kwargs):
+        """
+        Takes the given response and tries digest-auth, if needed.
+
+        :rtype: requests.Response
+        """
+
+        # If response is not 4xx, do not auth
+        # See https://github.com/requests/requests/issues/3772
+        if not 400 <= r.status_code < 500:
+            self._thread_local.num_401_calls = 1
+            return r
+
+        if self._thread_local.pos is not None:
+            # Rewind the file position indicator of the body to where
+            # it was to resend the request.
+            r.request.body.seek(self._thread_local.pos)
+        s_auth = r.headers.get('www-authenticate', '')
+
+        if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2:
+
+            self._thread_local.num_401_calls += 1
+            pat = re.compile(r'digest ', flags=re.IGNORECASE)
+            self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1))
+
+            # Consume content and release the original connection
+            # to allow our new request to reuse the same one.
+            r.content
+            r.close()
+            prep = r.request.copy()
+            extract_cookies_to_jar(prep._cookies, r.request, r.raw)
+            prep.prepare_cookies(prep._cookies)
+
+            prep.headers['Authorization'] = self.build_digest_header(
+                prep.method, prep.url)
+            _r = r.connection.send(prep, **kwargs)
+            _r.history.append(r)
+            _r.request = prep
+
+            return _r
+
+        self._thread_local.num_401_calls = 1
+        return r
+
+    def __call__(self, r):
+        # Initialize per-thread state, if needed
+        self.init_per_thread_state()
+        # If we have a saved nonce, skip the 401
+        if self._thread_local.last_nonce:
+            r.headers['Authorization'] = self.build_digest_header(r.method, r.url)
+        try:
+            self._thread_local.pos = r.body.tell()
+        except AttributeError:
+            # In the case of HTTPDigestAuth being reused and the body of
+            # the previous request was a file-like object, pos has the
+            # file position of the previous body. Ensure it's set to
+            # None.
+            self._thread_local.pos = None
+        r.register_hook('response', self.handle_401)
+        r.register_hook('response', self.handle_redirect)
+        self._thread_local.num_401_calls = 1
+
+        return r
+
+    def __eq__(self, other):
+        return all([
+            self.username == getattr(other, 'username', None),
+            self.password == getattr(other, 'password', None)
+        ])
+
+    def __ne__(self, other):
+        return not self == other
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/cacert.pem b/vendor/pip-9.0.3/pip/_vendor/requests/cacert.pem
new file mode 100644
index 0000000000000000000000000000000000000000..101ac98fa42d9eb4b27836e122cc81d495e33c21
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/cacert.pem
@@ -0,0 +1,4433 @@
+
+# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
+# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
+# Label: "GlobalSign Root CA"
+# Serial: 4835703278459707669005204
+# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a
+# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c
+# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
+A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
+b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
+MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
+YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
+aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
+jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
+xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
+1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
+snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
+U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
+9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
+AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
+yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
+38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
+AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
+DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
+HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
+# Label: "GlobalSign Root CA - R2"
+# Serial: 4835703278459682885658125
+# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30
+# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe
+# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
+MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
+v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
+eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
+tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
+C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
+zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
+mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
+V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
+bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
+3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
+J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
+291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
+ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
+AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Label: "Verisign Class 3 Public Primary Certification Authority - G3"
+# Serial: 206684696279472310254277870180966723415
+# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09
+# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6
+# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
+N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
+KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
+kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
+CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
+Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
+imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
+2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
+DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
+F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
+TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Label: "Entrust.net Premium 2048 Secure Server CA"
+# Serial: 946069240
+# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90
+# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31
+# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
+RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
+IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
+MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
+LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
+YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
+A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
+K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
+sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
+MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
+XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
+HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
+4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
+HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
+j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
+U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
+zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
+u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
+bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
+fF6adulZkMV8gzURZVE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
+# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
+# Label: "Baltimore CyberTrust Root"
+# Serial: 33554617
+# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4
+# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74
+# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
+DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
+ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
+VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
+mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
+IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
+mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
+XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
+dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
+jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
+BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
+DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
+9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
+jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
+Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
+ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
+R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
+# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
+# Label: "AddTrust External Root"
+# Serial: 1
+# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f
+# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68
+# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
+IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
+MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
+bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
+dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
+H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
+uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
+mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
+a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
+E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
+WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
+VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
+Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
+cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
+IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
+AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
+YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
+Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
+c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
+mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
+# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
+# Label: "Entrust Root Certification Authority"
+# Serial: 1164660820
+# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4
+# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9
+# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
+Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
+KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
+NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
+NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
+ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
+BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
+Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
+4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
+KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
+rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
+94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
+sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
+gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
+kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
+vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
+O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
+AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
+9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
+eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
+0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc.
+# Subject: CN=GeoTrust Global CA O=GeoTrust Inc.
+# Label: "GeoTrust Global CA"
+# Serial: 144470
+# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5
+# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12
+# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
+R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
+9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
+fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
+iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
+1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
+MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
+ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
+uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
+Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
+tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
+PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
+hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
+5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc.
+# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc.
+# Label: "GeoTrust Universal CA"
+# Serial: 1
+# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48
+# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79
+# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0
+IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV
+VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8
+cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT
+QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh
+F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v
+c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w
+mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd
+VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX
+teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ
+f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe
+Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+
+nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB
+/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY
+MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
+9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX
+IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn
+ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z
+uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN
+Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja
+QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW
+koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9
+ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt
+DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm
+bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
+# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
+# Label: "GeoTrust Universal CA 2"
+# Serial: 1
+# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7
+# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79
+# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD
+VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1
+c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81
+WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG
+FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq
+XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL
+se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb
+KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd
+IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73
+y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt
+hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc
+QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4
+Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV
+HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ
+KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ
+L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr
+Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo
+ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY
+T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz
+GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m
+1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV
+OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH
+6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX
+QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+
+# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association
+# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association
+# Label: "Visa eCommerce Root"
+# Serial: 25952180776285836048024890241505565794
+# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02
+# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62
+# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22
+-----BEGIN CERTIFICATE-----
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr
+MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl
+cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
+bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw
+CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h
+dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l
+cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h
+2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E
+lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV
+ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq
+299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t
+vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL
+dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
+AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF
+AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR
+zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3
+LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd
+7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw
+++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
+398znM/jra6O1I7mT1GvFpLgXPYHDw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=AAA Certificate Services O=Comodo CA Limited
+# Subject: CN=AAA Certificate Services O=Comodo CA Limited
+# Label: "Comodo AAA Services root"
+# Serial: 1
+# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0
+# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49
+# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
+YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
+GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
+BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
+3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
+YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
+rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
+ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
+oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
+QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
+b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
+AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
+GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
+G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
+l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
+smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
+# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
+# Label: "QuoVadis Root CA"
+# Serial: 985026699
+# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24
+# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9
+# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC
+TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz
+MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw
+IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR
+dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp
+li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D
+rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ
+WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug
+F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU
+xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC
+Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv
+dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw
+ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl
+IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh
+c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy
+ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI
+KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T
+KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq
+y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p
+dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD
+VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL
+MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk
+fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8
+7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R
+cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y
+mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW
+xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK
+SnQ2+Q==
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 2"
+# Serial: 1289
+# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b
+# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7
+# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
+GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
+b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV
+BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
+YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa
+GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg
+Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J
+WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB
+rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp
++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1
+ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i
+Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz
+PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og
+/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH
+oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI
+yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud
+EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2
+A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL
+MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f
+BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn
+g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl
+fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K
+WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha
+B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc
+hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR
+TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD
+mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z
+ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y
+4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza
+8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 3"
+# Serial: 1478
+# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf
+# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85
+# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
+GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
+b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV
+BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
+YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM
+V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB
+4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr
+H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd
+8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv
+vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT
+mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe
+btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc
+T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt
+WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ
+c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A
+4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD
+VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG
+CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0
+aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu
+dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw
+czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G
+A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC
+TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg
+Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0
+7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem
+d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd
++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B
+4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN
+t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x
+DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57
+k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s
+zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j
+Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT
+mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK
+4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+
+# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1
+# Subject: O=SECOM Trust.net OU=Security Communication RootCA1
+# Label: "Security Communication Root CA"
+# Serial: 0
+# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a
+# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7
+# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY
+MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t
+dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5
+WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD
+VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8
+9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ
+DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9
+Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N
+QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ
+xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G
+A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T
+AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG
+kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr
+Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5
+Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU
+JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot
+RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Sonera Class2 CA O=Sonera
+# Subject: CN=Sonera Class2 CA O=Sonera
+# Label: "Sonera Class 2 Root CA"
+# Serial: 29
+# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb
+# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27
+# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP
+MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx
+MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV
+BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o
+Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt
+5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s
+3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej
+vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu
+8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw
+DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG
+MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil
+zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/
+3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD
+FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6
+Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2
+ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M
+-----END CERTIFICATE-----
+
+# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
+# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
+# Label: "XRamp Global CA Root"
+# Serial: 107108908803651509692980124233745014957
+# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1
+# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6
+# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
+gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
+MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
+UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
+NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
+dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
+dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
+38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
+KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
+DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
+qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
+JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
+PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
+BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
+jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
+eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
+vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
+IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
+i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
+O+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
+# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
+# Label: "Go Daddy Class 2 CA"
+# Serial: 0
+# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67
+# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4
+# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
+MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
+YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
+MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
+ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
+MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
+ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
+PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
+wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
+EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
+avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
+sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
+/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
+IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
+ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
+OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
+TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
+dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
+ReYNnyicsbkqWletNw+vHX/bvZ8=
+-----END CERTIFICATE-----
+
+# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
+# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
+# Label: "Starfield Class 2 CA"
+# Serial: 0
+# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24
+# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a
+# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
+MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
+U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
+NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
+ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
+ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
+DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
+8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
+X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
+K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
+1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
+A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
+zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
+YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
+bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
+DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
+L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
+eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
+VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
+WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+# Issuer: O=Government Root Certification Authority
+# Subject: O=Government Root Certification Authority
+# Label: "Taiwan GRCA"
+# Serial: 42023070807708724159991140556527066870
+# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e
+# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9
+# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/
+MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow
+PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
+AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR
+IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q
+gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy
+yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts
+F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2
+jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx
+ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC
+VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK
+YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH
+EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN
+Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud
+DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE
+MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK
+UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf
+qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK
+ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE
+JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7
+hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1
+EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm
+nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX
+udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz
+ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe
+LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl
+pYYsfPQS
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Assured ID Root CA"
+# Serial: 17154717934120587862167794914071425081
+# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72
+# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43
+# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
+b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
+cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
+JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
+mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
+VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
+AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
+AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
+BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
+pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
+dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
+fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
+NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
+H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Global Root CA"
+# Serial: 10944719598952040374951832963794454346
+# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e
+# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36
+# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
+CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
+nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
+43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
+T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
+gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
+TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
+DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
+hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
+06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
+PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
+YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert High Assurance EV Root CA"
+# Serial: 3553400076410547919724730734378100087
+# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a
+# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25
+# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
+ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
+LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
+RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
+PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
+xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
+Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
+hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
+EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
+FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
+nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
+eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
+hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
+Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
++OkuE6N36B9K
+-----END CERTIFICATE-----
+
+# Issuer: CN=Class 2 Primary CA O=Certplus
+# Subject: CN=Class 2 Primary CA O=Certplus
+# Label: "Certplus Class 2 Primary CA"
+# Serial: 177770208045934040241468760488327595043
+# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b
+# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb
+# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw
+PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz
+cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9
+MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz
+IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ
+ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR
+VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL
+kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd
+EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas
+H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0
+HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud
+DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4
+QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu
+Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/
+AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8
+yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR
+FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA
+ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB
+kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
+l7+ijrRU
+-----END CERTIFICATE-----
+
+# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co.
+# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co.
+# Label: "DST Root CA X3"
+# Serial: 91299735575339953335919266965803778155
+# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5
+# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13
+# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
+MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
+DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
+PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
+Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
+rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
+OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
+xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
+7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
+aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
+SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
+ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
+AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
+R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
+JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
+Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+
+# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG
+# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG
+# Label: "SwissSign Gold CA - G2"
+# Serial: 13492815561806991280
+# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93
+# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61
+# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
+BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln
+biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF
+MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT
+d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
+CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8
+76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+
+bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c
+6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE
+emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd
+MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt
+MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y
+MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y
+FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi
+aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM
+gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB
+qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7
+lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn
+8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6
+45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO
+UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5
+O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC
+bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv
+GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a
+77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC
+hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3
+92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp
+Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w
+ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt
+Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+
+# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG
+# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG
+# Label: "SwissSign Silver CA - G2"
+# Serial: 5700383053117599563
+# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13
+# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb
+# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5
+-----BEGIN CERTIFICATE-----
+MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE
+BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu
+IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow
+RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY
+U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv
+Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br
+YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF
+nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH
+6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt
+eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/
+c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ
+MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH
+HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf
+jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6
+5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB
+rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU
+F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c
+wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
+cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB
+AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp
+WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9
+xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ
+2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ
+IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8
+aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X
+em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR
+dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/
+OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+
+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy
+tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
+# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
+# Label: "GeoTrust Primary Certification Authority"
+# Serial: 32798226551256963324313806436981982369
+# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf
+# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96
+# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
+MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
+R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
+MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
+AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
+ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
+7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
+kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
+mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
+KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
+6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
+4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
+oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
+UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
+AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA"
+# Serial: 69529181992039203566298953787712940909
+# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12
+# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81
+# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
+qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
+BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
+NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
+LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
+A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
+W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
+3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
+6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
+Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
+NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
+r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
+DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
+YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
+/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
+LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
+jVaMaA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Class 3 Public Primary Certification Authority - G5"
+# Serial: 33037644167568058970164719475676101450
+# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c
+# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5
+# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
+ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
+nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
+t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
+SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
+BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
+rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
+NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
+BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
+BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
+MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
+p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
+5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
+WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
+4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
+hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+
+# Issuer: CN=SecureTrust CA O=SecureTrust Corporation
+# Subject: CN=SecureTrust CA O=SecureTrust Corporation
+# Label: "SecureTrust CA"
+# Serial: 17199774589125277788362757014266862032
+# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1
+# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11
+# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
+FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz
+MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv
+cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz
+Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO
+0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao
+wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj
+7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS
+8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT
+BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg
+JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC
+NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
+6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/
+3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm
+D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS
+CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Secure Global CA O=SecureTrust Corporation
+# Subject: CN=Secure Global CA O=SecureTrust Corporation
+# Label: "Secure Global CA"
+# Serial: 9751836167731051554232119481456978597
+# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de
+# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b
+# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
+GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx
+MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg
+Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ
+iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa
+/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ
+jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI
+HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7
+sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w
+gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw
+KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG
+AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
+URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO
+H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm
+I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
+iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO Certification Authority O=COMODO CA Limited
+# Label: "COMODO Certification Authority"
+# Serial: 104350513648249232941998508985834464573
+# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75
+# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b
+# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
+gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
+BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
+MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
+YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
+RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
+UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
+2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
+Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
+nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
+/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
+PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
+QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
+SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
+IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
+zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
+BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
+ZQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
+# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
+# Label: "Network Solutions Certificate Authority"
+# Serial: 116697915152937497490437556386812487904
+# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e
+# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce
+# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
+MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
+dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
+UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
+ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
+c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
+OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
+mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
+BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
+qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
+gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
+bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
+dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
+6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
+h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
+/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
+pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited
+# Label: "COMODO ECC Certification Authority"
+# Serial: 41578283867086692638256921589707938090
+# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23
+# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11
+# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
+IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
+MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
+ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
+T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
+FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
+cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
+BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
+fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
+GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed
+# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed
+# Label: "OISTE WISeKey Global Root GA CA"
+# Serial: 86718877871133159090080555911823548314
+# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93
+# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9
+# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB
+ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly
+aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
+ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w
+NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G
+A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD
+VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX
+SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR
+VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2
+w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF
+mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg
+4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9
+4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw
+EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx
+SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2
+ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8
+vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi
+Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ
+/L7fCg0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certigna O=Dhimyotis
+# Subject: CN=Certigna O=Dhimyotis
+# Label: "Certigna"
+# Serial: 18364802974209362175
+# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff
+# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97
+# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV
+BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X
+DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ
+BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4
+QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny
+gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw
+zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q
+130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2
+JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw
+ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT
+AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj
+AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG
+9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h
+bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc
+fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu
+HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w
+t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center
+# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center
+# Label: "Deutsche Telekom Root CA 2"
+# Serial: 38
+# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08
+# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf
+# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc
+MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj
+IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB
+IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE
+RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl
+U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290
+IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU
+ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC
+QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr
+rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S
+NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc
+QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH
+txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP
+BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
+AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp
+tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa
+IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl
+6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+
+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
+Cm26OWMohpLzGITY+9HPBVZkVw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc
+# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc
+# Label: "Cybertrust Global Root"
+# Serial: 4835703278459682877484360
+# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1
+# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6
+# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG
+A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh
+bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE
+ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS
+b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5
+7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS
+J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y
+HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP
+t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz
+FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY
+XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
+MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw
+hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js
+MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA
+A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj
+Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx
+XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o
+omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc
+A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
+# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
+# Label: "ePKI Root Certification Authority"
+# Serial: 28956088682735189655030529057352760477
+# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3
+# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0
+# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe
+MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0
+ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw
+IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL
+SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH
+SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh
+ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X
+DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1
+TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ
+fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA
+sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU
+WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS
+nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH
+dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip
+NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC
+AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF
+MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB
+uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl
+PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP
+JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/
+gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2
+j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6
+5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB
+o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS
+/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z
+Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE
+W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D
+hNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+# Issuer: O=certSIGN OU=certSIGN ROOT CA
+# Subject: O=certSIGN OU=certSIGN ROOT CA
+# Label: "certSIGN ROOT CA"
+# Serial: 35210227249154
+# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17
+# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b
+# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT
+AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD
+QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP
+MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do
+0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ
+UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d
+RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ
+OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv
+JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C
+AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O
+BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ
+LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY
+MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ
+44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I
+Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw
+i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN
+9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
+# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
+# Label: "GeoTrust Primary Certification Authority - G3"
+# Serial: 28809105769928564313984085209975885599
+# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05
+# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd
+# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
+mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
+MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
+BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
+BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
+hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
+5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
+JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
+DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
+huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
+HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
+AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
+zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
+kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
+SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
+spki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA - G2"
+# Serial: 71758320672825410020661621085256472406
+# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f
+# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12
+# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
+IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
+BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
+MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
+YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
+dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
+BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
+papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
+DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
+KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
+XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA - G3"
+# Serial: 127614157056681299805556476275995414779
+# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31
+# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2
+# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
+rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
+BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
+Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
+LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
+MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
+ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
+gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
+YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
+b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
+9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
+zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
+OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
+HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
+2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
+oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
+KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
+m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
+MdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
+# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
+# Label: "GeoTrust Primary Certification Authority - G2"
+# Serial: 80682863203381065782177908751794619243
+# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a
+# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0
+# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
+MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
+KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
+MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
+NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
+BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
+MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
+So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
+tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
+CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
+qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
+rD6ogRLQy7rQkgu2npaqBA+K
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Universal Root Certification Authority"
+# Serial: 85209574734084581917763752644031726877
+# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19
+# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54
+# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB
+vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
+ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX
+MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
+IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y
+IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh
+bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF
+9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH
+H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H
+LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN
+/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT
+rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw
+WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs
+exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4
+sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+
+seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz
+4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+
+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR
+lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3
+7M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Class 3 Public Primary Certification Authority - G4"
+# Serial: 63143484348153506665311985501458640051
+# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41
+# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a
+# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp
+U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg
+SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln
+biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm
+GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve
+fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ
+aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj
+aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW
+kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC
+4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga
+FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services)
+# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services)
+# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny"
+# Serial: 80544274841616
+# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88
+# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91
+# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG
+EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3
+MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl
+cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR
+dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB
+pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM
+b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm
+aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz
+IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT
+lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz
+AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5
+VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG
+ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2
+BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG
+AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M
+U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh
+bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C
++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F
+uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2
+XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
+# Label: "Staat der Nederlanden Root CA - G2"
+# Serial: 10000012
+# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a
+# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16
+# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f
+-----BEGIN CERTIFICATE-----
+MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX
+DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
+ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
+b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291
+qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp
+uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU
+Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE
+pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp
+5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M
+UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN
+GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy
+5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv
+6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK
+eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6
+B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/
+BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov
+L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG
+SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS
+CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen
+5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897
+IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK
+gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL
++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL
+vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm
+bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk
+N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC
+Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z
+ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post
+# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post
+# Label: "Hongkong Post Root CA 1"
+# Serial: 1000
+# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca
+# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58
+# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2
+-----BEGIN CERTIFICATE-----
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx
+FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg
+Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG
+A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr
+b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ
+jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn
+PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh
+ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9
+nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h
+q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED
+MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC
+mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3
+7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB
+oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs
+EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO
+fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi
+AmvZWg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
+# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
+# Label: "SecureSign RootCA11"
+# Serial: 1
+# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26
+# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3
+# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr
+MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG
+A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0
+MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp
+Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD
+QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz
+i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8
+h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV
+MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9
+UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni
+8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC
+h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD
+VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB
+AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm
+KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ
+X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr
+QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5
+pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN
+QSdJQO7e5iNEOdyhIta6A/I=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
+# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
+# Label: "Microsec e-Szigno Root CA 2009"
+# Serial: 14014712776195784473
+# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1
+# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e
+# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD
+VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0
+ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G
+CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y
+OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx
+FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp
+Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP
+kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc
+cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U
+fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7
+N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC
+xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1
++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM
+Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG
+SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h
+mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk
+ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c
+2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t
+HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
+# Label: "GlobalSign Root CA - R3"
+# Serial: 4835703278459759426209954
+# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28
+# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad
+# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
+MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
+RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
+gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
+KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
+QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
+XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
+DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
+LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
+RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
+jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
+6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
+mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
+Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
+WD9f
+-----END CERTIFICATE-----
+
+# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
+# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
+# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068"
+# Serial: 6047274297262753887
+# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3
+# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa
+# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE
+BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h
+cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy
+MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg
+Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9
+thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM
+cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG
+L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i
+NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h
+X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b
+m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy
+Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja
+EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T
+KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF
+6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh
+OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD
+VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv
+ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl
+AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF
+661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9
+am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1
+ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481
+PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS
+3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k
+SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF
+3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM
+ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g
+StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz
+Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB
+jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
+-----END CERTIFICATE-----
+
+# Issuer: CN=Izenpe.com O=IZENPE S.A.
+# Subject: CN=Izenpe.com O=IZENPE S.A.
+# Label: "Izenpe.com"
+# Serial: 917563065490389241595536686991402621
+# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73
+# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19
+# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f
+-----BEGIN CERTIFICATE-----
+MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4
+MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6
+ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD
+VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j
+b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq
+scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO
+xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H
+LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX
+uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD
+yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+
+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q
+rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN
+BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L
+hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB
+QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+
+HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu
+Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg
+QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB
+BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
+MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA
+A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb
+laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56
+awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo
+JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw
+LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT
+VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk
+LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb
+UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/
+QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+
+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls
+QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
+# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
+# Label: "Chambers of Commerce Root - 2008"
+# Serial: 11806822484801597146
+# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7
+# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c
+# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0
+-----BEGIN CERTIFICATE-----
+MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD
+VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
+IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
+MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz
+IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz
+MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj
+dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw
+EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp
+MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9
+28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq
+VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q
+DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR
+5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL
+ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a
+Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl
+UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s
++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5
+Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
+ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx
+hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV
+HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1
++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN
+YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t
+L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy
+ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt
+IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV
+HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w
+DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW
+PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF
+5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1
+glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH
+FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2
+pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD
+xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG
+tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq
+jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De
+fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
+OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ
+d0jQ
+-----END CERTIFICATE-----
+
+# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
+# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
+# Label: "Global Chambersign Root - 2008"
+# Serial: 14541511773111788494
+# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3
+# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c
+# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca
+-----BEGIN CERTIFICATE-----
+MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD
+VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
+IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
+MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
+aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx
+MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy
+cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG
+A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl
+BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI
+hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed
+KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7
+G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2
+zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4
+ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG
+HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2
+Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V
+yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e
+beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r
+6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
+wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog
+zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW
+BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr
+ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp
+ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk
+cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt
+YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC
+CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow
+KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI
+hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ
+UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz
+X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x
+fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz
+a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd
+Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd
+SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O
+AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso
+M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge
+v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
+09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
+-----END CERTIFICATE-----
+
+# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
+# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
+# Label: "Go Daddy Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01
+# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b
+# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
+EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
+ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
+NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
+EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
+AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
+E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
+/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
+DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
+GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
+tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
+AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
+FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
+WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
+9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
+gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
+2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
+4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Label: "Starfield Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96
+# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e
+# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
+ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
+MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
+aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
+Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
+nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
+HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
+Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
+dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
+HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
+CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
+sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
+4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
+8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
+mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Label: "Starfield Services Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2
+# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f
+# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
+ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
+VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
+ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
+dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
+OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
+8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
+Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
+hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
+6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
+DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
+AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
+bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
+ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
+qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
+0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
+sSi6
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Commercial O=AffirmTrust
+# Subject: CN=AffirmTrust Commercial O=AffirmTrust
+# Label: "AffirmTrust Commercial"
+# Serial: 8608355977964138876
+# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7
+# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7
+# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
+Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
+ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
+MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
+yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
+VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
+nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
+XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
+vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
+Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
+N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
+nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Networking O=AffirmTrust
+# Subject: CN=AffirmTrust Networking O=AffirmTrust
+# Label: "AffirmTrust Networking"
+# Serial: 8957382827206547757
+# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f
+# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f
+# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
+YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
+kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
+QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
+6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
+yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
+QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
+tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
+QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
+Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
+olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
+x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Premium O=AffirmTrust
+# Subject: CN=AffirmTrust Premium O=AffirmTrust
+# Label: "AffirmTrust Premium"
+# Serial: 7893706540734352110
+# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57
+# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27
+# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
+dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
+A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
+cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
+qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
+JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
+s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
+HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
+70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
+V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
+qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
+5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
+C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
+OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
+FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
+KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
+8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
+MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
+0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
+u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
+u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
+YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
+GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
+RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
+KeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust
+# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust
+# Label: "AffirmTrust Premium ECC"
+# Serial: 8401224907861490260
+# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d
+# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb
+# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
+VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
+cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
+BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
+VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
+0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
+ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
+A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
+aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
+flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Label: "Certum Trusted Network CA"
+# Serial: 279744
+# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78
+# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e
+# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM
+MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D
+ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU
+cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3
+WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg
+Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw
+IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH
+UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM
+TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU
+BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM
+kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x
+AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV
+HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y
+sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL
+I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8
+J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY
+VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
+# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
+# Label: "TWCA Root Certification Authority"
+# Serial: 1
+# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79
+# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48
+# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES
+MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU
+V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz
+WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO
+LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE
+AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH
+K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX
+RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z
+rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx
+3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq
+hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC
+MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls
+XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D
+lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn
+aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ
+YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+
+# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
+# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
+# Label: "Security Communication RootCA2"
+# Serial: 0
+# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43
+# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74
+# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl
+MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe
+U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX
+DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy
+dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj
+YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV
+OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr
+zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM
+VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ
+hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO
+ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw
+awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs
+OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
+DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF
+coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc
+okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8
+t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy
+1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/
+SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
+# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
+# Label: "Hellenic Academic and Research Institutions RootCA 2011"
+# Serial: 0
+# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9
+# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d
+# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71
+-----BEGIN CERTIFICATE-----
+MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix
+RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
+dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p
+YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw
+NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK
+EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl
+cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
+c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz
+dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ
+fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns
+bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD
+75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP
+FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV
+HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp
+5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu
+b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA
+A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p
+6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
+TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7
+dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys
+Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI
+l7WdmplNsDz4SgCbZN2fOUvRJ9e4
+-----END CERTIFICATE-----
+
+# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
+# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
+# Label: "Actalis Authentication Root CA"
+# Serial: 6271844772424770508
+# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6
+# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac
+# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66
+-----BEGIN CERTIFICATE-----
+MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE
+BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w
+MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
+IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC
+SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1
+ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv
+UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX
+4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9
+KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/
+gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb
+rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ
+51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F
+be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe
+KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F
+v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn
+fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7
+jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz
+ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
+ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL
+e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70
+jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz
+WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V
+SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j
+pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX
+X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok
+fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R
+K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU
+ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU
+LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT
+LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
+-----END CERTIFICATE-----
+
+# Issuer: O=Trustis Limited OU=Trustis FPS Root CA
+# Subject: O=Trustis Limited OU=Trustis FPS Root CA
+# Label: "Trustis FPS Root CA"
+# Serial: 36053640375399034304724988975563710553
+# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d
+# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04
+# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d
+-----BEGIN CERTIFICATE-----
+MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF
+MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL
+ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx
+MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc
+MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+
+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH
+iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj
+vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA
+0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB
+OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/
+BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E
+FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01
+GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW
+zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4
+1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE
+f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F
+jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN
+ZetX2fNXlrtIzYE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
+# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
+# Label: "Buypass Class 2 Root CA"
+# Serial: 2
+# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29
+# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99
+# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
+Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow
+TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
+HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr
+6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV
+L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91
+1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx
+MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ
+QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB
+arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr
+Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi
+FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS
+P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN
+9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP
+AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz
+uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h
+9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
+A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t
+OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo
++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7
+KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2
+DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us
+H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ
+I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7
+5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h
+3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz
+Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
+# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
+# Label: "Buypass Class 3 Root CA"
+# Serial: 2
+# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec
+# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57
+# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
+Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow
+TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
+HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y
+ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E
+N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9
+tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX
+0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c
+/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X
+KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY
+zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS
+O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D
+34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP
+K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3
+AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv
+Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj
+QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
+cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS
+IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2
+HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa
+O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv
+033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u
+dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE
+kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41
+3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD
+u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq
+4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc=
+-----END CERTIFICATE-----
+
+# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Label: "T-TeleSec GlobalRoot Class 3"
+# Serial: 1
+# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef
+# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1
+# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
+KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
+BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
+YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1
+OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
+aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
+ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN
+8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/
+RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4
+hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5
+ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM
+EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1
+A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy
+WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ
+1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30
+6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT
+91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
+e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p
+TpPDpFQUWw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus
+# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus
+# Label: "EE Certification Centre Root CA"
+# Serial: 112324828676200291871926431888494945866
+# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f
+# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7
+# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76
+-----BEGIN CERTIFICATE-----
+MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1
+MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1
+czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG
+CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy
+MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl
+ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS
+b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy
+euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO
+bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw
+WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d
+MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE
+1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/
+zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB
+BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF
+BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV
+v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG
+E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
+uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW
+iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v
+GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
+# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
+# Label: "D-TRUST Root Class 3 CA 2 2009"
+# Serial: 623603
+# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f
+# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0
+# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1
+-----BEGIN CERTIFICATE-----
+MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF
+MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD
+bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha
+ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM
+HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03
+UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42
+tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R
+ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM
+lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp
+/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G
+A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G
+A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj
+dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy
+MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl
+cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js
+L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL
+BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni
+acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
+o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K
+zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8
+PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y
+Johw1+qRzT65ysCQblrGXnRl11z+o+I=
+-----END CERTIFICATE-----
+
+# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
+# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
+# Label: "D-TRUST Root Class 3 CA 2 EV 2009"
+# Serial: 623604
+# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6
+# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83
+# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF
+MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD
+bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw
+NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV
+BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn
+ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0
+3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z
+qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR
+p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8
+HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw
+ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea
+HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw
+Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh
+c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E
+RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt
+dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku
+Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp
+3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
+nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF
+CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na
+xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX
+KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1
+-----END CERTIFICATE-----
+
+# Issuer: CN=CA Disig Root R2 O=Disig a.s.
+# Subject: CN=CA Disig Root R2 O=Disig a.s.
+# Label: "CA Disig Root R2"
+# Serial: 10572350602393338211
+# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03
+# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71
+# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV
+BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu
+MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy
+MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx
+EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw
+ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe
+NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH
+PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I
+x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe
+QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR
+yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO
+QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912
+H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ
+QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD
+i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs
+nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1
+rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI
+hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
+tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf
+GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb
+lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka
++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal
+TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i
+nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3
+gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr
+G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os
+zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x
+L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL
+-----END CERTIFICATE-----
+
+# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
+# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
+# Label: "ACCVRAIZ1"
+# Serial: 6828503384748696800
+# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02
+# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17
+# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13
+-----BEGIN CERTIFICATE-----
+MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE
+AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw
+CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ
+BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND
+VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb
+qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY
+HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo
+G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA
+lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr
+IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/
+0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH
+k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47
+4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO
+m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa
+cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl
+uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI
+KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls
+ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG
+AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
+VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT
+VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG
+CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA
+cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA
+QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA
+7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA
+cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA
+QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA
+czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu
+aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt
+aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud
+DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF
+BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp
+D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU
+JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m
+AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD
+vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms
+tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH
+7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
+I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA
+h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF
+d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H
+pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7
+-----END CERTIFICATE-----
+
+# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
+# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
+# Label: "TWCA Global Root CA"
+# Serial: 3262
+# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96
+# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65
+# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx
+EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT
+VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5
+NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT
+B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF
+10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz
+0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh
+MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH
+zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc
+46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2
+yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi
+laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP
+oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA
+BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE
+qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm
+4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL
+1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
+LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF
+H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo
+RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+
+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh
+15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW
+6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW
+nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j
+wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz
+aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy
+KwbQBM0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera
+# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera
+# Label: "TeliaSonera Root CA v1"
+# Serial: 199041966741090107964904287217786801558
+# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c
+# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37
+# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89
+-----BEGIN CERTIFICATE-----
+MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw
+NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv
+b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD
+VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2
+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F
+VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1
+7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X
+Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+
+/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs
+81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm
+dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe
+Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu
+sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4
+pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs
+slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ
+arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD
+VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG
+9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl
+dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
+0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj
+TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed
+Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7
+Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI
+OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7
+vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW
+t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn
+HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx
+SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi
+# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi
+# Label: "E-Tugra Certification Authority"
+# Serial: 7667447206703254355
+# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49
+# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39
+# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c
+-----BEGIN CERTIFICATE-----
+MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV
+BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC
+aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV
+BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1
+Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz
+MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+
+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp
+em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
+ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY
+B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH
+D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF
+Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo
+q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D
+k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH
+fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut
+dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM
+ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8
+zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
+rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX
+U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6
+Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5
+XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF
+Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR
+HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY
+GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c
+77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3
++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK
+vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6
+FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl
+yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P
+AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD
+y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d
+NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Label: "T-TeleSec GlobalRoot Class 2"
+# Serial: 1
+# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a
+# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9
+# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
+KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
+BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
+YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1
+OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
+aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
+ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd
+AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC
+FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi
+1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq
+jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ
+wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/
+WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy
+NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC
+uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw
+IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6
+g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
+9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP
+BSeOE6Fuwg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Atos TrustedRoot 2011 O=Atos
+# Subject: CN=Atos TrustedRoot 2011 O=Atos
+# Label: "Atos TrustedRoot 2011"
+# Serial: 6643877497813316402
+# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56
+# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21
+# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE
+AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG
+EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM
+FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC
+REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp
+Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM
+VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+
+SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ
+4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L
+cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi
+eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV
+HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG
+A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3
+DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j
+vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP
+DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc
+maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D
+lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv
+KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 1 G3"
+# Serial: 687049649626669250736271037606554624078720034195
+# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab
+# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67
+# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00
+MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV
+wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe
+rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341
+68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh
+4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp
+UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o
+abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc
+3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G
+KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt
+hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO
+Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt
+zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD
+ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
+MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2
+cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN
+qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5
+YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv
+b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2
+8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k
+NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj
+ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp
+q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt
+nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 2 G3"
+# Serial: 390156079458959257446133169266079962026824725800
+# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06
+# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36
+# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00
+MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf
+qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW
+n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym
+c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+
+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1
+o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j
+IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq
+IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz
+8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh
+vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l
+7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG
+cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD
+ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
+AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC
+roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga
+W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n
+lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE
++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV
+csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd
+dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg
+KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM
+HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4
+WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 3 G3"
+# Serial: 268090761170461462463995952157327242137089239581
+# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7
+# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d
+# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00
+MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR
+/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu
+FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR
+U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c
+ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR
+FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k
+A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw
+eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl
+sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp
+VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q
+A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+
+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD
+ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
+KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI
+FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv
+oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg
+u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP
+0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf
+3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl
+8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+
+DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN
+PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/
+ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Assured ID Root G2"
+# Serial: 15385348160840213938643033620894905419
+# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d
+# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f
+# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85
+-----BEGIN CERTIFICATE-----
+MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
+b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
+cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA
+n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc
+biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp
+EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA
+bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu
+YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB
+AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW
+BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI
+QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I
+0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni
+lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9
+B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv
+ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
+IhNzbM8m9Yop5w==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Assured ID Root G3"
+# Serial: 15459312981008553731928384953135426796
+# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb
+# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89
+# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2
+-----BEGIN CERTIFICATE-----
+MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw
+CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
+ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg
+RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
+Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf
+Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q
+RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD
+AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY
+JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv
+6pZjamVFkpUBtA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Global Root G2"
+# Serial: 4293743540046975378534879503202253541
+# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44
+# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4
+# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f
+-----BEGIN CERTIFICATE-----
+MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
+MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
+2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
+1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
+q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
+tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
+vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
+5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
+1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
+NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
+Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
+8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
+pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
+MrY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Global Root G3"
+# Serial: 7089244469030293291760083333884364146
+# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca
+# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e
+# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0
+-----BEGIN CERTIFICATE-----
+MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw
+CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
+ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe
+Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw
+EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
+IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF
+K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG
+fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO
+Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd
+BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx
+AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/
+oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8
+sycX
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Trusted Root G4"
+# Serial: 7451500558977370777930084869016614236
+# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49
+# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4
+# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88
+-----BEGIN CERTIFICATE-----
+MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg
+RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
+Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y
+ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If
+xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV
+ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO
+DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ
+jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/
+CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi
+EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM
+fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY
+uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK
+chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t
+9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
+ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2
+SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd
++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc
+fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa
+sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N
+cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N
+0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie
+4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI
+r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1
+/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm
+gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited
+# Label: "COMODO RSA Certification Authority"
+# Serial: 101909084537582093308941363524873193117
+# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18
+# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4
+# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34
+-----BEGIN CERTIFICATE-----
+MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB
+hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
+BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5
+MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
+EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR
+6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X
+pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC
+9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV
+/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf
+Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z
++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w
+qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah
+SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC
+u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf
+Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq
+crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
+FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB
+/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl
+wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM
+4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV
+2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna
+FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ
+CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK
+boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke
+jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL
+S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb
+QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl
+0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB
+NVOFBkpdn627G190
+-----END CERTIFICATE-----
+
+# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
+# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
+# Label: "USERTrust RSA Certification Authority"
+# Serial: 2645093764781058787591871645665788717
+# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5
+# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e
+# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2
+-----BEGIN CERTIFICATE-----
+MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
+MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
+BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
+dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
+3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
+tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
+Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
+VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
+79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
+c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
+Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
+c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
+UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
+Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
+BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
+Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
+VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
+ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
+8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
+iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
+Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
+XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
+qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
+VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
+L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
+jjxDah2nGN59PRbxYvnKkKj9
+-----END CERTIFICATE-----
+
+# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
+# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
+# Label: "USERTrust ECC Certification Authority"
+# Serial: 123013823720199481456569720443997572134
+# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1
+# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0
+# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a
+-----BEGIN CERTIFICATE-----
+MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl
+eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT
+JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx
+MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
+Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg
+VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo
+I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng
+o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G
+A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB
+zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW
+RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
+# Label: "GlobalSign ECC Root CA - R4"
+# Serial: 14367148294922964480859022125800977897474
+# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e
+# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb
+# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c
+-----BEGIN CERTIFICATE-----
+MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk
+MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH
+bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
+DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
+QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
+MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ
+FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw
+DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F
+uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX
+kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs
+ewv4n4Q=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
+# Label: "GlobalSign ECC Root CA - R5"
+# Serial: 32785792099990507226680698011560947931244
+# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08
+# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa
+# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24
+-----BEGIN CERTIFICATE-----
+MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk
+MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH
+bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
+DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
+QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
+MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc
+8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke
+hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI
+KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg
+515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO
+xwy8p2Fp8fc74SrL+SvzZpA3
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden
+# Label: "Staat der Nederlanden Root CA - G3"
+# Serial: 10003001
+# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37
+# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc
+# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28
+-----BEGIN CERTIFICATE-----
+MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX
+DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
+ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
+b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP
+cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW
+IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX
+xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy
+KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR
+9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az
+5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8
+6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7
+Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP
+bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt
+BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt
+XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF
+MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd
+INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
+U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp
+LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8
+Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp
+gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh
+/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw
+0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A
+fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq
+4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR
+1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/
+QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM
+94B7IWcnMFk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden
+# Label: "Staat der Nederlanden EV Root CA"
+# Serial: 10000013
+# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba
+# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb
+# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a
+-----BEGIN CERTIFICATE-----
+MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y
+MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg
+TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS
+b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS
+M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC
+UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d
+Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p
+rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l
+pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb
+j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC
+KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS
+/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X
+cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH
+1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP
+px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7
+MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
+eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u
+2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS
+v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC
+wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy
+CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e
+vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6
+Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa
+Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL
+eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8
+FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc
+7uzXLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
+# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
+# Label: "IdenTrust Commercial Root CA 1"
+# Serial: 13298821034946342390520003877796839426
+# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7
+# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25
+# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK
+MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu
+VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw
+MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw
+JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT
+3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU
++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp
+S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1
+bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi
+T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL
+vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK
+Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK
+dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT
+c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv
+l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N
+iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD
+ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
+6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt
+LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93
+nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3
++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK
+W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT
+AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq
+l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG
+4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ
+mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A
+7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H
+-----END CERTIFICATE-----
+
+# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust
+# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust
+# Label: "IdenTrust Public Sector Root CA 1"
+# Serial: 13298821034946342390521976156843933698
+# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba
+# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd
+# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f
+-----BEGIN CERTIFICATE-----
+MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN
+MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu
+VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN
+MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0
+MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7
+ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy
+RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS
+bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF
+/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R
+3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw
+EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy
+9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V
+GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ
+2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV
+WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD
+W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN
+AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
+t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV
+DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9
+TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G
+lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW
+mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df
+WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5
++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ
+tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA
+GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv
+8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
+# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
+# Label: "Entrust Root Certification Authority - G2"
+# Serial: 1246989352
+# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2
+# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4
+# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39
+-----BEGIN CERTIFICATE-----
+MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
+cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
+IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
+dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
+NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
+dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
+dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
+aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
+RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
+cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
+wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
+U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
+jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
+BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
+jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
+Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
+1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
+nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
+VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
+# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
+# Label: "Entrust Root Certification Authority - EC1"
+# Serial: 51543124481930649114116133369
+# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc
+# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47
+# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5
+-----BEGIN CERTIFICATE-----
+MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG
+A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3
+d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu
+dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq
+RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy
+MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD
+VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
+L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g
+Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi
+A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt
+ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH
+Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
+BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC
+R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX
+hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
+-----END CERTIFICATE-----
+
+# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority
+# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority
+# Label: "CFCA EV ROOT"
+# Serial: 407555286
+# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30
+# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83
+# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD
+TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx
+MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j
+aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP
+T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03
+sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL
+TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5
+/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp
+7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz
+EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt
+hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP
+a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot
+aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg
+TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV
+PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv
+cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL
+tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd
+BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
+ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT
+ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL
+jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS
+ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy
+P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19
+xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d
+Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN
+5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe
+/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z
+AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ
+5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
+-----END CERTIFICATE-----
+
+# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e.
+# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e.
+# Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5"
+# Serial: 156233699172481
+# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e
+# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb
+# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78
+-----BEGIN CERTIFICATE-----
+MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE
+BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn
+aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg
+QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg
+SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0
+MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD
+VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8
+dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom
+/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR
+Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3
+4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z
+5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0
+hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID
+AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX
+SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l
+VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
+URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf
+peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF
+Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW
++qtB4Uu2NQvAmxU=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903
+# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903
+# Label: "Certinomis - Root CA"
+# Serial: 1
+# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f
+# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8
+# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58
+-----BEGIN CERTIFICATE-----
+MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET
+MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb
+BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz
+MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx
+FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g
+Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2
+fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl
+LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV
+WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF
+TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb
+5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc
+CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri
+wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ
+wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG
+m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4
+F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng
+WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0
+2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF
+AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/
+0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw
+F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS
+g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj
+qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN
+h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/
+ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V
+btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj
+Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ
+8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW
+gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed
+# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed
+# Label: "OISTE WISeKey Global Root GB CA"
+# Serial: 157768595616588414422159278966750757568
+# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d
+# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed
+# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt
+MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg
+Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i
+YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x
+CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG
+b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
+bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3
+HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx
+WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX
+1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk
+u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P
+99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r
+M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB
+BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh
+cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5
+gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO
+ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf
+aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
+Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
+-----END CERTIFICATE-----
+
+# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A.
+# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A.
+# Label: "SZAFIR ROOT CA2"
+# Serial: 357043034767186914217277344587386743377558296292
+# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99
+# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de
+# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe
+-----BEGIN CERTIFICATE-----
+MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL
+BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6
+ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw
+NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L
+cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg
+Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN
+QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT
+3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw
+3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6
+3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5
+BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN
+XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
+AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF
+AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw
+8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG
+nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP
+oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy
+d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg
+LvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Label: "Certum Trusted Network CA 2"
+# Serial: 44979900017204383099463764357512596969
+# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2
+# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92
+# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04
+-----BEGIN CERTIFICATE-----
+MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB
+gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
+QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG
+A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz
+OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ
+VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3
+b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA
+DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn
+0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB
+OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE
+fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E
+Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m
+o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i
+sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW
+OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez
+Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS
+adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n
+3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ
+F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf
+CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29
+XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm
+djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/
+WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb
+AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq
+P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko
+b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj
+XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P
+5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi
+DrW5viSP
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
+# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
+# Label: "Hellenic Academic and Research Institutions RootCA 2015"
+# Serial: 0
+# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce
+# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6
+# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36
+-----BEGIN CERTIFICATE-----
+MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix
+DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k
+IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT
+N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v
+dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG
+A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh
+ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx
+QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
+dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA
+4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0
+AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10
+4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C
+ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV
+9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD
+gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6
+Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq
+NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko
+LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
+Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd
+ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I
+XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI
+M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot
+9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V
+Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea
+j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh
+X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ
+l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf
+bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4
+pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK
+e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0
+vm9qp/UsQu0yrbYhnr68
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
+# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
+# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015"
+# Serial: 0
+# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef
+# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66
+# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33
+-----BEGIN CERTIFICATE-----
+MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN
+BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
+c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl
+bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv
+b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ
+BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj
+YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5
+MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0
+dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg
+QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa
+jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi
+C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep
+lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof
+TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certplus Root CA G1 O=Certplus
+# Subject: CN=Certplus Root CA G1 O=Certplus
+# Label: "Certplus Root CA G1"
+# Serial: 1491911565779898356709731176965615564637713
+# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42
+# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66
+# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA
+MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy
+dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa
+MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy
+dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
+ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a
+iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt
+6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP
+0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f
+6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE
+EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN
+1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc
+h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT
+mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV
+4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO
+WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud
+DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd
+Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq
+hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh
+66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7
+/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS
+S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j
+2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R
+Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr
+RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy
+6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV
+V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5
+g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl
+++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certplus Root CA G2 O=Certplus
+# Subject: CN=Certplus Root CA G2 O=Certplus
+# Label: "Certplus Root CA G2"
+# Serial: 1492087096131536844209563509228951875861589
+# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31
+# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a
+# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17
+-----BEGIN CERTIFICATE-----
+MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x
+CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs
+dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x
+CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs
+dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat
+93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x
+Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P
+AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj
+FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG
+SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch
+p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal
+U5ORGpOucGpnutee5WEaXw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust
+# Subject: CN=OpenTrust Root CA G1 O=OpenTrust
+# Label: "OpenTrust Root CA G1"
+# Serial: 1492036577811947013770400127034825178844775
+# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da
+# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e
+# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4
+-----BEGIN CERTIFICATE-----
+MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA
+MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w
+ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw
+MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU
+T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b
+wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX
+/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0
+77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP
+uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx
+p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx
+Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2
+TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W
+G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw
+vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY
+EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1
+2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw
+DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E
+PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf
+gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS
+FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0
+V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P
+XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I
+i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t
+TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91
+09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky
+Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ
+AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj
+1oxx
+-----END CERTIFICATE-----
+
+# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust
+# Subject: CN=OpenTrust Root CA G2 O=OpenTrust
+# Label: "OpenTrust Root CA G2"
+# Serial: 1492012448042702096986875987676935573415441
+# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb
+# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b
+# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2
+-----BEGIN CERTIFICATE-----
+MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA
+MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w
+ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw
+MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU
+T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh
+/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e
+CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6
+1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE
+FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS
+gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X
+G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy
+YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH
+vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4
+t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/
+gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3
+5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w
+DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz
+Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0
+nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT
+RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT
+wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2
+t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa
+TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2
+o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU
+3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA
+iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f
+WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM
+S1IK
+-----END CERTIFICATE-----
+
+# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust
+# Subject: CN=OpenTrust Root CA G3 O=OpenTrust
+# Label: "OpenTrust Root CA G3"
+# Serial: 1492104908271485653071219941864171170455615
+# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24
+# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6
+# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92
+-----BEGIN CERTIFICATE-----
+MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx
+CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U
+cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow
+QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl
+blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm
+3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d
+oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G
+A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5
+DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK
+BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q
+j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx
+4nxp5V2a+EEfOzmTk51V6s2N8fvB
+-----END CERTIFICATE-----
+
+# Issuer: CN=ISRG Root X1 O=Internet Security Research Group
+# Subject: CN=ISRG Root X1 O=Internet Security Research Group
+# Label: "ISRG Root X1"
+# Serial: 172886928669790476064670243504169061120
+# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e
+# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8
+# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
+-----END CERTIFICATE-----
+
+# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM
+# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM
+# Label: "AC RAIZ FNMT-RCM"
+# Serial: 485876308206448804701554682760554759
+# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d
+# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20
+# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx
+CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ
+WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ
+BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG
+Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/
+yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf
+BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz
+WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF
+tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z
+374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC
+IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL
+mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7
+wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS
+MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2
+ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet
+UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H
+YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3
+LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
+nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1
+RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM
+LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf
+77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N
+JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm
+fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp
+6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp
+1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B
+9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok
+RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv
+uu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Amazon Root CA 1 O=Amazon
+# Subject: CN=Amazon Root CA 1 O=Amazon
+# Label: "Amazon Root CA 1"
+# Serial: 143266978916655856878034712317230054538369994
+# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6
+# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16
+# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e
+-----BEGIN CERTIFICATE-----
+MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
+ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
+b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
+MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
+b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
+ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
+9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
+IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
+VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
+93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
+jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
+A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
+U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
+N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
+o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
+5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
+rqXRfboQnoZsG4q5WTP468SQvvG5
+-----END CERTIFICATE-----
+
+# Issuer: CN=Amazon Root CA 2 O=Amazon
+# Subject: CN=Amazon Root CA 2 O=Amazon
+# Label: "Amazon Root CA 2"
+# Serial: 143266982885963551818349160658925006970653239
+# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66
+# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a
+# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF
+ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
+b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL
+MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
+b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK
+gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ
+W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg
+1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K
+8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r
+2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me
+z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR
+8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj
+mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz
+7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6
++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI
+0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB
+Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm
+UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2
+LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS
+k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl
+7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm
+btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl
+urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+
+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63
+n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE
+76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H
+9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT
+4PsJYGw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Amazon Root CA 3 O=Amazon
+# Subject: CN=Amazon Root CA 3 O=Amazon
+# Label: "Amazon Root CA 3"
+# Serial: 143266986699090766294700635381230934788665930
+# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87
+# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e
+# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4
+-----BEGIN CERTIFICATE-----
+MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5
+MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
+Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
+A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
+Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl
+ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr
+ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr
+BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM
+YyRIHN8wfdVoOw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Amazon Root CA 4 O=Amazon
+# Subject: CN=Amazon Root CA 4 O=Amazon
+# Label: "Amazon Root CA 4"
+# Serial: 143266989758080763974105200630763877849284878
+# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd
+# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be
+# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92
+-----BEGIN CERTIFICATE-----
+MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5
+MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
+Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
+A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
+Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi
+9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk
+M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB
+MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw
+CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW
+1KyLa2tJElMzrdfkviT8tQp21KW8EA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A.
+# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A.
+# Label: "LuxTrust Global Root 2"
+# Serial: 59914338225734147123941058376788110305822489521
+# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c
+# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f
+# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5
+-----BEGIN CERTIFICATE-----
+MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL
+BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV
+BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw
+MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B
+LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN
+AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F
+ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem
+hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1
+EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn
+Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4
+zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ
+96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m
+j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g
+DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+
+8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j
+X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH
+hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB
+KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0
+Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT
++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL
+BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9
+BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO
+jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9
+loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c
+qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+
+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/
+JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre
+zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf
+LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+
+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6
+oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr
+-----END CERTIFICATE-----
+
+# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM
+# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM
+# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1"
+# Serial: 1
+# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49
+# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca
+# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16
+-----BEGIN CERTIFICATE-----
+MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx
+GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp
+bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w
+KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0
+BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy
+dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG
+EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll
+IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU
+QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT
+TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg
+LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7
+a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr
+LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr
+N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X
+YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/
+iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f
+AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH
+V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
+BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
+AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf
+IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4
+lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c
+8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf
+lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.
+# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.
+# Label: "GDCA TrustAUTH R5 ROOT"
+# Serial: 9009899650740120186
+# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4
+# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4
+# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93
+-----BEGIN CERTIFICATE-----
+MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE
+BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ
+IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0
+MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV
+BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w
+HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj
+Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj
+TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u
+KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj
+qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm
+MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12
+ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP
+zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk
+L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC
+jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA
+HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC
+AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg
+p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm
+DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5
+COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry
+L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf
+JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg
+IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io
+2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV
+09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ
+XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq
+T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe
+MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Label: "TrustCor RootCert CA-1"
+# Serial: 15752444095811006489
+# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45
+# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a
+# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD
+VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk
+MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
+cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y
+IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB
+pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h
+IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG
+A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU
+cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid
+RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V
+seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme
+9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV
+EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW
+hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/
+DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw
+DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD
+ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I
+/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
+ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ
+yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts
+L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN
+zl/HHk484IkzlQsPpTLWPFp5LBk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Label: "TrustCor RootCert CA-2"
+# Serial: 2711694510199101698
+# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64
+# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0
+# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65
+-----BEGIN CERTIFICATE-----
+MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV
+BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw
+IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy
+dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig
+Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk
+MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg
+Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD
+VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy
+dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+
+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq
+1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp
+2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK
+DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape
+az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF
+3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88
+oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM
+g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3
+mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
+8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd
+BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U
+nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw
+DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX
+dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+
+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL
+/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX
+CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa
+ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW
+2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7
+N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3
+Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB
+As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp
+5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu
+1uwJ
+-----END CERTIFICATE-----
+
+# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Label: "TrustCor ECA-1"
+# Serial: 9548242946988625984
+# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c
+# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd
+# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD
+VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk
+MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
+cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y
+IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV
+BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw
+IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy
+dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig
+RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb
+3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA
+BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5
+3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou
+owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/
+wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF
+ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf
+BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/
+MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv
+civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2
+AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
+hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50
+soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI
+WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi
+tJ/X5g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation
+# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation
+# Label: "SSL.com Root Certification Authority RSA"
+# Serial: 8875640296558310041
+# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29
+# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb
+# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69
+-----BEGIN CERTIFICATE-----
+MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE
+BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK
+DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz
+OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv
+dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv
+bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN
+AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R
+xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX
+qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC
+C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3
+6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh
+/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF
+YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E
+JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc
+US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8
+ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm
++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi
+M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV
+HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G
+A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV
+cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc
+Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs
+PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/
+q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0
+cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr
+a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I
+H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y
+K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu
+nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf
+oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY
+Ic2wBlX7Jz9TkHCpBB5XJ7k=
+-----END CERTIFICATE-----
+
+# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation
+# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation
+# Label: "SSL.com Root Certification Authority ECC"
+# Serial: 8495723813297216424
+# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e
+# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a
+# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65
+-----BEGIN CERTIFICATE-----
+MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC
+VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T
+U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0
+aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz
+WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0
+b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS
+b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB
+BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI
+7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg
+CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud
+EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD
+VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T
+kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+
+gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl
+-----END CERTIFICATE-----
+
+# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation
+# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation
+# Label: "SSL.com EV Root Certification Authority RSA R2"
+# Serial: 6248227494352943350
+# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95
+# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a
+# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c
+-----BEGIN CERTIFICATE-----
+MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV
+BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE
+CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy
+dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy
+MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G
+A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD
+DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq
+M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf
+OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa
+4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9
+HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR
+aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA
+b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ
+Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV
+PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO
+pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu
+UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY
+MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
+HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4
+9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW
+s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5
+Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg
+cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM
+79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz
+/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt
+ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm
+Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK
+QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ
+w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi
+S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07
+mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
+-----END CERTIFICATE-----
+
+# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation
+# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation
+# Label: "SSL.com EV Root Certification Authority ECC"
+# Serial: 3182246526754555285
+# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90
+# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d
+# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8
+-----BEGIN CERTIFICATE-----
+MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC
+VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T
+U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx
+NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv
+dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv
+bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49
+AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA
+VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku
+WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP
+MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX
+5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ
+ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg
+h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
+-----END CERTIFICATE-----
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/certs.py b/vendor/pip-9.0.3/pip/_vendor/requests/certs.py
new file mode 100644
index 0000000000000000000000000000000000000000..06a594e58f6746041edf371bc3dc8ca42b612322
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/certs.py
@@ -0,0 +1,18 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+requests.certs
+~~~~~~~~~~~~~~
+
+This module returns the preferred default CA certificate bundle. There is
+only one — the one from the certifi package.
+
+If you are packaging Requests, e.g., for a Linux distribution or a managed
+environment, you can change the definition of where() to return a separately
+packaged CA bundle.
+"""
+from pip._vendor.certifi import where
+
+if __name__ == '__main__':
+    print(where())
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/compat.py b/vendor/pip-9.0.3/pip/_vendor/requests/compat.py
new file mode 100644
index 0000000000000000000000000000000000000000..9c7d6d8d4cf9415e65ce4cd2d1b360298e491f9a
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/compat.py
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.compat
+~~~~~~~~~~~~~~~
+
+This module handles import compatibility issues between Python 2 and
+Python 3.
+"""
+
+from pip._vendor import chardet
+
+import sys
+
+# -------
+# Pythons
+# -------
+
+# Syntax sugar.
+_ver = sys.version_info
+
+#: Python 2.x?
+is_py2 = (_ver[0] == 2)
+
+#: Python 3.x?
+is_py3 = (_ver[0] == 3)
+
+# try:
+#     import simplejson as json
+# except ImportError:
+import json
+
+# ---------
+# Specifics
+# ---------
+
+if is_py2:
+    from urllib import (
+        quote, unquote, quote_plus, unquote_plus, urlencode, getproxies,
+        proxy_bypass, proxy_bypass_environment, getproxies_environment)
+    from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag
+    from urllib2 import parse_http_list
+    import cookielib
+    from Cookie import Morsel
+    from StringIO import StringIO
+
+    from pip._vendor.urllib3.packages.ordered_dict import OrderedDict
+
+    builtin_str = str
+    bytes = str
+    str = unicode
+    basestring = basestring
+    numeric_types = (int, long, float)
+    integer_types = (int, long)
+
+elif is_py3:
+    from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag
+    from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment
+    from http import cookiejar as cookielib
+    from http.cookies import Morsel
+    from io import StringIO
+    from collections import OrderedDict
+
+    builtin_str = str
+    str = str
+    bytes = bytes
+    basestring = (str, bytes)
+    numeric_types = (int, float)
+    integer_types = (int,)
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/cookies.py b/vendor/pip-9.0.3/pip/_vendor/requests/cookies.py
new file mode 100644
index 0000000000000000000000000000000000000000..ab3c88b9bf3be75044fbe584ac2511b88f2c4962
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/cookies.py
@@ -0,0 +1,542 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.cookies
+~~~~~~~~~~~~~~~~
+
+Compatibility code to be able to use `cookielib.CookieJar` with requests.
+
+requests.utils imports from here, so be careful with imports.
+"""
+
+import copy
+import time
+import calendar
+import collections
+
+from ._internal_utils import to_native_string
+from .compat import cookielib, urlparse, urlunparse, Morsel
+
+try:
+    import threading
+except ImportError:
+    import dummy_threading as threading
+
+
+class MockRequest(object):
+    """Wraps a `requests.Request` to mimic a `urllib2.Request`.
+
+    The code in `cookielib.CookieJar` expects this interface in order to correctly
+    manage cookie policies, i.e., determine whether a cookie can be set, given the
+    domains of the request and the cookie.
+
+    The original request object is read-only. The client is responsible for collecting
+    the new headers via `get_new_headers()` and interpreting them appropriately. You
+    probably want `get_cookie_header`, defined below.
+    """
+
+    def __init__(self, request):
+        self._r = request
+        self._new_headers = {}
+        self.type = urlparse(self._r.url).scheme
+
+    def get_type(self):
+        return self.type
+
+    def get_host(self):
+        return urlparse(self._r.url).netloc
+
+    def get_origin_req_host(self):
+        return self.get_host()
+
+    def get_full_url(self):
+        # Only return the response's URL if the user hadn't set the Host
+        # header
+        if not self._r.headers.get('Host'):
+            return self._r.url
+        # If they did set it, retrieve it and reconstruct the expected domain
+        host = to_native_string(self._r.headers['Host'], encoding='utf-8')
+        parsed = urlparse(self._r.url)
+        # Reconstruct the URL as we expect it
+        return urlunparse([
+            parsed.scheme, host, parsed.path, parsed.params, parsed.query,
+            parsed.fragment
+        ])
+
+    def is_unverifiable(self):
+        return True
+
+    def has_header(self, name):
+        return name in self._r.headers or name in self._new_headers
+
+    def get_header(self, name, default=None):
+        return self._r.headers.get(name, self._new_headers.get(name, default))
+
+    def add_header(self, key, val):
+        """cookielib has no legitimate use for this method; add it back if you find one."""
+        raise NotImplementedError("Cookie headers should be added with add_unredirected_header()")
+
+    def add_unredirected_header(self, name, value):
+        self._new_headers[name] = value
+
+    def get_new_headers(self):
+        return self._new_headers
+
+    @property
+    def unverifiable(self):
+        return self.is_unverifiable()
+
+    @property
+    def origin_req_host(self):
+        return self.get_origin_req_host()
+
+    @property
+    def host(self):
+        return self.get_host()
+
+
+class MockResponse(object):
+    """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`.
+
+    ...what? Basically, expose the parsed HTTP headers from the server response
+    the way `cookielib` expects to see them.
+    """
+
+    def __init__(self, headers):
+        """Make a MockResponse for `cookielib` to read.
+
+        :param headers: a httplib.HTTPMessage or analogous carrying the headers
+        """
+        self._headers = headers
+
+    def info(self):
+        return self._headers
+
+    def getheaders(self, name):
+        self._headers.getheaders(name)
+
+
+def extract_cookies_to_jar(jar, request, response):
+    """Extract the cookies from the response into a CookieJar.
+
+    :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar)
+    :param request: our own requests.Request object
+    :param response: urllib3.HTTPResponse object
+    """
+    if not (hasattr(response, '_original_response') and
+            response._original_response):
+        return
+    # the _original_response field is the wrapped httplib.HTTPResponse object,
+    req = MockRequest(request)
+    # pull out the HTTPMessage with the headers and put it in the mock:
+    res = MockResponse(response._original_response.msg)
+    jar.extract_cookies(res, req)
+
+
+def get_cookie_header(jar, request):
+    """
+    Produce an appropriate Cookie header string to be sent with `request`, or None.
+
+    :rtype: str
+    """
+    r = MockRequest(request)
+    jar.add_cookie_header(r)
+    return r.get_new_headers().get('Cookie')
+
+
+def remove_cookie_by_name(cookiejar, name, domain=None, path=None):
+    """Unsets a cookie by name, by default over all domains and paths.
+
+    Wraps CookieJar.clear(), is O(n).
+    """
+    clearables = []
+    for cookie in cookiejar:
+        if cookie.name != name:
+            continue
+        if domain is not None and domain != cookie.domain:
+            continue
+        if path is not None and path != cookie.path:
+            continue
+        clearables.append((cookie.domain, cookie.path, cookie.name))
+
+    for domain, path, name in clearables:
+        cookiejar.clear(domain, path, name)
+
+
+class CookieConflictError(RuntimeError):
+    """There are two cookies that meet the criteria specified in the cookie jar.
+    Use .get and .set and include domain and path args in order to be more specific.
+    """
+
+
+class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping):
+    """Compatibility class; is a cookielib.CookieJar, but exposes a dict
+    interface.
+
+    This is the CookieJar we create by default for requests and sessions that
+    don't specify one, since some clients may expect response.cookies and
+    session.cookies to support dict operations.
+
+    Requests does not use the dict interface internally; it's just for
+    compatibility with external client code. All requests code should work
+    out of the box with externally provided instances of ``CookieJar``, e.g.
+    ``LWPCookieJar`` and ``FileCookieJar``.
+
+    Unlike a regular CookieJar, this class is pickleable.
+
+    .. warning:: dictionary operations that are normally O(1) may be O(n).
+    """
+
+    def get(self, name, default=None, domain=None, path=None):
+        """Dict-like get() that also supports optional domain and path args in
+        order to resolve naming collisions from using one cookie jar over
+        multiple domains.
+
+        .. warning:: operation is O(n), not O(1).
+        """
+        try:
+            return self._find_no_duplicates(name, domain, path)
+        except KeyError:
+            return default
+
+    def set(self, name, value, **kwargs):
+        """Dict-like set() that also supports optional domain and path args in
+        order to resolve naming collisions from using one cookie jar over
+        multiple domains.
+        """
+        # support client code that unsets cookies by assignment of a None value:
+        if value is None:
+            remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path'))
+            return
+
+        if isinstance(value, Morsel):
+            c = morsel_to_cookie(value)
+        else:
+            c = create_cookie(name, value, **kwargs)
+        self.set_cookie(c)
+        return c
+
+    def iterkeys(self):
+        """Dict-like iterkeys() that returns an iterator of names of cookies
+        from the jar.
+
+        .. seealso:: itervalues() and iteritems().
+        """
+        for cookie in iter(self):
+            yield cookie.name
+
+    def keys(self):
+        """Dict-like keys() that returns a list of names of cookies from the
+        jar.
+
+        .. seealso:: values() and items().
+        """
+        return list(self.iterkeys())
+
+    def itervalues(self):
+        """Dict-like itervalues() that returns an iterator of values of cookies
+        from the jar.
+
+        .. seealso:: iterkeys() and iteritems().
+        """
+        for cookie in iter(self):
+            yield cookie.value
+
+    def values(self):
+        """Dict-like values() that returns a list of values of cookies from the
+        jar.
+
+        .. seealso:: keys() and items().
+        """
+        return list(self.itervalues())
+
+    def iteritems(self):
+        """Dict-like iteritems() that returns an iterator of name-value tuples
+        from the jar.
+
+        .. seealso:: iterkeys() and itervalues().
+        """
+        for cookie in iter(self):
+            yield cookie.name, cookie.value
+
+    def items(self):
+        """Dict-like items() that returns a list of name-value tuples from the
+        jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a
+        vanilla python dict of key value pairs.
+
+        .. seealso:: keys() and values().
+        """
+        return list(self.iteritems())
+
+    def list_domains(self):
+        """Utility method to list all the domains in the jar."""
+        domains = []
+        for cookie in iter(self):
+            if cookie.domain not in domains:
+                domains.append(cookie.domain)
+        return domains
+
+    def list_paths(self):
+        """Utility method to list all the paths in the jar."""
+        paths = []
+        for cookie in iter(self):
+            if cookie.path not in paths:
+                paths.append(cookie.path)
+        return paths
+
+    def multiple_domains(self):
+        """Returns True if there are multiple domains in the jar.
+        Returns False otherwise.
+
+        :rtype: bool
+        """
+        domains = []
+        for cookie in iter(self):
+            if cookie.domain is not None and cookie.domain in domains:
+                return True
+            domains.append(cookie.domain)
+        return False  # there is only one domain in jar
+
+    def get_dict(self, domain=None, path=None):
+        """Takes as an argument an optional domain and path and returns a plain
+        old Python dict of name-value pairs of cookies that meet the
+        requirements.
+
+        :rtype: dict
+        """
+        dictionary = {}
+        for cookie in iter(self):
+            if (
+                (domain is None or cookie.domain == domain) and
+                (path is None or cookie.path == path)
+            ):
+                dictionary[cookie.name] = cookie.value
+        return dictionary
+
+    def __contains__(self, name):
+        try:
+            return super(RequestsCookieJar, self).__contains__(name)
+        except CookieConflictError:
+            return True
+
+    def __getitem__(self, name):
+        """Dict-like __getitem__() for compatibility with client code. Throws
+        exception if there are more than one cookie with name. In that case,
+        use the more explicit get() method instead.
+
+        .. warning:: operation is O(n), not O(1).
+        """
+        return self._find_no_duplicates(name)
+
+    def __setitem__(self, name, value):
+        """Dict-like __setitem__ for compatibility with client code. Throws
+        exception if there is already a cookie of that name in the jar. In that
+        case, use the more explicit set() method instead.
+        """
+        self.set(name, value)
+
+    def __delitem__(self, name):
+        """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s
+        ``remove_cookie_by_name()``.
+        """
+        remove_cookie_by_name(self, name)
+
+    def set_cookie(self, cookie, *args, **kwargs):
+        if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'):
+            cookie.value = cookie.value.replace('\\"', '')
+        return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs)
+
+    def update(self, other):
+        """Updates this jar with cookies from another CookieJar or dict-like"""
+        if isinstance(other, cookielib.CookieJar):
+            for cookie in other:
+                self.set_cookie(copy.copy(cookie))
+        else:
+            super(RequestsCookieJar, self).update(other)
+
+    def _find(self, name, domain=None, path=None):
+        """Requests uses this method internally to get cookie values.
+
+        If there are conflicting cookies, _find arbitrarily chooses one.
+        See _find_no_duplicates if you want an exception thrown if there are
+        conflicting cookies.
+
+        :param name: a string containing name of cookie
+        :param domain: (optional) string containing domain of cookie
+        :param path: (optional) string containing path of cookie
+        :return: cookie.value
+        """
+        for cookie in iter(self):
+            if cookie.name == name:
+                if domain is None or cookie.domain == domain:
+                    if path is None or cookie.path == path:
+                        return cookie.value
+
+        raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
+
+    def _find_no_duplicates(self, name, domain=None, path=None):
+        """Both ``__get_item__`` and ``get`` call this function: it's never
+        used elsewhere in Requests.
+
+        :param name: a string containing name of cookie
+        :param domain: (optional) string containing domain of cookie
+        :param path: (optional) string containing path of cookie
+        :raises KeyError: if cookie is not found
+        :raises CookieConflictError: if there are multiple cookies
+            that match name and optionally domain and path
+        :return: cookie.value
+        """
+        toReturn = None
+        for cookie in iter(self):
+            if cookie.name == name:
+                if domain is None or cookie.domain == domain:
+                    if path is None or cookie.path == path:
+                        if toReturn is not None:  # if there are multiple cookies that meet passed in criteria
+                            raise CookieConflictError('There are multiple cookies with name, %r' % (name))
+                        toReturn = cookie.value  # we will eventually return this as long as no cookie conflict
+
+        if toReturn:
+            return toReturn
+        raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
+
+    def __getstate__(self):
+        """Unlike a normal CookieJar, this class is pickleable."""
+        state = self.__dict__.copy()
+        # remove the unpickleable RLock object
+        state.pop('_cookies_lock')
+        return state
+
+    def __setstate__(self, state):
+        """Unlike a normal CookieJar, this class is pickleable."""
+        self.__dict__.update(state)
+        if '_cookies_lock' not in self.__dict__:
+            self._cookies_lock = threading.RLock()
+
+    def copy(self):
+        """Return a copy of this RequestsCookieJar."""
+        new_cj = RequestsCookieJar()
+        new_cj.update(self)
+        return new_cj
+
+
+def _copy_cookie_jar(jar):
+    if jar is None:
+        return None
+
+    if hasattr(jar, 'copy'):
+        # We're dealing with an instance of RequestsCookieJar
+        return jar.copy()
+    # We're dealing with a generic CookieJar instance
+    new_jar = copy.copy(jar)
+    new_jar.clear()
+    for cookie in jar:
+        new_jar.set_cookie(copy.copy(cookie))
+    return new_jar
+
+
+def create_cookie(name, value, **kwargs):
+    """Make a cookie from underspecified parameters.
+
+    By default, the pair of `name` and `value` will be set for the domain ''
+    and sent on every request (this is sometimes called a "supercookie").
+    """
+    result = dict(
+        version=0,
+        name=name,
+        value=value,
+        port=None,
+        domain='',
+        path='/',
+        secure=False,
+        expires=None,
+        discard=True,
+        comment=None,
+        comment_url=None,
+        rest={'HttpOnly': None},
+        rfc2109=False,)
+
+    badargs = set(kwargs) - set(result)
+    if badargs:
+        err = 'create_cookie() got unexpected keyword arguments: %s'
+        raise TypeError(err % list(badargs))
+
+    result.update(kwargs)
+    result['port_specified'] = bool(result['port'])
+    result['domain_specified'] = bool(result['domain'])
+    result['domain_initial_dot'] = result['domain'].startswith('.')
+    result['path_specified'] = bool(result['path'])
+
+    return cookielib.Cookie(**result)
+
+
+def morsel_to_cookie(morsel):
+    """Convert a Morsel object into a Cookie containing the one k/v pair."""
+
+    expires = None
+    if morsel['max-age']:
+        try:
+            expires = int(time.time() + int(morsel['max-age']))
+        except ValueError:
+            raise TypeError('max-age: %s must be integer' % morsel['max-age'])
+    elif morsel['expires']:
+        time_template = '%a, %d-%b-%Y %H:%M:%S GMT'
+        expires = calendar.timegm(
+            time.strptime(morsel['expires'], time_template)
+        )
+    return create_cookie(
+        comment=morsel['comment'],
+        comment_url=bool(morsel['comment']),
+        discard=False,
+        domain=morsel['domain'],
+        expires=expires,
+        name=morsel.key,
+        path=morsel['path'],
+        port=None,
+        rest={'HttpOnly': morsel['httponly']},
+        rfc2109=False,
+        secure=bool(morsel['secure']),
+        value=morsel.value,
+        version=morsel['version'] or 0,
+    )
+
+
+def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True):
+    """Returns a CookieJar from a key/value dictionary.
+
+    :param cookie_dict: Dict of key/values to insert into CookieJar.
+    :param cookiejar: (optional) A cookiejar to add the cookies to.
+    :param overwrite: (optional) If False, will not replace cookies
+        already in the jar with new ones.
+    """
+    if cookiejar is None:
+        cookiejar = RequestsCookieJar()
+
+    if cookie_dict is not None:
+        names_from_jar = [cookie.name for cookie in cookiejar]
+        for name in cookie_dict:
+            if overwrite or (name not in names_from_jar):
+                cookiejar.set_cookie(create_cookie(name, cookie_dict[name]))
+
+    return cookiejar
+
+
+def merge_cookies(cookiejar, cookies):
+    """Add cookies to cookiejar and returns a merged CookieJar.
+
+    :param cookiejar: CookieJar object to add the cookies to.
+    :param cookies: Dictionary or CookieJar object to be added.
+    """
+    if not isinstance(cookiejar, cookielib.CookieJar):
+        raise ValueError('You can only merge into CookieJar')
+
+    if isinstance(cookies, dict):
+        cookiejar = cookiejar_from_dict(
+            cookies, cookiejar=cookiejar, overwrite=False)
+    elif isinstance(cookies, cookielib.CookieJar):
+        try:
+            cookiejar.update(cookies)
+        except AttributeError:
+            for cookie_in_jar in cookies:
+                cookiejar.set_cookie(cookie_in_jar)
+
+    return cookiejar
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/exceptions.py b/vendor/pip-9.0.3/pip/_vendor/requests/exceptions.py
new file mode 100644
index 0000000000000000000000000000000000000000..3e5d0b2dbe9c5b8fbce4f52fc65010183b224040
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/exceptions.py
@@ -0,0 +1,122 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.exceptions
+~~~~~~~~~~~~~~~~~~~
+
+This module contains the set of Requests' exceptions.
+"""
+from pip._vendor.urllib3.exceptions import HTTPError as BaseHTTPError
+
+
+class RequestException(IOError):
+    """There was an ambiguous exception that occurred while handling your
+    request.
+    """
+
+    def __init__(self, *args, **kwargs):
+        """Initialize RequestException with `request` and `response` objects."""
+        response = kwargs.pop('response', None)
+        self.response = response
+        self.request = kwargs.pop('request', None)
+        if (response is not None and not self.request and
+                hasattr(response, 'request')):
+            self.request = self.response.request
+        super(RequestException, self).__init__(*args, **kwargs)
+
+
+class HTTPError(RequestException):
+    """An HTTP error occurred."""
+
+
+class ConnectionError(RequestException):
+    """A Connection error occurred."""
+
+
+class ProxyError(ConnectionError):
+    """A proxy error occurred."""
+
+
+class SSLError(ConnectionError):
+    """An SSL error occurred."""
+
+
+class Timeout(RequestException):
+    """The request timed out.
+
+    Catching this error will catch both
+    :exc:`~requests.exceptions.ConnectTimeout` and
+    :exc:`~requests.exceptions.ReadTimeout` errors.
+    """
+
+
+class ConnectTimeout(ConnectionError, Timeout):
+    """The request timed out while trying to connect to the remote server.
+
+    Requests that produced this error are safe to retry.
+    """
+
+
+class ReadTimeout(Timeout):
+    """The server did not send any data in the allotted amount of time."""
+
+
+class URLRequired(RequestException):
+    """A valid URL is required to make a request."""
+
+
+class TooManyRedirects(RequestException):
+    """Too many redirects."""
+
+
+class MissingSchema(RequestException, ValueError):
+    """The URL schema (e.g. http or https) is missing."""
+
+
+class InvalidSchema(RequestException, ValueError):
+    """See defaults.py for valid schemas."""
+
+
+class InvalidURL(RequestException, ValueError):
+    """The URL provided was somehow invalid."""
+
+
+class InvalidHeader(RequestException, ValueError):
+    """The header value provided was somehow invalid."""
+
+
+class ChunkedEncodingError(RequestException):
+    """The server declared chunked encoding but sent an invalid chunk."""
+
+
+class ContentDecodingError(RequestException, BaseHTTPError):
+    """Failed to decode response content"""
+
+
+class StreamConsumedError(RequestException, TypeError):
+    """The content for this response was already consumed"""
+
+
+class RetryError(RequestException):
+    """Custom retries logic failed"""
+
+
+class UnrewindableBodyError(RequestException):
+    """Requests encountered an error when trying to rewind a body"""
+
+# Warnings
+
+
+class RequestsWarning(Warning):
+    """Base warning for Requests."""
+    pass
+
+
+class FileModeWarning(RequestsWarning, DeprecationWarning):
+    """A file was opened in text mode, but Requests determined its binary length."""
+    pass
+
+
+class RequestsDependencyWarning(RequestsWarning):
+    """An imported dependency doesn't match the expected version range."""
+    pass
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/help.py b/vendor/pip-9.0.3/pip/_vendor/requests/help.py
new file mode 100644
index 0000000000000000000000000000000000000000..7c4b193c90649a72d63f125362897b87a2868c80
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/help.py
@@ -0,0 +1,120 @@
+"""Module containing bug report helper(s)."""
+from __future__ import print_function
+
+import json
+import platform
+import sys
+import ssl
+
+from pip._vendor import idna
+from pip._vendor import urllib3
+from pip._vendor import chardet
+
+from . import __version__ as requests_version
+
+try:
+    from .packages.urllib3.contrib import pyopenssl
+except ImportError:
+    pyopenssl = None
+    OpenSSL = None
+    cryptography = None
+else:
+    import OpenSSL
+    import cryptography
+
+
+def _implementation():
+    """Return a dict with the Python implementation and version.
+
+    Provide both the name and the version of the Python implementation
+    currently running. For example, on CPython 2.7.5 it will return
+    {'name': 'CPython', 'version': '2.7.5'}.
+
+    This function works best on CPython and PyPy: in particular, it probably
+    doesn't work for Jython or IronPython. Future investigation should be done
+    to work out the correct shape of the code for those platforms.
+    """
+    implementation = platform.python_implementation()
+
+    if implementation == 'CPython':
+        implementation_version = platform.python_version()
+    elif implementation == 'PyPy':
+        implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major,
+                                               sys.pypy_version_info.minor,
+                                               sys.pypy_version_info.micro)
+        if sys.pypy_version_info.releaselevel != 'final':
+            implementation_version = ''.join([
+                implementation_version, sys.pypy_version_info.releaselevel
+            ])
+    elif implementation == 'Jython':
+        implementation_version = platform.python_version()  # Complete Guess
+    elif implementation == 'IronPython':
+        implementation_version = platform.python_version()  # Complete Guess
+    else:
+        implementation_version = 'Unknown'
+
+    return {'name': implementation, 'version': implementation_version}
+
+
+def info():
+    """Generate information for a bug report."""
+    try:
+        platform_info = {
+            'system': platform.system(),
+            'release': platform.release(),
+        }
+    except IOError:
+        platform_info = {
+            'system': 'Unknown',
+            'release': 'Unknown',
+        }
+
+    implementation_info = _implementation()
+    urllib3_info = {'version': urllib3.__version__}
+    chardet_info = {'version': chardet.__version__}
+
+    pyopenssl_info = {
+        'version': None,
+        'openssl_version': '',
+    }
+    if OpenSSL:
+        pyopenssl_info = {
+            'version': OpenSSL.__version__,
+            'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER,
+        }
+    cryptography_info = {
+        'version': getattr(cryptography, '__version__', ''),
+    }
+    idna_info = {
+        'version': getattr(idna, '__version__', ''),
+    }
+
+    # OPENSSL_VERSION_NUMBER doesn't exist in the Python 2.6 ssl module.
+    system_ssl = getattr(ssl, 'OPENSSL_VERSION_NUMBER', None)
+    system_ssl_info = {
+        'version': '%x' % system_ssl if system_ssl is not None else ''
+    }
+
+    return {
+        'platform': platform_info,
+        'implementation': implementation_info,
+        'system_ssl': system_ssl_info,
+        'using_pyopenssl': pyopenssl is not None,
+        'pyOpenSSL': pyopenssl_info,
+        'urllib3': urllib3_info,
+        'chardet': chardet_info,
+        'cryptography': cryptography_info,
+        'idna': idna_info,
+        'requests': {
+            'version': requests_version,
+        },
+    }
+
+
+def main():
+    """Pretty-print the bug information as JSON."""
+    print(json.dumps(info(), sort_keys=True, indent=2))
+
+
+if __name__ == '__main__':
+    main()
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/hooks.py b/vendor/pip-9.0.3/pip/_vendor/requests/hooks.py
new file mode 100644
index 0000000000000000000000000000000000000000..32b32de75047dbc94bc7757801fe3ec4733bad43
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/hooks.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.hooks
+~~~~~~~~~~~~~~
+
+This module provides the capabilities for the Requests hooks system.
+
+Available hooks:
+
+``response``:
+    The response generated from a Request.
+"""
+HOOKS = ['response']
+
+
+def default_hooks():
+    return dict((event, []) for event in HOOKS)
+
+# TODO: response is the only one
+
+
+def dispatch_hook(key, hooks, hook_data, **kwargs):
+    """Dispatches a hook dictionary on a given piece of data."""
+    hooks = hooks or dict()
+    hooks = hooks.get(key)
+    if hooks:
+        if hasattr(hooks, '__call__'):
+            hooks = [hooks]
+        for hook in hooks:
+            _hook_data = hook(hook_data, **kwargs)
+            if _hook_data is not None:
+                hook_data = _hook_data
+    return hook_data
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/models.py b/vendor/pip-9.0.3/pip/_vendor/requests/models.py
new file mode 100644
index 0000000000000000000000000000000000000000..4254fbd20cff7316da191e54fe2e7b1559deafee
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/models.py
@@ -0,0 +1,948 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.models
+~~~~~~~~~~~~~~~
+
+This module contains the primary objects that power Requests.
+"""
+
+import collections
+import datetime
+import sys
+
+# Import encoding now, to avoid implicit import later.
+# Implicit import within threads may cause LookupError when standard library is in a ZIP,
+# such as in Embedded Python. See https://github.com/requests/requests/issues/3578.
+import encodings.idna
+
+from pip._vendor.urllib3.fields import RequestField
+from pip._vendor.urllib3.filepost import encode_multipart_formdata
+from pip._vendor.urllib3.util import parse_url
+from pip._vendor.urllib3.exceptions import (
+    DecodeError, ReadTimeoutError, ProtocolError, LocationParseError)
+
+from io import UnsupportedOperation
+from .hooks import default_hooks
+from .structures import CaseInsensitiveDict
+
+from .auth import HTTPBasicAuth
+from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar
+from .exceptions import (
+    HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError,
+    ContentDecodingError, ConnectionError, StreamConsumedError)
+from ._internal_utils import to_native_string, unicode_is_ascii
+from .utils import (
+    guess_filename, get_auth_from_url, requote_uri,
+    stream_decode_response_unicode, to_key_val_list, parse_header_links,
+    iter_slices, guess_json_utf, super_len, check_header_validity)
+from .compat import (
+    cookielib, urlunparse, urlsplit, urlencode, str, bytes,
+    is_py2, chardet, builtin_str, basestring)
+from .compat import json as complexjson
+from .status_codes import codes
+
+#: The set of HTTP status codes that indicate an automatically
+#: processable redirect.
+REDIRECT_STATI = (
+    codes.moved,               # 301
+    codes.found,               # 302
+    codes.other,               # 303
+    codes.temporary_redirect,  # 307
+    codes.permanent_redirect,  # 308
+)
+
+DEFAULT_REDIRECT_LIMIT = 30
+CONTENT_CHUNK_SIZE = 10 * 1024
+ITER_CHUNK_SIZE = 512
+
+
+class RequestEncodingMixin(object):
+    @property
+    def path_url(self):
+        """Build the path URL to use."""
+
+        url = []
+
+        p = urlsplit(self.url)
+
+        path = p.path
+        if not path:
+            path = '/'
+
+        url.append(path)
+
+        query = p.query
+        if query:
+            url.append('?')
+            url.append(query)
+
+        return ''.join(url)
+
+    @staticmethod
+    def _encode_params(data):
+        """Encode parameters in a piece of data.
+
+        Will successfully encode parameters when passed as a dict or a list of
+        2-tuples. Order is retained if data is a list of 2-tuples but arbitrary
+        if parameters are supplied as a dict.
+        """
+
+        if isinstance(data, (str, bytes)):
+            return data
+        elif hasattr(data, 'read'):
+            return data
+        elif hasattr(data, '__iter__'):
+            result = []
+            for k, vs in to_key_val_list(data):
+                if isinstance(vs, basestring) or not hasattr(vs, '__iter__'):
+                    vs = [vs]
+                for v in vs:
+                    if v is not None:
+                        result.append(
+                            (k.encode('utf-8') if isinstance(k, str) else k,
+                             v.encode('utf-8') if isinstance(v, str) else v))
+            return urlencode(result, doseq=True)
+        else:
+            return data
+
+    @staticmethod
+    def _encode_files(files, data):
+        """Build the body for a multipart/form-data request.
+
+        Will successfully encode files when passed as a dict or a list of
+        tuples. Order is retained if data is a list of tuples but arbitrary
+        if parameters are supplied as a dict.
+        The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype)
+        or 4-tuples (filename, fileobj, contentype, custom_headers).
+        """
+        if (not files):
+            raise ValueError("Files must be provided.")
+        elif isinstance(data, basestring):
+            raise ValueError("Data must not be a string.")
+
+        new_fields = []
+        fields = to_key_val_list(data or {})
+        files = to_key_val_list(files or {})
+
+        for field, val in fields:
+            if isinstance(val, basestring) or not hasattr(val, '__iter__'):
+                val = [val]
+            for v in val:
+                if v is not None:
+                    # Don't call str() on bytestrings: in Py3 it all goes wrong.
+                    if not isinstance(v, bytes):
+                        v = str(v)
+
+                    new_fields.append(
+                        (field.decode('utf-8') if isinstance(field, bytes) else field,
+                         v.encode('utf-8') if isinstance(v, str) else v))
+
+        for (k, v) in files:
+            # support for explicit filename
+            ft = None
+            fh = None
+            if isinstance(v, (tuple, list)):
+                if len(v) == 2:
+                    fn, fp = v
+                elif len(v) == 3:
+                    fn, fp, ft = v
+                else:
+                    fn, fp, ft, fh = v
+            else:
+                fn = guess_filename(v) or k
+                fp = v
+
+            if isinstance(fp, (str, bytes, bytearray)):
+                fdata = fp
+            else:
+                fdata = fp.read()
+
+            rf = RequestField(name=k, data=fdata, filename=fn, headers=fh)
+            rf.make_multipart(content_type=ft)
+            new_fields.append(rf)
+
+        body, content_type = encode_multipart_formdata(new_fields)
+
+        return body, content_type
+
+
+class RequestHooksMixin(object):
+    def register_hook(self, event, hook):
+        """Properly register a hook."""
+
+        if event not in self.hooks:
+            raise ValueError('Unsupported event specified, with event name "%s"' % (event))
+
+        if isinstance(hook, collections.Callable):
+            self.hooks[event].append(hook)
+        elif hasattr(hook, '__iter__'):
+            self.hooks[event].extend(h for h in hook if isinstance(h, collections.Callable))
+
+    def deregister_hook(self, event, hook):
+        """Deregister a previously registered hook.
+        Returns True if the hook existed, False if not.
+        """
+
+        try:
+            self.hooks[event].remove(hook)
+            return True
+        except ValueError:
+            return False
+
+
+class Request(RequestHooksMixin):
+    """A user-created :class:`Request <Request>` object.
+
+    Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server.
+
+    :param method: HTTP method to use.
+    :param url: URL to send.
+    :param headers: dictionary of headers to send.
+    :param files: dictionary of {filename: fileobject} files to multipart upload.
+    :param data: the body to attach to the request. If a dictionary is provided, form-encoding will take place.
+    :param json: json for the body to attach to the request (if files or data is not specified).
+    :param params: dictionary of URL parameters to append to the URL.
+    :param auth: Auth handler or (user, pass) tuple.
+    :param cookies: dictionary or CookieJar of cookies to attach to this request.
+    :param hooks: dictionary of callback hooks, for internal usage.
+
+    Usage::
+
+      >>> import requests
+      >>> req = requests.Request('GET', 'http://httpbin.org/get')
+      >>> req.prepare()
+      <PreparedRequest [GET]>
+    """
+
+    def __init__(self,
+            method=None, url=None, headers=None, files=None, data=None,
+            params=None, auth=None, cookies=None, hooks=None, json=None):
+
+        # Default empty dicts for dict params.
+        data = [] if data is None else data
+        files = [] if files is None else files
+        headers = {} if headers is None else headers
+        params = {} if params is None else params
+        hooks = {} if hooks is None else hooks
+
+        self.hooks = default_hooks()
+        for (k, v) in list(hooks.items()):
+            self.register_hook(event=k, hook=v)
+
+        self.method = method
+        self.url = url
+        self.headers = headers
+        self.files = files
+        self.data = data
+        self.json = json
+        self.params = params
+        self.auth = auth
+        self.cookies = cookies
+
+    def __repr__(self):
+        return '<Request [%s]>' % (self.method)
+
+    def prepare(self):
+        """Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it."""
+        p = PreparedRequest()
+        p.prepare(
+            method=self.method,
+            url=self.url,
+            headers=self.headers,
+            files=self.files,
+            data=self.data,
+            json=self.json,
+            params=self.params,
+            auth=self.auth,
+            cookies=self.cookies,
+            hooks=self.hooks,
+        )
+        return p
+
+
+class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
+    """The fully mutable :class:`PreparedRequest <PreparedRequest>` object,
+    containing the exact bytes that will be sent to the server.
+
+    Generated from either a :class:`Request <Request>` object or manually.
+
+    Usage::
+
+      >>> import requests
+      >>> req = requests.Request('GET', 'http://httpbin.org/get')
+      >>> r = req.prepare()
+      <PreparedRequest [GET]>
+
+      >>> s = requests.Session()
+      >>> s.send(r)
+      <Response [200]>
+    """
+
+    def __init__(self):
+        #: HTTP verb to send to the server.
+        self.method = None
+        #: HTTP URL to send the request to.
+        self.url = None
+        #: dictionary of HTTP headers.
+        self.headers = None
+        # The `CookieJar` used to create the Cookie header will be stored here
+        # after prepare_cookies is called
+        self._cookies = None
+        #: request body to send to the server.
+        self.body = None
+        #: dictionary of callback hooks, for internal usage.
+        self.hooks = default_hooks()
+        #: integer denoting starting position of a readable file-like body.
+        self._body_position = None
+
+    def prepare(self,
+            method=None, url=None, headers=None, files=None, data=None,
+            params=None, auth=None, cookies=None, hooks=None, json=None):
+        """Prepares the entire request with the given parameters."""
+
+        self.prepare_method(method)
+        self.prepare_url(url, params)
+        self.prepare_headers(headers)
+        self.prepare_cookies(cookies)
+        self.prepare_body(data, files, json)
+        self.prepare_auth(auth, url)
+
+        # Note that prepare_auth must be last to enable authentication schemes
+        # such as OAuth to work on a fully prepared request.
+
+        # This MUST go after prepare_auth. Authenticators could add a hook
+        self.prepare_hooks(hooks)
+
+    def __repr__(self):
+        return '<PreparedRequest [%s]>' % (self.method)
+
+    def copy(self):
+        p = PreparedRequest()
+        p.method = self.method
+        p.url = self.url
+        p.headers = self.headers.copy() if self.headers is not None else None
+        p._cookies = _copy_cookie_jar(self._cookies)
+        p.body = self.body
+        p.hooks = self.hooks
+        p._body_position = self._body_position
+        return p
+
+    def prepare_method(self, method):
+        """Prepares the given HTTP method."""
+        self.method = method
+        if self.method is not None:
+            self.method = to_native_string(self.method.upper())
+
+    @staticmethod
+    def _get_idna_encoded_host(host):
+        import idna
+
+        try:
+            host = idna.encode(host, uts46=True).decode('utf-8')
+        except idna.IDNAError:
+            raise UnicodeError
+        return host
+
+    def prepare_url(self, url, params):
+        """Prepares the given HTTP URL."""
+        #: Accept objects that have string representations.
+        #: We're unable to blindly call unicode/str functions
+        #: as this will include the bytestring indicator (b'')
+        #: on python 3.x.
+        #: https://github.com/requests/requests/pull/2238
+        if isinstance(url, bytes):
+            url = url.decode('utf8')
+        else:
+            url = unicode(url) if is_py2 else str(url)
+
+        # Remove leading whitespaces from url
+        url = url.lstrip()
+
+        # Don't do any URL preparation for non-HTTP schemes like `mailto`,
+        # `data` etc to work around exceptions from `url_parse`, which
+        # handles RFC 3986 only.
+        if ':' in url and not url.lower().startswith('http'):
+            self.url = url
+            return
+
+        # Support for unicode domain names and paths.
+        try:
+            scheme, auth, host, port, path, query, fragment = parse_url(url)
+        except LocationParseError as e:
+            raise InvalidURL(*e.args)
+
+        if not scheme:
+            error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?")
+            error = error.format(to_native_string(url, 'utf8'))
+
+            raise MissingSchema(error)
+
+        if not host:
+            raise InvalidURL("Invalid URL %r: No host supplied" % url)
+
+        # In general, we want to try IDNA encoding the hostname if the string contains
+        # non-ASCII characters. This allows users to automatically get the correct IDNA
+        # behaviour. For strings containing only ASCII characters, we need to also verify
+        # it doesn't start with a wildcard (*), before allowing the unencoded hostname.
+        if not unicode_is_ascii(host):
+            try:
+                host = self._get_idna_encoded_host(host)
+            except UnicodeError:
+                raise InvalidURL('URL has an invalid label.')
+        elif host.startswith(u'*'):
+            raise InvalidURL('URL has an invalid label.')
+
+        # Carefully reconstruct the network location
+        netloc = auth or ''
+        if netloc:
+            netloc += '@'
+        netloc += host
+        if port:
+            netloc += ':' + str(port)
+
+        # Bare domains aren't valid URLs.
+        if not path:
+            path = '/'
+
+        if is_py2:
+            if isinstance(scheme, str):
+                scheme = scheme.encode('utf-8')
+            if isinstance(netloc, str):
+                netloc = netloc.encode('utf-8')
+            if isinstance(path, str):
+                path = path.encode('utf-8')
+            if isinstance(query, str):
+                query = query.encode('utf-8')
+            if isinstance(fragment, str):
+                fragment = fragment.encode('utf-8')
+
+        if isinstance(params, (str, bytes)):
+            params = to_native_string(params)
+
+        enc_params = self._encode_params(params)
+        if enc_params:
+            if query:
+                query = '%s&%s' % (query, enc_params)
+            else:
+                query = enc_params
+
+        url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment]))
+        self.url = url
+
+    def prepare_headers(self, headers):
+        """Prepares the given HTTP headers."""
+
+        self.headers = CaseInsensitiveDict()
+        if headers:
+            for header in headers.items():
+                # Raise exception on invalid header value.
+                check_header_validity(header)
+                name, value = header
+                self.headers[to_native_string(name)] = value
+
+    def prepare_body(self, data, files, json=None):
+        """Prepares the given HTTP body data."""
+
+        # Check if file, fo, generator, iterator.
+        # If not, run through normal process.
+
+        # Nottin' on you.
+        body = None
+        content_type = None
+
+        if not data and json is not None:
+            # urllib3 requires a bytes-like body. Python 2's json.dumps
+            # provides this natively, but Python 3 gives a Unicode string.
+            content_type = 'application/json'
+            body = complexjson.dumps(json)
+            if not isinstance(body, bytes):
+                body = body.encode('utf-8')
+
+        is_stream = all([
+            hasattr(data, '__iter__'),
+            not isinstance(data, (basestring, list, tuple, collections.Mapping))
+        ])
+
+        try:
+            length = super_len(data)
+        except (TypeError, AttributeError, UnsupportedOperation):
+            length = None
+
+        if is_stream:
+            body = data
+
+            if getattr(body, 'tell', None) is not None:
+                # Record the current file position before reading.
+                # This will allow us to rewind a file in the event
+                # of a redirect.
+                try:
+                    self._body_position = body.tell()
+                except (IOError, OSError):
+                    # This differentiates from None, allowing us to catch
+                    # a failed `tell()` later when trying to rewind the body
+                    self._body_position = object()
+
+            if files:
+                raise NotImplementedError('Streamed bodies and files are mutually exclusive.')
+
+            if length:
+                self.headers['Content-Length'] = builtin_str(length)
+            else:
+                self.headers['Transfer-Encoding'] = 'chunked'
+        else:
+            # Multi-part file uploads.
+            if files:
+                (body, content_type) = self._encode_files(files, data)
+            else:
+                if data:
+                    body = self._encode_params(data)
+                    if isinstance(data, basestring) or hasattr(data, 'read'):
+                        content_type = None
+                    else:
+                        content_type = 'application/x-www-form-urlencoded'
+
+            self.prepare_content_length(body)
+
+            # Add content-type if it wasn't explicitly provided.
+            if content_type and ('content-type' not in self.headers):
+                self.headers['Content-Type'] = content_type
+
+        self.body = body
+
+    def prepare_content_length(self, body):
+        """Prepare Content-Length header based on request method and body"""
+        if body is not None:
+            length = super_len(body)
+            if length:
+                # If length exists, set it. Otherwise, we fallback
+                # to Transfer-Encoding: chunked.
+                self.headers['Content-Length'] = builtin_str(length)
+        elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None:
+            # Set Content-Length to 0 for methods that can have a body
+            # but don't provide one. (i.e. not GET or HEAD)
+            self.headers['Content-Length'] = '0'
+
+    def prepare_auth(self, auth, url=''):
+        """Prepares the given HTTP auth data."""
+
+        # If no Auth is explicitly provided, extract it from the URL first.
+        if auth is None:
+            url_auth = get_auth_from_url(self.url)
+            auth = url_auth if any(url_auth) else None
+
+        if auth:
+            if isinstance(auth, tuple) and len(auth) == 2:
+                # special-case basic HTTP auth
+                auth = HTTPBasicAuth(*auth)
+
+            # Allow auth to make its changes.
+            r = auth(self)
+
+            # Update self to reflect the auth changes.
+            self.__dict__.update(r.__dict__)
+
+            # Recompute Content-Length
+            self.prepare_content_length(self.body)
+
+    def prepare_cookies(self, cookies):
+        """Prepares the given HTTP cookie data.
+
+        This function eventually generates a ``Cookie`` header from the
+        given cookies using cookielib. Due to cookielib's design, the header
+        will not be regenerated if it already exists, meaning this function
+        can only be called once for the life of the
+        :class:`PreparedRequest <PreparedRequest>` object. Any subsequent calls
+        to ``prepare_cookies`` will have no actual effect, unless the "Cookie"
+        header is removed beforehand.
+        """
+        if isinstance(cookies, cookielib.CookieJar):
+            self._cookies = cookies
+        else:
+            self._cookies = cookiejar_from_dict(cookies)
+
+        cookie_header = get_cookie_header(self._cookies, self)
+        if cookie_header is not None:
+            self.headers['Cookie'] = cookie_header
+
+    def prepare_hooks(self, hooks):
+        """Prepares the given hooks."""
+        # hooks can be passed as None to the prepare method and to this
+        # method. To prevent iterating over None, simply use an empty list
+        # if hooks is False-y
+        hooks = hooks or []
+        for event in hooks:
+            self.register_hook(event, hooks[event])
+
+
+class Response(object):
+    """The :class:`Response <Response>` object, which contains a
+    server's response to an HTTP request.
+    """
+
+    __attrs__ = [
+        '_content', 'status_code', 'headers', 'url', 'history',
+        'encoding', 'reason', 'cookies', 'elapsed', 'request'
+    ]
+
+    def __init__(self):
+        self._content = False
+        self._content_consumed = False
+        self._next = None
+
+        #: Integer Code of responded HTTP Status, e.g. 404 or 200.
+        self.status_code = None
+
+        #: Case-insensitive Dictionary of Response Headers.
+        #: For example, ``headers['content-encoding']`` will return the
+        #: value of a ``'Content-Encoding'`` response header.
+        self.headers = CaseInsensitiveDict()
+
+        #: File-like object representation of response (for advanced usage).
+        #: Use of ``raw`` requires that ``stream=True`` be set on the request.
+        # This requirement does not apply for use internally to Requests.
+        self.raw = None
+
+        #: Final URL location of Response.
+        self.url = None
+
+        #: Encoding to decode with when accessing r.text.
+        self.encoding = None
+
+        #: A list of :class:`Response <Response>` objects from
+        #: the history of the Request. Any redirect responses will end
+        #: up here. The list is sorted from the oldest to the most recent request.
+        self.history = []
+
+        #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK".
+        self.reason = None
+
+        #: A CookieJar of Cookies the server sent back.
+        self.cookies = cookiejar_from_dict({})
+
+        #: The amount of time elapsed between sending the request
+        #: and the arrival of the response (as a timedelta).
+        #: This property specifically measures the time taken between sending
+        #: the first byte of the request and finishing parsing the headers. It
+        #: is therefore unaffected by consuming the response content or the
+        #: value of the ``stream`` keyword argument.
+        self.elapsed = datetime.timedelta(0)
+
+        #: The :class:`PreparedRequest <PreparedRequest>` object to which this
+        #: is a response.
+        self.request = None
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, *args):
+        self.close()
+
+    def __getstate__(self):
+        # Consume everything; accessing the content attribute makes
+        # sure the content has been fully read.
+        if not self._content_consumed:
+            self.content
+
+        return dict(
+            (attr, getattr(self, attr, None))
+            for attr in self.__attrs__
+        )
+
+    def __setstate__(self, state):
+        for name, value in state.items():
+            setattr(self, name, value)
+
+        # pickled objects do not have .raw
+        setattr(self, '_content_consumed', True)
+        setattr(self, 'raw', None)
+
+    def __repr__(self):
+        return '<Response [%s]>' % (self.status_code)
+
+    def __bool__(self):
+        """Returns True if :attr:`status_code` is less than 400.
+
+        This attribute checks if the status code of the response is between
+        400 and 600 to see if there was a client error or a server error. If
+        the status code, is between 200 and 400, this will return True. This
+        is **not** a check to see if the response code is ``200 OK``.
+        """
+        return self.ok
+
+    def __nonzero__(self):
+        """Returns True if :attr:`status_code` is less than 400.
+
+        This attribute checks if the status code of the response is between
+        400 and 600 to see if there was a client error or a server error. If
+        the status code, is between 200 and 400, this will return True. This
+        is **not** a check to see if the response code is ``200 OK``.
+        """
+        return self.ok
+
+    def __iter__(self):
+        """Allows you to use a response as an iterator."""
+        return self.iter_content(128)
+
+    @property
+    def ok(self):
+        """Returns True if :attr:`status_code` is less than 400.
+
+        This attribute checks if the status code of the response is between
+        400 and 600 to see if there was a client error or a server error. If
+        the status code, is between 200 and 400, this will return True. This
+        is **not** a check to see if the response code is ``200 OK``.
+        """
+        try:
+            self.raise_for_status()
+        except HTTPError:
+            return False
+        return True
+
+    @property
+    def is_redirect(self):
+        """True if this Response is a well-formed HTTP redirect that could have
+        been processed automatically (by :meth:`Session.resolve_redirects`).
+        """
+        return ('location' in self.headers and self.status_code in REDIRECT_STATI)
+
+    @property
+    def is_permanent_redirect(self):
+        """True if this Response one of the permanent versions of redirect."""
+        return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect))
+
+    @property
+    def next(self):
+        """Returns a PreparedRequest for the next request in a redirect chain, if there is one."""
+        return self._next
+
+    @property
+    def apparent_encoding(self):
+        """The apparent encoding, provided by the chardet library."""
+        return chardet.detect(self.content)['encoding']
+
+    def iter_content(self, chunk_size=1, decode_unicode=False):
+        """Iterates over the response data.  When stream=True is set on the
+        request, this avoids reading the content at once into memory for
+        large responses.  The chunk size is the number of bytes it should
+        read into memory.  This is not necessarily the length of each item
+        returned as decoding can take place.
+
+        chunk_size must be of type int or None. A value of None will
+        function differently depending on the value of `stream`.
+        stream=True will read data as it arrives in whatever size the
+        chunks are received. If stream=False, data is returned as
+        a single chunk.
+
+        If decode_unicode is True, content will be decoded using the best
+        available encoding based on the response.
+        """
+
+        def generate():
+            # Special case for urllib3.
+            if hasattr(self.raw, 'stream'):
+                try:
+                    for chunk in self.raw.stream(chunk_size, decode_content=True):
+                        yield chunk
+                except ProtocolError as e:
+                    raise ChunkedEncodingError(e)
+                except DecodeError as e:
+                    raise ContentDecodingError(e)
+                except ReadTimeoutError as e:
+                    raise ConnectionError(e)
+            else:
+                # Standard file-like object.
+                while True:
+                    chunk = self.raw.read(chunk_size)
+                    if not chunk:
+                        break
+                    yield chunk
+
+            self._content_consumed = True
+
+        if self._content_consumed and isinstance(self._content, bool):
+            raise StreamConsumedError()
+        elif chunk_size is not None and not isinstance(chunk_size, int):
+            raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size))
+        # simulate reading small chunks of the content
+        reused_chunks = iter_slices(self._content, chunk_size)
+
+        stream_chunks = generate()
+
+        chunks = reused_chunks if self._content_consumed else stream_chunks
+
+        if decode_unicode:
+            chunks = stream_decode_response_unicode(chunks, self)
+
+        return chunks
+
+    def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None, delimiter=None):
+        """Iterates over the response data, one line at a time.  When
+        stream=True is set on the request, this avoids reading the
+        content at once into memory for large responses.
+
+        .. note:: This method is not reentrant safe.
+        """
+
+        pending = None
+
+        for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode):
+
+            if pending is not None:
+                chunk = pending + chunk
+
+            if delimiter:
+                lines = chunk.split(delimiter)
+            else:
+                lines = chunk.splitlines()
+
+            if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]:
+                pending = lines.pop()
+            else:
+                pending = None
+
+            for line in lines:
+                yield line
+
+        if pending is not None:
+            yield pending
+
+    @property
+    def content(self):
+        """Content of the response, in bytes."""
+
+        if self._content is False:
+            # Read the contents.
+            if self._content_consumed:
+                raise RuntimeError(
+                    'The content for this response was already consumed')
+
+            if self.status_code == 0 or self.raw is None:
+                self._content = None
+            else:
+                self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes()
+
+        self._content_consumed = True
+        # don't need to release the connection; that's been handled by urllib3
+        # since we exhausted the data.
+        return self._content
+
+    @property
+    def text(self):
+        """Content of the response, in unicode.
+
+        If Response.encoding is None, encoding will be guessed using
+        ``chardet``.
+
+        The encoding of the response content is determined based solely on HTTP
+        headers, following RFC 2616 to the letter. If you can take advantage of
+        non-HTTP knowledge to make a better guess at the encoding, you should
+        set ``r.encoding`` appropriately before accessing this property.
+        """
+
+        # Try charset from content-type
+        content = None
+        encoding = self.encoding
+
+        if not self.content:
+            return str('')
+
+        # Fallback to auto-detected encoding.
+        if self.encoding is None:
+            encoding = self.apparent_encoding
+
+        # Decode unicode from given encoding.
+        try:
+            content = str(self.content, encoding, errors='replace')
+        except (LookupError, TypeError):
+            # A LookupError is raised if the encoding was not found which could
+            # indicate a misspelling or similar mistake.
+            #
+            # A TypeError can be raised if encoding is None
+            #
+            # So we try blindly encoding.
+            content = str(self.content, errors='replace')
+
+        return content
+
+    def json(self, **kwargs):
+        r"""Returns the json-encoded content of a response, if any.
+
+        :param \*\*kwargs: Optional arguments that ``json.loads`` takes.
+        :raises ValueError: If the response body does not contain valid json.
+        """
+
+        if not self.encoding and self.content and len(self.content) > 3:
+            # No encoding set. JSON RFC 4627 section 3 states we should expect
+            # UTF-8, -16 or -32. Detect which one to use; If the detection or
+            # decoding fails, fall back to `self.text` (using chardet to make
+            # a best guess).
+            encoding = guess_json_utf(self.content)
+            if encoding is not None:
+                try:
+                    return complexjson.loads(
+                        self.content.decode(encoding), **kwargs
+                    )
+                except UnicodeDecodeError:
+                    # Wrong UTF codec detected; usually because it's not UTF-8
+                    # but some other 8-bit codec.  This is an RFC violation,
+                    # and the server didn't bother to tell us what codec *was*
+                    # used.
+                    pass
+        return complexjson.loads(self.text, **kwargs)
+
+    @property
+    def links(self):
+        """Returns the parsed header links of the response, if any."""
+
+        header = self.headers.get('link')
+
+        # l = MultiDict()
+        l = {}
+
+        if header:
+            links = parse_header_links(header)
+
+            for link in links:
+                key = link.get('rel') or link.get('url')
+                l[key] = link
+
+        return l
+
+    def raise_for_status(self):
+        """Raises stored :class:`HTTPError`, if one occurred."""
+
+        http_error_msg = ''
+        if isinstance(self.reason, bytes):
+            # We attempt to decode utf-8 first because some servers
+            # choose to localize their reason strings. If the string
+            # isn't utf-8, we fall back to iso-8859-1 for all other
+            # encodings. (See PR #3538)
+            try:
+                reason = self.reason.decode('utf-8')
+            except UnicodeDecodeError:
+                reason = self.reason.decode('iso-8859-1')
+        else:
+            reason = self.reason
+
+        if 400 <= self.status_code < 500:
+            http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url)
+
+        elif 500 <= self.status_code < 600:
+            http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url)
+
+        if http_error_msg:
+            raise HTTPError(http_error_msg, response=self)
+
+    def close(self):
+        """Releases the connection back to the pool. Once this method has been
+        called the underlying ``raw`` object must not be accessed again.
+
+        *Note: Should not normally need to be called explicitly.*
+        """
+        if not self._content_consumed:
+            self.raw.close()
+
+        release_conn = getattr(self.raw, 'release_conn', None)
+        if release_conn is not None:
+            release_conn()
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/packages.py b/vendor/pip-9.0.3/pip/_vendor/requests/packages.py
new file mode 100644
index 0000000000000000000000000000000000000000..9582fa730f121634348a79c1a8b0cc2df99c616f
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/packages.py
@@ -0,0 +1,16 @@
+import sys
+
+# This code exists for backwards compatibility reasons.
+# I don't like it either. Just look the other way. :)
+
+for package in ('urllib3', 'idna', 'chardet'):
+    vendored_package = "pip._vendor." + package
+    locals()[package] = __import__(vendored_package)
+    # This traversal is apparently necessary such that the identities are
+    # preserved (requests.packages.urllib3.* is urllib3.*)
+    for mod in list(sys.modules):
+        if mod == vendored_package or mod.startswith(vendored_package + '.'):
+            unprefixed_mod = mod[len("pip._vendor."):]
+            sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod]
+
+# Kinda cool, though, right?
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/sessions.py b/vendor/pip-9.0.3/pip/_vendor/requests/sessions.py
new file mode 100644
index 0000000000000000000000000000000000000000..6570e7334901fac990c2798053ae31b64e34ce1e
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/sessions.py
@@ -0,0 +1,737 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.session
+~~~~~~~~~~~~~~~~
+
+This module provides a Session object to manage and persist settings across
+requests (cookies, auth, proxies).
+"""
+import os
+import platform
+import time
+from collections import Mapping
+from datetime import timedelta
+
+from .auth import _basic_auth_str
+from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse
+from .cookies import (
+    cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies)
+from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT
+from .hooks import default_hooks, dispatch_hook
+from ._internal_utils import to_native_string
+from .utils import to_key_val_list, default_headers
+from .exceptions import (
+    TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError)
+
+from .structures import CaseInsensitiveDict
+from .adapters import HTTPAdapter
+
+from .utils import (
+    requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies,
+    get_auth_from_url, rewind_body
+)
+
+from .status_codes import codes
+
+# formerly defined here, reexposed here for backward compatibility
+from .models import REDIRECT_STATI
+
+# Preferred clock, based on which one is more accurate on a given system.
+if platform.system() == 'Windows':
+    try:  # Python 3.3+
+        preferred_clock = time.perf_counter
+    except AttributeError:  # Earlier than Python 3.
+        preferred_clock = time.clock
+else:
+    preferred_clock = time.time
+
+
+def merge_setting(request_setting, session_setting, dict_class=OrderedDict):
+    """Determines appropriate setting for a given request, taking into account
+    the explicit setting on that request, and the setting in the session. If a
+    setting is a dictionary, they will be merged together using `dict_class`
+    """
+
+    if session_setting is None:
+        return request_setting
+
+    if request_setting is None:
+        return session_setting
+
+    # Bypass if not a dictionary (e.g. verify)
+    if not (
+            isinstance(session_setting, Mapping) and
+            isinstance(request_setting, Mapping)
+    ):
+        return request_setting
+
+    merged_setting = dict_class(to_key_val_list(session_setting))
+    merged_setting.update(to_key_val_list(request_setting))
+
+    # Remove keys that are set to None. Extract keys first to avoid altering
+    # the dictionary during iteration.
+    none_keys = [k for (k, v) in merged_setting.items() if v is None]
+    for key in none_keys:
+        del merged_setting[key]
+
+    return merged_setting
+
+
+def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict):
+    """Properly merges both requests and session hooks.
+
+    This is necessary because when request_hooks == {'response': []}, the
+    merge breaks Session hooks entirely.
+    """
+    if session_hooks is None or session_hooks.get('response') == []:
+        return request_hooks
+
+    if request_hooks is None or request_hooks.get('response') == []:
+        return session_hooks
+
+    return merge_setting(request_hooks, session_hooks, dict_class)
+
+
+class SessionRedirectMixin(object):
+
+    def get_redirect_target(self, resp):
+        """Receives a Response. Returns a redirect URI or ``None``"""
+        # Due to the nature of how requests processes redirects this method will
+        # be called at least once upon the original response and at least twice
+        # on each subsequent redirect response (if any).
+        # If a custom mixin is used to handle this logic, it may be advantageous
+        # to cache the redirect location onto the response object as a private
+        # attribute.
+        if resp.is_redirect:
+            location = resp.headers['location']
+            # Currently the underlying http module on py3 decode headers
+            # in latin1, but empirical evidence suggests that latin1 is very
+            # rarely used with non-ASCII characters in HTTP headers.
+            # It is more likely to get UTF8 header rather than latin1.
+            # This causes incorrect handling of UTF8 encoded location headers.
+            # To solve this, we re-encode the location in latin1.
+            if is_py3:
+                location = location.encode('latin1')
+            return to_native_string(location, 'utf8')
+        return None
+
+    def resolve_redirects(self, resp, req, stream=False, timeout=None,
+                          verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs):
+        """Receives a Response. Returns a generator of Responses or Requests."""
+
+        hist = []  # keep track of history
+
+        url = self.get_redirect_target(resp)
+        while url:
+            prepared_request = req.copy()
+
+            # Update history and keep track of redirects.
+            # resp.history must ignore the original request in this loop
+            hist.append(resp)
+            resp.history = hist[1:]
+
+            try:
+                resp.content  # Consume socket so it can be released
+            except (ChunkedEncodingError, ContentDecodingError, RuntimeError):
+                resp.raw.read(decode_content=False)
+
+            if len(resp.history) >= self.max_redirects:
+                raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp)
+
+            # Release the connection back into the pool.
+            resp.close()
+
+            # Handle redirection without scheme (see: RFC 1808 Section 4)
+            if url.startswith('//'):
+                parsed_rurl = urlparse(resp.url)
+                url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url)
+
+            # The scheme should be lower case...
+            parsed = urlparse(url)
+            url = parsed.geturl()
+
+            # Facilitate relative 'location' headers, as allowed by RFC 7231.
+            # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource')
+            # Compliant with RFC3986, we percent encode the url.
+            if not parsed.netloc:
+                url = urljoin(resp.url, requote_uri(url))
+            else:
+                url = requote_uri(url)
+
+            prepared_request.url = to_native_string(url)
+
+            self.rebuild_method(prepared_request, resp)
+
+            # https://github.com/requests/requests/issues/1084
+            if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect):
+                # https://github.com/requests/requests/issues/3490
+                purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding')
+                for header in purged_headers:
+                    prepared_request.headers.pop(header, None)
+                prepared_request.body = None
+
+            headers = prepared_request.headers
+            try:
+                del headers['Cookie']
+            except KeyError:
+                pass
+
+            # Extract any cookies sent on the response to the cookiejar
+            # in the new request. Because we've mutated our copied prepared
+            # request, use the old one that we haven't yet touched.
+            extract_cookies_to_jar(prepared_request._cookies, req, resp.raw)
+            merge_cookies(prepared_request._cookies, self.cookies)
+            prepared_request.prepare_cookies(prepared_request._cookies)
+
+            # Rebuild auth and proxy information.
+            proxies = self.rebuild_proxies(prepared_request, proxies)
+            self.rebuild_auth(prepared_request, resp)
+
+            # A failed tell() sets `_body_position` to `object()`. This non-None
+            # value ensures `rewindable` will be True, allowing us to raise an
+            # UnrewindableBodyError, instead of hanging the connection.
+            rewindable = (
+                prepared_request._body_position is not None and
+                ('Content-Length' in headers or 'Transfer-Encoding' in headers)
+            )
+
+            # Attempt to rewind consumed file-like object.
+            if rewindable:
+                rewind_body(prepared_request)
+
+            # Override the original request.
+            req = prepared_request
+
+            if yield_requests:
+                yield req
+            else:
+
+                resp = self.send(
+                    req,
+                    stream=stream,
+                    timeout=timeout,
+                    verify=verify,
+                    cert=cert,
+                    proxies=proxies,
+                    allow_redirects=False,
+                    **adapter_kwargs
+                )
+
+                extract_cookies_to_jar(self.cookies, prepared_request, resp.raw)
+
+                # extract redirect url, if any, for the next loop
+                url = self.get_redirect_target(resp)
+                yield resp
+
+    def rebuild_auth(self, prepared_request, response):
+        """When being redirected we may want to strip authentication from the
+        request to avoid leaking credentials. This method intelligently removes
+        and reapplies authentication where possible to avoid credential loss.
+        """
+        headers = prepared_request.headers
+        url = prepared_request.url
+
+        if 'Authorization' in headers:
+            # If we get redirected to a new host, we should strip out any
+            # authentication headers.
+            original_parsed = urlparse(response.request.url)
+            redirect_parsed = urlparse(url)
+
+            if (original_parsed.hostname != redirect_parsed.hostname):
+                del headers['Authorization']
+
+        # .netrc might have more auth for us on our new host.
+        new_auth = get_netrc_auth(url) if self.trust_env else None
+        if new_auth is not None:
+            prepared_request.prepare_auth(new_auth)
+
+        return
+
+    def rebuild_proxies(self, prepared_request, proxies):
+        """This method re-evaluates the proxy configuration by considering the
+        environment variables. If we are redirected to a URL covered by
+        NO_PROXY, we strip the proxy configuration. Otherwise, we set missing
+        proxy keys for this URL (in case they were stripped by a previous
+        redirect).
+
+        This method also replaces the Proxy-Authorization header where
+        necessary.
+
+        :rtype: dict
+        """
+        proxies = proxies if proxies is not None else {}
+        headers = prepared_request.headers
+        url = prepared_request.url
+        scheme = urlparse(url).scheme
+        new_proxies = proxies.copy()
+        no_proxy = proxies.get('no_proxy')
+
+        bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy)
+        if self.trust_env and not bypass_proxy:
+            environ_proxies = get_environ_proxies(url, no_proxy=no_proxy)
+
+            proxy = environ_proxies.get(scheme, environ_proxies.get('all'))
+
+            if proxy:
+                new_proxies.setdefault(scheme, proxy)
+
+        if 'Proxy-Authorization' in headers:
+            del headers['Proxy-Authorization']
+
+        try:
+            username, password = get_auth_from_url(new_proxies[scheme])
+        except KeyError:
+            username, password = None, None
+
+        if username and password:
+            headers['Proxy-Authorization'] = _basic_auth_str(username, password)
+
+        return new_proxies
+
+    def rebuild_method(self, prepared_request, response):
+        """When being redirected we may want to change the method of the request
+        based on certain specs or browser behavior.
+        """
+        method = prepared_request.method
+
+        # http://tools.ietf.org/html/rfc7231#section-6.4.4
+        if response.status_code == codes.see_other and method != 'HEAD':
+            method = 'GET'
+
+        # Do what the browsers do, despite standards...
+        # First, turn 302s into GETs.
+        if response.status_code == codes.found and method != 'HEAD':
+            method = 'GET'
+
+        # Second, if a POST is responded to with a 301, turn it into a GET.
+        # This bizarre behaviour is explained in Issue 1704.
+        if response.status_code == codes.moved and method == 'POST':
+            method = 'GET'
+
+        prepared_request.method = method
+
+
+class Session(SessionRedirectMixin):
+    """A Requests session.
+
+    Provides cookie persistence, connection-pooling, and configuration.
+
+    Basic Usage::
+
+      >>> import requests
+      >>> s = requests.Session()
+      >>> s.get('http://httpbin.org/get')
+      <Response [200]>
+
+    Or as a context manager::
+
+      >>> with requests.Session() as s:
+      >>>     s.get('http://httpbin.org/get')
+      <Response [200]>
+    """
+
+    __attrs__ = [
+        'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify',
+        'cert', 'prefetch', 'adapters', 'stream', 'trust_env',
+        'max_redirects',
+    ]
+
+    def __init__(self):
+
+        #: A case-insensitive dictionary of headers to be sent on each
+        #: :class:`Request <Request>` sent from this
+        #: :class:`Session <Session>`.
+        self.headers = default_headers()
+
+        #: Default Authentication tuple or object to attach to
+        #: :class:`Request <Request>`.
+        self.auth = None
+
+        #: Dictionary mapping protocol or protocol and host to the URL of the proxy
+        #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to
+        #: be used on each :class:`Request <Request>`.
+        self.proxies = {}
+
+        #: Event-handling hooks.
+        self.hooks = default_hooks()
+
+        #: Dictionary of querystring data to attach to each
+        #: :class:`Request <Request>`. The dictionary values may be lists for
+        #: representing multivalued query parameters.
+        self.params = {}
+
+        #: Stream response content default.
+        self.stream = False
+
+        #: SSL Verification default.
+        self.verify = True
+
+        #: SSL client certificate default, if String, path to ssl client
+        #: cert file (.pem). If Tuple, ('cert', 'key') pair.
+        self.cert = None
+
+        #: Maximum number of redirects allowed. If the request exceeds this
+        #: limit, a :class:`TooManyRedirects` exception is raised.
+        #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is
+        #: 30.
+        self.max_redirects = DEFAULT_REDIRECT_LIMIT
+
+        #: Trust environment settings for proxy configuration, default
+        #: authentication and similar.
+        self.trust_env = True
+
+        #: A CookieJar containing all currently outstanding cookies set on this
+        #: session. By default it is a
+        #: :class:`RequestsCookieJar <requests.cookies.RequestsCookieJar>`, but
+        #: may be any other ``cookielib.CookieJar`` compatible object.
+        self.cookies = cookiejar_from_dict({})
+
+        # Default connection adapters.
+        self.adapters = OrderedDict()
+        self.mount('https://', HTTPAdapter())
+        self.mount('http://', HTTPAdapter())
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, *args):
+        self.close()
+
+    def prepare_request(self, request):
+        """Constructs a :class:`PreparedRequest <PreparedRequest>` for
+        transmission and returns it. The :class:`PreparedRequest` has settings
+        merged from the :class:`Request <Request>` instance and those of the
+        :class:`Session`.
+
+        :param request: :class:`Request` instance to prepare with this
+            session's settings.
+        :rtype: requests.PreparedRequest
+        """
+        cookies = request.cookies or {}
+
+        # Bootstrap CookieJar.
+        if not isinstance(cookies, cookielib.CookieJar):
+            cookies = cookiejar_from_dict(cookies)
+
+        # Merge with session cookies
+        merged_cookies = merge_cookies(
+            merge_cookies(RequestsCookieJar(), self.cookies), cookies)
+
+        # Set environment's basic authentication if not explicitly set.
+        auth = request.auth
+        if self.trust_env and not auth and not self.auth:
+            auth = get_netrc_auth(request.url)
+
+        p = PreparedRequest()
+        p.prepare(
+            method=request.method.upper(),
+            url=request.url,
+            files=request.files,
+            data=request.data,
+            json=request.json,
+            headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict),
+            params=merge_setting(request.params, self.params),
+            auth=merge_setting(auth, self.auth),
+            cookies=merged_cookies,
+            hooks=merge_hooks(request.hooks, self.hooks),
+        )
+        return p
+
+    def request(self, method, url,
+            params=None, data=None, headers=None, cookies=None, files=None,
+            auth=None, timeout=None, allow_redirects=True, proxies=None,
+            hooks=None, stream=None, verify=None, cert=None, json=None):
+        """Constructs a :class:`Request <Request>`, prepares it and sends it.
+        Returns :class:`Response <Response>` object.
+
+        :param method: method for the new :class:`Request` object.
+        :param url: URL for the new :class:`Request` object.
+        :param params: (optional) Dictionary or bytes to be sent in the query
+            string for the :class:`Request`.
+        :param data: (optional) Dictionary, bytes, or file-like object to send
+            in the body of the :class:`Request`.
+        :param json: (optional) json to send in the body of the
+            :class:`Request`.
+        :param headers: (optional) Dictionary of HTTP Headers to send with the
+            :class:`Request`.
+        :param cookies: (optional) Dict or CookieJar object to send with the
+            :class:`Request`.
+        :param files: (optional) Dictionary of ``'filename': file-like-objects``
+            for multipart encoding upload.
+        :param auth: (optional) Auth tuple or callable to enable
+            Basic/Digest/Custom HTTP Auth.
+        :param timeout: (optional) How long to wait for the server to send
+            data before giving up, as a float, or a :ref:`(connect timeout,
+            read timeout) <timeouts>` tuple.
+        :type timeout: float or tuple
+        :param allow_redirects: (optional) Set to True by default.
+        :type allow_redirects: bool
+        :param proxies: (optional) Dictionary mapping protocol or protocol and
+            hostname to the URL of the proxy.
+        :param stream: (optional) whether to immediately download the response
+            content. Defaults to ``False``.
+        :param verify: (optional) Either a boolean, in which case it controls whether we verify
+            the server's TLS certificate, or a string, in which case it must be a path
+            to a CA bundle to use. Defaults to ``True``.
+        :param cert: (optional) if String, path to ssl client cert file (.pem).
+            If Tuple, ('cert', 'key') pair.
+        :rtype: requests.Response
+        """
+        # Create the Request.
+        req = Request(
+            method=method.upper(),
+            url=url,
+            headers=headers,
+            files=files,
+            data=data or {},
+            json=json,
+            params=params or {},
+            auth=auth,
+            cookies=cookies,
+            hooks=hooks,
+        )
+        prep = self.prepare_request(req)
+
+        proxies = proxies or {}
+
+        settings = self.merge_environment_settings(
+            prep.url, proxies, stream, verify, cert
+        )
+
+        # Send the request.
+        send_kwargs = {
+            'timeout': timeout,
+            'allow_redirects': allow_redirects,
+        }
+        send_kwargs.update(settings)
+        resp = self.send(prep, **send_kwargs)
+
+        return resp
+
+    def get(self, url, **kwargs):
+        r"""Sends a GET request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        :rtype: requests.Response
+        """
+
+        kwargs.setdefault('allow_redirects', True)
+        return self.request('GET', url, **kwargs)
+
+    def options(self, url, **kwargs):
+        r"""Sends a OPTIONS request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        :rtype: requests.Response
+        """
+
+        kwargs.setdefault('allow_redirects', True)
+        return self.request('OPTIONS', url, **kwargs)
+
+    def head(self, url, **kwargs):
+        r"""Sends a HEAD request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        :rtype: requests.Response
+        """
+
+        kwargs.setdefault('allow_redirects', False)
+        return self.request('HEAD', url, **kwargs)
+
+    def post(self, url, data=None, json=None, **kwargs):
+        r"""Sends a POST request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
+        :param json: (optional) json to send in the body of the :class:`Request`.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        :rtype: requests.Response
+        """
+
+        return self.request('POST', url, data=data, json=json, **kwargs)
+
+    def put(self, url, data=None, **kwargs):
+        r"""Sends a PUT request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        :rtype: requests.Response
+        """
+
+        return self.request('PUT', url, data=data, **kwargs)
+
+    def patch(self, url, data=None, **kwargs):
+        r"""Sends a PATCH request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        :rtype: requests.Response
+        """
+
+        return self.request('PATCH', url, data=data, **kwargs)
+
+    def delete(self, url, **kwargs):
+        r"""Sends a DELETE request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        :rtype: requests.Response
+        """
+
+        return self.request('DELETE', url, **kwargs)
+
+    def send(self, request, **kwargs):
+        """Send a given PreparedRequest.
+
+        :rtype: requests.Response
+        """
+        # Set defaults that the hooks can utilize to ensure they always have
+        # the correct parameters to reproduce the previous request.
+        kwargs.setdefault('stream', self.stream)
+        kwargs.setdefault('verify', self.verify)
+        kwargs.setdefault('cert', self.cert)
+        kwargs.setdefault('proxies', self.proxies)
+
+        # It's possible that users might accidentally send a Request object.
+        # Guard against that specific failure case.
+        if isinstance(request, Request):
+            raise ValueError('You can only send PreparedRequests.')
+
+        # Set up variables needed for resolve_redirects and dispatching of hooks
+        allow_redirects = kwargs.pop('allow_redirects', True)
+        stream = kwargs.get('stream')
+        hooks = request.hooks
+
+        # Get the appropriate adapter to use
+        adapter = self.get_adapter(url=request.url)
+
+        # Start time (approximately) of the request
+        start = preferred_clock()
+
+        # Send the request
+        r = adapter.send(request, **kwargs)
+
+        # Total elapsed time of the request (approximately)
+        elapsed = preferred_clock() - start
+        r.elapsed = timedelta(seconds=elapsed)
+
+        # Response manipulation hooks
+        r = dispatch_hook('response', hooks, r, **kwargs)
+
+        # Persist cookies
+        if r.history:
+
+            # If the hooks create history then we want those cookies too
+            for resp in r.history:
+                extract_cookies_to_jar(self.cookies, resp.request, resp.raw)
+
+        extract_cookies_to_jar(self.cookies, request, r.raw)
+
+        # Redirect resolving generator.
+        gen = self.resolve_redirects(r, request, **kwargs)
+
+        # Resolve redirects if allowed.
+        history = [resp for resp in gen] if allow_redirects else []
+
+        # Shuffle things around if there's history.
+        if history:
+            # Insert the first (original) request at the start
+            history.insert(0, r)
+            # Get the last request made
+            r = history.pop()
+            r.history = history
+
+        # If redirects aren't being followed, store the response on the Request for Response.next().
+        if not allow_redirects:
+            try:
+                r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs))
+            except StopIteration:
+                pass
+
+        if not stream:
+            r.content
+
+        return r
+
+    def merge_environment_settings(self, url, proxies, stream, verify, cert):
+        """
+        Check the environment and merge it with some settings.
+
+        :rtype: dict
+        """
+        # Gather clues from the surrounding environment.
+        if self.trust_env:
+            # Set environment's proxies.
+            no_proxy = proxies.get('no_proxy') if proxies is not None else None
+            env_proxies = get_environ_proxies(url, no_proxy=no_proxy)
+            for (k, v) in env_proxies.items():
+                proxies.setdefault(k, v)
+
+            # Look for requests environment configuration and be compatible
+            # with cURL.
+            if verify is True or verify is None:
+                verify = (os.environ.get('REQUESTS_CA_BUNDLE') or
+                          os.environ.get('CURL_CA_BUNDLE'))
+
+        # Merge all the kwargs.
+        proxies = merge_setting(proxies, self.proxies)
+        stream = merge_setting(stream, self.stream)
+        verify = merge_setting(verify, self.verify)
+        cert = merge_setting(cert, self.cert)
+
+        return {'verify': verify, 'proxies': proxies, 'stream': stream,
+                'cert': cert}
+
+    def get_adapter(self, url):
+        """
+        Returns the appropriate connection adapter for the given URL.
+
+        :rtype: requests.adapters.BaseAdapter
+        """
+        for (prefix, adapter) in self.adapters.items():
+
+            if url.lower().startswith(prefix):
+                return adapter
+
+        # Nothing matches :-/
+        raise InvalidSchema("No connection adapters were found for '%s'" % url)
+
+    def close(self):
+        """Closes all adapters and as such the session"""
+        for v in self.adapters.values():
+            v.close()
+
+    def mount(self, prefix, adapter):
+        """Registers a connection adapter to a prefix.
+
+        Adapters are sorted in descending order by prefix length.
+        """
+        self.adapters[prefix] = adapter
+        keys_to_move = [k for k in self.adapters if len(k) < len(prefix)]
+
+        for key in keys_to_move:
+            self.adapters[key] = self.adapters.pop(key)
+
+    def __getstate__(self):
+        state = dict((attr, getattr(self, attr, None)) for attr in self.__attrs__)
+        return state
+
+    def __setstate__(self, state):
+        for attr, value in state.items():
+            setattr(self, attr, value)
+
+
+def session():
+    """
+    Returns a :class:`Session` for context-management.
+
+    :rtype: Session
+    """
+
+    return Session()
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/status_codes.py b/vendor/pip-9.0.3/pip/_vendor/requests/status_codes.py
new file mode 100644
index 0000000000000000000000000000000000000000..dee89190c06f5fd7ec70ba804eb357ba20acf828
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/status_codes.py
@@ -0,0 +1,91 @@
+# -*- coding: utf-8 -*-
+
+from .structures import LookupDict
+
+_codes = {
+
+    # Informational.
+    100: ('continue',),
+    101: ('switching_protocols',),
+    102: ('processing',),
+    103: ('checkpoint',),
+    122: ('uri_too_long', 'request_uri_too_long'),
+    200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'),
+    201: ('created',),
+    202: ('accepted',),
+    203: ('non_authoritative_info', 'non_authoritative_information'),
+    204: ('no_content',),
+    205: ('reset_content', 'reset'),
+    206: ('partial_content', 'partial'),
+    207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'),
+    208: ('already_reported',),
+    226: ('im_used',),
+
+    # Redirection.
+    300: ('multiple_choices',),
+    301: ('moved_permanently', 'moved', '\\o-'),
+    302: ('found',),
+    303: ('see_other', 'other'),
+    304: ('not_modified',),
+    305: ('use_proxy',),
+    306: ('switch_proxy',),
+    307: ('temporary_redirect', 'temporary_moved', 'temporary'),
+    308: ('permanent_redirect',
+          'resume_incomplete', 'resume',),  # These 2 to be removed in 3.0
+
+    # Client Error.
+    400: ('bad_request', 'bad'),
+    401: ('unauthorized',),
+    402: ('payment_required', 'payment'),
+    403: ('forbidden',),
+    404: ('not_found', '-o-'),
+    405: ('method_not_allowed', 'not_allowed'),
+    406: ('not_acceptable',),
+    407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'),
+    408: ('request_timeout', 'timeout'),
+    409: ('conflict',),
+    410: ('gone',),
+    411: ('length_required',),
+    412: ('precondition_failed', 'precondition'),
+    413: ('request_entity_too_large',),
+    414: ('request_uri_too_large',),
+    415: ('unsupported_media_type', 'unsupported_media', 'media_type'),
+    416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'),
+    417: ('expectation_failed',),
+    418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'),
+    421: ('misdirected_request',),
+    422: ('unprocessable_entity', 'unprocessable'),
+    423: ('locked',),
+    424: ('failed_dependency', 'dependency'),
+    425: ('unordered_collection', 'unordered'),
+    426: ('upgrade_required', 'upgrade'),
+    428: ('precondition_required', 'precondition'),
+    429: ('too_many_requests', 'too_many'),
+    431: ('header_fields_too_large', 'fields_too_large'),
+    444: ('no_response', 'none'),
+    449: ('retry_with', 'retry'),
+    450: ('blocked_by_windows_parental_controls', 'parental_controls'),
+    451: ('unavailable_for_legal_reasons', 'legal_reasons'),
+    499: ('client_closed_request',),
+
+    # Server Error.
+    500: ('internal_server_error', 'server_error', '/o\\', '✗'),
+    501: ('not_implemented',),
+    502: ('bad_gateway',),
+    503: ('service_unavailable', 'unavailable'),
+    504: ('gateway_timeout',),
+    505: ('http_version_not_supported', 'http_version'),
+    506: ('variant_also_negotiates',),
+    507: ('insufficient_storage',),
+    509: ('bandwidth_limit_exceeded', 'bandwidth'),
+    510: ('not_extended',),
+    511: ('network_authentication_required', 'network_auth', 'network_authentication'),
+}
+
+codes = LookupDict(name='status_codes')
+
+for code, titles in _codes.items():
+    for title in titles:
+        setattr(codes, title, code)
+        if not title.startswith(('\\', '/')):
+            setattr(codes, title.upper(), code)
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/structures.py b/vendor/pip-9.0.3/pip/_vendor/requests/structures.py
new file mode 100644
index 0000000000000000000000000000000000000000..05d2b3f57beadb7dd36718487281e746d96de014
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/structures.py
@@ -0,0 +1,105 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.structures
+~~~~~~~~~~~~~~~~~~~
+
+Data structures that power Requests.
+"""
+
+import collections
+
+from .compat import OrderedDict
+
+
+class CaseInsensitiveDict(collections.MutableMapping):
+    """A case-insensitive ``dict``-like object.
+
+    Implements all methods and operations of
+    ``collections.MutableMapping`` as well as dict's ``copy``. Also
+    provides ``lower_items``.
+
+    All keys are expected to be strings. The structure remembers the
+    case of the last key to be set, and ``iter(instance)``,
+    ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()``
+    will contain case-sensitive keys. However, querying and contains
+    testing is case insensitive::
+
+        cid = CaseInsensitiveDict()
+        cid['Accept'] = 'application/json'
+        cid['aCCEPT'] == 'application/json'  # True
+        list(cid) == ['Accept']  # True
+
+    For example, ``headers['content-encoding']`` will return the
+    value of a ``'Content-Encoding'`` response header, regardless
+    of how the header name was originally stored.
+
+    If the constructor, ``.update``, or equality comparison
+    operations are given keys that have equal ``.lower()``s, the
+    behavior is undefined.
+    """
+
+    def __init__(self, data=None, **kwargs):
+        self._store = OrderedDict()
+        if data is None:
+            data = {}
+        self.update(data, **kwargs)
+
+    def __setitem__(self, key, value):
+        # Use the lowercased key for lookups, but store the actual
+        # key alongside the value.
+        self._store[key.lower()] = (key, value)
+
+    def __getitem__(self, key):
+        return self._store[key.lower()][1]
+
+    def __delitem__(self, key):
+        del self._store[key.lower()]
+
+    def __iter__(self):
+        return (casedkey for casedkey, mappedvalue in self._store.values())
+
+    def __len__(self):
+        return len(self._store)
+
+    def lower_items(self):
+        """Like iteritems(), but with all lowercase keys."""
+        return (
+            (lowerkey, keyval[1])
+            for (lowerkey, keyval)
+            in self._store.items()
+        )
+
+    def __eq__(self, other):
+        if isinstance(other, collections.Mapping):
+            other = CaseInsensitiveDict(other)
+        else:
+            return NotImplemented
+        # Compare insensitively
+        return dict(self.lower_items()) == dict(other.lower_items())
+
+    # Copy is required
+    def copy(self):
+        return CaseInsensitiveDict(self._store.values())
+
+    def __repr__(self):
+        return str(dict(self.items()))
+
+
+class LookupDict(dict):
+    """Dictionary lookup object."""
+
+    def __init__(self, name=None):
+        self.name = name
+        super(LookupDict, self).__init__()
+
+    def __repr__(self):
+        return '<lookup \'%s\'>' % (self.name)
+
+    def __getitem__(self, key):
+        # We allow fall-through here, so values default to None
+
+        return self.__dict__.get(key, None)
+
+    def get(self, key, default=None):
+        return self.__dict__.get(key, default)
diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/utils.py b/vendor/pip-9.0.3/pip/_vendor/requests/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..5c47de98931adfe6412d9f66f28252cd3ab2e5b9
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/requests/utils.py
@@ -0,0 +1,904 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.utils
+~~~~~~~~~~~~~~
+
+This module provides utility functions that are used within Requests
+that are also useful for external consumption.
+"""
+
+import cgi
+import codecs
+import collections
+import contextlib
+import io
+import os
+import platform
+import re
+import socket
+import struct
+import warnings
+
+from .__version__ import __version__
+from . import certs
+# to_native_string is unused here, but imported here for backwards compatibility
+from ._internal_utils import to_native_string
+from .compat import parse_http_list as _parse_list_header
+from .compat import (
+    quote, urlparse, bytes, str, OrderedDict, unquote, getproxies,
+    proxy_bypass, urlunparse, basestring, integer_types, is_py3,
+    proxy_bypass_environment, getproxies_environment)
+from .cookies import cookiejar_from_dict
+from .structures import CaseInsensitiveDict
+from .exceptions import (
+    InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError)
+
+NETRC_FILES = ('.netrc', '_netrc')
+
+DEFAULT_CA_BUNDLE_PATH = certs.where()
+
+
+if platform.system() == 'Windows':
+    # provide a proxy_bypass version on Windows without DNS lookups
+
+    def proxy_bypass_registry(host):
+        if is_py3:
+            import winreg
+        else:
+            import _winreg as winreg
+        try:
+            internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER,
+                r'Software\Microsoft\Windows\CurrentVersion\Internet Settings')
+            proxyEnable = winreg.QueryValueEx(internetSettings,
+                                              'ProxyEnable')[0]
+            proxyOverride = winreg.QueryValueEx(internetSettings,
+                                                'ProxyOverride')[0]
+        except OSError:
+            return False
+        if not proxyEnable or not proxyOverride:
+            return False
+
+        # make a check value list from the registry entry: replace the
+        # '<local>' string by the localhost entry and the corresponding
+        # canonical entry.
+        proxyOverride = proxyOverride.split(';')
+        # now check if we match one of the registry values.
+        for test in proxyOverride:
+            if test == '<local>':
+                if '.' not in host:
+                    return True
+            test = test.replace(".", r"\.")     # mask dots
+            test = test.replace("*", r".*")     # change glob sequence
+            test = test.replace("?", r".")      # change glob char
+            if re.match(test, host, re.I):
+                return True
+        return False
+
+    def proxy_bypass(host):  # noqa
+        """Return True, if the host should be bypassed.
+
+        Checks proxy settings gathered from the environment, if specified,
+        or the registry.
+        """
+        if getproxies_environment():
+            return proxy_bypass_environment(host)
+        else:
+            return proxy_bypass_registry(host)
+
+
+def dict_to_sequence(d):
+    """Returns an internal sequence dictionary update."""
+
+    if hasattr(d, 'items'):
+        d = d.items()
+
+    return d
+
+
+def super_len(o):
+    total_length = None
+    current_position = 0
+
+    if hasattr(o, '__len__'):
+        total_length = len(o)
+
+    elif hasattr(o, 'len'):
+        total_length = o.len
+
+    elif hasattr(o, 'fileno'):
+        try:
+            fileno = o.fileno()
+        except io.UnsupportedOperation:
+            pass
+        else:
+            total_length = os.fstat(fileno).st_size
+
+            # Having used fstat to determine the file length, we need to
+            # confirm that this file was opened up in binary mode.
+            if 'b' not in o.mode:
+                warnings.warn((
+                    "Requests has determined the content-length for this "
+                    "request using the binary size of the file: however, the "
+                    "file has been opened in text mode (i.e. without the 'b' "
+                    "flag in the mode). This may lead to an incorrect "
+                    "content-length. In Requests 3.0, support will be removed "
+                    "for files in text mode."),
+                    FileModeWarning
+                )
+
+    if hasattr(o, 'tell'):
+        try:
+            current_position = o.tell()
+        except (OSError, IOError):
+            # This can happen in some weird situations, such as when the file
+            # is actually a special file descriptor like stdin. In this
+            # instance, we don't know what the length is, so set it to zero and
+            # let requests chunk it instead.
+            if total_length is not None:
+                current_position = total_length
+        else:
+            if hasattr(o, 'seek') and total_length is None:
+                # StringIO and BytesIO have seek but no useable fileno
+                try:
+                    # seek to end of file
+                    o.seek(0, 2)
+                    total_length = o.tell()
+
+                    # seek back to current position to support
+                    # partially read file-like objects
+                    o.seek(current_position or 0)
+                except (OSError, IOError):
+                    total_length = 0
+
+    if total_length is None:
+        total_length = 0
+
+    return max(0, total_length - current_position)
+
+
+def get_netrc_auth(url, raise_errors=False):
+    """Returns the Requests tuple auth for a given url from netrc."""
+
+    try:
+        from netrc import netrc, NetrcParseError
+
+        netrc_path = None
+
+        for f in NETRC_FILES:
+            try:
+                loc = os.path.expanduser('~/{0}'.format(f))
+            except KeyError:
+                # os.path.expanduser can fail when $HOME is undefined and
+                # getpwuid fails. See http://bugs.python.org/issue20164 &
+                # https://github.com/requests/requests/issues/1846
+                return
+
+            if os.path.exists(loc):
+                netrc_path = loc
+                break
+
+        # Abort early if there isn't one.
+        if netrc_path is None:
+            return
+
+        ri = urlparse(url)
+
+        # Strip port numbers from netloc. This weird `if...encode`` dance is
+        # used for Python 3.2, which doesn't support unicode literals.
+        splitstr = b':'
+        if isinstance(url, str):
+            splitstr = splitstr.decode('ascii')
+        host = ri.netloc.split(splitstr)[0]
+
+        try:
+            _netrc = netrc(netrc_path).authenticators(host)
+            if _netrc:
+                # Return with login / password
+                login_i = (0 if _netrc[0] else 1)
+                return (_netrc[login_i], _netrc[2])
+        except (NetrcParseError, IOError):
+            # If there was a parsing error or a permissions issue reading the file,
+            # we'll just skip netrc auth unless explicitly asked to raise errors.
+            if raise_errors:
+                raise
+
+    # AppEngine hackiness.
+    except (ImportError, AttributeError):
+        pass
+
+
+def guess_filename(obj):
+    """Tries to guess the filename of the given object."""
+    name = getattr(obj, 'name', None)
+    if (name and isinstance(name, basestring) and name[0] != '<' and
+            name[-1] != '>'):
+        return os.path.basename(name)
+
+
+def from_key_val_list(value):
+    """Take an object and test to see if it can be represented as a
+    dictionary. Unless it can not be represented as such, return an
+    OrderedDict, e.g.,
+
+    ::
+
+        >>> from_key_val_list([('key', 'val')])
+        OrderedDict([('key', 'val')])
+        >>> from_key_val_list('string')
+        ValueError: need more than 1 value to unpack
+        >>> from_key_val_list({'key': 'val'})
+        OrderedDict([('key', 'val')])
+
+    :rtype: OrderedDict
+    """
+    if value is None:
+        return None
+
+    if isinstance(value, (str, bytes, bool, int)):
+        raise ValueError('cannot encode objects that are not 2-tuples')
+
+    return OrderedDict(value)
+
+
+def to_key_val_list(value):
+    """Take an object and test to see if it can be represented as a
+    dictionary. If it can be, return a list of tuples, e.g.,
+
+    ::
+
+        >>> to_key_val_list([('key', 'val')])
+        [('key', 'val')]
+        >>> to_key_val_list({'key': 'val'})
+        [('key', 'val')]
+        >>> to_key_val_list('string')
+        ValueError: cannot encode objects that are not 2-tuples.
+
+    :rtype: list
+    """
+    if value is None:
+        return None
+
+    if isinstance(value, (str, bytes, bool, int)):
+        raise ValueError('cannot encode objects that are not 2-tuples')
+
+    if isinstance(value, collections.Mapping):
+        value = value.items()
+
+    return list(value)
+
+
+# From mitsuhiko/werkzeug (used with permission).
+def parse_list_header(value):
+    """Parse lists as described by RFC 2068 Section 2.
+
+    In particular, parse comma-separated lists where the elements of
+    the list may include quoted-strings.  A quoted-string could
+    contain a comma.  A non-quoted string could have quotes in the
+    middle.  Quotes are removed automatically after parsing.
+
+    It basically works like :func:`parse_set_header` just that items
+    may appear multiple times and case sensitivity is preserved.
+
+    The return value is a standard :class:`list`:
+
+    >>> parse_list_header('token, "quoted value"')
+    ['token', 'quoted value']
+
+    To create a header from the :class:`list` again, use the
+    :func:`dump_header` function.
+
+    :param value: a string with a list header.
+    :return: :class:`list`
+    :rtype: list
+    """
+    result = []
+    for item in _parse_list_header(value):
+        if item[:1] == item[-1:] == '"':
+            item = unquote_header_value(item[1:-1])
+        result.append(item)
+    return result
+
+
+# From mitsuhiko/werkzeug (used with permission).
+def parse_dict_header(value):
+    """Parse lists of key, value pairs as described by RFC 2068 Section 2 and
+    convert them into a python dict:
+
+    >>> d = parse_dict_header('foo="is a fish", bar="as well"')
+    >>> type(d) is dict
+    True
+    >>> sorted(d.items())
+    [('bar', 'as well'), ('foo', 'is a fish')]
+
+    If there is no value for a key it will be `None`:
+
+    >>> parse_dict_header('key_without_value')
+    {'key_without_value': None}
+
+    To create a header from the :class:`dict` again, use the
+    :func:`dump_header` function.
+
+    :param value: a string with a dict header.
+    :return: :class:`dict`
+    :rtype: dict
+    """
+    result = {}
+    for item in _parse_list_header(value):
+        if '=' not in item:
+            result[item] = None
+            continue
+        name, value = item.split('=', 1)
+        if value[:1] == value[-1:] == '"':
+            value = unquote_header_value(value[1:-1])
+        result[name] = value
+    return result
+
+
+# From mitsuhiko/werkzeug (used with permission).
+def unquote_header_value(value, is_filename=False):
+    r"""Unquotes a header value.  (Reversal of :func:`quote_header_value`).
+    This does not use the real unquoting but what browsers are actually
+    using for quoting.
+
+    :param value: the header value to unquote.
+    :rtype: str
+    """
+    if value and value[0] == value[-1] == '"':
+        # this is not the real unquoting, but fixing this so that the
+        # RFC is met will result in bugs with internet explorer and
+        # probably some other browsers as well.  IE for example is
+        # uploading files with "C:\foo\bar.txt" as filename
+        value = value[1:-1]
+
+        # if this is a filename and the starting characters look like
+        # a UNC path, then just return the value without quotes.  Using the
+        # replace sequence below on a UNC path has the effect of turning
+        # the leading double slash into a single slash and then
+        # _fix_ie_filename() doesn't work correctly.  See #458.
+        if not is_filename or value[:2] != '\\\\':
+            return value.replace('\\\\', '\\').replace('\\"', '"')
+    return value
+
+
+def dict_from_cookiejar(cj):
+    """Returns a key/value dictionary from a CookieJar.
+
+    :param cj: CookieJar object to extract cookies from.
+    :rtype: dict
+    """
+
+    cookie_dict = {}
+
+    for cookie in cj:
+        cookie_dict[cookie.name] = cookie.value
+
+    return cookie_dict
+
+
+def add_dict_to_cookiejar(cj, cookie_dict):
+    """Returns a CookieJar from a key/value dictionary.
+
+    :param cj: CookieJar to insert cookies into.
+    :param cookie_dict: Dict of key/values to insert into CookieJar.
+    :rtype: CookieJar
+    """
+
+    return cookiejar_from_dict(cookie_dict, cj)
+
+
+def get_encodings_from_content(content):
+    """Returns encodings from given content string.
+
+    :param content: bytestring to extract encodings from.
+    """
+    warnings.warn((
+        'In requests 3.0, get_encodings_from_content will be removed. For '
+        'more information, please see the discussion on issue #2266. (This'
+        ' warning should only appear once.)'),
+        DeprecationWarning)
+
+    charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I)
+    pragma_re = re.compile(r'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I)
+    xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]')
+
+    return (charset_re.findall(content) +
+            pragma_re.findall(content) +
+            xml_re.findall(content))
+
+
+def get_encoding_from_headers(headers):
+    """Returns encodings from given HTTP Header Dict.
+
+    :param headers: dictionary to extract encoding from.
+    :rtype: str
+    """
+
+    content_type = headers.get('content-type')
+
+    if not content_type:
+        return None
+
+    content_type, params = cgi.parse_header(content_type)
+
+    if 'charset' in params:
+        return params['charset'].strip("'\"")
+
+    if 'text' in content_type:
+        return 'ISO-8859-1'
+
+
+def stream_decode_response_unicode(iterator, r):
+    """Stream decodes a iterator."""
+
+    if r.encoding is None:
+        for item in iterator:
+            yield item
+        return
+
+    decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace')
+    for chunk in iterator:
+        rv = decoder.decode(chunk)
+        if rv:
+            yield rv
+    rv = decoder.decode(b'', final=True)
+    if rv:
+        yield rv
+
+
+def iter_slices(string, slice_length):
+    """Iterate over slices of a string."""
+    pos = 0
+    if slice_length is None or slice_length <= 0:
+        slice_length = len(string)
+    while pos < len(string):
+        yield string[pos:pos + slice_length]
+        pos += slice_length
+
+
+def get_unicode_from_response(r):
+    """Returns the requested content back in unicode.
+
+    :param r: Response object to get unicode content from.
+
+    Tried:
+
+    1. charset from content-type
+    2. fall back and replace all unicode characters
+
+    :rtype: str
+    """
+    warnings.warn((
+        'In requests 3.0, get_unicode_from_response will be removed. For '
+        'more information, please see the discussion on issue #2266. (This'
+        ' warning should only appear once.)'),
+        DeprecationWarning)
+
+    tried_encodings = []
+
+    # Try charset from content-type
+    encoding = get_encoding_from_headers(r.headers)
+
+    if encoding:
+        try:
+            return str(r.content, encoding)
+        except UnicodeError:
+            tried_encodings.append(encoding)
+
+    # Fall back:
+    try:
+        return str(r.content, encoding, errors='replace')
+    except TypeError:
+        return r.content
+
+
+# The unreserved URI characters (RFC 3986)
+UNRESERVED_SET = frozenset(
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~")
+
+
+def unquote_unreserved(uri):
+    """Un-escape any percent-escape sequences in a URI that are unreserved
+    characters. This leaves all reserved, illegal and non-ASCII bytes encoded.
+
+    :rtype: str
+    """
+    parts = uri.split('%')
+    for i in range(1, len(parts)):
+        h = parts[i][0:2]
+        if len(h) == 2 and h.isalnum():
+            try:
+                c = chr(int(h, 16))
+            except ValueError:
+                raise InvalidURL("Invalid percent-escape sequence: '%s'" % h)
+
+            if c in UNRESERVED_SET:
+                parts[i] = c + parts[i][2:]
+            else:
+                parts[i] = '%' + parts[i]
+        else:
+            parts[i] = '%' + parts[i]
+    return ''.join(parts)
+
+
+def requote_uri(uri):
+    """Re-quote the given URI.
+
+    This function passes the given URI through an unquote/quote cycle to
+    ensure that it is fully and consistently quoted.
+
+    :rtype: str
+    """
+    safe_with_percent = "!#$%&'()*+,/:;=?@[]~"
+    safe_without_percent = "!#$&'()*+,/:;=?@[]~"
+    try:
+        # Unquote only the unreserved characters
+        # Then quote only illegal characters (do not quote reserved,
+        # unreserved, or '%')
+        return quote(unquote_unreserved(uri), safe=safe_with_percent)
+    except InvalidURL:
+        # We couldn't unquote the given URI, so let's try quoting it, but
+        # there may be unquoted '%'s in the URI. We need to make sure they're
+        # properly quoted so they do not cause issues elsewhere.
+        return quote(uri, safe=safe_without_percent)
+
+
+def address_in_network(ip, net):
+    """This function allows you to check if an IP belongs to a network subnet
+
+    Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24
+             returns False if ip = 192.168.1.1 and net = 192.168.100.0/24
+
+    :rtype: bool
+    """
+    ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0]
+    netaddr, bits = net.split('/')
+    netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0]
+    network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask
+    return (ipaddr & netmask) == (network & netmask)
+
+
+def dotted_netmask(mask):
+    """Converts mask from /xx format to xxx.xxx.xxx.xxx
+
+    Example: if mask is 24 function returns 255.255.255.0
+
+    :rtype: str
+    """
+    bits = 0xffffffff ^ (1 << 32 - mask) - 1
+    return socket.inet_ntoa(struct.pack('>I', bits))
+
+
+def is_ipv4_address(string_ip):
+    """
+    :rtype: bool
+    """
+    try:
+        socket.inet_aton(string_ip)
+    except socket.error:
+        return False
+    return True
+
+
+def is_valid_cidr(string_network):
+    """
+    Very simple check of the cidr format in no_proxy variable.
+
+    :rtype: bool
+    """
+    if string_network.count('/') == 1:
+        try:
+            mask = int(string_network.split('/')[1])
+        except ValueError:
+            return False
+
+        if mask < 1 or mask > 32:
+            return False
+
+        try:
+            socket.inet_aton(string_network.split('/')[0])
+        except socket.error:
+            return False
+    else:
+        return False
+    return True
+
+
+@contextlib.contextmanager
+def set_environ(env_name, value):
+    """Set the environment variable 'env_name' to 'value'
+
+    Save previous value, yield, and then restore the previous value stored in
+    the environment variable 'env_name'.
+
+    If 'value' is None, do nothing"""
+    value_changed = value is not None
+    if value_changed:
+        old_value = os.environ.get(env_name)
+        os.environ[env_name] = value
+    try:
+        yield
+    finally:
+        if value_changed:
+            if old_value is None:
+                del os.environ[env_name]
+            else:
+                os.environ[env_name] = old_value
+
+
+def should_bypass_proxies(url, no_proxy):
+    """
+    Returns whether we should bypass proxies or not.
+
+    :rtype: bool
+    """
+    get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper())
+
+    # First check whether no_proxy is defined. If it is, check that the URL
+    # we're getting isn't in the no_proxy list.
+    no_proxy_arg = no_proxy
+    if no_proxy is None:
+        no_proxy = get_proxy('no_proxy')
+    netloc = urlparse(url).netloc
+
+    if no_proxy:
+        # We need to check whether we match here. We need to see if we match
+        # the end of the netloc, both with and without the port.
+        no_proxy = (
+            host for host in no_proxy.replace(' ', '').split(',') if host
+        )
+
+        ip = netloc.split(':')[0]
+        if is_ipv4_address(ip):
+            for proxy_ip in no_proxy:
+                if is_valid_cidr(proxy_ip):
+                    if address_in_network(ip, proxy_ip):
+                        return True
+                elif ip == proxy_ip:
+                    # If no_proxy ip was defined in plain IP notation instead of cidr notation &
+                    # matches the IP of the index
+                    return True
+        else:
+            for host in no_proxy:
+                if netloc.endswith(host) or netloc.split(':')[0].endswith(host):
+                    # The URL does match something in no_proxy, so we don't want
+                    # to apply the proxies on this URL.
+                    return True
+
+    # If the system proxy settings indicate that this URL should be bypassed,
+    # don't proxy.
+    # The proxy_bypass function is incredibly buggy on OS X in early versions
+    # of Python 2.6, so allow this call to fail. Only catch the specific
+    # exceptions we've seen, though: this call failing in other ways can reveal
+    # legitimate problems.
+    with set_environ('no_proxy', no_proxy_arg):
+        try:
+            bypass = proxy_bypass(netloc)
+        except (TypeError, socket.gaierror):
+            bypass = False
+
+    if bypass:
+        return True
+
+    return False
+
+
+def get_environ_proxies(url, no_proxy=None):
+    """
+    Return a dict of environment proxies.
+
+    :rtype: dict
+    """
+    if should_bypass_proxies(url, no_proxy=no_proxy):
+        return {}
+    else:
+        return getproxies()
+
+
+def select_proxy(url, proxies):
+    """Select a proxy for the url, if applicable.
+
+    :param url: The url being for the request
+    :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs
+    """
+    proxies = proxies or {}
+    urlparts = urlparse(url)
+    if urlparts.hostname is None:
+        return proxies.get(urlparts.scheme, proxies.get('all'))
+
+    proxy_keys = [
+        urlparts.scheme + '://' + urlparts.hostname,
+        urlparts.scheme,
+        'all://' + urlparts.hostname,
+        'all',
+    ]
+    proxy = None
+    for proxy_key in proxy_keys:
+        if proxy_key in proxies:
+            proxy = proxies[proxy_key]
+            break
+
+    return proxy
+
+
+def default_user_agent(name="python-requests"):
+    """
+    Return a string representing the default user agent.
+
+    :rtype: str
+    """
+    return '%s/%s' % (name, __version__)
+
+
+def default_headers():
+    """
+    :rtype: requests.structures.CaseInsensitiveDict
+    """
+    return CaseInsensitiveDict({
+        'User-Agent': default_user_agent(),
+        'Accept-Encoding': ', '.join(('gzip', 'deflate')),
+        'Accept': '*/*',
+        'Connection': 'keep-alive',
+    })
+
+
+def parse_header_links(value):
+    """Return a dict of parsed link headers proxies.
+
+    i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg"
+
+    :rtype: list
+    """
+
+    links = []
+
+    replace_chars = ' \'"'
+
+    for val in re.split(', *<', value):
+        try:
+            url, params = val.split(';', 1)
+        except ValueError:
+            url, params = val, ''
+
+        link = {'url': url.strip('<> \'"')}
+
+        for param in params.split(';'):
+            try:
+                key, value = param.split('=')
+            except ValueError:
+                break
+
+            link[key.strip(replace_chars)] = value.strip(replace_chars)
+
+        links.append(link)
+
+    return links
+
+
+# Null bytes; no need to recreate these on each call to guess_json_utf
+_null = '\x00'.encode('ascii')  # encoding to ASCII for Python 3
+_null2 = _null * 2
+_null3 = _null * 3
+
+
+def guess_json_utf(data):
+    """
+    :rtype: str
+    """
+    # JSON always starts with two ASCII characters, so detection is as
+    # easy as counting the nulls and from their location and count
+    # determine the encoding. Also detect a BOM, if present.
+    sample = data[:4]
+    if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE):
+        return 'utf-32'     # BOM included
+    if sample[:3] == codecs.BOM_UTF8:
+        return 'utf-8-sig'  # BOM included, MS style (discouraged)
+    if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE):
+        return 'utf-16'     # BOM included
+    nullcount = sample.count(_null)
+    if nullcount == 0:
+        return 'utf-8'
+    if nullcount == 2:
+        if sample[::2] == _null2:   # 1st and 3rd are null
+            return 'utf-16-be'
+        if sample[1::2] == _null2:  # 2nd and 4th are null
+            return 'utf-16-le'
+        # Did not detect 2 valid UTF-16 ascii-range characters
+    if nullcount == 3:
+        if sample[:3] == _null3:
+            return 'utf-32-be'
+        if sample[1:] == _null3:
+            return 'utf-32-le'
+        # Did not detect a valid UTF-32 ascii-range character
+    return None
+
+
+def prepend_scheme_if_needed(url, new_scheme):
+    """Given a URL that may or may not have a scheme, prepend the given scheme.
+    Does not replace a present scheme with the one provided as an argument.
+
+    :rtype: str
+    """
+    scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme)
+
+    # urlparse is a finicky beast, and sometimes decides that there isn't a
+    # netloc present. Assume that it's being over-cautious, and switch netloc
+    # and path if urlparse decided there was no netloc.
+    if not netloc:
+        netloc, path = path, netloc
+
+    return urlunparse((scheme, netloc, path, params, query, fragment))
+
+
+def get_auth_from_url(url):
+    """Given a url with authentication components, extract them into a tuple of
+    username,password.
+
+    :rtype: (str,str)
+    """
+    parsed = urlparse(url)
+
+    try:
+        auth = (unquote(parsed.username), unquote(parsed.password))
+    except (AttributeError, TypeError):
+        auth = ('', '')
+
+    return auth
+
+
+# Moved outside of function to avoid recompile every call
+_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$')
+_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$')
+
+
+def check_header_validity(header):
+    """Verifies that header value is a string which doesn't contain
+    leading whitespace or return characters. This prevents unintended
+    header injection.
+
+    :param header: tuple, in the format (name, value).
+    """
+    name, value = header
+
+    if isinstance(value, bytes):
+        pat = _CLEAN_HEADER_REGEX_BYTE
+    else:
+        pat = _CLEAN_HEADER_REGEX_STR
+    try:
+        if not pat.match(value):
+            raise InvalidHeader("Invalid return character or leading space in header: %s" % name)
+    except TypeError:
+        raise InvalidHeader("Value for header {%s: %s} must be of type str or "
+                            "bytes, not %s" % (name, value, type(value)))
+
+
+def urldefragauth(url):
+    """
+    Given a url remove the fragment and the authentication part.
+
+    :rtype: str
+    """
+    scheme, netloc, path, params, query, fragment = urlparse(url)
+
+    # see func:`prepend_scheme_if_needed`
+    if not netloc:
+        netloc, path = path, netloc
+
+    netloc = netloc.rsplit('@', 1)[-1]
+
+    return urlunparse((scheme, netloc, path, params, query, ''))
+
+
+def rewind_body(prepared_request):
+    """Move file pointer back to its recorded starting position
+    so it can be read again on redirect.
+    """
+    body_seek = getattr(prepared_request.body, 'seek', None)
+    if body_seek is not None and isinstance(prepared_request._body_position, integer_types):
+        try:
+            body_seek(prepared_request._body_position)
+        except (IOError, OSError):
+            raise UnrewindableBodyError("An error occurred when rewinding request "
+                                        "body for redirect.")
+    else:
+        raise UnrewindableBodyError("Unable to rewind request body for redirect.")
diff --git a/vendor/pip-9.0.3/pip/_vendor/retrying.py b/vendor/pip-9.0.3/pip/_vendor/retrying.py
new file mode 100644
index 0000000000000000000000000000000000000000..6d1e627aae8130f76781f9a2861a90a22329c930
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/retrying.py
@@ -0,0 +1,267 @@
+## Copyright 2013-2014 Ray Holder
+##
+## Licensed under the Apache License, Version 2.0 (the "License");
+## you may not use this file except in compliance with the License.
+## You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+
+import random
+from pip._vendor import six
+import sys
+import time
+import traceback
+
+
+# sys.maxint / 2, since Python 3.2 doesn't have a sys.maxint...
+MAX_WAIT = 1073741823
+
+
+def retry(*dargs, **dkw):
+    """
+    Decorator function that instantiates the Retrying object
+    @param *dargs: positional arguments passed to Retrying object
+    @param **dkw: keyword arguments passed to the Retrying object
+    """
+    # support both @retry and @retry() as valid syntax
+    if len(dargs) == 1 and callable(dargs[0]):
+        def wrap_simple(f):
+
+            @six.wraps(f)
+            def wrapped_f(*args, **kw):
+                return Retrying().call(f, *args, **kw)
+
+            return wrapped_f
+
+        return wrap_simple(dargs[0])
+
+    else:
+        def wrap(f):
+
+            @six.wraps(f)
+            def wrapped_f(*args, **kw):
+                return Retrying(*dargs, **dkw).call(f, *args, **kw)
+
+            return wrapped_f
+
+        return wrap
+
+
+class Retrying(object):
+
+    def __init__(self,
+                 stop=None, wait=None,
+                 stop_max_attempt_number=None,
+                 stop_max_delay=None,
+                 wait_fixed=None,
+                 wait_random_min=None, wait_random_max=None,
+                 wait_incrementing_start=None, wait_incrementing_increment=None,
+                 wait_exponential_multiplier=None, wait_exponential_max=None,
+                 retry_on_exception=None,
+                 retry_on_result=None,
+                 wrap_exception=False,
+                 stop_func=None,
+                 wait_func=None,
+                 wait_jitter_max=None):
+
+        self._stop_max_attempt_number = 5 if stop_max_attempt_number is None else stop_max_attempt_number
+        self._stop_max_delay = 100 if stop_max_delay is None else stop_max_delay
+        self._wait_fixed = 1000 if wait_fixed is None else wait_fixed
+        self._wait_random_min = 0 if wait_random_min is None else wait_random_min
+        self._wait_random_max = 1000 if wait_random_max is None else wait_random_max
+        self._wait_incrementing_start = 0 if wait_incrementing_start is None else wait_incrementing_start
+        self._wait_incrementing_increment = 100 if wait_incrementing_increment is None else wait_incrementing_increment
+        self._wait_exponential_multiplier = 1 if wait_exponential_multiplier is None else wait_exponential_multiplier
+        self._wait_exponential_max = MAX_WAIT if wait_exponential_max is None else wait_exponential_max
+        self._wait_jitter_max = 0 if wait_jitter_max is None else wait_jitter_max
+
+        # TODO add chaining of stop behaviors
+        # stop behavior
+        stop_funcs = []
+        if stop_max_attempt_number is not None:
+            stop_funcs.append(self.stop_after_attempt)
+
+        if stop_max_delay is not None:
+            stop_funcs.append(self.stop_after_delay)
+
+        if stop_func is not None:
+            self.stop = stop_func
+
+        elif stop is None:
+            self.stop = lambda attempts, delay: any(f(attempts, delay) for f in stop_funcs)
+
+        else:
+            self.stop = getattr(self, stop)
+
+        # TODO add chaining of wait behaviors
+        # wait behavior
+        wait_funcs = [lambda *args, **kwargs: 0]
+        if wait_fixed is not None:
+            wait_funcs.append(self.fixed_sleep)
+
+        if wait_random_min is not None or wait_random_max is not None:
+            wait_funcs.append(self.random_sleep)
+
+        if wait_incrementing_start is not None or wait_incrementing_increment is not None:
+            wait_funcs.append(self.incrementing_sleep)
+
+        if wait_exponential_multiplier is not None or wait_exponential_max is not None:
+            wait_funcs.append(self.exponential_sleep)
+
+        if wait_func is not None:
+            self.wait = wait_func
+
+        elif wait is None:
+            self.wait = lambda attempts, delay: max(f(attempts, delay) for f in wait_funcs)
+
+        else:
+            self.wait = getattr(self, wait)
+
+        # retry on exception filter
+        if retry_on_exception is None:
+            self._retry_on_exception = self.always_reject
+        else:
+            self._retry_on_exception = retry_on_exception
+
+        # TODO simplify retrying by Exception types
+        # retry on result filter
+        if retry_on_result is None:
+            self._retry_on_result = self.never_reject
+        else:
+            self._retry_on_result = retry_on_result
+
+        self._wrap_exception = wrap_exception
+
+    def stop_after_attempt(self, previous_attempt_number, delay_since_first_attempt_ms):
+        """Stop after the previous attempt >= stop_max_attempt_number."""
+        return previous_attempt_number >= self._stop_max_attempt_number
+
+    def stop_after_delay(self, previous_attempt_number, delay_since_first_attempt_ms):
+        """Stop after the time from the first attempt >= stop_max_delay."""
+        return delay_since_first_attempt_ms >= self._stop_max_delay
+
+    def no_sleep(self, previous_attempt_number, delay_since_first_attempt_ms):
+        """Don't sleep at all before retrying."""
+        return 0
+
+    def fixed_sleep(self, previous_attempt_number, delay_since_first_attempt_ms):
+        """Sleep a fixed amount of time between each retry."""
+        return self._wait_fixed
+
+    def random_sleep(self, previous_attempt_number, delay_since_first_attempt_ms):
+        """Sleep a random amount of time between wait_random_min and wait_random_max"""
+        return random.randint(self._wait_random_min, self._wait_random_max)
+
+    def incrementing_sleep(self, previous_attempt_number, delay_since_first_attempt_ms):
+        """
+        Sleep an incremental amount of time after each attempt, starting at
+        wait_incrementing_start and incrementing by wait_incrementing_increment
+        """
+        result = self._wait_incrementing_start + (self._wait_incrementing_increment * (previous_attempt_number - 1))
+        if result < 0:
+            result = 0
+        return result
+
+    def exponential_sleep(self, previous_attempt_number, delay_since_first_attempt_ms):
+        exp = 2 ** previous_attempt_number
+        result = self._wait_exponential_multiplier * exp
+        if result > self._wait_exponential_max:
+            result = self._wait_exponential_max
+        if result < 0:
+            result = 0
+        return result
+
+    def never_reject(self, result):
+        return False
+
+    def always_reject(self, result):
+        return True
+
+    def should_reject(self, attempt):
+        reject = False
+        if attempt.has_exception:
+            reject |= self._retry_on_exception(attempt.value[1])
+        else:
+            reject |= self._retry_on_result(attempt.value)
+
+        return reject
+
+    def call(self, fn, *args, **kwargs):
+        start_time = int(round(time.time() * 1000))
+        attempt_number = 1
+        while True:
+            try:
+                attempt = Attempt(fn(*args, **kwargs), attempt_number, False)
+            except:
+                tb = sys.exc_info()
+                attempt = Attempt(tb, attempt_number, True)
+
+            if not self.should_reject(attempt):
+                return attempt.get(self._wrap_exception)
+
+            delay_since_first_attempt_ms = int(round(time.time() * 1000)) - start_time
+            if self.stop(attempt_number, delay_since_first_attempt_ms):
+                if not self._wrap_exception and attempt.has_exception:
+                    # get() on an attempt with an exception should cause it to be raised, but raise just in case
+                    raise attempt.get()
+                else:
+                    raise RetryError(attempt)
+            else:
+                sleep = self.wait(attempt_number, delay_since_first_attempt_ms)
+                if self._wait_jitter_max:
+                    jitter = random.random() * self._wait_jitter_max
+                    sleep = sleep + max(0, jitter)
+                time.sleep(sleep / 1000.0)
+
+            attempt_number += 1
+
+
+class Attempt(object):
+    """
+    An Attempt encapsulates a call to a target function that may end as a
+    normal return value from the function or an Exception depending on what
+    occurred during the execution.
+    """
+
+    def __init__(self, value, attempt_number, has_exception):
+        self.value = value
+        self.attempt_number = attempt_number
+        self.has_exception = has_exception
+
+    def get(self, wrap_exception=False):
+        """
+        Return the return value of this Attempt instance or raise an Exception.
+        If wrap_exception is true, this Attempt is wrapped inside of a
+        RetryError before being raised.
+        """
+        if self.has_exception:
+            if wrap_exception:
+                raise RetryError(self)
+            else:
+                six.reraise(self.value[0], self.value[1], self.value[2])
+        else:
+            return self.value
+
+    def __repr__(self):
+        if self.has_exception:
+            return "Attempts: {0}, Error:\n{1}".format(self.attempt_number, "".join(traceback.format_tb(self.value[2])))
+        else:
+            return "Attempts: {0}, Value: {1}".format(self.attempt_number, self.value)
+
+
+class RetryError(Exception):
+    """
+    A RetryError encapsulates the last Attempt instance right before giving up.
+    """
+
+    def __init__(self, last_attempt):
+        self.last_attempt = last_attempt
+
+    def __str__(self):
+        return "RetryError[{0}]".format(self.last_attempt)
diff --git a/vendor/pip-9.0.3/pip/_vendor/six.py b/vendor/pip-9.0.3/pip/_vendor/six.py
new file mode 100644
index 0000000000000000000000000000000000000000..190c0239cd7d7af82a6e0cbc8d68053fa2e3dfaf
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/six.py
@@ -0,0 +1,868 @@
+"""Utilities for writing code that runs on Python 2 and 3"""
+
+# Copyright (c) 2010-2015 Benjamin Peterson
+#
+# 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.
+
+from __future__ import absolute_import
+
+import functools
+import itertools
+import operator
+import sys
+import types
+
+__author__ = "Benjamin Peterson <benjamin@python.org>"
+__version__ = "1.10.0"
+
+
+# Useful for very coarse version differentiation.
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+PY34 = sys.version_info[0:2] >= (3, 4)
+
+if PY3:
+    string_types = str,
+    integer_types = int,
+    class_types = type,
+    text_type = str
+    binary_type = bytes
+
+    MAXSIZE = sys.maxsize
+else:
+    string_types = basestring,
+    integer_types = (int, long)
+    class_types = (type, types.ClassType)
+    text_type = unicode
+    binary_type = str
+
+    if sys.platform.startswith("java"):
+        # Jython always uses 32 bits.
+        MAXSIZE = int((1 << 31) - 1)
+    else:
+        # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
+        class X(object):
+
+            def __len__(self):
+                return 1 << 31
+        try:
+            len(X())
+        except OverflowError:
+            # 32-bit
+            MAXSIZE = int((1 << 31) - 1)
+        else:
+            # 64-bit
+            MAXSIZE = int((1 << 63) - 1)
+        del X
+
+
+def _add_doc(func, doc):
+    """Add documentation to a function."""
+    func.__doc__ = doc
+
+
+def _import_module(name):
+    """Import module, returning the module after the last dot."""
+    __import__(name)
+    return sys.modules[name]
+
+
+class _LazyDescr(object):
+
+    def __init__(self, name):
+        self.name = name
+
+    def __get__(self, obj, tp):
+        result = self._resolve()
+        setattr(obj, self.name, result)  # Invokes __set__.
+        try:
+            # This is a bit ugly, but it avoids running this again by
+            # removing this descriptor.
+            delattr(obj.__class__, self.name)
+        except AttributeError:
+            pass
+        return result
+
+
+class MovedModule(_LazyDescr):
+
+    def __init__(self, name, old, new=None):
+        super(MovedModule, self).__init__(name)
+        if PY3:
+            if new is None:
+                new = name
+            self.mod = new
+        else:
+            self.mod = old
+
+    def _resolve(self):
+        return _import_module(self.mod)
+
+    def __getattr__(self, attr):
+        _module = self._resolve()
+        value = getattr(_module, attr)
+        setattr(self, attr, value)
+        return value
+
+
+class _LazyModule(types.ModuleType):
+
+    def __init__(self, name):
+        super(_LazyModule, self).__init__(name)
+        self.__doc__ = self.__class__.__doc__
+
+    def __dir__(self):
+        attrs = ["__doc__", "__name__"]
+        attrs += [attr.name for attr in self._moved_attributes]
+        return attrs
+
+    # Subclasses should override this
+    _moved_attributes = []
+
+
+class MovedAttribute(_LazyDescr):
+
+    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
+        super(MovedAttribute, self).__init__(name)
+        if PY3:
+            if new_mod is None:
+                new_mod = name
+            self.mod = new_mod
+            if new_attr is None:
+                if old_attr is None:
+                    new_attr = name
+                else:
+                    new_attr = old_attr
+            self.attr = new_attr
+        else:
+            self.mod = old_mod
+            if old_attr is None:
+                old_attr = name
+            self.attr = old_attr
+
+    def _resolve(self):
+        module = _import_module(self.mod)
+        return getattr(module, self.attr)
+
+
+class _SixMetaPathImporter(object):
+
+    """
+    A meta path importer to import six.moves and its submodules.
+
+    This class implements a PEP302 finder and loader. It should be compatible
+    with Python 2.5 and all existing versions of Python3
+    """
+
+    def __init__(self, six_module_name):
+        self.name = six_module_name
+        self.known_modules = {}
+
+    def _add_module(self, mod, *fullnames):
+        for fullname in fullnames:
+            self.known_modules[self.name + "." + fullname] = mod
+
+    def _get_module(self, fullname):
+        return self.known_modules[self.name + "." + fullname]
+
+    def find_module(self, fullname, path=None):
+        if fullname in self.known_modules:
+            return self
+        return None
+
+    def __get_module(self, fullname):
+        try:
+            return self.known_modules[fullname]
+        except KeyError:
+            raise ImportError("This loader does not know module " + fullname)
+
+    def load_module(self, fullname):
+        try:
+            # in case of a reload
+            return sys.modules[fullname]
+        except KeyError:
+            pass
+        mod = self.__get_module(fullname)
+        if isinstance(mod, MovedModule):
+            mod = mod._resolve()
+        else:
+            mod.__loader__ = self
+        sys.modules[fullname] = mod
+        return mod
+
+    def is_package(self, fullname):
+        """
+        Return true, if the named module is a package.
+
+        We need this method to get correct spec objects with
+        Python 3.4 (see PEP451)
+        """
+        return hasattr(self.__get_module(fullname), "__path__")
+
+    def get_code(self, fullname):
+        """Return None
+
+        Required, if is_package is implemented"""
+        self.__get_module(fullname)  # eventually raises ImportError
+        return None
+    get_source = get_code  # same as get_code
+
+_importer = _SixMetaPathImporter(__name__)
+
+
+class _MovedItems(_LazyModule):
+
+    """Lazy loading of moved objects"""
+    __path__ = []  # mark as package
+
+
+_moved_attributes = [
+    MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
+    MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
+    MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
+    MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
+    MovedAttribute("intern", "__builtin__", "sys"),
+    MovedAttribute("map", "itertools", "builtins", "imap", "map"),
+    MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
+    MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
+    MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
+    MovedAttribute("reduce", "__builtin__", "functools"),
+    MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
+    MovedAttribute("StringIO", "StringIO", "io"),
+    MovedAttribute("UserDict", "UserDict", "collections"),
+    MovedAttribute("UserList", "UserList", "collections"),
+    MovedAttribute("UserString", "UserString", "collections"),
+    MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
+    MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
+    MovedModule("builtins", "__builtin__"),
+    MovedModule("configparser", "ConfigParser"),
+    MovedModule("copyreg", "copy_reg"),
+    MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
+    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
+    MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
+    MovedModule("http_cookies", "Cookie", "http.cookies"),
+    MovedModule("html_entities", "htmlentitydefs", "html.entities"),
+    MovedModule("html_parser", "HTMLParser", "html.parser"),
+    MovedModule("http_client", "httplib", "http.client"),
+    MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
+    MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
+    MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
+    MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
+    MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
+    MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
+    MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
+    MovedModule("cPickle", "cPickle", "pickle"),
+    MovedModule("queue", "Queue"),
+    MovedModule("reprlib", "repr"),
+    MovedModule("socketserver", "SocketServer"),
+    MovedModule("_thread", "thread", "_thread"),
+    MovedModule("tkinter", "Tkinter"),
+    MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
+    MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
+    MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
+    MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
+    MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
+    MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
+    MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
+    MovedModule("tkinter_colorchooser", "tkColorChooser",
+                "tkinter.colorchooser"),
+    MovedModule("tkinter_commondialog", "tkCommonDialog",
+                "tkinter.commondialog"),
+    MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_font", "tkFont", "tkinter.font"),
+    MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
+    MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
+                "tkinter.simpledialog"),
+    MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
+    MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
+    MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
+    MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
+    MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
+    MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
+]
+# Add windows specific modules.
+if sys.platform == "win32":
+    _moved_attributes += [
+        MovedModule("winreg", "_winreg"),
+    ]
+
+for attr in _moved_attributes:
+    setattr(_MovedItems, attr.name, attr)
+    if isinstance(attr, MovedModule):
+        _importer._add_module(attr, "moves." + attr.name)
+del attr
+
+_MovedItems._moved_attributes = _moved_attributes
+
+moves = _MovedItems(__name__ + ".moves")
+_importer._add_module(moves, "moves")
+
+
+class Module_six_moves_urllib_parse(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_parse"""
+
+
+_urllib_parse_moved_attributes = [
+    MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
+    MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
+    MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
+    MovedAttribute("urljoin", "urlparse", "urllib.parse"),
+    MovedAttribute("urlparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("quote", "urllib", "urllib.parse"),
+    MovedAttribute("quote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("unquote", "urllib", "urllib.parse"),
+    MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("urlencode", "urllib", "urllib.parse"),
+    MovedAttribute("splitquery", "urllib", "urllib.parse"),
+    MovedAttribute("splittag", "urllib", "urllib.parse"),
+    MovedAttribute("splituser", "urllib", "urllib.parse"),
+    MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_params", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_query", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
+]
+for attr in _urllib_parse_moved_attributes:
+    setattr(Module_six_moves_urllib_parse, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
+                      "moves.urllib_parse", "moves.urllib.parse")
+
+
+class Module_six_moves_urllib_error(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_error"""
+
+
+_urllib_error_moved_attributes = [
+    MovedAttribute("URLError", "urllib2", "urllib.error"),
+    MovedAttribute("HTTPError", "urllib2", "urllib.error"),
+    MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
+]
+for attr in _urllib_error_moved_attributes:
+    setattr(Module_six_moves_urllib_error, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
+                      "moves.urllib_error", "moves.urllib.error")
+
+
+class Module_six_moves_urllib_request(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_request"""
+
+
+_urllib_request_moved_attributes = [
+    MovedAttribute("urlopen", "urllib2", "urllib.request"),
+    MovedAttribute("install_opener", "urllib2", "urllib.request"),
+    MovedAttribute("build_opener", "urllib2", "urllib.request"),
+    MovedAttribute("pathname2url", "urllib", "urllib.request"),
+    MovedAttribute("url2pathname", "urllib", "urllib.request"),
+    MovedAttribute("getproxies", "urllib", "urllib.request"),
+    MovedAttribute("Request", "urllib2", "urllib.request"),
+    MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
+    MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FileHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("urlretrieve", "urllib", "urllib.request"),
+    MovedAttribute("urlcleanup", "urllib", "urllib.request"),
+    MovedAttribute("URLopener", "urllib", "urllib.request"),
+    MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
+    MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
+]
+for attr in _urllib_request_moved_attributes:
+    setattr(Module_six_moves_urllib_request, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
+                      "moves.urllib_request", "moves.urllib.request")
+
+
+class Module_six_moves_urllib_response(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_response"""
+
+
+_urllib_response_moved_attributes = [
+    MovedAttribute("addbase", "urllib", "urllib.response"),
+    MovedAttribute("addclosehook", "urllib", "urllib.response"),
+    MovedAttribute("addinfo", "urllib", "urllib.response"),
+    MovedAttribute("addinfourl", "urllib", "urllib.response"),
+]
+for attr in _urllib_response_moved_attributes:
+    setattr(Module_six_moves_urllib_response, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
+                      "moves.urllib_response", "moves.urllib.response")
+
+
+class Module_six_moves_urllib_robotparser(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_robotparser"""
+
+
+_urllib_robotparser_moved_attributes = [
+    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
+]
+for attr in _urllib_robotparser_moved_attributes:
+    setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
+                      "moves.urllib_robotparser", "moves.urllib.robotparser")
+
+
+class Module_six_moves_urllib(types.ModuleType):
+
+    """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
+    __path__ = []  # mark as package
+    parse = _importer._get_module("moves.urllib_parse")
+    error = _importer._get_module("moves.urllib_error")
+    request = _importer._get_module("moves.urllib_request")
+    response = _importer._get_module("moves.urllib_response")
+    robotparser = _importer._get_module("moves.urllib_robotparser")
+
+    def __dir__(self):
+        return ['parse', 'error', 'request', 'response', 'robotparser']
+
+_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
+                      "moves.urllib")
+
+
+def add_move(move):
+    """Add an item to six.moves."""
+    setattr(_MovedItems, move.name, move)
+
+
+def remove_move(name):
+    """Remove item from six.moves."""
+    try:
+        delattr(_MovedItems, name)
+    except AttributeError:
+        try:
+            del moves.__dict__[name]
+        except KeyError:
+            raise AttributeError("no such move, %r" % (name,))
+
+
+if PY3:
+    _meth_func = "__func__"
+    _meth_self = "__self__"
+
+    _func_closure = "__closure__"
+    _func_code = "__code__"
+    _func_defaults = "__defaults__"
+    _func_globals = "__globals__"
+else:
+    _meth_func = "im_func"
+    _meth_self = "im_self"
+
+    _func_closure = "func_closure"
+    _func_code = "func_code"
+    _func_defaults = "func_defaults"
+    _func_globals = "func_globals"
+
+
+try:
+    advance_iterator = next
+except NameError:
+    def advance_iterator(it):
+        return it.next()
+next = advance_iterator
+
+
+try:
+    callable = callable
+except NameError:
+    def callable(obj):
+        return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
+
+
+if PY3:
+    def get_unbound_function(unbound):
+        return unbound
+
+    create_bound_method = types.MethodType
+
+    def create_unbound_method(func, cls):
+        return func
+
+    Iterator = object
+else:
+    def get_unbound_function(unbound):
+        return unbound.im_func
+
+    def create_bound_method(func, obj):
+        return types.MethodType(func, obj, obj.__class__)
+
+    def create_unbound_method(func, cls):
+        return types.MethodType(func, None, cls)
+
+    class Iterator(object):
+
+        def next(self):
+            return type(self).__next__(self)
+
+    callable = callable
+_add_doc(get_unbound_function,
+         """Get the function out of a possibly unbound function""")
+
+
+get_method_function = operator.attrgetter(_meth_func)
+get_method_self = operator.attrgetter(_meth_self)
+get_function_closure = operator.attrgetter(_func_closure)
+get_function_code = operator.attrgetter(_func_code)
+get_function_defaults = operator.attrgetter(_func_defaults)
+get_function_globals = operator.attrgetter(_func_globals)
+
+
+if PY3:
+    def iterkeys(d, **kw):
+        return iter(d.keys(**kw))
+
+    def itervalues(d, **kw):
+        return iter(d.values(**kw))
+
+    def iteritems(d, **kw):
+        return iter(d.items(**kw))
+
+    def iterlists(d, **kw):
+        return iter(d.lists(**kw))
+
+    viewkeys = operator.methodcaller("keys")
+
+    viewvalues = operator.methodcaller("values")
+
+    viewitems = operator.methodcaller("items")
+else:
+    def iterkeys(d, **kw):
+        return d.iterkeys(**kw)
+
+    def itervalues(d, **kw):
+        return d.itervalues(**kw)
+
+    def iteritems(d, **kw):
+        return d.iteritems(**kw)
+
+    def iterlists(d, **kw):
+        return d.iterlists(**kw)
+
+    viewkeys = operator.methodcaller("viewkeys")
+
+    viewvalues = operator.methodcaller("viewvalues")
+
+    viewitems = operator.methodcaller("viewitems")
+
+_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
+_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
+_add_doc(iteritems,
+         "Return an iterator over the (key, value) pairs of a dictionary.")
+_add_doc(iterlists,
+         "Return an iterator over the (key, [values]) pairs of a dictionary.")
+
+
+if PY3:
+    def b(s):
+        return s.encode("latin-1")
+
+    def u(s):
+        return s
+    unichr = chr
+    import struct
+    int2byte = struct.Struct(">B").pack
+    del struct
+    byte2int = operator.itemgetter(0)
+    indexbytes = operator.getitem
+    iterbytes = iter
+    import io
+    StringIO = io.StringIO
+    BytesIO = io.BytesIO
+    _assertCountEqual = "assertCountEqual"
+    if sys.version_info[1] <= 1:
+        _assertRaisesRegex = "assertRaisesRegexp"
+        _assertRegex = "assertRegexpMatches"
+    else:
+        _assertRaisesRegex = "assertRaisesRegex"
+        _assertRegex = "assertRegex"
+else:
+    def b(s):
+        return s
+    # Workaround for standalone backslash
+
+    def u(s):
+        return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
+    unichr = unichr
+    int2byte = chr
+
+    def byte2int(bs):
+        return ord(bs[0])
+
+    def indexbytes(buf, i):
+        return ord(buf[i])
+    iterbytes = functools.partial(itertools.imap, ord)
+    import StringIO
+    StringIO = BytesIO = StringIO.StringIO
+    _assertCountEqual = "assertItemsEqual"
+    _assertRaisesRegex = "assertRaisesRegexp"
+    _assertRegex = "assertRegexpMatches"
+_add_doc(b, """Byte literal""")
+_add_doc(u, """Text literal""")
+
+
+def assertCountEqual(self, *args, **kwargs):
+    return getattr(self, _assertCountEqual)(*args, **kwargs)
+
+
+def assertRaisesRegex(self, *args, **kwargs):
+    return getattr(self, _assertRaisesRegex)(*args, **kwargs)
+
+
+def assertRegex(self, *args, **kwargs):
+    return getattr(self, _assertRegex)(*args, **kwargs)
+
+
+if PY3:
+    exec_ = getattr(moves.builtins, "exec")
+
+    def reraise(tp, value, tb=None):
+        if value is None:
+            value = tp()
+        if value.__traceback__ is not tb:
+            raise value.with_traceback(tb)
+        raise value
+
+else:
+    def exec_(_code_, _globs_=None, _locs_=None):
+        """Execute code in a namespace."""
+        if _globs_ is None:
+            frame = sys._getframe(1)
+            _globs_ = frame.f_globals
+            if _locs_ is None:
+                _locs_ = frame.f_locals
+            del frame
+        elif _locs_ is None:
+            _locs_ = _globs_
+        exec("""exec _code_ in _globs_, _locs_""")
+
+    exec_("""def reraise(tp, value, tb=None):
+    raise tp, value, tb
+""")
+
+
+if sys.version_info[:2] == (3, 2):
+    exec_("""def raise_from(value, from_value):
+    if from_value is None:
+        raise value
+    raise value from from_value
+""")
+elif sys.version_info[:2] > (3, 2):
+    exec_("""def raise_from(value, from_value):
+    raise value from from_value
+""")
+else:
+    def raise_from(value, from_value):
+        raise value
+
+
+print_ = getattr(moves.builtins, "print", None)
+if print_ is None:
+    def print_(*args, **kwargs):
+        """The new-style print function for Python 2.4 and 2.5."""
+        fp = kwargs.pop("file", sys.stdout)
+        if fp is None:
+            return
+
+        def write(data):
+            if not isinstance(data, basestring):
+                data = str(data)
+            # If the file has an encoding, encode unicode with it.
+            if (isinstance(fp, file) and
+                    isinstance(data, unicode) and
+                    fp.encoding is not None):
+                errors = getattr(fp, "errors", None)
+                if errors is None:
+                    errors = "strict"
+                data = data.encode(fp.encoding, errors)
+            fp.write(data)
+        want_unicode = False
+        sep = kwargs.pop("sep", None)
+        if sep is not None:
+            if isinstance(sep, unicode):
+                want_unicode = True
+            elif not isinstance(sep, str):
+                raise TypeError("sep must be None or a string")
+        end = kwargs.pop("end", None)
+        if end is not None:
+            if isinstance(end, unicode):
+                want_unicode = True
+            elif not isinstance(end, str):
+                raise TypeError("end must be None or a string")
+        if kwargs:
+            raise TypeError("invalid keyword arguments to print()")
+        if not want_unicode:
+            for arg in args:
+                if isinstance(arg, unicode):
+                    want_unicode = True
+                    break
+        if want_unicode:
+            newline = unicode("\n")
+            space = unicode(" ")
+        else:
+            newline = "\n"
+            space = " "
+        if sep is None:
+            sep = space
+        if end is None:
+            end = newline
+        for i, arg in enumerate(args):
+            if i:
+                write(sep)
+            write(arg)
+        write(end)
+if sys.version_info[:2] < (3, 3):
+    _print = print_
+
+    def print_(*args, **kwargs):
+        fp = kwargs.get("file", sys.stdout)
+        flush = kwargs.pop("flush", False)
+        _print(*args, **kwargs)
+        if flush and fp is not None:
+            fp.flush()
+
+_add_doc(reraise, """Reraise an exception.""")
+
+if sys.version_info[0:2] < (3, 4):
+    def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
+              updated=functools.WRAPPER_UPDATES):
+        def wrapper(f):
+            f = functools.wraps(wrapped, assigned, updated)(f)
+            f.__wrapped__ = wrapped
+            return f
+        return wrapper
+else:
+    wraps = functools.wraps
+
+
+def with_metaclass(meta, *bases):
+    """Create a base class with a metaclass."""
+    # This requires a bit of explanation: the basic idea is to make a dummy
+    # metaclass for one level of class instantiation that replaces itself with
+    # the actual metaclass.
+    class metaclass(meta):
+
+        def __new__(cls, name, this_bases, d):
+            return meta(name, bases, d)
+    return type.__new__(metaclass, 'temporary_class', (), {})
+
+
+def add_metaclass(metaclass):
+    """Class decorator for creating a class with a metaclass."""
+    def wrapper(cls):
+        orig_vars = cls.__dict__.copy()
+        slots = orig_vars.get('__slots__')
+        if slots is not None:
+            if isinstance(slots, str):
+                slots = [slots]
+            for slots_var in slots:
+                orig_vars.pop(slots_var)
+        orig_vars.pop('__dict__', None)
+        orig_vars.pop('__weakref__', None)
+        return metaclass(cls.__name__, cls.__bases__, orig_vars)
+    return wrapper
+
+
+def python_2_unicode_compatible(klass):
+    """
+    A decorator that defines __unicode__ and __str__ methods under Python 2.
+    Under Python 3 it does nothing.
+
+    To support Python 2 and 3 with a single code base, define a __str__ method
+    returning text and apply this decorator to the class.
+    """
+    if PY2:
+        if '__str__' not in klass.__dict__:
+            raise ValueError("@python_2_unicode_compatible cannot be applied "
+                             "to %s because it doesn't define __str__()." %
+                             klass.__name__)
+        klass.__unicode__ = klass.__str__
+        klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
+    return klass
+
+
+# Complete the moves implementation.
+# This code is at the end of this module to speed up module loading.
+# Turn this module into a package.
+__path__ = []  # required for PEP 302 and PEP 451
+__package__ = __name__  # see PEP 366 @ReservedAssignment
+if globals().get("__spec__") is not None:
+    __spec__.submodule_search_locations = []  # PEP 451 @UndefinedVariable
+# Remove other six meta path importers, since they cause problems. This can
+# happen if six is removed from sys.modules and then reloaded. (Setuptools does
+# this for some reason.)
+if sys.meta_path:
+    for i, importer in enumerate(sys.meta_path):
+        # Here's some real nastiness: Another "instance" of the six module might
+        # be floating around. Therefore, we can't use isinstance() to check for
+        # the six meta path importer, since the other six instance will have
+        # inserted an importer with different class.
+        if (type(importer).__name__ == "_SixMetaPathImporter" and
+                importer.name == __name__):
+            del sys.meta_path[i]
+            break
+    del i, importer
+# Finally, add the importer to the meta path import hook.
+sys.meta_path.append(_importer)
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/__init__.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..aaa6b1c6d94a446058d14dc0c27a1f28bd48d6e9
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/__init__.py
@@ -0,0 +1,97 @@
+"""
+urllib3 - Thread-safe connection pooling and re-using.
+"""
+
+from __future__ import absolute_import
+import warnings
+
+from .connectionpool import (
+    HTTPConnectionPool,
+    HTTPSConnectionPool,
+    connection_from_url
+)
+
+from . import exceptions
+from .filepost import encode_multipart_formdata
+from .poolmanager import PoolManager, ProxyManager, proxy_from_url
+from .response import HTTPResponse
+from .util.request import make_headers
+from .util.url import get_host
+from .util.timeout import Timeout
+from .util.retry import Retry
+
+
+# Set default logging handler to avoid "No handler found" warnings.
+import logging
+try:  # Python 2.7+
+    from logging import NullHandler
+except ImportError:
+    class NullHandler(logging.Handler):
+        def emit(self, record):
+            pass
+
+__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)'
+__license__ = 'MIT'
+__version__ = '1.22'
+
+__all__ = (
+    'HTTPConnectionPool',
+    'HTTPSConnectionPool',
+    'PoolManager',
+    'ProxyManager',
+    'HTTPResponse',
+    'Retry',
+    'Timeout',
+    'add_stderr_logger',
+    'connection_from_url',
+    'disable_warnings',
+    'encode_multipart_formdata',
+    'get_host',
+    'make_headers',
+    'proxy_from_url',
+)
+
+logging.getLogger(__name__).addHandler(NullHandler())
+
+
+def add_stderr_logger(level=logging.DEBUG):
+    """
+    Helper for quickly adding a StreamHandler to the logger. Useful for
+    debugging.
+
+    Returns the handler after adding it.
+    """
+    # This method needs to be in this __init__.py to get the __name__ correct
+    # even if urllib3 is vendored within another package.
+    logger = logging.getLogger(__name__)
+    handler = logging.StreamHandler()
+    handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
+    logger.addHandler(handler)
+    logger.setLevel(level)
+    logger.debug('Added a stderr logging handler to logger: %s', __name__)
+    return handler
+
+
+# ... Clean up.
+del NullHandler
+
+
+# All warning filters *must* be appended unless you're really certain that they
+# shouldn't be: otherwise, it's very hard for users to use most Python
+# mechanisms to silence them.
+# SecurityWarning's always go off by default.
+warnings.simplefilter('always', exceptions.SecurityWarning, append=True)
+# SubjectAltNameWarning's should go off once per host
+warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True)
+# InsecurePlatformWarning's don't vary between requests, so we keep it default.
+warnings.simplefilter('default', exceptions.InsecurePlatformWarning,
+                      append=True)
+# SNIMissingWarnings should go off only once.
+warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True)
+
+
+def disable_warnings(category=exceptions.HTTPWarning):
+    """
+    Helper for quickly disabling all urllib3 warnings.
+    """
+    warnings.simplefilter('ignore', category)
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/_collections.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/_collections.py
new file mode 100644
index 0000000000000000000000000000000000000000..5df2372c4e04fc41fe5142422b06db038c86d372
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/_collections.py
@@ -0,0 +1,319 @@
+from __future__ import absolute_import
+from collections import Mapping, MutableMapping
+try:
+    from threading import RLock
+except ImportError:  # Platform-specific: No threads available
+    class RLock:
+        def __enter__(self):
+            pass
+
+        def __exit__(self, exc_type, exc_value, traceback):
+            pass
+
+
+try:  # Python 2.7+
+    from collections import OrderedDict
+except ImportError:
+    from .packages.ordered_dict import OrderedDict
+from .packages.six import iterkeys, itervalues, PY3
+
+
+__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict']
+
+
+_Null = object()
+
+
+class RecentlyUsedContainer(MutableMapping):
+    """
+    Provides a thread-safe dict-like container which maintains up to
+    ``maxsize`` keys while throwing away the least-recently-used keys beyond
+    ``maxsize``.
+
+    :param maxsize:
+        Maximum number of recent elements to retain.
+
+    :param dispose_func:
+        Every time an item is evicted from the container,
+        ``dispose_func(value)`` is called.  Callback which will get called
+    """
+
+    ContainerCls = OrderedDict
+
+    def __init__(self, maxsize=10, dispose_func=None):
+        self._maxsize = maxsize
+        self.dispose_func = dispose_func
+
+        self._container = self.ContainerCls()
+        self.lock = RLock()
+
+    def __getitem__(self, key):
+        # Re-insert the item, moving it to the end of the eviction line.
+        with self.lock:
+            item = self._container.pop(key)
+            self._container[key] = item
+            return item
+
+    def __setitem__(self, key, value):
+        evicted_value = _Null
+        with self.lock:
+            # Possibly evict the existing value of 'key'
+            evicted_value = self._container.get(key, _Null)
+            self._container[key] = value
+
+            # If we didn't evict an existing value, we might have to evict the
+            # least recently used item from the beginning of the container.
+            if len(self._container) > self._maxsize:
+                _key, evicted_value = self._container.popitem(last=False)
+
+        if self.dispose_func and evicted_value is not _Null:
+            self.dispose_func(evicted_value)
+
+    def __delitem__(self, key):
+        with self.lock:
+            value = self._container.pop(key)
+
+        if self.dispose_func:
+            self.dispose_func(value)
+
+    def __len__(self):
+        with self.lock:
+            return len(self._container)
+
+    def __iter__(self):
+        raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.')
+
+    def clear(self):
+        with self.lock:
+            # Copy pointers to all values, then wipe the mapping
+            values = list(itervalues(self._container))
+            self._container.clear()
+
+        if self.dispose_func:
+            for value in values:
+                self.dispose_func(value)
+
+    def keys(self):
+        with self.lock:
+            return list(iterkeys(self._container))
+
+
+class HTTPHeaderDict(MutableMapping):
+    """
+    :param headers:
+        An iterable of field-value pairs. Must not contain multiple field names
+        when compared case-insensitively.
+
+    :param kwargs:
+        Additional field-value pairs to pass in to ``dict.update``.
+
+    A ``dict`` like container for storing HTTP Headers.
+
+    Field names are stored and compared case-insensitively in compliance with
+    RFC 7230. Iteration provides the first case-sensitive key seen for each
+    case-insensitive pair.
+
+    Using ``__setitem__`` syntax overwrites fields that compare equal
+    case-insensitively in order to maintain ``dict``'s api. For fields that
+    compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add``
+    in a loop.
+
+    If multiple fields that are equal case-insensitively are passed to the
+    constructor or ``.update``, the behavior is undefined and some will be
+    lost.
+
+    >>> headers = HTTPHeaderDict()
+    >>> headers.add('Set-Cookie', 'foo=bar')
+    >>> headers.add('set-cookie', 'baz=quxx')
+    >>> headers['content-length'] = '7'
+    >>> headers['SET-cookie']
+    'foo=bar, baz=quxx'
+    >>> headers['Content-Length']
+    '7'
+    """
+
+    def __init__(self, headers=None, **kwargs):
+        super(HTTPHeaderDict, self).__init__()
+        self._container = OrderedDict()
+        if headers is not None:
+            if isinstance(headers, HTTPHeaderDict):
+                self._copy_from(headers)
+            else:
+                self.extend(headers)
+        if kwargs:
+            self.extend(kwargs)
+
+    def __setitem__(self, key, val):
+        self._container[key.lower()] = [key, val]
+        return self._container[key.lower()]
+
+    def __getitem__(self, key):
+        val = self._container[key.lower()]
+        return ', '.join(val[1:])
+
+    def __delitem__(self, key):
+        del self._container[key.lower()]
+
+    def __contains__(self, key):
+        return key.lower() in self._container
+
+    def __eq__(self, other):
+        if not isinstance(other, Mapping) and not hasattr(other, 'keys'):
+            return False
+        if not isinstance(other, type(self)):
+            other = type(self)(other)
+        return (dict((k.lower(), v) for k, v in self.itermerged()) ==
+                dict((k.lower(), v) for k, v in other.itermerged()))
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    if not PY3:  # Python 2
+        iterkeys = MutableMapping.iterkeys
+        itervalues = MutableMapping.itervalues
+
+    __marker = object()
+
+    def __len__(self):
+        return len(self._container)
+
+    def __iter__(self):
+        # Only provide the originally cased names
+        for vals in self._container.values():
+            yield vals[0]
+
+    def pop(self, key, default=__marker):
+        '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
+          If key is not found, d is returned if given, otherwise KeyError is raised.
+        '''
+        # Using the MutableMapping function directly fails due to the private marker.
+        # Using ordinary dict.pop would expose the internal structures.
+        # So let's reinvent the wheel.
+        try:
+            value = self[key]
+        except KeyError:
+            if default is self.__marker:
+                raise
+            return default
+        else:
+            del self[key]
+            return value
+
+    def discard(self, key):
+        try:
+            del self[key]
+        except KeyError:
+            pass
+
+    def add(self, key, val):
+        """Adds a (name, value) pair, doesn't overwrite the value if it already
+        exists.
+
+        >>> headers = HTTPHeaderDict(foo='bar')
+        >>> headers.add('Foo', 'baz')
+        >>> headers['foo']
+        'bar, baz'
+        """
+        key_lower = key.lower()
+        new_vals = [key, val]
+        # Keep the common case aka no item present as fast as possible
+        vals = self._container.setdefault(key_lower, new_vals)
+        if new_vals is not vals:
+            vals.append(val)
+
+    def extend(self, *args, **kwargs):
+        """Generic import function for any type of header-like object.
+        Adapted version of MutableMapping.update in order to insert items
+        with self.add instead of self.__setitem__
+        """
+        if len(args) > 1:
+            raise TypeError("extend() takes at most 1 positional "
+                            "arguments ({0} given)".format(len(args)))
+        other = args[0] if len(args) >= 1 else ()
+
+        if isinstance(other, HTTPHeaderDict):
+            for key, val in other.iteritems():
+                self.add(key, val)
+        elif isinstance(other, Mapping):
+            for key in other:
+                self.add(key, other[key])
+        elif hasattr(other, "keys"):
+            for key in other.keys():
+                self.add(key, other[key])
+        else:
+            for key, value in other:
+                self.add(key, value)
+
+        for key, value in kwargs.items():
+            self.add(key, value)
+
+    def getlist(self, key, default=__marker):
+        """Returns a list of all the values for the named field. Returns an
+        empty list if the key doesn't exist."""
+        try:
+            vals = self._container[key.lower()]
+        except KeyError:
+            if default is self.__marker:
+                return []
+            return default
+        else:
+            return vals[1:]
+
+    # Backwards compatibility for httplib
+    getheaders = getlist
+    getallmatchingheaders = getlist
+    iget = getlist
+
+    # Backwards compatibility for http.cookiejar
+    get_all = getlist
+
+    def __repr__(self):
+        return "%s(%s)" % (type(self).__name__, dict(self.itermerged()))
+
+    def _copy_from(self, other):
+        for key in other:
+            val = other.getlist(key)
+            if isinstance(val, list):
+                # Don't need to convert tuples
+                val = list(val)
+            self._container[key.lower()] = [key] + val
+
+    def copy(self):
+        clone = type(self)()
+        clone._copy_from(self)
+        return clone
+
+    def iteritems(self):
+        """Iterate over all header lines, including duplicate ones."""
+        for key in self:
+            vals = self._container[key.lower()]
+            for val in vals[1:]:
+                yield vals[0], val
+
+    def itermerged(self):
+        """Iterate over all headers, merging duplicate ones together."""
+        for key in self:
+            val = self._container[key.lower()]
+            yield val[0], ', '.join(val[1:])
+
+    def items(self):
+        return list(self.iteritems())
+
+    @classmethod
+    def from_httplib(cls, message):  # Python 2
+        """Read headers from a Python 2 httplib message object."""
+        # python2.7 does not expose a proper API for exporting multiheaders
+        # efficiently. This function re-reads raw lines from the message
+        # object and extracts the multiheaders properly.
+        headers = []
+
+        for line in message.headers:
+            if line.startswith((' ', '\t')):
+                key, value = headers[-1]
+                headers[-1] = (key, value + '\r\n' + line.rstrip())
+                continue
+
+            key, value = line.split(':', 1)
+            headers.append((key, value.strip()))
+
+        return cls(headers)
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/connection.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/connection.py
new file mode 100644
index 0000000000000000000000000000000000000000..c0d832998528fc7d55e85b04ef5ab73109481732
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/connection.py
@@ -0,0 +1,373 @@
+from __future__ import absolute_import
+import datetime
+import logging
+import os
+import sys
+import socket
+from socket import error as SocketError, timeout as SocketTimeout
+import warnings
+from .packages import six
+from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection
+from .packages.six.moves.http_client import HTTPException  # noqa: F401
+
+try:  # Compiled with SSL?
+    import ssl
+    BaseSSLError = ssl.SSLError
+except (ImportError, AttributeError):  # Platform-specific: No SSL.
+    ssl = None
+
+    class BaseSSLError(BaseException):
+        pass
+
+
+try:  # Python 3:
+    # Not a no-op, we're adding this to the namespace so it can be imported.
+    ConnectionError = ConnectionError
+except NameError:  # Python 2:
+    class ConnectionError(Exception):
+        pass
+
+
+from .exceptions import (
+    NewConnectionError,
+    ConnectTimeoutError,
+    SubjectAltNameWarning,
+    SystemTimeWarning,
+)
+from .packages.ssl_match_hostname import match_hostname, CertificateError
+
+from .util.ssl_ import (
+    resolve_cert_reqs,
+    resolve_ssl_version,
+    assert_fingerprint,
+    create_urllib3_context,
+    ssl_wrap_socket
+)
+
+
+from .util import connection
+
+from ._collections import HTTPHeaderDict
+
+log = logging.getLogger(__name__)
+
+port_by_scheme = {
+    'http': 80,
+    'https': 443,
+}
+
+# When updating RECENT_DATE, move it to
+# within two years of the current date, and no
+# earlier than 6 months ago.
+RECENT_DATE = datetime.date(2016, 1, 1)
+
+
+class DummyConnection(object):
+    """Used to detect a failed ConnectionCls import."""
+    pass
+
+
+class HTTPConnection(_HTTPConnection, object):
+    """
+    Based on httplib.HTTPConnection but provides an extra constructor
+    backwards-compatibility layer between older and newer Pythons.
+
+    Additional keyword parameters are used to configure attributes of the connection.
+    Accepted parameters include:
+
+      - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool`
+      - ``source_address``: Set the source address for the current connection.
+
+        .. note:: This is ignored for Python 2.6. It is only applied for 2.7 and 3.x
+
+      - ``socket_options``: Set specific options on the underlying socket. If not specified, then
+        defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling
+        Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy.
+
+        For example, if you wish to enable TCP Keep Alive in addition to the defaults,
+        you might pass::
+
+            HTTPConnection.default_socket_options + [
+                (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
+            ]
+
+        Or you may want to disable the defaults by passing an empty list (e.g., ``[]``).
+    """
+
+    default_port = port_by_scheme['http']
+
+    #: Disable Nagle's algorithm by default.
+    #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]``
+    default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]
+
+    #: Whether this connection verifies the host's certificate.
+    is_verified = False
+
+    def __init__(self, *args, **kw):
+        if six.PY3:  # Python 3
+            kw.pop('strict', None)
+
+        # Pre-set source_address in case we have an older Python like 2.6.
+        self.source_address = kw.get('source_address')
+
+        if sys.version_info < (2, 7):  # Python 2.6
+            # _HTTPConnection on Python 2.6 will balk at this keyword arg, but
+            # not newer versions. We can still use it when creating a
+            # connection though, so we pop it *after* we have saved it as
+            # self.source_address.
+            kw.pop('source_address', None)
+
+        #: The socket options provided by the user. If no options are
+        #: provided, we use the default options.
+        self.socket_options = kw.pop('socket_options', self.default_socket_options)
+
+        # Superclass also sets self.source_address in Python 2.7+.
+        _HTTPConnection.__init__(self, *args, **kw)
+
+    def _new_conn(self):
+        """ Establish a socket connection and set nodelay settings on it.
+
+        :return: New socket connection.
+        """
+        extra_kw = {}
+        if self.source_address:
+            extra_kw['source_address'] = self.source_address
+
+        if self.socket_options:
+            extra_kw['socket_options'] = self.socket_options
+
+        try:
+            conn = connection.create_connection(
+                (self.host, self.port), self.timeout, **extra_kw)
+
+        except SocketTimeout as e:
+            raise ConnectTimeoutError(
+                self, "Connection to %s timed out. (connect timeout=%s)" %
+                (self.host, self.timeout))
+
+        except SocketError as e:
+            raise NewConnectionError(
+                self, "Failed to establish a new connection: %s" % e)
+
+        return conn
+
+    def _prepare_conn(self, conn):
+        self.sock = conn
+        # the _tunnel_host attribute was added in python 2.6.3 (via
+        # http://hg.python.org/cpython/rev/0f57b30a152f) so pythons 2.6(0-2) do
+        # not have them.
+        if getattr(self, '_tunnel_host', None):
+            # TODO: Fix tunnel so it doesn't depend on self.sock state.
+            self._tunnel()
+            # Mark this connection as not reusable
+            self.auto_open = 0
+
+    def connect(self):
+        conn = self._new_conn()
+        self._prepare_conn(conn)
+
+    def request_chunked(self, method, url, body=None, headers=None):
+        """
+        Alternative to the common request method, which sends the
+        body with chunked encoding and not as one block
+        """
+        headers = HTTPHeaderDict(headers if headers is not None else {})
+        skip_accept_encoding = 'accept-encoding' in headers
+        skip_host = 'host' in headers
+        self.putrequest(
+            method,
+            url,
+            skip_accept_encoding=skip_accept_encoding,
+            skip_host=skip_host
+        )
+        for header, value in headers.items():
+            self.putheader(header, value)
+        if 'transfer-encoding' not in headers:
+            self.putheader('Transfer-Encoding', 'chunked')
+        self.endheaders()
+
+        if body is not None:
+            stringish_types = six.string_types + (six.binary_type,)
+            if isinstance(body, stringish_types):
+                body = (body,)
+            for chunk in body:
+                if not chunk:
+                    continue
+                if not isinstance(chunk, six.binary_type):
+                    chunk = chunk.encode('utf8')
+                len_str = hex(len(chunk))[2:]
+                self.send(len_str.encode('utf-8'))
+                self.send(b'\r\n')
+                self.send(chunk)
+                self.send(b'\r\n')
+
+        # After the if clause, to always have a closed body
+        self.send(b'0\r\n\r\n')
+
+
+class HTTPSConnection(HTTPConnection):
+    default_port = port_by_scheme['https']
+
+    ssl_version = None
+
+    def __init__(self, host, port=None, key_file=None, cert_file=None,
+                 strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
+                 ssl_context=None, **kw):
+
+        HTTPConnection.__init__(self, host, port, strict=strict,
+                                timeout=timeout, **kw)
+
+        self.key_file = key_file
+        self.cert_file = cert_file
+        self.ssl_context = ssl_context
+
+        # Required property for Google AppEngine 1.9.0 which otherwise causes
+        # HTTPS requests to go out as HTTP. (See Issue #356)
+        self._protocol = 'https'
+
+    def connect(self):
+        conn = self._new_conn()
+        self._prepare_conn(conn)
+
+        if self.ssl_context is None:
+            self.ssl_context = create_urllib3_context(
+                ssl_version=resolve_ssl_version(None),
+                cert_reqs=resolve_cert_reqs(None),
+            )
+
+        self.sock = ssl_wrap_socket(
+            sock=conn,
+            keyfile=self.key_file,
+            certfile=self.cert_file,
+            ssl_context=self.ssl_context,
+        )
+
+
+class VerifiedHTTPSConnection(HTTPSConnection):
+    """
+    Based on httplib.HTTPSConnection but wraps the socket with
+    SSL certification.
+    """
+    cert_reqs = None
+    ca_certs = None
+    ca_cert_dir = None
+    ssl_version = None
+    assert_fingerprint = None
+
+    def set_cert(self, key_file=None, cert_file=None,
+                 cert_reqs=None, ca_certs=None,
+                 assert_hostname=None, assert_fingerprint=None,
+                 ca_cert_dir=None):
+        """
+        This method should only be called once, before the connection is used.
+        """
+        # If cert_reqs is not provided, we can try to guess. If the user gave
+        # us a cert database, we assume they want to use it: otherwise, if
+        # they gave us an SSL Context object we should use whatever is set for
+        # it.
+        if cert_reqs is None:
+            if ca_certs or ca_cert_dir:
+                cert_reqs = 'CERT_REQUIRED'
+            elif self.ssl_context is not None:
+                cert_reqs = self.ssl_context.verify_mode
+
+        self.key_file = key_file
+        self.cert_file = cert_file
+        self.cert_reqs = cert_reqs
+        self.assert_hostname = assert_hostname
+        self.assert_fingerprint = assert_fingerprint
+        self.ca_certs = ca_certs and os.path.expanduser(ca_certs)
+        self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir)
+
+    def connect(self):
+        # Add certificate verification
+        conn = self._new_conn()
+
+        hostname = self.host
+        if getattr(self, '_tunnel_host', None):
+            # _tunnel_host was added in Python 2.6.3
+            # (See: http://hg.python.org/cpython/rev/0f57b30a152f)
+
+            self.sock = conn
+            # Calls self._set_hostport(), so self.host is
+            # self._tunnel_host below.
+            self._tunnel()
+            # Mark this connection as not reusable
+            self.auto_open = 0
+
+            # Override the host with the one we're requesting data from.
+            hostname = self._tunnel_host
+
+        is_time_off = datetime.date.today() < RECENT_DATE
+        if is_time_off:
+            warnings.warn((
+                'System time is way off (before {0}). This will probably '
+                'lead to SSL verification errors').format(RECENT_DATE),
+                SystemTimeWarning
+            )
+
+        # Wrap socket using verification with the root certs in
+        # trusted_root_certs
+        if self.ssl_context is None:
+            self.ssl_context = create_urllib3_context(
+                ssl_version=resolve_ssl_version(self.ssl_version),
+                cert_reqs=resolve_cert_reqs(self.cert_reqs),
+            )
+
+        context = self.ssl_context
+        context.verify_mode = resolve_cert_reqs(self.cert_reqs)
+        self.sock = ssl_wrap_socket(
+            sock=conn,
+            keyfile=self.key_file,
+            certfile=self.cert_file,
+            ca_certs=self.ca_certs,
+            ca_cert_dir=self.ca_cert_dir,
+            server_hostname=hostname,
+            ssl_context=context)
+
+        if self.assert_fingerprint:
+            assert_fingerprint(self.sock.getpeercert(binary_form=True),
+                               self.assert_fingerprint)
+        elif context.verify_mode != ssl.CERT_NONE \
+                and not getattr(context, 'check_hostname', False) \
+                and self.assert_hostname is not False:
+            # While urllib3 attempts to always turn off hostname matching from
+            # the TLS library, this cannot always be done. So we check whether
+            # the TLS Library still thinks it's matching hostnames.
+            cert = self.sock.getpeercert()
+            if not cert.get('subjectAltName', ()):
+                warnings.warn((
+                    'Certificate for {0} has no `subjectAltName`, falling back to check for a '
+                    '`commonName` for now. This feature is being removed by major browsers and '
+                    'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 '
+                    'for details.)'.format(hostname)),
+                    SubjectAltNameWarning
+                )
+            _match_hostname(cert, self.assert_hostname or hostname)
+
+        self.is_verified = (
+            context.verify_mode == ssl.CERT_REQUIRED or
+            self.assert_fingerprint is not None
+        )
+
+
+def _match_hostname(cert, asserted_hostname):
+    try:
+        match_hostname(cert, asserted_hostname)
+    except CertificateError as e:
+        log.error(
+            'Certificate did not match expected hostname: %s. '
+            'Certificate: %s', asserted_hostname, cert
+        )
+        # Add cert to exception and reraise so client code can inspect
+        # the cert when catching the exception, if they want to
+        e._peer_cert = cert
+        raise
+
+
+if ssl:
+    # Make a copy for testing.
+    UnverifiedHTTPSConnection = HTTPSConnection
+    HTTPSConnection = VerifiedHTTPSConnection
+else:
+    HTTPSConnection = DummyConnection
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/connectionpool.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/connectionpool.py
new file mode 100644
index 0000000000000000000000000000000000000000..ec9600f8fa35a55b734db78058497ac570ec8be6
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/connectionpool.py
@@ -0,0 +1,905 @@
+from __future__ import absolute_import
+import errno
+import logging
+import sys
+import warnings
+
+from socket import error as SocketError, timeout as SocketTimeout
+import socket
+
+
+from .exceptions import (
+    ClosedPoolError,
+    ProtocolError,
+    EmptyPoolError,
+    HeaderParsingError,
+    HostChangedError,
+    LocationValueError,
+    MaxRetryError,
+    ProxyError,
+    ReadTimeoutError,
+    SSLError,
+    TimeoutError,
+    InsecureRequestWarning,
+    NewConnectionError,
+)
+from .packages.ssl_match_hostname import CertificateError
+from .packages import six
+from .packages.six.moves import queue
+from .connection import (
+    port_by_scheme,
+    DummyConnection,
+    HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection,
+    HTTPException, BaseSSLError,
+)
+from .request import RequestMethods
+from .response import HTTPResponse
+
+from .util.connection import is_connection_dropped
+from .util.request import set_file_position
+from .util.response import assert_header_parsing
+from .util.retry import Retry
+from .util.timeout import Timeout
+from .util.url import get_host, Url
+
+
+if six.PY2:
+    # Queue is imported for side effects on MS Windows
+    import Queue as _unused_module_Queue  # noqa: F401
+
+xrange = six.moves.xrange
+
+log = logging.getLogger(__name__)
+
+_Default = object()
+
+
+# Pool objects
+class ConnectionPool(object):
+    """
+    Base class for all connection pools, such as
+    :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`.
+    """
+
+    scheme = None
+    QueueCls = queue.LifoQueue
+
+    def __init__(self, host, port=None):
+        if not host:
+            raise LocationValueError("No host specified.")
+
+        self.host = _ipv6_host(host).lower()
+        self._proxy_host = host.lower()
+        self.port = port
+
+    def __str__(self):
+        return '%s(host=%r, port=%r)' % (type(self).__name__,
+                                         self.host, self.port)
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        self.close()
+        # Return False to re-raise any potential exceptions
+        return False
+
+    def close(self):
+        """
+        Close all pooled connections and disable the pool.
+        """
+        pass
+
+
+# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252
+_blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK])
+
+
+class HTTPConnectionPool(ConnectionPool, RequestMethods):
+    """
+    Thread-safe connection pool for one host.
+
+    :param host:
+        Host used for this HTTP Connection (e.g. "localhost"), passed into
+        :class:`httplib.HTTPConnection`.
+
+    :param port:
+        Port used for this HTTP Connection (None is equivalent to 80), passed
+        into :class:`httplib.HTTPConnection`.
+
+    :param strict:
+        Causes BadStatusLine to be raised if the status line can't be parsed
+        as a valid HTTP/1.0 or 1.1 status line, passed into
+        :class:`httplib.HTTPConnection`.
+
+        .. note::
+           Only works in Python 2. This parameter is ignored in Python 3.
+
+    :param timeout:
+        Socket timeout in seconds for each individual connection. This can
+        be a float or integer, which sets the timeout for the HTTP request,
+        or an instance of :class:`urllib3.util.Timeout` which gives you more
+        fine-grained control over request timeouts. After the constructor has
+        been parsed, this is always a `urllib3.util.Timeout` object.
+
+    :param maxsize:
+        Number of connections to save that can be reused. More than 1 is useful
+        in multithreaded situations. If ``block`` is set to False, more
+        connections will be created but they will not be saved once they've
+        been used.
+
+    :param block:
+        If set to True, no more than ``maxsize`` connections will be used at
+        a time. When no free connections are available, the call will block
+        until a connection has been released. This is a useful side effect for
+        particular multithreaded situations where one does not want to use more
+        than maxsize connections per host to prevent flooding.
+
+    :param headers:
+        Headers to include with all requests, unless other headers are given
+        explicitly.
+
+    :param retries:
+        Retry configuration to use by default with requests in this pool.
+
+    :param _proxy:
+        Parsed proxy URL, should not be used directly, instead, see
+        :class:`urllib3.connectionpool.ProxyManager`"
+
+    :param _proxy_headers:
+        A dictionary with proxy headers, should not be used directly,
+        instead, see :class:`urllib3.connectionpool.ProxyManager`"
+
+    :param \\**conn_kw:
+        Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`,
+        :class:`urllib3.connection.HTTPSConnection` instances.
+    """
+
+    scheme = 'http'
+    ConnectionCls = HTTPConnection
+    ResponseCls = HTTPResponse
+
+    def __init__(self, host, port=None, strict=False,
+                 timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False,
+                 headers=None, retries=None,
+                 _proxy=None, _proxy_headers=None,
+                 **conn_kw):
+        ConnectionPool.__init__(self, host, port)
+        RequestMethods.__init__(self, headers)
+
+        self.strict = strict
+
+        if not isinstance(timeout, Timeout):
+            timeout = Timeout.from_float(timeout)
+
+        if retries is None:
+            retries = Retry.DEFAULT
+
+        self.timeout = timeout
+        self.retries = retries
+
+        self.pool = self.QueueCls(maxsize)
+        self.block = block
+
+        self.proxy = _proxy
+        self.proxy_headers = _proxy_headers or {}
+
+        # Fill the queue up so that doing get() on it will block properly
+        for _ in xrange(maxsize):
+            self.pool.put(None)
+
+        # These are mostly for testing and debugging purposes.
+        self.num_connections = 0
+        self.num_requests = 0
+        self.conn_kw = conn_kw
+
+        if self.proxy:
+            # Enable Nagle's algorithm for proxies, to avoid packet fragmentation.
+            # We cannot know if the user has added default socket options, so we cannot replace the
+            # list.
+            self.conn_kw.setdefault('socket_options', [])
+
+    def _new_conn(self):
+        """
+        Return a fresh :class:`HTTPConnection`.
+        """
+        self.num_connections += 1
+        log.debug("Starting new HTTP connection (%d): %s",
+                  self.num_connections, self.host)
+
+        conn = self.ConnectionCls(host=self.host, port=self.port,
+                                  timeout=self.timeout.connect_timeout,
+                                  strict=self.strict, **self.conn_kw)
+        return conn
+
+    def _get_conn(self, timeout=None):
+        """
+        Get a connection. Will return a pooled connection if one is available.
+
+        If no connections are available and :prop:`.block` is ``False``, then a
+        fresh connection is returned.
+
+        :param timeout:
+            Seconds to wait before giving up and raising
+            :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and
+            :prop:`.block` is ``True``.
+        """
+        conn = None
+        try:
+            conn = self.pool.get(block=self.block, timeout=timeout)
+
+        except AttributeError:  # self.pool is None
+            raise ClosedPoolError(self, "Pool is closed.")
+
+        except queue.Empty:
+            if self.block:
+                raise EmptyPoolError(self,
+                                     "Pool reached maximum size and no more "
+                                     "connections are allowed.")
+            pass  # Oh well, we'll create a new connection then
+
+        # If this is a persistent connection, check if it got disconnected
+        if conn and is_connection_dropped(conn):
+            log.debug("Resetting dropped connection: %s", self.host)
+            conn.close()
+            if getattr(conn, 'auto_open', 1) == 0:
+                # This is a proxied connection that has been mutated by
+                # httplib._tunnel() and cannot be reused (since it would
+                # attempt to bypass the proxy)
+                conn = None
+
+        return conn or self._new_conn()
+
+    def _put_conn(self, conn):
+        """
+        Put a connection back into the pool.
+
+        :param conn:
+            Connection object for the current host and port as returned by
+            :meth:`._new_conn` or :meth:`._get_conn`.
+
+        If the pool is already full, the connection is closed and discarded
+        because we exceeded maxsize. If connections are discarded frequently,
+        then maxsize should be increased.
+
+        If the pool is closed, then the connection will be closed and discarded.
+        """
+        try:
+            self.pool.put(conn, block=False)
+            return  # Everything is dandy, done.
+        except AttributeError:
+            # self.pool is None.
+            pass
+        except queue.Full:
+            # This should never happen if self.block == True
+            log.warning(
+                "Connection pool is full, discarding connection: %s",
+                self.host)
+
+        # Connection never got put back into the pool, close it.
+        if conn:
+            conn.close()
+
+    def _validate_conn(self, conn):
+        """
+        Called right before a request is made, after the socket is created.
+        """
+        pass
+
+    def _prepare_proxy(self, conn):
+        # Nothing to do for HTTP connections.
+        pass
+
+    def _get_timeout(self, timeout):
+        """ Helper that always returns a :class:`urllib3.util.Timeout` """
+        if timeout is _Default:
+            return self.timeout.clone()
+
+        if isinstance(timeout, Timeout):
+            return timeout.clone()
+        else:
+            # User passed us an int/float. This is for backwards compatibility,
+            # can be removed later
+            return Timeout.from_float(timeout)
+
+    def _raise_timeout(self, err, url, timeout_value):
+        """Is the error actually a timeout? Will raise a ReadTimeout or pass"""
+
+        if isinstance(err, SocketTimeout):
+            raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
+
+        # See the above comment about EAGAIN in Python 3. In Python 2 we have
+        # to specifically catch it and throw the timeout error
+        if hasattr(err, 'errno') and err.errno in _blocking_errnos:
+            raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
+
+        # Catch possible read timeouts thrown as SSL errors. If not the
+        # case, rethrow the original. We need to do this because of:
+        # http://bugs.python.org/issue10272
+        if 'timed out' in str(err) or 'did not complete (read)' in str(err):  # Python 2.6
+            raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
+
+    def _make_request(self, conn, method, url, timeout=_Default, chunked=False,
+                      **httplib_request_kw):
+        """
+        Perform a request on a given urllib connection object taken from our
+        pool.
+
+        :param conn:
+            a connection from one of our connection pools
+
+        :param timeout:
+            Socket timeout in seconds for the request. This can be a
+            float or integer, which will set the same timeout value for
+            the socket connect and the socket read, or an instance of
+            :class:`urllib3.util.Timeout`, which gives you more fine-grained
+            control over your timeouts.
+        """
+        self.num_requests += 1
+
+        timeout_obj = self._get_timeout(timeout)
+        timeout_obj.start_connect()
+        conn.timeout = timeout_obj.connect_timeout
+
+        # Trigger any extra validation we need to do.
+        try:
+            self._validate_conn(conn)
+        except (SocketTimeout, BaseSSLError) as e:
+            # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout.
+            self._raise_timeout(err=e, url=url, timeout_value=conn.timeout)
+            raise
+
+        # conn.request() calls httplib.*.request, not the method in
+        # urllib3.request. It also calls makefile (recv) on the socket.
+        if chunked:
+            conn.request_chunked(method, url, **httplib_request_kw)
+        else:
+            conn.request(method, url, **httplib_request_kw)
+
+        # Reset the timeout for the recv() on the socket
+        read_timeout = timeout_obj.read_timeout
+
+        # App Engine doesn't have a sock attr
+        if getattr(conn, 'sock', None):
+            # In Python 3 socket.py will catch EAGAIN and return None when you
+            # try and read into the file pointer created by http.client, which
+            # instead raises a BadStatusLine exception. Instead of catching
+            # the exception and assuming all BadStatusLine exceptions are read
+            # timeouts, check for a zero timeout before making the request.
+            if read_timeout == 0:
+                raise ReadTimeoutError(
+                    self, url, "Read timed out. (read timeout=%s)" % read_timeout)
+            if read_timeout is Timeout.DEFAULT_TIMEOUT:
+                conn.sock.settimeout(socket.getdefaulttimeout())
+            else:  # None or a value
+                conn.sock.settimeout(read_timeout)
+
+        # Receive the response from the server
+        try:
+            try:  # Python 2.7, use buffering of HTTP responses
+                httplib_response = conn.getresponse(buffering=True)
+            except TypeError:  # Python 2.6 and older, Python 3
+                try:
+                    httplib_response = conn.getresponse()
+                except Exception as e:
+                    # Remove the TypeError from the exception chain in Python 3;
+                    # otherwise it looks like a programming error was the cause.
+                    six.raise_from(e, None)
+        except (SocketTimeout, BaseSSLError, SocketError) as e:
+            self._raise_timeout(err=e, url=url, timeout_value=read_timeout)
+            raise
+
+        # AppEngine doesn't have a version attr.
+        http_version = getattr(conn, '_http_vsn_str', 'HTTP/?')
+        log.debug("%s://%s:%s \"%s %s %s\" %s %s", self.scheme, self.host, self.port,
+                  method, url, http_version, httplib_response.status,
+                  httplib_response.length)
+
+        try:
+            assert_header_parsing(httplib_response.msg)
+        except (HeaderParsingError, TypeError) as hpe:  # Platform-specific: Python 3
+            log.warning(
+                'Failed to parse headers (url=%s): %s',
+                self._absolute_url(url), hpe, exc_info=True)
+
+        return httplib_response
+
+    def _absolute_url(self, path):
+        return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url
+
+    def close(self):
+        """
+        Close all pooled connections and disable the pool.
+        """
+        # Disable access to the pool
+        old_pool, self.pool = self.pool, None
+
+        try:
+            while True:
+                conn = old_pool.get(block=False)
+                if conn:
+                    conn.close()
+
+        except queue.Empty:
+            pass  # Done.
+
+    def is_same_host(self, url):
+        """
+        Check if the given ``url`` is a member of the same host as this
+        connection pool.
+        """
+        if url.startswith('/'):
+            return True
+
+        # TODO: Add optional support for socket.gethostbyname checking.
+        scheme, host, port = get_host(url)
+
+        host = _ipv6_host(host).lower()
+
+        # Use explicit default port for comparison when none is given
+        if self.port and not port:
+            port = port_by_scheme.get(scheme)
+        elif not self.port and port == port_by_scheme.get(scheme):
+            port = None
+
+        return (scheme, host, port) == (self.scheme, self.host, self.port)
+
+    def urlopen(self, method, url, body=None, headers=None, retries=None,
+                redirect=True, assert_same_host=True, timeout=_Default,
+                pool_timeout=None, release_conn=None, chunked=False,
+                body_pos=None, **response_kw):
+        """
+        Get a connection from the pool and perform an HTTP request. This is the
+        lowest level call for making a request, so you'll need to specify all
+        the raw details.
+
+        .. note::
+
+           More commonly, it's appropriate to use a convenience method provided
+           by :class:`.RequestMethods`, such as :meth:`request`.
+
+        .. note::
+
+           `release_conn` will only behave as expected if
+           `preload_content=False` because we want to make
+           `preload_content=False` the default behaviour someday soon without
+           breaking backwards compatibility.
+
+        :param method:
+            HTTP request method (such as GET, POST, PUT, etc.)
+
+        :param body:
+            Data to send in the request body (useful for creating
+            POST requests, see HTTPConnectionPool.post_url for
+            more convenience).
+
+        :param headers:
+            Dictionary of custom headers to send, such as User-Agent,
+            If-None-Match, etc. If None, pool headers are used. If provided,
+            these headers completely replace any pool-specific headers.
+
+        :param retries:
+            Configure the number of retries to allow before raising a
+            :class:`~urllib3.exceptions.MaxRetryError` exception.
+
+            Pass ``None`` to retry until you receive a response. Pass a
+            :class:`~urllib3.util.retry.Retry` object for fine-grained control
+            over different types of retries.
+            Pass an integer number to retry connection errors that many times,
+            but no other types of errors. Pass zero to never retry.
+
+            If ``False``, then retries are disabled and any exception is raised
+            immediately. Also, instead of raising a MaxRetryError on redirects,
+            the redirect response will be returned.
+
+        :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
+
+        :param redirect:
+            If True, automatically handle redirects (status codes 301, 302,
+            303, 307, 308). Each redirect counts as a retry. Disabling retries
+            will disable redirect, too.
+
+        :param assert_same_host:
+            If ``True``, will make sure that the host of the pool requests is
+            consistent else will raise HostChangedError. When False, you can
+            use the pool on an HTTP proxy and request foreign hosts.
+
+        :param timeout:
+            If specified, overrides the default timeout for this one
+            request. It may be a float (in seconds) or an instance of
+            :class:`urllib3.util.Timeout`.
+
+        :param pool_timeout:
+            If set and the pool is set to block=True, then this method will
+            block for ``pool_timeout`` seconds and raise EmptyPoolError if no
+            connection is available within the time period.
+
+        :param release_conn:
+            If False, then the urlopen call will not release the connection
+            back into the pool once a response is received (but will release if
+            you read the entire contents of the response such as when
+            `preload_content=True`). This is useful if you're not preloading
+            the response's content immediately. You will need to call
+            ``r.release_conn()`` on the response ``r`` to return the connection
+            back into the pool. If None, it takes the value of
+            ``response_kw.get('preload_content', True)``.
+
+        :param chunked:
+            If True, urllib3 will send the body using chunked transfer
+            encoding. Otherwise, urllib3 will send the body using the standard
+            content-length form. Defaults to False.
+
+        :param int body_pos:
+            Position to seek to in file-like body in the event of a retry or
+            redirect. Typically this won't need to be set because urllib3 will
+            auto-populate the value when needed.
+
+        :param \\**response_kw:
+            Additional parameters are passed to
+            :meth:`urllib3.response.HTTPResponse.from_httplib`
+        """
+        if headers is None:
+            headers = self.headers
+
+        if not isinstance(retries, Retry):
+            retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
+
+        if release_conn is None:
+            release_conn = response_kw.get('preload_content', True)
+
+        # Check host
+        if assert_same_host and not self.is_same_host(url):
+            raise HostChangedError(self, url, retries)
+
+        conn = None
+
+        # Track whether `conn` needs to be released before
+        # returning/raising/recursing. Update this variable if necessary, and
+        # leave `release_conn` constant throughout the function. That way, if
+        # the function recurses, the original value of `release_conn` will be
+        # passed down into the recursive call, and its value will be respected.
+        #
+        # See issue #651 [1] for details.
+        #
+        # [1] <https://github.com/shazow/urllib3/issues/651>
+        release_this_conn = release_conn
+
+        # Merge the proxy headers. Only do this in HTTP. We have to copy the
+        # headers dict so we can safely change it without those changes being
+        # reflected in anyone else's copy.
+        if self.scheme == 'http':
+            headers = headers.copy()
+            headers.update(self.proxy_headers)
+
+        # Must keep the exception bound to a separate variable or else Python 3
+        # complains about UnboundLocalError.
+        err = None
+
+        # Keep track of whether we cleanly exited the except block. This
+        # ensures we do proper cleanup in finally.
+        clean_exit = False
+
+        # Rewind body position, if needed. Record current position
+        # for future rewinds in the event of a redirect/retry.
+        body_pos = set_file_position(body, body_pos)
+
+        try:
+            # Request a connection from the queue.
+            timeout_obj = self._get_timeout(timeout)
+            conn = self._get_conn(timeout=pool_timeout)
+
+            conn.timeout = timeout_obj.connect_timeout
+
+            is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None)
+            if is_new_proxy_conn:
+                self._prepare_proxy(conn)
+
+            # Make the request on the httplib connection object.
+            httplib_response = self._make_request(conn, method, url,
+                                                  timeout=timeout_obj,
+                                                  body=body, headers=headers,
+                                                  chunked=chunked)
+
+            # If we're going to release the connection in ``finally:``, then
+            # the response doesn't need to know about the connection. Otherwise
+            # it will also try to release it and we'll have a double-release
+            # mess.
+            response_conn = conn if not release_conn else None
+
+            # Pass method to Response for length checking
+            response_kw['request_method'] = method
+
+            # Import httplib's response into our own wrapper object
+            response = self.ResponseCls.from_httplib(httplib_response,
+                                                     pool=self,
+                                                     connection=response_conn,
+                                                     retries=retries,
+                                                     **response_kw)
+
+            # Everything went great!
+            clean_exit = True
+
+        except queue.Empty:
+            # Timed out by queue.
+            raise EmptyPoolError(self, "No pool connections are available.")
+
+        except (TimeoutError, HTTPException, SocketError, ProtocolError,
+                BaseSSLError, SSLError, CertificateError) as e:
+            # Discard the connection for these exceptions. It will be
+            # replaced during the next _get_conn() call.
+            clean_exit = False
+            if isinstance(e, (BaseSSLError, CertificateError)):
+                e = SSLError(e)
+            elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy:
+                e = ProxyError('Cannot connect to proxy.', e)
+            elif isinstance(e, (SocketError, HTTPException)):
+                e = ProtocolError('Connection aborted.', e)
+
+            retries = retries.increment(method, url, error=e, _pool=self,
+                                        _stacktrace=sys.exc_info()[2])
+            retries.sleep()
+
+            # Keep track of the error for the retry warning.
+            err = e
+
+        finally:
+            if not clean_exit:
+                # We hit some kind of exception, handled or otherwise. We need
+                # to throw the connection away unless explicitly told not to.
+                # Close the connection, set the variable to None, and make sure
+                # we put the None back in the pool to avoid leaking it.
+                conn = conn and conn.close()
+                release_this_conn = True
+
+            if release_this_conn:
+                # Put the connection back to be reused. If the connection is
+                # expired then it will be None, which will get replaced with a
+                # fresh connection during _get_conn.
+                self._put_conn(conn)
+
+        if not conn:
+            # Try again
+            log.warning("Retrying (%r) after connection "
+                        "broken by '%r': %s", retries, err, url)
+            return self.urlopen(method, url, body, headers, retries,
+                                redirect, assert_same_host,
+                                timeout=timeout, pool_timeout=pool_timeout,
+                                release_conn=release_conn, body_pos=body_pos,
+                                **response_kw)
+
+        def drain_and_release_conn(response):
+            try:
+                # discard any remaining response body, the connection will be
+                # released back to the pool once the entire response is read
+                response.read()
+            except (TimeoutError, HTTPException, SocketError, ProtocolError,
+                    BaseSSLError, SSLError) as e:
+                pass
+
+        # Handle redirect?
+        redirect_location = redirect and response.get_redirect_location()
+        if redirect_location:
+            if response.status == 303:
+                method = 'GET'
+
+            try:
+                retries = retries.increment(method, url, response=response, _pool=self)
+            except MaxRetryError:
+                if retries.raise_on_redirect:
+                    # Drain and release the connection for this response, since
+                    # we're not returning it to be released manually.
+                    drain_and_release_conn(response)
+                    raise
+                return response
+
+            # drain and return the connection to the pool before recursing
+            drain_and_release_conn(response)
+
+            retries.sleep_for_retry(response)
+            log.debug("Redirecting %s -> %s", url, redirect_location)
+            return self.urlopen(
+                method, redirect_location, body, headers,
+                retries=retries, redirect=redirect,
+                assert_same_host=assert_same_host,
+                timeout=timeout, pool_timeout=pool_timeout,
+                release_conn=release_conn, body_pos=body_pos,
+                **response_kw)
+
+        # Check if we should retry the HTTP response.
+        has_retry_after = bool(response.getheader('Retry-After'))
+        if retries.is_retry(method, response.status, has_retry_after):
+            try:
+                retries = retries.increment(method, url, response=response, _pool=self)
+            except MaxRetryError:
+                if retries.raise_on_status:
+                    # Drain and release the connection for this response, since
+                    # we're not returning it to be released manually.
+                    drain_and_release_conn(response)
+                    raise
+                return response
+
+            # drain and return the connection to the pool before recursing
+            drain_and_release_conn(response)
+
+            retries.sleep(response)
+            log.debug("Retry: %s", url)
+            return self.urlopen(
+                method, url, body, headers,
+                retries=retries, redirect=redirect,
+                assert_same_host=assert_same_host,
+                timeout=timeout, pool_timeout=pool_timeout,
+                release_conn=release_conn,
+                body_pos=body_pos, **response_kw)
+
+        return response
+
+
+class HTTPSConnectionPool(HTTPConnectionPool):
+    """
+    Same as :class:`.HTTPConnectionPool`, but HTTPS.
+
+    When Python is compiled with the :mod:`ssl` module, then
+    :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates,
+    instead of :class:`.HTTPSConnection`.
+
+    :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``,
+    ``assert_hostname`` and ``host`` in this order to verify connections.
+    If ``assert_hostname`` is False, no verification is done.
+
+    The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``,
+    ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is
+    available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade
+    the connection socket into an SSL socket.
+    """
+
+    scheme = 'https'
+    ConnectionCls = HTTPSConnection
+
+    def __init__(self, host, port=None,
+                 strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1,
+                 block=False, headers=None, retries=None,
+                 _proxy=None, _proxy_headers=None,
+                 key_file=None, cert_file=None, cert_reqs=None,
+                 ca_certs=None, ssl_version=None,
+                 assert_hostname=None, assert_fingerprint=None,
+                 ca_cert_dir=None, **conn_kw):
+
+        HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize,
+                                    block, headers, retries, _proxy, _proxy_headers,
+                                    **conn_kw)
+
+        if ca_certs and cert_reqs is None:
+            cert_reqs = 'CERT_REQUIRED'
+
+        self.key_file = key_file
+        self.cert_file = cert_file
+        self.cert_reqs = cert_reqs
+        self.ca_certs = ca_certs
+        self.ca_cert_dir = ca_cert_dir
+        self.ssl_version = ssl_version
+        self.assert_hostname = assert_hostname
+        self.assert_fingerprint = assert_fingerprint
+
+    def _prepare_conn(self, conn):
+        """
+        Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket`
+        and establish the tunnel if proxy is used.
+        """
+
+        if isinstance(conn, VerifiedHTTPSConnection):
+            conn.set_cert(key_file=self.key_file,
+                          cert_file=self.cert_file,
+                          cert_reqs=self.cert_reqs,
+                          ca_certs=self.ca_certs,
+                          ca_cert_dir=self.ca_cert_dir,
+                          assert_hostname=self.assert_hostname,
+                          assert_fingerprint=self.assert_fingerprint)
+            conn.ssl_version = self.ssl_version
+        return conn
+
+    def _prepare_proxy(self, conn):
+        """
+        Establish tunnel connection early, because otherwise httplib
+        would improperly set Host: header to proxy's IP:port.
+        """
+        # Python 2.7+
+        try:
+            set_tunnel = conn.set_tunnel
+        except AttributeError:  # Platform-specific: Python 2.6
+            set_tunnel = conn._set_tunnel
+
+        if sys.version_info <= (2, 6, 4) and not self.proxy_headers:  # Python 2.6.4 and older
+            set_tunnel(self._proxy_host, self.port)
+        else:
+            set_tunnel(self._proxy_host, self.port, self.proxy_headers)
+
+        conn.connect()
+
+    def _new_conn(self):
+        """
+        Return a fresh :class:`httplib.HTTPSConnection`.
+        """
+        self.num_connections += 1
+        log.debug("Starting new HTTPS connection (%d): %s",
+                  self.num_connections, self.host)
+
+        if not self.ConnectionCls or self.ConnectionCls is DummyConnection:
+            raise SSLError("Can't connect to HTTPS URL because the SSL "
+                           "module is not available.")
+
+        actual_host = self.host
+        actual_port = self.port
+        if self.proxy is not None:
+            actual_host = self.proxy.host
+            actual_port = self.proxy.port
+
+        conn = self.ConnectionCls(host=actual_host, port=actual_port,
+                                  timeout=self.timeout.connect_timeout,
+                                  strict=self.strict, **self.conn_kw)
+
+        return self._prepare_conn(conn)
+
+    def _validate_conn(self, conn):
+        """
+        Called right before a request is made, after the socket is created.
+        """
+        super(HTTPSConnectionPool, self)._validate_conn(conn)
+
+        # Force connect early to allow us to validate the connection.
+        if not getattr(conn, 'sock', None):  # AppEngine might not have  `.sock`
+            conn.connect()
+
+        if not conn.is_verified:
+            warnings.warn((
+                'Unverified HTTPS request is being made. '
+                'Adding certificate verification is strongly advised. See: '
+                'https://urllib3.readthedocs.io/en/latest/advanced-usage.html'
+                '#ssl-warnings'),
+                InsecureRequestWarning)
+
+
+def connection_from_url(url, **kw):
+    """
+    Given a url, return an :class:`.ConnectionPool` instance of its host.
+
+    This is a shortcut for not having to parse out the scheme, host, and port
+    of the url before creating an :class:`.ConnectionPool` instance.
+
+    :param url:
+        Absolute URL string that must include the scheme. Port is optional.
+
+    :param \\**kw:
+        Passes additional parameters to the constructor of the appropriate
+        :class:`.ConnectionPool`. Useful for specifying things like
+        timeout, maxsize, headers, etc.
+
+    Example::
+
+        >>> conn = connection_from_url('http://google.com/')
+        >>> r = conn.request('GET', '/')
+    """
+    scheme, host, port = get_host(url)
+    port = port or port_by_scheme.get(scheme, 80)
+    if scheme == 'https':
+        return HTTPSConnectionPool(host, port=port, **kw)
+    else:
+        return HTTPConnectionPool(host, port=port, **kw)
+
+
+def _ipv6_host(host):
+    """
+    Process IPv6 address literals
+    """
+
+    # httplib doesn't like it when we include brackets in IPv6 addresses
+    # Specifically, if we include brackets but also pass the port then
+    # httplib crazily doubles up the square brackets on the Host header.
+    # Instead, we need to make sure we never pass ``None`` as the port.
+    # However, for backward compatibility reasons we can't actually
+    # *assert* that.  See http://bugs.python.org/issue28539
+    #
+    # Also if an IPv6 address literal has a zone identifier, the
+    # percent sign might be URIencoded, convert it back into ASCII
+    if host.startswith('[') and host.endswith(']'):
+        host = host.replace('%25', '%').strip('[]')
+    return host
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/__init__.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/_securetransport/__init__.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/_securetransport/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/_securetransport/bindings.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/_securetransport/bindings.py
new file mode 100644
index 0000000000000000000000000000000000000000..bcf41c02b2a3570002f0bb48c610109bba248ab8
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/_securetransport/bindings.py
@@ -0,0 +1,593 @@
+"""
+This module uses ctypes to bind a whole bunch of functions and constants from
+SecureTransport. The goal here is to provide the low-level API to
+SecureTransport. These are essentially the C-level functions and constants, and
+they're pretty gross to work with.
+
+This code is a bastardised version of the code found in Will Bond's oscrypto
+library. An enormous debt is owed to him for blazing this trail for us. For
+that reason, this code should be considered to be covered both by urllib3's
+license and by oscrypto's:
+
+    Copyright (c) 2015-2016 Will Bond <will@wbond.net>
+
+    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.
+"""
+from __future__ import absolute_import
+
+import platform
+from ctypes.util import find_library
+from ctypes import (
+    c_void_p, c_int32, c_char_p, c_size_t, c_byte, c_uint32, c_ulong, c_long,
+    c_bool
+)
+from ctypes import CDLL, POINTER, CFUNCTYPE
+
+
+security_path = find_library('Security')
+if not security_path:
+    raise ImportError('The library Security could not be found')
+
+
+core_foundation_path = find_library('CoreFoundation')
+if not core_foundation_path:
+    raise ImportError('The library CoreFoundation could not be found')
+
+
+version = platform.mac_ver()[0]
+version_info = tuple(map(int, version.split('.')))
+if version_info < (10, 8):
+    raise OSError(
+        'Only OS X 10.8 and newer are supported, not %s.%s' % (
+            version_info[0], version_info[1]
+        )
+    )
+
+Security = CDLL(security_path, use_errno=True)
+CoreFoundation = CDLL(core_foundation_path, use_errno=True)
+
+Boolean = c_bool
+CFIndex = c_long
+CFStringEncoding = c_uint32
+CFData = c_void_p
+CFString = c_void_p
+CFArray = c_void_p
+CFMutableArray = c_void_p
+CFDictionary = c_void_p
+CFError = c_void_p
+CFType = c_void_p
+CFTypeID = c_ulong
+
+CFTypeRef = POINTER(CFType)
+CFAllocatorRef = c_void_p
+
+OSStatus = c_int32
+
+CFDataRef = POINTER(CFData)
+CFStringRef = POINTER(CFString)
+CFArrayRef = POINTER(CFArray)
+CFMutableArrayRef = POINTER(CFMutableArray)
+CFDictionaryRef = POINTER(CFDictionary)
+CFArrayCallBacks = c_void_p
+CFDictionaryKeyCallBacks = c_void_p
+CFDictionaryValueCallBacks = c_void_p
+
+SecCertificateRef = POINTER(c_void_p)
+SecExternalFormat = c_uint32
+SecExternalItemType = c_uint32
+SecIdentityRef = POINTER(c_void_p)
+SecItemImportExportFlags = c_uint32
+SecItemImportExportKeyParameters = c_void_p
+SecKeychainRef = POINTER(c_void_p)
+SSLProtocol = c_uint32
+SSLCipherSuite = c_uint32
+SSLContextRef = POINTER(c_void_p)
+SecTrustRef = POINTER(c_void_p)
+SSLConnectionRef = c_uint32
+SecTrustResultType = c_uint32
+SecTrustOptionFlags = c_uint32
+SSLProtocolSide = c_uint32
+SSLConnectionType = c_uint32
+SSLSessionOption = c_uint32
+
+
+try:
+    Security.SecItemImport.argtypes = [
+        CFDataRef,
+        CFStringRef,
+        POINTER(SecExternalFormat),
+        POINTER(SecExternalItemType),
+        SecItemImportExportFlags,
+        POINTER(SecItemImportExportKeyParameters),
+        SecKeychainRef,
+        POINTER(CFArrayRef),
+    ]
+    Security.SecItemImport.restype = OSStatus
+
+    Security.SecCertificateGetTypeID.argtypes = []
+    Security.SecCertificateGetTypeID.restype = CFTypeID
+
+    Security.SecIdentityGetTypeID.argtypes = []
+    Security.SecIdentityGetTypeID.restype = CFTypeID
+
+    Security.SecKeyGetTypeID.argtypes = []
+    Security.SecKeyGetTypeID.restype = CFTypeID
+
+    Security.SecCertificateCreateWithData.argtypes = [
+        CFAllocatorRef,
+        CFDataRef
+    ]
+    Security.SecCertificateCreateWithData.restype = SecCertificateRef
+
+    Security.SecCertificateCopyData.argtypes = [
+        SecCertificateRef
+    ]
+    Security.SecCertificateCopyData.restype = CFDataRef
+
+    Security.SecCopyErrorMessageString.argtypes = [
+        OSStatus,
+        c_void_p
+    ]
+    Security.SecCopyErrorMessageString.restype = CFStringRef
+
+    Security.SecIdentityCreateWithCertificate.argtypes = [
+        CFTypeRef,
+        SecCertificateRef,
+        POINTER(SecIdentityRef)
+    ]
+    Security.SecIdentityCreateWithCertificate.restype = OSStatus
+
+    Security.SecKeychainCreate.argtypes = [
+        c_char_p,
+        c_uint32,
+        c_void_p,
+        Boolean,
+        c_void_p,
+        POINTER(SecKeychainRef)
+    ]
+    Security.SecKeychainCreate.restype = OSStatus
+
+    Security.SecKeychainDelete.argtypes = [
+        SecKeychainRef
+    ]
+    Security.SecKeychainDelete.restype = OSStatus
+
+    Security.SecPKCS12Import.argtypes = [
+        CFDataRef,
+        CFDictionaryRef,
+        POINTER(CFArrayRef)
+    ]
+    Security.SecPKCS12Import.restype = OSStatus
+
+    SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t))
+    SSLWriteFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t))
+
+    Security.SSLSetIOFuncs.argtypes = [
+        SSLContextRef,
+        SSLReadFunc,
+        SSLWriteFunc
+    ]
+    Security.SSLSetIOFuncs.restype = OSStatus
+
+    Security.SSLSetPeerID.argtypes = [
+        SSLContextRef,
+        c_char_p,
+        c_size_t
+    ]
+    Security.SSLSetPeerID.restype = OSStatus
+
+    Security.SSLSetCertificate.argtypes = [
+        SSLContextRef,
+        CFArrayRef
+    ]
+    Security.SSLSetCertificate.restype = OSStatus
+
+    Security.SSLSetCertificateAuthorities.argtypes = [
+        SSLContextRef,
+        CFTypeRef,
+        Boolean
+    ]
+    Security.SSLSetCertificateAuthorities.restype = OSStatus
+
+    Security.SSLSetConnection.argtypes = [
+        SSLContextRef,
+        SSLConnectionRef
+    ]
+    Security.SSLSetConnection.restype = OSStatus
+
+    Security.SSLSetPeerDomainName.argtypes = [
+        SSLContextRef,
+        c_char_p,
+        c_size_t
+    ]
+    Security.SSLSetPeerDomainName.restype = OSStatus
+
+    Security.SSLHandshake.argtypes = [
+        SSLContextRef
+    ]
+    Security.SSLHandshake.restype = OSStatus
+
+    Security.SSLRead.argtypes = [
+        SSLContextRef,
+        c_char_p,
+        c_size_t,
+        POINTER(c_size_t)
+    ]
+    Security.SSLRead.restype = OSStatus
+
+    Security.SSLWrite.argtypes = [
+        SSLContextRef,
+        c_char_p,
+        c_size_t,
+        POINTER(c_size_t)
+    ]
+    Security.SSLWrite.restype = OSStatus
+
+    Security.SSLClose.argtypes = [
+        SSLContextRef
+    ]
+    Security.SSLClose.restype = OSStatus
+
+    Security.SSLGetNumberSupportedCiphers.argtypes = [
+        SSLContextRef,
+        POINTER(c_size_t)
+    ]
+    Security.SSLGetNumberSupportedCiphers.restype = OSStatus
+
+    Security.SSLGetSupportedCiphers.argtypes = [
+        SSLContextRef,
+        POINTER(SSLCipherSuite),
+        POINTER(c_size_t)
+    ]
+    Security.SSLGetSupportedCiphers.restype = OSStatus
+
+    Security.SSLSetEnabledCiphers.argtypes = [
+        SSLContextRef,
+        POINTER(SSLCipherSuite),
+        c_size_t
+    ]
+    Security.SSLSetEnabledCiphers.restype = OSStatus
+
+    Security.SSLGetNumberEnabledCiphers.argtype = [
+        SSLContextRef,
+        POINTER(c_size_t)
+    ]
+    Security.SSLGetNumberEnabledCiphers.restype = OSStatus
+
+    Security.SSLGetEnabledCiphers.argtypes = [
+        SSLContextRef,
+        POINTER(SSLCipherSuite),
+        POINTER(c_size_t)
+    ]
+    Security.SSLGetEnabledCiphers.restype = OSStatus
+
+    Security.SSLGetNegotiatedCipher.argtypes = [
+        SSLContextRef,
+        POINTER(SSLCipherSuite)
+    ]
+    Security.SSLGetNegotiatedCipher.restype = OSStatus
+
+    Security.SSLGetNegotiatedProtocolVersion.argtypes = [
+        SSLContextRef,
+        POINTER(SSLProtocol)
+    ]
+    Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus
+
+    Security.SSLCopyPeerTrust.argtypes = [
+        SSLContextRef,
+        POINTER(SecTrustRef)
+    ]
+    Security.SSLCopyPeerTrust.restype = OSStatus
+
+    Security.SecTrustSetAnchorCertificates.argtypes = [
+        SecTrustRef,
+        CFArrayRef
+    ]
+    Security.SecTrustSetAnchorCertificates.restype = OSStatus
+
+    Security.SecTrustSetAnchorCertificatesOnly.argstypes = [
+        SecTrustRef,
+        Boolean
+    ]
+    Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus
+
+    Security.SecTrustEvaluate.argtypes = [
+        SecTrustRef,
+        POINTER(SecTrustResultType)
+    ]
+    Security.SecTrustEvaluate.restype = OSStatus
+
+    Security.SecTrustGetCertificateCount.argtypes = [
+        SecTrustRef
+    ]
+    Security.SecTrustGetCertificateCount.restype = CFIndex
+
+    Security.SecTrustGetCertificateAtIndex.argtypes = [
+        SecTrustRef,
+        CFIndex
+    ]
+    Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef
+
+    Security.SSLCreateContext.argtypes = [
+        CFAllocatorRef,
+        SSLProtocolSide,
+        SSLConnectionType
+    ]
+    Security.SSLCreateContext.restype = SSLContextRef
+
+    Security.SSLSetSessionOption.argtypes = [
+        SSLContextRef,
+        SSLSessionOption,
+        Boolean
+    ]
+    Security.SSLSetSessionOption.restype = OSStatus
+
+    Security.SSLSetProtocolVersionMin.argtypes = [
+        SSLContextRef,
+        SSLProtocol
+    ]
+    Security.SSLSetProtocolVersionMin.restype = OSStatus
+
+    Security.SSLSetProtocolVersionMax.argtypes = [
+        SSLContextRef,
+        SSLProtocol
+    ]
+    Security.SSLSetProtocolVersionMax.restype = OSStatus
+
+    Security.SecCopyErrorMessageString.argtypes = [
+        OSStatus,
+        c_void_p
+    ]
+    Security.SecCopyErrorMessageString.restype = CFStringRef
+
+    Security.SSLReadFunc = SSLReadFunc
+    Security.SSLWriteFunc = SSLWriteFunc
+    Security.SSLContextRef = SSLContextRef
+    Security.SSLProtocol = SSLProtocol
+    Security.SSLCipherSuite = SSLCipherSuite
+    Security.SecIdentityRef = SecIdentityRef
+    Security.SecKeychainRef = SecKeychainRef
+    Security.SecTrustRef = SecTrustRef
+    Security.SecTrustResultType = SecTrustResultType
+    Security.SecExternalFormat = SecExternalFormat
+    Security.OSStatus = OSStatus
+
+    Security.kSecImportExportPassphrase = CFStringRef.in_dll(
+        Security, 'kSecImportExportPassphrase'
+    )
+    Security.kSecImportItemIdentity = CFStringRef.in_dll(
+        Security, 'kSecImportItemIdentity'
+    )
+
+    # CoreFoundation time!
+    CoreFoundation.CFRetain.argtypes = [
+        CFTypeRef
+    ]
+    CoreFoundation.CFRetain.restype = CFTypeRef
+
+    CoreFoundation.CFRelease.argtypes = [
+        CFTypeRef
+    ]
+    CoreFoundation.CFRelease.restype = None
+
+    CoreFoundation.CFGetTypeID.argtypes = [
+        CFTypeRef
+    ]
+    CoreFoundation.CFGetTypeID.restype = CFTypeID
+
+    CoreFoundation.CFStringCreateWithCString.argtypes = [
+        CFAllocatorRef,
+        c_char_p,
+        CFStringEncoding
+    ]
+    CoreFoundation.CFStringCreateWithCString.restype = CFStringRef
+
+    CoreFoundation.CFStringGetCStringPtr.argtypes = [
+        CFStringRef,
+        CFStringEncoding
+    ]
+    CoreFoundation.CFStringGetCStringPtr.restype = c_char_p
+
+    CoreFoundation.CFStringGetCString.argtypes = [
+        CFStringRef,
+        c_char_p,
+        CFIndex,
+        CFStringEncoding
+    ]
+    CoreFoundation.CFStringGetCString.restype = c_bool
+
+    CoreFoundation.CFDataCreate.argtypes = [
+        CFAllocatorRef,
+        c_char_p,
+        CFIndex
+    ]
+    CoreFoundation.CFDataCreate.restype = CFDataRef
+
+    CoreFoundation.CFDataGetLength.argtypes = [
+        CFDataRef
+    ]
+    CoreFoundation.CFDataGetLength.restype = CFIndex
+
+    CoreFoundation.CFDataGetBytePtr.argtypes = [
+        CFDataRef
+    ]
+    CoreFoundation.CFDataGetBytePtr.restype = c_void_p
+
+    CoreFoundation.CFDictionaryCreate.argtypes = [
+        CFAllocatorRef,
+        POINTER(CFTypeRef),
+        POINTER(CFTypeRef),
+        CFIndex,
+        CFDictionaryKeyCallBacks,
+        CFDictionaryValueCallBacks
+    ]
+    CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef
+
+    CoreFoundation.CFDictionaryGetValue.argtypes = [
+        CFDictionaryRef,
+        CFTypeRef
+    ]
+    CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef
+
+    CoreFoundation.CFArrayCreate.argtypes = [
+        CFAllocatorRef,
+        POINTER(CFTypeRef),
+        CFIndex,
+        CFArrayCallBacks,
+    ]
+    CoreFoundation.CFArrayCreate.restype = CFArrayRef
+
+    CoreFoundation.CFArrayCreateMutable.argtypes = [
+        CFAllocatorRef,
+        CFIndex,
+        CFArrayCallBacks
+    ]
+    CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef
+
+    CoreFoundation.CFArrayAppendValue.argtypes = [
+        CFMutableArrayRef,
+        c_void_p
+    ]
+    CoreFoundation.CFArrayAppendValue.restype = None
+
+    CoreFoundation.CFArrayGetCount.argtypes = [
+        CFArrayRef
+    ]
+    CoreFoundation.CFArrayGetCount.restype = CFIndex
+
+    CoreFoundation.CFArrayGetValueAtIndex.argtypes = [
+        CFArrayRef,
+        CFIndex
+    ]
+    CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p
+
+    CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll(
+        CoreFoundation, 'kCFAllocatorDefault'
+    )
+    CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(CoreFoundation, 'kCFTypeArrayCallBacks')
+    CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll(
+        CoreFoundation, 'kCFTypeDictionaryKeyCallBacks'
+    )
+    CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll(
+        CoreFoundation, 'kCFTypeDictionaryValueCallBacks'
+    )
+
+    CoreFoundation.CFTypeRef = CFTypeRef
+    CoreFoundation.CFArrayRef = CFArrayRef
+    CoreFoundation.CFStringRef = CFStringRef
+    CoreFoundation.CFDictionaryRef = CFDictionaryRef
+
+except (AttributeError):
+    raise ImportError('Error initializing ctypes')
+
+
+class CFConst(object):
+    """
+    A class object that acts as essentially a namespace for CoreFoundation
+    constants.
+    """
+    kCFStringEncodingUTF8 = CFStringEncoding(0x08000100)
+
+
+class SecurityConst(object):
+    """
+    A class object that acts as essentially a namespace for Security constants.
+    """
+    kSSLSessionOptionBreakOnServerAuth = 0
+
+    kSSLProtocol2 = 1
+    kSSLProtocol3 = 2
+    kTLSProtocol1 = 4
+    kTLSProtocol11 = 7
+    kTLSProtocol12 = 8
+
+    kSSLClientSide = 1
+    kSSLStreamType = 0
+
+    kSecFormatPEMSequence = 10
+
+    kSecTrustResultInvalid = 0
+    kSecTrustResultProceed = 1
+    # This gap is present on purpose: this was kSecTrustResultConfirm, which
+    # is deprecated.
+    kSecTrustResultDeny = 3
+    kSecTrustResultUnspecified = 4
+    kSecTrustResultRecoverableTrustFailure = 5
+    kSecTrustResultFatalTrustFailure = 6
+    kSecTrustResultOtherError = 7
+
+    errSSLProtocol = -9800
+    errSSLWouldBlock = -9803
+    errSSLClosedGraceful = -9805
+    errSSLClosedNoNotify = -9816
+    errSSLClosedAbort = -9806
+
+    errSSLXCertChainInvalid = -9807
+    errSSLCrypto = -9809
+    errSSLInternal = -9810
+    errSSLCertExpired = -9814
+    errSSLCertNotYetValid = -9815
+    errSSLUnknownRootCert = -9812
+    errSSLNoRootCert = -9813
+    errSSLHostNameMismatch = -9843
+    errSSLPeerHandshakeFail = -9824
+    errSSLPeerUserCancelled = -9839
+    errSSLWeakPeerEphemeralDHKey = -9850
+    errSSLServerAuthCompleted = -9841
+    errSSLRecordOverflow = -9847
+
+    errSecVerifyFailed = -67808
+    errSecNoTrustSettings = -25263
+    errSecItemNotFound = -25300
+    errSecInvalidTrustSettings = -25262
+
+    # Cipher suites. We only pick the ones our default cipher string allows.
+    TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C
+    TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030
+    TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B
+    TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F
+    TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3
+    TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F
+    TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2
+    TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E
+    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024
+    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028
+    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A
+    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014
+    TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B
+    TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A
+    TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039
+    TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038
+    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023
+    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027
+    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009
+    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013
+    TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067
+    TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040
+    TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033
+    TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032
+    TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D
+    TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C
+    TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D
+    TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C
+    TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035
+    TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F
+    TLS_AES_128_GCM_SHA256 = 0x1301
+    TLS_AES_256_GCM_SHA384 = 0x1302
+    TLS_CHACHA20_POLY1305_SHA256 = 0x1303
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/_securetransport/low_level.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/_securetransport/low_level.py
new file mode 100644
index 0000000000000000000000000000000000000000..5e3494bce66b4a2e40fe89e0c5bc90a692b39c37
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/_securetransport/low_level.py
@@ -0,0 +1,343 @@
+"""
+Low-level helpers for the SecureTransport bindings.
+
+These are Python functions that are not directly related to the high-level APIs
+but are necessary to get them to work. They include a whole bunch of low-level
+CoreFoundation messing about and memory management. The concerns in this module
+are almost entirely about trying to avoid memory leaks and providing
+appropriate and useful assistance to the higher-level code.
+"""
+import base64
+import ctypes
+import itertools
+import re
+import os
+import ssl
+import tempfile
+
+from .bindings import Security, CoreFoundation, CFConst
+
+
+# This regular expression is used to grab PEM data out of a PEM bundle.
+_PEM_CERTS_RE = re.compile(
+    b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL
+)
+
+
+def _cf_data_from_bytes(bytestring):
+    """
+    Given a bytestring, create a CFData object from it. This CFData object must
+    be CFReleased by the caller.
+    """
+    return CoreFoundation.CFDataCreate(
+        CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring)
+    )
+
+
+def _cf_dictionary_from_tuples(tuples):
+    """
+    Given a list of Python tuples, create an associated CFDictionary.
+    """
+    dictionary_size = len(tuples)
+
+    # We need to get the dictionary keys and values out in the same order.
+    keys = (t[0] for t in tuples)
+    values = (t[1] for t in tuples)
+    cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys)
+    cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values)
+
+    return CoreFoundation.CFDictionaryCreate(
+        CoreFoundation.kCFAllocatorDefault,
+        cf_keys,
+        cf_values,
+        dictionary_size,
+        CoreFoundation.kCFTypeDictionaryKeyCallBacks,
+        CoreFoundation.kCFTypeDictionaryValueCallBacks,
+    )
+
+
+def _cf_string_to_unicode(value):
+    """
+    Creates a Unicode string from a CFString object. Used entirely for error
+    reporting.
+
+    Yes, it annoys me quite a lot that this function is this complex.
+    """
+    value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p))
+
+    string = CoreFoundation.CFStringGetCStringPtr(
+        value_as_void_p,
+        CFConst.kCFStringEncodingUTF8
+    )
+    if string is None:
+        buffer = ctypes.create_string_buffer(1024)
+        result = CoreFoundation.CFStringGetCString(
+            value_as_void_p,
+            buffer,
+            1024,
+            CFConst.kCFStringEncodingUTF8
+        )
+        if not result:
+            raise OSError('Error copying C string from CFStringRef')
+        string = buffer.value
+    if string is not None:
+        string = string.decode('utf-8')
+    return string
+
+
+def _assert_no_error(error, exception_class=None):
+    """
+    Checks the return code and throws an exception if there is an error to
+    report
+    """
+    if error == 0:
+        return
+
+    cf_error_string = Security.SecCopyErrorMessageString(error, None)
+    output = _cf_string_to_unicode(cf_error_string)
+    CoreFoundation.CFRelease(cf_error_string)
+
+    if output is None or output == u'':
+        output = u'OSStatus %s' % error
+
+    if exception_class is None:
+        exception_class = ssl.SSLError
+
+    raise exception_class(output)
+
+
+def _cert_array_from_pem(pem_bundle):
+    """
+    Given a bundle of certs in PEM format, turns them into a CFArray of certs
+    that can be used to validate a cert chain.
+    """
+    der_certs = [
+        base64.b64decode(match.group(1))
+        for match in _PEM_CERTS_RE.finditer(pem_bundle)
+    ]
+    if not der_certs:
+        raise ssl.SSLError("No root certificates specified")
+
+    cert_array = CoreFoundation.CFArrayCreateMutable(
+        CoreFoundation.kCFAllocatorDefault,
+        0,
+        ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks)
+    )
+    if not cert_array:
+        raise ssl.SSLError("Unable to allocate memory!")
+
+    try:
+        for der_bytes in der_certs:
+            certdata = _cf_data_from_bytes(der_bytes)
+            if not certdata:
+                raise ssl.SSLError("Unable to allocate memory!")
+            cert = Security.SecCertificateCreateWithData(
+                CoreFoundation.kCFAllocatorDefault, certdata
+            )
+            CoreFoundation.CFRelease(certdata)
+            if not cert:
+                raise ssl.SSLError("Unable to build cert object!")
+
+            CoreFoundation.CFArrayAppendValue(cert_array, cert)
+            CoreFoundation.CFRelease(cert)
+    except Exception:
+        # We need to free the array before the exception bubbles further.
+        # We only want to do that if an error occurs: otherwise, the caller
+        # should free.
+        CoreFoundation.CFRelease(cert_array)
+
+    return cert_array
+
+
+def _is_cert(item):
+    """
+    Returns True if a given CFTypeRef is a certificate.
+    """
+    expected = Security.SecCertificateGetTypeID()
+    return CoreFoundation.CFGetTypeID(item) == expected
+
+
+def _is_identity(item):
+    """
+    Returns True if a given CFTypeRef is an identity.
+    """
+    expected = Security.SecIdentityGetTypeID()
+    return CoreFoundation.CFGetTypeID(item) == expected
+
+
+def _temporary_keychain():
+    """
+    This function creates a temporary Mac keychain that we can use to work with
+    credentials. This keychain uses a one-time password and a temporary file to
+    store the data. We expect to have one keychain per socket. The returned
+    SecKeychainRef must be freed by the caller, including calling
+    SecKeychainDelete.
+
+    Returns a tuple of the SecKeychainRef and the path to the temporary
+    directory that contains it.
+    """
+    # Unfortunately, SecKeychainCreate requires a path to a keychain. This
+    # means we cannot use mkstemp to use a generic temporary file. Instead,
+    # we're going to create a temporary directory and a filename to use there.
+    # This filename will be 8 random bytes expanded into base64. We also need
+    # some random bytes to password-protect the keychain we're creating, so we
+    # ask for 40 random bytes.
+    random_bytes = os.urandom(40)
+    filename = base64.b64encode(random_bytes[:8]).decode('utf-8')
+    password = base64.b64encode(random_bytes[8:])  # Must be valid UTF-8
+    tempdirectory = tempfile.mkdtemp()
+
+    keychain_path = os.path.join(tempdirectory, filename).encode('utf-8')
+
+    # We now want to create the keychain itself.
+    keychain = Security.SecKeychainRef()
+    status = Security.SecKeychainCreate(
+        keychain_path,
+        len(password),
+        password,
+        False,
+        None,
+        ctypes.byref(keychain)
+    )
+    _assert_no_error(status)
+
+    # Having created the keychain, we want to pass it off to the caller.
+    return keychain, tempdirectory
+
+
+def _load_items_from_file(keychain, path):
+    """
+    Given a single file, loads all the trust objects from it into arrays and
+    the keychain.
+    Returns a tuple of lists: the first list is a list of identities, the
+    second a list of certs.
+    """
+    certificates = []
+    identities = []
+    result_array = None
+
+    with open(path, 'rb') as f:
+        raw_filedata = f.read()
+
+    try:
+        filedata = CoreFoundation.CFDataCreate(
+            CoreFoundation.kCFAllocatorDefault,
+            raw_filedata,
+            len(raw_filedata)
+        )
+        result_array = CoreFoundation.CFArrayRef()
+        result = Security.SecItemImport(
+            filedata,  # cert data
+            None,  # Filename, leaving it out for now
+            None,  # What the type of the file is, we don't care
+            None,  # what's in the file, we don't care
+            0,  # import flags
+            None,  # key params, can include passphrase in the future
+            keychain,  # The keychain to insert into
+            ctypes.byref(result_array)  # Results
+        )
+        _assert_no_error(result)
+
+        # A CFArray is not very useful to us as an intermediary
+        # representation, so we are going to extract the objects we want
+        # and then free the array. We don't need to keep hold of keys: the
+        # keychain already has them!
+        result_count = CoreFoundation.CFArrayGetCount(result_array)
+        for index in range(result_count):
+            item = CoreFoundation.CFArrayGetValueAtIndex(
+                result_array, index
+            )
+            item = ctypes.cast(item, CoreFoundation.CFTypeRef)
+
+            if _is_cert(item):
+                CoreFoundation.CFRetain(item)
+                certificates.append(item)
+            elif _is_identity(item):
+                CoreFoundation.CFRetain(item)
+                identities.append(item)
+    finally:
+        if result_array:
+            CoreFoundation.CFRelease(result_array)
+
+        CoreFoundation.CFRelease(filedata)
+
+    return (identities, certificates)
+
+
+def _load_client_cert_chain(keychain, *paths):
+    """
+    Load certificates and maybe keys from a number of files. Has the end goal
+    of returning a CFArray containing one SecIdentityRef, and then zero or more
+    SecCertificateRef objects, suitable for use as a client certificate trust
+    chain.
+    """
+    # Ok, the strategy.
+    #
+    # This relies on knowing that macOS will not give you a SecIdentityRef
+    # unless you have imported a key into a keychain. This is a somewhat
+    # artificial limitation of macOS (for example, it doesn't necessarily
+    # affect iOS), but there is nothing inside Security.framework that lets you
+    # get a SecIdentityRef without having a key in a keychain.
+    #
+    # So the policy here is we take all the files and iterate them in order.
+    # Each one will use SecItemImport to have one or more objects loaded from
+    # it. We will also point at a keychain that macOS can use to work with the
+    # private key.
+    #
+    # Once we have all the objects, we'll check what we actually have. If we
+    # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise,
+    # we'll take the first certificate (which we assume to be our leaf) and
+    # ask the keychain to give us a SecIdentityRef with that cert's associated
+    # key.
+    #
+    # We'll then return a CFArray containing the trust chain: one
+    # SecIdentityRef and then zero-or-more SecCertificateRef objects. The
+    # responsibility for freeing this CFArray will be with the caller. This
+    # CFArray must remain alive for the entire connection, so in practice it
+    # will be stored with a single SSLSocket, along with the reference to the
+    # keychain.
+    certificates = []
+    identities = []
+
+    # Filter out bad paths.
+    paths = (path for path in paths if path)
+
+    try:
+        for file_path in paths:
+            new_identities, new_certs = _load_items_from_file(
+                keychain, file_path
+            )
+            identities.extend(new_identities)
+            certificates.extend(new_certs)
+
+        # Ok, we have everything. The question is: do we have an identity? If
+        # not, we want to grab one from the first cert we have.
+        if not identities:
+            new_identity = Security.SecIdentityRef()
+            status = Security.SecIdentityCreateWithCertificate(
+                keychain,
+                certificates[0],
+                ctypes.byref(new_identity)
+            )
+            _assert_no_error(status)
+            identities.append(new_identity)
+
+            # We now want to release the original certificate, as we no longer
+            # need it.
+            CoreFoundation.CFRelease(certificates.pop(0))
+
+        # We now need to build a new CFArray that holds the trust chain.
+        trust_chain = CoreFoundation.CFArrayCreateMutable(
+            CoreFoundation.kCFAllocatorDefault,
+            0,
+            ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks),
+        )
+        for item in itertools.chain(identities, certificates):
+            # ArrayAppendValue does a CFRetain on the item. That's fine,
+            # because the finally block will release our other refs to them.
+            CoreFoundation.CFArrayAppendValue(trust_chain, item)
+
+        return trust_chain
+    finally:
+        for obj in itertools.chain(identities, certificates):
+            CoreFoundation.CFRelease(obj)
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/appengine.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/appengine.py
new file mode 100644
index 0000000000000000000000000000000000000000..814b0222d9a4c0249c61431f57aaa76326ac963a
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/appengine.py
@@ -0,0 +1,296 @@
+"""
+This module provides a pool manager that uses Google App Engine's
+`URLFetch Service <https://cloud.google.com/appengine/docs/python/urlfetch>`_.
+
+Example usage::
+
+    from urllib3 import PoolManager
+    from urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox
+
+    if is_appengine_sandbox():
+        # AppEngineManager uses AppEngine's URLFetch API behind the scenes
+        http = AppEngineManager()
+    else:
+        # PoolManager uses a socket-level API behind the scenes
+        http = PoolManager()
+
+    r = http.request('GET', 'https://google.com/')
+
+There are `limitations <https://cloud.google.com/appengine/docs/python/\
+urlfetch/#Python_Quotas_and_limits>`_ to the URLFetch service and it may not be
+the best choice for your application. There are three options for using
+urllib3 on Google App Engine:
+
+1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is
+   cost-effective in many circumstances as long as your usage is within the
+   limitations.
+2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets.
+   Sockets also have `limitations and restrictions
+   <https://cloud.google.com/appengine/docs/python/sockets/\
+   #limitations-and-restrictions>`_ and have a lower free quota than URLFetch.
+   To use sockets, be sure to specify the following in your ``app.yaml``::
+
+        env_variables:
+            GAE_USE_SOCKETS_HTTPLIB : 'true'
+
+3. If you are using `App Engine Flexible
+<https://cloud.google.com/appengine/docs/flexible/>`_, you can use the standard
+:class:`PoolManager` without any configuration or special environment variables.
+"""
+
+from __future__ import absolute_import
+import logging
+import os
+import warnings
+from ..packages.six.moves.urllib.parse import urljoin
+
+from ..exceptions import (
+    HTTPError,
+    HTTPWarning,
+    MaxRetryError,
+    ProtocolError,
+    TimeoutError,
+    SSLError
+)
+
+from ..packages.six import BytesIO
+from ..request import RequestMethods
+from ..response import HTTPResponse
+from ..util.timeout import Timeout
+from ..util.retry import Retry
+
+try:
+    from google.appengine.api import urlfetch
+except ImportError:
+    urlfetch = None
+
+
+log = logging.getLogger(__name__)
+
+
+class AppEnginePlatformWarning(HTTPWarning):
+    pass
+
+
+class AppEnginePlatformError(HTTPError):
+    pass
+
+
+class AppEngineManager(RequestMethods):
+    """
+    Connection manager for Google App Engine sandbox applications.
+
+    This manager uses the URLFetch service directly instead of using the
+    emulated httplib, and is subject to URLFetch limitations as described in
+    the App Engine documentation `here
+    <https://cloud.google.com/appengine/docs/python/urlfetch>`_.
+
+    Notably it will raise an :class:`AppEnginePlatformError` if:
+        * URLFetch is not available.
+        * If you attempt to use this on App Engine Flexible, as full socket
+          support is available.
+        * If a request size is more than 10 megabytes.
+        * If a response size is more than 32 megabtyes.
+        * If you use an unsupported request method such as OPTIONS.
+
+    Beyond those cases, it will raise normal urllib3 errors.
+    """
+
+    def __init__(self, headers=None, retries=None, validate_certificate=True,
+                 urlfetch_retries=True):
+        if not urlfetch:
+            raise AppEnginePlatformError(
+                "URLFetch is not available in this environment.")
+
+        if is_prod_appengine_mvms():
+            raise AppEnginePlatformError(
+                "Use normal urllib3.PoolManager instead of AppEngineManager"
+                "on Managed VMs, as using URLFetch is not necessary in "
+                "this environment.")
+
+        warnings.warn(
+            "urllib3 is using URLFetch on Google App Engine sandbox instead "
+            "of sockets. To use sockets directly instead of URLFetch see "
+            "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.",
+            AppEnginePlatformWarning)
+
+        RequestMethods.__init__(self, headers)
+        self.validate_certificate = validate_certificate
+        self.urlfetch_retries = urlfetch_retries
+
+        self.retries = retries or Retry.DEFAULT
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        # Return False to re-raise any potential exceptions
+        return False
+
+    def urlopen(self, method, url, body=None, headers=None,
+                retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT,
+                **response_kw):
+
+        retries = self._get_retries(retries, redirect)
+
+        try:
+            follow_redirects = (
+                    redirect and
+                    retries.redirect != 0 and
+                    retries.total)
+            response = urlfetch.fetch(
+                url,
+                payload=body,
+                method=method,
+                headers=headers or {},
+                allow_truncated=False,
+                follow_redirects=self.urlfetch_retries and follow_redirects,
+                deadline=self._get_absolute_timeout(timeout),
+                validate_certificate=self.validate_certificate,
+            )
+        except urlfetch.DeadlineExceededError as e:
+            raise TimeoutError(self, e)
+
+        except urlfetch.InvalidURLError as e:
+            if 'too large' in str(e):
+                raise AppEnginePlatformError(
+                    "URLFetch request too large, URLFetch only "
+                    "supports requests up to 10mb in size.", e)
+            raise ProtocolError(e)
+
+        except urlfetch.DownloadError as e:
+            if 'Too many redirects' in str(e):
+                raise MaxRetryError(self, url, reason=e)
+            raise ProtocolError(e)
+
+        except urlfetch.ResponseTooLargeError as e:
+            raise AppEnginePlatformError(
+                "URLFetch response too large, URLFetch only supports"
+                "responses up to 32mb in size.", e)
+
+        except urlfetch.SSLCertificateError as e:
+            raise SSLError(e)
+
+        except urlfetch.InvalidMethodError as e:
+            raise AppEnginePlatformError(
+                "URLFetch does not support method: %s" % method, e)
+
+        http_response = self._urlfetch_response_to_http_response(
+            response, retries=retries, **response_kw)
+
+        # Handle redirect?
+        redirect_location = redirect and http_response.get_redirect_location()
+        if redirect_location:
+            # Check for redirect response
+            if (self.urlfetch_retries and retries.raise_on_redirect):
+                raise MaxRetryError(self, url, "too many redirects")
+            else:
+                if http_response.status == 303:
+                    method = 'GET'
+
+                try:
+                    retries = retries.increment(method, url, response=http_response, _pool=self)
+                except MaxRetryError:
+                    if retries.raise_on_redirect:
+                        raise MaxRetryError(self, url, "too many redirects")
+                    return http_response
+
+                retries.sleep_for_retry(http_response)
+                log.debug("Redirecting %s -> %s", url, redirect_location)
+                redirect_url = urljoin(url, redirect_location)
+                return self.urlopen(
+                    method, redirect_url, body, headers,
+                    retries=retries, redirect=redirect,
+                    timeout=timeout, **response_kw)
+
+        # Check if we should retry the HTTP response.
+        has_retry_after = bool(http_response.getheader('Retry-After'))
+        if retries.is_retry(method, http_response.status, has_retry_after):
+            retries = retries.increment(
+                method, url, response=http_response, _pool=self)
+            log.debug("Retry: %s", url)
+            retries.sleep(http_response)
+            return self.urlopen(
+                method, url,
+                body=body, headers=headers,
+                retries=retries, redirect=redirect,
+                timeout=timeout, **response_kw)
+
+        return http_response
+
+    def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw):
+
+        if is_prod_appengine():
+            # Production GAE handles deflate encoding automatically, but does
+            # not remove the encoding header.
+            content_encoding = urlfetch_resp.headers.get('content-encoding')
+
+            if content_encoding == 'deflate':
+                del urlfetch_resp.headers['content-encoding']
+
+        transfer_encoding = urlfetch_resp.headers.get('transfer-encoding')
+        # We have a full response's content,
+        # so let's make sure we don't report ourselves as chunked data.
+        if transfer_encoding == 'chunked':
+            encodings = transfer_encoding.split(",")
+            encodings.remove('chunked')
+            urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings)
+
+        return HTTPResponse(
+            # In order for decoding to work, we must present the content as
+            # a file-like object.
+            body=BytesIO(urlfetch_resp.content),
+            headers=urlfetch_resp.headers,
+            status=urlfetch_resp.status_code,
+            **response_kw
+        )
+
+    def _get_absolute_timeout(self, timeout):
+        if timeout is Timeout.DEFAULT_TIMEOUT:
+            return None  # Defer to URLFetch's default.
+        if isinstance(timeout, Timeout):
+            if timeout._read is not None or timeout._connect is not None:
+                warnings.warn(
+                    "URLFetch does not support granular timeout settings, "
+                    "reverting to total or default URLFetch timeout.",
+                    AppEnginePlatformWarning)
+            return timeout.total
+        return timeout
+
+    def _get_retries(self, retries, redirect):
+        if not isinstance(retries, Retry):
+            retries = Retry.from_int(
+                retries, redirect=redirect, default=self.retries)
+
+        if retries.connect or retries.read or retries.redirect:
+            warnings.warn(
+                "URLFetch only supports total retries and does not "
+                "recognize connect, read, or redirect retry parameters.",
+                AppEnginePlatformWarning)
+
+        return retries
+
+
+def is_appengine():
+    return (is_local_appengine() or
+            is_prod_appengine() or
+            is_prod_appengine_mvms())
+
+
+def is_appengine_sandbox():
+    return is_appengine() and not is_prod_appengine_mvms()
+
+
+def is_local_appengine():
+    return ('APPENGINE_RUNTIME' in os.environ and
+            'Development/' in os.environ['SERVER_SOFTWARE'])
+
+
+def is_prod_appengine():
+    return ('APPENGINE_RUNTIME' in os.environ and
+            'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and
+            not is_prod_appengine_mvms())
+
+
+def is_prod_appengine_mvms():
+    return os.environ.get('GAE_VM', False) == 'true'
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/ntlmpool.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/ntlmpool.py
new file mode 100644
index 0000000000000000000000000000000000000000..642e99ed2d37e41b3d321ab39fdd52a9c8db7d83
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/ntlmpool.py
@@ -0,0 +1,112 @@
+"""
+NTLM authenticating pool, contributed by erikcederstran
+
+Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10
+"""
+from __future__ import absolute_import
+
+from logging import getLogger
+from ntlm import ntlm
+
+from .. import HTTPSConnectionPool
+from ..packages.six.moves.http_client import HTTPSConnection
+
+
+log = getLogger(__name__)
+
+
+class NTLMConnectionPool(HTTPSConnectionPool):
+    """
+    Implements an NTLM authentication version of an urllib3 connection pool
+    """
+
+    scheme = 'https'
+
+    def __init__(self, user, pw, authurl, *args, **kwargs):
+        """
+        authurl is a random URL on the server that is protected by NTLM.
+        user is the Windows user, probably in the DOMAIN\\username format.
+        pw is the password for the user.
+        """
+        super(NTLMConnectionPool, self).__init__(*args, **kwargs)
+        self.authurl = authurl
+        self.rawuser = user
+        user_parts = user.split('\\', 1)
+        self.domain = user_parts[0].upper()
+        self.user = user_parts[1]
+        self.pw = pw
+
+    def _new_conn(self):
+        # Performs the NTLM handshake that secures the connection. The socket
+        # must be kept open while requests are performed.
+        self.num_connections += 1
+        log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s',
+                  self.num_connections, self.host, self.authurl)
+
+        headers = {}
+        headers['Connection'] = 'Keep-Alive'
+        req_header = 'Authorization'
+        resp_header = 'www-authenticate'
+
+        conn = HTTPSConnection(host=self.host, port=self.port)
+
+        # Send negotiation message
+        headers[req_header] = (
+            'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser))
+        log.debug('Request headers: %s', headers)
+        conn.request('GET', self.authurl, None, headers)
+        res = conn.getresponse()
+        reshdr = dict(res.getheaders())
+        log.debug('Response status: %s %s', res.status, res.reason)
+        log.debug('Response headers: %s', reshdr)
+        log.debug('Response data: %s [...]', res.read(100))
+
+        # Remove the reference to the socket, so that it can not be closed by
+        # the response object (we want to keep the socket open)
+        res.fp = None
+
+        # Server should respond with a challenge message
+        auth_header_values = reshdr[resp_header].split(', ')
+        auth_header_value = None
+        for s in auth_header_values:
+            if s[:5] == 'NTLM ':
+                auth_header_value = s[5:]
+        if auth_header_value is None:
+            raise Exception('Unexpected %s response header: %s' %
+                            (resp_header, reshdr[resp_header]))
+
+        # Send authentication message
+        ServerChallenge, NegotiateFlags = \
+            ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value)
+        auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge,
+                                                         self.user,
+                                                         self.domain,
+                                                         self.pw,
+                                                         NegotiateFlags)
+        headers[req_header] = 'NTLM %s' % auth_msg
+        log.debug('Request headers: %s', headers)
+        conn.request('GET', self.authurl, None, headers)
+        res = conn.getresponse()
+        log.debug('Response status: %s %s', res.status, res.reason)
+        log.debug('Response headers: %s', dict(res.getheaders()))
+        log.debug('Response data: %s [...]', res.read()[:100])
+        if res.status != 200:
+            if res.status == 401:
+                raise Exception('Server rejected request: wrong '
+                                'username or password')
+            raise Exception('Wrong server response: %s %s' %
+                            (res.status, res.reason))
+
+        res.fp = None
+        log.debug('Connection established')
+        return conn
+
+    def urlopen(self, method, url, body=None, headers=None, retries=3,
+                redirect=True, assert_same_host=True):
+        if headers is None:
+            headers = {}
+        headers['Connection'] = 'Keep-Alive'
+        return super(NTLMConnectionPool, self).urlopen(method, url, body,
+                                                       headers, retries,
+                                                       redirect,
+                                                       assert_same_host)
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/pyopenssl.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/pyopenssl.py
new file mode 100644
index 0000000000000000000000000000000000000000..f63b84013a37300ed0d1065490767d72829fa69d
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/pyopenssl.py
@@ -0,0 +1,455 @@
+"""
+SSL with SNI_-support for Python 2. Follow these instructions if you would
+like to verify SSL certificates in Python 2. Note, the default libraries do
+*not* do certificate checking; you need to do additional work to validate
+certificates yourself.
+
+This needs the following packages installed:
+
+* pyOpenSSL (tested with 16.0.0)
+* cryptography (minimum 1.3.4, from pyopenssl)
+* idna (minimum 2.0, from cryptography)
+
+However, pyopenssl depends on cryptography, which depends on idna, so while we
+use all three directly here we end up having relatively few packages required.
+
+You can install them with the following command:
+
+    pip install pyopenssl cryptography idna
+
+To activate certificate checking, call
+:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code
+before you begin making HTTP requests. This can be done in a ``sitecustomize``
+module, or at any other time before your application begins using ``urllib3``,
+like this::
+
+    try:
+        import urllib3.contrib.pyopenssl
+        urllib3.contrib.pyopenssl.inject_into_urllib3()
+    except ImportError:
+        pass
+
+Now you can use :mod:`urllib3` as you normally would, and it will support SNI
+when the required modules are installed.
+
+Activating this module also has the positive side effect of disabling SSL/TLS
+compression in Python 2 (see `CRIME attack`_).
+
+If you want to configure the default list of supported cipher suites, you can
+set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable.
+
+.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication
+.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit)
+"""
+from __future__ import absolute_import
+
+import OpenSSL.SSL
+from cryptography import x509
+from cryptography.hazmat.backends.openssl import backend as openssl_backend
+from cryptography.hazmat.backends.openssl.x509 import _Certificate
+
+from socket import timeout, error as SocketError
+from io import BytesIO
+
+try:  # Platform-specific: Python 2
+    from socket import _fileobject
+except ImportError:  # Platform-specific: Python 3
+    _fileobject = None
+    from ..packages.backports.makefile import backport_makefile
+
+import logging
+import ssl
+from ..packages import six
+import sys
+
+from .. import util
+
+__all__ = ['inject_into_urllib3', 'extract_from_urllib3']
+
+# SNI always works.
+HAS_SNI = True
+
+# Map from urllib3 to PyOpenSSL compatible parameter-values.
+_openssl_versions = {
+    ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD,
+    ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD,
+}
+
+if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'):
+    _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD
+
+if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'):
+    _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD
+
+try:
+    _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD})
+except AttributeError:
+    pass
+
+_stdlib_to_openssl_verify = {
+    ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE,
+    ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER,
+    ssl.CERT_REQUIRED:
+        OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT,
+}
+_openssl_to_stdlib_verify = dict(
+    (v, k) for k, v in _stdlib_to_openssl_verify.items()
+)
+
+# OpenSSL will only write 16K at a time
+SSL_WRITE_BLOCKSIZE = 16384
+
+orig_util_HAS_SNI = util.HAS_SNI
+orig_util_SSLContext = util.ssl_.SSLContext
+
+
+log = logging.getLogger(__name__)
+
+
+def inject_into_urllib3():
+    'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.'
+
+    _validate_dependencies_met()
+
+    util.ssl_.SSLContext = PyOpenSSLContext
+    util.HAS_SNI = HAS_SNI
+    util.ssl_.HAS_SNI = HAS_SNI
+    util.IS_PYOPENSSL = True
+    util.ssl_.IS_PYOPENSSL = True
+
+
+def extract_from_urllib3():
+    'Undo monkey-patching by :func:`inject_into_urllib3`.'
+
+    util.ssl_.SSLContext = orig_util_SSLContext
+    util.HAS_SNI = orig_util_HAS_SNI
+    util.ssl_.HAS_SNI = orig_util_HAS_SNI
+    util.IS_PYOPENSSL = False
+    util.ssl_.IS_PYOPENSSL = False
+
+
+def _validate_dependencies_met():
+    """
+    Verifies that PyOpenSSL's package-level dependencies have been met.
+    Throws `ImportError` if they are not met.
+    """
+    # Method added in `cryptography==1.1`; not available in older versions
+    from cryptography.x509.extensions import Extensions
+    if getattr(Extensions, "get_extension_for_class", None) is None:
+        raise ImportError("'cryptography' module missing required functionality.  "
+                          "Try upgrading to v1.3.4 or newer.")
+
+    # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509
+    # attribute is only present on those versions.
+    from OpenSSL.crypto import X509
+    x509 = X509()
+    if getattr(x509, "_x509", None) is None:
+        raise ImportError("'pyOpenSSL' module missing required functionality. "
+                          "Try upgrading to v0.14 or newer.")
+
+
+def _dnsname_to_stdlib(name):
+    """
+    Converts a dNSName SubjectAlternativeName field to the form used by the
+    standard library on the given Python version.
+
+    Cryptography produces a dNSName as a unicode string that was idna-decoded
+    from ASCII bytes. We need to idna-encode that string to get it back, and
+    then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib
+    uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8).
+    """
+    def idna_encode(name):
+        """
+        Borrowed wholesale from the Python Cryptography Project. It turns out
+        that we can't just safely call `idna.encode`: it can explode for
+        wildcard names. This avoids that problem.
+        """
+        import idna
+
+        for prefix in [u'*.', u'.']:
+            if name.startswith(prefix):
+                name = name[len(prefix):]
+                return prefix.encode('ascii') + idna.encode(name)
+        return idna.encode(name)
+
+    name = idna_encode(name)
+    if sys.version_info >= (3, 0):
+        name = name.decode('utf-8')
+    return name
+
+
+def get_subj_alt_name(peer_cert):
+    """
+    Given an PyOpenSSL certificate, provides all the subject alternative names.
+    """
+    # Pass the cert to cryptography, which has much better APIs for this.
+    if hasattr(peer_cert, "to_cryptography"):
+        cert = peer_cert.to_cryptography()
+    else:
+        # This is technically using private APIs, but should work across all
+        # relevant versions before PyOpenSSL got a proper API for this.
+        cert = _Certificate(openssl_backend, peer_cert._x509)
+
+    # We want to find the SAN extension. Ask Cryptography to locate it (it's
+    # faster than looping in Python)
+    try:
+        ext = cert.extensions.get_extension_for_class(
+            x509.SubjectAlternativeName
+        ).value
+    except x509.ExtensionNotFound:
+        # No such extension, return the empty list.
+        return []
+    except (x509.DuplicateExtension, x509.UnsupportedExtension,
+            x509.UnsupportedGeneralNameType, UnicodeError) as e:
+        # A problem has been found with the quality of the certificate. Assume
+        # no SAN field is present.
+        log.warning(
+            "A problem was encountered with the certificate that prevented "
+            "urllib3 from finding the SubjectAlternativeName field. This can "
+            "affect certificate validation. The error was %s",
+            e,
+        )
+        return []
+
+    # We want to return dNSName and iPAddress fields. We need to cast the IPs
+    # back to strings because the match_hostname function wants them as
+    # strings.
+    # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8
+    # decoded. This is pretty frustrating, but that's what the standard library
+    # does with certificates, and so we need to attempt to do the same.
+    names = [
+        ('DNS', _dnsname_to_stdlib(name))
+        for name in ext.get_values_for_type(x509.DNSName)
+    ]
+    names.extend(
+        ('IP Address', str(name))
+        for name in ext.get_values_for_type(x509.IPAddress)
+    )
+
+    return names
+
+
+class WrappedSocket(object):
+    '''API-compatibility wrapper for Python OpenSSL's Connection-class.
+
+    Note: _makefile_refs, _drop() and _reuse() are needed for the garbage
+    collector of pypy.
+    '''
+
+    def __init__(self, connection, socket, suppress_ragged_eofs=True):
+        self.connection = connection
+        self.socket = socket
+        self.suppress_ragged_eofs = suppress_ragged_eofs
+        self._makefile_refs = 0
+        self._closed = False
+
+    def fileno(self):
+        return self.socket.fileno()
+
+    # Copy-pasted from Python 3.5 source code
+    def _decref_socketios(self):
+        if self._makefile_refs > 0:
+            self._makefile_refs -= 1
+        if self._closed:
+            self.close()
+
+    def recv(self, *args, **kwargs):
+        try:
+            data = self.connection.recv(*args, **kwargs)
+        except OpenSSL.SSL.SysCallError as e:
+            if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'):
+                return b''
+            else:
+                raise SocketError(str(e))
+        except OpenSSL.SSL.ZeroReturnError as e:
+            if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN:
+                return b''
+            else:
+                raise
+        except OpenSSL.SSL.WantReadError:
+            rd = util.wait_for_read(self.socket, self.socket.gettimeout())
+            if not rd:
+                raise timeout('The read operation timed out')
+            else:
+                return self.recv(*args, **kwargs)
+        else:
+            return data
+
+    def recv_into(self, *args, **kwargs):
+        try:
+            return self.connection.recv_into(*args, **kwargs)
+        except OpenSSL.SSL.SysCallError as e:
+            if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'):
+                return 0
+            else:
+                raise SocketError(str(e))
+        except OpenSSL.SSL.ZeroReturnError as e:
+            if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN:
+                return 0
+            else:
+                raise
+        except OpenSSL.SSL.WantReadError:
+            rd = util.wait_for_read(self.socket, self.socket.gettimeout())
+            if not rd:
+                raise timeout('The read operation timed out')
+            else:
+                return self.recv_into(*args, **kwargs)
+
+    def settimeout(self, timeout):
+        return self.socket.settimeout(timeout)
+
+    def _send_until_done(self, data):
+        while True:
+            try:
+                return self.connection.send(data)
+            except OpenSSL.SSL.WantWriteError:
+                wr = util.wait_for_write(self.socket, self.socket.gettimeout())
+                if not wr:
+                    raise timeout()
+                continue
+            except OpenSSL.SSL.SysCallError as e:
+                raise SocketError(str(e))
+
+    def sendall(self, data):
+        total_sent = 0
+        while total_sent < len(data):
+            sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE])
+            total_sent += sent
+
+    def shutdown(self):
+        # FIXME rethrow compatible exceptions should we ever use this
+        self.connection.shutdown()
+
+    def close(self):
+        if self._makefile_refs < 1:
+            try:
+                self._closed = True
+                return self.connection.close()
+            except OpenSSL.SSL.Error:
+                return
+        else:
+            self._makefile_refs -= 1
+
+    def getpeercert(self, binary_form=False):
+        x509 = self.connection.get_peer_certificate()
+
+        if not x509:
+            return x509
+
+        if binary_form:
+            return OpenSSL.crypto.dump_certificate(
+                OpenSSL.crypto.FILETYPE_ASN1,
+                x509)
+
+        return {
+            'subject': (
+                (('commonName', x509.get_subject().CN),),
+            ),
+            'subjectAltName': get_subj_alt_name(x509)
+        }
+
+    def _reuse(self):
+        self._makefile_refs += 1
+
+    def _drop(self):
+        if self._makefile_refs < 1:
+            self.close()
+        else:
+            self._makefile_refs -= 1
+
+
+if _fileobject:  # Platform-specific: Python 2
+    def makefile(self, mode, bufsize=-1):
+        self._makefile_refs += 1
+        return _fileobject(self, mode, bufsize, close=True)
+else:  # Platform-specific: Python 3
+    makefile = backport_makefile
+
+WrappedSocket.makefile = makefile
+
+
+class PyOpenSSLContext(object):
+    """
+    I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible
+    for translating the interface of the standard library ``SSLContext`` object
+    to calls into PyOpenSSL.
+    """
+    def __init__(self, protocol):
+        self.protocol = _openssl_versions[protocol]
+        self._ctx = OpenSSL.SSL.Context(self.protocol)
+        self._options = 0
+        self.check_hostname = False
+
+    @property
+    def options(self):
+        return self._options
+
+    @options.setter
+    def options(self, value):
+        self._options = value
+        self._ctx.set_options(value)
+
+    @property
+    def verify_mode(self):
+        return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()]
+
+    @verify_mode.setter
+    def verify_mode(self, value):
+        self._ctx.set_verify(
+            _stdlib_to_openssl_verify[value],
+            _verify_callback
+        )
+
+    def set_default_verify_paths(self):
+        self._ctx.set_default_verify_paths()
+
+    def set_ciphers(self, ciphers):
+        if isinstance(ciphers, six.text_type):
+            ciphers = ciphers.encode('utf-8')
+        self._ctx.set_cipher_list(ciphers)
+
+    def load_verify_locations(self, cafile=None, capath=None, cadata=None):
+        if cafile is not None:
+            cafile = cafile.encode('utf-8')
+        if capath is not None:
+            capath = capath.encode('utf-8')
+        self._ctx.load_verify_locations(cafile, capath)
+        if cadata is not None:
+            self._ctx.load_verify_locations(BytesIO(cadata))
+
+    def load_cert_chain(self, certfile, keyfile=None, password=None):
+        self._ctx.use_certificate_file(certfile)
+        if password is not None:
+            self._ctx.set_passwd_cb(lambda max_length, prompt_twice, userdata: password)
+        self._ctx.use_privatekey_file(keyfile or certfile)
+
+    def wrap_socket(self, sock, server_side=False,
+                    do_handshake_on_connect=True, suppress_ragged_eofs=True,
+                    server_hostname=None):
+        cnx = OpenSSL.SSL.Connection(self._ctx, sock)
+
+        if isinstance(server_hostname, six.text_type):  # Platform-specific: Python 3
+            server_hostname = server_hostname.encode('utf-8')
+
+        if server_hostname is not None:
+            cnx.set_tlsext_host_name(server_hostname)
+
+        cnx.set_connect_state()
+
+        while True:
+            try:
+                cnx.do_handshake()
+            except OpenSSL.SSL.WantReadError:
+                rd = util.wait_for_read(sock, sock.gettimeout())
+                if not rd:
+                    raise timeout('select timed out')
+                continue
+            except OpenSSL.SSL.Error as e:
+                raise ssl.SSLError('bad handshake: %r' % e)
+            break
+
+        return WrappedSocket(cnx, sock)
+
+
+def _verify_callback(cnx, x509, err_no, err_depth, return_code):
+    return err_no == 0
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/securetransport.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/securetransport.py
new file mode 100644
index 0000000000000000000000000000000000000000..2cac70f7f7701760a54e1679b50eb954527b126c
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/securetransport.py
@@ -0,0 +1,810 @@
+"""
+SecureTranport support for urllib3 via ctypes.
+
+This makes platform-native TLS available to urllib3 users on macOS without the
+use of a compiler. This is an important feature because the Python Package
+Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL
+that ships with macOS is not capable of doing TLSv1.2. The only way to resolve
+this is to give macOS users an alternative solution to the problem, and that
+solution is to use SecureTransport.
+
+We use ctypes here because this solution must not require a compiler. That's
+because pip is not allowed to require a compiler either.
+
+This is not intended to be a seriously long-term solution to this problem.
+The hope is that PEP 543 will eventually solve this issue for us, at which
+point we can retire this contrib module. But in the short term, we need to
+solve the impending tire fire that is Python on Mac without this kind of
+contrib module. So...here we are.
+
+To use this module, simply import and inject it::
+
+    import urllib3.contrib.securetransport
+    urllib3.contrib.securetransport.inject_into_urllib3()
+
+Happy TLSing!
+"""
+from __future__ import absolute_import
+
+import contextlib
+import ctypes
+import errno
+import os.path
+import shutil
+import socket
+import ssl
+import threading
+import weakref
+
+from .. import util
+from ._securetransport.bindings import (
+    Security, SecurityConst, CoreFoundation
+)
+from ._securetransport.low_level import (
+    _assert_no_error, _cert_array_from_pem, _temporary_keychain,
+    _load_client_cert_chain
+)
+
+try:  # Platform-specific: Python 2
+    from socket import _fileobject
+except ImportError:  # Platform-specific: Python 3
+    _fileobject = None
+    from ..packages.backports.makefile import backport_makefile
+
+try:
+    memoryview(b'')
+except NameError:
+    raise ImportError("SecureTransport only works on Pythons with memoryview")
+
+__all__ = ['inject_into_urllib3', 'extract_from_urllib3']
+
+# SNI always works
+HAS_SNI = True
+
+orig_util_HAS_SNI = util.HAS_SNI
+orig_util_SSLContext = util.ssl_.SSLContext
+
+# This dictionary is used by the read callback to obtain a handle to the
+# calling wrapped socket. This is a pretty silly approach, but for now it'll
+# do. I feel like I should be able to smuggle a handle to the wrapped socket
+# directly in the SSLConnectionRef, but for now this approach will work I
+# guess.
+#
+# We need to lock around this structure for inserts, but we don't do it for
+# reads/writes in the callbacks. The reasoning here goes as follows:
+#
+#    1. It is not possible to call into the callbacks before the dictionary is
+#       populated, so once in the callback the id must be in the dictionary.
+#    2. The callbacks don't mutate the dictionary, they only read from it, and
+#       so cannot conflict with any of the insertions.
+#
+# This is good: if we had to lock in the callbacks we'd drastically slow down
+# the performance of this code.
+_connection_refs = weakref.WeakValueDictionary()
+_connection_ref_lock = threading.Lock()
+
+# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over
+# for no better reason than we need *a* limit, and this one is right there.
+SSL_WRITE_BLOCKSIZE = 16384
+
+# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to
+# individual cipher suites. We need to do this becuase this is how
+# SecureTransport wants them.
+CIPHER_SUITES = [
+    SecurityConst.TLS_AES_256_GCM_SHA384,
+    SecurityConst.TLS_CHACHA20_POLY1305_SHA256,
+    SecurityConst.TLS_AES_128_GCM_SHA256,
+    SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
+    SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
+    SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
+    SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
+    SecurityConst.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384,
+    SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
+    SecurityConst.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,
+    SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
+    SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
+    SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
+    SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
+    SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
+    SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
+    SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,
+    SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
+    SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
+    SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
+    SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
+    SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
+    SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
+    SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
+    SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,
+    SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
+    SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
+    SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384,
+    SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256,
+    SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256,
+    SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256,
+    SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA,
+    SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA,
+]
+
+# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of
+# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version.
+_protocol_to_min_max = {
+    ssl.PROTOCOL_SSLv23: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12),
+}
+
+if hasattr(ssl, "PROTOCOL_SSLv2"):
+    _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = (
+        SecurityConst.kSSLProtocol2, SecurityConst.kSSLProtocol2
+    )
+if hasattr(ssl, "PROTOCOL_SSLv3"):
+    _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = (
+        SecurityConst.kSSLProtocol3, SecurityConst.kSSLProtocol3
+    )
+if hasattr(ssl, "PROTOCOL_TLSv1"):
+    _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = (
+        SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol1
+    )
+if hasattr(ssl, "PROTOCOL_TLSv1_1"):
+    _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = (
+        SecurityConst.kTLSProtocol11, SecurityConst.kTLSProtocol11
+    )
+if hasattr(ssl, "PROTOCOL_TLSv1_2"):
+    _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = (
+        SecurityConst.kTLSProtocol12, SecurityConst.kTLSProtocol12
+    )
+if hasattr(ssl, "PROTOCOL_TLS"):
+    _protocol_to_min_max[ssl.PROTOCOL_TLS] = _protocol_to_min_max[ssl.PROTOCOL_SSLv23]
+
+
+def inject_into_urllib3():
+    """
+    Monkey-patch urllib3 with SecureTransport-backed SSL-support.
+    """
+    util.ssl_.SSLContext = SecureTransportContext
+    util.HAS_SNI = HAS_SNI
+    util.ssl_.HAS_SNI = HAS_SNI
+    util.IS_SECURETRANSPORT = True
+    util.ssl_.IS_SECURETRANSPORT = True
+
+
+def extract_from_urllib3():
+    """
+    Undo monkey-patching by :func:`inject_into_urllib3`.
+    """
+    util.ssl_.SSLContext = orig_util_SSLContext
+    util.HAS_SNI = orig_util_HAS_SNI
+    util.ssl_.HAS_SNI = orig_util_HAS_SNI
+    util.IS_SECURETRANSPORT = False
+    util.ssl_.IS_SECURETRANSPORT = False
+
+
+def _read_callback(connection_id, data_buffer, data_length_pointer):
+    """
+    SecureTransport read callback. This is called by ST to request that data
+    be returned from the socket.
+    """
+    wrapped_socket = None
+    try:
+        wrapped_socket = _connection_refs.get(connection_id)
+        if wrapped_socket is None:
+            return SecurityConst.errSSLInternal
+        base_socket = wrapped_socket.socket
+
+        requested_length = data_length_pointer[0]
+
+        timeout = wrapped_socket.gettimeout()
+        error = None
+        read_count = 0
+        buffer = (ctypes.c_char * requested_length).from_address(data_buffer)
+        buffer_view = memoryview(buffer)
+
+        try:
+            while read_count < requested_length:
+                if timeout is None or timeout >= 0:
+                    readables = util.wait_for_read([base_socket], timeout)
+                    if not readables:
+                        raise socket.error(errno.EAGAIN, 'timed out')
+
+                # We need to tell ctypes that we have a buffer that can be
+                # written to. Upsettingly, we do that like this:
+                chunk_size = base_socket.recv_into(
+                    buffer_view[read_count:requested_length]
+                )
+                read_count += chunk_size
+                if not chunk_size:
+                    if not read_count:
+                        return SecurityConst.errSSLClosedGraceful
+                    break
+        except (socket.error) as e:
+            error = e.errno
+
+            if error is not None and error != errno.EAGAIN:
+                if error == errno.ECONNRESET:
+                    return SecurityConst.errSSLClosedAbort
+                raise
+
+        data_length_pointer[0] = read_count
+
+        if read_count != requested_length:
+            return SecurityConst.errSSLWouldBlock
+
+        return 0
+    except Exception as e:
+        if wrapped_socket is not None:
+            wrapped_socket._exception = e
+        return SecurityConst.errSSLInternal
+
+
+def _write_callback(connection_id, data_buffer, data_length_pointer):
+    """
+    SecureTransport write callback. This is called by ST to request that data
+    actually be sent on the network.
+    """
+    wrapped_socket = None
+    try:
+        wrapped_socket = _connection_refs.get(connection_id)
+        if wrapped_socket is None:
+            return SecurityConst.errSSLInternal
+        base_socket = wrapped_socket.socket
+
+        bytes_to_write = data_length_pointer[0]
+        data = ctypes.string_at(data_buffer, bytes_to_write)
+
+        timeout = wrapped_socket.gettimeout()
+        error = None
+        sent = 0
+
+        try:
+            while sent < bytes_to_write:
+                if timeout is None or timeout >= 0:
+                    writables = util.wait_for_write([base_socket], timeout)
+                    if not writables:
+                        raise socket.error(errno.EAGAIN, 'timed out')
+                chunk_sent = base_socket.send(data)
+                sent += chunk_sent
+
+                # This has some needless copying here, but I'm not sure there's
+                # much value in optimising this data path.
+                data = data[chunk_sent:]
+        except (socket.error) as e:
+            error = e.errno
+
+            if error is not None and error != errno.EAGAIN:
+                if error == errno.ECONNRESET:
+                    return SecurityConst.errSSLClosedAbort
+                raise
+
+        data_length_pointer[0] = sent
+        if sent != bytes_to_write:
+            return SecurityConst.errSSLWouldBlock
+
+        return 0
+    except Exception as e:
+        if wrapped_socket is not None:
+            wrapped_socket._exception = e
+        return SecurityConst.errSSLInternal
+
+
+# We need to keep these two objects references alive: if they get GC'd while
+# in use then SecureTransport could attempt to call a function that is in freed
+# memory. That would be...uh...bad. Yeah, that's the word. Bad.
+_read_callback_pointer = Security.SSLReadFunc(_read_callback)
+_write_callback_pointer = Security.SSLWriteFunc(_write_callback)
+
+
+class WrappedSocket(object):
+    """
+    API-compatibility wrapper for Python's OpenSSL wrapped socket object.
+
+    Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage
+    collector of PyPy.
+    """
+    def __init__(self, socket):
+        self.socket = socket
+        self.context = None
+        self._makefile_refs = 0
+        self._closed = False
+        self._exception = None
+        self._keychain = None
+        self._keychain_dir = None
+        self._client_cert_chain = None
+
+        # We save off the previously-configured timeout and then set it to
+        # zero. This is done because we use select and friends to handle the
+        # timeouts, but if we leave the timeout set on the lower socket then
+        # Python will "kindly" call select on that socket again for us. Avoid
+        # that by forcing the timeout to zero.
+        self._timeout = self.socket.gettimeout()
+        self.socket.settimeout(0)
+
+    @contextlib.contextmanager
+    def _raise_on_error(self):
+        """
+        A context manager that can be used to wrap calls that do I/O from
+        SecureTransport. If any of the I/O callbacks hit an exception, this
+        context manager will correctly propagate the exception after the fact.
+        This avoids silently swallowing those exceptions.
+
+        It also correctly forces the socket closed.
+        """
+        self._exception = None
+
+        # We explicitly don't catch around this yield because in the unlikely
+        # event that an exception was hit in the block we don't want to swallow
+        # it.
+        yield
+        if self._exception is not None:
+            exception, self._exception = self._exception, None
+            self.close()
+            raise exception
+
+    def _set_ciphers(self):
+        """
+        Sets up the allowed ciphers. By default this matches the set in
+        util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done
+        custom and doesn't allow changing at this time, mostly because parsing
+        OpenSSL cipher strings is going to be a freaking nightmare.
+        """
+        ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES)
+        result = Security.SSLSetEnabledCiphers(
+            self.context, ciphers, len(CIPHER_SUITES)
+        )
+        _assert_no_error(result)
+
+    def _custom_validate(self, verify, trust_bundle):
+        """
+        Called when we have set custom validation. We do this in two cases:
+        first, when cert validation is entirely disabled; and second, when
+        using a custom trust DB.
+        """
+        # If we disabled cert validation, just say: cool.
+        if not verify:
+            return
+
+        # We want data in memory, so load it up.
+        if os.path.isfile(trust_bundle):
+            with open(trust_bundle, 'rb') as f:
+                trust_bundle = f.read()
+
+        cert_array = None
+        trust = Security.SecTrustRef()
+
+        try:
+            # Get a CFArray that contains the certs we want.
+            cert_array = _cert_array_from_pem(trust_bundle)
+
+            # Ok, now the hard part. We want to get the SecTrustRef that ST has
+            # created for this connection, shove our CAs into it, tell ST to
+            # ignore everything else it knows, and then ask if it can build a
+            # chain. This is a buuuunch of code.
+            result = Security.SSLCopyPeerTrust(
+                self.context, ctypes.byref(trust)
+            )
+            _assert_no_error(result)
+            if not trust:
+                raise ssl.SSLError("Failed to copy trust reference")
+
+            result = Security.SecTrustSetAnchorCertificates(trust, cert_array)
+            _assert_no_error(result)
+
+            result = Security.SecTrustSetAnchorCertificatesOnly(trust, True)
+            _assert_no_error(result)
+
+            trust_result = Security.SecTrustResultType()
+            result = Security.SecTrustEvaluate(
+                trust, ctypes.byref(trust_result)
+            )
+            _assert_no_error(result)
+        finally:
+            if trust:
+                CoreFoundation.CFRelease(trust)
+
+            if cert_array is None:
+                CoreFoundation.CFRelease(cert_array)
+
+        # Ok, now we can look at what the result was.
+        successes = (
+            SecurityConst.kSecTrustResultUnspecified,
+            SecurityConst.kSecTrustResultProceed
+        )
+        if trust_result.value not in successes:
+            raise ssl.SSLError(
+                "certificate verify failed, error code: %d" %
+                trust_result.value
+            )
+
+    def handshake(self,
+                  server_hostname,
+                  verify,
+                  trust_bundle,
+                  min_version,
+                  max_version,
+                  client_cert,
+                  client_key,
+                  client_key_passphrase):
+        """
+        Actually performs the TLS handshake. This is run automatically by
+        wrapped socket, and shouldn't be needed in user code.
+        """
+        # First, we do the initial bits of connection setup. We need to create
+        # a context, set its I/O funcs, and set the connection reference.
+        self.context = Security.SSLCreateContext(
+            None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType
+        )
+        result = Security.SSLSetIOFuncs(
+            self.context, _read_callback_pointer, _write_callback_pointer
+        )
+        _assert_no_error(result)
+
+        # Here we need to compute the handle to use. We do this by taking the
+        # id of self modulo 2**31 - 1. If this is already in the dictionary, we
+        # just keep incrementing by one until we find a free space.
+        with _connection_ref_lock:
+            handle = id(self) % 2147483647
+            while handle in _connection_refs:
+                handle = (handle + 1) % 2147483647
+            _connection_refs[handle] = self
+
+        result = Security.SSLSetConnection(self.context, handle)
+        _assert_no_error(result)
+
+        # If we have a server hostname, we should set that too.
+        if server_hostname:
+            if not isinstance(server_hostname, bytes):
+                server_hostname = server_hostname.encode('utf-8')
+
+            result = Security.SSLSetPeerDomainName(
+                self.context, server_hostname, len(server_hostname)
+            )
+            _assert_no_error(result)
+
+        # Setup the ciphers.
+        self._set_ciphers()
+
+        # Set the minimum and maximum TLS versions.
+        result = Security.SSLSetProtocolVersionMin(self.context, min_version)
+        _assert_no_error(result)
+        result = Security.SSLSetProtocolVersionMax(self.context, max_version)
+        _assert_no_error(result)
+
+        # If there's a trust DB, we need to use it. We do that by telling
+        # SecureTransport to break on server auth. We also do that if we don't
+        # want to validate the certs at all: we just won't actually do any
+        # authing in that case.
+        if not verify or trust_bundle is not None:
+            result = Security.SSLSetSessionOption(
+                self.context,
+                SecurityConst.kSSLSessionOptionBreakOnServerAuth,
+                True
+            )
+            _assert_no_error(result)
+
+        # If there's a client cert, we need to use it.
+        if client_cert:
+            self._keychain, self._keychain_dir = _temporary_keychain()
+            self._client_cert_chain = _load_client_cert_chain(
+                self._keychain, client_cert, client_key
+            )
+            result = Security.SSLSetCertificate(
+                self.context, self._client_cert_chain
+            )
+            _assert_no_error(result)
+
+        while True:
+            with self._raise_on_error():
+                result = Security.SSLHandshake(self.context)
+
+                if result == SecurityConst.errSSLWouldBlock:
+                    raise socket.timeout("handshake timed out")
+                elif result == SecurityConst.errSSLServerAuthCompleted:
+                    self._custom_validate(verify, trust_bundle)
+                    continue
+                else:
+                    _assert_no_error(result)
+                    break
+
+    def fileno(self):
+        return self.socket.fileno()
+
+    # Copy-pasted from Python 3.5 source code
+    def _decref_socketios(self):
+        if self._makefile_refs > 0:
+            self._makefile_refs -= 1
+        if self._closed:
+            self.close()
+
+    def recv(self, bufsiz):
+        buffer = ctypes.create_string_buffer(bufsiz)
+        bytes_read = self.recv_into(buffer, bufsiz)
+        data = buffer[:bytes_read]
+        return data
+
+    def recv_into(self, buffer, nbytes=None):
+        # Read short on EOF.
+        if self._closed:
+            return 0
+
+        if nbytes is None:
+            nbytes = len(buffer)
+
+        buffer = (ctypes.c_char * nbytes).from_buffer(buffer)
+        processed_bytes = ctypes.c_size_t(0)
+
+        with self._raise_on_error():
+            result = Security.SSLRead(
+                self.context, buffer, nbytes, ctypes.byref(processed_bytes)
+            )
+
+        # There are some result codes that we want to treat as "not always
+        # errors". Specifically, those are errSSLWouldBlock,
+        # errSSLClosedGraceful, and errSSLClosedNoNotify.
+        if (result == SecurityConst.errSSLWouldBlock):
+            # If we didn't process any bytes, then this was just a time out.
+            # However, we can get errSSLWouldBlock in situations when we *did*
+            # read some data, and in those cases we should just read "short"
+            # and return.
+            if processed_bytes.value == 0:
+                # Timed out, no data read.
+                raise socket.timeout("recv timed out")
+        elif result in (SecurityConst.errSSLClosedGraceful, SecurityConst.errSSLClosedNoNotify):
+            # The remote peer has closed this connection. We should do so as
+            # well. Note that we don't actually return here because in
+            # principle this could actually be fired along with return data.
+            # It's unlikely though.
+            self.close()
+        else:
+            _assert_no_error(result)
+
+        # Ok, we read and probably succeeded. We should return whatever data
+        # was actually read.
+        return processed_bytes.value
+
+    def settimeout(self, timeout):
+        self._timeout = timeout
+
+    def gettimeout(self):
+        return self._timeout
+
+    def send(self, data):
+        processed_bytes = ctypes.c_size_t(0)
+
+        with self._raise_on_error():
+            result = Security.SSLWrite(
+                self.context, data, len(data), ctypes.byref(processed_bytes)
+            )
+
+        if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0:
+            # Timed out
+            raise socket.timeout("send timed out")
+        else:
+            _assert_no_error(result)
+
+        # We sent, and probably succeeded. Tell them how much we sent.
+        return processed_bytes.value
+
+    def sendall(self, data):
+        total_sent = 0
+        while total_sent < len(data):
+            sent = self.send(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE])
+            total_sent += sent
+
+    def shutdown(self):
+        with self._raise_on_error():
+            Security.SSLClose(self.context)
+
+    def close(self):
+        # TODO: should I do clean shutdown here? Do I have to?
+        if self._makefile_refs < 1:
+            self._closed = True
+            if self.context:
+                CoreFoundation.CFRelease(self.context)
+                self.context = None
+            if self._client_cert_chain:
+                CoreFoundation.CFRelease(self._client_cert_chain)
+                self._client_cert_chain = None
+            if self._keychain:
+                Security.SecKeychainDelete(self._keychain)
+                CoreFoundation.CFRelease(self._keychain)
+                shutil.rmtree(self._keychain_dir)
+                self._keychain = self._keychain_dir = None
+            return self.socket.close()
+        else:
+            self._makefile_refs -= 1
+
+    def getpeercert(self, binary_form=False):
+        # Urgh, annoying.
+        #
+        # Here's how we do this:
+        #
+        # 1. Call SSLCopyPeerTrust to get hold of the trust object for this
+        #    connection.
+        # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf.
+        # 3. To get the CN, call SecCertificateCopyCommonName and process that
+        #    string so that it's of the appropriate type.
+        # 4. To get the SAN, we need to do something a bit more complex:
+        #    a. Call SecCertificateCopyValues to get the data, requesting
+        #       kSecOIDSubjectAltName.
+        #    b. Mess about with this dictionary to try to get the SANs out.
+        #
+        # This is gross. Really gross. It's going to be a few hundred LoC extra
+        # just to repeat something that SecureTransport can *already do*. So my
+        # operating assumption at this time is that what we want to do is
+        # instead to just flag to urllib3 that it shouldn't do its own hostname
+        # validation when using SecureTransport.
+        if not binary_form:
+            raise ValueError(
+                "SecureTransport only supports dumping binary certs"
+            )
+        trust = Security.SecTrustRef()
+        certdata = None
+        der_bytes = None
+
+        try:
+            # Grab the trust store.
+            result = Security.SSLCopyPeerTrust(
+                self.context, ctypes.byref(trust)
+            )
+            _assert_no_error(result)
+            if not trust:
+                # Probably we haven't done the handshake yet. No biggie.
+                return None
+
+            cert_count = Security.SecTrustGetCertificateCount(trust)
+            if not cert_count:
+                # Also a case that might happen if we haven't handshaked.
+                # Handshook? Handshaken?
+                return None
+
+            leaf = Security.SecTrustGetCertificateAtIndex(trust, 0)
+            assert leaf
+
+            # Ok, now we want the DER bytes.
+            certdata = Security.SecCertificateCopyData(leaf)
+            assert certdata
+
+            data_length = CoreFoundation.CFDataGetLength(certdata)
+            data_buffer = CoreFoundation.CFDataGetBytePtr(certdata)
+            der_bytes = ctypes.string_at(data_buffer, data_length)
+        finally:
+            if certdata:
+                CoreFoundation.CFRelease(certdata)
+            if trust:
+                CoreFoundation.CFRelease(trust)
+
+        return der_bytes
+
+    def _reuse(self):
+        self._makefile_refs += 1
+
+    def _drop(self):
+        if self._makefile_refs < 1:
+            self.close()
+        else:
+            self._makefile_refs -= 1
+
+
+if _fileobject:  # Platform-specific: Python 2
+    def makefile(self, mode, bufsize=-1):
+        self._makefile_refs += 1
+        return _fileobject(self, mode, bufsize, close=True)
+else:  # Platform-specific: Python 3
+    def makefile(self, mode="r", buffering=None, *args, **kwargs):
+        # We disable buffering with SecureTransport because it conflicts with
+        # the buffering that ST does internally (see issue #1153 for more).
+        buffering = 0
+        return backport_makefile(self, mode, buffering, *args, **kwargs)
+
+WrappedSocket.makefile = makefile
+
+
+class SecureTransportContext(object):
+    """
+    I am a wrapper class for the SecureTransport library, to translate the
+    interface of the standard library ``SSLContext`` object to calls into
+    SecureTransport.
+    """
+    def __init__(self, protocol):
+        self._min_version, self._max_version = _protocol_to_min_max[protocol]
+        self._options = 0
+        self._verify = False
+        self._trust_bundle = None
+        self._client_cert = None
+        self._client_key = None
+        self._client_key_passphrase = None
+
+    @property
+    def check_hostname(self):
+        """
+        SecureTransport cannot have its hostname checking disabled. For more,
+        see the comment on getpeercert() in this file.
+        """
+        return True
+
+    @check_hostname.setter
+    def check_hostname(self, value):
+        """
+        SecureTransport cannot have its hostname checking disabled. For more,
+        see the comment on getpeercert() in this file.
+        """
+        pass
+
+    @property
+    def options(self):
+        # TODO: Well, crap.
+        #
+        # So this is the bit of the code that is the most likely to cause us
+        # trouble. Essentially we need to enumerate all of the SSL options that
+        # users might want to use and try to see if we can sensibly translate
+        # them, or whether we should just ignore them.
+        return self._options
+
+    @options.setter
+    def options(self, value):
+        # TODO: Update in line with above.
+        self._options = value
+
+    @property
+    def verify_mode(self):
+        return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE
+
+    @verify_mode.setter
+    def verify_mode(self, value):
+        self._verify = True if value == ssl.CERT_REQUIRED else False
+
+    def set_default_verify_paths(self):
+        # So, this has to do something a bit weird. Specifically, what it does
+        # is nothing.
+        #
+        # This means that, if we had previously had load_verify_locations
+        # called, this does not undo that. We need to do that because it turns
+        # out that the rest of the urllib3 code will attempt to load the
+        # default verify paths if it hasn't been told about any paths, even if
+        # the context itself was sometime earlier. We resolve that by just
+        # ignoring it.
+        pass
+
+    def load_default_certs(self):
+        return self.set_default_verify_paths()
+
+    def set_ciphers(self, ciphers):
+        # For now, we just require the default cipher string.
+        if ciphers != util.ssl_.DEFAULT_CIPHERS:
+            raise ValueError(
+                "SecureTransport doesn't support custom cipher strings"
+            )
+
+    def load_verify_locations(self, cafile=None, capath=None, cadata=None):
+        # OK, we only really support cadata and cafile.
+        if capath is not None:
+            raise ValueError(
+                "SecureTransport does not support cert directories"
+            )
+
+        self._trust_bundle = cafile or cadata
+
+    def load_cert_chain(self, certfile, keyfile=None, password=None):
+        self._client_cert = certfile
+        self._client_key = keyfile
+        self._client_cert_passphrase = password
+
+    def wrap_socket(self, sock, server_side=False,
+                    do_handshake_on_connect=True, suppress_ragged_eofs=True,
+                    server_hostname=None):
+        # So, what do we do here? Firstly, we assert some properties. This is a
+        # stripped down shim, so there is some functionality we don't support.
+        # See PEP 543 for the real deal.
+        assert not server_side
+        assert do_handshake_on_connect
+        assert suppress_ragged_eofs
+
+        # Ok, we're good to go. Now we want to create the wrapped socket object
+        # and store it in the appropriate place.
+        wrapped_socket = WrappedSocket(sock)
+
+        # Now we can handshake
+        wrapped_socket.handshake(
+            server_hostname, self._verify, self._trust_bundle,
+            self._min_version, self._max_version, self._client_cert,
+            self._client_key, self._client_key_passphrase
+        )
+        return wrapped_socket
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/socks.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/socks.py
new file mode 100644
index 0000000000000000000000000000000000000000..39e92fde19b1332a7c90f6b6afe2a69601e9a66d
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/socks.py
@@ -0,0 +1,188 @@
+# -*- coding: utf-8 -*-
+"""
+This module contains provisional support for SOCKS proxies from within
+urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and
+SOCKS5. To enable its functionality, either install PySocks or install this
+module with the ``socks`` extra.
+
+The SOCKS implementation supports the full range of urllib3 features. It also
+supports the following SOCKS features:
+
+- SOCKS4
+- SOCKS4a
+- SOCKS5
+- Usernames and passwords for the SOCKS proxy
+
+Known Limitations:
+
+- Currently PySocks does not support contacting remote websites via literal
+  IPv6 addresses. Any such connection attempt will fail. You must use a domain
+  name.
+- Currently PySocks does not support IPv6 connections to the SOCKS proxy. Any
+  such connection attempt will fail.
+"""
+from __future__ import absolute_import
+
+try:
+    import socks
+except ImportError:
+    import warnings
+    from ..exceptions import DependencyWarning
+
+    warnings.warn((
+        'SOCKS support in urllib3 requires the installation of optional '
+        'dependencies: specifically, PySocks.  For more information, see '
+        'https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies'
+        ),
+        DependencyWarning
+    )
+    raise
+
+from socket import error as SocketError, timeout as SocketTimeout
+
+from ..connection import (
+    HTTPConnection, HTTPSConnection
+)
+from ..connectionpool import (
+    HTTPConnectionPool, HTTPSConnectionPool
+)
+from ..exceptions import ConnectTimeoutError, NewConnectionError
+from ..poolmanager import PoolManager
+from ..util.url import parse_url
+
+try:
+    import ssl
+except ImportError:
+    ssl = None
+
+
+class SOCKSConnection(HTTPConnection):
+    """
+    A plain-text HTTP connection that connects via a SOCKS proxy.
+    """
+    def __init__(self, *args, **kwargs):
+        self._socks_options = kwargs.pop('_socks_options')
+        super(SOCKSConnection, self).__init__(*args, **kwargs)
+
+    def _new_conn(self):
+        """
+        Establish a new connection via the SOCKS proxy.
+        """
+        extra_kw = {}
+        if self.source_address:
+            extra_kw['source_address'] = self.source_address
+
+        if self.socket_options:
+            extra_kw['socket_options'] = self.socket_options
+
+        try:
+            conn = socks.create_connection(
+                (self.host, self.port),
+                proxy_type=self._socks_options['socks_version'],
+                proxy_addr=self._socks_options['proxy_host'],
+                proxy_port=self._socks_options['proxy_port'],
+                proxy_username=self._socks_options['username'],
+                proxy_password=self._socks_options['password'],
+                proxy_rdns=self._socks_options['rdns'],
+                timeout=self.timeout,
+                **extra_kw
+            )
+
+        except SocketTimeout as e:
+            raise ConnectTimeoutError(
+                self, "Connection to %s timed out. (connect timeout=%s)" %
+                (self.host, self.timeout))
+
+        except socks.ProxyError as e:
+            # This is fragile as hell, but it seems to be the only way to raise
+            # useful errors here.
+            if e.socket_err:
+                error = e.socket_err
+                if isinstance(error, SocketTimeout):
+                    raise ConnectTimeoutError(
+                        self,
+                        "Connection to %s timed out. (connect timeout=%s)" %
+                        (self.host, self.timeout)
+                    )
+                else:
+                    raise NewConnectionError(
+                        self,
+                        "Failed to establish a new connection: %s" % error
+                    )
+            else:
+                raise NewConnectionError(
+                    self,
+                    "Failed to establish a new connection: %s" % e
+                )
+
+        except SocketError as e:  # Defensive: PySocks should catch all these.
+            raise NewConnectionError(
+                self, "Failed to establish a new connection: %s" % e)
+
+        return conn
+
+
+# We don't need to duplicate the Verified/Unverified distinction from
+# urllib3/connection.py here because the HTTPSConnection will already have been
+# correctly set to either the Verified or Unverified form by that module. This
+# means the SOCKSHTTPSConnection will automatically be the correct type.
+class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection):
+    pass
+
+
+class SOCKSHTTPConnectionPool(HTTPConnectionPool):
+    ConnectionCls = SOCKSConnection
+
+
+class SOCKSHTTPSConnectionPool(HTTPSConnectionPool):
+    ConnectionCls = SOCKSHTTPSConnection
+
+
+class SOCKSProxyManager(PoolManager):
+    """
+    A version of the urllib3 ProxyManager that routes connections via the
+    defined SOCKS proxy.
+    """
+    pool_classes_by_scheme = {
+        'http': SOCKSHTTPConnectionPool,
+        'https': SOCKSHTTPSConnectionPool,
+    }
+
+    def __init__(self, proxy_url, username=None, password=None,
+                 num_pools=10, headers=None, **connection_pool_kw):
+        parsed = parse_url(proxy_url)
+
+        if parsed.scheme == 'socks5':
+            socks_version = socks.PROXY_TYPE_SOCKS5
+            rdns = False
+        elif parsed.scheme == 'socks5h':
+            socks_version = socks.PROXY_TYPE_SOCKS5
+            rdns = True
+        elif parsed.scheme == 'socks4':
+            socks_version = socks.PROXY_TYPE_SOCKS4
+            rdns = False
+        elif parsed.scheme == 'socks4a':
+            socks_version = socks.PROXY_TYPE_SOCKS4
+            rdns = True
+        else:
+            raise ValueError(
+                "Unable to determine SOCKS version from %s" % proxy_url
+            )
+
+        self.proxy_url = proxy_url
+
+        socks_options = {
+            'socks_version': socks_version,
+            'proxy_host': parsed.host,
+            'proxy_port': parsed.port,
+            'username': username,
+            'password': password,
+            'rdns': rdns
+        }
+        connection_pool_kw['_socks_options'] = socks_options
+
+        super(SOCKSProxyManager, self).__init__(
+            num_pools, headers, **connection_pool_kw
+        )
+
+        self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/exceptions.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/exceptions.py
new file mode 100644
index 0000000000000000000000000000000000000000..6c4be58106be12223017c6bd3d40fb4144be552d
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/exceptions.py
@@ -0,0 +1,246 @@
+from __future__ import absolute_import
+from .packages.six.moves.http_client import (
+    IncompleteRead as httplib_IncompleteRead
+)
+# Base Exceptions
+
+
+class HTTPError(Exception):
+    "Base exception used by this module."
+    pass
+
+
+class HTTPWarning(Warning):
+    "Base warning used by this module."
+    pass
+
+
+class PoolError(HTTPError):
+    "Base exception for errors caused within a pool."
+    def __init__(self, pool, message):
+        self.pool = pool
+        HTTPError.__init__(self, "%s: %s" % (pool, message))
+
+    def __reduce__(self):
+        # For pickling purposes.
+        return self.__class__, (None, None)
+
+
+class RequestError(PoolError):
+    "Base exception for PoolErrors that have associated URLs."
+    def __init__(self, pool, url, message):
+        self.url = url
+        PoolError.__init__(self, pool, message)
+
+    def __reduce__(self):
+        # For pickling purposes.
+        return self.__class__, (None, self.url, None)
+
+
+class SSLError(HTTPError):
+    "Raised when SSL certificate fails in an HTTPS connection."
+    pass
+
+
+class ProxyError(HTTPError):
+    "Raised when the connection to a proxy fails."
+    pass
+
+
+class DecodeError(HTTPError):
+    "Raised when automatic decoding based on Content-Type fails."
+    pass
+
+
+class ProtocolError(HTTPError):
+    "Raised when something unexpected happens mid-request/response."
+    pass
+
+
+#: Renamed to ProtocolError but aliased for backwards compatibility.
+ConnectionError = ProtocolError
+
+
+# Leaf Exceptions
+
+class MaxRetryError(RequestError):
+    """Raised when the maximum number of retries is exceeded.
+
+    :param pool: The connection pool
+    :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool`
+    :param string url: The requested Url
+    :param exceptions.Exception reason: The underlying error
+
+    """
+
+    def __init__(self, pool, url, reason=None):
+        self.reason = reason
+
+        message = "Max retries exceeded with url: %s (Caused by %r)" % (
+            url, reason)
+
+        RequestError.__init__(self, pool, url, message)
+
+
+class HostChangedError(RequestError):
+    "Raised when an existing pool gets a request for a foreign host."
+
+    def __init__(self, pool, url, retries=3):
+        message = "Tried to open a foreign host with url: %s" % url
+        RequestError.__init__(self, pool, url, message)
+        self.retries = retries
+
+
+class TimeoutStateError(HTTPError):
+    """ Raised when passing an invalid state to a timeout """
+    pass
+
+
+class TimeoutError(HTTPError):
+    """ Raised when a socket timeout error occurs.
+
+    Catching this error will catch both :exc:`ReadTimeoutErrors
+    <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`.
+    """
+    pass
+
+
+class ReadTimeoutError(TimeoutError, RequestError):
+    "Raised when a socket timeout occurs while receiving data from a server"
+    pass
+
+
+# This timeout error does not have a URL attached and needs to inherit from the
+# base HTTPError
+class ConnectTimeoutError(TimeoutError):
+    "Raised when a socket timeout occurs while connecting to a server"
+    pass
+
+
+class NewConnectionError(ConnectTimeoutError, PoolError):
+    "Raised when we fail to establish a new connection. Usually ECONNREFUSED."
+    pass
+
+
+class EmptyPoolError(PoolError):
+    "Raised when a pool runs out of connections and no more are allowed."
+    pass
+
+
+class ClosedPoolError(PoolError):
+    "Raised when a request enters a pool after the pool has been closed."
+    pass
+
+
+class LocationValueError(ValueError, HTTPError):
+    "Raised when there is something wrong with a given URL input."
+    pass
+
+
+class LocationParseError(LocationValueError):
+    "Raised when get_host or similar fails to parse the URL input."
+
+    def __init__(self, location):
+        message = "Failed to parse: %s" % location
+        HTTPError.__init__(self, message)
+
+        self.location = location
+
+
+class ResponseError(HTTPError):
+    "Used as a container for an error reason supplied in a MaxRetryError."
+    GENERIC_ERROR = 'too many error responses'
+    SPECIFIC_ERROR = 'too many {status_code} error responses'
+
+
+class SecurityWarning(HTTPWarning):
+    "Warned when perfoming security reducing actions"
+    pass
+
+
+class SubjectAltNameWarning(SecurityWarning):
+    "Warned when connecting to a host with a certificate missing a SAN."
+    pass
+
+
+class InsecureRequestWarning(SecurityWarning):
+    "Warned when making an unverified HTTPS request."
+    pass
+
+
+class SystemTimeWarning(SecurityWarning):
+    "Warned when system time is suspected to be wrong"
+    pass
+
+
+class InsecurePlatformWarning(SecurityWarning):
+    "Warned when certain SSL configuration is not available on a platform."
+    pass
+
+
+class SNIMissingWarning(HTTPWarning):
+    "Warned when making a HTTPS request without SNI available."
+    pass
+
+
+class DependencyWarning(HTTPWarning):
+    """
+    Warned when an attempt is made to import a module with missing optional
+    dependencies.
+    """
+    pass
+
+
+class ResponseNotChunked(ProtocolError, ValueError):
+    "Response needs to be chunked in order to read it as chunks."
+    pass
+
+
+class BodyNotHttplibCompatible(HTTPError):
+    """
+    Body should be httplib.HTTPResponse like (have an fp attribute which
+    returns raw chunks) for read_chunked().
+    """
+    pass
+
+
+class IncompleteRead(HTTPError, httplib_IncompleteRead):
+    """
+    Response length doesn't match expected Content-Length
+
+    Subclass of http_client.IncompleteRead to allow int value
+    for `partial` to avoid creating large objects on streamed
+    reads.
+    """
+    def __init__(self, partial, expected):
+        super(IncompleteRead, self).__init__(partial, expected)
+
+    def __repr__(self):
+        return ('IncompleteRead(%i bytes read, '
+                '%i more expected)' % (self.partial, self.expected))
+
+
+class InvalidHeader(HTTPError):
+    "The header provided was somehow invalid."
+    pass
+
+
+class ProxySchemeUnknown(AssertionError, ValueError):
+    "ProxyManager does not support the supplied scheme"
+    # TODO(t-8ch): Stop inheriting from AssertionError in v2.0.
+
+    def __init__(self, scheme):
+        message = "Not supported proxy scheme %s" % scheme
+        super(ProxySchemeUnknown, self).__init__(message)
+
+
+class HeaderParsingError(HTTPError):
+    "Raised by assert_header_parsing, but we convert it to a log.warning statement."
+    def __init__(self, defects, unparsed_data):
+        message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data)
+        super(HeaderParsingError, self).__init__(message)
+
+
+class UnrewindableBodyError(HTTPError):
+    "urllib3 encountered an error when trying to rewind a body"
+    pass
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/fields.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/fields.py
new file mode 100644
index 0000000000000000000000000000000000000000..19b0ae0c88765ace36378231252cbe4b8be8af56
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/fields.py
@@ -0,0 +1,178 @@
+from __future__ import absolute_import
+import email.utils
+import mimetypes
+
+from .packages import six
+
+
+def guess_content_type(filename, default='application/octet-stream'):
+    """
+    Guess the "Content-Type" of a file.
+
+    :param filename:
+        The filename to guess the "Content-Type" of using :mod:`mimetypes`.
+    :param default:
+        If no "Content-Type" can be guessed, default to `default`.
+    """
+    if filename:
+        return mimetypes.guess_type(filename)[0] or default
+    return default
+
+
+def format_header_param(name, value):
+    """
+    Helper function to format and quote a single header parameter.
+
+    Particularly useful for header parameters which might contain
+    non-ASCII values, like file names. This follows RFC 2231, as
+    suggested by RFC 2388 Section 4.4.
+
+    :param name:
+        The name of the parameter, a string expected to be ASCII only.
+    :param value:
+        The value of the parameter, provided as a unicode string.
+    """
+    if not any(ch in value for ch in '"\\\r\n'):
+        result = '%s="%s"' % (name, value)
+        try:
+            result.encode('ascii')
+        except (UnicodeEncodeError, UnicodeDecodeError):
+            pass
+        else:
+            return result
+    if not six.PY3 and isinstance(value, six.text_type):  # Python 2:
+        value = value.encode('utf-8')
+    value = email.utils.encode_rfc2231(value, 'utf-8')
+    value = '%s*=%s' % (name, value)
+    return value
+
+
+class RequestField(object):
+    """
+    A data container for request body parameters.
+
+    :param name:
+        The name of this request field.
+    :param data:
+        The data/value body.
+    :param filename:
+        An optional filename of the request field.
+    :param headers:
+        An optional dict-like object of headers to initially use for the field.
+    """
+    def __init__(self, name, data, filename=None, headers=None):
+        self._name = name
+        self._filename = filename
+        self.data = data
+        self.headers = {}
+        if headers:
+            self.headers = dict(headers)
+
+    @classmethod
+    def from_tuples(cls, fieldname, value):
+        """
+        A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters.
+
+        Supports constructing :class:`~urllib3.fields.RequestField` from
+        parameter of key/value strings AND key/filetuple. A filetuple is a
+        (filename, data, MIME type) tuple where the MIME type is optional.
+        For example::
+
+            'foo': 'bar',
+            'fakefile': ('foofile.txt', 'contents of foofile'),
+            'realfile': ('barfile.txt', open('realfile').read()),
+            'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'),
+            'nonamefile': 'contents of nonamefile field',
+
+        Field names and filenames must be unicode.
+        """
+        if isinstance(value, tuple):
+            if len(value) == 3:
+                filename, data, content_type = value
+            else:
+                filename, data = value
+                content_type = guess_content_type(filename)
+        else:
+            filename = None
+            content_type = None
+            data = value
+
+        request_param = cls(fieldname, data, filename=filename)
+        request_param.make_multipart(content_type=content_type)
+
+        return request_param
+
+    def _render_part(self, name, value):
+        """
+        Overridable helper function to format a single header parameter.
+
+        :param name:
+            The name of the parameter, a string expected to be ASCII only.
+        :param value:
+            The value of the parameter, provided as a unicode string.
+        """
+        return format_header_param(name, value)
+
+    def _render_parts(self, header_parts):
+        """
+        Helper function to format and quote a single header.
+
+        Useful for single headers that are composed of multiple items. E.g.,
+        'Content-Disposition' fields.
+
+        :param header_parts:
+            A sequence of (k, v) typles or a :class:`dict` of (k, v) to format
+            as `k1="v1"; k2="v2"; ...`.
+        """
+        parts = []
+        iterable = header_parts
+        if isinstance(header_parts, dict):
+            iterable = header_parts.items()
+
+        for name, value in iterable:
+            if value is not None:
+                parts.append(self._render_part(name, value))
+
+        return '; '.join(parts)
+
+    def render_headers(self):
+        """
+        Renders the headers for this request field.
+        """
+        lines = []
+
+        sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location']
+        for sort_key in sort_keys:
+            if self.headers.get(sort_key, False):
+                lines.append('%s: %s' % (sort_key, self.headers[sort_key]))
+
+        for header_name, header_value in self.headers.items():
+            if header_name not in sort_keys:
+                if header_value:
+                    lines.append('%s: %s' % (header_name, header_value))
+
+        lines.append('\r\n')
+        return '\r\n'.join(lines)
+
+    def make_multipart(self, content_disposition=None, content_type=None,
+                       content_location=None):
+        """
+        Makes this request field into a multipart request field.
+
+        This method overrides "Content-Disposition", "Content-Type" and
+        "Content-Location" headers to the request parameter.
+
+        :param content_type:
+            The 'Content-Type' of the request body.
+        :param content_location:
+            The 'Content-Location' of the request body.
+
+        """
+        self.headers['Content-Disposition'] = content_disposition or 'form-data'
+        self.headers['Content-Disposition'] += '; '.join([
+            '', self._render_parts(
+                (('name', self._name), ('filename', self._filename))
+            )
+        ])
+        self.headers['Content-Type'] = content_type
+        self.headers['Content-Location'] = content_location
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/filepost.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/filepost.py
new file mode 100644
index 0000000000000000000000000000000000000000..cd11cee4644711d7ede77e5c01974f45015b5746
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/filepost.py
@@ -0,0 +1,94 @@
+from __future__ import absolute_import
+import codecs
+
+from uuid import uuid4
+from io import BytesIO
+
+from .packages import six
+from .packages.six import b
+from .fields import RequestField
+
+writer = codecs.lookup('utf-8')[3]
+
+
+def choose_boundary():
+    """
+    Our embarrassingly-simple replacement for mimetools.choose_boundary.
+    """
+    return uuid4().hex
+
+
+def iter_field_objects(fields):
+    """
+    Iterate over fields.
+
+    Supports list of (k, v) tuples and dicts, and lists of
+    :class:`~urllib3.fields.RequestField`.
+
+    """
+    if isinstance(fields, dict):
+        i = six.iteritems(fields)
+    else:
+        i = iter(fields)
+
+    for field in i:
+        if isinstance(field, RequestField):
+            yield field
+        else:
+            yield RequestField.from_tuples(*field)
+
+
+def iter_fields(fields):
+    """
+    .. deprecated:: 1.6
+
+    Iterate over fields.
+
+    The addition of :class:`~urllib3.fields.RequestField` makes this function
+    obsolete. Instead, use :func:`iter_field_objects`, which returns
+    :class:`~urllib3.fields.RequestField` objects.
+
+    Supports list of (k, v) tuples and dicts.
+    """
+    if isinstance(fields, dict):
+        return ((k, v) for k, v in six.iteritems(fields))
+
+    return ((k, v) for k, v in fields)
+
+
+def encode_multipart_formdata(fields, boundary=None):
+    """
+    Encode a dictionary of ``fields`` using the multipart/form-data MIME format.
+
+    :param fields:
+        Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`).
+
+    :param boundary:
+        If not specified, then a random boundary will be generated using
+        :func:`mimetools.choose_boundary`.
+    """
+    body = BytesIO()
+    if boundary is None:
+        boundary = choose_boundary()
+
+    for field in iter_field_objects(fields):
+        body.write(b('--%s\r\n' % (boundary)))
+
+        writer(body).write(field.render_headers())
+        data = field.data
+
+        if isinstance(data, int):
+            data = str(data)  # Backwards compatibility
+
+        if isinstance(data, six.text_type):
+            writer(body).write(data)
+        else:
+            body.write(data)
+
+        body.write(b'\r\n')
+
+    body.write(b('--%s--\r\n' % (boundary)))
+
+    content_type = str('multipart/form-data; boundary=%s' % boundary)
+
+    return body.getvalue(), content_type
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/__init__.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..170e974c15746c3aa6e960d3c7a53981459a528d
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/__init__.py
@@ -0,0 +1,5 @@
+from __future__ import absolute_import
+
+from . import ssl_match_hostname
+
+__all__ = ('ssl_match_hostname', )
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/backports/__init__.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/backports/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/backports/makefile.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/backports/makefile.py
new file mode 100644
index 0000000000000000000000000000000000000000..75b80dcf8465cc6d2ce5692eaaa62b60555db60e
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/backports/makefile.py
@@ -0,0 +1,53 @@
+# -*- coding: utf-8 -*-
+"""
+backports.makefile
+~~~~~~~~~~~~~~~~~~
+
+Backports the Python 3 ``socket.makefile`` method for use with anything that
+wants to create a "fake" socket object.
+"""
+import io
+
+from socket import SocketIO
+
+
+def backport_makefile(self, mode="r", buffering=None, encoding=None,
+                      errors=None, newline=None):
+    """
+    Backport of ``socket.makefile`` from Python 3.5.
+    """
+    if not set(mode) <= set(["r", "w", "b"]):
+        raise ValueError(
+            "invalid mode %r (only r, w, b allowed)" % (mode,)
+        )
+    writing = "w" in mode
+    reading = "r" in mode or not writing
+    assert reading or writing
+    binary = "b" in mode
+    rawmode = ""
+    if reading:
+        rawmode += "r"
+    if writing:
+        rawmode += "w"
+    raw = SocketIO(self, rawmode)
+    self._makefile_refs += 1
+    if buffering is None:
+        buffering = -1
+    if buffering < 0:
+        buffering = io.DEFAULT_BUFFER_SIZE
+    if buffering == 0:
+        if not binary:
+            raise ValueError("unbuffered streams must be binary")
+        return raw
+    if reading and writing:
+        buffer = io.BufferedRWPair(raw, raw, buffering)
+    elif reading:
+        buffer = io.BufferedReader(raw, buffering)
+    else:
+        assert writing
+        buffer = io.BufferedWriter(raw, buffering)
+    if binary:
+        return buffer
+    text = io.TextIOWrapper(buffer, encoding, errors, newline)
+    text.mode = mode
+    return text
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ordered_dict.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ordered_dict.py
new file mode 100644
index 0000000000000000000000000000000000000000..4479363cc45b5c7e0588072ccc19cab03fecce28
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ordered_dict.py
@@ -0,0 +1,259 @@
+# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy.
+# Passes Python2.7's test suite and incorporates all the latest updates.
+# Copyright 2009 Raymond Hettinger, released under the MIT License.
+# http://code.activestate.com/recipes/576693/
+try:
+    from thread import get_ident as _get_ident
+except ImportError:
+    from dummy_thread import get_ident as _get_ident
+
+try:
+    from _abcoll import KeysView, ValuesView, ItemsView
+except ImportError:
+    pass
+
+
+class OrderedDict(dict):
+    'Dictionary that remembers insertion order'
+    # An inherited dict maps keys to values.
+    # The inherited dict provides __getitem__, __len__, __contains__, and get.
+    # The remaining methods are order-aware.
+    # Big-O running times for all methods are the same as for regular dictionaries.
+
+    # The internal self.__map dictionary maps keys to links in a doubly linked list.
+    # The circular doubly linked list starts and ends with a sentinel element.
+    # The sentinel element never gets deleted (this simplifies the algorithm).
+    # Each link is stored as a list of length three:  [PREV, NEXT, KEY].
+
+    def __init__(self, *args, **kwds):
+        '''Initialize an ordered dictionary.  Signature is the same as for
+        regular dictionaries, but keyword arguments are not recommended
+        because their insertion order is arbitrary.
+
+        '''
+        if len(args) > 1:
+            raise TypeError('expected at most 1 arguments, got %d' % len(args))
+        try:
+            self.__root
+        except AttributeError:
+            self.__root = root = []                     # sentinel node
+            root[:] = [root, root, None]
+            self.__map = {}
+        self.__update(*args, **kwds)
+
+    def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
+        'od.__setitem__(i, y) <==> od[i]=y'
+        # Setting a new item creates a new link which goes at the end of the linked
+        # list, and the inherited dictionary is updated with the new key/value pair.
+        if key not in self:
+            root = self.__root
+            last = root[0]
+            last[1] = root[0] = self.__map[key] = [last, root, key]
+        dict_setitem(self, key, value)
+
+    def __delitem__(self, key, dict_delitem=dict.__delitem__):
+        'od.__delitem__(y) <==> del od[y]'
+        # Deleting an existing item uses self.__map to find the link which is
+        # then removed by updating the links in the predecessor and successor nodes.
+        dict_delitem(self, key)
+        link_prev, link_next, key = self.__map.pop(key)
+        link_prev[1] = link_next
+        link_next[0] = link_prev
+
+    def __iter__(self):
+        'od.__iter__() <==> iter(od)'
+        root = self.__root
+        curr = root[1]
+        while curr is not root:
+            yield curr[2]
+            curr = curr[1]
+
+    def __reversed__(self):
+        'od.__reversed__() <==> reversed(od)'
+        root = self.__root
+        curr = root[0]
+        while curr is not root:
+            yield curr[2]
+            curr = curr[0]
+
+    def clear(self):
+        'od.clear() -> None.  Remove all items from od.'
+        try:
+            for node in self.__map.itervalues():
+                del node[:]
+            root = self.__root
+            root[:] = [root, root, None]
+            self.__map.clear()
+        except AttributeError:
+            pass
+        dict.clear(self)
+
+    def popitem(self, last=True):
+        '''od.popitem() -> (k, v), return and remove a (key, value) pair.
+        Pairs are returned in LIFO order if last is true or FIFO order if false.
+
+        '''
+        if not self:
+            raise KeyError('dictionary is empty')
+        root = self.__root
+        if last:
+            link = root[0]
+            link_prev = link[0]
+            link_prev[1] = root
+            root[0] = link_prev
+        else:
+            link = root[1]
+            link_next = link[1]
+            root[1] = link_next
+            link_next[0] = root
+        key = link[2]
+        del self.__map[key]
+        value = dict.pop(self, key)
+        return key, value
+
+    # -- the following methods do not depend on the internal structure --
+
+    def keys(self):
+        'od.keys() -> list of keys in od'
+        return list(self)
+
+    def values(self):
+        'od.values() -> list of values in od'
+        return [self[key] for key in self]
+
+    def items(self):
+        'od.items() -> list of (key, value) pairs in od'
+        return [(key, self[key]) for key in self]
+
+    def iterkeys(self):
+        'od.iterkeys() -> an iterator over the keys in od'
+        return iter(self)
+
+    def itervalues(self):
+        'od.itervalues -> an iterator over the values in od'
+        for k in self:
+            yield self[k]
+
+    def iteritems(self):
+        'od.iteritems -> an iterator over the (key, value) items in od'
+        for k in self:
+            yield (k, self[k])
+
+    def update(*args, **kwds):
+        '''od.update(E, **F) -> None.  Update od from dict/iterable E and F.
+
+        If E is a dict instance, does:           for k in E: od[k] = E[k]
+        If E has a .keys() method, does:         for k in E.keys(): od[k] = E[k]
+        Or if E is an iterable of items, does:   for k, v in E: od[k] = v
+        In either case, this is followed by:     for k, v in F.items(): od[k] = v
+
+        '''
+        if len(args) > 2:
+            raise TypeError('update() takes at most 2 positional '
+                            'arguments (%d given)' % (len(args),))
+        elif not args:
+            raise TypeError('update() takes at least 1 argument (0 given)')
+        self = args[0]
+        # Make progressively weaker assumptions about "other"
+        other = ()
+        if len(args) == 2:
+            other = args[1]
+        if isinstance(other, dict):
+            for key in other:
+                self[key] = other[key]
+        elif hasattr(other, 'keys'):
+            for key in other.keys():
+                self[key] = other[key]
+        else:
+            for key, value in other:
+                self[key] = value
+        for key, value in kwds.items():
+            self[key] = value
+
+    __update = update  # let subclasses override update without breaking __init__
+
+    __marker = object()
+
+    def pop(self, key, default=__marker):
+        '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value.
+        If key is not found, d is returned if given, otherwise KeyError is raised.
+
+        '''
+        if key in self:
+            result = self[key]
+            del self[key]
+            return result
+        if default is self.__marker:
+            raise KeyError(key)
+        return default
+
+    def setdefault(self, key, default=None):
+        'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'
+        if key in self:
+            return self[key]
+        self[key] = default
+        return default
+
+    def __repr__(self, _repr_running={}):
+        'od.__repr__() <==> repr(od)'
+        call_key = id(self), _get_ident()
+        if call_key in _repr_running:
+            return '...'
+        _repr_running[call_key] = 1
+        try:
+            if not self:
+                return '%s()' % (self.__class__.__name__,)
+            return '%s(%r)' % (self.__class__.__name__, self.items())
+        finally:
+            del _repr_running[call_key]
+
+    def __reduce__(self):
+        'Return state information for pickling'
+        items = [[k, self[k]] for k in self]
+        inst_dict = vars(self).copy()
+        for k in vars(OrderedDict()):
+            inst_dict.pop(k, None)
+        if inst_dict:
+            return (self.__class__, (items,), inst_dict)
+        return self.__class__, (items,)
+
+    def copy(self):
+        'od.copy() -> a shallow copy of od'
+        return self.__class__(self)
+
+    @classmethod
+    def fromkeys(cls, iterable, value=None):
+        '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
+        and values equal to v (which defaults to None).
+
+        '''
+        d = cls()
+        for key in iterable:
+            d[key] = value
+        return d
+
+    def __eq__(self, other):
+        '''od.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
+        while comparison to a regular mapping is order-insensitive.
+
+        '''
+        if isinstance(other, OrderedDict):
+            return len(self)==len(other) and self.items() == other.items()
+        return dict.__eq__(self, other)
+
+    def __ne__(self, other):
+        return not self == other
+
+    # -- the following methods are only used in Python 2.7 --
+
+    def viewkeys(self):
+        "od.viewkeys() -> a set-like object providing a view on od's keys"
+        return KeysView(self)
+
+    def viewvalues(self):
+        "od.viewvalues() -> an object providing a view on od's values"
+        return ValuesView(self)
+
+    def viewitems(self):
+        "od.viewitems() -> a set-like object providing a view on od's items"
+        return ItemsView(self)
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/six.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/six.py
new file mode 100644
index 0000000000000000000000000000000000000000..190c0239cd7d7af82a6e0cbc8d68053fa2e3dfaf
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/six.py
@@ -0,0 +1,868 @@
+"""Utilities for writing code that runs on Python 2 and 3"""
+
+# Copyright (c) 2010-2015 Benjamin Peterson
+#
+# 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.
+
+from __future__ import absolute_import
+
+import functools
+import itertools
+import operator
+import sys
+import types
+
+__author__ = "Benjamin Peterson <benjamin@python.org>"
+__version__ = "1.10.0"
+
+
+# Useful for very coarse version differentiation.
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+PY34 = sys.version_info[0:2] >= (3, 4)
+
+if PY3:
+    string_types = str,
+    integer_types = int,
+    class_types = type,
+    text_type = str
+    binary_type = bytes
+
+    MAXSIZE = sys.maxsize
+else:
+    string_types = basestring,
+    integer_types = (int, long)
+    class_types = (type, types.ClassType)
+    text_type = unicode
+    binary_type = str
+
+    if sys.platform.startswith("java"):
+        # Jython always uses 32 bits.
+        MAXSIZE = int((1 << 31) - 1)
+    else:
+        # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
+        class X(object):
+
+            def __len__(self):
+                return 1 << 31
+        try:
+            len(X())
+        except OverflowError:
+            # 32-bit
+            MAXSIZE = int((1 << 31) - 1)
+        else:
+            # 64-bit
+            MAXSIZE = int((1 << 63) - 1)
+        del X
+
+
+def _add_doc(func, doc):
+    """Add documentation to a function."""
+    func.__doc__ = doc
+
+
+def _import_module(name):
+    """Import module, returning the module after the last dot."""
+    __import__(name)
+    return sys.modules[name]
+
+
+class _LazyDescr(object):
+
+    def __init__(self, name):
+        self.name = name
+
+    def __get__(self, obj, tp):
+        result = self._resolve()
+        setattr(obj, self.name, result)  # Invokes __set__.
+        try:
+            # This is a bit ugly, but it avoids running this again by
+            # removing this descriptor.
+            delattr(obj.__class__, self.name)
+        except AttributeError:
+            pass
+        return result
+
+
+class MovedModule(_LazyDescr):
+
+    def __init__(self, name, old, new=None):
+        super(MovedModule, self).__init__(name)
+        if PY3:
+            if new is None:
+                new = name
+            self.mod = new
+        else:
+            self.mod = old
+
+    def _resolve(self):
+        return _import_module(self.mod)
+
+    def __getattr__(self, attr):
+        _module = self._resolve()
+        value = getattr(_module, attr)
+        setattr(self, attr, value)
+        return value
+
+
+class _LazyModule(types.ModuleType):
+
+    def __init__(self, name):
+        super(_LazyModule, self).__init__(name)
+        self.__doc__ = self.__class__.__doc__
+
+    def __dir__(self):
+        attrs = ["__doc__", "__name__"]
+        attrs += [attr.name for attr in self._moved_attributes]
+        return attrs
+
+    # Subclasses should override this
+    _moved_attributes = []
+
+
+class MovedAttribute(_LazyDescr):
+
+    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
+        super(MovedAttribute, self).__init__(name)
+        if PY3:
+            if new_mod is None:
+                new_mod = name
+            self.mod = new_mod
+            if new_attr is None:
+                if old_attr is None:
+                    new_attr = name
+                else:
+                    new_attr = old_attr
+            self.attr = new_attr
+        else:
+            self.mod = old_mod
+            if old_attr is None:
+                old_attr = name
+            self.attr = old_attr
+
+    def _resolve(self):
+        module = _import_module(self.mod)
+        return getattr(module, self.attr)
+
+
+class _SixMetaPathImporter(object):
+
+    """
+    A meta path importer to import six.moves and its submodules.
+
+    This class implements a PEP302 finder and loader. It should be compatible
+    with Python 2.5 and all existing versions of Python3
+    """
+
+    def __init__(self, six_module_name):
+        self.name = six_module_name
+        self.known_modules = {}
+
+    def _add_module(self, mod, *fullnames):
+        for fullname in fullnames:
+            self.known_modules[self.name + "." + fullname] = mod
+
+    def _get_module(self, fullname):
+        return self.known_modules[self.name + "." + fullname]
+
+    def find_module(self, fullname, path=None):
+        if fullname in self.known_modules:
+            return self
+        return None
+
+    def __get_module(self, fullname):
+        try:
+            return self.known_modules[fullname]
+        except KeyError:
+            raise ImportError("This loader does not know module " + fullname)
+
+    def load_module(self, fullname):
+        try:
+            # in case of a reload
+            return sys.modules[fullname]
+        except KeyError:
+            pass
+        mod = self.__get_module(fullname)
+        if isinstance(mod, MovedModule):
+            mod = mod._resolve()
+        else:
+            mod.__loader__ = self
+        sys.modules[fullname] = mod
+        return mod
+
+    def is_package(self, fullname):
+        """
+        Return true, if the named module is a package.
+
+        We need this method to get correct spec objects with
+        Python 3.4 (see PEP451)
+        """
+        return hasattr(self.__get_module(fullname), "__path__")
+
+    def get_code(self, fullname):
+        """Return None
+
+        Required, if is_package is implemented"""
+        self.__get_module(fullname)  # eventually raises ImportError
+        return None
+    get_source = get_code  # same as get_code
+
+_importer = _SixMetaPathImporter(__name__)
+
+
+class _MovedItems(_LazyModule):
+
+    """Lazy loading of moved objects"""
+    __path__ = []  # mark as package
+
+
+_moved_attributes = [
+    MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
+    MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
+    MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
+    MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
+    MovedAttribute("intern", "__builtin__", "sys"),
+    MovedAttribute("map", "itertools", "builtins", "imap", "map"),
+    MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
+    MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
+    MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
+    MovedAttribute("reduce", "__builtin__", "functools"),
+    MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
+    MovedAttribute("StringIO", "StringIO", "io"),
+    MovedAttribute("UserDict", "UserDict", "collections"),
+    MovedAttribute("UserList", "UserList", "collections"),
+    MovedAttribute("UserString", "UserString", "collections"),
+    MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
+    MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
+    MovedModule("builtins", "__builtin__"),
+    MovedModule("configparser", "ConfigParser"),
+    MovedModule("copyreg", "copy_reg"),
+    MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
+    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
+    MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
+    MovedModule("http_cookies", "Cookie", "http.cookies"),
+    MovedModule("html_entities", "htmlentitydefs", "html.entities"),
+    MovedModule("html_parser", "HTMLParser", "html.parser"),
+    MovedModule("http_client", "httplib", "http.client"),
+    MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
+    MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
+    MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
+    MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
+    MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
+    MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
+    MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
+    MovedModule("cPickle", "cPickle", "pickle"),
+    MovedModule("queue", "Queue"),
+    MovedModule("reprlib", "repr"),
+    MovedModule("socketserver", "SocketServer"),
+    MovedModule("_thread", "thread", "_thread"),
+    MovedModule("tkinter", "Tkinter"),
+    MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
+    MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
+    MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
+    MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
+    MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
+    MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
+    MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
+    MovedModule("tkinter_colorchooser", "tkColorChooser",
+                "tkinter.colorchooser"),
+    MovedModule("tkinter_commondialog", "tkCommonDialog",
+                "tkinter.commondialog"),
+    MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_font", "tkFont", "tkinter.font"),
+    MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
+    MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
+                "tkinter.simpledialog"),
+    MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
+    MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
+    MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
+    MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
+    MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
+    MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
+]
+# Add windows specific modules.
+if sys.platform == "win32":
+    _moved_attributes += [
+        MovedModule("winreg", "_winreg"),
+    ]
+
+for attr in _moved_attributes:
+    setattr(_MovedItems, attr.name, attr)
+    if isinstance(attr, MovedModule):
+        _importer._add_module(attr, "moves." + attr.name)
+del attr
+
+_MovedItems._moved_attributes = _moved_attributes
+
+moves = _MovedItems(__name__ + ".moves")
+_importer._add_module(moves, "moves")
+
+
+class Module_six_moves_urllib_parse(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_parse"""
+
+
+_urllib_parse_moved_attributes = [
+    MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
+    MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
+    MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
+    MovedAttribute("urljoin", "urlparse", "urllib.parse"),
+    MovedAttribute("urlparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("quote", "urllib", "urllib.parse"),
+    MovedAttribute("quote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("unquote", "urllib", "urllib.parse"),
+    MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("urlencode", "urllib", "urllib.parse"),
+    MovedAttribute("splitquery", "urllib", "urllib.parse"),
+    MovedAttribute("splittag", "urllib", "urllib.parse"),
+    MovedAttribute("splituser", "urllib", "urllib.parse"),
+    MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_params", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_query", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
+]
+for attr in _urllib_parse_moved_attributes:
+    setattr(Module_six_moves_urllib_parse, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
+                      "moves.urllib_parse", "moves.urllib.parse")
+
+
+class Module_six_moves_urllib_error(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_error"""
+
+
+_urllib_error_moved_attributes = [
+    MovedAttribute("URLError", "urllib2", "urllib.error"),
+    MovedAttribute("HTTPError", "urllib2", "urllib.error"),
+    MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
+]
+for attr in _urllib_error_moved_attributes:
+    setattr(Module_six_moves_urllib_error, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
+                      "moves.urllib_error", "moves.urllib.error")
+
+
+class Module_six_moves_urllib_request(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_request"""
+
+
+_urllib_request_moved_attributes = [
+    MovedAttribute("urlopen", "urllib2", "urllib.request"),
+    MovedAttribute("install_opener", "urllib2", "urllib.request"),
+    MovedAttribute("build_opener", "urllib2", "urllib.request"),
+    MovedAttribute("pathname2url", "urllib", "urllib.request"),
+    MovedAttribute("url2pathname", "urllib", "urllib.request"),
+    MovedAttribute("getproxies", "urllib", "urllib.request"),
+    MovedAttribute("Request", "urllib2", "urllib.request"),
+    MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
+    MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FileHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("urlretrieve", "urllib", "urllib.request"),
+    MovedAttribute("urlcleanup", "urllib", "urllib.request"),
+    MovedAttribute("URLopener", "urllib", "urllib.request"),
+    MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
+    MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
+]
+for attr in _urllib_request_moved_attributes:
+    setattr(Module_six_moves_urllib_request, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
+                      "moves.urllib_request", "moves.urllib.request")
+
+
+class Module_six_moves_urllib_response(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_response"""
+
+
+_urllib_response_moved_attributes = [
+    MovedAttribute("addbase", "urllib", "urllib.response"),
+    MovedAttribute("addclosehook", "urllib", "urllib.response"),
+    MovedAttribute("addinfo", "urllib", "urllib.response"),
+    MovedAttribute("addinfourl", "urllib", "urllib.response"),
+]
+for attr in _urllib_response_moved_attributes:
+    setattr(Module_six_moves_urllib_response, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
+                      "moves.urllib_response", "moves.urllib.response")
+
+
+class Module_six_moves_urllib_robotparser(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_robotparser"""
+
+
+_urllib_robotparser_moved_attributes = [
+    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
+]
+for attr in _urllib_robotparser_moved_attributes:
+    setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
+                      "moves.urllib_robotparser", "moves.urllib.robotparser")
+
+
+class Module_six_moves_urllib(types.ModuleType):
+
+    """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
+    __path__ = []  # mark as package
+    parse = _importer._get_module("moves.urllib_parse")
+    error = _importer._get_module("moves.urllib_error")
+    request = _importer._get_module("moves.urllib_request")
+    response = _importer._get_module("moves.urllib_response")
+    robotparser = _importer._get_module("moves.urllib_robotparser")
+
+    def __dir__(self):
+        return ['parse', 'error', 'request', 'response', 'robotparser']
+
+_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
+                      "moves.urllib")
+
+
+def add_move(move):
+    """Add an item to six.moves."""
+    setattr(_MovedItems, move.name, move)
+
+
+def remove_move(name):
+    """Remove item from six.moves."""
+    try:
+        delattr(_MovedItems, name)
+    except AttributeError:
+        try:
+            del moves.__dict__[name]
+        except KeyError:
+            raise AttributeError("no such move, %r" % (name,))
+
+
+if PY3:
+    _meth_func = "__func__"
+    _meth_self = "__self__"
+
+    _func_closure = "__closure__"
+    _func_code = "__code__"
+    _func_defaults = "__defaults__"
+    _func_globals = "__globals__"
+else:
+    _meth_func = "im_func"
+    _meth_self = "im_self"
+
+    _func_closure = "func_closure"
+    _func_code = "func_code"
+    _func_defaults = "func_defaults"
+    _func_globals = "func_globals"
+
+
+try:
+    advance_iterator = next
+except NameError:
+    def advance_iterator(it):
+        return it.next()
+next = advance_iterator
+
+
+try:
+    callable = callable
+except NameError:
+    def callable(obj):
+        return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
+
+
+if PY3:
+    def get_unbound_function(unbound):
+        return unbound
+
+    create_bound_method = types.MethodType
+
+    def create_unbound_method(func, cls):
+        return func
+
+    Iterator = object
+else:
+    def get_unbound_function(unbound):
+        return unbound.im_func
+
+    def create_bound_method(func, obj):
+        return types.MethodType(func, obj, obj.__class__)
+
+    def create_unbound_method(func, cls):
+        return types.MethodType(func, None, cls)
+
+    class Iterator(object):
+
+        def next(self):
+            return type(self).__next__(self)
+
+    callable = callable
+_add_doc(get_unbound_function,
+         """Get the function out of a possibly unbound function""")
+
+
+get_method_function = operator.attrgetter(_meth_func)
+get_method_self = operator.attrgetter(_meth_self)
+get_function_closure = operator.attrgetter(_func_closure)
+get_function_code = operator.attrgetter(_func_code)
+get_function_defaults = operator.attrgetter(_func_defaults)
+get_function_globals = operator.attrgetter(_func_globals)
+
+
+if PY3:
+    def iterkeys(d, **kw):
+        return iter(d.keys(**kw))
+
+    def itervalues(d, **kw):
+        return iter(d.values(**kw))
+
+    def iteritems(d, **kw):
+        return iter(d.items(**kw))
+
+    def iterlists(d, **kw):
+        return iter(d.lists(**kw))
+
+    viewkeys = operator.methodcaller("keys")
+
+    viewvalues = operator.methodcaller("values")
+
+    viewitems = operator.methodcaller("items")
+else:
+    def iterkeys(d, **kw):
+        return d.iterkeys(**kw)
+
+    def itervalues(d, **kw):
+        return d.itervalues(**kw)
+
+    def iteritems(d, **kw):
+        return d.iteritems(**kw)
+
+    def iterlists(d, **kw):
+        return d.iterlists(**kw)
+
+    viewkeys = operator.methodcaller("viewkeys")
+
+    viewvalues = operator.methodcaller("viewvalues")
+
+    viewitems = operator.methodcaller("viewitems")
+
+_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
+_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
+_add_doc(iteritems,
+         "Return an iterator over the (key, value) pairs of a dictionary.")
+_add_doc(iterlists,
+         "Return an iterator over the (key, [values]) pairs of a dictionary.")
+
+
+if PY3:
+    def b(s):
+        return s.encode("latin-1")
+
+    def u(s):
+        return s
+    unichr = chr
+    import struct
+    int2byte = struct.Struct(">B").pack
+    del struct
+    byte2int = operator.itemgetter(0)
+    indexbytes = operator.getitem
+    iterbytes = iter
+    import io
+    StringIO = io.StringIO
+    BytesIO = io.BytesIO
+    _assertCountEqual = "assertCountEqual"
+    if sys.version_info[1] <= 1:
+        _assertRaisesRegex = "assertRaisesRegexp"
+        _assertRegex = "assertRegexpMatches"
+    else:
+        _assertRaisesRegex = "assertRaisesRegex"
+        _assertRegex = "assertRegex"
+else:
+    def b(s):
+        return s
+    # Workaround for standalone backslash
+
+    def u(s):
+        return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
+    unichr = unichr
+    int2byte = chr
+
+    def byte2int(bs):
+        return ord(bs[0])
+
+    def indexbytes(buf, i):
+        return ord(buf[i])
+    iterbytes = functools.partial(itertools.imap, ord)
+    import StringIO
+    StringIO = BytesIO = StringIO.StringIO
+    _assertCountEqual = "assertItemsEqual"
+    _assertRaisesRegex = "assertRaisesRegexp"
+    _assertRegex = "assertRegexpMatches"
+_add_doc(b, """Byte literal""")
+_add_doc(u, """Text literal""")
+
+
+def assertCountEqual(self, *args, **kwargs):
+    return getattr(self, _assertCountEqual)(*args, **kwargs)
+
+
+def assertRaisesRegex(self, *args, **kwargs):
+    return getattr(self, _assertRaisesRegex)(*args, **kwargs)
+
+
+def assertRegex(self, *args, **kwargs):
+    return getattr(self, _assertRegex)(*args, **kwargs)
+
+
+if PY3:
+    exec_ = getattr(moves.builtins, "exec")
+
+    def reraise(tp, value, tb=None):
+        if value is None:
+            value = tp()
+        if value.__traceback__ is not tb:
+            raise value.with_traceback(tb)
+        raise value
+
+else:
+    def exec_(_code_, _globs_=None, _locs_=None):
+        """Execute code in a namespace."""
+        if _globs_ is None:
+            frame = sys._getframe(1)
+            _globs_ = frame.f_globals
+            if _locs_ is None:
+                _locs_ = frame.f_locals
+            del frame
+        elif _locs_ is None:
+            _locs_ = _globs_
+        exec("""exec _code_ in _globs_, _locs_""")
+
+    exec_("""def reraise(tp, value, tb=None):
+    raise tp, value, tb
+""")
+
+
+if sys.version_info[:2] == (3, 2):
+    exec_("""def raise_from(value, from_value):
+    if from_value is None:
+        raise value
+    raise value from from_value
+""")
+elif sys.version_info[:2] > (3, 2):
+    exec_("""def raise_from(value, from_value):
+    raise value from from_value
+""")
+else:
+    def raise_from(value, from_value):
+        raise value
+
+
+print_ = getattr(moves.builtins, "print", None)
+if print_ is None:
+    def print_(*args, **kwargs):
+        """The new-style print function for Python 2.4 and 2.5."""
+        fp = kwargs.pop("file", sys.stdout)
+        if fp is None:
+            return
+
+        def write(data):
+            if not isinstance(data, basestring):
+                data = str(data)
+            # If the file has an encoding, encode unicode with it.
+            if (isinstance(fp, file) and
+                    isinstance(data, unicode) and
+                    fp.encoding is not None):
+                errors = getattr(fp, "errors", None)
+                if errors is None:
+                    errors = "strict"
+                data = data.encode(fp.encoding, errors)
+            fp.write(data)
+        want_unicode = False
+        sep = kwargs.pop("sep", None)
+        if sep is not None:
+            if isinstance(sep, unicode):
+                want_unicode = True
+            elif not isinstance(sep, str):
+                raise TypeError("sep must be None or a string")
+        end = kwargs.pop("end", None)
+        if end is not None:
+            if isinstance(end, unicode):
+                want_unicode = True
+            elif not isinstance(end, str):
+                raise TypeError("end must be None or a string")
+        if kwargs:
+            raise TypeError("invalid keyword arguments to print()")
+        if not want_unicode:
+            for arg in args:
+                if isinstance(arg, unicode):
+                    want_unicode = True
+                    break
+        if want_unicode:
+            newline = unicode("\n")
+            space = unicode(" ")
+        else:
+            newline = "\n"
+            space = " "
+        if sep is None:
+            sep = space
+        if end is None:
+            end = newline
+        for i, arg in enumerate(args):
+            if i:
+                write(sep)
+            write(arg)
+        write(end)
+if sys.version_info[:2] < (3, 3):
+    _print = print_
+
+    def print_(*args, **kwargs):
+        fp = kwargs.get("file", sys.stdout)
+        flush = kwargs.pop("flush", False)
+        _print(*args, **kwargs)
+        if flush and fp is not None:
+            fp.flush()
+
+_add_doc(reraise, """Reraise an exception.""")
+
+if sys.version_info[0:2] < (3, 4):
+    def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
+              updated=functools.WRAPPER_UPDATES):
+        def wrapper(f):
+            f = functools.wraps(wrapped, assigned, updated)(f)
+            f.__wrapped__ = wrapped
+            return f
+        return wrapper
+else:
+    wraps = functools.wraps
+
+
+def with_metaclass(meta, *bases):
+    """Create a base class with a metaclass."""
+    # This requires a bit of explanation: the basic idea is to make a dummy
+    # metaclass for one level of class instantiation that replaces itself with
+    # the actual metaclass.
+    class metaclass(meta):
+
+        def __new__(cls, name, this_bases, d):
+            return meta(name, bases, d)
+    return type.__new__(metaclass, 'temporary_class', (), {})
+
+
+def add_metaclass(metaclass):
+    """Class decorator for creating a class with a metaclass."""
+    def wrapper(cls):
+        orig_vars = cls.__dict__.copy()
+        slots = orig_vars.get('__slots__')
+        if slots is not None:
+            if isinstance(slots, str):
+                slots = [slots]
+            for slots_var in slots:
+                orig_vars.pop(slots_var)
+        orig_vars.pop('__dict__', None)
+        orig_vars.pop('__weakref__', None)
+        return metaclass(cls.__name__, cls.__bases__, orig_vars)
+    return wrapper
+
+
+def python_2_unicode_compatible(klass):
+    """
+    A decorator that defines __unicode__ and __str__ methods under Python 2.
+    Under Python 3 it does nothing.
+
+    To support Python 2 and 3 with a single code base, define a __str__ method
+    returning text and apply this decorator to the class.
+    """
+    if PY2:
+        if '__str__' not in klass.__dict__:
+            raise ValueError("@python_2_unicode_compatible cannot be applied "
+                             "to %s because it doesn't define __str__()." %
+                             klass.__name__)
+        klass.__unicode__ = klass.__str__
+        klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
+    return klass
+
+
+# Complete the moves implementation.
+# This code is at the end of this module to speed up module loading.
+# Turn this module into a package.
+__path__ = []  # required for PEP 302 and PEP 451
+__package__ = __name__  # see PEP 366 @ReservedAssignment
+if globals().get("__spec__") is not None:
+    __spec__.submodule_search_locations = []  # PEP 451 @UndefinedVariable
+# Remove other six meta path importers, since they cause problems. This can
+# happen if six is removed from sys.modules and then reloaded. (Setuptools does
+# this for some reason.)
+if sys.meta_path:
+    for i, importer in enumerate(sys.meta_path):
+        # Here's some real nastiness: Another "instance" of the six module might
+        # be floating around. Therefore, we can't use isinstance() to check for
+        # the six meta path importer, since the other six instance will have
+        # inserted an importer with different class.
+        if (type(importer).__name__ == "_SixMetaPathImporter" and
+                importer.name == __name__):
+            del sys.meta_path[i]
+            break
+    del i, importer
+# Finally, add the importer to the meta path import hook.
+sys.meta_path.append(_importer)
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..d6594eb264d3bbe36b98209d77de55a806817751
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py
@@ -0,0 +1,19 @@
+import sys
+
+try:
+    # Our match_hostname function is the same as 3.5's, so we only want to
+    # import the match_hostname function if it's at least that good.
+    if sys.version_info < (3, 5):
+        raise ImportError("Fallback to vendored code")
+
+    from ssl import CertificateError, match_hostname
+except ImportError:
+    try:
+        # Backport of the function from a pypi module
+        from backports.ssl_match_hostname import CertificateError, match_hostname
+    except ImportError:
+        # Our vendored copy
+        from ._implementation import CertificateError, match_hostname
+
+# Not needed, but documenting what we provide.
+__all__ = ('CertificateError', 'match_hostname')
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py
new file mode 100644
index 0000000000000000000000000000000000000000..1fd42f38aec5c0ca639f03d1a900e4e58c22eb1f
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py
@@ -0,0 +1,157 @@
+"""The match_hostname() function from Python 3.3.3, essential when using SSL."""
+
+# Note: This file is under the PSF license as the code comes from the python
+# stdlib.   http://docs.python.org/3/license.html
+
+import re
+import sys
+
+# ipaddress has been backported to 2.6+ in pypi.  If it is installed on the
+# system, use it to handle IPAddress ServerAltnames (this was added in
+# python-3.5) otherwise only do DNS matching.  This allows
+# backports.ssl_match_hostname to continue to be used all the way back to
+# python-2.4.
+try:
+    import ipaddress
+except ImportError:
+    ipaddress = None
+
+__version__ = '3.5.0.1'
+
+
+class CertificateError(ValueError):
+    pass
+
+
+def _dnsname_match(dn, hostname, max_wildcards=1):
+    """Matching according to RFC 6125, section 6.4.3
+
+    http://tools.ietf.org/html/rfc6125#section-6.4.3
+    """
+    pats = []
+    if not dn:
+        return False
+
+    # Ported from python3-syntax:
+    # leftmost, *remainder = dn.split(r'.')
+    parts = dn.split(r'.')
+    leftmost = parts[0]
+    remainder = parts[1:]
+
+    wildcards = leftmost.count('*')
+    if wildcards > max_wildcards:
+        # Issue #17980: avoid denials of service by refusing more
+        # than one wildcard per fragment.  A survey of established
+        # policy among SSL implementations showed it to be a
+        # reasonable choice.
+        raise CertificateError(
+            "too many wildcards in certificate DNS name: " + repr(dn))
+
+    # speed up common case w/o wildcards
+    if not wildcards:
+        return dn.lower() == hostname.lower()
+
+    # RFC 6125, section 6.4.3, subitem 1.
+    # The client SHOULD NOT attempt to match a presented identifier in which
+    # the wildcard character comprises a label other than the left-most label.
+    if leftmost == '*':
+        # When '*' is a fragment by itself, it matches a non-empty dotless
+        # fragment.
+        pats.append('[^.]+')
+    elif leftmost.startswith('xn--') or hostname.startswith('xn--'):
+        # RFC 6125, section 6.4.3, subitem 3.
+        # The client SHOULD NOT attempt to match a presented identifier
+        # where the wildcard character is embedded within an A-label or
+        # U-label of an internationalized domain name.
+        pats.append(re.escape(leftmost))
+    else:
+        # Otherwise, '*' matches any dotless string, e.g. www*
+        pats.append(re.escape(leftmost).replace(r'\*', '[^.]*'))
+
+    # add the remaining fragments, ignore any wildcards
+    for frag in remainder:
+        pats.append(re.escape(frag))
+
+    pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
+    return pat.match(hostname)
+
+
+def _to_unicode(obj):
+    if isinstance(obj, str) and sys.version_info < (3,):
+        obj = unicode(obj, encoding='ascii', errors='strict')
+    return obj
+
+def _ipaddress_match(ipname, host_ip):
+    """Exact matching of IP addresses.
+
+    RFC 6125 explicitly doesn't define an algorithm for this
+    (section 1.7.2 - "Out of Scope").
+    """
+    # OpenSSL may add a trailing newline to a subjectAltName's IP address
+    # Divergence from upstream: ipaddress can't handle byte str
+    ip = ipaddress.ip_address(_to_unicode(ipname).rstrip())
+    return ip == host_ip
+
+
+def match_hostname(cert, hostname):
+    """Verify that *cert* (in decoded format as returned by
+    SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
+    rules are followed, but IP addresses are not accepted for *hostname*.
+
+    CertificateError is raised on failure. On success, the function
+    returns nothing.
+    """
+    if not cert:
+        raise ValueError("empty or no certificate, match_hostname needs a "
+                         "SSL socket or SSL context with either "
+                         "CERT_OPTIONAL or CERT_REQUIRED")
+    try:
+        # Divergence from upstream: ipaddress can't handle byte str
+        host_ip = ipaddress.ip_address(_to_unicode(hostname))
+    except ValueError:
+        # Not an IP address (common case)
+        host_ip = None
+    except UnicodeError:
+        # Divergence from upstream: Have to deal with ipaddress not taking
+        # byte strings.  addresses should be all ascii, so we consider it not
+        # an ipaddress in this case
+        host_ip = None
+    except AttributeError:
+        # Divergence from upstream: Make ipaddress library optional
+        if ipaddress is None:
+            host_ip = None
+        else:
+            raise
+    dnsnames = []
+    san = cert.get('subjectAltName', ())
+    for key, value in san:
+        if key == 'DNS':
+            if host_ip is None and _dnsname_match(value, hostname):
+                return
+            dnsnames.append(value)
+        elif key == 'IP Address':
+            if host_ip is not None and _ipaddress_match(value, host_ip):
+                return
+            dnsnames.append(value)
+    if not dnsnames:
+        # The subject is only checked when there is no dNSName entry
+        # in subjectAltName
+        for sub in cert.get('subject', ()):
+            for key, value in sub:
+                # XXX according to RFC 2818, the most specific Common Name
+                # must be used.
+                if key == 'commonName':
+                    if _dnsname_match(value, hostname):
+                        return
+                    dnsnames.append(value)
+    if len(dnsnames) > 1:
+        raise CertificateError("hostname %r "
+            "doesn't match either of %s"
+            % (hostname, ', '.join(map(repr, dnsnames))))
+    elif len(dnsnames) == 1:
+        raise CertificateError("hostname %r "
+            "doesn't match %r"
+            % (hostname, dnsnames[0]))
+    else:
+        raise CertificateError("no appropriate commonName or "
+            "subjectAltName fields were found")
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/poolmanager.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/poolmanager.py
new file mode 100644
index 0000000000000000000000000000000000000000..4ae91744dba03897bf1f7c6ea2d7614c8d653841
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/poolmanager.py
@@ -0,0 +1,440 @@
+from __future__ import absolute_import
+import collections
+import functools
+import logging
+
+from ._collections import RecentlyUsedContainer
+from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool
+from .connectionpool import port_by_scheme
+from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown
+from .packages.six.moves.urllib.parse import urljoin
+from .request import RequestMethods
+from .util.url import parse_url
+from .util.retry import Retry
+
+
+__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url']
+
+
+log = logging.getLogger(__name__)
+
+SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs',
+                'ssl_version', 'ca_cert_dir', 'ssl_context')
+
+# All known keyword arguments that could be provided to the pool manager, its
+# pools, or the underlying connections. This is used to construct a pool key.
+_key_fields = (
+    'key_scheme',  # str
+    'key_host',  # str
+    'key_port',  # int
+    'key_timeout',  # int or float or Timeout
+    'key_retries',  # int or Retry
+    'key_strict',  # bool
+    'key_block',  # bool
+    'key_source_address',  # str
+    'key_key_file',  # str
+    'key_cert_file',  # str
+    'key_cert_reqs',  # str
+    'key_ca_certs',  # str
+    'key_ssl_version',  # str
+    'key_ca_cert_dir',  # str
+    'key_ssl_context',  # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext
+    'key_maxsize',  # int
+    'key_headers',  # dict
+    'key__proxy',  # parsed proxy url
+    'key__proxy_headers',  # dict
+    'key_socket_options',  # list of (level (int), optname (int), value (int or str)) tuples
+    'key__socks_options',  # dict
+    'key_assert_hostname',  # bool or string
+    'key_assert_fingerprint',  # str
+)
+
+#: The namedtuple class used to construct keys for the connection pool.
+#: All custom key schemes should include the fields in this key at a minimum.
+PoolKey = collections.namedtuple('PoolKey', _key_fields)
+
+
+def _default_key_normalizer(key_class, request_context):
+    """
+    Create a pool key out of a request context dictionary.
+
+    According to RFC 3986, both the scheme and host are case-insensitive.
+    Therefore, this function normalizes both before constructing the pool
+    key for an HTTPS request. If you wish to change this behaviour, provide
+    alternate callables to ``key_fn_by_scheme``.
+
+    :param key_class:
+        The class to use when constructing the key. This should be a namedtuple
+        with the ``scheme`` and ``host`` keys at a minimum.
+    :type  key_class: namedtuple
+    :param request_context:
+        A dictionary-like object that contain the context for a request.
+    :type  request_context: dict
+
+    :return: A namedtuple that can be used as a connection pool key.
+    :rtype:  PoolKey
+    """
+    # Since we mutate the dictionary, make a copy first
+    context = request_context.copy()
+    context['scheme'] = context['scheme'].lower()
+    context['host'] = context['host'].lower()
+
+    # These are both dictionaries and need to be transformed into frozensets
+    for key in ('headers', '_proxy_headers', '_socks_options'):
+        if key in context and context[key] is not None:
+            context[key] = frozenset(context[key].items())
+
+    # The socket_options key may be a list and needs to be transformed into a
+    # tuple.
+    socket_opts = context.get('socket_options')
+    if socket_opts is not None:
+        context['socket_options'] = tuple(socket_opts)
+
+    # Map the kwargs to the names in the namedtuple - this is necessary since
+    # namedtuples can't have fields starting with '_'.
+    for key in list(context.keys()):
+        context['key_' + key] = context.pop(key)
+
+    # Default to ``None`` for keys missing from the context
+    for field in key_class._fields:
+        if field not in context:
+            context[field] = None
+
+    return key_class(**context)
+
+
+#: A dictionary that maps a scheme to a callable that creates a pool key.
+#: This can be used to alter the way pool keys are constructed, if desired.
+#: Each PoolManager makes a copy of this dictionary so they can be configured
+#: globally here, or individually on the instance.
+key_fn_by_scheme = {
+    'http': functools.partial(_default_key_normalizer, PoolKey),
+    'https': functools.partial(_default_key_normalizer, PoolKey),
+}
+
+pool_classes_by_scheme = {
+    'http': HTTPConnectionPool,
+    'https': HTTPSConnectionPool,
+}
+
+
+class PoolManager(RequestMethods):
+    """
+    Allows for arbitrary requests while transparently keeping track of
+    necessary connection pools for you.
+
+    :param num_pools:
+        Number of connection pools to cache before discarding the least
+        recently used pool.
+
+    :param headers:
+        Headers to include with all requests, unless other headers are given
+        explicitly.
+
+    :param \\**connection_pool_kw:
+        Additional parameters are used to create fresh
+        :class:`urllib3.connectionpool.ConnectionPool` instances.
+
+    Example::
+
+        >>> manager = PoolManager(num_pools=2)
+        >>> r = manager.request('GET', 'http://google.com/')
+        >>> r = manager.request('GET', 'http://google.com/mail')
+        >>> r = manager.request('GET', 'http://yahoo.com/')
+        >>> len(manager.pools)
+        2
+
+    """
+
+    proxy = None
+
+    def __init__(self, num_pools=10, headers=None, **connection_pool_kw):
+        RequestMethods.__init__(self, headers)
+        self.connection_pool_kw = connection_pool_kw
+        self.pools = RecentlyUsedContainer(num_pools,
+                                           dispose_func=lambda p: p.close())
+
+        # Locally set the pool classes and keys so other PoolManagers can
+        # override them.
+        self.pool_classes_by_scheme = pool_classes_by_scheme
+        self.key_fn_by_scheme = key_fn_by_scheme.copy()
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        self.clear()
+        # Return False to re-raise any potential exceptions
+        return False
+
+    def _new_pool(self, scheme, host, port, request_context=None):
+        """
+        Create a new :class:`ConnectionPool` based on host, port, scheme, and
+        any additional pool keyword arguments.
+
+        If ``request_context`` is provided, it is provided as keyword arguments
+        to the pool class used. This method is used to actually create the
+        connection pools handed out by :meth:`connection_from_url` and
+        companion methods. It is intended to be overridden for customization.
+        """
+        pool_cls = self.pool_classes_by_scheme[scheme]
+        if request_context is None:
+            request_context = self.connection_pool_kw.copy()
+
+        # Although the context has everything necessary to create the pool,
+        # this function has historically only used the scheme, host, and port
+        # in the positional args. When an API change is acceptable these can
+        # be removed.
+        for key in ('scheme', 'host', 'port'):
+            request_context.pop(key, None)
+
+        if scheme == 'http':
+            for kw in SSL_KEYWORDS:
+                request_context.pop(kw, None)
+
+        return pool_cls(host, port, **request_context)
+
+    def clear(self):
+        """
+        Empty our store of pools and direct them all to close.
+
+        This will not affect in-flight connections, but they will not be
+        re-used after completion.
+        """
+        self.pools.clear()
+
+    def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None):
+        """
+        Get a :class:`ConnectionPool` based on the host, port, and scheme.
+
+        If ``port`` isn't given, it will be derived from the ``scheme`` using
+        ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is
+        provided, it is merged with the instance's ``connection_pool_kw``
+        variable and used to create the new connection pool, if one is
+        needed.
+        """
+
+        if not host:
+            raise LocationValueError("No host specified.")
+
+        request_context = self._merge_pool_kwargs(pool_kwargs)
+        request_context['scheme'] = scheme or 'http'
+        if not port:
+            port = port_by_scheme.get(request_context['scheme'].lower(), 80)
+        request_context['port'] = port
+        request_context['host'] = host
+
+        return self.connection_from_context(request_context)
+
+    def connection_from_context(self, request_context):
+        """
+        Get a :class:`ConnectionPool` based on the request context.
+
+        ``request_context`` must at least contain the ``scheme`` key and its
+        value must be a key in ``key_fn_by_scheme`` instance variable.
+        """
+        scheme = request_context['scheme'].lower()
+        pool_key_constructor = self.key_fn_by_scheme[scheme]
+        pool_key = pool_key_constructor(request_context)
+
+        return self.connection_from_pool_key(pool_key, request_context=request_context)
+
+    def connection_from_pool_key(self, pool_key, request_context=None):
+        """
+        Get a :class:`ConnectionPool` based on the provided pool key.
+
+        ``pool_key`` should be a namedtuple that only contains immutable
+        objects. At a minimum it must have the ``scheme``, ``host``, and
+        ``port`` fields.
+        """
+        with self.pools.lock:
+            # If the scheme, host, or port doesn't match existing open
+            # connections, open a new ConnectionPool.
+            pool = self.pools.get(pool_key)
+            if pool:
+                return pool
+
+            # Make a fresh ConnectionPool of the desired type
+            scheme = request_context['scheme']
+            host = request_context['host']
+            port = request_context['port']
+            pool = self._new_pool(scheme, host, port, request_context=request_context)
+            self.pools[pool_key] = pool
+
+        return pool
+
+    def connection_from_url(self, url, pool_kwargs=None):
+        """
+        Similar to :func:`urllib3.connectionpool.connection_from_url`.
+
+        If ``pool_kwargs`` is not provided and a new pool needs to be
+        constructed, ``self.connection_pool_kw`` is used to initialize
+        the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs``
+        is provided, it is used instead. Note that if a new pool does not
+        need to be created for the request, the provided ``pool_kwargs`` are
+        not used.
+        """
+        u = parse_url(url)
+        return self.connection_from_host(u.host, port=u.port, scheme=u.scheme,
+                                         pool_kwargs=pool_kwargs)
+
+    def _merge_pool_kwargs(self, override):
+        """
+        Merge a dictionary of override values for self.connection_pool_kw.
+
+        This does not modify self.connection_pool_kw and returns a new dict.
+        Any keys in the override dictionary with a value of ``None`` are
+        removed from the merged dictionary.
+        """
+        base_pool_kwargs = self.connection_pool_kw.copy()
+        if override:
+            for key, value in override.items():
+                if value is None:
+                    try:
+                        del base_pool_kwargs[key]
+                    except KeyError:
+                        pass
+                else:
+                    base_pool_kwargs[key] = value
+        return base_pool_kwargs
+
+    def urlopen(self, method, url, redirect=True, **kw):
+        """
+        Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen`
+        with custom cross-host redirect logic and only sends the request-uri
+        portion of the ``url``.
+
+        The given ``url`` parameter must be absolute, such that an appropriate
+        :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it.
+        """
+        u = parse_url(url)
+        conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme)
+
+        kw['assert_same_host'] = False
+        kw['redirect'] = False
+        if 'headers' not in kw:
+            kw['headers'] = self.headers
+
+        if self.proxy is not None and u.scheme == "http":
+            response = conn.urlopen(method, url, **kw)
+        else:
+            response = conn.urlopen(method, u.request_uri, **kw)
+
+        redirect_location = redirect and response.get_redirect_location()
+        if not redirect_location:
+            return response
+
+        # Support relative URLs for redirecting.
+        redirect_location = urljoin(url, redirect_location)
+
+        # RFC 7231, Section 6.4.4
+        if response.status == 303:
+            method = 'GET'
+
+        retries = kw.get('retries')
+        if not isinstance(retries, Retry):
+            retries = Retry.from_int(retries, redirect=redirect)
+
+        try:
+            retries = retries.increment(method, url, response=response, _pool=conn)
+        except MaxRetryError:
+            if retries.raise_on_redirect:
+                raise
+            return response
+
+        kw['retries'] = retries
+        kw['redirect'] = redirect
+
+        log.info("Redirecting %s -> %s", url, redirect_location)
+        return self.urlopen(method, redirect_location, **kw)
+
+
+class ProxyManager(PoolManager):
+    """
+    Behaves just like :class:`PoolManager`, but sends all requests through
+    the defined proxy, using the CONNECT method for HTTPS URLs.
+
+    :param proxy_url:
+        The URL of the proxy to be used.
+
+    :param proxy_headers:
+        A dictionary contaning headers that will be sent to the proxy. In case
+        of HTTP they are being sent with each request, while in the
+        HTTPS/CONNECT case they are sent only once. Could be used for proxy
+        authentication.
+
+    Example:
+        >>> proxy = urllib3.ProxyManager('http://localhost:3128/')
+        >>> r1 = proxy.request('GET', 'http://google.com/')
+        >>> r2 = proxy.request('GET', 'http://httpbin.org/')
+        >>> len(proxy.pools)
+        1
+        >>> r3 = proxy.request('GET', 'https://httpbin.org/')
+        >>> r4 = proxy.request('GET', 'https://twitter.com/')
+        >>> len(proxy.pools)
+        3
+
+    """
+
+    def __init__(self, proxy_url, num_pools=10, headers=None,
+                 proxy_headers=None, **connection_pool_kw):
+
+        if isinstance(proxy_url, HTTPConnectionPool):
+            proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host,
+                                        proxy_url.port)
+        proxy = parse_url(proxy_url)
+        if not proxy.port:
+            port = port_by_scheme.get(proxy.scheme, 80)
+            proxy = proxy._replace(port=port)
+
+        if proxy.scheme not in ("http", "https"):
+            raise ProxySchemeUnknown(proxy.scheme)
+
+        self.proxy = proxy
+        self.proxy_headers = proxy_headers or {}
+
+        connection_pool_kw['_proxy'] = self.proxy
+        connection_pool_kw['_proxy_headers'] = self.proxy_headers
+
+        super(ProxyManager, self).__init__(
+            num_pools, headers, **connection_pool_kw)
+
+    def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None):
+        if scheme == "https":
+            return super(ProxyManager, self).connection_from_host(
+                host, port, scheme, pool_kwargs=pool_kwargs)
+
+        return super(ProxyManager, self).connection_from_host(
+            self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs)
+
+    def _set_proxy_headers(self, url, headers=None):
+        """
+        Sets headers needed by proxies: specifically, the Accept and Host
+        headers. Only sets headers not provided by the user.
+        """
+        headers_ = {'Accept': '*/*'}
+
+        netloc = parse_url(url).netloc
+        if netloc:
+            headers_['Host'] = netloc
+
+        if headers:
+            headers_.update(headers)
+        return headers_
+
+    def urlopen(self, method, url, redirect=True, **kw):
+        "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute."
+        u = parse_url(url)
+
+        if u.scheme == "http":
+            # For proxied HTTPS requests, httplib sets the necessary headers
+            # on the CONNECT to the proxy. For HTTP, we'll definitely
+            # need to set 'Host' at the very least.
+            headers = kw.get('headers', self.headers)
+            kw['headers'] = self._set_proxy_headers(url, headers)
+
+        return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw)
+
+
+def proxy_from_url(url, **kw):
+    return ProxyManager(proxy_url=url, **kw)
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/request.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/request.py
new file mode 100644
index 0000000000000000000000000000000000000000..c0fddff042c3078d71b42aa5c04d8fea96a0f260
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/request.py
@@ -0,0 +1,148 @@
+from __future__ import absolute_import
+
+from .filepost import encode_multipart_formdata
+from .packages.six.moves.urllib.parse import urlencode
+
+
+__all__ = ['RequestMethods']
+
+
+class RequestMethods(object):
+    """
+    Convenience mixin for classes who implement a :meth:`urlopen` method, such
+    as :class:`~urllib3.connectionpool.HTTPConnectionPool` and
+    :class:`~urllib3.poolmanager.PoolManager`.
+
+    Provides behavior for making common types of HTTP request methods and
+    decides which type of request field encoding to use.
+
+    Specifically,
+
+    :meth:`.request_encode_url` is for sending requests whose fields are
+    encoded in the URL (such as GET, HEAD, DELETE).
+
+    :meth:`.request_encode_body` is for sending requests whose fields are
+    encoded in the *body* of the request using multipart or www-form-urlencoded
+    (such as for POST, PUT, PATCH).
+
+    :meth:`.request` is for making any kind of request, it will look up the
+    appropriate encoding format and use one of the above two methods to make
+    the request.
+
+    Initializer parameters:
+
+    :param headers:
+        Headers to include with all requests, unless other headers are given
+        explicitly.
+    """
+
+    _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS'])
+
+    def __init__(self, headers=None):
+        self.headers = headers or {}
+
+    def urlopen(self, method, url, body=None, headers=None,
+                encode_multipart=True, multipart_boundary=None,
+                **kw):  # Abstract
+        raise NotImplemented("Classes extending RequestMethods must implement "
+                             "their own ``urlopen`` method.")
+
+    def request(self, method, url, fields=None, headers=None, **urlopen_kw):
+        """
+        Make a request using :meth:`urlopen` with the appropriate encoding of
+        ``fields`` based on the ``method`` used.
+
+        This is a convenience method that requires the least amount of manual
+        effort. It can be used in most situations, while still having the
+        option to drop down to more specific methods when necessary, such as
+        :meth:`request_encode_url`, :meth:`request_encode_body`,
+        or even the lowest level :meth:`urlopen`.
+        """
+        method = method.upper()
+
+        if method in self._encode_url_methods:
+            return self.request_encode_url(method, url, fields=fields,
+                                           headers=headers,
+                                           **urlopen_kw)
+        else:
+            return self.request_encode_body(method, url, fields=fields,
+                                            headers=headers,
+                                            **urlopen_kw)
+
+    def request_encode_url(self, method, url, fields=None, headers=None,
+                           **urlopen_kw):
+        """
+        Make a request using :meth:`urlopen` with the ``fields`` encoded in
+        the url. This is useful for request methods like GET, HEAD, DELETE, etc.
+        """
+        if headers is None:
+            headers = self.headers
+
+        extra_kw = {'headers': headers}
+        extra_kw.update(urlopen_kw)
+
+        if fields:
+            url += '?' + urlencode(fields)
+
+        return self.urlopen(method, url, **extra_kw)
+
+    def request_encode_body(self, method, url, fields=None, headers=None,
+                            encode_multipart=True, multipart_boundary=None,
+                            **urlopen_kw):
+        """
+        Make a request using :meth:`urlopen` with the ``fields`` encoded in
+        the body. This is useful for request methods like POST, PUT, PATCH, etc.
+
+        When ``encode_multipart=True`` (default), then
+        :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode
+        the payload with the appropriate content type. Otherwise
+        :meth:`urllib.urlencode` is used with the
+        'application/x-www-form-urlencoded' content type.
+
+        Multipart encoding must be used when posting files, and it's reasonably
+        safe to use it in other times too. However, it may break request
+        signing, such as with OAuth.
+
+        Supports an optional ``fields`` parameter of key/value strings AND
+        key/filetuple. A filetuple is a (filename, data, MIME type) tuple where
+        the MIME type is optional. For example::
+
+            fields = {
+                'foo': 'bar',
+                'fakefile': ('foofile.txt', 'contents of foofile'),
+                'realfile': ('barfile.txt', open('realfile').read()),
+                'typedfile': ('bazfile.bin', open('bazfile').read(),
+                              'image/jpeg'),
+                'nonamefile': 'contents of nonamefile field',
+            }
+
+        When uploading a file, providing a filename (the first parameter of the
+        tuple) is optional but recommended to best mimick behavior of browsers.
+
+        Note that if ``headers`` are supplied, the 'Content-Type' header will
+        be overwritten because it depends on the dynamic random boundary string
+        which is used to compose the body of the request. The random boundary
+        string can be explicitly set with the ``multipart_boundary`` parameter.
+        """
+        if headers is None:
+            headers = self.headers
+
+        extra_kw = {'headers': {}}
+
+        if fields:
+            if 'body' in urlopen_kw:
+                raise TypeError(
+                    "request got values for both 'fields' and 'body', can only specify one.")
+
+            if encode_multipart:
+                body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary)
+            else:
+                body, content_type = urlencode(fields), 'application/x-www-form-urlencoded'
+
+            extra_kw['body'] = body
+            extra_kw['headers'] = {'Content-Type': content_type}
+
+        extra_kw['headers'].update(headers)
+        extra_kw.update(urlopen_kw)
+
+        return self.urlopen(method, url, **extra_kw)
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/response.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/response.py
new file mode 100644
index 0000000000000000000000000000000000000000..d3e5a1e60105681cc855b05d3dada7ead651e337
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/response.py
@@ -0,0 +1,626 @@
+from __future__ import absolute_import
+from contextlib import contextmanager
+import zlib
+import io
+import logging
+from socket import timeout as SocketTimeout
+from socket import error as SocketError
+
+from ._collections import HTTPHeaderDict
+from .exceptions import (
+    BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError,
+    ResponseNotChunked, IncompleteRead, InvalidHeader
+)
+from .packages.six import string_types as basestring, binary_type, PY3
+from .packages.six.moves import http_client as httplib
+from .connection import HTTPException, BaseSSLError
+from .util.response import is_fp_closed, is_response_to_head
+
+log = logging.getLogger(__name__)
+
+
+class DeflateDecoder(object):
+
+    def __init__(self):
+        self._first_try = True
+        self._data = binary_type()
+        self._obj = zlib.decompressobj()
+
+    def __getattr__(self, name):
+        return getattr(self._obj, name)
+
+    def decompress(self, data):
+        if not data:
+            return data
+
+        if not self._first_try:
+            return self._obj.decompress(data)
+
+        self._data += data
+        try:
+            decompressed = self._obj.decompress(data)
+            if decompressed:
+                self._first_try = False
+                self._data = None
+            return decompressed
+        except zlib.error:
+            self._first_try = False
+            self._obj = zlib.decompressobj(-zlib.MAX_WBITS)
+            try:
+                return self.decompress(self._data)
+            finally:
+                self._data = None
+
+
+class GzipDecoder(object):
+
+    def __init__(self):
+        self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS)
+
+    def __getattr__(self, name):
+        return getattr(self._obj, name)
+
+    def decompress(self, data):
+        if not data:
+            return data
+        return self._obj.decompress(data)
+
+
+def _get_decoder(mode):
+    if mode == 'gzip':
+        return GzipDecoder()
+
+    return DeflateDecoder()
+
+
+class HTTPResponse(io.IOBase):
+    """
+    HTTP Response container.
+
+    Backwards-compatible to httplib's HTTPResponse but the response ``body`` is
+    loaded and decoded on-demand when the ``data`` property is accessed.  This
+    class is also compatible with the Python standard library's :mod:`io`
+    module, and can hence be treated as a readable object in the context of that
+    framework.
+
+    Extra parameters for behaviour not present in httplib.HTTPResponse:
+
+    :param preload_content:
+        If True, the response's body will be preloaded during construction.
+
+    :param decode_content:
+        If True, attempts to decode specific content-encoding's based on headers
+        (like 'gzip' and 'deflate') will be skipped and raw data will be used
+        instead.
+
+    :param original_response:
+        When this HTTPResponse wrapper is generated from an httplib.HTTPResponse
+        object, it's convenient to include the original for debug purposes. It's
+        otherwise unused.
+
+    :param retries:
+        The retries contains the last :class:`~urllib3.util.retry.Retry` that
+        was used during the request.
+
+    :param enforce_content_length:
+        Enforce content length checking. Body returned by server must match
+        value of Content-Length header, if present. Otherwise, raise error.
+    """
+
+    CONTENT_DECODERS = ['gzip', 'deflate']
+    REDIRECT_STATUSES = [301, 302, 303, 307, 308]
+
+    def __init__(self, body='', headers=None, status=0, version=0, reason=None,
+                 strict=0, preload_content=True, decode_content=True,
+                 original_response=None, pool=None, connection=None,
+                 retries=None, enforce_content_length=False, request_method=None):
+
+        if isinstance(headers, HTTPHeaderDict):
+            self.headers = headers
+        else:
+            self.headers = HTTPHeaderDict(headers)
+        self.status = status
+        self.version = version
+        self.reason = reason
+        self.strict = strict
+        self.decode_content = decode_content
+        self.retries = retries
+        self.enforce_content_length = enforce_content_length
+
+        self._decoder = None
+        self._body = None
+        self._fp = None
+        self._original_response = original_response
+        self._fp_bytes_read = 0
+
+        if body and isinstance(body, (basestring, binary_type)):
+            self._body = body
+
+        self._pool = pool
+        self._connection = connection
+
+        if hasattr(body, 'read'):
+            self._fp = body
+
+        # Are we using the chunked-style of transfer encoding?
+        self.chunked = False
+        self.chunk_left = None
+        tr_enc = self.headers.get('transfer-encoding', '').lower()
+        # Don't incur the penalty of creating a list and then discarding it
+        encodings = (enc.strip() for enc in tr_enc.split(","))
+        if "chunked" in encodings:
+            self.chunked = True
+
+        # Determine length of response
+        self.length_remaining = self._init_length(request_method)
+
+        # If requested, preload the body.
+        if preload_content and not self._body:
+            self._body = self.read(decode_content=decode_content)
+
+    def get_redirect_location(self):
+        """
+        Should we redirect and where to?
+
+        :returns: Truthy redirect location string if we got a redirect status
+            code and valid location. ``None`` if redirect status and no
+            location. ``False`` if not a redirect status code.
+        """
+        if self.status in self.REDIRECT_STATUSES:
+            return self.headers.get('location')
+
+        return False
+
+    def release_conn(self):
+        if not self._pool or not self._connection:
+            return
+
+        self._pool._put_conn(self._connection)
+        self._connection = None
+
+    @property
+    def data(self):
+        # For backwords-compat with earlier urllib3 0.4 and earlier.
+        if self._body:
+            return self._body
+
+        if self._fp:
+            return self.read(cache_content=True)
+
+    @property
+    def connection(self):
+        return self._connection
+
+    def tell(self):
+        """
+        Obtain the number of bytes pulled over the wire so far. May differ from
+        the amount of content returned by :meth:``HTTPResponse.read`` if bytes
+        are encoded on the wire (e.g, compressed).
+        """
+        return self._fp_bytes_read
+
+    def _init_length(self, request_method):
+        """
+        Set initial length value for Response content if available.
+        """
+        length = self.headers.get('content-length')
+
+        if length is not None and self.chunked:
+            # This Response will fail with an IncompleteRead if it can't be
+            # received as chunked. This method falls back to attempt reading
+            # the response before raising an exception.
+            log.warning("Received response with both Content-Length and "
+                        "Transfer-Encoding set. This is expressly forbidden "
+                        "by RFC 7230 sec 3.3.2. Ignoring Content-Length and "
+                        "attempting to process response as Transfer-Encoding: "
+                        "chunked.")
+            return None
+
+        elif length is not None:
+            try:
+                # RFC 7230 section 3.3.2 specifies multiple content lengths can
+                # be sent in a single Content-Length header
+                # (e.g. Content-Length: 42, 42). This line ensures the values
+                # are all valid ints and that as long as the `set` length is 1,
+                # all values are the same. Otherwise, the header is invalid.
+                lengths = set([int(val) for val in length.split(',')])
+                if len(lengths) > 1:
+                    raise InvalidHeader("Content-Length contained multiple "
+                                        "unmatching values (%s)" % length)
+                length = lengths.pop()
+            except ValueError:
+                length = None
+            else:
+                if length < 0:
+                    length = None
+
+        # Convert status to int for comparison
+        # In some cases, httplib returns a status of "_UNKNOWN"
+        try:
+            status = int(self.status)
+        except ValueError:
+            status = 0
+
+        # Check for responses that shouldn't include a body
+        if status in (204, 304) or 100 <= status < 200 or request_method == 'HEAD':
+            length = 0
+
+        return length
+
+    def _init_decoder(self):
+        """
+        Set-up the _decoder attribute if necessary.
+        """
+        # Note: content-encoding value should be case-insensitive, per RFC 7230
+        # Section 3.2
+        content_encoding = self.headers.get('content-encoding', '').lower()
+        if self._decoder is None and content_encoding in self.CONTENT_DECODERS:
+            self._decoder = _get_decoder(content_encoding)
+
+    def _decode(self, data, decode_content, flush_decoder):
+        """
+        Decode the data passed in and potentially flush the decoder.
+        """
+        try:
+            if decode_content and self._decoder:
+                data = self._decoder.decompress(data)
+        except (IOError, zlib.error) as e:
+            content_encoding = self.headers.get('content-encoding', '').lower()
+            raise DecodeError(
+                "Received response with content-encoding: %s, but "
+                "failed to decode it." % content_encoding, e)
+
+        if flush_decoder and decode_content:
+            data += self._flush_decoder()
+
+        return data
+
+    def _flush_decoder(self):
+        """
+        Flushes the decoder. Should only be called if the decoder is actually
+        being used.
+        """
+        if self._decoder:
+            buf = self._decoder.decompress(b'')
+            return buf + self._decoder.flush()
+
+        return b''
+
+    @contextmanager
+    def _error_catcher(self):
+        """
+        Catch low-level python exceptions, instead re-raising urllib3
+        variants, so that low-level exceptions are not leaked in the
+        high-level api.
+
+        On exit, release the connection back to the pool.
+        """
+        clean_exit = False
+
+        try:
+            try:
+                yield
+
+            except SocketTimeout:
+                # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but
+                # there is yet no clean way to get at it from this context.
+                raise ReadTimeoutError(self._pool, None, 'Read timed out.')
+
+            except BaseSSLError as e:
+                # FIXME: Is there a better way to differentiate between SSLErrors?
+                if 'read operation timed out' not in str(e):  # Defensive:
+                    # This shouldn't happen but just in case we're missing an edge
+                    # case, let's avoid swallowing SSL errors.
+                    raise
+
+                raise ReadTimeoutError(self._pool, None, 'Read timed out.')
+
+            except (HTTPException, SocketError) as e:
+                # This includes IncompleteRead.
+                raise ProtocolError('Connection broken: %r' % e, e)
+
+            # If no exception is thrown, we should avoid cleaning up
+            # unnecessarily.
+            clean_exit = True
+        finally:
+            # If we didn't terminate cleanly, we need to throw away our
+            # connection.
+            if not clean_exit:
+                # The response may not be closed but we're not going to use it
+                # anymore so close it now to ensure that the connection is
+                # released back to the pool.
+                if self._original_response:
+                    self._original_response.close()
+
+                # Closing the response may not actually be sufficient to close
+                # everything, so if we have a hold of the connection close that
+                # too.
+                if self._connection:
+                    self._connection.close()
+
+            # If we hold the original response but it's closed now, we should
+            # return the connection back to the pool.
+            if self._original_response and self._original_response.isclosed():
+                self.release_conn()
+
+    def read(self, amt=None, decode_content=None, cache_content=False):
+        """
+        Similar to :meth:`httplib.HTTPResponse.read`, but with two additional
+        parameters: ``decode_content`` and ``cache_content``.
+
+        :param amt:
+            How much of the content to read. If specified, caching is skipped
+            because it doesn't make sense to cache partial content as the full
+            response.
+
+        :param decode_content:
+            If True, will attempt to decode the body based on the
+            'content-encoding' header.
+
+        :param cache_content:
+            If True, will save the returned data such that the same result is
+            returned despite of the state of the underlying file object. This
+            is useful if you want the ``.data`` property to continue working
+            after having ``.read()`` the file object. (Overridden if ``amt`` is
+            set.)
+        """
+        self._init_decoder()
+        if decode_content is None:
+            decode_content = self.decode_content
+
+        if self._fp is None:
+            return
+
+        flush_decoder = False
+        data = None
+
+        with self._error_catcher():
+            if amt is None:
+                # cStringIO doesn't like amt=None
+                data = self._fp.read()
+                flush_decoder = True
+            else:
+                cache_content = False
+                data = self._fp.read(amt)
+                if amt != 0 and not data:  # Platform-specific: Buggy versions of Python.
+                    # Close the connection when no data is returned
+                    #
+                    # This is redundant to what httplib/http.client _should_
+                    # already do.  However, versions of python released before
+                    # December 15, 2012 (http://bugs.python.org/issue16298) do
+                    # not properly close the connection in all cases. There is
+                    # no harm in redundantly calling close.
+                    self._fp.close()
+                    flush_decoder = True
+                    if self.enforce_content_length and self.length_remaining not in (0, None):
+                        # This is an edge case that httplib failed to cover due
+                        # to concerns of backward compatibility. We're
+                        # addressing it here to make sure IncompleteRead is
+                        # raised during streaming, so all calls with incorrect
+                        # Content-Length are caught.
+                        raise IncompleteRead(self._fp_bytes_read, self.length_remaining)
+
+        if data:
+            self._fp_bytes_read += len(data)
+            if self.length_remaining is not None:
+                self.length_remaining -= len(data)
+
+            data = self._decode(data, decode_content, flush_decoder)
+
+            if cache_content:
+                self._body = data
+
+        return data
+
+    def stream(self, amt=2**16, decode_content=None):
+        """
+        A generator wrapper for the read() method. A call will block until
+        ``amt`` bytes have been read from the connection or until the
+        connection is closed.
+
+        :param amt:
+            How much of the content to read. The generator will return up to
+            much data per iteration, but may return less. This is particularly
+            likely when using compressed data. However, the empty string will
+            never be returned.
+
+        :param decode_content:
+            If True, will attempt to decode the body based on the
+            'content-encoding' header.
+        """
+        if self.chunked and self.supports_chunked_reads():
+            for line in self.read_chunked(amt, decode_content=decode_content):
+                yield line
+        else:
+            while not is_fp_closed(self._fp):
+                data = self.read(amt=amt, decode_content=decode_content)
+
+                if data:
+                    yield data
+
+    @classmethod
+    def from_httplib(ResponseCls, r, **response_kw):
+        """
+        Given an :class:`httplib.HTTPResponse` instance ``r``, return a
+        corresponding :class:`urllib3.response.HTTPResponse` object.
+
+        Remaining parameters are passed to the HTTPResponse constructor, along
+        with ``original_response=r``.
+        """
+        headers = r.msg
+
+        if not isinstance(headers, HTTPHeaderDict):
+            if PY3:  # Python 3
+                headers = HTTPHeaderDict(headers.items())
+            else:  # Python 2
+                headers = HTTPHeaderDict.from_httplib(headers)
+
+        # HTTPResponse objects in Python 3 don't have a .strict attribute
+        strict = getattr(r, 'strict', 0)
+        resp = ResponseCls(body=r,
+                           headers=headers,
+                           status=r.status,
+                           version=r.version,
+                           reason=r.reason,
+                           strict=strict,
+                           original_response=r,
+                           **response_kw)
+        return resp
+
+    # Backwards-compatibility methods for httplib.HTTPResponse
+    def getheaders(self):
+        return self.headers
+
+    def getheader(self, name, default=None):
+        return self.headers.get(name, default)
+
+    # Backwards compatibility for http.cookiejar
+    def info(self):
+        return self.headers
+
+    # Overrides from io.IOBase
+    def close(self):
+        if not self.closed:
+            self._fp.close()
+
+        if self._connection:
+            self._connection.close()
+
+    @property
+    def closed(self):
+        if self._fp is None:
+            return True
+        elif hasattr(self._fp, 'isclosed'):
+            return self._fp.isclosed()
+        elif hasattr(self._fp, 'closed'):
+            return self._fp.closed
+        else:
+            return True
+
+    def fileno(self):
+        if self._fp is None:
+            raise IOError("HTTPResponse has no file to get a fileno from")
+        elif hasattr(self._fp, "fileno"):
+            return self._fp.fileno()
+        else:
+            raise IOError("The file-like object this HTTPResponse is wrapped "
+                          "around has no file descriptor")
+
+    def flush(self):
+        if self._fp is not None and hasattr(self._fp, 'flush'):
+            return self._fp.flush()
+
+    def readable(self):
+        # This method is required for `io` module compatibility.
+        return True
+
+    def readinto(self, b):
+        # This method is required for `io` module compatibility.
+        temp = self.read(len(b))
+        if len(temp) == 0:
+            return 0
+        else:
+            b[:len(temp)] = temp
+            return len(temp)
+
+    def supports_chunked_reads(self):
+        """
+        Checks if the underlying file-like object looks like a
+        httplib.HTTPResponse object. We do this by testing for the fp
+        attribute. If it is present we assume it returns raw chunks as
+        processed by read_chunked().
+        """
+        return hasattr(self._fp, 'fp')
+
+    def _update_chunk_length(self):
+        # First, we'll figure out length of a chunk and then
+        # we'll try to read it from socket.
+        if self.chunk_left is not None:
+            return
+        line = self._fp.fp.readline()
+        line = line.split(b';', 1)[0]
+        try:
+            self.chunk_left = int(line, 16)
+        except ValueError:
+            # Invalid chunked protocol response, abort.
+            self.close()
+            raise httplib.IncompleteRead(line)
+
+    def _handle_chunk(self, amt):
+        returned_chunk = None
+        if amt is None:
+            chunk = self._fp._safe_read(self.chunk_left)
+            returned_chunk = chunk
+            self._fp._safe_read(2)  # Toss the CRLF at the end of the chunk.
+            self.chunk_left = None
+        elif amt < self.chunk_left:
+            value = self._fp._safe_read(amt)
+            self.chunk_left = self.chunk_left - amt
+            returned_chunk = value
+        elif amt == self.chunk_left:
+            value = self._fp._safe_read(amt)
+            self._fp._safe_read(2)  # Toss the CRLF at the end of the chunk.
+            self.chunk_left = None
+            returned_chunk = value
+        else:  # amt > self.chunk_left
+            returned_chunk = self._fp._safe_read(self.chunk_left)
+            self._fp._safe_read(2)  # Toss the CRLF at the end of the chunk.
+            self.chunk_left = None
+        return returned_chunk
+
+    def read_chunked(self, amt=None, decode_content=None):
+        """
+        Similar to :meth:`HTTPResponse.read`, but with an additional
+        parameter: ``decode_content``.
+
+        :param decode_content:
+            If True, will attempt to decode the body based on the
+            'content-encoding' header.
+        """
+        self._init_decoder()
+        # FIXME: Rewrite this method and make it a class with a better structured logic.
+        if not self.chunked:
+            raise ResponseNotChunked(
+                "Response is not chunked. "
+                "Header 'transfer-encoding: chunked' is missing.")
+        if not self.supports_chunked_reads():
+            raise BodyNotHttplibCompatible(
+                "Body should be httplib.HTTPResponse like. "
+                "It should have have an fp attribute which returns raw chunks.")
+
+        # Don't bother reading the body of a HEAD request.
+        if self._original_response and is_response_to_head(self._original_response):
+            self._original_response.close()
+            return
+
+        with self._error_catcher():
+            while True:
+                self._update_chunk_length()
+                if self.chunk_left == 0:
+                    break
+                chunk = self._handle_chunk(amt)
+                decoded = self._decode(chunk, decode_content=decode_content,
+                                       flush_decoder=False)
+                if decoded:
+                    yield decoded
+
+            if decode_content:
+                # On CPython and PyPy, we should never need to flush the
+                # decoder. However, on Jython we *might* need to, so
+                # lets defensively do it anyway.
+                decoded = self._flush_decoder()
+                if decoded:  # Platform-specific: Jython.
+                    yield decoded
+
+            # Chunk content ends with \r\n: discard it.
+            while True:
+                line = self._fp.fp.readline()
+                if not line:
+                    # Some sites may not end with '\r\n'.
+                    break
+                if line == b'\r\n':
+                    break
+
+            # We read everything; close the "file".
+            if self._original_response:
+                self._original_response.close()
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/__init__.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..2f2770b62277d59e83a0e696df370759e05a7b5c
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/__init__.py
@@ -0,0 +1,54 @@
+from __future__ import absolute_import
+# For backwards compatibility, provide imports that used to be here.
+from .connection import is_connection_dropped
+from .request import make_headers
+from .response import is_fp_closed
+from .ssl_ import (
+    SSLContext,
+    HAS_SNI,
+    IS_PYOPENSSL,
+    IS_SECURETRANSPORT,
+    assert_fingerprint,
+    resolve_cert_reqs,
+    resolve_ssl_version,
+    ssl_wrap_socket,
+)
+from .timeout import (
+    current_time,
+    Timeout,
+)
+
+from .retry import Retry
+from .url import (
+    get_host,
+    parse_url,
+    split_first,
+    Url,
+)
+from .wait import (
+    wait_for_read,
+    wait_for_write
+)
+
+__all__ = (
+    'HAS_SNI',
+    'IS_PYOPENSSL',
+    'IS_SECURETRANSPORT',
+    'SSLContext',
+    'Retry',
+    'Timeout',
+    'Url',
+    'assert_fingerprint',
+    'current_time',
+    'is_connection_dropped',
+    'is_fp_closed',
+    'get_host',
+    'parse_url',
+    'make_headers',
+    'resolve_cert_reqs',
+    'resolve_ssl_version',
+    'split_first',
+    'ssl_wrap_socket',
+    'wait_for_read',
+    'wait_for_write'
+)
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/connection.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/connection.py
new file mode 100644
index 0000000000000000000000000000000000000000..bf699cfd0e8ba65b2e7a29ddedb3fa273019dbf6
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/connection.py
@@ -0,0 +1,130 @@
+from __future__ import absolute_import
+import socket
+from .wait import wait_for_read
+from .selectors import HAS_SELECT, SelectorError
+
+
+def is_connection_dropped(conn):  # Platform-specific
+    """
+    Returns True if the connection is dropped and should be closed.
+
+    :param conn:
+        :class:`httplib.HTTPConnection` object.
+
+    Note: For platforms like AppEngine, this will always return ``False`` to
+    let the platform handle connection recycling transparently for us.
+    """
+    sock = getattr(conn, 'sock', False)
+    if sock is False:  # Platform-specific: AppEngine
+        return False
+    if sock is None:  # Connection already closed (such as by httplib).
+        return True
+
+    if not HAS_SELECT:
+        return False
+
+    try:
+        return bool(wait_for_read(sock, timeout=0.0))
+    except SelectorError:
+        return True
+
+
+# This function is copied from socket.py in the Python 2.7 standard
+# library test suite. Added to its signature is only `socket_options`.
+# One additional modification is that we avoid binding to IPv6 servers
+# discovered in DNS if the system doesn't have IPv6 functionality.
+def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
+                      source_address=None, socket_options=None):
+    """Connect to *address* and return the socket object.
+
+    Convenience function.  Connect to *address* (a 2-tuple ``(host,
+    port)``) and return the socket object.  Passing the optional
+    *timeout* parameter will set the timeout on the socket instance
+    before attempting to connect.  If no *timeout* is supplied, the
+    global default timeout setting returned by :func:`getdefaulttimeout`
+    is used.  If *source_address* is set it must be a tuple of (host, port)
+    for the socket to bind as a source address before making the connection.
+    An host of '' or port 0 tells the OS to use the default.
+    """
+
+    host, port = address
+    if host.startswith('['):
+        host = host.strip('[]')
+    err = None
+
+    # Using the value from allowed_gai_family() in the context of getaddrinfo lets
+    # us select whether to work with IPv4 DNS records, IPv6 records, or both.
+    # The original create_connection function always returns all records.
+    family = allowed_gai_family()
+
+    for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
+        af, socktype, proto, canonname, sa = res
+        sock = None
+        try:
+            sock = socket.socket(af, socktype, proto)
+
+            # If provided, set socket level options before connecting.
+            _set_socket_options(sock, socket_options)
+
+            if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT:
+                sock.settimeout(timeout)
+            if source_address:
+                sock.bind(source_address)
+            sock.connect(sa)
+            return sock
+
+        except socket.error as e:
+            err = e
+            if sock is not None:
+                sock.close()
+                sock = None
+
+    if err is not None:
+        raise err
+
+    raise socket.error("getaddrinfo returns an empty list")
+
+
+def _set_socket_options(sock, options):
+    if options is None:
+        return
+
+    for opt in options:
+        sock.setsockopt(*opt)
+
+
+def allowed_gai_family():
+    """This function is designed to work in the context of
+    getaddrinfo, where family=socket.AF_UNSPEC is the default and
+    will perform a DNS search for both IPv6 and IPv4 records."""
+
+    family = socket.AF_INET
+    if HAS_IPV6:
+        family = socket.AF_UNSPEC
+    return family
+
+
+def _has_ipv6(host):
+    """ Returns True if the system can bind an IPv6 address. """
+    sock = None
+    has_ipv6 = False
+
+    if socket.has_ipv6:
+        # has_ipv6 returns true if cPython was compiled with IPv6 support.
+        # It does not tell us if the system has IPv6 support enabled. To
+        # determine that we must bind to an IPv6 address.
+        # https://github.com/shazow/urllib3/pull/611
+        # https://bugs.python.org/issue658327
+        try:
+            sock = socket.socket(socket.AF_INET6)
+            sock.bind((host, 0))
+            has_ipv6 = True
+        except Exception:
+            pass
+
+    if sock:
+        sock.close()
+    return has_ipv6
+
+
+HAS_IPV6 = _has_ipv6('::1')
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/request.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/request.py
new file mode 100644
index 0000000000000000000000000000000000000000..3ddfcd559476bacf7d2471ee6f7b20a4b5e4dc0f
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/request.py
@@ -0,0 +1,118 @@
+from __future__ import absolute_import
+from base64 import b64encode
+
+from ..packages.six import b, integer_types
+from ..exceptions import UnrewindableBodyError
+
+ACCEPT_ENCODING = 'gzip,deflate'
+_FAILEDTELL = object()
+
+
+def make_headers(keep_alive=None, accept_encoding=None, user_agent=None,
+                 basic_auth=None, proxy_basic_auth=None, disable_cache=None):
+    """
+    Shortcuts for generating request headers.
+
+    :param keep_alive:
+        If ``True``, adds 'connection: keep-alive' header.
+
+    :param accept_encoding:
+        Can be a boolean, list, or string.
+        ``True`` translates to 'gzip,deflate'.
+        List will get joined by comma.
+        String will be used as provided.
+
+    :param user_agent:
+        String representing the user-agent you want, such as
+        "python-urllib3/0.6"
+
+    :param basic_auth:
+        Colon-separated username:password string for 'authorization: basic ...'
+        auth header.
+
+    :param proxy_basic_auth:
+        Colon-separated username:password string for 'proxy-authorization: basic ...'
+        auth header.
+
+    :param disable_cache:
+        If ``True``, adds 'cache-control: no-cache' header.
+
+    Example::
+
+        >>> make_headers(keep_alive=True, user_agent="Batman/1.0")
+        {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'}
+        >>> make_headers(accept_encoding=True)
+        {'accept-encoding': 'gzip,deflate'}
+    """
+    headers = {}
+    if accept_encoding:
+        if isinstance(accept_encoding, str):
+            pass
+        elif isinstance(accept_encoding, list):
+            accept_encoding = ','.join(accept_encoding)
+        else:
+            accept_encoding = ACCEPT_ENCODING
+        headers['accept-encoding'] = accept_encoding
+
+    if user_agent:
+        headers['user-agent'] = user_agent
+
+    if keep_alive:
+        headers['connection'] = 'keep-alive'
+
+    if basic_auth:
+        headers['authorization'] = 'Basic ' + \
+            b64encode(b(basic_auth)).decode('utf-8')
+
+    if proxy_basic_auth:
+        headers['proxy-authorization'] = 'Basic ' + \
+            b64encode(b(proxy_basic_auth)).decode('utf-8')
+
+    if disable_cache:
+        headers['cache-control'] = 'no-cache'
+
+    return headers
+
+
+def set_file_position(body, pos):
+    """
+    If a position is provided, move file to that point.
+    Otherwise, we'll attempt to record a position for future use.
+    """
+    if pos is not None:
+        rewind_body(body, pos)
+    elif getattr(body, 'tell', None) is not None:
+        try:
+            pos = body.tell()
+        except (IOError, OSError):
+            # This differentiates from None, allowing us to catch
+            # a failed `tell()` later when trying to rewind the body.
+            pos = _FAILEDTELL
+
+    return pos
+
+
+def rewind_body(body, body_pos):
+    """
+    Attempt to rewind body to a certain position.
+    Primarily used for request redirects and retries.
+
+    :param body:
+        File-like object that supports seek.
+
+    :param int pos:
+        Position to seek to in file.
+    """
+    body_seek = getattr(body, 'seek', None)
+    if body_seek is not None and isinstance(body_pos, integer_types):
+        try:
+            body_seek(body_pos)
+        except (IOError, OSError):
+            raise UnrewindableBodyError("An error occurred when rewinding request "
+                                        "body for redirect/retry.")
+    elif body_pos is _FAILEDTELL:
+        raise UnrewindableBodyError("Unable to record file position for rewinding "
+                                    "request body during a redirect/retry.")
+    else:
+        raise ValueError("body_pos must be of type integer, "
+                         "instead it was %s." % type(body_pos))
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/response.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/response.py
new file mode 100644
index 0000000000000000000000000000000000000000..67cf730ab0f04881946d6f616aa52e4e3c5a82f6
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/response.py
@@ -0,0 +1,81 @@
+from __future__ import absolute_import
+from ..packages.six.moves import http_client as httplib
+
+from ..exceptions import HeaderParsingError
+
+
+def is_fp_closed(obj):
+    """
+    Checks whether a given file-like object is closed.
+
+    :param obj:
+        The file-like object to check.
+    """
+
+    try:
+        # Check `isclosed()` first, in case Python3 doesn't set `closed`.
+        # GH Issue #928
+        return obj.isclosed()
+    except AttributeError:
+        pass
+
+    try:
+        # Check via the official file-like-object way.
+        return obj.closed
+    except AttributeError:
+        pass
+
+    try:
+        # Check if the object is a container for another file-like object that
+        # gets released on exhaustion (e.g. HTTPResponse).
+        return obj.fp is None
+    except AttributeError:
+        pass
+
+    raise ValueError("Unable to determine whether fp is closed.")
+
+
+def assert_header_parsing(headers):
+    """
+    Asserts whether all headers have been successfully parsed.
+    Extracts encountered errors from the result of parsing headers.
+
+    Only works on Python 3.
+
+    :param headers: Headers to verify.
+    :type headers: `httplib.HTTPMessage`.
+
+    :raises urllib3.exceptions.HeaderParsingError:
+        If parsing errors are found.
+    """
+
+    # This will fail silently if we pass in the wrong kind of parameter.
+    # To make debugging easier add an explicit check.
+    if not isinstance(headers, httplib.HTTPMessage):
+        raise TypeError('expected httplib.Message, got {0}.'.format(
+            type(headers)))
+
+    defects = getattr(headers, 'defects', None)
+    get_payload = getattr(headers, 'get_payload', None)
+
+    unparsed_data = None
+    if get_payload:  # Platform-specific: Python 3.
+        unparsed_data = get_payload()
+
+    if defects or unparsed_data:
+        raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data)
+
+
+def is_response_to_head(response):
+    """
+    Checks whether the request of a response has been a HEAD-request.
+    Handles the quirks of AppEngine.
+
+    :param conn:
+    :type conn: :class:`httplib.HTTPResponse`
+    """
+    # FIXME: Can we do this somehow without accessing private httplib _method?
+    method = response._method
+    if isinstance(method, int):  # Platform-specific: Appengine
+        return method == 3
+    return method.upper() == 'HEAD'
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/retry.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/retry.py
new file mode 100644
index 0000000000000000000000000000000000000000..c603cb4904c133701e935cf0792431dff13cdfbc
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/retry.py
@@ -0,0 +1,401 @@
+from __future__ import absolute_import
+import time
+import logging
+from collections import namedtuple
+from itertools import takewhile
+import email
+import re
+
+from ..exceptions import (
+    ConnectTimeoutError,
+    MaxRetryError,
+    ProtocolError,
+    ReadTimeoutError,
+    ResponseError,
+    InvalidHeader,
+)
+from ..packages import six
+
+
+log = logging.getLogger(__name__)
+
+# Data structure for representing the metadata of requests that result in a retry.
+RequestHistory = namedtuple('RequestHistory', ["method", "url", "error",
+                                               "status", "redirect_location"])
+
+
+class Retry(object):
+    """ Retry configuration.
+
+    Each retry attempt will create a new Retry object with updated values, so
+    they can be safely reused.
+
+    Retries can be defined as a default for a pool::
+
+        retries = Retry(connect=5, read=2, redirect=5)
+        http = PoolManager(retries=retries)
+        response = http.request('GET', 'http://example.com/')
+
+    Or per-request (which overrides the default for the pool)::
+
+        response = http.request('GET', 'http://example.com/', retries=Retry(10))
+
+    Retries can be disabled by passing ``False``::
+
+        response = http.request('GET', 'http://example.com/', retries=False)
+
+    Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless
+    retries are disabled, in which case the causing exception will be raised.
+
+    :param int total:
+        Total number of retries to allow. Takes precedence over other counts.
+
+        Set to ``None`` to remove this constraint and fall back on other
+        counts. It's a good idea to set this to some sensibly-high value to
+        account for unexpected edge cases and avoid infinite retry loops.
+
+        Set to ``0`` to fail on the first retry.
+
+        Set to ``False`` to disable and imply ``raise_on_redirect=False``.
+
+    :param int connect:
+        How many connection-related errors to retry on.
+
+        These are errors raised before the request is sent to the remote server,
+        which we assume has not triggered the server to process the request.
+
+        Set to ``0`` to fail on the first retry of this type.
+
+    :param int read:
+        How many times to retry on read errors.
+
+        These errors are raised after the request was sent to the server, so the
+        request may have side-effects.
+
+        Set to ``0`` to fail on the first retry of this type.
+
+    :param int redirect:
+        How many redirects to perform. Limit this to avoid infinite redirect
+        loops.
+
+        A redirect is a HTTP response with a status code 301, 302, 303, 307 or
+        308.
+
+        Set to ``0`` to fail on the first retry of this type.
+
+        Set to ``False`` to disable and imply ``raise_on_redirect=False``.
+
+    :param int status:
+        How many times to retry on bad status codes.
+
+        These are retries made on responses, where status code matches
+        ``status_forcelist``.
+
+        Set to ``0`` to fail on the first retry of this type.
+
+    :param iterable method_whitelist:
+        Set of uppercased HTTP method verbs that we should retry on.
+
+        By default, we only retry on methods which are considered to be
+        idempotent (multiple requests with the same parameters end with the
+        same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`.
+
+        Set to a ``False`` value to retry on any verb.
+
+    :param iterable status_forcelist:
+        A set of integer HTTP status codes that we should force a retry on.
+        A retry is initiated if the request method is in ``method_whitelist``
+        and the response status code is in ``status_forcelist``.
+
+        By default, this is disabled with ``None``.
+
+    :param float backoff_factor:
+        A backoff factor to apply between attempts after the second try
+        (most errors are resolved immediately by a second try without a
+        delay). urllib3 will sleep for::
+
+            {backoff factor} * (2 ^ ({number of total retries} - 1))
+
+        seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep
+        for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer
+        than :attr:`Retry.BACKOFF_MAX`.
+
+        By default, backoff is disabled (set to 0).
+
+    :param bool raise_on_redirect: Whether, if the number of redirects is
+        exhausted, to raise a MaxRetryError, or to return a response with a
+        response code in the 3xx range.
+
+    :param bool raise_on_status: Similar meaning to ``raise_on_redirect``:
+        whether we should raise an exception, or return a response,
+        if status falls in ``status_forcelist`` range and retries have
+        been exhausted.
+
+    :param tuple history: The history of the request encountered during
+        each call to :meth:`~Retry.increment`. The list is in the order
+        the requests occurred. Each list item is of class :class:`RequestHistory`.
+
+    :param bool respect_retry_after_header:
+        Whether to respect Retry-After header on status codes defined as
+        :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not.
+
+    """
+
+    DEFAULT_METHOD_WHITELIST = frozenset([
+        'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE'])
+
+    RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503])
+
+    #: Maximum backoff time.
+    BACKOFF_MAX = 120
+
+    def __init__(self, total=10, connect=None, read=None, redirect=None, status=None,
+                 method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None,
+                 backoff_factor=0, raise_on_redirect=True, raise_on_status=True,
+                 history=None, respect_retry_after_header=True):
+
+        self.total = total
+        self.connect = connect
+        self.read = read
+        self.status = status
+
+        if redirect is False or total is False:
+            redirect = 0
+            raise_on_redirect = False
+
+        self.redirect = redirect
+        self.status_forcelist = status_forcelist or set()
+        self.method_whitelist = method_whitelist
+        self.backoff_factor = backoff_factor
+        self.raise_on_redirect = raise_on_redirect
+        self.raise_on_status = raise_on_status
+        self.history = history or tuple()
+        self.respect_retry_after_header = respect_retry_after_header
+
+    def new(self, **kw):
+        params = dict(
+            total=self.total,
+            connect=self.connect, read=self.read, redirect=self.redirect, status=self.status,
+            method_whitelist=self.method_whitelist,
+            status_forcelist=self.status_forcelist,
+            backoff_factor=self.backoff_factor,
+            raise_on_redirect=self.raise_on_redirect,
+            raise_on_status=self.raise_on_status,
+            history=self.history,
+        )
+        params.update(kw)
+        return type(self)(**params)
+
+    @classmethod
+    def from_int(cls, retries, redirect=True, default=None):
+        """ Backwards-compatibility for the old retries format."""
+        if retries is None:
+            retries = default if default is not None else cls.DEFAULT
+
+        if isinstance(retries, Retry):
+            return retries
+
+        redirect = bool(redirect) and None
+        new_retries = cls(retries, redirect=redirect)
+        log.debug("Converted retries value: %r -> %r", retries, new_retries)
+        return new_retries
+
+    def get_backoff_time(self):
+        """ Formula for computing the current backoff
+
+        :rtype: float
+        """
+        # We want to consider only the last consecutive errors sequence (Ignore redirects).
+        consecutive_errors_len = len(list(takewhile(lambda x: x.redirect_location is None,
+                                                    reversed(self.history))))
+        if consecutive_errors_len <= 1:
+            return 0
+
+        backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1))
+        return min(self.BACKOFF_MAX, backoff_value)
+
+    def parse_retry_after(self, retry_after):
+        # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4
+        if re.match(r"^\s*[0-9]+\s*$", retry_after):
+            seconds = int(retry_after)
+        else:
+            retry_date_tuple = email.utils.parsedate(retry_after)
+            if retry_date_tuple is None:
+                raise InvalidHeader("Invalid Retry-After header: %s" % retry_after)
+            retry_date = time.mktime(retry_date_tuple)
+            seconds = retry_date - time.time()
+
+        if seconds < 0:
+            seconds = 0
+
+        return seconds
+
+    def get_retry_after(self, response):
+        """ Get the value of Retry-After in seconds. """
+
+        retry_after = response.getheader("Retry-After")
+
+        if retry_after is None:
+            return None
+
+        return self.parse_retry_after(retry_after)
+
+    def sleep_for_retry(self, response=None):
+        retry_after = self.get_retry_after(response)
+        if retry_after:
+            time.sleep(retry_after)
+            return True
+
+        return False
+
+    def _sleep_backoff(self):
+        backoff = self.get_backoff_time()
+        if backoff <= 0:
+            return
+        time.sleep(backoff)
+
+    def sleep(self, response=None):
+        """ Sleep between retry attempts.
+
+        This method will respect a server's ``Retry-After`` response header
+        and sleep the duration of the time requested. If that is not present, it
+        will use an exponential backoff. By default, the backoff factor is 0 and
+        this method will return immediately.
+        """
+
+        if response:
+            slept = self.sleep_for_retry(response)
+            if slept:
+                return
+
+        self._sleep_backoff()
+
+    def _is_connection_error(self, err):
+        """ Errors when we're fairly sure that the server did not receive the
+        request, so it should be safe to retry.
+        """
+        return isinstance(err, ConnectTimeoutError)
+
+    def _is_read_error(self, err):
+        """ Errors that occur after the request has been started, so we should
+        assume that the server began processing it.
+        """
+        return isinstance(err, (ReadTimeoutError, ProtocolError))
+
+    def _is_method_retryable(self, method):
+        """ Checks if a given HTTP method should be retried upon, depending if
+        it is included on the method whitelist.
+        """
+        if self.method_whitelist and method.upper() not in self.method_whitelist:
+            return False
+
+        return True
+
+    def is_retry(self, method, status_code, has_retry_after=False):
+        """ Is this method/status code retryable? (Based on whitelists and control
+        variables such as the number of total retries to allow, whether to
+        respect the Retry-After header, whether this header is present, and
+        whether the returned status code is on the list of status codes to
+        be retried upon on the presence of the aforementioned header)
+        """
+        if not self._is_method_retryable(method):
+            return False
+
+        if self.status_forcelist and status_code in self.status_forcelist:
+            return True
+
+        return (self.total and self.respect_retry_after_header and
+                has_retry_after and (status_code in self.RETRY_AFTER_STATUS_CODES))
+
+    def is_exhausted(self):
+        """ Are we out of retries? """
+        retry_counts = (self.total, self.connect, self.read, self.redirect, self.status)
+        retry_counts = list(filter(None, retry_counts))
+        if not retry_counts:
+            return False
+
+        return min(retry_counts) < 0
+
+    def increment(self, method=None, url=None, response=None, error=None,
+                  _pool=None, _stacktrace=None):
+        """ Return a new Retry object with incremented retry counters.
+
+        :param response: A response object, or None, if the server did not
+            return a response.
+        :type response: :class:`~urllib3.response.HTTPResponse`
+        :param Exception error: An error encountered during the request, or
+            None if the response was received successfully.
+
+        :return: A new ``Retry`` object.
+        """
+        if self.total is False and error:
+            # Disabled, indicate to re-raise the error.
+            raise six.reraise(type(error), error, _stacktrace)
+
+        total = self.total
+        if total is not None:
+            total -= 1
+
+        connect = self.connect
+        read = self.read
+        redirect = self.redirect
+        status_count = self.status
+        cause = 'unknown'
+        status = None
+        redirect_location = None
+
+        if error and self._is_connection_error(error):
+            # Connect retry?
+            if connect is False:
+                raise six.reraise(type(error), error, _stacktrace)
+            elif connect is not None:
+                connect -= 1
+
+        elif error and self._is_read_error(error):
+            # Read retry?
+            if read is False or not self._is_method_retryable(method):
+                raise six.reraise(type(error), error, _stacktrace)
+            elif read is not None:
+                read -= 1
+
+        elif response and response.get_redirect_location():
+            # Redirect retry?
+            if redirect is not None:
+                redirect -= 1
+            cause = 'too many redirects'
+            redirect_location = response.get_redirect_location()
+            status = response.status
+
+        else:
+            # Incrementing because of a server error like a 500 in
+            # status_forcelist and a the given method is in the whitelist
+            cause = ResponseError.GENERIC_ERROR
+            if response and response.status:
+                if status_count is not None:
+                    status_count -= 1
+                cause = ResponseError.SPECIFIC_ERROR.format(
+                    status_code=response.status)
+                status = response.status
+
+        history = self.history + (RequestHistory(method, url, error, status, redirect_location),)
+
+        new_retry = self.new(
+            total=total,
+            connect=connect, read=read, redirect=redirect, status=status_count,
+            history=history)
+
+        if new_retry.is_exhausted():
+            raise MaxRetryError(_pool, url, error or ResponseError(cause))
+
+        log.debug("Incremented Retry for (url='%s'): %r", url, new_retry)
+
+        return new_retry
+
+    def __repr__(self):
+        return ('{cls.__name__}(total={self.total}, connect={self.connect}, '
+                'read={self.read}, redirect={self.redirect}, status={self.status})').format(
+                    cls=type(self), self=self)
+
+
+# For backwards compatibility (equivalent to pre-v1.9):
+Retry.DEFAULT = Retry(3)
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/selectors.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/selectors.py
new file mode 100644
index 0000000000000000000000000000000000000000..d75cb266bc3d1184c3971955ba8dba8d50d440da
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/selectors.py
@@ -0,0 +1,581 @@
+# Backport of selectors.py from Python 3.5+ to support Python < 3.4
+# Also has the behavior specified in PEP 475 which is to retry syscalls
+# in the case of an EINTR error. This module is required because selectors34
+# does not follow this behavior and instead returns that no dile descriptor
+# events have occurred rather than retry the syscall. The decision to drop
+# support for select.devpoll is made to maintain 100% test coverage.
+
+import errno
+import math
+import select
+import socket
+import sys
+import time
+from collections import namedtuple, Mapping
+
+try:
+    monotonic = time.monotonic
+except (AttributeError, ImportError):  # Python 3.3<
+    monotonic = time.time
+
+EVENT_READ = (1 << 0)
+EVENT_WRITE = (1 << 1)
+
+HAS_SELECT = True  # Variable that shows whether the platform has a selector.
+_SYSCALL_SENTINEL = object()  # Sentinel in case a system call returns None.
+_DEFAULT_SELECTOR = None
+
+
+class SelectorError(Exception):
+    def __init__(self, errcode):
+        super(SelectorError, self).__init__()
+        self.errno = errcode
+
+    def __repr__(self):
+        return "<SelectorError errno={0}>".format(self.errno)
+
+    def __str__(self):
+        return self.__repr__()
+
+
+def _fileobj_to_fd(fileobj):
+    """ Return a file descriptor from a file object. If
+    given an integer will simply return that integer back. """
+    if isinstance(fileobj, int):
+        fd = fileobj
+    else:
+        try:
+            fd = int(fileobj.fileno())
+        except (AttributeError, TypeError, ValueError):
+            raise ValueError("Invalid file object: {0!r}".format(fileobj))
+    if fd < 0:
+        raise ValueError("Invalid file descriptor: {0}".format(fd))
+    return fd
+
+
+# Determine which function to use to wrap system calls because Python 3.5+
+# already handles the case when system calls are interrupted.
+if sys.version_info >= (3, 5):
+    def _syscall_wrapper(func, _, *args, **kwargs):
+        """ This is the short-circuit version of the below logic
+        because in Python 3.5+ all system calls automatically restart
+        and recalculate their timeouts. """
+        try:
+            return func(*args, **kwargs)
+        except (OSError, IOError, select.error) as e:
+            errcode = None
+            if hasattr(e, "errno"):
+                errcode = e.errno
+            raise SelectorError(errcode)
+else:
+    def _syscall_wrapper(func, recalc_timeout, *args, **kwargs):
+        """ Wrapper function for syscalls that could fail due to EINTR.
+        All functions should be retried if there is time left in the timeout
+        in accordance with PEP 475. """
+        timeout = kwargs.get("timeout", None)
+        if timeout is None:
+            expires = None
+            recalc_timeout = False
+        else:
+            timeout = float(timeout)
+            if timeout < 0.0:  # Timeout less than 0 treated as no timeout.
+                expires = None
+            else:
+                expires = monotonic() + timeout
+
+        args = list(args)
+        if recalc_timeout and "timeout" not in kwargs:
+            raise ValueError(
+                "Timeout must be in args or kwargs to be recalculated")
+
+        result = _SYSCALL_SENTINEL
+        while result is _SYSCALL_SENTINEL:
+            try:
+                result = func(*args, **kwargs)
+            # OSError is thrown by select.select
+            # IOError is thrown by select.epoll.poll
+            # select.error is thrown by select.poll.poll
+            # Aren't we thankful for Python 3.x rework for exceptions?
+            except (OSError, IOError, select.error) as e:
+                # select.error wasn't a subclass of OSError in the past.
+                errcode = None
+                if hasattr(e, "errno"):
+                    errcode = e.errno
+                elif hasattr(e, "args"):
+                    errcode = e.args[0]
+
+                # Also test for the Windows equivalent of EINTR.
+                is_interrupt = (errcode == errno.EINTR or (hasattr(errno, "WSAEINTR") and
+                                                           errcode == errno.WSAEINTR))
+
+                if is_interrupt:
+                    if expires is not None:
+                        current_time = monotonic()
+                        if current_time > expires:
+                            raise OSError(errno=errno.ETIMEDOUT)
+                        if recalc_timeout:
+                            if "timeout" in kwargs:
+                                kwargs["timeout"] = expires - current_time
+                    continue
+                if errcode:
+                    raise SelectorError(errcode)
+                else:
+                    raise
+        return result
+
+
+SelectorKey = namedtuple('SelectorKey', ['fileobj', 'fd', 'events', 'data'])
+
+
+class _SelectorMapping(Mapping):
+    """ Mapping of file objects to selector keys """
+
+    def __init__(self, selector):
+        self._selector = selector
+
+    def __len__(self):
+        return len(self._selector._fd_to_key)
+
+    def __getitem__(self, fileobj):
+        try:
+            fd = self._selector._fileobj_lookup(fileobj)
+            return self._selector._fd_to_key[fd]
+        except KeyError:
+            raise KeyError("{0!r} is not registered.".format(fileobj))
+
+    def __iter__(self):
+        return iter(self._selector._fd_to_key)
+
+
+class BaseSelector(object):
+    """ Abstract Selector class
+
+    A selector supports registering file objects to be monitored
+    for specific I/O events.
+
+    A file object is a file descriptor or any object with a
+    `fileno()` method. An arbitrary object can be attached to the
+    file object which can be used for example to store context info,
+    a callback, etc.
+
+    A selector can use various implementations (select(), poll(), epoll(),
+    and kqueue()) depending on the platform. The 'DefaultSelector' class uses
+    the most efficient implementation for the current platform.
+    """
+    def __init__(self):
+        # Maps file descriptors to keys.
+        self._fd_to_key = {}
+
+        # Read-only mapping returned by get_map()
+        self._map = _SelectorMapping(self)
+
+    def _fileobj_lookup(self, fileobj):
+        """ Return a file descriptor from a file object.
+        This wraps _fileobj_to_fd() to do an exhaustive
+        search in case the object is invalid but we still
+        have it in our map. Used by unregister() so we can
+        unregister an object that was previously registered
+        even if it is closed. It is also used by _SelectorMapping
+        """
+        try:
+            return _fileobj_to_fd(fileobj)
+        except ValueError:
+
+            # Search through all our mapped keys.
+            for key in self._fd_to_key.values():
+                if key.fileobj is fileobj:
+                    return key.fd
+
+            # Raise ValueError after all.
+            raise
+
+    def register(self, fileobj, events, data=None):
+        """ Register a file object for a set of events to monitor. """
+        if (not events) or (events & ~(EVENT_READ | EVENT_WRITE)):
+            raise ValueError("Invalid events: {0!r}".format(events))
+
+        key = SelectorKey(fileobj, self._fileobj_lookup(fileobj), events, data)
+
+        if key.fd in self._fd_to_key:
+            raise KeyError("{0!r} (FD {1}) is already registered"
+                           .format(fileobj, key.fd))
+
+        self._fd_to_key[key.fd] = key
+        return key
+
+    def unregister(self, fileobj):
+        """ Unregister a file object from being monitored. """
+        try:
+            key = self._fd_to_key.pop(self._fileobj_lookup(fileobj))
+        except KeyError:
+            raise KeyError("{0!r} is not registered".format(fileobj))
+
+        # Getting the fileno of a closed socket on Windows errors with EBADF.
+        except socket.error as e:  # Platform-specific: Windows.
+            if e.errno != errno.EBADF:
+                raise
+            else:
+                for key in self._fd_to_key.values():
+                    if key.fileobj is fileobj:
+                        self._fd_to_key.pop(key.fd)
+                        break
+                else:
+                    raise KeyError("{0!r} is not registered".format(fileobj))
+        return key
+
+    def modify(self, fileobj, events, data=None):
+        """ Change a registered file object monitored events and data. """
+        # NOTE: Some subclasses optimize this operation even further.
+        try:
+            key = self._fd_to_key[self._fileobj_lookup(fileobj)]
+        except KeyError:
+            raise KeyError("{0!r} is not registered".format(fileobj))
+
+        if events != key.events:
+            self.unregister(fileobj)
+            key = self.register(fileobj, events, data)
+
+        elif data != key.data:
+            # Use a shortcut to update the data.
+            key = key._replace(data=data)
+            self._fd_to_key[key.fd] = key
+
+        return key
+
+    def select(self, timeout=None):
+        """ Perform the actual selection until some monitored file objects
+        are ready or the timeout expires. """
+        raise NotImplementedError()
+
+    def close(self):
+        """ Close the selector. This must be called to ensure that all
+        underlying resources are freed. """
+        self._fd_to_key.clear()
+        self._map = None
+
+    def get_key(self, fileobj):
+        """ Return the key associated with a registered file object. """
+        mapping = self.get_map()
+        if mapping is None:
+            raise RuntimeError("Selector is closed")
+        try:
+            return mapping[fileobj]
+        except KeyError:
+            raise KeyError("{0!r} is not registered".format(fileobj))
+
+    def get_map(self):
+        """ Return a mapping of file objects to selector keys """
+        return self._map
+
+    def _key_from_fd(self, fd):
+        """ Return the key associated to a given file descriptor
+         Return None if it is not found. """
+        try:
+            return self._fd_to_key[fd]
+        except KeyError:
+            return None
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, *args):
+        self.close()
+
+
+# Almost all platforms have select.select()
+if hasattr(select, "select"):
+    class SelectSelector(BaseSelector):
+        """ Select-based selector. """
+        def __init__(self):
+            super(SelectSelector, self).__init__()
+            self._readers = set()
+            self._writers = set()
+
+        def register(self, fileobj, events, data=None):
+            key = super(SelectSelector, self).register(fileobj, events, data)
+            if events & EVENT_READ:
+                self._readers.add(key.fd)
+            if events & EVENT_WRITE:
+                self._writers.add(key.fd)
+            return key
+
+        def unregister(self, fileobj):
+            key = super(SelectSelector, self).unregister(fileobj)
+            self._readers.discard(key.fd)
+            self._writers.discard(key.fd)
+            return key
+
+        def _select(self, r, w, timeout=None):
+            """ Wrapper for select.select because timeout is a positional arg """
+            return select.select(r, w, [], timeout)
+
+        def select(self, timeout=None):
+            # Selecting on empty lists on Windows errors out.
+            if not len(self._readers) and not len(self._writers):
+                return []
+
+            timeout = None if timeout is None else max(timeout, 0.0)
+            ready = []
+            r, w, _ = _syscall_wrapper(self._select, True, self._readers,
+                                       self._writers, timeout)
+            r = set(r)
+            w = set(w)
+            for fd in r | w:
+                events = 0
+                if fd in r:
+                    events |= EVENT_READ
+                if fd in w:
+                    events |= EVENT_WRITE
+
+                key = self._key_from_fd(fd)
+                if key:
+                    ready.append((key, events & key.events))
+            return ready
+
+
+if hasattr(select, "poll"):
+    class PollSelector(BaseSelector):
+        """ Poll-based selector """
+        def __init__(self):
+            super(PollSelector, self).__init__()
+            self._poll = select.poll()
+
+        def register(self, fileobj, events, data=None):
+            key = super(PollSelector, self).register(fileobj, events, data)
+            event_mask = 0
+            if events & EVENT_READ:
+                event_mask |= select.POLLIN
+            if events & EVENT_WRITE:
+                event_mask |= select.POLLOUT
+            self._poll.register(key.fd, event_mask)
+            return key
+
+        def unregister(self, fileobj):
+            key = super(PollSelector, self).unregister(fileobj)
+            self._poll.unregister(key.fd)
+            return key
+
+        def _wrap_poll(self, timeout=None):
+            """ Wrapper function for select.poll.poll() so that
+            _syscall_wrapper can work with only seconds. """
+            if timeout is not None:
+                if timeout <= 0:
+                    timeout = 0
+                else:
+                    # select.poll.poll() has a resolution of 1 millisecond,
+                    # round away from zero to wait *at least* timeout seconds.
+                    timeout = math.ceil(timeout * 1e3)
+
+            result = self._poll.poll(timeout)
+            return result
+
+        def select(self, timeout=None):
+            ready = []
+            fd_events = _syscall_wrapper(self._wrap_poll, True, timeout=timeout)
+            for fd, event_mask in fd_events:
+                events = 0
+                if event_mask & ~select.POLLIN:
+                    events |= EVENT_WRITE
+                if event_mask & ~select.POLLOUT:
+                    events |= EVENT_READ
+
+                key = self._key_from_fd(fd)
+                if key:
+                    ready.append((key, events & key.events))
+
+            return ready
+
+
+if hasattr(select, "epoll"):
+    class EpollSelector(BaseSelector):
+        """ Epoll-based selector """
+        def __init__(self):
+            super(EpollSelector, self).__init__()
+            self._epoll = select.epoll()
+
+        def fileno(self):
+            return self._epoll.fileno()
+
+        def register(self, fileobj, events, data=None):
+            key = super(EpollSelector, self).register(fileobj, events, data)
+            events_mask = 0
+            if events & EVENT_READ:
+                events_mask |= select.EPOLLIN
+            if events & EVENT_WRITE:
+                events_mask |= select.EPOLLOUT
+            _syscall_wrapper(self._epoll.register, False, key.fd, events_mask)
+            return key
+
+        def unregister(self, fileobj):
+            key = super(EpollSelector, self).unregister(fileobj)
+            try:
+                _syscall_wrapper(self._epoll.unregister, False, key.fd)
+            except SelectorError:
+                # This can occur when the fd was closed since registry.
+                pass
+            return key
+
+        def select(self, timeout=None):
+            if timeout is not None:
+                if timeout <= 0:
+                    timeout = 0.0
+                else:
+                    # select.epoll.poll() has a resolution of 1 millisecond
+                    # but luckily takes seconds so we don't need a wrapper
+                    # like PollSelector. Just for better rounding.
+                    timeout = math.ceil(timeout * 1e3) * 1e-3
+                timeout = float(timeout)
+            else:
+                timeout = -1.0  # epoll.poll() must have a float.
+
+            # We always want at least 1 to ensure that select can be called
+            # with no file descriptors registered. Otherwise will fail.
+            max_events = max(len(self._fd_to_key), 1)
+
+            ready = []
+            fd_events = _syscall_wrapper(self._epoll.poll, True,
+                                         timeout=timeout,
+                                         maxevents=max_events)
+            for fd, event_mask in fd_events:
+                events = 0
+                if event_mask & ~select.EPOLLIN:
+                    events |= EVENT_WRITE
+                if event_mask & ~select.EPOLLOUT:
+                    events |= EVENT_READ
+
+                key = self._key_from_fd(fd)
+                if key:
+                    ready.append((key, events & key.events))
+            return ready
+
+        def close(self):
+            self._epoll.close()
+            super(EpollSelector, self).close()
+
+
+if hasattr(select, "kqueue"):
+    class KqueueSelector(BaseSelector):
+        """ Kqueue / Kevent-based selector """
+        def __init__(self):
+            super(KqueueSelector, self).__init__()
+            self._kqueue = select.kqueue()
+
+        def fileno(self):
+            return self._kqueue.fileno()
+
+        def register(self, fileobj, events, data=None):
+            key = super(KqueueSelector, self).register(fileobj, events, data)
+            if events & EVENT_READ:
+                kevent = select.kevent(key.fd,
+                                       select.KQ_FILTER_READ,
+                                       select.KQ_EV_ADD)
+
+                _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0)
+
+            if events & EVENT_WRITE:
+                kevent = select.kevent(key.fd,
+                                       select.KQ_FILTER_WRITE,
+                                       select.KQ_EV_ADD)
+
+                _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0)
+
+            return key
+
+        def unregister(self, fileobj):
+            key = super(KqueueSelector, self).unregister(fileobj)
+            if key.events & EVENT_READ:
+                kevent = select.kevent(key.fd,
+                                       select.KQ_FILTER_READ,
+                                       select.KQ_EV_DELETE)
+                try:
+                    _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0)
+                except SelectorError:
+                    pass
+            if key.events & EVENT_WRITE:
+                kevent = select.kevent(key.fd,
+                                       select.KQ_FILTER_WRITE,
+                                       select.KQ_EV_DELETE)
+                try:
+                    _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0)
+                except SelectorError:
+                    pass
+
+            return key
+
+        def select(self, timeout=None):
+            if timeout is not None:
+                timeout = max(timeout, 0)
+
+            max_events = len(self._fd_to_key) * 2
+            ready_fds = {}
+
+            kevent_list = _syscall_wrapper(self._kqueue.control, True,
+                                           None, max_events, timeout)
+
+            for kevent in kevent_list:
+                fd = kevent.ident
+                event_mask = kevent.filter
+                events = 0
+                if event_mask == select.KQ_FILTER_READ:
+                    events |= EVENT_READ
+                if event_mask == select.KQ_FILTER_WRITE:
+                    events |= EVENT_WRITE
+
+                key = self._key_from_fd(fd)
+                if key:
+                    if key.fd not in ready_fds:
+                        ready_fds[key.fd] = (key, events & key.events)
+                    else:
+                        old_events = ready_fds[key.fd][1]
+                        ready_fds[key.fd] = (key, (events | old_events) & key.events)
+
+            return list(ready_fds.values())
+
+        def close(self):
+            self._kqueue.close()
+            super(KqueueSelector, self).close()
+
+
+if not hasattr(select, 'select'):  # Platform-specific: AppEngine
+    HAS_SELECT = False
+
+
+def _can_allocate(struct):
+    """ Checks that select structs can be allocated by the underlying
+    operating system, not just advertised by the select module. We don't
+    check select() because we'll be hopeful that most platforms that
+    don't have it available will not advertise it. (ie: GAE) """
+    try:
+        # select.poll() objects won't fail until used.
+        if struct == 'poll':
+            p = select.poll()
+            p.poll(0)
+
+        # All others will fail on allocation.
+        else:
+            getattr(select, struct)().close()
+        return True
+    except (OSError, AttributeError) as e:
+        return False
+
+
+# Choose the best implementation, roughly:
+# kqueue == epoll > poll > select. Devpoll not supported. (See above)
+# select() also can't accept a FD > FD_SETSIZE (usually around 1024)
+def DefaultSelector():
+    """ This function serves as a first call for DefaultSelector to
+    detect if the select module is being monkey-patched incorrectly
+    by eventlet, greenlet, and preserve proper behavior. """
+    global _DEFAULT_SELECTOR
+    if _DEFAULT_SELECTOR is None:
+        if _can_allocate('kqueue'):
+            _DEFAULT_SELECTOR = KqueueSelector
+        elif _can_allocate('epoll'):
+            _DEFAULT_SELECTOR = EpollSelector
+        elif _can_allocate('poll'):
+            _DEFAULT_SELECTOR = PollSelector
+        elif hasattr(select, 'select'):
+            _DEFAULT_SELECTOR = SelectSelector
+        else:  # Platform-specific: AppEngine
+            raise ValueError('Platform does not have a selector')
+    return _DEFAULT_SELECTOR()
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/ssl_.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/ssl_.py
new file mode 100644
index 0000000000000000000000000000000000000000..32fd9eda8c4631fbc75c01bdd773230a35723ea1
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/ssl_.py
@@ -0,0 +1,341 @@
+from __future__ import absolute_import
+import errno
+import warnings
+import hmac
+
+from binascii import hexlify, unhexlify
+from hashlib import md5, sha1, sha256
+
+from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning
+
+
+SSLContext = None
+HAS_SNI = False
+IS_PYOPENSSL = False
+IS_SECURETRANSPORT = False
+
+# Maps the length of a digest to a possible hash function producing this digest
+HASHFUNC_MAP = {
+    32: md5,
+    40: sha1,
+    64: sha256,
+}
+
+
+def _const_compare_digest_backport(a, b):
+    """
+    Compare two digests of equal length in constant time.
+
+    The digests must be of type str/bytes.
+    Returns True if the digests match, and False otherwise.
+    """
+    result = abs(len(a) - len(b))
+    for l, r in zip(bytearray(a), bytearray(b)):
+        result |= l ^ r
+    return result == 0
+
+
+_const_compare_digest = getattr(hmac, 'compare_digest',
+                                _const_compare_digest_backport)
+
+
+try:  # Test for SSL features
+    import ssl
+    from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23
+    from ssl import HAS_SNI  # Has SNI?
+except ImportError:
+    pass
+
+
+try:
+    from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION
+except ImportError:
+    OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000
+    OP_NO_COMPRESSION = 0x20000
+
+# A secure default.
+# Sources for more information on TLS ciphers:
+#
+# - https://wiki.mozilla.org/Security/Server_Side_TLS
+# - https://www.ssllabs.com/projects/best-practices/index.html
+# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
+#
+# The general intent is:
+# - Prefer TLS 1.3 cipher suites
+# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE),
+# - prefer ECDHE over DHE for better performance,
+# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and
+#   security,
+# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common,
+# - disable NULL authentication, MD5 MACs and DSS for security reasons.
+DEFAULT_CIPHERS = ':'.join([
+    'TLS13-AES-256-GCM-SHA384',
+    'TLS13-CHACHA20-POLY1305-SHA256',
+    'TLS13-AES-128-GCM-SHA256',
+    'ECDH+AESGCM',
+    'ECDH+CHACHA20',
+    'DH+AESGCM',
+    'DH+CHACHA20',
+    'ECDH+AES256',
+    'DH+AES256',
+    'ECDH+AES128',
+    'DH+AES',
+    'RSA+AESGCM',
+    'RSA+AES',
+    '!aNULL',
+    '!eNULL',
+    '!MD5',
+])
+
+try:
+    from ssl import SSLContext  # Modern SSL?
+except ImportError:
+    import sys
+
+    class SSLContext(object):  # Platform-specific: Python 2 & 3.1
+        supports_set_ciphers = ((2, 7) <= sys.version_info < (3,) or
+                                (3, 2) <= sys.version_info)
+
+        def __init__(self, protocol_version):
+            self.protocol = protocol_version
+            # Use default values from a real SSLContext
+            self.check_hostname = False
+            self.verify_mode = ssl.CERT_NONE
+            self.ca_certs = None
+            self.options = 0
+            self.certfile = None
+            self.keyfile = None
+            self.ciphers = None
+
+        def load_cert_chain(self, certfile, keyfile):
+            self.certfile = certfile
+            self.keyfile = keyfile
+
+        def load_verify_locations(self, cafile=None, capath=None):
+            self.ca_certs = cafile
+
+            if capath is not None:
+                raise SSLError("CA directories not supported in older Pythons")
+
+        def set_ciphers(self, cipher_suite):
+            if not self.supports_set_ciphers:
+                raise TypeError(
+                    'Your version of Python does not support setting '
+                    'a custom cipher suite. Please upgrade to Python '
+                    '2.7, 3.2, or later if you need this functionality.'
+                )
+            self.ciphers = cipher_suite
+
+        def wrap_socket(self, socket, server_hostname=None, server_side=False):
+            warnings.warn(
+                'A true SSLContext object is not available. This prevents '
+                'urllib3 from configuring SSL appropriately and may cause '
+                'certain SSL connections to fail. You can upgrade to a newer '
+                'version of Python to solve this. For more information, see '
+                'https://urllib3.readthedocs.io/en/latest/advanced-usage.html'
+                '#ssl-warnings',
+                InsecurePlatformWarning
+            )
+            kwargs = {
+                'keyfile': self.keyfile,
+                'certfile': self.certfile,
+                'ca_certs': self.ca_certs,
+                'cert_reqs': self.verify_mode,
+                'ssl_version': self.protocol,
+                'server_side': server_side,
+            }
+            if self.supports_set_ciphers:  # Platform-specific: Python 2.7+
+                return wrap_socket(socket, ciphers=self.ciphers, **kwargs)
+            else:  # Platform-specific: Python 2.6
+                return wrap_socket(socket, **kwargs)
+
+
+def assert_fingerprint(cert, fingerprint):
+    """
+    Checks if given fingerprint matches the supplied certificate.
+
+    :param cert:
+        Certificate as bytes object.
+    :param fingerprint:
+        Fingerprint as string of hexdigits, can be interspersed by colons.
+    """
+
+    fingerprint = fingerprint.replace(':', '').lower()
+    digest_length = len(fingerprint)
+    hashfunc = HASHFUNC_MAP.get(digest_length)
+    if not hashfunc:
+        raise SSLError(
+            'Fingerprint of invalid length: {0}'.format(fingerprint))
+
+    # We need encode() here for py32; works on py2 and p33.
+    fingerprint_bytes = unhexlify(fingerprint.encode())
+
+    cert_digest = hashfunc(cert).digest()
+
+    if not _const_compare_digest(cert_digest, fingerprint_bytes):
+        raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".'
+                       .format(fingerprint, hexlify(cert_digest)))
+
+
+def resolve_cert_reqs(candidate):
+    """
+    Resolves the argument to a numeric constant, which can be passed to
+    the wrap_socket function/method from the ssl module.
+    Defaults to :data:`ssl.CERT_NONE`.
+    If given a string it is assumed to be the name of the constant in the
+    :mod:`ssl` module or its abbrevation.
+    (So you can specify `REQUIRED` instead of `CERT_REQUIRED`.
+    If it's neither `None` nor a string we assume it is already the numeric
+    constant which can directly be passed to wrap_socket.
+    """
+    if candidate is None:
+        return CERT_NONE
+
+    if isinstance(candidate, str):
+        res = getattr(ssl, candidate, None)
+        if res is None:
+            res = getattr(ssl, 'CERT_' + candidate)
+        return res
+
+    return candidate
+
+
+def resolve_ssl_version(candidate):
+    """
+    like resolve_cert_reqs
+    """
+    if candidate is None:
+        return PROTOCOL_SSLv23
+
+    if isinstance(candidate, str):
+        res = getattr(ssl, candidate, None)
+        if res is None:
+            res = getattr(ssl, 'PROTOCOL_' + candidate)
+        return res
+
+    return candidate
+
+
+def create_urllib3_context(ssl_version=None, cert_reqs=None,
+                           options=None, ciphers=None):
+    """All arguments have the same meaning as ``ssl_wrap_socket``.
+
+    By default, this function does a lot of the same work that
+    ``ssl.create_default_context`` does on Python 3.4+. It:
+
+    - Disables SSLv2, SSLv3, and compression
+    - Sets a restricted set of server ciphers
+
+    If you wish to enable SSLv3, you can do::
+
+        from urllib3.util import ssl_
+        context = ssl_.create_urllib3_context()
+        context.options &= ~ssl_.OP_NO_SSLv3
+
+    You can do the same to enable compression (substituting ``COMPRESSION``
+    for ``SSLv3`` in the last line above).
+
+    :param ssl_version:
+        The desired protocol version to use. This will default to
+        PROTOCOL_SSLv23 which will negotiate the highest protocol that both
+        the server and your installation of OpenSSL support.
+    :param cert_reqs:
+        Whether to require the certificate verification. This defaults to
+        ``ssl.CERT_REQUIRED``.
+    :param options:
+        Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``,
+        ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``.
+    :param ciphers:
+        Which cipher suites to allow the server to select.
+    :returns:
+        Constructed SSLContext object with specified options
+    :rtype: SSLContext
+    """
+    context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23)
+
+    # Setting the default here, as we may have no ssl module on import
+    cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs
+
+    if options is None:
+        options = 0
+        # SSLv2 is easily broken and is considered harmful and dangerous
+        options |= OP_NO_SSLv2
+        # SSLv3 has several problems and is now dangerous
+        options |= OP_NO_SSLv3
+        # Disable compression to prevent CRIME attacks for OpenSSL 1.0+
+        # (issue #309)
+        options |= OP_NO_COMPRESSION
+
+    context.options |= options
+
+    if getattr(context, 'supports_set_ciphers', True):  # Platform-specific: Python 2.6
+        context.set_ciphers(ciphers or DEFAULT_CIPHERS)
+
+    context.verify_mode = cert_reqs
+    if getattr(context, 'check_hostname', None) is not None:  # Platform-specific: Python 3.2
+        # We do our own verification, including fingerprints and alternative
+        # hostnames. So disable it here
+        context.check_hostname = False
+    return context
+
+
+def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,
+                    ca_certs=None, server_hostname=None,
+                    ssl_version=None, ciphers=None, ssl_context=None,
+                    ca_cert_dir=None):
+    """
+    All arguments except for server_hostname, ssl_context, and ca_cert_dir have
+    the same meaning as they do when using :func:`ssl.wrap_socket`.
+
+    :param server_hostname:
+        When SNI is supported, the expected hostname of the certificate
+    :param ssl_context:
+        A pre-made :class:`SSLContext` object. If none is provided, one will
+        be created using :func:`create_urllib3_context`.
+    :param ciphers:
+        A string of ciphers we wish the client to support. This is not
+        supported on Python 2.6 as the ssl module does not support it.
+    :param ca_cert_dir:
+        A directory containing CA certificates in multiple separate files, as
+        supported by OpenSSL's -CApath flag or the capath argument to
+        SSLContext.load_verify_locations().
+    """
+    context = ssl_context
+    if context is None:
+        # Note: This branch of code and all the variables in it are no longer
+        # used by urllib3 itself. We should consider deprecating and removing
+        # this code.
+        context = create_urllib3_context(ssl_version, cert_reqs,
+                                         ciphers=ciphers)
+
+    if ca_certs or ca_cert_dir:
+        try:
+            context.load_verify_locations(ca_certs, ca_cert_dir)
+        except IOError as e:  # Platform-specific: Python 2.6, 2.7, 3.2
+            raise SSLError(e)
+        # Py33 raises FileNotFoundError which subclasses OSError
+        # These are not equivalent unless we check the errno attribute
+        except OSError as e:  # Platform-specific: Python 3.3 and beyond
+            if e.errno == errno.ENOENT:
+                raise SSLError(e)
+            raise
+    elif getattr(context, 'load_default_certs', None) is not None:
+        # try to load OS default certs; works well on Windows (require Python3.4+)
+        context.load_default_certs()
+
+    if certfile:
+        context.load_cert_chain(certfile, keyfile)
+    if HAS_SNI:  # Platform-specific: OpenSSL with enabled SNI
+        return context.wrap_socket(sock, server_hostname=server_hostname)
+
+    warnings.warn(
+        'An HTTPS request has been made, but the SNI (Subject Name '
+        'Indication) extension to TLS is not available on this platform. '
+        'This may cause the server to present an incorrect TLS '
+        'certificate, which can cause validation failures. You can upgrade to '
+        'a newer version of Python to solve this. For more information, see '
+        'https://urllib3.readthedocs.io/en/latest/advanced-usage.html'
+        '#ssl-warnings',
+        SNIMissingWarning
+    )
+    return context.wrap_socket(sock)
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/timeout.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/timeout.py
new file mode 100644
index 0000000000000000000000000000000000000000..cec817e6efa53e830cb2b5877faa42013743d5db
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/timeout.py
@@ -0,0 +1,242 @@
+from __future__ import absolute_import
+# The default socket timeout, used by httplib to indicate that no timeout was
+# specified by the user
+from socket import _GLOBAL_DEFAULT_TIMEOUT
+import time
+
+from ..exceptions import TimeoutStateError
+
+# A sentinel value to indicate that no timeout was specified by the user in
+# urllib3
+_Default = object()
+
+
+# Use time.monotonic if available.
+current_time = getattr(time, "monotonic", time.time)
+
+
+class Timeout(object):
+    """ Timeout configuration.
+
+    Timeouts can be defined as a default for a pool::
+
+        timeout = Timeout(connect=2.0, read=7.0)
+        http = PoolManager(timeout=timeout)
+        response = http.request('GET', 'http://example.com/')
+
+    Or per-request (which overrides the default for the pool)::
+
+        response = http.request('GET', 'http://example.com/', timeout=Timeout(10))
+
+    Timeouts can be disabled by setting all the parameters to ``None``::
+
+        no_timeout = Timeout(connect=None, read=None)
+        response = http.request('GET', 'http://example.com/, timeout=no_timeout)
+
+
+    :param total:
+        This combines the connect and read timeouts into one; the read timeout
+        will be set to the time leftover from the connect attempt. In the
+        event that both a connect timeout and a total are specified, or a read
+        timeout and a total are specified, the shorter timeout will be applied.
+
+        Defaults to None.
+
+    :type total: integer, float, or None
+
+    :param connect:
+        The maximum amount of time to wait for a connection attempt to a server
+        to succeed. Omitting the parameter will default the connect timeout to
+        the system default, probably `the global default timeout in socket.py
+        <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_.
+        None will set an infinite timeout for connection attempts.
+
+    :type connect: integer, float, or None
+
+    :param read:
+        The maximum amount of time to wait between consecutive
+        read operations for a response from the server. Omitting
+        the parameter will default the read timeout to the system
+        default, probably `the global default timeout in socket.py
+        <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_.
+        None will set an infinite timeout.
+
+    :type read: integer, float, or None
+
+    .. note::
+
+        Many factors can affect the total amount of time for urllib3 to return
+        an HTTP response.
+
+        For example, Python's DNS resolver does not obey the timeout specified
+        on the socket. Other factors that can affect total request time include
+        high CPU load, high swap, the program running at a low priority level,
+        or other behaviors.
+
+        In addition, the read and total timeouts only measure the time between
+        read operations on the socket connecting the client and the server,
+        not the total amount of time for the request to return a complete
+        response. For most requests, the timeout is raised because the server
+        has not sent the first byte in the specified time. This is not always
+        the case; if a server streams one byte every fifteen seconds, a timeout
+        of 20 seconds will not trigger, even though the request will take
+        several minutes to complete.
+
+        If your goal is to cut off any request after a set amount of wall clock
+        time, consider having a second "watcher" thread to cut off a slow
+        request.
+    """
+
+    #: A sentinel object representing the default timeout value
+    DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT
+
+    def __init__(self, total=None, connect=_Default, read=_Default):
+        self._connect = self._validate_timeout(connect, 'connect')
+        self._read = self._validate_timeout(read, 'read')
+        self.total = self._validate_timeout(total, 'total')
+        self._start_connect = None
+
+    def __str__(self):
+        return '%s(connect=%r, read=%r, total=%r)' % (
+            type(self).__name__, self._connect, self._read, self.total)
+
+    @classmethod
+    def _validate_timeout(cls, value, name):
+        """ Check that a timeout attribute is valid.
+
+        :param value: The timeout value to validate
+        :param name: The name of the timeout attribute to validate. This is
+            used to specify in error messages.
+        :return: The validated and casted version of the given value.
+        :raises ValueError: If it is a numeric value less than or equal to
+            zero, or the type is not an integer, float, or None.
+        """
+        if value is _Default:
+            return cls.DEFAULT_TIMEOUT
+
+        if value is None or value is cls.DEFAULT_TIMEOUT:
+            return value
+
+        if isinstance(value, bool):
+            raise ValueError("Timeout cannot be a boolean value. It must "
+                             "be an int, float or None.")
+        try:
+            float(value)
+        except (TypeError, ValueError):
+            raise ValueError("Timeout value %s was %s, but it must be an "
+                             "int, float or None." % (name, value))
+
+        try:
+            if value <= 0:
+                raise ValueError("Attempted to set %s timeout to %s, but the "
+                                 "timeout cannot be set to a value less "
+                                 "than or equal to 0." % (name, value))
+        except TypeError:  # Python 3
+            raise ValueError("Timeout value %s was %s, but it must be an "
+                             "int, float or None." % (name, value))
+
+        return value
+
+    @classmethod
+    def from_float(cls, timeout):
+        """ Create a new Timeout from a legacy timeout value.
+
+        The timeout value used by httplib.py sets the same timeout on the
+        connect(), and recv() socket requests. This creates a :class:`Timeout`
+        object that sets the individual timeouts to the ``timeout`` value
+        passed to this function.
+
+        :param timeout: The legacy timeout value.
+        :type timeout: integer, float, sentinel default object, or None
+        :return: Timeout object
+        :rtype: :class:`Timeout`
+        """
+        return Timeout(read=timeout, connect=timeout)
+
+    def clone(self):
+        """ Create a copy of the timeout object
+
+        Timeout properties are stored per-pool but each request needs a fresh
+        Timeout object to ensure each one has its own start/stop configured.
+
+        :return: a copy of the timeout object
+        :rtype: :class:`Timeout`
+        """
+        # We can't use copy.deepcopy because that will also create a new object
+        # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to
+        # detect the user default.
+        return Timeout(connect=self._connect, read=self._read,
+                       total=self.total)
+
+    def start_connect(self):
+        """ Start the timeout clock, used during a connect() attempt
+
+        :raises urllib3.exceptions.TimeoutStateError: if you attempt
+            to start a timer that has been started already.
+        """
+        if self._start_connect is not None:
+            raise TimeoutStateError("Timeout timer has already been started.")
+        self._start_connect = current_time()
+        return self._start_connect
+
+    def get_connect_duration(self):
+        """ Gets the time elapsed since the call to :meth:`start_connect`.
+
+        :return: Elapsed time.
+        :rtype: float
+        :raises urllib3.exceptions.TimeoutStateError: if you attempt
+            to get duration for a timer that hasn't been started.
+        """
+        if self._start_connect is None:
+            raise TimeoutStateError("Can't get connect duration for timer "
+                                    "that has not started.")
+        return current_time() - self._start_connect
+
+    @property
+    def connect_timeout(self):
+        """ Get the value to use when setting a connection timeout.
+
+        This will be a positive float or integer, the value None
+        (never timeout), or the default system timeout.
+
+        :return: Connect timeout.
+        :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None
+        """
+        if self.total is None:
+            return self._connect
+
+        if self._connect is None or self._connect is self.DEFAULT_TIMEOUT:
+            return self.total
+
+        return min(self._connect, self.total)
+
+    @property
+    def read_timeout(self):
+        """ Get the value for the read timeout.
+
+        This assumes some time has elapsed in the connection timeout and
+        computes the read timeout appropriately.
+
+        If self.total is set, the read timeout is dependent on the amount of
+        time taken by the connect timeout. If the connection time has not been
+        established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be
+        raised.
+
+        :return: Value to use for the read timeout.
+        :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None
+        :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect`
+            has not yet been called on this object.
+        """
+        if (self.total is not None and
+                self.total is not self.DEFAULT_TIMEOUT and
+                self._read is not None and
+                self._read is not self.DEFAULT_TIMEOUT):
+            # In case the connect timeout has not yet been established.
+            if self._start_connect is None:
+                return self._read
+            return max(0, min(self.total - self.get_connect_duration(),
+                              self._read))
+        elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT:
+            return max(0, self.total - self.get_connect_duration())
+        else:
+            return self._read
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/url.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/url.py
new file mode 100644
index 0000000000000000000000000000000000000000..6b6f9968d7a106931ef315066d0ec156a1823112
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/url.py
@@ -0,0 +1,230 @@
+from __future__ import absolute_import
+from collections import namedtuple
+
+from ..exceptions import LocationParseError
+
+
+url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment']
+
+# We only want to normalize urls with an HTTP(S) scheme.
+# urllib3 infers URLs without a scheme (None) to be http.
+NORMALIZABLE_SCHEMES = ('http', 'https', None)
+
+
+class Url(namedtuple('Url', url_attrs)):
+    """
+    Datastructure for representing an HTTP URL. Used as a return value for
+    :func:`parse_url`. Both the scheme and host are normalized as they are
+    both case-insensitive according to RFC 3986.
+    """
+    __slots__ = ()
+
+    def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None,
+                query=None, fragment=None):
+        if path and not path.startswith('/'):
+            path = '/' + path
+        if scheme:
+            scheme = scheme.lower()
+        if host and scheme in NORMALIZABLE_SCHEMES:
+            host = host.lower()
+        return super(Url, cls).__new__(cls, scheme, auth, host, port, path,
+                                       query, fragment)
+
+    @property
+    def hostname(self):
+        """For backwards-compatibility with urlparse. We're nice like that."""
+        return self.host
+
+    @property
+    def request_uri(self):
+        """Absolute path including the query string."""
+        uri = self.path or '/'
+
+        if self.query is not None:
+            uri += '?' + self.query
+
+        return uri
+
+    @property
+    def netloc(self):
+        """Network location including host and port"""
+        if self.port:
+            return '%s:%d' % (self.host, self.port)
+        return self.host
+
+    @property
+    def url(self):
+        """
+        Convert self into a url
+
+        This function should more or less round-trip with :func:`.parse_url`. The
+        returned url may not be exactly the same as the url inputted to
+        :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls
+        with a blank port will have : removed).
+
+        Example: ::
+
+            >>> U = parse_url('http://google.com/mail/')
+            >>> U.url
+            'http://google.com/mail/'
+            >>> Url('http', 'username:password', 'host.com', 80,
+            ... '/path', 'query', 'fragment').url
+            'http://username:password@host.com:80/path?query#fragment'
+        """
+        scheme, auth, host, port, path, query, fragment = self
+        url = ''
+
+        # We use "is not None" we want things to happen with empty strings (or 0 port)
+        if scheme is not None:
+            url += scheme + '://'
+        if auth is not None:
+            url += auth + '@'
+        if host is not None:
+            url += host
+        if port is not None:
+            url += ':' + str(port)
+        if path is not None:
+            url += path
+        if query is not None:
+            url += '?' + query
+        if fragment is not None:
+            url += '#' + fragment
+
+        return url
+
+    def __str__(self):
+        return self.url
+
+
+def split_first(s, delims):
+    """
+    Given a string and an iterable of delimiters, split on the first found
+    delimiter. Return two split parts and the matched delimiter.
+
+    If not found, then the first part is the full input string.
+
+    Example::
+
+        >>> split_first('foo/bar?baz', '?/=')
+        ('foo', 'bar?baz', '/')
+        >>> split_first('foo/bar?baz', '123')
+        ('foo/bar?baz', '', None)
+
+    Scales linearly with number of delims. Not ideal for large number of delims.
+    """
+    min_idx = None
+    min_delim = None
+    for d in delims:
+        idx = s.find(d)
+        if idx < 0:
+            continue
+
+        if min_idx is None or idx < min_idx:
+            min_idx = idx
+            min_delim = d
+
+    if min_idx is None or min_idx < 0:
+        return s, '', None
+
+    return s[:min_idx], s[min_idx + 1:], min_delim
+
+
+def parse_url(url):
+    """
+    Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is
+    performed to parse incomplete urls. Fields not provided will be None.
+
+    Partly backwards-compatible with :mod:`urlparse`.
+
+    Example::
+
+        >>> parse_url('http://google.com/mail/')
+        Url(scheme='http', host='google.com', port=None, path='/mail/', ...)
+        >>> parse_url('google.com:80')
+        Url(scheme=None, host='google.com', port=80, path=None, ...)
+        >>> parse_url('/foo?bar')
+        Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...)
+    """
+
+    # While this code has overlap with stdlib's urlparse, it is much
+    # simplified for our needs and less annoying.
+    # Additionally, this implementations does silly things to be optimal
+    # on CPython.
+
+    if not url:
+        # Empty
+        return Url()
+
+    scheme = None
+    auth = None
+    host = None
+    port = None
+    path = None
+    fragment = None
+    query = None
+
+    # Scheme
+    if '://' in url:
+        scheme, url = url.split('://', 1)
+
+    # Find the earliest Authority Terminator
+    # (http://tools.ietf.org/html/rfc3986#section-3.2)
+    url, path_, delim = split_first(url, ['/', '?', '#'])
+
+    if delim:
+        # Reassemble the path
+        path = delim + path_
+
+    # Auth
+    if '@' in url:
+        # Last '@' denotes end of auth part
+        auth, url = url.rsplit('@', 1)
+
+    # IPv6
+    if url and url[0] == '[':
+        host, url = url.split(']', 1)
+        host += ']'
+
+    # Port
+    if ':' in url:
+        _host, port = url.split(':', 1)
+
+        if not host:
+            host = _host
+
+        if port:
+            # If given, ports must be integers. No whitespace, no plus or
+            # minus prefixes, no non-integer digits such as ^2 (superscript).
+            if not port.isdigit():
+                raise LocationParseError(url)
+            try:
+                port = int(port)
+            except ValueError:
+                raise LocationParseError(url)
+        else:
+            # Blank ports are cool, too. (rfc3986#section-3.2.3)
+            port = None
+
+    elif not host and url:
+        host = url
+
+    if not path:
+        return Url(scheme, auth, host, port, path, query, fragment)
+
+    # Fragment
+    if '#' in path:
+        path, fragment = path.split('#', 1)
+
+    # Query
+    if '?' in path:
+        path, query = path.split('?', 1)
+
+    return Url(scheme, auth, host, port, path, query, fragment)
+
+
+def get_host(url):
+    """
+    Deprecated. Use :func:`parse_url` instead.
+    """
+    p = parse_url(url)
+    return p.scheme or 'http', p.hostname, p.port
diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/wait.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/wait.py
new file mode 100644
index 0000000000000000000000000000000000000000..cb396e508c8cf26258a00bc55ee1479c53f9682f
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/wait.py
@@ -0,0 +1,40 @@
+from .selectors import (
+    HAS_SELECT,
+    DefaultSelector,
+    EVENT_READ,
+    EVENT_WRITE
+)
+
+
+def _wait_for_io_events(socks, events, timeout=None):
+    """ Waits for IO events to be available from a list of sockets
+    or optionally a single socket if passed in. Returns a list of
+    sockets that can be interacted with immediately. """
+    if not HAS_SELECT:
+        raise ValueError('Platform does not have a selector')
+    if not isinstance(socks, list):
+        # Probably just a single socket.
+        if hasattr(socks, "fileno"):
+            socks = [socks]
+        # Otherwise it might be a non-list iterable.
+        else:
+            socks = list(socks)
+    with DefaultSelector() as selector:
+        for sock in socks:
+            selector.register(sock, events)
+        return [key[0].fileobj for key in
+                selector.select(timeout) if key[1] & events]
+
+
+def wait_for_read(socks, timeout=None):
+    """ Waits for reading to be available from a list of sockets
+    or optionally a single socket if passed in. Returns a list of
+    sockets that can be read from immediately. """
+    return _wait_for_io_events(socks, EVENT_READ, timeout)
+
+
+def wait_for_write(socks, timeout=None):
+    """ Waits for writing to be available from a list of sockets
+    or optionally a single socket if passed in. Returns a list of
+    sockets that can be written to immediately. """
+    return _wait_for_io_events(socks, EVENT_WRITE, timeout)
diff --git a/vendor/pip-9.0.3/pip/_vendor/vendor.txt b/vendor/pip-9.0.3/pip/_vendor/vendor.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6d07f2d1f20c28342d21f71365238e98b6478409
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/vendor.txt
@@ -0,0 +1,16 @@
+appdirs==1.4.0
+distlib==0.2.4
+distro==1.0.1
+html5lib==1.0b10
+six==1.10.0
+colorama==0.3.7
+requests==2.11.1
+CacheControl==0.11.7
+lockfile==0.12.2
+ordereddict==1.1  # Only needed on 2.6
+progress==1.2
+ipaddress==1.0.17  # Only needed on 2.6 and 2.7
+packaging==16.8
+pyparsing==2.1.10
+retrying==1.3.3
+webencodings==0.5
diff --git a/vendor/pip-9.0.3/pip/_vendor/webencodings/__init__.py b/vendor/pip-9.0.3/pip/_vendor/webencodings/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..03d5d3576290be2b640774b566cedaef1a401ff8
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/webencodings/__init__.py
@@ -0,0 +1,342 @@
+# coding: utf8
+"""
+
+    webencodings
+    ~~~~~~~~~~~~
+
+    This is a Python implementation of the `WHATWG Encoding standard
+    <http://encoding.spec.whatwg.org/>`. See README for details.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+from __future__ import unicode_literals
+
+import codecs
+
+from .labels import LABELS
+
+
+VERSION = '0.5'
+
+
+# Some names in Encoding are not valid Python aliases. Remap these.
+PYTHON_NAMES = {
+    'iso-8859-8-i': 'iso-8859-8',
+    'x-mac-cyrillic': 'mac-cyrillic',
+    'macintosh': 'mac-roman',
+    'windows-874': 'cp874'}
+
+CACHE = {}
+
+
+def ascii_lower(string):
+    r"""Transform (only) ASCII letters to lower case: A-Z is mapped to a-z.
+
+    :param string: An Unicode string.
+    :returns: A new Unicode string.
+
+    This is used for `ASCII case-insensitive
+    <http://encoding.spec.whatwg.org/#ascii-case-insensitive>`_
+    matching of encoding labels.
+    The same matching is also used, among other things,
+    for `CSS keywords <http://dev.w3.org/csswg/css-values/#keywords>`_.
+
+    This is different from the :meth:`~py:str.lower` method of Unicode strings
+    which also affect non-ASCII characters,
+    sometimes mapping them into the ASCII range:
+
+        >>> keyword = u'Bac\N{KELVIN SIGN}ground'
+        >>> assert keyword.lower() == u'background'
+        >>> assert ascii_lower(keyword) != keyword.lower()
+        >>> assert ascii_lower(keyword) == u'bac\N{KELVIN SIGN}ground'
+
+    """
+    # This turns out to be faster than unicode.translate()
+    return string.encode('utf8').lower().decode('utf8')
+
+
+def lookup(label):
+    """
+    Look for an encoding by its label.
+    This is the spec’s `get an encoding
+    <http://encoding.spec.whatwg.org/#concept-encoding-get>`_ algorithm.
+    Supported labels are listed there.
+
+    :param label: A string.
+    :returns:
+        An :class:`Encoding` object, or :obj:`None` for an unknown label.
+
+    """
+    # Only strip ASCII whitespace: U+0009, U+000A, U+000C, U+000D, and U+0020.
+    label = ascii_lower(label.strip('\t\n\f\r '))
+    name = LABELS.get(label)
+    if name is None:
+        return None
+    encoding = CACHE.get(name)
+    if encoding is None:
+        if name == 'x-user-defined':
+            from .x_user_defined import codec_info
+        else:
+            python_name = PYTHON_NAMES.get(name, name)
+            # Any python_name value that gets to here should be valid.
+            codec_info = codecs.lookup(python_name)
+        encoding = Encoding(name, codec_info)
+        CACHE[name] = encoding
+    return encoding
+
+
+def _get_encoding(encoding_or_label):
+    """
+    Accept either an encoding object or label.
+
+    :param encoding: An :class:`Encoding` object or a label string.
+    :returns: An :class:`Encoding` object.
+    :raises: :exc:`~exceptions.LookupError` for an unknown label.
+
+    """
+    if hasattr(encoding_or_label, 'codec_info'):
+        return encoding_or_label
+
+    encoding = lookup(encoding_or_label)
+    if encoding is None:
+        raise LookupError('Unknown encoding label: %r' % encoding_or_label)
+    return encoding
+
+
+class Encoding(object):
+    """Reresents a character encoding such as UTF-8,
+    that can be used for decoding or encoding.
+
+    .. attribute:: name
+
+        Canonical name of the encoding
+
+    .. attribute:: codec_info
+
+        The actual implementation of the encoding,
+        a stdlib :class:`~codecs.CodecInfo` object.
+        See :func:`codecs.register`.
+
+    """
+    def __init__(self, name, codec_info):
+        self.name = name
+        self.codec_info = codec_info
+
+    def __repr__(self):
+        return '<Encoding %s>' % self.name
+
+
+#: The UTF-8 encoding. Should be used for new content and formats.
+UTF8 = lookup('utf-8')
+
+_UTF16LE = lookup('utf-16le')
+_UTF16BE = lookup('utf-16be')
+
+
+def decode(input, fallback_encoding, errors='replace'):
+    """
+    Decode a single string.
+
+    :param input: A byte string
+    :param fallback_encoding:
+        An :class:`Encoding` object or a label string.
+        The encoding to use if :obj:`input` does note have a BOM.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+    :return:
+        A ``(output, encoding)`` tuple of an Unicode string
+        and an :obj:`Encoding`.
+
+    """
+    # Fail early if `encoding` is an invalid label.
+    fallback_encoding = _get_encoding(fallback_encoding)
+    bom_encoding, input = _detect_bom(input)
+    encoding = bom_encoding or fallback_encoding
+    return encoding.codec_info.decode(input, errors)[0], encoding
+
+
+def _detect_bom(input):
+    """Return (bom_encoding, input), with any BOM removed from the input."""
+    if input.startswith(b'\xFF\xFE'):
+        return _UTF16LE, input[2:]
+    if input.startswith(b'\xFE\xFF'):
+        return _UTF16BE, input[2:]
+    if input.startswith(b'\xEF\xBB\xBF'):
+        return UTF8, input[3:]
+    return None, input
+
+
+def encode(input, encoding=UTF8, errors='strict'):
+    """
+    Encode a single string.
+
+    :param input: An Unicode string.
+    :param encoding: An :class:`Encoding` object or a label string.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+    :return: A byte string.
+
+    """
+    return _get_encoding(encoding).codec_info.encode(input, errors)[0]
+
+
+def iter_decode(input, fallback_encoding, errors='replace'):
+    """
+    "Pull"-based decoder.
+
+    :param input:
+        An iterable of byte strings.
+
+        The input is first consumed just enough to determine the encoding
+        based on the precense of a BOM,
+        then consumed on demand when the return value is.
+    :param fallback_encoding:
+        An :class:`Encoding` object or a label string.
+        The encoding to use if :obj:`input` does note have a BOM.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+    :returns:
+        An ``(output, encoding)`` tuple.
+        :obj:`output` is an iterable of Unicode strings,
+        :obj:`encoding` is the :obj:`Encoding` that is being used.
+
+    """
+
+    decoder = IncrementalDecoder(fallback_encoding, errors)
+    generator = _iter_decode_generator(input, decoder)
+    encoding = next(generator)
+    return generator, encoding
+
+
+def _iter_decode_generator(input, decoder):
+    """Return a generator that first yields the :obj:`Encoding`,
+    then yields output chukns as Unicode strings.
+
+    """
+    decode = decoder.decode
+    input = iter(input)
+    for chunck in input:
+        output = decode(chunck)
+        if output:
+            assert decoder.encoding is not None
+            yield decoder.encoding
+            yield output
+            break
+    else:
+        # Input exhausted without determining the encoding
+        output = decode(b'', final=True)
+        assert decoder.encoding is not None
+        yield decoder.encoding
+        if output:
+            yield output
+        return
+
+    for chunck in input:
+        output = decode(chunck)
+        if output:
+            yield output
+    output = decode(b'', final=True)
+    if output:
+        yield output
+
+
+def iter_encode(input, encoding=UTF8, errors='strict'):
+    """
+    “Pull”-based encoder.
+
+    :param input: An iterable of Unicode strings.
+    :param encoding: An :class:`Encoding` object or a label string.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+    :returns: An iterable of byte strings.
+
+    """
+    # Fail early if `encoding` is an invalid label.
+    encode = IncrementalEncoder(encoding, errors).encode
+    return _iter_encode_generator(input, encode)
+
+
+def _iter_encode_generator(input, encode):
+    for chunck in input:
+        output = encode(chunck)
+        if output:
+            yield output
+    output = encode('', final=True)
+    if output:
+        yield output
+
+
+class IncrementalDecoder(object):
+    """
+    “Push”-based decoder.
+
+    :param fallback_encoding:
+        An :class:`Encoding` object or a label string.
+        The encoding to use if :obj:`input` does note have a BOM.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+
+    """
+    def __init__(self, fallback_encoding, errors='replace'):
+        # Fail early if `encoding` is an invalid label.
+        self._fallback_encoding = _get_encoding(fallback_encoding)
+        self._errors = errors
+        self._buffer = b''
+        self._decoder = None
+        #: The actual :class:`Encoding` that is being used,
+        #: or :obj:`None` if that is not determined yet.
+        #: (Ie. if there is not enough input yet to determine
+        #: if there is a BOM.)
+        self.encoding = None  # Not known yet.
+
+    def decode(self, input, final=False):
+        """Decode one chunk of the input.
+
+        :param input: A byte string.
+        :param final:
+            Indicate that no more input is available.
+            Must be :obj:`True` if this is the last call.
+        :returns: An Unicode string.
+
+        """
+        decoder = self._decoder
+        if decoder is not None:
+            return decoder(input, final)
+
+        input = self._buffer + input
+        encoding, input = _detect_bom(input)
+        if encoding is None:
+            if len(input) < 3 and not final:  # Not enough data yet.
+                self._buffer = input
+                return ''
+            else:  # No BOM
+                encoding = self._fallback_encoding
+        decoder = encoding.codec_info.incrementaldecoder(self._errors).decode
+        self._decoder = decoder
+        self.encoding = encoding
+        return decoder(input, final)
+
+
+class IncrementalEncoder(object):
+    """
+    “Push”-based encoder.
+
+    :param encoding: An :class:`Encoding` object or a label string.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+
+    .. method:: encode(input, final=False)
+
+        :param input: An Unicode string.
+        :param final:
+            Indicate that no more input is available.
+            Must be :obj:`True` if this is the last call.
+        :returns: A byte string.
+
+    """
+    def __init__(self, encoding=UTF8, errors='strict'):
+        encoding = _get_encoding(encoding)
+        self.encode = encoding.codec_info.incrementalencoder(errors).encode
diff --git a/vendor/pip-9.0.3/pip/_vendor/webencodings/labels.py b/vendor/pip-9.0.3/pip/_vendor/webencodings/labels.py
new file mode 100644
index 0000000000000000000000000000000000000000..29cbf91ef79b89971e51db9ddfc3720d8b4db82a
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/webencodings/labels.py
@@ -0,0 +1,231 @@
+"""
+
+    webencodings.labels
+    ~~~~~~~~~~~~~~~~~~~
+
+    Map encoding labels to their name.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+# XXX Do not edit!
+# This file is automatically generated by mklabels.py
+
+LABELS = {
+    'unicode-1-1-utf-8':   'utf-8',
+    'utf-8':               'utf-8',
+    'utf8':                'utf-8',
+    '866':                 'ibm866',
+    'cp866':               'ibm866',
+    'csibm866':            'ibm866',
+    'ibm866':              'ibm866',
+    'csisolatin2':         'iso-8859-2',
+    'iso-8859-2':          'iso-8859-2',
+    'iso-ir-101':          'iso-8859-2',
+    'iso8859-2':           'iso-8859-2',
+    'iso88592':            'iso-8859-2',
+    'iso_8859-2':          'iso-8859-2',
+    'iso_8859-2:1987':     'iso-8859-2',
+    'l2':                  'iso-8859-2',
+    'latin2':              'iso-8859-2',
+    'csisolatin3':         'iso-8859-3',
+    'iso-8859-3':          'iso-8859-3',
+    'iso-ir-109':          'iso-8859-3',
+    'iso8859-3':           'iso-8859-3',
+    'iso88593':            'iso-8859-3',
+    'iso_8859-3':          'iso-8859-3',
+    'iso_8859-3:1988':     'iso-8859-3',
+    'l3':                  'iso-8859-3',
+    'latin3':              'iso-8859-3',
+    'csisolatin4':         'iso-8859-4',
+    'iso-8859-4':          'iso-8859-4',
+    'iso-ir-110':          'iso-8859-4',
+    'iso8859-4':           'iso-8859-4',
+    'iso88594':            'iso-8859-4',
+    'iso_8859-4':          'iso-8859-4',
+    'iso_8859-4:1988':     'iso-8859-4',
+    'l4':                  'iso-8859-4',
+    'latin4':              'iso-8859-4',
+    'csisolatincyrillic':  'iso-8859-5',
+    'cyrillic':            'iso-8859-5',
+    'iso-8859-5':          'iso-8859-5',
+    'iso-ir-144':          'iso-8859-5',
+    'iso8859-5':           'iso-8859-5',
+    'iso88595':            'iso-8859-5',
+    'iso_8859-5':          'iso-8859-5',
+    'iso_8859-5:1988':     'iso-8859-5',
+    'arabic':              'iso-8859-6',
+    'asmo-708':            'iso-8859-6',
+    'csiso88596e':         'iso-8859-6',
+    'csiso88596i':         'iso-8859-6',
+    'csisolatinarabic':    'iso-8859-6',
+    'ecma-114':            'iso-8859-6',
+    'iso-8859-6':          'iso-8859-6',
+    'iso-8859-6-e':        'iso-8859-6',
+    'iso-8859-6-i':        'iso-8859-6',
+    'iso-ir-127':          'iso-8859-6',
+    'iso8859-6':           'iso-8859-6',
+    'iso88596':            'iso-8859-6',
+    'iso_8859-6':          'iso-8859-6',
+    'iso_8859-6:1987':     'iso-8859-6',
+    'csisolatingreek':     'iso-8859-7',
+    'ecma-118':            'iso-8859-7',
+    'elot_928':            'iso-8859-7',
+    'greek':               'iso-8859-7',
+    'greek8':              'iso-8859-7',
+    'iso-8859-7':          'iso-8859-7',
+    'iso-ir-126':          'iso-8859-7',
+    'iso8859-7':           'iso-8859-7',
+    'iso88597':            'iso-8859-7',
+    'iso_8859-7':          'iso-8859-7',
+    'iso_8859-7:1987':     'iso-8859-7',
+    'sun_eu_greek':        'iso-8859-7',
+    'csiso88598e':         'iso-8859-8',
+    'csisolatinhebrew':    'iso-8859-8',
+    'hebrew':              'iso-8859-8',
+    'iso-8859-8':          'iso-8859-8',
+    'iso-8859-8-e':        'iso-8859-8',
+    'iso-ir-138':          'iso-8859-8',
+    'iso8859-8':           'iso-8859-8',
+    'iso88598':            'iso-8859-8',
+    'iso_8859-8':          'iso-8859-8',
+    'iso_8859-8:1988':     'iso-8859-8',
+    'visual':              'iso-8859-8',
+    'csiso88598i':         'iso-8859-8-i',
+    'iso-8859-8-i':        'iso-8859-8-i',
+    'logical':             'iso-8859-8-i',
+    'csisolatin6':         'iso-8859-10',
+    'iso-8859-10':         'iso-8859-10',
+    'iso-ir-157':          'iso-8859-10',
+    'iso8859-10':          'iso-8859-10',
+    'iso885910':           'iso-8859-10',
+    'l6':                  'iso-8859-10',
+    'latin6':              'iso-8859-10',
+    'iso-8859-13':         'iso-8859-13',
+    'iso8859-13':          'iso-8859-13',
+    'iso885913':           'iso-8859-13',
+    'iso-8859-14':         'iso-8859-14',
+    'iso8859-14':          'iso-8859-14',
+    'iso885914':           'iso-8859-14',
+    'csisolatin9':         'iso-8859-15',
+    'iso-8859-15':         'iso-8859-15',
+    'iso8859-15':          'iso-8859-15',
+    'iso885915':           'iso-8859-15',
+    'iso_8859-15':         'iso-8859-15',
+    'l9':                  'iso-8859-15',
+    'iso-8859-16':         'iso-8859-16',
+    'cskoi8r':             'koi8-r',
+    'koi':                 'koi8-r',
+    'koi8':                'koi8-r',
+    'koi8-r':              'koi8-r',
+    'koi8_r':              'koi8-r',
+    'koi8-u':              'koi8-u',
+    'csmacintosh':         'macintosh',
+    'mac':                 'macintosh',
+    'macintosh':           'macintosh',
+    'x-mac-roman':         'macintosh',
+    'dos-874':             'windows-874',
+    'iso-8859-11':         'windows-874',
+    'iso8859-11':          'windows-874',
+    'iso885911':           'windows-874',
+    'tis-620':             'windows-874',
+    'windows-874':         'windows-874',
+    'cp1250':              'windows-1250',
+    'windows-1250':        'windows-1250',
+    'x-cp1250':            'windows-1250',
+    'cp1251':              'windows-1251',
+    'windows-1251':        'windows-1251',
+    'x-cp1251':            'windows-1251',
+    'ansi_x3.4-1968':      'windows-1252',
+    'ascii':               'windows-1252',
+    'cp1252':              'windows-1252',
+    'cp819':               'windows-1252',
+    'csisolatin1':         'windows-1252',
+    'ibm819':              'windows-1252',
+    'iso-8859-1':          'windows-1252',
+    'iso-ir-100':          'windows-1252',
+    'iso8859-1':           'windows-1252',
+    'iso88591':            'windows-1252',
+    'iso_8859-1':          'windows-1252',
+    'iso_8859-1:1987':     'windows-1252',
+    'l1':                  'windows-1252',
+    'latin1':              'windows-1252',
+    'us-ascii':            'windows-1252',
+    'windows-1252':        'windows-1252',
+    'x-cp1252':            'windows-1252',
+    'cp1253':              'windows-1253',
+    'windows-1253':        'windows-1253',
+    'x-cp1253':            'windows-1253',
+    'cp1254':              'windows-1254',
+    'csisolatin5':         'windows-1254',
+    'iso-8859-9':          'windows-1254',
+    'iso-ir-148':          'windows-1254',
+    'iso8859-9':           'windows-1254',
+    'iso88599':            'windows-1254',
+    'iso_8859-9':          'windows-1254',
+    'iso_8859-9:1989':     'windows-1254',
+    'l5':                  'windows-1254',
+    'latin5':              'windows-1254',
+    'windows-1254':        'windows-1254',
+    'x-cp1254':            'windows-1254',
+    'cp1255':              'windows-1255',
+    'windows-1255':        'windows-1255',
+    'x-cp1255':            'windows-1255',
+    'cp1256':              'windows-1256',
+    'windows-1256':        'windows-1256',
+    'x-cp1256':            'windows-1256',
+    'cp1257':              'windows-1257',
+    'windows-1257':        'windows-1257',
+    'x-cp1257':            'windows-1257',
+    'cp1258':              'windows-1258',
+    'windows-1258':        'windows-1258',
+    'x-cp1258':            'windows-1258',
+    'x-mac-cyrillic':      'x-mac-cyrillic',
+    'x-mac-ukrainian':     'x-mac-cyrillic',
+    'chinese':             'gbk',
+    'csgb2312':            'gbk',
+    'csiso58gb231280':     'gbk',
+    'gb2312':              'gbk',
+    'gb_2312':             'gbk',
+    'gb_2312-80':          'gbk',
+    'gbk':                 'gbk',
+    'iso-ir-58':           'gbk',
+    'x-gbk':               'gbk',
+    'gb18030':             'gb18030',
+    'hz-gb-2312':          'hz-gb-2312',
+    'big5':                'big5',
+    'big5-hkscs':          'big5',
+    'cn-big5':             'big5',
+    'csbig5':              'big5',
+    'x-x-big5':            'big5',
+    'cseucpkdfmtjapanese': 'euc-jp',
+    'euc-jp':              'euc-jp',
+    'x-euc-jp':            'euc-jp',
+    'csiso2022jp':         'iso-2022-jp',
+    'iso-2022-jp':         'iso-2022-jp',
+    'csshiftjis':          'shift_jis',
+    'ms_kanji':            'shift_jis',
+    'shift-jis':           'shift_jis',
+    'shift_jis':           'shift_jis',
+    'sjis':                'shift_jis',
+    'windows-31j':         'shift_jis',
+    'x-sjis':              'shift_jis',
+    'cseuckr':             'euc-kr',
+    'csksc56011987':       'euc-kr',
+    'euc-kr':              'euc-kr',
+    'iso-ir-149':          'euc-kr',
+    'korean':              'euc-kr',
+    'ks_c_5601-1987':      'euc-kr',
+    'ks_c_5601-1989':      'euc-kr',
+    'ksc5601':             'euc-kr',
+    'ksc_5601':            'euc-kr',
+    'windows-949':         'euc-kr',
+    'csiso2022kr':         'iso-2022-kr',
+    'iso-2022-kr':         'iso-2022-kr',
+    'utf-16be':            'utf-16be',
+    'utf-16':              'utf-16le',
+    'utf-16le':            'utf-16le',
+    'x-user-defined':      'x-user-defined',
+}
diff --git a/vendor/pip-9.0.3/pip/_vendor/webencodings/mklabels.py b/vendor/pip-9.0.3/pip/_vendor/webencodings/mklabels.py
new file mode 100644
index 0000000000000000000000000000000000000000..295dc928ba71fc00caa52708ac70097abe6dc3e4
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/webencodings/mklabels.py
@@ -0,0 +1,59 @@
+"""
+
+    webencodings.mklabels
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Regenarate the webencodings.labels module.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+import json
+try:
+    from urllib import urlopen
+except ImportError:
+    from urllib.request import urlopen
+
+
+def assert_lower(string):
+    assert string == string.lower()
+    return string
+
+
+def generate(url):
+    parts = ['''\
+"""
+
+    webencodings.labels
+    ~~~~~~~~~~~~~~~~~~~
+
+    Map encoding labels to their name.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+# XXX Do not edit!
+# This file is automatically generated by mklabels.py
+
+LABELS = {
+''']
+    labels = [
+        (repr(assert_lower(label)).lstrip('u'),
+         repr(encoding['name']).lstrip('u'))
+        for category in json.loads(urlopen(url).read().decode('ascii'))
+        for encoding in category['encodings']
+        for label in encoding['labels']]
+    max_len = max(len(label) for label, name in labels)
+    parts.extend(
+        '    %s:%s %s,\n' % (label, ' ' * (max_len - len(label)), name)
+        for label, name in labels)
+    parts.append('}')
+    return ''.join(parts)
+
+
+if __name__ == '__main__':
+    print(generate('http://encoding.spec.whatwg.org/encodings.json'))
diff --git a/vendor/pip-9.0.3/pip/_vendor/webencodings/tests.py b/vendor/pip-9.0.3/pip/_vendor/webencodings/tests.py
new file mode 100644
index 0000000000000000000000000000000000000000..b8c5653ec1f07d39a7148cdfdafdebf83a9063c9
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/webencodings/tests.py
@@ -0,0 +1,153 @@
+# coding: utf8
+"""
+
+    webencodings.tests
+    ~~~~~~~~~~~~~~~~~~
+
+    A basic test suite for Encoding.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+from __future__ import unicode_literals
+
+from . import (lookup, LABELS, decode, encode, iter_decode, iter_encode,
+               IncrementalDecoder, IncrementalEncoder, UTF8)
+
+
+def assert_raises(exception, function, *args, **kwargs):
+    try:
+        function(*args, **kwargs)
+    except exception:
+        return
+    else:  # pragma: no cover
+        raise AssertionError('Did not raise %s.' % exception)
+
+
+def test_labels():
+    assert lookup('utf-8').name == 'utf-8'
+    assert lookup('Utf-8').name == 'utf-8'
+    assert lookup('UTF-8').name == 'utf-8'
+    assert lookup('utf8').name == 'utf-8'
+    assert lookup('utf8').name == 'utf-8'
+    assert lookup('utf8 ').name == 'utf-8'
+    assert lookup(' \r\nutf8\t').name == 'utf-8'
+    assert lookup('u8') is None  # Python label.
+    assert lookup('utf-8 ') is None  # Non-ASCII white space.
+
+    assert lookup('US-ASCII').name == 'windows-1252'
+    assert lookup('iso-8859-1').name == 'windows-1252'
+    assert lookup('latin1').name == 'windows-1252'
+    assert lookup('LATIN1').name == 'windows-1252'
+    assert lookup('latin-1') is None
+    assert lookup('LATİN1') is None  # ASCII-only case insensitivity.
+
+
+def test_all_labels():
+    for label in LABELS:
+        assert decode(b'', label) == ('', lookup(label))
+        assert encode('', label) == b''
+        for repeat in [0, 1, 12]:
+            output, _ = iter_decode([b''] * repeat, label)
+            assert list(output) == []
+            assert list(iter_encode([''] * repeat, label)) == []
+        decoder = IncrementalDecoder(label)
+        assert decoder.decode(b'') == ''
+        assert decoder.decode(b'', final=True) == ''
+        encoder = IncrementalEncoder(label)
+        assert encoder.encode('') == b''
+        assert encoder.encode('', final=True) == b''
+    # All encoding names are valid labels too:
+    for name in set(LABELS.values()):
+        assert lookup(name).name == name
+
+
+def test_invalid_label():
+    assert_raises(LookupError, decode, b'\xEF\xBB\xBF\xc3\xa9', 'invalid')
+    assert_raises(LookupError, encode, 'é', 'invalid')
+    assert_raises(LookupError, iter_decode, [], 'invalid')
+    assert_raises(LookupError, iter_encode, [], 'invalid')
+    assert_raises(LookupError, IncrementalDecoder, 'invalid')
+    assert_raises(LookupError, IncrementalEncoder, 'invalid')
+
+
+def test_decode():
+    assert decode(b'\x80', 'latin1') == ('€', lookup('latin1'))
+    assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1'))
+    assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8'))
+    assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8'))
+    assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii'))
+    assert decode(b'\xEF\xBB\xBF\xc3\xa9', 'ascii') == ('é', lookup('utf8'))  # UTF-8 with BOM
+
+    assert decode(b'\xFE\xFF\x00\xe9', 'ascii') == ('é', lookup('utf-16be'))  # UTF-16-BE with BOM
+    assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le'))  # UTF-16-LE with BOM
+    assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be'))
+    assert decode(b'\xFF\xFE\x00\xe9', 'ascii') == ('\ue900', lookup('utf-16le'))
+
+    assert decode(b'\x00\xe9', 'UTF-16BE') == ('é', lookup('utf-16be'))
+    assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le'))
+    assert decode(b'\xe9\x00', 'UTF-16') == ('é', lookup('utf-16le'))
+
+    assert decode(b'\xe9\x00', 'UTF-16BE') == ('\ue900', lookup('utf-16be'))
+    assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le'))
+    assert decode(b'\x00\xe9', 'UTF-16') == ('\ue900', lookup('utf-16le'))
+
+
+def test_encode():
+    assert encode('é', 'latin1') == b'\xe9'
+    assert encode('é', 'utf8') == b'\xc3\xa9'
+    assert encode('é', 'utf8') == b'\xc3\xa9'
+    assert encode('é', 'utf-16') == b'\xe9\x00'
+    assert encode('é', 'utf-16le') == b'\xe9\x00'
+    assert encode('é', 'utf-16be') == b'\x00\xe9'
+
+
+def test_iter_decode():
+    def iter_decode_to_string(input, fallback_encoding):
+        output, _encoding = iter_decode(input, fallback_encoding)
+        return ''.join(output)
+    assert iter_decode_to_string([], 'latin1') == ''
+    assert iter_decode_to_string([b''], 'latin1') == ''
+    assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é'
+    assert iter_decode_to_string([b'hello'], 'latin1') == 'hello'
+    assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello'
+    assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello'
+    assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é'
+    assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é'
+    assert iter_decode_to_string([
+        b'\xEF\xBB\xBF', b'\xc3', b'\xa9'], 'latin1') == 'é'
+    assert iter_decode_to_string([
+        b'\xEF\xBB\xBF', b'a', b'\xc3'], 'latin1') == 'a\uFFFD'
+    assert iter_decode_to_string([
+        b'', b'\xEF', b'', b'', b'\xBB\xBF\xc3', b'\xa9'], 'latin1') == 'é'
+    assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == ''
+    assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»'
+    assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é'
+    assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é'
+    assert iter_decode_to_string([
+        b'', b'\xFF', b'', b'', b'\xFE\xe9', b'\x00'], 'latin1') == 'é'
+    assert iter_decode_to_string([
+        b'', b'h\xe9', b'llo'], 'x-user-defined') == 'h\uF7E9llo'
+
+
+def test_iter_encode():
+    assert b''.join(iter_encode([], 'latin1')) == b''
+    assert b''.join(iter_encode([''], 'latin1')) == b''
+    assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9'
+    assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9'
+    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00'
+    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00'
+    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9'
+    assert b''.join(iter_encode([
+        '', 'h\uF7E9', '', 'llo'], 'x-user-defined')) == b'h\xe9llo'
+
+
+def test_x_user_defined():
+    encoded = b'2,\x0c\x0b\x1aO\xd9#\xcb\x0f\xc9\xbbt\xcf\xa8\xca'
+    decoded = '2,\x0c\x0b\x1aO\uf7d9#\uf7cb\x0f\uf7c9\uf7bbt\uf7cf\uf7a8\uf7ca'
+    encoded = b'aa'
+    decoded = 'aa'
+    assert decode(encoded, 'x-user-defined') == (decoded, lookup('x-user-defined'))
+    assert encode(decoded, 'x-user-defined') == encoded
diff --git a/vendor/pip-9.0.3/pip/_vendor/webencodings/x_user_defined.py b/vendor/pip-9.0.3/pip/_vendor/webencodings/x_user_defined.py
new file mode 100644
index 0000000000000000000000000000000000000000..f0daa11a761f78c918fb05daa3d8e801f156cd72
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/_vendor/webencodings/x_user_defined.py
@@ -0,0 +1,325 @@
+# coding: utf8
+"""
+
+    webencodings.x_user_defined
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    An implementation of the x-user-defined encoding.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+from __future__ import unicode_literals
+
+import codecs
+
+
+### Codec APIs
+
+class Codec(codecs.Codec):
+
+    def encode(self, input, errors='strict'):
+        return codecs.charmap_encode(input, errors, encoding_table)
+
+    def decode(self, input, errors='strict'):
+        return codecs.charmap_decode(input, errors, decoding_table)
+
+
+class IncrementalEncoder(codecs.IncrementalEncoder):
+    def encode(self, input, final=False):
+        return codecs.charmap_encode(input, self.errors, encoding_table)[0]
+
+
+class IncrementalDecoder(codecs.IncrementalDecoder):
+    def decode(self, input, final=False):
+        return codecs.charmap_decode(input, self.errors, decoding_table)[0]
+
+
+class StreamWriter(Codec, codecs.StreamWriter):
+    pass
+
+
+class StreamReader(Codec, codecs.StreamReader):
+    pass
+
+
+### encodings module API
+
+codec_info = codecs.CodecInfo(
+    name='x-user-defined',
+    encode=Codec().encode,
+    decode=Codec().decode,
+    incrementalencoder=IncrementalEncoder,
+    incrementaldecoder=IncrementalDecoder,
+    streamreader=StreamReader,
+    streamwriter=StreamWriter,
+)
+
+
+### Decoding Table
+
+# Python 3:
+# for c in range(256): print('    %r' % chr(c if c < 128 else c + 0xF700))
+decoding_table = (
+    '\x00'
+    '\x01'
+    '\x02'
+    '\x03'
+    '\x04'
+    '\x05'
+    '\x06'
+    '\x07'
+    '\x08'
+    '\t'
+    '\n'
+    '\x0b'
+    '\x0c'
+    '\r'
+    '\x0e'
+    '\x0f'
+    '\x10'
+    '\x11'
+    '\x12'
+    '\x13'
+    '\x14'
+    '\x15'
+    '\x16'
+    '\x17'
+    '\x18'
+    '\x19'
+    '\x1a'
+    '\x1b'
+    '\x1c'
+    '\x1d'
+    '\x1e'
+    '\x1f'
+    ' '
+    '!'
+    '"'
+    '#'
+    '$'
+    '%'
+    '&'
+    "'"
+    '('
+    ')'
+    '*'
+    '+'
+    ','
+    '-'
+    '.'
+    '/'
+    '0'
+    '1'
+    '2'
+    '3'
+    '4'
+    '5'
+    '6'
+    '7'
+    '8'
+    '9'
+    ':'
+    ';'
+    '<'
+    '='
+    '>'
+    '?'
+    '@'
+    'A'
+    'B'
+    'C'
+    'D'
+    'E'
+    'F'
+    'G'
+    'H'
+    'I'
+    'J'
+    'K'
+    'L'
+    'M'
+    'N'
+    'O'
+    'P'
+    'Q'
+    'R'
+    'S'
+    'T'
+    'U'
+    'V'
+    'W'
+    'X'
+    'Y'
+    'Z'
+    '['
+    '\\'
+    ']'
+    '^'
+    '_'
+    '`'
+    'a'
+    'b'
+    'c'
+    'd'
+    'e'
+    'f'
+    'g'
+    'h'
+    'i'
+    'j'
+    'k'
+    'l'
+    'm'
+    'n'
+    'o'
+    'p'
+    'q'
+    'r'
+    's'
+    't'
+    'u'
+    'v'
+    'w'
+    'x'
+    'y'
+    'z'
+    '{'
+    '|'
+    '}'
+    '~'
+    '\x7f'
+    '\uf780'
+    '\uf781'
+    '\uf782'
+    '\uf783'
+    '\uf784'
+    '\uf785'
+    '\uf786'
+    '\uf787'
+    '\uf788'
+    '\uf789'
+    '\uf78a'
+    '\uf78b'
+    '\uf78c'
+    '\uf78d'
+    '\uf78e'
+    '\uf78f'
+    '\uf790'
+    '\uf791'
+    '\uf792'
+    '\uf793'
+    '\uf794'
+    '\uf795'
+    '\uf796'
+    '\uf797'
+    '\uf798'
+    '\uf799'
+    '\uf79a'
+    '\uf79b'
+    '\uf79c'
+    '\uf79d'
+    '\uf79e'
+    '\uf79f'
+    '\uf7a0'
+    '\uf7a1'
+    '\uf7a2'
+    '\uf7a3'
+    '\uf7a4'
+    '\uf7a5'
+    '\uf7a6'
+    '\uf7a7'
+    '\uf7a8'
+    '\uf7a9'
+    '\uf7aa'
+    '\uf7ab'
+    '\uf7ac'
+    '\uf7ad'
+    '\uf7ae'
+    '\uf7af'
+    '\uf7b0'
+    '\uf7b1'
+    '\uf7b2'
+    '\uf7b3'
+    '\uf7b4'
+    '\uf7b5'
+    '\uf7b6'
+    '\uf7b7'
+    '\uf7b8'
+    '\uf7b9'
+    '\uf7ba'
+    '\uf7bb'
+    '\uf7bc'
+    '\uf7bd'
+    '\uf7be'
+    '\uf7bf'
+    '\uf7c0'
+    '\uf7c1'
+    '\uf7c2'
+    '\uf7c3'
+    '\uf7c4'
+    '\uf7c5'
+    '\uf7c6'
+    '\uf7c7'
+    '\uf7c8'
+    '\uf7c9'
+    '\uf7ca'
+    '\uf7cb'
+    '\uf7cc'
+    '\uf7cd'
+    '\uf7ce'
+    '\uf7cf'
+    '\uf7d0'
+    '\uf7d1'
+    '\uf7d2'
+    '\uf7d3'
+    '\uf7d4'
+    '\uf7d5'
+    '\uf7d6'
+    '\uf7d7'
+    '\uf7d8'
+    '\uf7d9'
+    '\uf7da'
+    '\uf7db'
+    '\uf7dc'
+    '\uf7dd'
+    '\uf7de'
+    '\uf7df'
+    '\uf7e0'
+    '\uf7e1'
+    '\uf7e2'
+    '\uf7e3'
+    '\uf7e4'
+    '\uf7e5'
+    '\uf7e6'
+    '\uf7e7'
+    '\uf7e8'
+    '\uf7e9'
+    '\uf7ea'
+    '\uf7eb'
+    '\uf7ec'
+    '\uf7ed'
+    '\uf7ee'
+    '\uf7ef'
+    '\uf7f0'
+    '\uf7f1'
+    '\uf7f2'
+    '\uf7f3'
+    '\uf7f4'
+    '\uf7f5'
+    '\uf7f6'
+    '\uf7f7'
+    '\uf7f8'
+    '\uf7f9'
+    '\uf7fa'
+    '\uf7fb'
+    '\uf7fc'
+    '\uf7fd'
+    '\uf7fe'
+    '\uf7ff'
+)
+
+### Encoding table
+encoding_table = codecs.charmap_build(decoding_table)
diff --git a/vendor/pip-9.0.3/pip/basecommand.py b/vendor/pip-9.0.3/pip/basecommand.py
new file mode 100644
index 0000000000000000000000000000000000000000..54c67067204e72af095e29c8b44c0c56fd591142
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/basecommand.py
@@ -0,0 +1,337 @@
+"""Base Command class, and related routines"""
+from __future__ import absolute_import
+
+import logging
+import os
+import sys
+import optparse
+import warnings
+
+from pip import cmdoptions
+from pip.index import PackageFinder
+from pip.locations import running_under_virtualenv
+from pip.download import PipSession
+from pip.exceptions import (BadCommand, InstallationError, UninstallationError,
+                            CommandError, PreviousBuildDirError)
+
+from pip.compat import logging_dictConfig
+from pip.baseparser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
+from pip.req import InstallRequirement, parse_requirements
+from pip.status_codes import (
+    SUCCESS, ERROR, UNKNOWN_ERROR, VIRTUALENV_NOT_FOUND,
+    PREVIOUS_BUILD_DIR_ERROR,
+)
+from pip.utils import deprecation, get_prog, normalize_path
+from pip.utils.logging import IndentingFormatter
+from pip.utils.outdated import pip_version_check
+
+
+__all__ = ['Command']
+
+
+logger = logging.getLogger(__name__)
+
+
+class Command(object):
+    name = None
+    usage = None
+    hidden = False
+    log_streams = ("ext://sys.stdout", "ext://sys.stderr")
+
+    def __init__(self, isolated=False):
+        parser_kw = {
+            'usage': self.usage,
+            'prog': '%s %s' % (get_prog(), self.name),
+            'formatter': UpdatingDefaultsHelpFormatter(),
+            'add_help_option': False,
+            'name': self.name,
+            'description': self.__doc__,
+            'isolated': isolated,
+        }
+
+        self.parser = ConfigOptionParser(**parser_kw)
+
+        # Commands should add options to this option group
+        optgroup_name = '%s Options' % self.name.capitalize()
+        self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name)
+
+        # Add the general options
+        gen_opts = cmdoptions.make_option_group(
+            cmdoptions.general_group,
+            self.parser,
+        )
+        self.parser.add_option_group(gen_opts)
+
+    def _build_session(self, options, retries=None, timeout=None):
+        session = PipSession(
+            cache=(
+                normalize_path(os.path.join(options.cache_dir, "http"))
+                if options.cache_dir else None
+            ),
+            retries=retries if retries is not None else options.retries,
+            insecure_hosts=options.trusted_hosts,
+        )
+
+        # Handle custom ca-bundles from the user
+        if options.cert:
+            session.verify = options.cert
+
+        # Handle SSL client certificate
+        if options.client_cert:
+            session.cert = options.client_cert
+
+        # Handle timeouts
+        if options.timeout or timeout:
+            session.timeout = (
+                timeout if timeout is not None else options.timeout
+            )
+
+        # Handle configured proxies
+        if options.proxy:
+            session.proxies = {
+                "http": options.proxy,
+                "https": options.proxy,
+            }
+
+        # Determine if we can prompt the user for authentication or not
+        session.auth.prompting = not options.no_input
+
+        return session
+
+    def parse_args(self, args):
+        # factored out for testability
+        return self.parser.parse_args(args)
+
+    def main(self, args):
+        options, args = self.parse_args(args)
+
+        if options.quiet:
+            if options.quiet == 1:
+                level = "WARNING"
+            if options.quiet == 2:
+                level = "ERROR"
+            else:
+                level = "CRITICAL"
+        elif options.verbose:
+            level = "DEBUG"
+        else:
+            level = "INFO"
+
+        # The root logger should match the "console" level *unless* we
+        # specified "--log" to send debug logs to a file.
+        root_level = level
+        if options.log:
+            root_level = "DEBUG"
+
+        logging_dictConfig({
+            "version": 1,
+            "disable_existing_loggers": False,
+            "filters": {
+                "exclude_warnings": {
+                    "()": "pip.utils.logging.MaxLevelFilter",
+                    "level": logging.WARNING,
+                },
+            },
+            "formatters": {
+                "indent": {
+                    "()": IndentingFormatter,
+                    "format": "%(message)s",
+                },
+            },
+            "handlers": {
+                "console": {
+                    "level": level,
+                    "class": "pip.utils.logging.ColorizedStreamHandler",
+                    "stream": self.log_streams[0],
+                    "filters": ["exclude_warnings"],
+                    "formatter": "indent",
+                },
+                "console_errors": {
+                    "level": "WARNING",
+                    "class": "pip.utils.logging.ColorizedStreamHandler",
+                    "stream": self.log_streams[1],
+                    "formatter": "indent",
+                },
+                "user_log": {
+                    "level": "DEBUG",
+                    "class": "pip.utils.logging.BetterRotatingFileHandler",
+                    "filename": options.log or "/dev/null",
+                    "delay": True,
+                    "formatter": "indent",
+                },
+            },
+            "root": {
+                "level": root_level,
+                "handlers": list(filter(None, [
+                    "console",
+                    "console_errors",
+                    "user_log" if options.log else None,
+                ])),
+            },
+            # Disable any logging besides WARNING unless we have DEBUG level
+            # logging enabled. These use both pip._vendor and the bare names
+            # for the case where someone unbundles our libraries.
+            "loggers": dict(
+                (
+                    name,
+                    {
+                        "level": (
+                            "WARNING"
+                            if level in ["INFO", "ERROR"]
+                            else "DEBUG"
+                        ),
+                    },
+                )
+                for name in ["pip._vendor", "distlib", "requests", "urllib3"]
+            ),
+        })
+
+        if sys.version_info[:2] == (2, 6):
+            warnings.warn(
+                "Python 2.6 is no longer supported by the Python core team, "
+                "please upgrade your Python. A future version of pip will "
+                "drop support for Python 2.6",
+                deprecation.Python26DeprecationWarning
+            )
+
+        # TODO: try to get these passing down from the command?
+        #      without resorting to os.environ to hold these.
+
+        if options.no_input:
+            os.environ['PIP_NO_INPUT'] = '1'
+
+        if options.exists_action:
+            os.environ['PIP_EXISTS_ACTION'] = ' '.join(options.exists_action)
+
+        if options.require_venv:
+            # If a venv is required check if it can really be found
+            if not running_under_virtualenv():
+                logger.critical(
+                    'Could not find an activated virtualenv (required).'
+                )
+                sys.exit(VIRTUALENV_NOT_FOUND)
+
+        try:
+            status = self.run(options, args)
+            # FIXME: all commands should return an exit status
+            # and when it is done, isinstance is not needed anymore
+            if isinstance(status, int):
+                return status
+        except PreviousBuildDirError as exc:
+            logger.critical(str(exc))
+            logger.debug('Exception information:', exc_info=True)
+
+            return PREVIOUS_BUILD_DIR_ERROR
+        except (InstallationError, UninstallationError, BadCommand) as exc:
+            logger.critical(str(exc))
+            logger.debug('Exception information:', exc_info=True)
+
+            return ERROR
+        except CommandError as exc:
+            logger.critical('ERROR: %s', exc)
+            logger.debug('Exception information:', exc_info=True)
+
+            return ERROR
+        except KeyboardInterrupt:
+            logger.critical('Operation cancelled by user')
+            logger.debug('Exception information:', exc_info=True)
+
+            return ERROR
+        except:
+            logger.critical('Exception:', exc_info=True)
+
+            return UNKNOWN_ERROR
+        finally:
+            # Check if we're using the latest version of pip available
+            if (not options.disable_pip_version_check and not
+                    getattr(options, "no_index", False)):
+                with self._build_session(
+                        options,
+                        retries=0,
+                        timeout=min(5, options.timeout)) as session:
+                    pip_version_check(session)
+
+        return SUCCESS
+
+
+class RequirementCommand(Command):
+
+    @staticmethod
+    def populate_requirement_set(requirement_set, args, options, finder,
+                                 session, name, wheel_cache):
+        """
+        Marshal cmd line args into a requirement set.
+        """
+        for filename in options.constraints:
+            for req in parse_requirements(
+                    filename,
+                    constraint=True, finder=finder, options=options,
+                    session=session, wheel_cache=wheel_cache):
+                requirement_set.add_requirement(req)
+
+        for req in args:
+            requirement_set.add_requirement(
+                InstallRequirement.from_line(
+                    req, None, isolated=options.isolated_mode,
+                    wheel_cache=wheel_cache
+                )
+            )
+
+        for req in options.editables:
+            requirement_set.add_requirement(
+                InstallRequirement.from_editable(
+                    req,
+                    default_vcs=options.default_vcs,
+                    isolated=options.isolated_mode,
+                    wheel_cache=wheel_cache
+                )
+            )
+
+        found_req_in_file = False
+        for filename in options.requirements:
+            for req in parse_requirements(
+                    filename,
+                    finder=finder, options=options, session=session,
+                    wheel_cache=wheel_cache):
+                found_req_in_file = True
+                requirement_set.add_requirement(req)
+        # If --require-hashes was a line in a requirements file, tell
+        # RequirementSet about it:
+        requirement_set.require_hashes = options.require_hashes
+
+        if not (args or options.editables or found_req_in_file):
+            opts = {'name': name}
+            if options.find_links:
+                msg = ('You must give at least one requirement to '
+                       '%(name)s (maybe you meant "pip %(name)s '
+                       '%(links)s"?)' %
+                       dict(opts, links=' '.join(options.find_links)))
+            else:
+                msg = ('You must give at least one requirement '
+                       'to %(name)s (see "pip help %(name)s")' % opts)
+            logger.warning(msg)
+
+    def _build_package_finder(self, options, session,
+                              platform=None, python_versions=None,
+                              abi=None, implementation=None):
+        """
+        Create a package finder appropriate to this requirement command.
+        """
+        index_urls = [options.index_url] + options.extra_index_urls
+        if options.no_index:
+            logger.debug('Ignoring indexes: %s', ','.join(index_urls))
+            index_urls = []
+
+        return PackageFinder(
+            find_links=options.find_links,
+            format_control=options.format_control,
+            index_urls=index_urls,
+            trusted_hosts=options.trusted_hosts,
+            allow_all_prereleases=options.pre,
+            process_dependency_links=options.process_dependency_links,
+            session=session,
+            platform=platform,
+            versions=python_versions,
+            abi=abi,
+            implementation=implementation,
+        )
diff --git a/vendor/pip-9.0.3/pip/baseparser.py b/vendor/pip-9.0.3/pip/baseparser.py
new file mode 100644
index 0000000000000000000000000000000000000000..2dd4533016b22becf6501be3061e515e582be93e
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/baseparser.py
@@ -0,0 +1,293 @@
+"""Base option parser setup"""
+from __future__ import absolute_import
+
+import sys
+import optparse
+import os
+import re
+import textwrap
+from distutils.util import strtobool
+
+from pip._vendor.six import string_types
+from pip._vendor.six.moves import configparser
+from pip.locations import (
+    legacy_config_file, config_basename, running_under_virtualenv,
+    site_config_files
+)
+from pip.utils import appdirs, get_terminal_size
+
+
+_environ_prefix_re = re.compile(r"^PIP_", re.I)
+
+
+class PrettyHelpFormatter(optparse.IndentedHelpFormatter):
+    """A prettier/less verbose help formatter for optparse."""
+
+    def __init__(self, *args, **kwargs):
+        # help position must be aligned with __init__.parseopts.description
+        kwargs['max_help_position'] = 30
+        kwargs['indent_increment'] = 1
+        kwargs['width'] = get_terminal_size()[0] - 2
+        optparse.IndentedHelpFormatter.__init__(self, *args, **kwargs)
+
+    def format_option_strings(self, option):
+        return self._format_option_strings(option, ' <%s>', ', ')
+
+    def _format_option_strings(self, option, mvarfmt=' <%s>', optsep=', '):
+        """
+        Return a comma-separated list of option strings and metavars.
+
+        :param option:  tuple of (short opt, long opt), e.g: ('-f', '--format')
+        :param mvarfmt: metavar format string - evaluated as mvarfmt % metavar
+        :param optsep:  separator
+        """
+        opts = []
+
+        if option._short_opts:
+            opts.append(option._short_opts[0])
+        if option._long_opts:
+            opts.append(option._long_opts[0])
+        if len(opts) > 1:
+            opts.insert(1, optsep)
+
+        if option.takes_value():
+            metavar = option.metavar or option.dest.lower()
+            opts.append(mvarfmt % metavar.lower())
+
+        return ''.join(opts)
+
+    def format_heading(self, heading):
+        if heading == 'Options':
+            return ''
+        return heading + ':\n'
+
+    def format_usage(self, usage):
+        """
+        Ensure there is only one newline between usage and the first heading
+        if there is no description.
+        """
+        msg = '\nUsage: %s\n' % self.indent_lines(textwrap.dedent(usage), "  ")
+        return msg
+
+    def format_description(self, description):
+        # leave full control over description to us
+        if description:
+            if hasattr(self.parser, 'main'):
+                label = 'Commands'
+            else:
+                label = 'Description'
+            # some doc strings have initial newlines, some don't
+            description = description.lstrip('\n')
+            # some doc strings have final newlines and spaces, some don't
+            description = description.rstrip()
+            # dedent, then reindent
+            description = self.indent_lines(textwrap.dedent(description), "  ")
+            description = '%s:\n%s\n' % (label, description)
+            return description
+        else:
+            return ''
+
+    def format_epilog(self, epilog):
+        # leave full control over epilog to us
+        if epilog:
+            return epilog
+        else:
+            return ''
+
+    def indent_lines(self, text, indent):
+        new_lines = [indent + line for line in text.split('\n')]
+        return "\n".join(new_lines)
+
+
+class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter):
+    """Custom help formatter for use in ConfigOptionParser.
+
+    This is updates the defaults before expanding them, allowing
+    them to show up correctly in the help listing.
+    """
+
+    def expand_default(self, option):
+        if self.parser is not None:
+            self.parser._update_defaults(self.parser.defaults)
+        return optparse.IndentedHelpFormatter.expand_default(self, option)
+
+
+class CustomOptionParser(optparse.OptionParser):
+
+    def insert_option_group(self, idx, *args, **kwargs):
+        """Insert an OptionGroup at a given position."""
+        group = self.add_option_group(*args, **kwargs)
+
+        self.option_groups.pop()
+        self.option_groups.insert(idx, group)
+
+        return group
+
+    @property
+    def option_list_all(self):
+        """Get a list of all options, including those in option groups."""
+        res = self.option_list[:]
+        for i in self.option_groups:
+            res.extend(i.option_list)
+
+        return res
+
+
+class ConfigOptionParser(CustomOptionParser):
+    """Custom option parser which updates its defaults by checking the
+    configuration files and environmental variables"""
+
+    isolated = False
+
+    def __init__(self, *args, **kwargs):
+        self.config = configparser.RawConfigParser()
+        self.name = kwargs.pop('name')
+        self.isolated = kwargs.pop("isolated", False)
+        self.files = self.get_config_files()
+        if self.files:
+            self.config.read(self.files)
+        assert self.name
+        optparse.OptionParser.__init__(self, *args, **kwargs)
+
+    def get_config_files(self):
+        # the files returned by this method will be parsed in order with the
+        # first files listed being overridden by later files in standard
+        # ConfigParser fashion
+        config_file = os.environ.get('PIP_CONFIG_FILE', False)
+        if config_file == os.devnull:
+            return []
+
+        # at the base we have any site-wide configuration
+        files = list(site_config_files)
+
+        # per-user configuration next
+        if not self.isolated:
+            if config_file and os.path.exists(config_file):
+                files.append(config_file)
+            else:
+                # This is the legacy config file, we consider it to be a lower
+                # priority than the new file location.
+                files.append(legacy_config_file)
+
+                # This is the new config file, we consider it to be a higher
+                # priority than the legacy file.
+                files.append(
+                    os.path.join(
+                        appdirs.user_config_dir("pip"),
+                        config_basename,
+                    )
+                )
+
+        # finally virtualenv configuration first trumping others
+        if running_under_virtualenv():
+            venv_config_file = os.path.join(
+                sys.prefix,
+                config_basename,
+            )
+            if os.path.exists(venv_config_file):
+                files.append(venv_config_file)
+
+        return files
+
+    def check_default(self, option, key, val):
+        try:
+            return option.check_value(key, val)
+        except optparse.OptionValueError as exc:
+            print("An error occurred during configuration: %s" % exc)
+            sys.exit(3)
+
+    def _update_defaults(self, defaults):
+        """Updates the given defaults with values from the config files and
+        the environ. Does a little special handling for certain types of
+        options (lists)."""
+        # Then go and look for the other sources of configuration:
+        config = {}
+        # 1. config files
+        for section in ('global', self.name):
+            config.update(
+                self.normalize_keys(self.get_config_section(section))
+            )
+        # 2. environmental variables
+        if not self.isolated:
+            config.update(self.normalize_keys(self.get_environ_vars()))
+        # Accumulate complex default state.
+        self.values = optparse.Values(self.defaults)
+        late_eval = set()
+        # Then set the options with those values
+        for key, val in config.items():
+            # ignore empty values
+            if not val:
+                continue
+
+            option = self.get_option(key)
+            # Ignore options not present in this parser. E.g. non-globals put
+            # in [global] by users that want them to apply to all applicable
+            # commands.
+            if option is None:
+                continue
+
+            if option.action in ('store_true', 'store_false', 'count'):
+                val = strtobool(val)
+            elif option.action == 'append':
+                val = val.split()
+                val = [self.check_default(option, key, v) for v in val]
+            elif option.action == 'callback':
+                late_eval.add(option.dest)
+                opt_str = option.get_opt_string()
+                val = option.convert_value(opt_str, val)
+                # From take_action
+                args = option.callback_args or ()
+                kwargs = option.callback_kwargs or {}
+                option.callback(option, opt_str, val, self, *args, **kwargs)
+            else:
+                val = self.check_default(option, key, val)
+
+            defaults[option.dest] = val
+
+        for key in late_eval:
+            defaults[key] = getattr(self.values, key)
+        self.values = None
+        return defaults
+
+    def normalize_keys(self, items):
+        """Return a config dictionary with normalized keys regardless of
+        whether the keys were specified in environment variables or in config
+        files"""
+        normalized = {}
+        for key, val in items:
+            key = key.replace('_', '-')
+            if not key.startswith('--'):
+                key = '--%s' % key  # only prefer long opts
+            normalized[key] = val
+        return normalized
+
+    def get_config_section(self, name):
+        """Get a section of a configuration"""
+        if self.config.has_section(name):
+            return self.config.items(name)
+        return []
+
+    def get_environ_vars(self):
+        """Returns a generator with all environmental vars with prefix PIP_"""
+        for key, val in os.environ.items():
+            if _environ_prefix_re.search(key):
+                yield (_environ_prefix_re.sub("", key).lower(), val)
+
+    def get_default_values(self):
+        """Overriding to make updating the defaults after instantiation of
+        the option parser possible, _update_defaults() does the dirty work."""
+        if not self.process_default_values:
+            # Old, pre-Optik 1.5 behaviour.
+            return optparse.Values(self.defaults)
+
+        defaults = self._update_defaults(self.defaults.copy())  # ours
+        for option in self._get_all_options():
+            default = defaults.get(option.dest)
+            if isinstance(default, string_types):
+                opt_str = option.get_opt_string()
+                defaults[option.dest] = option.check_value(opt_str, default)
+        return optparse.Values(defaults)
+
+    def error(self, msg):
+        self.print_usage(sys.stderr)
+        self.exit(2, "%s\n" % msg)
diff --git a/vendor/pip-9.0.3/pip/cmdoptions.py b/vendor/pip-9.0.3/pip/cmdoptions.py
new file mode 100644
index 0000000000000000000000000000000000000000..f71488cdf51ba686efdcf99b240b487d5d66ed67
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/cmdoptions.py
@@ -0,0 +1,633 @@
+"""
+shared options and groups
+
+The principle here is to define options once, but *not* instantiate them
+globally. One reason being that options with action='append' can carry state
+between parses. pip parses general options twice internally, and shouldn't
+pass on state. To be consistent, all options will follow this design.
+
+"""
+from __future__ import absolute_import
+
+from functools import partial
+from optparse import OptionGroup, SUPPRESS_HELP, Option
+import warnings
+
+from pip.index import (
+    FormatControl, fmt_ctl_handle_mutual_exclude, fmt_ctl_no_binary,
+    fmt_ctl_no_use_wheel)
+from pip.models import PyPI
+from pip.locations import USER_CACHE_DIR, src_prefix
+from pip.utils.hashes import STRONG_HASHES
+
+
+def make_option_group(group, parser):
+    """
+    Return an OptionGroup object
+    group  -- assumed to be dict with 'name' and 'options' keys
+    parser -- an optparse Parser
+    """
+    option_group = OptionGroup(parser, group['name'])
+    for option in group['options']:
+        option_group.add_option(option())
+    return option_group
+
+
+def resolve_wheel_no_use_binary(options):
+    if not options.use_wheel:
+        control = options.format_control
+        fmt_ctl_no_use_wheel(control)
+
+
+def check_install_build_global(options, check_options=None):
+    """Disable wheels if per-setup.py call options are set.
+
+    :param options: The OptionParser options to update.
+    :param check_options: The options to check, if not supplied defaults to
+        options.
+    """
+    if check_options is None:
+        check_options = options
+
+    def getname(n):
+        return getattr(check_options, n, None)
+    names = ["build_options", "global_options", "install_options"]
+    if any(map(getname, names)):
+        control = options.format_control
+        fmt_ctl_no_binary(control)
+        warnings.warn(
+            'Disabling all use of wheels due to the use of --build-options '
+            '/ --global-options / --install-options.', stacklevel=2)
+
+
+###########
+# options #
+###########
+
+help_ = partial(
+    Option,
+    '-h', '--help',
+    dest='help',
+    action='help',
+    help='Show help.')
+
+isolated_mode = partial(
+    Option,
+    "--isolated",
+    dest="isolated_mode",
+    action="store_true",
+    default=False,
+    help=(
+        "Run pip in an isolated mode, ignoring environment variables and user "
+        "configuration."
+    ),
+)
+
+require_virtualenv = partial(
+    Option,
+    # Run only if inside a virtualenv, bail if not.
+    '--require-virtualenv', '--require-venv',
+    dest='require_venv',
+    action='store_true',
+    default=False,
+    help=SUPPRESS_HELP)
+
+verbose = partial(
+    Option,
+    '-v', '--verbose',
+    dest='verbose',
+    action='count',
+    default=0,
+    help='Give more output. Option is additive, and can be used up to 3 times.'
+)
+
+version = partial(
+    Option,
+    '-V', '--version',
+    dest='version',
+    action='store_true',
+    help='Show version and exit.')
+
+quiet = partial(
+    Option,
+    '-q', '--quiet',
+    dest='quiet',
+    action='count',
+    default=0,
+    help=('Give less output. Option is additive, and can be used up to 3'
+          ' times (corresponding to WARNING, ERROR, and CRITICAL logging'
+          ' levels).')
+)
+
+log = partial(
+    Option,
+    "--log", "--log-file", "--local-log",
+    dest="log",
+    metavar="path",
+    help="Path to a verbose appending log."
+)
+
+no_input = partial(
+    Option,
+    # Don't ask for input
+    '--no-input',
+    dest='no_input',
+    action='store_true',
+    default=False,
+    help=SUPPRESS_HELP)
+
+proxy = partial(
+    Option,
+    '--proxy',
+    dest='proxy',
+    type='str',
+    default='',
+    help="Specify a proxy in the form [user:passwd@]proxy.server:port.")
+
+retries = partial(
+    Option,
+    '--retries',
+    dest='retries',
+    type='int',
+    default=5,
+    help="Maximum number of retries each connection should attempt "
+         "(default %default times).")
+
+timeout = partial(
+    Option,
+    '--timeout', '--default-timeout',
+    metavar='sec',
+    dest='timeout',
+    type='float',
+    default=15,
+    help='Set the socket timeout (default %default seconds).')
+
+default_vcs = partial(
+    Option,
+    # The default version control system for editables, e.g. 'svn'
+    '--default-vcs',
+    dest='default_vcs',
+    type='str',
+    default='',
+    help=SUPPRESS_HELP)
+
+skip_requirements_regex = partial(
+    Option,
+    # A regex to be used to skip requirements
+    '--skip-requirements-regex',
+    dest='skip_requirements_regex',
+    type='str',
+    default='',
+    help=SUPPRESS_HELP)
+
+
+def exists_action():
+    return Option(
+        # Option when path already exist
+        '--exists-action',
+        dest='exists_action',
+        type='choice',
+        choices=['s', 'i', 'w', 'b', 'a'],
+        default=[],
+        action='append',
+        metavar='action',
+        help="Default action when a path already exists: "
+        "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.")
+
+
+cert = partial(
+    Option,
+    '--cert',
+    dest='cert',
+    type='str',
+    metavar='path',
+    help="Path to alternate CA bundle.")
+
+client_cert = partial(
+    Option,
+    '--client-cert',
+    dest='client_cert',
+    type='str',
+    default=None,
+    metavar='path',
+    help="Path to SSL client certificate, a single file containing the "
+         "private key and the certificate in PEM format.")
+
+index_url = partial(
+    Option,
+    '-i', '--index-url', '--pypi-url',
+    dest='index_url',
+    metavar='URL',
+    default=PyPI.simple_url,
+    help="Base URL of Python Package Index (default %default). "
+         "This should point to a repository compliant with PEP 503 "
+         "(the simple repository API) or a local directory laid out "
+         "in the same format.")
+
+
+def extra_index_url():
+    return Option(
+        '--extra-index-url',
+        dest='extra_index_urls',
+        metavar='URL',
+        action='append',
+        default=[],
+        help="Extra URLs of package indexes to use in addition to "
+             "--index-url. Should follow the same rules as "
+             "--index-url."
+    )
+
+
+no_index = partial(
+    Option,
+    '--no-index',
+    dest='no_index',
+    action='store_true',
+    default=False,
+    help='Ignore package index (only looking at --find-links URLs instead).')
+
+
+def find_links():
+    return Option(
+        '-f', '--find-links',
+        dest='find_links',
+        action='append',
+        default=[],
+        metavar='url',
+        help="If a url or path to an html file, then parse for links to "
+             "archives. If a local path or file:// url that's a directory, "
+             "then look for archives in the directory listing.")
+
+
+def allow_external():
+    return Option(
+        "--allow-external",
+        dest="allow_external",
+        action="append",
+        default=[],
+        metavar="PACKAGE",
+        help=SUPPRESS_HELP,
+    )
+
+
+allow_all_external = partial(
+    Option,
+    "--allow-all-external",
+    dest="allow_all_external",
+    action="store_true",
+    default=False,
+    help=SUPPRESS_HELP,
+)
+
+
+def trusted_host():
+    return Option(
+        "--trusted-host",
+        dest="trusted_hosts",
+        action="append",
+        metavar="HOSTNAME",
+        default=[],
+        help="Mark this host as trusted, even though it does not have valid "
+             "or any HTTPS.",
+    )
+
+
+# Remove after 7.0
+no_allow_external = partial(
+    Option,
+    "--no-allow-external",
+    dest="allow_all_external",
+    action="store_false",
+    default=False,
+    help=SUPPRESS_HELP,
+)
+
+
+# Remove --allow-insecure after 7.0
+def allow_unsafe():
+    return Option(
+        "--allow-unverified", "--allow-insecure",
+        dest="allow_unverified",
+        action="append",
+        default=[],
+        metavar="PACKAGE",
+        help=SUPPRESS_HELP,
+    )
+
+# Remove after 7.0
+no_allow_unsafe = partial(
+    Option,
+    "--no-allow-insecure",
+    dest="allow_all_insecure",
+    action="store_false",
+    default=False,
+    help=SUPPRESS_HELP
+)
+
+# Remove after 1.5
+process_dependency_links = partial(
+    Option,
+    "--process-dependency-links",
+    dest="process_dependency_links",
+    action="store_true",
+    default=False,
+    help="Enable the processing of dependency links.",
+)
+
+
+def constraints():
+    return Option(
+        '-c', '--constraint',
+        dest='constraints',
+        action='append',
+        default=[],
+        metavar='file',
+        help='Constrain versions using the given constraints file. '
+        'This option can be used multiple times.')
+
+
+def requirements():
+    return Option(
+        '-r', '--requirement',
+        dest='requirements',
+        action='append',
+        default=[],
+        metavar='file',
+        help='Install from the given requirements file. '
+        'This option can be used multiple times.')
+
+
+def editable():
+    return Option(
+        '-e', '--editable',
+        dest='editables',
+        action='append',
+        default=[],
+        metavar='path/url',
+        help=('Install a project in editable mode (i.e. setuptools '
+              '"develop mode") from a local project path or a VCS url.'),
+    )
+
+src = partial(
+    Option,
+    '--src', '--source', '--source-dir', '--source-directory',
+    dest='src_dir',
+    metavar='dir',
+    default=src_prefix,
+    help='Directory to check out editable projects into. '
+    'The default in a virtualenv is "<venv path>/src". '
+    'The default for global installs is "<current dir>/src".'
+)
+
+# XXX: deprecated, remove in 9.0
+use_wheel = partial(
+    Option,
+    '--use-wheel',
+    dest='use_wheel',
+    action='store_true',
+    default=True,
+    help=SUPPRESS_HELP,
+)
+
+# XXX: deprecated, remove in 9.0
+no_use_wheel = partial(
+    Option,
+    '--no-use-wheel',
+    dest='use_wheel',
+    action='store_false',
+    default=True,
+    help=('Do not Find and prefer wheel archives when searching indexes and '
+          'find-links locations. DEPRECATED in favour of --no-binary.'),
+)
+
+
+def _get_format_control(values, option):
+    """Get a format_control object."""
+    return getattr(values, option.dest)
+
+
+def _handle_no_binary(option, opt_str, value, parser):
+    existing = getattr(parser.values, option.dest)
+    fmt_ctl_handle_mutual_exclude(
+        value, existing.no_binary, existing.only_binary)
+
+
+def _handle_only_binary(option, opt_str, value, parser):
+    existing = getattr(parser.values, option.dest)
+    fmt_ctl_handle_mutual_exclude(
+        value, existing.only_binary, existing.no_binary)
+
+
+def no_binary():
+    return Option(
+        "--no-binary", dest="format_control", action="callback",
+        callback=_handle_no_binary, type="str",
+        default=FormatControl(set(), set()),
+        help="Do not use binary packages. Can be supplied multiple times, and "
+             "each time adds to the existing value. Accepts either :all: to "
+             "disable all binary packages, :none: to empty the set, or one or "
+             "more package names with commas between them. Note that some "
+             "packages are tricky to compile and may fail to install when "
+             "this option is used on them.")
+
+
+def only_binary():
+    return Option(
+        "--only-binary", dest="format_control", action="callback",
+        callback=_handle_only_binary, type="str",
+        default=FormatControl(set(), set()),
+        help="Do not use source packages. Can be supplied multiple times, and "
+             "each time adds to the existing value. Accepts either :all: to "
+             "disable all source packages, :none: to empty the set, or one or "
+             "more package names with commas between them. Packages without "
+             "binary distributions will fail to install when this option is "
+             "used on them.")
+
+
+cache_dir = partial(
+    Option,
+    "--cache-dir",
+    dest="cache_dir",
+    default=USER_CACHE_DIR,
+    metavar="dir",
+    help="Store the cache data in <dir>."
+)
+
+no_cache = partial(
+    Option,
+    "--no-cache-dir",
+    dest="cache_dir",
+    action="store_false",
+    help="Disable the cache.",
+)
+
+no_deps = partial(
+    Option,
+    '--no-deps', '--no-dependencies',
+    dest='ignore_dependencies',
+    action='store_true',
+    default=False,
+    help="Don't install package dependencies.")
+
+build_dir = partial(
+    Option,
+    '-b', '--build', '--build-dir', '--build-directory',
+    dest='build_dir',
+    metavar='dir',
+    help='Directory to unpack packages into and build in.'
+)
+
+ignore_requires_python = partial(
+    Option,
+    '--ignore-requires-python',
+    dest='ignore_requires_python',
+    action='store_true',
+    help='Ignore the Requires-Python information.')
+
+install_options = partial(
+    Option,
+    '--install-option',
+    dest='install_options',
+    action='append',
+    metavar='options',
+    help="Extra arguments to be supplied to the setup.py install "
+         "command (use like --install-option=\"--install-scripts=/usr/local/"
+         "bin\"). Use multiple --install-option options to pass multiple "
+         "options to setup.py install. If you are using an option with a "
+         "directory path, be sure to use absolute path.")
+
+global_options = partial(
+    Option,
+    '--global-option',
+    dest='global_options',
+    action='append',
+    metavar='options',
+    help="Extra global options to be supplied to the setup.py "
+         "call before the install command.")
+
+no_clean = partial(
+    Option,
+    '--no-clean',
+    action='store_true',
+    default=False,
+    help="Don't clean up build directories.")
+
+pre = partial(
+    Option,
+    '--pre',
+    action='store_true',
+    default=False,
+    help="Include pre-release and development versions. By default, "
+         "pip only finds stable versions.")
+
+disable_pip_version_check = partial(
+    Option,
+    "--disable-pip-version-check",
+    dest="disable_pip_version_check",
+    action="store_true",
+    default=False,
+    help="Don't periodically check PyPI to determine whether a new version "
+         "of pip is available for download. Implied with --no-index.")
+
+# Deprecated, Remove later
+always_unzip = partial(
+    Option,
+    '-Z', '--always-unzip',
+    dest='always_unzip',
+    action='store_true',
+    help=SUPPRESS_HELP,
+)
+
+
+def _merge_hash(option, opt_str, value, parser):
+    """Given a value spelled "algo:digest", append the digest to a list
+    pointed to in a dict by the algo name."""
+    if not parser.values.hashes:
+        parser.values.hashes = {}
+    try:
+        algo, digest = value.split(':', 1)
+    except ValueError:
+        parser.error('Arguments to %s must be a hash name '
+                     'followed by a value, like --hash=sha256:abcde...' %
+                     opt_str)
+    if algo not in STRONG_HASHES:
+        parser.error('Allowed hash algorithms for %s are %s.' %
+                     (opt_str, ', '.join(STRONG_HASHES)))
+    parser.values.hashes.setdefault(algo, []).append(digest)
+
+
+hash = partial(
+    Option,
+    '--hash',
+    # Hash values eventually end up in InstallRequirement.hashes due to
+    # __dict__ copying in process_line().
+    dest='hashes',
+    action='callback',
+    callback=_merge_hash,
+    type='string',
+    help="Verify that the package's archive matches this "
+         'hash before installing. Example: --hash=sha256:abcdef...')
+
+
+require_hashes = partial(
+    Option,
+    '--require-hashes',
+    dest='require_hashes',
+    action='store_true',
+    default=False,
+    help='Require a hash to check each requirement against, for '
+         'repeatable installs. This option is implied when any package in a '
+         'requirements file has a --hash option.')
+
+
+##########
+# groups #
+##########
+
+general_group = {
+    'name': 'General Options',
+    'options': [
+        help_,
+        isolated_mode,
+        require_virtualenv,
+        verbose,
+        version,
+        quiet,
+        log,
+        no_input,
+        proxy,
+        retries,
+        timeout,
+        default_vcs,
+        skip_requirements_regex,
+        exists_action,
+        trusted_host,
+        cert,
+        client_cert,
+        cache_dir,
+        no_cache,
+        disable_pip_version_check,
+    ]
+}
+
+non_deprecated_index_group = {
+    'name': 'Package Index Options',
+    'options': [
+        index_url,
+        extra_index_url,
+        no_index,
+        find_links,
+        process_dependency_links,
+    ]
+}
+
+index_group = {
+    'name': 'Package Index Options (including deprecated options)',
+    'options': non_deprecated_index_group['options'] + [
+        allow_external,
+        allow_all_external,
+        no_allow_external,
+        allow_unsafe,
+        no_allow_unsafe,
+    ]
+}
diff --git a/vendor/pip-9.0.3/pip/commands/__init__.py b/vendor/pip-9.0.3/pip/commands/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..62c64ebed2704a2322d3c6458fd8d7d8ff2f7feb
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/commands/__init__.py
@@ -0,0 +1,86 @@
+"""
+Package containing all pip commands
+"""
+from __future__ import absolute_import
+
+from pip.commands.completion import CompletionCommand
+from pip.commands.download import DownloadCommand
+from pip.commands.freeze import FreezeCommand
+from pip.commands.hash import HashCommand
+from pip.commands.help import HelpCommand
+from pip.commands.list import ListCommand
+from pip.commands.check import CheckCommand
+from pip.commands.search import SearchCommand
+from pip.commands.show import ShowCommand
+from pip.commands.install import InstallCommand
+from pip.commands.uninstall import UninstallCommand
+from pip.commands.wheel import WheelCommand
+
+
+commands_dict = {
+    CompletionCommand.name: CompletionCommand,
+    FreezeCommand.name: FreezeCommand,
+    HashCommand.name: HashCommand,
+    HelpCommand.name: HelpCommand,
+    SearchCommand.name: SearchCommand,
+    ShowCommand.name: ShowCommand,
+    InstallCommand.name: InstallCommand,
+    UninstallCommand.name: UninstallCommand,
+    DownloadCommand.name: DownloadCommand,
+    ListCommand.name: ListCommand,
+    CheckCommand.name: CheckCommand,
+    WheelCommand.name: WheelCommand,
+}
+
+
+commands_order = [
+    InstallCommand,
+    DownloadCommand,
+    UninstallCommand,
+    FreezeCommand,
+    ListCommand,
+    ShowCommand,
+    CheckCommand,
+    SearchCommand,
+    WheelCommand,
+    HashCommand,
+    CompletionCommand,
+    HelpCommand,
+]
+
+
+def get_summaries(ordered=True):
+    """Yields sorted (command name, command summary) tuples."""
+
+    if ordered:
+        cmditems = _sort_commands(commands_dict, commands_order)
+    else:
+        cmditems = commands_dict.items()
+
+    for name, command_class in cmditems:
+        yield (name, command_class.summary)
+
+
+def get_similar_commands(name):
+    """Command name auto-correct."""
+    from difflib import get_close_matches
+
+    name = name.lower()
+
+    close_commands = get_close_matches(name, commands_dict.keys())
+
+    if close_commands:
+        return close_commands[0]
+    else:
+        return False
+
+
+def _sort_commands(cmddict, order):
+    def keyfn(key):
+        try:
+            return order.index(key[1])
+        except ValueError:
+            # unordered items should come last
+            return 0xff
+
+    return sorted(cmddict.items(), key=keyfn)
diff --git a/vendor/pip-9.0.3/pip/commands/check.py b/vendor/pip-9.0.3/pip/commands/check.py
new file mode 100644
index 0000000000000000000000000000000000000000..70458adf47d73a88ba9bef862e0546177eb4de55
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/commands/check.py
@@ -0,0 +1,39 @@
+import logging
+
+from pip.basecommand import Command
+from pip.operations.check import check_requirements
+from pip.utils import get_installed_distributions
+
+
+logger = logging.getLogger(__name__)
+
+
+class CheckCommand(Command):
+    """Verify installed packages have compatible dependencies."""
+    name = 'check'
+    usage = """
+      %prog [options]"""
+    summary = 'Verify installed packages have compatible dependencies.'
+
+    def run(self, options, args):
+        dists = get_installed_distributions(local_only=False, skip=())
+        missing_reqs_dict, incompatible_reqs_dict = check_requirements(dists)
+
+        for dist in dists:
+            key = '%s==%s' % (dist.project_name, dist.version)
+
+            for requirement in missing_reqs_dict.get(key, []):
+                logger.info(
+                    "%s %s requires %s, which is not installed.",
+                    dist.project_name, dist.version, requirement.project_name)
+
+            for requirement, actual in incompatible_reqs_dict.get(key, []):
+                logger.info(
+                    "%s %s has requirement %s, but you have %s %s.",
+                    dist.project_name, dist.version, requirement,
+                    actual.project_name, actual.version)
+
+        if missing_reqs_dict or incompatible_reqs_dict:
+            return 1
+        else:
+            logger.info("No broken requirements found.")
diff --git a/vendor/pip-9.0.3/pip/commands/completion.py b/vendor/pip-9.0.3/pip/commands/completion.py
new file mode 100644
index 0000000000000000000000000000000000000000..66e41a679123201415370edf9e1c7bc6416f5daf
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/commands/completion.py
@@ -0,0 +1,81 @@
+from __future__ import absolute_import
+
+import sys
+from pip.basecommand import Command
+
+BASE_COMPLETION = """
+# pip %(shell)s completion start%(script)s# pip %(shell)s completion end
+"""
+
+COMPLETION_SCRIPTS = {
+    'bash': """
+_pip_completion()
+{
+    COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \\
+                   COMP_CWORD=$COMP_CWORD \\
+                   PIP_AUTO_COMPLETE=1 $1 ) )
+}
+complete -o default -F _pip_completion pip
+""", 'zsh': """
+function _pip_completion {
+  local words cword
+  read -Ac words
+  read -cn cword
+  reply=( $( COMP_WORDS="$words[*]" \\
+             COMP_CWORD=$(( cword-1 )) \\
+             PIP_AUTO_COMPLETE=1 $words[1] ) )
+}
+compctl -K _pip_completion pip
+""", 'fish': """
+function __fish_complete_pip
+    set -lx COMP_WORDS (commandline -o) ""
+    set -lx COMP_CWORD (math (contains -i -- (commandline -t) $COMP_WORDS)-1)
+    set -lx PIP_AUTO_COMPLETE 1
+    string split \  -- (eval $COMP_WORDS[1])
+end
+complete -fa "(__fish_complete_pip)" -c pip
+"""}
+
+
+class CompletionCommand(Command):
+    """A helper command to be used for command completion."""
+    name = 'completion'
+    summary = 'A helper command used for command completion.'
+
+    def __init__(self, *args, **kw):
+        super(CompletionCommand, self).__init__(*args, **kw)
+
+        cmd_opts = self.cmd_opts
+
+        cmd_opts.add_option(
+            '--bash', '-b',
+            action='store_const',
+            const='bash',
+            dest='shell',
+            help='Emit completion code for bash')
+        cmd_opts.add_option(
+            '--zsh', '-z',
+            action='store_const',
+            const='zsh',
+            dest='shell',
+            help='Emit completion code for zsh')
+        cmd_opts.add_option(
+            '--fish', '-f',
+            action='store_const',
+            const='fish',
+            dest='shell',
+            help='Emit completion code for fish')
+
+        self.parser.insert_option_group(0, cmd_opts)
+
+    def run(self, options, args):
+        """Prints the completion code of the given shell"""
+        shells = COMPLETION_SCRIPTS.keys()
+        shell_options = ['--' + shell for shell in sorted(shells)]
+        if options.shell in shells:
+            script = COMPLETION_SCRIPTS.get(options.shell, '')
+            print(BASE_COMPLETION % {'script': script, 'shell': options.shell})
+        else:
+            sys.stderr.write(
+                'ERROR: You must pass %s\n' % ' or '.join(shell_options)
+            )
diff --git a/vendor/pip-9.0.3/pip/commands/download.py b/vendor/pip-9.0.3/pip/commands/download.py
new file mode 100644
index 0000000000000000000000000000000000000000..4bc06408751da1cb3d1ee9372b2ec00ffcdd0c30
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/commands/download.py
@@ -0,0 +1,212 @@
+from __future__ import absolute_import
+
+import logging
+import os
+
+from pip.exceptions import CommandError
+from pip.index import FormatControl
+from pip.req import RequirementSet
+from pip.basecommand import RequirementCommand
+from pip import cmdoptions
+from pip.utils import ensure_dir, normalize_path
+from pip.utils.build import BuildDirectory
+from pip.utils.filesystem import check_path_owner
+
+
+logger = logging.getLogger(__name__)
+
+
+class DownloadCommand(RequirementCommand):
+    """
+    Download packages from:
+
+    - PyPI (and other indexes) using requirement specifiers.
+    - VCS project urls.
+    - Local project directories.
+    - Local or remote source archives.
+
+    pip also supports downloading from "requirements files", which provide
+    an easy way to specify a whole environment to be downloaded.
+    """
+    name = 'download'
+
+    usage = """
+      %prog [options] <requirement specifier> [package-index-options] ...
+      %prog [options] -r <requirements file> [package-index-options] ...
+      %prog [options] [-e] <vcs project url> ...
+      %prog [options] [-e] <local project path> ...
+      %prog [options] <archive url/path> ..."""
+
+    summary = 'Download packages.'
+
+    def __init__(self, *args, **kw):
+        super(DownloadCommand, self).__init__(*args, **kw)
+
+        cmd_opts = self.cmd_opts
+
+        cmd_opts.add_option(cmdoptions.constraints())
+        cmd_opts.add_option(cmdoptions.editable())
+        cmd_opts.add_option(cmdoptions.requirements())
+        cmd_opts.add_option(cmdoptions.build_dir())
+        cmd_opts.add_option(cmdoptions.no_deps())
+        cmd_opts.add_option(cmdoptions.global_options())
+        cmd_opts.add_option(cmdoptions.no_binary())
+        cmd_opts.add_option(cmdoptions.only_binary())
+        cmd_opts.add_option(cmdoptions.src())
+        cmd_opts.add_option(cmdoptions.pre())
+        cmd_opts.add_option(cmdoptions.no_clean())
+        cmd_opts.add_option(cmdoptions.require_hashes())
+
+        cmd_opts.add_option(
+            '-d', '--dest', '--destination-dir', '--destination-directory',
+            dest='download_dir',
+            metavar='dir',
+            default=os.curdir,
+            help=("Download packages into <dir>."),
+        )
+
+        cmd_opts.add_option(
+            '--platform',
+            dest='platform',
+            metavar='platform',
+            default=None,
+            help=("Only download wheels compatible with <platform>. "
+                  "Defaults to the platform of the running system."),
+        )
+
+        cmd_opts.add_option(
+            '--python-version',
+            dest='python_version',
+            metavar='python_version',
+            default=None,
+            help=("Only download wheels compatible with Python "
+                  "interpreter version <version>. If not specified, then the "
+                  "current system interpreter minor version is used. A major "
+                  "version (e.g. '2') can be specified to match all "
+                  "minor revs of that major version.  A minor version "
+                  "(e.g. '34') can also be specified."),
+        )
+
+        cmd_opts.add_option(
+            '--implementation',
+            dest='implementation',
+            metavar='implementation',
+            default=None,
+            help=("Only download wheels compatible with Python "
+                  "implementation <implementation>, e.g. 'pp', 'jy', 'cp', "
+                  " or 'ip'. If not specified, then the current "
+                  "interpreter implementation is used.  Use 'py' to force "
+                  "implementation-agnostic wheels."),
+        )
+
+        cmd_opts.add_option(
+            '--abi',
+            dest='abi',
+            metavar='abi',
+            default=None,
+            help=("Only download wheels compatible with Python "
+                  "abi <abi>, e.g. 'pypy_41'.  If not specified, then the "
+                  "current interpreter abi tag is used.  Generally "
+                  "you will need to specify --implementation, "
+                  "--platform, and --python-version when using "
+                  "this option."),
+        )
+
+        index_opts = cmdoptions.make_option_group(
+            cmdoptions.non_deprecated_index_group,
+            self.parser,
+        )
+
+        self.parser.insert_option_group(0, index_opts)
+        self.parser.insert_option_group(0, cmd_opts)
+
+    def run(self, options, args):
+        options.ignore_installed = True
+
+        if options.python_version:
+            python_versions = [options.python_version]
+        else:
+            python_versions = None
+
+        dist_restriction_set = any([
+            options.python_version,
+            options.platform,
+            options.abi,
+            options.implementation,
+        ])
+        binary_only = FormatControl(set(), set([':all:']))
+        if dist_restriction_set and options.format_control != binary_only:
+            raise CommandError(
+                "--only-binary=:all: must be set and --no-binary must not "
+                "be set (or must be set to :none:) when restricting platform "
+                "and interpreter constraints using --python-version, "
+                "--platform, --abi, or --implementation."
+            )
+
+        options.src_dir = os.path.abspath(options.src_dir)
+        options.download_dir = normalize_path(options.download_dir)
+
+        ensure_dir(options.download_dir)
+
+        with self._build_session(options) as session:
+            finder = self._build_package_finder(
+                options=options,
+                session=session,
+                platform=options.platform,
+                python_versions=python_versions,
+                abi=options.abi,
+                implementation=options.implementation,
+            )
+            build_delete = (not (options.no_clean or options.build_dir))
+            if options.cache_dir and not check_path_owner(options.cache_dir):
+                logger.warning(
+                    "The directory '%s' or its parent directory is not owned "
+                    "by the current user and caching wheels has been "
+                    "disabled. check the permissions and owner of that "
+                    "directory. If executing pip with sudo, you may want "
+                    "sudo's -H flag.",
+                    options.cache_dir,
+                )
+                options.cache_dir = None
+
+            with BuildDirectory(options.build_dir,
+                                delete=build_delete) as build_dir:
+
+                requirement_set = RequirementSet(
+                    build_dir=build_dir,
+                    src_dir=options.src_dir,
+                    download_dir=options.download_dir,
+                    ignore_installed=True,
+                    ignore_dependencies=options.ignore_dependencies,
+                    session=session,
+                    isolated=options.isolated_mode,
+                    require_hashes=options.require_hashes
+                )
+                self.populate_requirement_set(
+                    requirement_set,
+                    args,
+                    options,
+                    finder,
+                    session,
+                    self.name,
+                    None
+                )
+
+                if not requirement_set.has_requirements:
+                    return
+
+                requirement_set.prepare_files(finder)
+
+                downloaded = ' '.join([
+                    req.name for req in requirement_set.successfully_downloaded
+                ])
+                if downloaded:
+                    logger.info(
+                        'Successfully downloaded %s', downloaded
+                    )
+
+                # Clean up
+                if not options.no_clean:
+                    requirement_set.cleanup_files()
+
+        return requirement_set
diff --git a/vendor/pip-9.0.3/pip/commands/freeze.py b/vendor/pip-9.0.3/pip/commands/freeze.py
new file mode 100644
index 0000000000000000000000000000000000000000..c1987961985b4fb4c67d69561c3b301432da0f8d
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/commands/freeze.py
@@ -0,0 +1,87 @@
+from __future__ import absolute_import
+
+import sys
+
+import pip
+from pip.compat import stdlib_pkgs
+from pip.basecommand import Command
+from pip.operations.freeze import freeze
+from pip.wheel import WheelCache
+
+
+DEV_PKGS = ('pip', 'setuptools', 'distribute', 'wheel')
+
+
+class FreezeCommand(Command):
+    """
+    Output installed packages in requirements format.
+
+    packages are listed in a case-insensitive sorted order.
+    """
+    name = 'freeze'
+    usage = """
+      %prog [options]"""
+    summary = 'Output installed packages in requirements format.'
+    log_streams = ("ext://sys.stderr", "ext://sys.stderr")
+
+    def __init__(self, *args, **kw):
+        super(FreezeCommand, self).__init__(*args, **kw)
+
+        self.cmd_opts.add_option(
+            '-r', '--requirement',
+            dest='requirements',
+            action='append',
+            default=[],
+            metavar='file',
+            help="Use the order in the given requirements file and its "
+                 "comments when generating output. This option can be "
+                 "used multiple times.")
+        self.cmd_opts.add_option(
+            '-f', '--find-links',
+            dest='find_links',
+            action='append',
+            default=[],
+            metavar='URL',
+            help='URL for finding packages, which will be added to the '
+                 'output.')
+        self.cmd_opts.add_option(
+            '-l', '--local',
+            dest='local',
+            action='store_true',
+            default=False,
+            help='If in a virtualenv that has global access, do not output '
+                 'globally-installed packages.')
+        self.cmd_opts.add_option(
+            '--user',
+            dest='user',
+            action='store_true',
+            default=False,
+            help='Only output packages installed in user-site.')
+        self.cmd_opts.add_option(
+            '--all',
+            dest='freeze_all',
+            action='store_true',
+            help='Do not skip these packages in the output:'
+                 ' %s' % ', '.join(DEV_PKGS))
+
+        self.parser.insert_option_group(0, self.cmd_opts)
+
+    def run(self, options, args):
+        format_control = pip.index.FormatControl(set(), set())
+        wheel_cache = WheelCache(options.cache_dir, format_control)
+        skip = set(stdlib_pkgs)
+        if not options.freeze_all:
+            skip.update(DEV_PKGS)
+
+        freeze_kwargs = dict(
+            requirement=options.requirements,
+            find_links=options.find_links,
+            local_only=options.local,
+            user_only=options.user,
+            skip_regex=options.skip_requirements_regex,
+            isolated=options.isolated_mode,
+            wheel_cache=wheel_cache,
+            skip=skip)
+
+        for line in freeze(**freeze_kwargs):
+            sys.stdout.write(line + '\n')
diff --git a/vendor/pip-9.0.3/pip/commands/hash.py b/vendor/pip-9.0.3/pip/commands/hash.py
new file mode 100644
index 0000000000000000000000000000000000000000..27cca0bfa409121799aa9260d659727b094a76db
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/commands/hash.py
@@ -0,0 +1,57 @@
+from __future__ import absolute_import
+
+import hashlib
+import logging
+import sys
+
+from pip.basecommand import Command
+from pip.status_codes import ERROR
+from pip.utils import read_chunks
+from pip.utils.hashes import FAVORITE_HASH, STRONG_HASHES
+
+
+logger = logging.getLogger(__name__)
+
+
+class HashCommand(Command):
+    """
+    Compute a hash of a local package archive.
+
+    These can be used with --hash in a requirements file to do repeatable
+    installs.
+
+    """
+    name = 'hash'
+    usage = '%prog [options] <file> ...'
+    summary = 'Compute hashes of package archives.'
+
+    def __init__(self, *args, **kw):
+        super(HashCommand, self).__init__(*args, **kw)
+        self.cmd_opts.add_option(
+            '-a', '--algorithm',
+            dest='algorithm',
+            choices=STRONG_HASHES,
+            action='store',
+            default=FAVORITE_HASH,
+            help='The hash algorithm to use: one of %s' %
+                 ', '.join(STRONG_HASHES))
+        self.parser.insert_option_group(0, self.cmd_opts)
+
+    def run(self, options, args):
+        if not args:
+            self.parser.print_usage(sys.stderr)
+            return ERROR
+
+        algorithm = options.algorithm
+        for path in args:
+            logger.info('%s:\n--hash=%s:%s',
+                        path, algorithm, _hash_of_file(path, algorithm))
+
+
+def _hash_of_file(path, algorithm):
+    """Return the hash digest of a file."""
+    with open(path, 'rb') as archive:
+        hash = hashlib.new(algorithm)
+        for chunk in read_chunks(archive):
+            hash.update(chunk)
+    return hash.hexdigest()
diff --git a/vendor/pip-9.0.3/pip/commands/help.py b/vendor/pip-9.0.3/pip/commands/help.py
new file mode 100644
index 0000000000000000000000000000000000000000..11722f1e067fc9b1d41adc44f91b5686fedb7d70
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/commands/help.py
@@ -0,0 +1,35 @@
+from __future__ import absolute_import
+
+from pip.basecommand import Command, SUCCESS
+from pip.exceptions import CommandError
+
+
+class HelpCommand(Command):
+    """Show help for commands"""
+    name = 'help'
+    usage = """
+      %prog <command>"""
+    summary = 'Show help for commands.'
+
+    def run(self, options, args):
+        from pip.commands import commands_dict, get_similar_commands
+
+        try:
+            # 'pip help' with no args is handled by pip.__init__.parseopt()
+            cmd_name = args[0]  # the command we need help for
+        except IndexError:
+            return SUCCESS
+
+        if cmd_name not in commands_dict:
+            guess = get_similar_commands(cmd_name)
+
+            msg = ['unknown command "%s"' % cmd_name]
+            if guess:
+                msg.append('maybe you meant "%s"' % guess)
+
+            raise CommandError(' - '.join(msg))
+
+        command = commands_dict[cmd_name]()
+        command.parser.print_help()
+
+        return SUCCESS
diff --git a/vendor/pip-9.0.3/pip/commands/install.py b/vendor/pip-9.0.3/pip/commands/install.py
new file mode 100644
index 0000000000000000000000000000000000000000..227c5264a0d60e8eaadcc2b5139df252a1e4c223
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/commands/install.py
@@ -0,0 +1,437 @@
+from __future__ import absolute_import
+
+import logging
+import operator
+import os
+import tempfile
+import shutil
+import warnings
+try:
+    import wheel
+except ImportError:
+    wheel = None
+
+from pip.req import RequirementSet
+from pip.basecommand import RequirementCommand
+from pip.locations import virtualenv_no_global, distutils_scheme
+from pip.exceptions import (
+    InstallationError, CommandError, PreviousBuildDirError,
+)
+from pip import cmdoptions
+from pip.utils import ensure_dir, get_installed_version
+from pip.utils.build import BuildDirectory
+from pip.utils.deprecation import RemovedInPip10Warning
+from pip.utils.filesystem import check_path_owner
+from pip.wheel import WheelCache, WheelBuilder
+
+
+logger = logging.getLogger(__name__)
+
+
+class InstallCommand(RequirementCommand):
+    """
+    Install packages from:
+
+    - PyPI (and other indexes) using requirement specifiers.
+    - VCS project urls.
+    - Local project directories.
+    - Local or remote source archives.
+
+    pip also supports installing from "requirements files", which provide
+    an easy way to specify a whole environment to be installed.
+    """
+    name = 'install'
+
+    usage = """
+      %prog [options] <requirement specifier> [package-index-options] ...
+      %prog [options] -r <requirements file> [package-index-options] ...
+      %prog [options] [-e] <vcs project url> ...
+      %prog [options] [-e] <local project path> ...
+      %prog [options] <archive url/path> ..."""
+
+    summary = 'Install packages.'
+
+    def __init__(self, *args, **kw):
+        super(InstallCommand, self).__init__(*args, **kw)
+
+        cmd_opts = self.cmd_opts
+
+        cmd_opts.add_option(cmdoptions.constraints())
+        cmd_opts.add_option(cmdoptions.editable())
+        cmd_opts.add_option(cmdoptions.requirements())
+        cmd_opts.add_option(cmdoptions.build_dir())
+
+        cmd_opts.add_option(
+            '-t', '--target',
+            dest='target_dir',
+            metavar='dir',
+            default=None,
+            help='Install packages into <dir>. '
+                 'By default this will not replace existing files/folders in '
+                 '<dir>. Use --upgrade to replace existing packages in <dir> '
+                 'with new versions.'
+        )
+
+        cmd_opts.add_option(
+            '-d', '--download', '--download-dir', '--download-directory',
+            dest='download_dir',
+            metavar='dir',
+            default=None,
+            help=("Download packages into <dir> instead of installing them, "
+                  "regardless of what's already installed."),
+        )
+
+        cmd_opts.add_option(cmdoptions.src())
+
+        cmd_opts.add_option(
+            '-U', '--upgrade',
+            dest='upgrade',
+            action='store_true',
+            help='Upgrade all specified packages to the newest available '
+                 'version. The handling of dependencies depends on the '
+                 'upgrade-strategy used.'
+        )
+
+        cmd_opts.add_option(
+            '--upgrade-strategy',
+            dest='upgrade_strategy',
+            default='eager',
+            choices=['only-if-needed', 'eager'],
+            help='Determines how dependency upgrading should be handled. '
+                 '"eager" - dependencies are upgraded regardless of '
+                 'whether the currently installed version satisfies the '
+                 'requirements of the upgraded package(s). '
+                 '"only-if-needed" -  are upgraded only when they do not '
+                 'satisfy the requirements of the upgraded package(s).'
+        )
+
+        cmd_opts.add_option(
+            '--force-reinstall',
+            dest='force_reinstall',
+            action='store_true',
+            help='When upgrading, reinstall all packages even if they are '
+                 'already up-to-date.')
+
+        cmd_opts.add_option(
+            '-I', '--ignore-installed',
+            dest='ignore_installed',
+            action='store_true',
+            help='Ignore the installed packages (reinstalling instead).')
+
+        cmd_opts.add_option(cmdoptions.ignore_requires_python())
+        cmd_opts.add_option(cmdoptions.no_deps())
+
+        cmd_opts.add_option(cmdoptions.install_options())
+        cmd_opts.add_option(cmdoptions.global_options())
+
+        cmd_opts.add_option(
+            '--user',
+            dest='use_user_site',
+            action='store_true',
+            help="Install to the Python user install directory for your "
+                 "platform. Typically ~/.local/, or %APPDATA%\Python on "
+                 "Windows. (See the Python documentation for site.USER_BASE "
+                 "for full details.)")
+
+        cmd_opts.add_option(
+            '--egg',
+            dest='as_egg',
+            action='store_true',
+            help="Install packages as eggs, not 'flat', like pip normally "
+                 "does. This option is not about installing *from* eggs. "
+                 "(WARNING: Because this option overrides pip's normal install"
+                 " logic, requirements files may not behave as expected.)")
+
+        cmd_opts.add_option(
+            '--root',
+            dest='root_path',
+            metavar='dir',
+            default=None,
+            help="Install everything relative to this alternate root "
+                 "directory.")
+
+        cmd_opts.add_option(
+            '--prefix',
+            dest='prefix_path',
+            metavar='dir',
+            default=None,
+            help="Installation prefix where lib, bin and other top-level "
+                 "folders are placed")
+
+        cmd_opts.add_option(
+            "--compile",
+            action="store_true",
+            dest="compile",
+            default=True,
+            help="Compile py files to pyc",
+        )
+
+        cmd_opts.add_option(
+            "--no-compile",
+            action="store_false",
+            dest="compile",
+            help="Do not compile py files to pyc",
+        )
+
+        cmd_opts.add_option(cmdoptions.use_wheel())
+        cmd_opts.add_option(cmdoptions.no_use_wheel())
+        cmd_opts.add_option(cmdoptions.no_binary())
+        cmd_opts.add_option(cmdoptions.only_binary())
+        cmd_opts.add_option(cmdoptions.pre())
+        cmd_opts.add_option(cmdoptions.no_clean())
+        cmd_opts.add_option(cmdoptions.require_hashes())
+
+        index_opts = cmdoptions.make_option_group(
+            cmdoptions.index_group,
+            self.parser,
+        )
+
+        self.parser.insert_option_group(0, index_opts)
+        self.parser.insert_option_group(0, cmd_opts)
+
+    def run(self, options, args):
+        cmdoptions.resolve_wheel_no_use_binary(options)
+        cmdoptions.check_install_build_global(options)
+
+        if options.as_egg:
+            warnings.warn(
+                "--egg has been deprecated and will be removed in the future. "
+                "This flag is mutually exclusive with large parts of pip, and "
+                "actually using it invalidates pip's ability to manage the "
+                "installation process.",
+                RemovedInPip10Warning,
+            )
+
+        if options.allow_external:
+            warnings.warn(
+                "--allow-external has been deprecated and will be removed in "
+                "the future. Due to changes in the repository protocol, it no "
+                "longer has any effect.",
+                RemovedInPip10Warning,
+            )
+
+        if options.allow_all_external:
+            warnings.warn(
+                "--allow-all-external has been deprecated and will be removed "
+                "in the future. Due to changes in the repository protocol, it "
+                "no longer has any effect.",
+                RemovedInPip10Warning,
+            )
+
+        if options.allow_unverified:
+            warnings.warn(
+                "--allow-unverified has been deprecated and will be removed "
+                "in the future. Due to changes in the repository protocol, it "
+                "no longer has any effect.",
+                RemovedInPip10Warning,
+            )
+
+        if options.download_dir:
+            warnings.warn(
+                "pip install --download has been deprecated and will be "
+                "removed in the future. Pip now has a download command that "
+                "should be used instead.",
+                RemovedInPip10Warning,
+            )
+            options.ignore_installed = True
+
+        if options.build_dir:
+            options.build_dir = os.path.abspath(options.build_dir)
+
+        options.src_dir = os.path.abspath(options.src_dir)
+        install_options = options.install_options or []
+        if options.use_user_site:
+            if options.prefix_path:
+                raise CommandError(
+                    "Can not combine '--user' and '--prefix' as they imply "
+                    "different installation locations"
+                )
+            if virtualenv_no_global():
+                raise InstallationError(
+                    "Can not perform a '--user' install. User site-packages "
+                    "are not visible in this virtualenv."
+                )
+            install_options.append('--user')
+            install_options.append('--prefix=')
+
+        temp_target_dir = None
+        if options.target_dir:
+            options.ignore_installed = True
+            temp_target_dir = tempfile.mkdtemp()
+            options.target_dir = os.path.abspath(options.target_dir)
+            if (os.path.exists(options.target_dir) and not
+                    os.path.isdir(options.target_dir)):
+                raise CommandError(
+                    "Target path exists but is not a directory, will not "
+                    "continue."
+                )
+            install_options.append('--home=' + temp_target_dir)
+
+        global_options = options.global_options or []
+
+        with self._build_session(options) as session:
+
+            finder = self._build_package_finder(options, session)
+            build_delete = (not (options.no_clean or options.build_dir))
+            wheel_cache = WheelCache(options.cache_dir, options.format_control)
+            if options.cache_dir and not check_path_owner(options.cache_dir):
+                logger.warning(
+                    "The directory '%s' or its parent directory is not owned "
+                    "by the current user and caching wheels has been "
+                    "disabled. check the permissions and owner of that "
+                    "directory. If executing pip with sudo, you may want "
+                    "sudo's -H flag.",
+                    options.cache_dir,
+                )
+                options.cache_dir = None
+
+            with BuildDirectory(options.build_dir,
+                                delete=build_delete) as build_dir:
+                requirement_set = RequirementSet(
+                    build_dir=build_dir,
+                    src_dir=options.src_dir,
+                    download_dir=options.download_dir,
+                    upgrade=options.upgrade,
+                    upgrade_strategy=options.upgrade_strategy,
+                    as_egg=options.as_egg,
+                    ignore_installed=options.ignore_installed,
+                    ignore_dependencies=options.ignore_dependencies,
+                    ignore_requires_python=options.ignore_requires_python,
+                    force_reinstall=options.force_reinstall,
+                    use_user_site=options.use_user_site,
+                    target_dir=temp_target_dir,
+                    session=session,
+                    pycompile=options.compile,
+                    isolated=options.isolated_mode,
+                    wheel_cache=wheel_cache,
+                    require_hashes=options.require_hashes,
+                )
+
+                self.populate_requirement_set(
+                    requirement_set, args, options, finder, session, self.name,
+                    wheel_cache
+                )
+
+                if not requirement_set.has_requirements:
+                    return
+
+                try:
+                    if (options.download_dir or not wheel or not
+                            options.cache_dir):
+                        # on -d don't do complex things like building
+                        # wheels, and don't try to build wheels when wheel is
+                        # not installed.
+                        requirement_set.prepare_files(finder)
+                    else:
+                        # build wheels before install.
+                        wb = WheelBuilder(
+                            requirement_set,
+                            finder,
+                            build_options=[],
+                            global_options=[],
+                        )
+                        # Ignore the result: a failed wheel will be
+                        # installed from the sdist/vcs whatever.
+                        wb.build(autobuilding=True)
+
+                    if not options.download_dir:
+                        requirement_set.install(
+                            install_options,
+                            global_options,
+                            root=options.root_path,
+                            prefix=options.prefix_path,
+                        )
+
+                        possible_lib_locations = get_lib_location_guesses(
+                            user=options.use_user_site,
+                            home=temp_target_dir,
+                            root=options.root_path,
+                            prefix=options.prefix_path,
+                            isolated=options.isolated_mode,
+                        )
+                        reqs = sorted(
+                            requirement_set.successfully_installed,
+                            key=operator.attrgetter('name'))
+                        items = []
+                        for req in reqs:
+                            item = req.name
+                            try:
+                                installed_version = get_installed_version(
+                                    req.name, possible_lib_locations
+                                )
+                                if installed_version:
+                                    item += '-' + installed_version
+                            except Exception:
+                                pass
+                            items.append(item)
+                        installed = ' '.join(items)
+                        if installed:
+                            logger.info('Successfully installed %s', installed)
+                    else:
+                        downloaded = ' '.join([
+                            req.name
+                            for req in requirement_set.successfully_downloaded
+                        ])
+                        if downloaded:
+                            logger.info(
+                                'Successfully downloaded %s', downloaded
+                            )
+                except PreviousBuildDirError:
+                    options.no_clean = True
+                    raise
+                finally:
+                    # Clean up
+                    if not options.no_clean:
+                        requirement_set.cleanup_files()
+
+        if options.target_dir:
+            ensure_dir(options.target_dir)
+
+            # Checking both purelib and platlib directories for installed
+            # packages to be moved to target directory
+            lib_dir_list = []
+
+            purelib_dir = distutils_scheme('', home=temp_target_dir)['purelib']
+            platlib_dir = distutils_scheme('', home=temp_target_dir)['platlib']
+
+            if os.path.exists(purelib_dir):
+                lib_dir_list.append(purelib_dir)
+            if os.path.exists(platlib_dir) and platlib_dir != purelib_dir:
+                lib_dir_list.append(platlib_dir)
+
+            for lib_dir in lib_dir_list:
+                for item in os.listdir(lib_dir):
+                    target_item_dir = os.path.join(options.target_dir, item)
+                    if os.path.exists(target_item_dir):
+                        if not options.upgrade:
+                            logger.warning(
+                                'Target directory %s already exists. Specify '
+                                '--upgrade to force replacement.',
+                                target_item_dir
+                            )
+                            continue
+                        if os.path.islink(target_item_dir):
+                            logger.warning(
+                                'Target directory %s already exists and is '
+                                'a link. Pip will not automatically replace '
+                                'links, please remove if replacement is '
+                                'desired.',
+                                target_item_dir
+                            )
+                            continue
+                        if os.path.isdir(target_item_dir):
+                            shutil.rmtree(target_item_dir)
+                        else:
+                            os.remove(target_item_dir)
+
+                    shutil.move(
+                        os.path.join(lib_dir, item),
+                        target_item_dir
+                    )
+            shutil.rmtree(temp_target_dir)
+        return requirement_set
+
+
+def get_lib_location_guesses(*args, **kwargs):
+    scheme = distutils_scheme('', *args, **kwargs)
+    return [scheme['purelib'], scheme['platlib']]
diff --git a/vendor/pip-9.0.3/pip/commands/list.py b/vendor/pip-9.0.3/pip/commands/list.py
new file mode 100644
index 0000000000000000000000000000000000000000..6f6995d70f58764f081a35b0905d78ccd5b7dad6
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/commands/list.py
@@ -0,0 +1,337 @@
+from __future__ import absolute_import
+
+import json
+import logging
+import warnings
+try:
+    from itertools import zip_longest
+except ImportError:
+    from itertools import izip_longest as zip_longest
+
+from pip._vendor import six
+
+from pip.basecommand import Command
+from pip.exceptions import CommandError
+from pip.index import PackageFinder
+from pip.utils import (
+    get_installed_distributions, dist_is_editable)
+from pip.utils.deprecation import RemovedInPip10Warning
+from pip.cmdoptions import make_option_group, index_group
+
+logger = logging.getLogger(__name__)
+
+
+class ListCommand(Command):
+    """
+    List installed packages, including editables.
+
+    Packages are listed in a case-insensitive sorted order.
+    """
+    name = 'list'
+    usage = """
+      %prog [options]"""
+    summary = 'List installed packages.'
+
+    def __init__(self, *args, **kw):
+        super(ListCommand, self).__init__(*args, **kw)
+
+        cmd_opts = self.cmd_opts
+
+        cmd_opts.add_option(
+            '-o', '--outdated',
+            action='store_true',
+            default=False,
+            help='List outdated packages')
+        cmd_opts.add_option(
+            '-u', '--uptodate',
+            action='store_true',
+            default=False,
+            help='List uptodate packages')
+        cmd_opts.add_option(
+            '-e', '--editable',
+            action='store_true',
+            default=False,
+            help='List editable projects.')
+        cmd_opts.add_option(
+            '-l', '--local',
+            action='store_true',
+            default=False,
+            help=('If in a virtualenv that has global access, do not list '
+                  'globally-installed packages.'),
+        )
+        self.cmd_opts.add_option(
+            '--user',
+            dest='user',
+            action='store_true',
+            default=False,
+            help='Only output packages installed in user-site.')
+
+        cmd_opts.add_option(
+            '--pre',
+            action='store_true',
+            default=False,
+            help=("Include pre-release and development versions. By default, "
+                  "pip only finds stable versions."),
+        )
+
+        cmd_opts.add_option(
+            '--format',
+            action='store',
+            dest='list_format',
+            choices=('legacy', 'columns', 'freeze', 'json'),
+            help="Select the output format among: legacy (default), columns, "
+                 "freeze or json.",
+        )
+
+        cmd_opts.add_option(
+            '--not-required',
+            action='store_true',
+            dest='not_required',
+            help="List packages that are not dependencies of "
+                 "installed packages.",
+        )
+
+        index_opts = make_option_group(index_group, self.parser)
+
+        self.parser.insert_option_group(0, index_opts)
+        self.parser.insert_option_group(0, cmd_opts)
+
+    def _build_package_finder(self, options, index_urls, session):
+        """
+        Create a package finder appropriate to this list command.
+        """
+        return PackageFinder(
+            find_links=options.find_links,
+            index_urls=index_urls,
+            allow_all_prereleases=options.pre,
+            trusted_hosts=options.trusted_hosts,
+            process_dependency_links=options.process_dependency_links,
+            session=session,
+        )
+
+    def run(self, options, args):
+        if options.allow_external:
+            warnings.warn(
+                "--allow-external has been deprecated and will be removed in "
+                "the future. Due to changes in the repository protocol, it no "
+                "longer has any effect.",
+                RemovedInPip10Warning,
+            )
+
+        if options.allow_all_external:
+            warnings.warn(
+                "--allow-all-external has been deprecated and will be removed "
+                "in the future. Due to changes in the repository protocol, it "
+                "no longer has any effect.",
+                RemovedInPip10Warning,
+            )
+
+        if options.allow_unverified:
+            warnings.warn(
+                "--allow-unverified has been deprecated and will be removed "
+                "in the future. Due to changes in the repository protocol, it "
+                "no longer has any effect.",
+                RemovedInPip10Warning,
+            )
+
+        if options.list_format is None:
+            warnings.warn(
+                "The default format will switch to columns in the future. "
+                "You can use --format=(legacy|columns) (or define a "
+                "format=(legacy|columns) in your pip.conf under the [list] "
+                "section) to disable this warning.",
+                RemovedInPip10Warning,
+            )
+
+        if options.outdated and options.uptodate:
+            raise CommandError(
+                "Options --outdated and --uptodate cannot be combined.")
+
+        packages = get_installed_distributions(
+            local_only=options.local,
+            user_only=options.user,
+            editables_only=options.editable,
+        )
+
+        if options.outdated:
+            packages = self.get_outdated(packages, options)
+        elif options.uptodate:
+            packages = self.get_uptodate(packages, options)
+
+        if options.not_required:
+            packages = self.get_not_required(packages, options)
+
+        self.output_package_listing(packages, options)
+
+    def get_outdated(self, packages, options):
+        return [
+            dist for dist in self.iter_packages_latest_infos(packages, options)
+            if dist.latest_version > dist.parsed_version
+        ]
+
+    def get_uptodate(self, packages, options):
+        return [
+            dist for dist in self.iter_packages_latest_infos(packages, options)
+            if dist.latest_version == dist.parsed_version
+        ]
+
+    def get_not_required(self, packages, options):
+        dep_keys = set()
+        for dist in packages:
+            dep_keys.update(requirement.key for requirement in dist.requires())
+        return set(pkg for pkg in packages if pkg.key not in dep_keys)
+
+    def iter_packages_latest_infos(self, packages, options):
+        index_urls = [options.index_url] + options.extra_index_urls
+        if options.no_index:
+            logger.debug('Ignoring indexes: %s', ','.join(index_urls))
+            index_urls = []
+
+        dependency_links = []
+        for dist in packages:
+            if dist.has_metadata('dependency_links.txt'):
+                dependency_links.extend(
+                    dist.get_metadata_lines('dependency_links.txt'),
+                )
+
+        with self._build_session(options) as session:
+            finder = self._build_package_finder(options, index_urls, session)
+            finder.add_dependency_links(dependency_links)
+
+            for dist in packages:
+                typ = 'unknown'
+                all_candidates = finder.find_all_candidates(dist.key)
+                if not options.pre:
+                    # Remove prereleases
+                    all_candidates = [candidate for candidate in all_candidates
+                                      if not candidate.version.is_prerelease]
+
+                if not all_candidates:
+                    continue
+                best_candidate = max(all_candidates,
+                                     key=finder._candidate_sort_key)
+                remote_version = best_candidate.version
+                if best_candidate.location.is_wheel:
+                    typ = 'wheel'
+                else:
+                    typ = 'sdist'
+                # This is dirty but makes the rest of the code much cleaner
+                dist.latest_version = remote_version
+                dist.latest_filetype = typ
+                yield dist
+
+    def output_legacy(self, dist):
+        if dist_is_editable(dist):
+            return '%s (%s, %s)' % (
+                dist.project_name,
+                dist.version,
+                dist.location,
+            )
+        else:
+            return '%s (%s)' % (dist.project_name, dist.version)
+
+    def output_legacy_latest(self, dist):
+        return '%s - Latest: %s [%s]' % (
+            self.output_legacy(dist),
+            dist.latest_version,
+            dist.latest_filetype,
+        )
+
+    def output_package_listing(self, packages, options):
+        packages = sorted(
+            packages,
+            key=lambda dist: dist.project_name.lower(),
+        )
+        if options.list_format == 'columns' and packages:
+            data, header = format_for_columns(packages, options)
+            self.output_package_listing_columns(data, header)
+        elif options.list_format == 'freeze':
+            for dist in packages:
+                logger.info("%s==%s", dist.project_name, dist.version)
+        elif options.list_format == 'json':
+            logger.info(format_for_json(packages, options))
+        else:  # legacy
+            for dist in packages:
+                if options.outdated:
+                    logger.info(self.output_legacy_latest(dist))
+                else:
+                    logger.info(self.output_legacy(dist))
+
+    def output_package_listing_columns(self, data, header):
+        # insert the header first: we need to know the size of column names
+        if len(data) > 0:
+            data.insert(0, header)
+
+        pkg_strings, sizes = tabulate(data)
+
+        # Create and add a separator.
+        if len(data) > 0:
+            pkg_strings.insert(1, " ".join(map(lambda x: '-' * x, sizes)))
+
+        for val in pkg_strings:
+            logger.info(val)
+
+
+def tabulate(vals):
+    # From pfmoore on GitHub:
+    # https://github.com/pypa/pip/issues/3651#issuecomment-216932564
+    assert len(vals) > 0
+
+    sizes = [0] * max(len(x) for x in vals)
+    for row in vals:
+        sizes = [max(s, len(str(c))) for s, c in zip_longest(sizes, row)]
+
+    result = []
+    for row in vals:
+        display = " ".join([str(c).ljust(s) if c is not None else ''
+                            for s, c in zip_longest(sizes, row)])
+        result.append(display)
+
+    return result, sizes
+
+
+def format_for_columns(pkgs, options):
+    """
+    Convert the package data into something usable
+    by output_package_listing_columns.
+    """
+    running_outdated = options.outdated
+    # Adjust the header for the `pip list --outdated` case.
+    if running_outdated:
+        header = ["Package", "Version", "Latest", "Type"]
+    else:
+        header = ["Package", "Version"]
+
+    data = []
+    if any(dist_is_editable(x) for x in pkgs):
+        header.append("Location")
+
+    for proj in pkgs:
+        # if we're working on the 'outdated' list, separate out the
+        # latest_version and type
+        row = [proj.project_name, proj.version]
+
+        if running_outdated:
+            row.append(proj.latest_version)
+            row.append(proj.latest_filetype)
+
+        if dist_is_editable(proj):
+            row.append(proj.location)
+
+        data.append(row)
+
+    return data, header
+
+
+def format_for_json(packages, options):
+    data = []
+    for dist in packages:
+        info = {
+            'name': dist.project_name,
+            'version': six.text_type(dist.version),
+        }
+        if options.outdated:
+            info['latest_version'] = six.text_type(dist.latest_version)
+            info['latest_filetype'] = dist.latest_filetype
+        data.append(info)
+    return json.dumps(data)
diff --git a/vendor/pip-9.0.3/pip/commands/search.py b/vendor/pip-9.0.3/pip/commands/search.py
new file mode 100644
index 0000000000000000000000000000000000000000..bd2ea8ad3e5dea9baa95aea331241533f1c21a42
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/commands/search.py
@@ -0,0 +1,133 @@
+from __future__ import absolute_import
+
+import logging
+import sys
+import textwrap
+
+from pip.basecommand import Command, SUCCESS
+from pip.compat import OrderedDict
+from pip.download import PipXmlrpcTransport
+from pip.models import PyPI
+from pip.utils import get_terminal_size
+from pip.utils.logging import indent_log
+from pip.exceptions import CommandError
+from pip.status_codes import NO_MATCHES_FOUND
+from pip._vendor.packaging.version import parse as parse_version
+from pip._vendor import pkg_resources
+from pip._vendor.six.moves import xmlrpc_client
+
+
+logger = logging.getLogger(__name__)
+
+
+class SearchCommand(Command):
+    """Search for PyPI packages whose name or summary contains <query>."""
+    name = 'search'
+    usage = """
+      %prog [options] <query>"""
+    summary = 'Search PyPI for packages.'
+
+    def __init__(self, *args, **kw):
+        super(SearchCommand, self).__init__(*args, **kw)
+        self.cmd_opts.add_option(
+            '-i', '--index',
+            dest='index',
+            metavar='URL',
+            default=PyPI.pypi_url,
+            help='Base URL of Python Package Index (default %default)')
+
+        self.parser.insert_option_group(0, self.cmd_opts)
+
+    def run(self, options, args):
+        if not args:
+            raise CommandError('Missing required argument (search query).')
+        query = args
+        pypi_hits = self.search(query, options)
+        hits = transform_hits(pypi_hits)
+
+        terminal_width = None
+        if sys.stdout.isatty():
+            terminal_width = get_terminal_size()[0]
+
+        print_results(hits, terminal_width=terminal_width)
+        if pypi_hits:
+            return SUCCESS
+        return NO_MATCHES_FOUND
+
+    def search(self, query, options):
+        index_url = options.index
+        with self._build_session(options) as session:
+            transport = PipXmlrpcTransport(index_url, session)
+            pypi = xmlrpc_client.ServerProxy(index_url, transport)
+            hits = pypi.search({'name': query, 'summary': query}, 'or')
+            return hits
+
+
+def transform_hits(hits):
+    """
+    The list from pypi is really a list of versions. We want a list of
+    packages with the list of versions stored inline. This converts the
+    list from pypi into one we can use.
+    """
+    packages = OrderedDict()
+    for hit in hits:
+        name = hit['name']
+        summary = hit['summary']
+        version = hit['version']
+
+        if name not in packages.keys():
+            packages[name] = {
+                'name': name,
+                'summary': summary,
+                'versions': [version],
+            }
+        else:
+            packages[name]['versions'].append(version)
+
+            # if this is the highest version, replace summary and score
+            if version == highest_version(packages[name]['versions']):
+                packages[name]['summary'] = summary
+
+    return list(packages.values())
+
+
+def print_results(hits, name_column_width=None, terminal_width=None):
+    if not hits:
+        return
+    if name_column_width is None:
+        name_column_width = max([
+            len(hit['name']) + len(hit.get('versions', ['-'])[-1])
+            for hit in hits
+        ]) + 4
+
+    installed_packages = [p.project_name for p in pkg_resources.working_set]
+    for hit in hits:
+        name = hit['name']
+        summary = hit['summary'] or ''
+        version = hit.get('versions', ['-'])[-1]
+        if terminal_width is not None:
+            target_width = terminal_width - name_column_width - 5
+            if target_width > 10:
+                # wrap and indent summary to fit terminal
+                summary = textwrap.wrap(summary, target_width)
+                summary = ('\n' + ' ' * (name_column_width + 3)).join(summary)
+
+        line = '%-*s - %s' % (name_column_width,
+                              '%s (%s)' % (name, version), summary)
+        try:
+            logger.info(line)
+            if name in installed_packages:
+                dist = pkg_resources.get_distribution(name)
+                with indent_log():
+                    latest = highest_version(hit['versions'])
+                    if dist.version == latest:
+                        logger.info('INSTALLED: %s (latest)', dist.version)
+                    else:
+                        logger.info('INSTALLED: %s', dist.version)
+                        logger.info('LATEST:    %s', latest)
+        except UnicodeEncodeError:
+            pass
+
+
+def highest_version(versions):
+    return max(versions, key=parse_version)
diff --git a/vendor/pip-9.0.3/pip/commands/show.py b/vendor/pip-9.0.3/pip/commands/show.py
new file mode 100644
index 0000000000000000000000000000000000000000..111c16d1a88dc293a33d3df2343f4d4d7b1384b7
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/commands/show.py
@@ -0,0 +1,154 @@
+from __future__ import absolute_import
+
+from email.parser import FeedParser
+import logging
+import os
+
+from pip.basecommand import Command
+from pip.status_codes import SUCCESS, ERROR
+from pip._vendor import pkg_resources
+from pip._vendor.packaging.utils import canonicalize_name
+
+
+logger = logging.getLogger(__name__)
+
+
+class ShowCommand(Command):
+    """Show information about one or more installed packages."""
+    name = 'show'
+    usage = """
+      %prog [options] <package> ..."""
+    summary = 'Show information about installed packages.'
+
+    def __init__(self, *args, **kw):
+        super(ShowCommand, self).__init__(*args, **kw)
+        self.cmd_opts.add_option(
+            '-f', '--files',
+            dest='files',
+            action='store_true',
+            default=False,
+            help='Show the full list of installed files for each package.')
+
+        self.parser.insert_option_group(0, self.cmd_opts)
+
+    def run(self, options, args):
+        if not args:
+            logger.warning('ERROR: Please provide a package name or names.')
+            return ERROR
+        query = args
+
+        results = search_packages_info(query)
+        if not print_results(
+                results, list_files=options.files, verbose=options.verbose):
+            return ERROR
+        return SUCCESS
+
+
+def search_packages_info(query):
+    """
+    Gather details from installed distributions. Print distribution name,
+    version, location, and installed files. Installed files requires a
+    pip generated 'installed-files.txt' in the distributions '.egg-info'
+    directory.
+    """
+    installed = {}
+    for p in pkg_resources.working_set:
+        installed[canonicalize_name(p.project_name)] = p
+
+    query_names = [canonicalize_name(name) for name in query]
+
+    for dist in [installed[pkg] for pkg in query_names if pkg in installed]:
+        package = {
+            'name': dist.project_name,
+            'version': dist.version,
+            'location': dist.location,
+            'requires': [dep.project_name for dep in dist.requires()],
+        }
+        file_list = None
+        metadata = None
+        if isinstance(dist, pkg_resources.DistInfoDistribution):
+            # RECORDs should be part of .dist-info metadatas
+            if dist.has_metadata('RECORD'):
+                lines = dist.get_metadata_lines('RECORD')
+                paths = [l.split(',')[0] for l in lines]
+                paths = [os.path.join(dist.location, p) for p in paths]
+                file_list = [os.path.relpath(p, dist.location) for p in paths]
+
+            if dist.has_metadata('METADATA'):
+                metadata = dist.get_metadata('METADATA')
+        else:
+            # Otherwise use pip's log for .egg-info's
+            if dist.has_metadata('installed-files.txt'):
+                paths = dist.get_metadata_lines('installed-files.txt')
+                paths = [os.path.join(dist.egg_info, p) for p in paths]
+                file_list = [os.path.relpath(p, dist.location) for p in paths]
+
+            if dist.has_metadata('PKG-INFO'):
+                metadata = dist.get_metadata('PKG-INFO')
+
+        if dist.has_metadata('entry_points.txt'):
+            entry_points = dist.get_metadata_lines('entry_points.txt')
+            package['entry_points'] = entry_points
+
+        if dist.has_metadata('INSTALLER'):
+            for line in dist.get_metadata_lines('INSTALLER'):
+                if line.strip():
+                    package['installer'] = line.strip()
+                    break
+
+        # @todo: Should pkg_resources.Distribution have a
+        # `get_pkg_info` method?
+        feed_parser = FeedParser()
+        feed_parser.feed(metadata)
+        pkg_info_dict = feed_parser.close()
+        for key in ('metadata-version', 'summary',
+                    'home-page', 'author', 'author-email', 'license'):
+            package[key] = pkg_info_dict.get(key)
+
+        # It looks like FeedParser cannot deal with repeated headers
+        classifiers = []
+        for line in metadata.splitlines():
+            if line.startswith('Classifier: '):
+                classifiers.append(line[len('Classifier: '):])
+        package['classifiers'] = classifiers
+
+        if file_list:
+            package['files'] = sorted(file_list)
+        yield package
+
+
+def print_results(distributions, list_files=False, verbose=False):
+    """
+    Print the informations from installed distributions found.
+    """
+    results_printed = False
+    for i, dist in enumerate(distributions):
+        results_printed = True
+        if i > 0:
+            logger.info("---")
+        logger.info("Name: %s", dist.get('name', ''))
+        logger.info("Version: %s", dist.get('version', ''))
+        logger.info("Summary: %s", dist.get('summary', ''))
+        logger.info("Home-page: %s", dist.get('home-page', ''))
+        logger.info("Author: %s", dist.get('author', ''))
+        logger.info("Author-email: %s", dist.get('author-email', ''))
+        logger.info("License: %s", dist.get('license', ''))
+        logger.info("Location: %s", dist.get('location', ''))
+        logger.info("Requires: %s", ', '.join(dist.get('requires', [])))
+        if verbose:
+            logger.info("Metadata-Version: %s",
+                        dist.get('metadata-version', ''))
+            logger.info("Installer: %s", dist.get('installer', ''))
+            logger.info("Classifiers:")
+            for classifier in dist.get('classifiers', []):
+                logger.info("  %s", classifier)
+            logger.info("Entry-points:")
+            for entry in dist.get('entry_points', []):
+                logger.info("  %s", entry.strip())
+        if list_files:
+            logger.info("Files:")
+            for line in dist.get('files', []):
+                logger.info("  %s", line.strip())
+            if "files" not in dist:
+                logger.info("Cannot locate installed-files.txt")
+    return results_printed
diff --git a/vendor/pip-9.0.3/pip/commands/uninstall.py b/vendor/pip-9.0.3/pip/commands/uninstall.py
new file mode 100644
index 0000000000000000000000000000000000000000..8ba1a7c65d92c70f65c48783a00ce2d48e2983af
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/commands/uninstall.py
@@ -0,0 +1,76 @@
+from __future__ import absolute_import
+
+import pip
+from pip.wheel import WheelCache
+from pip.req import InstallRequirement, RequirementSet, parse_requirements
+from pip.basecommand import Command
+from pip.exceptions import InstallationError
+
+
+class UninstallCommand(Command):
+    """
+    Uninstall packages.
+
+    pip is able to uninstall most installed packages. Known exceptions are:
+
+    - Pure distutils packages installed with ``python setup.py install``, which
+      leave behind no metadata to determine what files were installed.
+    - Script wrappers installed by ``python setup.py develop``.
+    """
+    name = 'uninstall'
+    usage = """
+      %prog [options] <package> ...
+      %prog [options] -r <requirements file> ..."""
+    summary = 'Uninstall packages.'
+
+    def __init__(self, *args, **kw):
+        super(UninstallCommand, self).__init__(*args, **kw)
+        self.cmd_opts.add_option(
+            '-r', '--requirement',
+            dest='requirements',
+            action='append',
+            default=[],
+            metavar='file',
+            help='Uninstall all the packages listed in the given requirements '
+                 'file.  This option can be used multiple times.',
+        )
+        self.cmd_opts.add_option(
+            '-y', '--yes',
+            dest='yes',
+            action='store_true',
+            help="Don't ask for confirmation of uninstall deletions.")
+
+        self.parser.insert_option_group(0, self.cmd_opts)
+
+    def run(self, options, args):
+        with self._build_session(options) as session:
+            format_control = pip.index.FormatControl(set(), set())
+            wheel_cache = WheelCache(options.cache_dir, format_control)
+            requirement_set = RequirementSet(
+                build_dir=None,
+                src_dir=None,
+                download_dir=None,
+                isolated=options.isolated_mode,
+                session=session,
+                wheel_cache=wheel_cache,
+            )
+            for name in args:
+                requirement_set.add_requirement(
+                    InstallRequirement.from_line(
+                        name, isolated=options.isolated_mode,
+                        wheel_cache=wheel_cache
+                    )
+                )
+            for filename in options.requirements:
+                for req in parse_requirements(
+                        filename,
+                        options=options,
+                        session=session,
+                        wheel_cache=wheel_cache):
+                    requirement_set.add_requirement(req)
+            if not requirement_set.has_requirements:
+                raise InstallationError(
+                    'You must give at least one requirement to %(name)s (see '
+                    '"pip help %(name)s")' % dict(name=self.name)
+                )
+            requirement_set.uninstall(auto_confirm=options.yes)
diff --git a/vendor/pip-9.0.3/pip/commands/wheel.py b/vendor/pip-9.0.3/pip/commands/wheel.py
new file mode 100644
index 0000000000000000000000000000000000000000..70e95eb8e0bf997b86cb433ef97c9ddf5b00d337
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/commands/wheel.py
@@ -0,0 +1,208 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import
+
+import logging
+import os
+import warnings
+
+from pip.basecommand import RequirementCommand
+from pip.exceptions import CommandError, PreviousBuildDirError
+from pip.req import RequirementSet
+from pip.utils import import_or_raise
+from pip.utils.build import BuildDirectory
+from pip.utils.deprecation import RemovedInPip10Warning
+from pip.wheel import WheelCache, WheelBuilder
+from pip import cmdoptions
+
+
+logger = logging.getLogger(__name__)
+
+
+class WheelCommand(RequirementCommand):
+    """
+    Build Wheel archives for your requirements and dependencies.
+
+    Wheel is a built-package format, and offers the advantage of not
+    recompiling your software during every install. For more details, see the
+    wheel docs: https://wheel.readthedocs.io/en/latest/
+
+    Requirements: setuptools>=0.8, and wheel.
+
+    'pip wheel' uses the bdist_wheel setuptools extension from the wheel
+    package to build individual wheels.
+
+    """
+
+    name = 'wheel'
+    usage = """
+      %prog [options] <requirement specifier> ...
+      %prog [options] -r <requirements file> ...
+      %prog [options] [-e] <vcs project url> ...
+      %prog [options] [-e] <local project path> ...
+      %prog [options] <archive url/path> ..."""
+
+    summary = 'Build wheels from your requirements.'
+
+    def __init__(self, *args, **kw):
+        super(WheelCommand, self).__init__(*args, **kw)
+
+        cmd_opts = self.cmd_opts
+
+        cmd_opts.add_option(
+            '-w', '--wheel-dir',
+            dest='wheel_dir',
+            metavar='dir',
+            default=os.curdir,
+            help=("Build wheels into <dir>, where the default is the "
+                  "current working directory."),
+        )
+        cmd_opts.add_option(cmdoptions.use_wheel())
+        cmd_opts.add_option(cmdoptions.no_use_wheel())
+        cmd_opts.add_option(cmdoptions.no_binary())
+        cmd_opts.add_option(cmdoptions.only_binary())
+        cmd_opts.add_option(
+            '--build-option',
+            dest='build_options',
+            metavar='options',
+            action='append',
+            help="Extra arguments to be supplied to 'setup.py bdist_wheel'.")
+        cmd_opts.add_option(cmdoptions.constraints())
+        cmd_opts.add_option(cmdoptions.editable())
+        cmd_opts.add_option(cmdoptions.requirements())
+        cmd_opts.add_option(cmdoptions.src())
+        cmd_opts.add_option(cmdoptions.ignore_requires_python())
+        cmd_opts.add_option(cmdoptions.no_deps())
+        cmd_opts.add_option(cmdoptions.build_dir())
+
+        cmd_opts.add_option(
+            '--global-option',
+            dest='global_options',
+            action='append',
+            metavar='options',
+            help="Extra global options to be supplied to the setup.py "
+            "call before the 'bdist_wheel' command.")
+
+        cmd_opts.add_option(
+            '--pre',
+            action='store_true',
+            default=False,
+            help=("Include pre-release and development versions. By default, "
+                  "pip only finds stable versions."),
+        )
+
+        cmd_opts.add_option(cmdoptions.no_clean())
+        cmd_opts.add_option(cmdoptions.require_hashes())
+
+        index_opts = cmdoptions.make_option_group(
+            cmdoptions.index_group,
+            self.parser,
+        )
+
+        self.parser.insert_option_group(0, index_opts)
+        self.parser.insert_option_group(0, cmd_opts)
+
+    def check_required_packages(self):
+        import_or_raise(
+            'wheel.bdist_wheel',
+            CommandError,
+            "'pip wheel' requires the 'wheel' package. To fix this, run: "
+            "pip install wheel"
+        )
+        pkg_resources = import_or_raise(
+            'pkg_resources',
+            CommandError,
+            "'pip wheel' requires setuptools >= 0.8 for dist-info support."
+            " To fix this, run: pip install --upgrade setuptools"
+        )
+        if not hasattr(pkg_resources, 'DistInfoDistribution'):
+            raise CommandError(
+                "'pip wheel' requires setuptools >= 0.8 for dist-info "
+                "support. To fix this, run: pip install --upgrade "
+                "setuptools"
+            )
+
+    def run(self, options, args):
+        self.check_required_packages()
+        cmdoptions.resolve_wheel_no_use_binary(options)
+        cmdoptions.check_install_build_global(options)
+
+        if options.allow_external:
+            warnings.warn(
+                "--allow-external has been deprecated and will be removed in "
+                "the future. Due to changes in the repository protocol, it no "
+                "longer has any effect.",
+                RemovedInPip10Warning,
+            )
+
+        if options.allow_all_external:
+            warnings.warn(
+                "--allow-all-external has been deprecated and will be removed "
+                "in the future. Due to changes in the repository protocol, it "
+                "no longer has any effect.",
+                RemovedInPip10Warning,
+            )
+
+        if options.allow_unverified:
+            warnings.warn(
+                "--allow-unverified has been deprecated and will be removed "
+                "in the future. Due to changes in the repository protocol, it "
+                "no longer has any effect.",
+                RemovedInPip10Warning,
+            )
+
+        index_urls = [options.index_url] + options.extra_index_urls
+        if options.no_index:
+            logger.debug('Ignoring indexes: %s', ','.join(index_urls))
+            index_urls = []
+
+        if options.build_dir:
+            options.build_dir = os.path.abspath(options.build_dir)
+
+        options.src_dir = os.path.abspath(options.src_dir)
+
+        with self._build_session(options) as session:
+            finder = self._build_package_finder(options, session)
+            build_delete = (not (options.no_clean or options.build_dir))
+            wheel_cache = WheelCache(options.cache_dir, options.format_control)
+            with BuildDirectory(options.build_dir,
+                                delete=build_delete) as build_dir:
+                requirement_set = RequirementSet(
+                    build_dir=build_dir,
+                    src_dir=options.src_dir,
+                    download_dir=None,
+                    ignore_dependencies=options.ignore_dependencies,
+                    ignore_installed=True,
+                    ignore_requires_python=options.ignore_requires_python,
+                    isolated=options.isolated_mode,
+                    session=session,
+                    wheel_cache=wheel_cache,
+                    wheel_download_dir=options.wheel_dir,
+                    require_hashes=options.require_hashes
+                )
+
+                self.populate_requirement_set(
+                    requirement_set, args, options, finder, session, self.name,
+                    wheel_cache
+                )
+
+                if not requirement_set.has_requirements:
+                    return
+
+                try:
+                    # build wheels
+                    wb = WheelBuilder(
+                        requirement_set,
+                        finder,
+                        build_options=options.build_options or [],
+                        global_options=options.global_options or [],
+                    )
+                    if not wb.build():
+                        raise CommandError(
+                            "Failed to build one or more wheels"
+                        )
+                except PreviousBuildDirError:
+                    options.no_clean = True
+                    raise
+                finally:
+                    if not options.no_clean:
+                        requirement_set.cleanup_files()
diff --git a/vendor/pip-9.0.3/pip/compat/__init__.py b/vendor/pip-9.0.3/pip/compat/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..099672cd1ad42d6b54c4343a78b88b2d1fcfc85c
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/compat/__init__.py
@@ -0,0 +1,164 @@
+"""Stuff that differs in different Python versions and platform
+distributions."""
+from __future__ import absolute_import, division
+
+import os
+import sys
+
+from pip._vendor.six import text_type
+
+try:
+    from logging.config import dictConfig as logging_dictConfig
+except ImportError:
+    from pip.compat.dictconfig import dictConfig as logging_dictConfig
+
+try:
+    from collections import OrderedDict
+except ImportError:
+    from pip._vendor.ordereddict import OrderedDict
+
+try:
+    import ipaddress
+except ImportError:
+    try:
+        from pip._vendor import ipaddress
+    except ImportError:
+        import ipaddr as ipaddress
+        ipaddress.ip_address = ipaddress.IPAddress
+        ipaddress.ip_network = ipaddress.IPNetwork
+
+
+try:
+    import sysconfig
+
+    def get_stdlib():
+        paths = [
+            sysconfig.get_path("stdlib"),
+            sysconfig.get_path("platstdlib"),
+        ]
+        return set(filter(bool, paths))
+except ImportError:
+    from distutils import sysconfig
+
+    def get_stdlib():
+        paths = [
+            sysconfig.get_python_lib(standard_lib=True),
+            sysconfig.get_python_lib(standard_lib=True, plat_specific=True),
+        ]
+        return set(filter(bool, paths))
+
+
+__all__ = [
+    "logging_dictConfig", "ipaddress", "uses_pycache", "console_to_str",
+    "native_str", "get_path_uid", "stdlib_pkgs", "WINDOWS", "samefile",
+    "OrderedDict",
+]
+
+
+if sys.version_info >= (3, 4):
+    uses_pycache = True
+    from importlib.util import cache_from_source
+else:
+    import imp
+    uses_pycache = hasattr(imp, 'cache_from_source')
+    if uses_pycache:
+        cache_from_source = imp.cache_from_source
+    else:
+        cache_from_source = None
+
+
+if sys.version_info >= (3,):
+    def console_to_str(s):
+        try:
+            return s.decode(sys.__stdout__.encoding)
+        except UnicodeDecodeError:
+            return s.decode('utf_8')
+
+    def native_str(s, replace=False):
+        if isinstance(s, bytes):
+            return s.decode('utf-8', 'replace' if replace else 'strict')
+        return s
+
+else:
+    def console_to_str(s):
+        return s
+
+    def native_str(s, replace=False):
+        # Replace is ignored -- unicode to UTF-8 can't fail
+        if isinstance(s, text_type):
+            return s.encode('utf-8')
+        return s
+
+
+def total_seconds(td):
+    if hasattr(td, "total_seconds"):
+        return td.total_seconds()
+    else:
+        val = td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 ** 6
+        return val / 10 ** 6
+
+
+def get_path_uid(path):
+    """
+    Return path's uid.
+
+    Does not follow symlinks:
+        https://github.com/pypa/pip/pull/935#discussion_r5307003
+
+    Placed this function in compat due to differences on AIX and
+    Jython, that should eventually go away.
+
+    :raises OSError: When path is a symlink or can't be read.
+    """
+    if hasattr(os, 'O_NOFOLLOW'):
+        fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW)
+        file_uid = os.fstat(fd).st_uid
+        os.close(fd)
+    else:  # AIX and Jython
+        # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW
+        if not os.path.islink(path):
+            # older versions of Jython don't have `os.fstat`
+            file_uid = os.stat(path).st_uid
+        else:
+            # raise OSError for parity with os.O_NOFOLLOW above
+            raise OSError(
+                "%s is a symlink; Will not return uid for symlinks" % path
+            )
+    return file_uid
+
+
+def expanduser(path):
+    """
+    Expand ~ and ~user constructions.
+
+    Includes a workaround for http://bugs.python.org/issue14768
+    """
+    expanded = os.path.expanduser(path)
+    if path.startswith('~/') and expanded.startswith('//'):
+        expanded = expanded[1:]
+    return expanded
+
+
+# packages in the stdlib that may have installation metadata, but should not be
+# considered 'installed'.  this theoretically could be determined based on
+# dist.location (py27:`sysconfig.get_paths()['stdlib']`,
+# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may
+# make this ineffective, so hard-coding
+stdlib_pkgs = ('python', 'wsgiref')
+if sys.version_info >= (2, 7):
+    stdlib_pkgs += ('argparse',)
+
+
+# windows detection, covers cpython and ironpython
+WINDOWS = (sys.platform.startswith("win") or
+           (sys.platform == 'cli' and os.name == 'nt'))
+
+
+def samefile(file1, file2):
+    """Provide an alternative for os.path.samefile on Windows/Python2"""
+    if hasattr(os.path, 'samefile'):
+        return os.path.samefile(file1, file2)
+    else:
+        path1 = os.path.normcase(os.path.abspath(file1))
+        path2 = os.path.normcase(os.path.abspath(file2))
+        return path1 == path2
diff --git a/vendor/pip-9.0.3/pip/compat/dictconfig.py b/vendor/pip-9.0.3/pip/compat/dictconfig.py
new file mode 100644
index 0000000000000000000000000000000000000000..ec684aac2033a5d9897e5a9330d2090372ddf298
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/compat/dictconfig.py
@@ -0,0 +1,565 @@
+# This is a copy of the Python logging.config.dictconfig module,
+# reproduced with permission. It is provided here for backwards
+# compatibility for Python versions prior to 2.7.
+#
+# Copyright 2009-2010 by Vinay Sajip. All Rights Reserved.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted,
+# provided that the above copyright notice appear in all copies and that
+# both that copyright notice and this permission notice appear in
+# supporting documentation, and that the name of Vinay Sajip
+# not be used in advertising or publicity pertaining to distribution
+# of the software without specific, written prior permission.
+# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
+# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+from __future__ import absolute_import
+
+import logging.handlers
+import re
+import sys
+import types
+
+from pip._vendor import six
+
+# flake8: noqa
+
+IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I)
+
+
+def valid_ident(s):
+    m = IDENTIFIER.match(s)
+    if not m:
+        raise ValueError('Not a valid Python identifier: %r' % s)
+    return True
+
+#
+# This function is defined in logging only in recent versions of Python
+#
+try:
+    from logging import _checkLevel
+except ImportError:
+    def _checkLevel(level):
+        if isinstance(level, int):
+            rv = level
+        elif str(level) == level:
+            if level not in logging._levelNames:
+                raise ValueError('Unknown level: %r' % level)
+            rv = logging._levelNames[level]
+        else:
+            raise TypeError('Level not an integer or a '
+                            'valid string: %r' % level)
+        return rv
+
+# The ConvertingXXX classes are wrappers around standard Python containers,
+# and they serve to convert any suitable values in the container. The
+# conversion converts base dicts, lists and tuples to their wrapped
+# equivalents, whereas strings which match a conversion format are converted
+# appropriately.
+#
+# Each wrapper should have a configurator attribute holding the actual
+# configurator to use for conversion.
+
+
+class ConvertingDict(dict):
+    """A converting dictionary wrapper."""
+
+    def __getitem__(self, key):
+        value = dict.__getitem__(self, key)
+        result = self.configurator.convert(value)
+        # If the converted value is different, save for next time
+        if value is not result:
+            self[key] = result
+            if type(result) in (ConvertingDict, ConvertingList,
+                                ConvertingTuple):
+                result.parent = self
+                result.key = key
+        return result
+
+    def get(self, key, default=None):
+        value = dict.get(self, key, default)
+        result = self.configurator.convert(value)
+        # If the converted value is different, save for next time
+        if value is not result:
+            self[key] = result
+            if type(result) in (ConvertingDict, ConvertingList,
+                                ConvertingTuple):
+                result.parent = self
+                result.key = key
+        return result
+
+    def pop(self, key, default=None):
+        value = dict.pop(self, key, default)
+        result = self.configurator.convert(value)
+        if value is not result:
+            if type(result) in (ConvertingDict, ConvertingList,
+                                ConvertingTuple):
+                result.parent = self
+                result.key = key
+        return result
+
+
+class ConvertingList(list):
+    """A converting list wrapper."""
+    def __getitem__(self, key):
+        value = list.__getitem__(self, key)
+        result = self.configurator.convert(value)
+        # If the converted value is different, save for next time
+        if value is not result:
+            self[key] = result
+            if type(result) in (ConvertingDict, ConvertingList,
+                                ConvertingTuple):
+                result.parent = self
+                result.key = key
+        return result
+
+    def pop(self, idx=-1):
+        value = list.pop(self, idx)
+        result = self.configurator.convert(value)
+        if value is not result:
+            if type(result) in (ConvertingDict, ConvertingList,
+                                ConvertingTuple):
+                result.parent = self
+        return result
+
+
+class ConvertingTuple(tuple):
+    """A converting tuple wrapper."""
+    def __getitem__(self, key):
+        value = tuple.__getitem__(self, key)
+        result = self.configurator.convert(value)
+        if value is not result:
+            if type(result) in (ConvertingDict, ConvertingList,
+                                ConvertingTuple):
+                result.parent = self
+                result.key = key
+        return result
+
+
+class BaseConfigurator(object):
+    """
+    The configurator base class which defines some useful defaults.
+    """
+
+    CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$')
+
+    WORD_PATTERN = re.compile(r'^\s*(\w+)\s*')
+    DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*')
+    INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*')
+    DIGIT_PATTERN = re.compile(r'^\d+$')
+
+    value_converters = {
+        'ext' : 'ext_convert',
+        'cfg' : 'cfg_convert',
+    }
+
+    # We might want to use a different one, e.g. importlib
+    importer = __import__
+
+    def __init__(self, config):
+        self.config = ConvertingDict(config)
+        self.config.configurator = self
+
+    def resolve(self, s):
+        """
+        Resolve strings to objects using standard import and attribute
+        syntax.
+        """
+        name = s.split('.')
+        used = name.pop(0)
+        try:
+            found = self.importer(used)
+            for frag in name:
+                used += '.' + frag
+                try:
+                    found = getattr(found, frag)
+                except AttributeError:
+                    self.importer(used)
+                    found = getattr(found, frag)
+            return found
+        except ImportError:
+            e, tb = sys.exc_info()[1:]
+            v = ValueError('Cannot resolve %r: %s' % (s, e))
+            v.__cause__, v.__traceback__ = e, tb
+            raise v
+
+    def ext_convert(self, value):
+        """Default converter for the ext:// protocol."""
+        return self.resolve(value)
+
+    def cfg_convert(self, value):
+        """Default converter for the cfg:// protocol."""
+        rest = value
+        m = self.WORD_PATTERN.match(rest)
+        if m is None:
+            raise ValueError("Unable to convert %r" % value)
+        else:
+            rest = rest[m.end():]
+            d = self.config[m.groups()[0]]
+            # print d, rest
+            while rest:
+                m = self.DOT_PATTERN.match(rest)
+                if m:
+                    d = d[m.groups()[0]]
+                else:
+                    m = self.INDEX_PATTERN.match(rest)
+                    if m:
+                        idx = m.groups()[0]
+                        if not self.DIGIT_PATTERN.match(idx):
+                            d = d[idx]
+                        else:
+                            try:
+                                n = int(idx)  # try as number first (most likely)
+                                d = d[n]
+                            except TypeError:
+                                d = d[idx]
+                if m:
+                    rest = rest[m.end():]
+                else:
+                    raise ValueError('Unable to convert '
+                                     '%r at %r' % (value, rest))
+        # rest should be empty
+        return d
+
+    def convert(self, value):
+        """
+        Convert values to an appropriate type. dicts, lists and tuples are
+        replaced by their converting alternatives. Strings are checked to
+        see if they have a conversion format and are converted if they do.
+        """
+        if not isinstance(value, ConvertingDict) and isinstance(value, dict):
+            value = ConvertingDict(value)
+            value.configurator = self
+        elif not isinstance(value, ConvertingList) and isinstance(value, list):
+            value = ConvertingList(value)
+            value.configurator = self
+        elif not isinstance(value, ConvertingTuple) and\
+                 isinstance(value, tuple):
+            value = ConvertingTuple(value)
+            value.configurator = self
+        elif isinstance(value, six.string_types):  # str for py3k
+            m = self.CONVERT_PATTERN.match(value)
+            if m:
+                d = m.groupdict()
+                prefix = d['prefix']
+                converter = self.value_converters.get(prefix, None)
+                if converter:
+                    suffix = d['suffix']
+                    converter = getattr(self, converter)
+                    value = converter(suffix)
+        return value
+
+    def configure_custom(self, config):
+        """Configure an object with a user-supplied factory."""
+        c = config.pop('()')
+        if not hasattr(c, '__call__') and hasattr(types, 'ClassType') and type(c) != types.ClassType:
+            c = self.resolve(c)
+        props = config.pop('.', None)
+        # Check for valid identifiers
+        kwargs = dict((k, config[k]) for k in config if valid_ident(k))
+        result = c(**kwargs)
+        if props:
+            for name, value in props.items():
+                setattr(result, name, value)
+        return result
+
+    def as_tuple(self, value):
+        """Utility function which converts lists to tuples."""
+        if isinstance(value, list):
+            value = tuple(value)
+        return value
+
+
+class DictConfigurator(BaseConfigurator):
+    """
+    Configure logging using a dictionary-like object to describe the
+    configuration.
+    """
+
+    def configure(self):
+        """Do the configuration."""
+
+        config = self.config
+        if 'version' not in config:
+            raise ValueError("dictionary doesn't specify a version")
+        if config['version'] != 1:
+            raise ValueError("Unsupported version: %s" % config['version'])
+        incremental = config.pop('incremental', False)
+        EMPTY_DICT = {}
+        logging._acquireLock()
+        try:
+            if incremental:
+                handlers = config.get('handlers', EMPTY_DICT)
+                # incremental handler config only if handler name
+                # ties in to logging._handlers (Python 2.7)
+                if sys.version_info[:2] == (2, 7):
+                    for name in handlers:
+                        if name not in logging._handlers:
+                            raise ValueError('No handler found with '
+                                             'name %r'  % name)
+                        else:
+                            try:
+                                handler = logging._handlers[name]
+                                handler_config = handlers[name]
+                                level = handler_config.get('level', None)
+                                if level:
+                                    handler.setLevel(_checkLevel(level))
+                            except StandardError as e:
+                                raise ValueError('Unable to configure handler '
+                                                 '%r: %s' % (name, e))
+                loggers = config.get('loggers', EMPTY_DICT)
+                for name in loggers:
+                    try:
+                        self.configure_logger(name, loggers[name], True)
+                    except StandardError as e:
+                        raise ValueError('Unable to configure logger '
+                                         '%r: %s' % (name, e))
+                root = config.get('root', None)
+                if root:
+                    try:
+                        self.configure_root(root, True)
+                    except StandardError as e:
+                        raise ValueError('Unable to configure root '
+                                         'logger: %s' % e)
+            else:
+                disable_existing = config.pop('disable_existing_loggers', True)
+
+                logging._handlers.clear()
+                del logging._handlerList[:]
+
+                # Do formatters first - they don't refer to anything else
+                formatters = config.get('formatters', EMPTY_DICT)
+                for name in formatters:
+                    try:
+                        formatters[name] = self.configure_formatter(
+                                                            formatters[name])
+                    except StandardError as e:
+                        raise ValueError('Unable to configure '
+                                         'formatter %r: %s' % (name, e))
+                # Next, do filters - they don't refer to anything else, either
+                filters = config.get('filters', EMPTY_DICT)
+                for name in filters:
+                    try:
+                        filters[name] = self.configure_filter(filters[name])
+                    except StandardError as e:
+                        raise ValueError('Unable to configure '
+                                         'filter %r: %s' % (name, e))
+
+                # Next, do handlers - they refer to formatters and filters
+                # As handlers can refer to other handlers, sort the keys
+                # to allow a deterministic order of configuration
+                handlers = config.get('handlers', EMPTY_DICT)
+                for name in sorted(handlers):
+                    try:
+                        handler = self.configure_handler(handlers[name])
+                        handler.name = name
+                        handlers[name] = handler
+                    except StandardError as e:
+                        raise ValueError('Unable to configure handler '
+                                         '%r: %s' % (name, e))
+                # Next, do loggers - they refer to handlers and filters
+
+                # we don't want to lose the existing loggers,
+                # since other threads may have pointers to them.
+                # existing is set to contain all existing loggers,
+                # and as we go through the new configuration we
+                # remove any which are configured. At the end,
+                # what's left in existing is the set of loggers
+                # which were in the previous configuration but
+                # which are not in the new configuration.
+                root = logging.root
+                existing = list(root.manager.loggerDict)
+                # The list needs to be sorted so that we can
+                # avoid disabling child loggers of explicitly
+                # named loggers. With a sorted list it is easier
+                # to find the child loggers.
+                existing.sort()
+                # We'll keep the list of existing loggers
+                # which are children of named loggers here...
+                child_loggers = []
+                # now set up the new ones...
+                loggers = config.get('loggers', EMPTY_DICT)
+                for name in loggers:
+                    if name in existing:
+                        i = existing.index(name)
+                        prefixed = name + "."
+                        pflen = len(prefixed)
+                        num_existing = len(existing)
+                        i = i + 1  # look at the entry after name
+                        while (i < num_existing) and\
+                              (existing[i][:pflen] == prefixed):
+                            child_loggers.append(existing[i])
+                            i = i + 1
+                        existing.remove(name)
+                    try:
+                        self.configure_logger(name, loggers[name])
+                    except StandardError as e:
+                        raise ValueError('Unable to configure logger '
+                                         '%r: %s' % (name, e))
+
+                # Disable any old loggers. There's no point deleting
+                # them as other threads may continue to hold references
+                # and by disabling them, you stop them doing any logging.
+                # However, don't disable children of named loggers, as that's
+                # probably not what was intended by the user.
+                for log in existing:
+                    logger = root.manager.loggerDict[log]
+                    if log in child_loggers:
+                        logger.level = logging.NOTSET
+                        logger.handlers = []
+                        logger.propagate = True
+                    elif disable_existing:
+                        logger.disabled = True
+
+                # And finally, do the root logger
+                root = config.get('root', None)
+                if root:
+                    try:
+                        self.configure_root(root)
+                    except StandardError as e:
+                        raise ValueError('Unable to configure root '
+                                         'logger: %s' % e)
+        finally:
+            logging._releaseLock()
+
+    def configure_formatter(self, config):
+        """Configure a formatter from a dictionary."""
+        if '()' in config:
+            factory = config['()']  # for use in exception handler
+            try:
+                result = self.configure_custom(config)
+            except TypeError as te:
+                if "'format'" not in str(te):
+                    raise
+                # Name of parameter changed from fmt to format.
+                # Retry with old name.
+                # This is so that code can be used with older Python versions
+                #(e.g. by Django)
+                config['fmt'] = config.pop('format')
+                config['()'] = factory
+                result = self.configure_custom(config)
+        else:
+            fmt = config.get('format', None)
+            dfmt = config.get('datefmt', None)
+            result = logging.Formatter(fmt, dfmt)
+        return result
+
+    def configure_filter(self, config):
+        """Configure a filter from a dictionary."""
+        if '()' in config:
+            result = self.configure_custom(config)
+        else:
+            name = config.get('name', '')
+            result = logging.Filter(name)
+        return result
+
+    def add_filters(self, filterer, filters):
+        """Add filters to a filterer from a list of names."""
+        for f in filters:
+            try:
+                filterer.addFilter(self.config['filters'][f])
+            except StandardError as e:
+                raise ValueError('Unable to add filter %r: %s' % (f, e))
+
+    def configure_handler(self, config):
+        """Configure a handler from a dictionary."""
+        formatter = config.pop('formatter', None)
+        if formatter:
+            try:
+                formatter = self.config['formatters'][formatter]
+            except StandardError as e:
+                raise ValueError('Unable to set formatter '
+                                 '%r: %s' % (formatter, e))
+        level = config.pop('level', None)
+        filters = config.pop('filters', None)
+        if '()' in config:
+            c = config.pop('()')
+            if not hasattr(c, '__call__') and hasattr(types, 'ClassType') and type(c) != types.ClassType:
+                c = self.resolve(c)
+            factory = c
+        else:
+            klass = self.resolve(config.pop('class'))
+            # Special case for handler which refers to another handler
+            if issubclass(klass, logging.handlers.MemoryHandler) and\
+                'target' in config:
+                try:
+                    config['target'] = self.config['handlers'][config['target']]
+                except StandardError as e:
+                    raise ValueError('Unable to set target handler '
+                                     '%r: %s' % (config['target'], e))
+            elif issubclass(klass, logging.handlers.SMTPHandler) and\
+                'mailhost' in config:
+                config['mailhost'] = self.as_tuple(config['mailhost'])
+            elif issubclass(klass, logging.handlers.SysLogHandler) and\
+                'address' in config:
+                config['address'] = self.as_tuple(config['address'])
+            factory = klass
+        kwargs = dict((k, config[k]) for k in config if valid_ident(k))
+        try:
+            result = factory(**kwargs)
+        except TypeError as te:
+            if "'stream'" not in str(te):
+                raise
+            # The argument name changed from strm to stream
+            # Retry with old name.
+            # This is so that code can be used with older Python versions
+            #(e.g. by Django)
+            kwargs['strm'] = kwargs.pop('stream')
+            result = factory(**kwargs)
+        if formatter:
+            result.setFormatter(formatter)
+        if level is not None:
+            result.setLevel(_checkLevel(level))
+        if filters:
+            self.add_filters(result, filters)
+        return result
+
+    def add_handlers(self, logger, handlers):
+        """Add handlers to a logger from a list of names."""
+        for h in handlers:
+            try:
+                logger.addHandler(self.config['handlers'][h])
+            except StandardError as e:
+                raise ValueError('Unable to add handler %r: %s' % (h, e))
+
+    def common_logger_config(self, logger, config, incremental=False):
+        """
+        Perform configuration which is common to root and non-root loggers.
+        """
+        level = config.get('level', None)
+        if level is not None:
+            logger.setLevel(_checkLevel(level))
+        if not incremental:
+            # Remove any existing handlers
+            for h in logger.handlers[:]:
+                logger.removeHandler(h)
+            handlers = config.get('handlers', None)
+            if handlers:
+                self.add_handlers(logger, handlers)
+            filters = config.get('filters', None)
+            if filters:
+                self.add_filters(logger, filters)
+
+    def configure_logger(self, name, config, incremental=False):
+        """Configure a non-root logger from a dictionary."""
+        logger = logging.getLogger(name)
+        self.common_logger_config(logger, config, incremental)
+        propagate = config.get('propagate', None)
+        if propagate is not None:
+            logger.propagate = propagate
+
+    def configure_root(self, config, incremental=False):
+        """Configure a root logger from a dictionary."""
+        root = logging.getLogger()
+        self.common_logger_config(root, config, incremental)
+
+dictConfigClass = DictConfigurator
+
+
+def dictConfig(config):
+    """Configure logging using a dictionary."""
+    dictConfigClass(config).configure()
diff --git a/vendor/pip-9.0.3/pip/download.py b/vendor/pip-9.0.3/pip/download.py
new file mode 100644
index 0000000000000000000000000000000000000000..039e55aed191a582628db880b0b6f3ea4b30abb7
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/download.py
@@ -0,0 +1,906 @@
+from __future__ import absolute_import
+
+import cgi
+import email.utils
+import getpass
+import json
+import logging
+import mimetypes
+import os
+import platform
+import re
+import shutil
+import sys
+import tempfile
+
+try:
+    import ssl  # noqa
+    HAS_TLS = True
+except ImportError:
+    HAS_TLS = False
+
+from pip._vendor.six.moves.urllib import parse as urllib_parse
+from pip._vendor.six.moves.urllib import request as urllib_request
+
+import pip
+
+from pip.exceptions import InstallationError, HashMismatch
+from pip.models import PyPI
+from pip.utils import (splitext, rmtree, format_size, display_path,
+                       backup_dir, ask_path_exists, unpack_file,
+                       ARCHIVE_EXTENSIONS, consume, call_subprocess)
+from pip.utils.encoding import auto_decode
+from pip.utils.filesystem import check_path_owner
+from pip.utils.logging import indent_log
+from pip.utils.setuptools_build import SETUPTOOLS_SHIM
+from pip.utils.glibc import libc_ver
+from pip.utils.ui import DownloadProgressBar, DownloadProgressSpinner
+from pip.locations import write_delete_marker_file
+from pip.vcs import vcs
+from pip._vendor import requests, six
+from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter
+from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth
+from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response
+from pip._vendor.requests.utils import get_netrc_auth
+from pip._vendor.requests.structures import CaseInsensitiveDict
+from pip._vendor import urllib3
+from pip._vendor.cachecontrol import CacheControlAdapter
+from pip._vendor.cachecontrol.caches import FileCache
+from pip._vendor.lockfile import LockError
+from pip._vendor.six.moves import xmlrpc_client
+
+
+__all__ = ['get_file_content',
+           'is_url', 'url_to_path', 'path_to_url',
+           'is_archive_file', 'unpack_vcs_link',
+           'unpack_file_url', 'is_vcs_url', 'is_file_url',
+           'unpack_http_url', 'unpack_url']
+
+
+logger = logging.getLogger(__name__)
+
+
+def user_agent():
+    """
+    Return a string representing the user agent.
+    """
+    data = {
+        "installer": {"name": "pip", "version": pip.__version__},
+        "python": platform.python_version(),
+        "implementation": {
+            "name": platform.python_implementation(),
+        },
+    }
+
+    if data["implementation"]["name"] == 'CPython':
+        data["implementation"]["version"] = platform.python_version()
+    elif data["implementation"]["name"] == 'PyPy':
+        if sys.pypy_version_info.releaselevel == 'final':
+            pypy_version_info = sys.pypy_version_info[:3]
+        else:
+            pypy_version_info = sys.pypy_version_info
+        data["implementation"]["version"] = ".".join(
+            [str(x) for x in pypy_version_info]
+        )
+    elif data["implementation"]["name"] == 'Jython':
+        # Complete Guess
+        data["implementation"]["version"] = platform.python_version()
+    elif data["implementation"]["name"] == 'IronPython':
+        # Complete Guess
+        data["implementation"]["version"] = platform.python_version()
+
+    if sys.platform.startswith("linux"):
+        from pip._vendor import distro
+        distro_infos = dict(filter(
+            lambda x: x[1],
+            zip(["name", "version", "id"], distro.linux_distribution()),
+        ))
+        libc = dict(filter(
+            lambda x: x[1],
+            zip(["lib", "version"], libc_ver()),
+        ))
+        if libc:
+            distro_infos["libc"] = libc
+        if distro_infos:
+            data["distro"] = distro_infos
+
+    if sys.platform.startswith("darwin") and platform.mac_ver()[0]:
+        data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]}
+
+    if platform.system():
+        data.setdefault("system", {})["name"] = platform.system()
+
+    if platform.release():
+        data.setdefault("system", {})["release"] = platform.release()
+
+    if platform.machine():
+        data["cpu"] = platform.machine()
+
+    # Python 2.6 doesn't have ssl.OPENSSL_VERSION.
+    if HAS_TLS and sys.version_info[:2] > (2, 6):
+        data["openssl_version"] = ssl.OPENSSL_VERSION
+
+    return "{data[installer][name]}/{data[installer][version]} {json}".format(
+        data=data,
+        json=json.dumps(data, separators=(",", ":"), sort_keys=True),
+    )
+
+
+class MultiDomainBasicAuth(AuthBase):
+
+    def __init__(self, prompting=True):
+        self.prompting = prompting
+        self.passwords = {}
+
+    def __call__(self, req):
+        parsed = urllib_parse.urlparse(req.url)
+
+        # Get the netloc without any embedded credentials
+        netloc = parsed.netloc.rsplit("@", 1)[-1]
+
+        # Set the url of the request to the url without any credentials
+        req.url = urllib_parse.urlunparse(parsed[:1] + (netloc,) + parsed[2:])
+
+        # Use any stored credentials that we have for this netloc
+        username, password = self.passwords.get(netloc, (None, None))
+
+        # Extract credentials embedded in the url if we have none stored
+        if username is None:
+            username, password = self.parse_credentials(parsed.netloc)
+
+        # Get creds from netrc if we still don't have them
+        if username is None and password is None:
+            netrc_auth = get_netrc_auth(req.url)
+            username, password = netrc_auth if netrc_auth else (None, None)
+
+        if username or password:
+            # Store the username and password
+            self.passwords[netloc] = (username, password)
+
+            # Send the basic auth with this request
+            req = HTTPBasicAuth(username or "", password or "")(req)
+
+        # Attach a hook to handle 401 responses
+        req.register_hook("response", self.handle_401)
+
+        return req
+
+    def handle_401(self, resp, **kwargs):
+        # We only care about 401 responses, anything else we want to just
+        #   pass through the actual response
+        if resp.status_code != 401:
+            return resp
+
+        # We are not able to prompt the user so simply return the response
+        if not self.prompting:
+            return resp
+
+        parsed = urllib_parse.urlparse(resp.url)
+
+        # Prompt the user for a new username and password
+        username = six.moves.input("User for %s: " % parsed.netloc)
+        password = getpass.getpass("Password: ")
+
+        # Store the new username and password to use for future requests
+        if username or password:
+            self.passwords[parsed.netloc] = (username, password)
+
+        # Consume content and release the original connection to allow our new
+        #   request to reuse the same one.
+        resp.content
+        resp.raw.release_conn()
+
+        # Add our new username and password to the request
+        req = HTTPBasicAuth(username or "", password or "")(resp.request)
+
+        # Send our new request
+        new_resp = resp.connection.send(req, **kwargs)
+        new_resp.history.append(resp)
+
+        return new_resp
+
+    def parse_credentials(self, netloc):
+        if "@" in netloc:
+            userinfo = netloc.rsplit("@", 1)[0]
+            if ":" in userinfo:
+                return userinfo.split(":", 1)
+            return userinfo, None
+        return None, None
+
+
+class LocalFSAdapter(BaseAdapter):
+
+    def send(self, request, stream=None, timeout=None, verify=None, cert=None,
+             proxies=None):
+        pathname = url_to_path(request.url)
+
+        resp = Response()
+        resp.status_code = 200
+        resp.url = request.url
+
+        try:
+            stats = os.stat(pathname)
+        except OSError as exc:
+            resp.status_code = 404
+            resp.raw = exc
+        else:
+            modified = email.utils.formatdate(stats.st_mtime, usegmt=True)
+            content_type = mimetypes.guess_type(pathname)[0] or "text/plain"
+            resp.headers = CaseInsensitiveDict({
+                "Content-Type": content_type,
+                "Content-Length": stats.st_size,
+                "Last-Modified": modified,
+            })
+
+            resp.raw = open(pathname, "rb")
+            resp.close = resp.raw.close
+
+        return resp
+
+    def close(self):
+        pass
+
+
+class SafeFileCache(FileCache):
+    """
+    A file based cache which is safe to use even when the target directory may
+    not be accessible or writable.
+    """
+
+    def __init__(self, *args, **kwargs):
+        super(SafeFileCache, self).__init__(*args, **kwargs)
+
+        # Check to ensure that the directory containing our cache directory
+        # is owned by the user current executing pip. If it does not exist
+        # we will check the parent directory until we find one that does exist.
+        # If it is not owned by the user executing pip then we will disable
+        # the cache and log a warning.
+        if not check_path_owner(self.directory):
+            logger.warning(
+                "The directory '%s' or its parent directory is not owned by "
+                "the current user and the cache has been disabled. Please "
+                "check the permissions and owner of that directory. If "
+                "executing pip with sudo, you may want sudo's -H flag.",
+                self.directory,
+            )
+
+            # Set our directory to None to disable the Cache
+            self.directory = None
+
+    def get(self, *args, **kwargs):
+        # If we don't have a directory, then the cache should be a no-op.
+        if self.directory is None:
+            return
+
+        try:
+            return super(SafeFileCache, self).get(*args, **kwargs)
+        except (LockError, OSError, IOError):
+            # We intentionally silence this error, if we can't access the cache
+            # then we can just skip caching and process the request as if
+            # caching wasn't enabled.
+            pass
+
+    def set(self, *args, **kwargs):
+        # If we don't have a directory, then the cache should be a no-op.
+        if self.directory is None:
+            return
+
+        try:
+            return super(SafeFileCache, self).set(*args, **kwargs)
+        except (LockError, OSError, IOError):
+            # We intentionally silence this error, if we can't access the cache
+            # then we can just skip caching and process the request as if
+            # caching wasn't enabled.
+            pass
+
+    def delete(self, *args, **kwargs):
+        # If we don't have a directory, then the cache should be a no-op.
+        if self.directory is None:
+            return
+
+        try:
+            return super(SafeFileCache, self).delete(*args, **kwargs)
+        except (LockError, OSError, IOError):
+            # We intentionally silence this error, if we can't access the cache
+            # then we can just skip caching and process the request as if
+            # caching wasn't enabled.
+            pass
+
+
+class InsecureHTTPAdapter(HTTPAdapter):
+
+    def cert_verify(self, conn, url, verify, cert):
+        conn.cert_reqs = 'CERT_NONE'
+        conn.ca_certs = None
+
+
+class PipSession(requests.Session):
+
+    timeout = None
+
+    def __init__(self, *args, **kwargs):
+        retries = kwargs.pop("retries", 0)
+        cache = kwargs.pop("cache", None)
+        insecure_hosts = kwargs.pop("insecure_hosts", [])
+
+        super(PipSession, self).__init__(*args, **kwargs)
+
+        # Attach our User Agent to the request
+        self.headers["User-Agent"] = user_agent()
+
+        # Attach our Authentication handler to the session
+        self.auth = MultiDomainBasicAuth()
+
+        # Create our urllib3.Retry instance which will allow us to customize
+        # how we handle retries.
+        retries = urllib3.Retry(
+            # Set the total number of retries that a particular request can
+            # have.
+            total=retries,
+
+            # A 503 error from PyPI typically means that the Fastly -> Origin
+            # connection got interrupted in some way. A 503 error in general
+            # is typically considered a transient error so we'll go ahead and
+            # retry it.
+            status_forcelist=[503],
+
+            # Add a small amount of back off between failed requests in
+            # order to prevent hammering the service.
+            backoff_factor=0.25,
+        )
+
+        # We want to _only_ cache responses on securely fetched origins. We do
+        # this because we can't validate the response of an insecurely fetched
+        # origin, and we don't want someone to be able to poison the cache and
+        # require manual eviction from the cache to fix it.
+        if cache:
+            secure_adapter = CacheControlAdapter(
+                cache=SafeFileCache(cache, use_dir_lock=True),
+                max_retries=retries,
+            )
+        else:
+            secure_adapter = HTTPAdapter(max_retries=retries)
+
+        # Our Insecure HTTPAdapter disables HTTPS validation. It does not
+        # support caching (see above) so we'll use it for all http:// URLs as
+        # well as any https:// host that we've marked as ignoring TLS errors
+        # for.
+        insecure_adapter = InsecureHTTPAdapter(max_retries=retries)
+
+        self.mount("https://", secure_adapter)
+        self.mount("http://", insecure_adapter)
+
+        # Enable file:// urls
+        self.mount("file://", LocalFSAdapter())
+
+        # We want to use a non-validating adapter for any requests which are
+        # deemed insecure.
+        for host in insecure_hosts:
+            self.mount("https://{0}/".format(host), insecure_adapter)
+
+    def request(self, method, url, *args, **kwargs):
+        # Allow setting a default timeout on a session
+        kwargs.setdefault("timeout", self.timeout)
+
+        # Dispatch the actual request
+        return super(PipSession, self).request(method, url, *args, **kwargs)
+
+
+def get_file_content(url, comes_from=None, session=None):
+    """Gets the content of a file; it may be a filename, file: URL, or
+    http: URL.  Returns (location, content).  Content is unicode."""
+    if session is None:
+        raise TypeError(
+            "get_file_content() missing 1 required keyword argument: 'session'"
+        )
+
+    match = _scheme_re.search(url)
+    if match:
+        scheme = match.group(1).lower()
+        if (scheme == 'file' and comes_from and
+                comes_from.startswith('http')):
+            raise InstallationError(
+                'Requirements file %s references URL %s, which is local'
+                % (comes_from, url))
+        if scheme == 'file':
+            path = url.split(':', 1)[1]
+            path = path.replace('\\', '/')
+            match = _url_slash_drive_re.match(path)
+            if match:
+                path = match.group(1) + ':' + path.split('|', 1)[1]
+            path = urllib_parse.unquote(path)
+            if path.startswith('/'):
+                path = '/' + path.lstrip('/')
+            url = path
+        else:
+            # FIXME: catch some errors
+            resp = session.get(url)
+            resp.raise_for_status()
+            return resp.url, resp.text
+    try:
+        with open(url, 'rb') as f:
+            content = auto_decode(f.read())
+    except IOError as exc:
+        raise InstallationError(
+            'Could not open requirements file: %s' % str(exc)
+        )
+    return url, content
+
+
+_scheme_re = re.compile(r'^(http|https|file):', re.I)
+_url_slash_drive_re = re.compile(r'/*([a-z])\|', re.I)
+
+
+def is_url(name):
+    """Returns true if the name looks like a URL"""
+    if ':' not in name:
+        return False
+    scheme = name.split(':', 1)[0].lower()
+    return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes
+
+
+def url_to_path(url):
+    """
+    Convert a file: URL to a path.
+    """
+    assert url.startswith('file:'), (
+        "You can only turn file: urls into filenames (not %r)" % url)
+
+    _, netloc, path, _, _ = urllib_parse.urlsplit(url)
+
+    # if we have a UNC path, prepend UNC share notation
+    if netloc:
+        netloc = '\\\\' + netloc
+
+    path = urllib_request.url2pathname(netloc + path)
+    return path
+
+
+def path_to_url(path):
+    """
+    Convert a path to a file: URL.  The path will be made absolute and have
+    quoted path parts.
+    """
+    path = os.path.normpath(os.path.abspath(path))
+    url = urllib_parse.urljoin('file:', urllib_request.pathname2url(path))
+    return url
+
+
+def is_archive_file(name):
+    """Return True if `name` is a considered as an archive file."""
+    ext = splitext(name)[1].lower()
+    if ext in ARCHIVE_EXTENSIONS:
+        return True
+    return False
+
+
+def unpack_vcs_link(link, location):
+    vcs_backend = _get_used_vcs_backend(link)
+    vcs_backend.unpack(location)
+
+
+def _get_used_vcs_backend(link):
+    for backend in vcs.backends:
+        if link.scheme in backend.schemes:
+            vcs_backend = backend(link.url)
+            return vcs_backend
+
+
+def is_vcs_url(link):
+    return bool(_get_used_vcs_backend(link))
+
+
+def is_file_url(link):
+    return link.url.lower().startswith('file:')
+
+
+def is_dir_url(link):
+    """Return whether a file:// Link points to a directory.
+
+    ``link`` must not have any other scheme but file://. Call is_file_url()
+    first.
+
+    """
+    link_path = url_to_path(link.url_without_fragment)
+    return os.path.isdir(link_path)
+
+
+def _progress_indicator(iterable, *args, **kwargs):
+    return iterable
+
+
+def _download_url(resp, link, content_file, hashes):
+    try:
+        total_length = int(resp.headers['content-length'])
+    except (ValueError, KeyError, TypeError):
+        total_length = 0
+
+    cached_resp = getattr(resp, "from_cache", False)
+
+    if logger.getEffectiveLevel() > logging.INFO:
+        show_progress = False
+    elif cached_resp:
+        show_progress = False
+    elif total_length > (40 * 1000):
+        show_progress = True
+    elif not total_length:
+        show_progress = True
+    else:
+        show_progress = False
+
+    show_url = link.show_url
+
+    def resp_read(chunk_size):
+        try:
+            # Special case for urllib3.
+            for chunk in resp.raw.stream(
+                    chunk_size,
+                    # We use decode_content=False here because we don't
+                    # want urllib3 to mess with the raw bytes we get
+                    # from the server. If we decompress inside of
+                    # urllib3 then we cannot verify the checksum
+                    # because the checksum will be of the compressed
+                    # file. This breakage will only occur if the
+                    # server adds a Content-Encoding header, which
+                    # depends on how the server was configured:
+                    # - Some servers will notice that the file isn't a
+                    #   compressible file and will leave the file alone
+                    #   and with an empty Content-Encoding
+                    # - Some servers will notice that the file is
+                    #   already compressed and will leave the file
+                    #   alone and will add a Content-Encoding: gzip
+                    #   header
+                    # - Some servers won't notice anything at all and
+                    #   will take a file that's already been compressed
+                    #   and compress it again and set the
+                    #   Content-Encoding: gzip header
+                    #
+                    # By setting this not to decode automatically we
+                    # hope to eliminate problems with the second case.
+                    decode_content=False):
+                yield chunk
+        except AttributeError:
+            # Standard file-like object.
+            while True:
+                chunk = resp.raw.read(chunk_size)
+                if not chunk:
+                    break
+                yield chunk
+
+    def written_chunks(chunks):
+        for chunk in chunks:
+            content_file.write(chunk)
+            yield chunk
+
+    progress_indicator = _progress_indicator
+
+    if link.netloc == PyPI.netloc:
+        url = show_url
+    else:
+        url = link.url_without_fragment
+
+    if show_progress:  # We don't show progress on cached responses
+        if total_length:
+            logger.info("Downloading %s (%s)", url, format_size(total_length))
+            progress_indicator = DownloadProgressBar(max=total_length).iter
+        else:
+            logger.info("Downloading %s", url)
+            progress_indicator = DownloadProgressSpinner().iter
+    elif cached_resp:
+        logger.info("Using cached %s", url)
+    else:
+        logger.info("Downloading %s", url)
+
+    logger.debug('Downloading from URL %s', link)
+
+    downloaded_chunks = written_chunks(
+        progress_indicator(
+            resp_read(CONTENT_CHUNK_SIZE),
+            CONTENT_CHUNK_SIZE
+        )
+    )
+    if hashes:
+        hashes.check_against_chunks(downloaded_chunks)
+    else:
+        consume(downloaded_chunks)
+
+
+def _copy_file(filename, location, link):
+    copy = True
+    download_location = os.path.join(location, link.filename)
+    if os.path.exists(download_location):
+        response = ask_path_exists(
+            'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)abort' %
+            display_path(download_location), ('i', 'w', 'b', 'a'))
+        if response == 'i':
+            copy = False
+        elif response == 'w':
+            logger.warning('Deleting %s', display_path(download_location))
+            os.remove(download_location)
+        elif response == 'b':
+            dest_file = backup_dir(download_location)
+            logger.warning(
+                'Backing up %s to %s',
+                display_path(download_location),
+                display_path(dest_file),
+            )
+            shutil.move(download_location, dest_file)
+        elif response == 'a':
+            sys.exit(-1)
+    if copy:
+        shutil.copy(filename, download_location)
+        logger.info('Saved %s', display_path(download_location))
+
+
+def unpack_http_url(link, location, download_dir=None,
+                    session=None, hashes=None):
+    if session is None:
+        raise TypeError(
+            "unpack_http_url() missing 1 required keyword argument: 'session'"
+        )
+
+    temp_dir = tempfile.mkdtemp('-unpack', 'pip-')
+
+    # If a download dir is specified, is the file already downloaded there?
+    already_downloaded_path = None
+    if download_dir:
+        already_downloaded_path = _check_download_dir(link,
+                                                      download_dir,
+                                                      hashes)
+
+    if already_downloaded_path:
+        from_path = already_downloaded_path
+        content_type = mimetypes.guess_type(from_path)[0]
+    else:
+        # let's download to a tmp dir
+        from_path, content_type = _download_http_url(link,
+                                                     session,
+                                                     temp_dir,
+                                                     hashes)
+
+    # unpack the archive to the build dir location. even when only downloading
+    # archives, they have to be unpacked to parse dependencies
+    unpack_file(from_path, location, content_type, link)
+
+    # a download dir is specified; let's copy the archive there
+    if download_dir and not already_downloaded_path:
+        _copy_file(from_path, download_dir, link)
+
+    if not already_downloaded_path:
+        os.unlink(from_path)
+    rmtree(temp_dir)
+
+
+def unpack_file_url(link, location, download_dir=None, hashes=None):
+    """Unpack link into location.
+
+    If download_dir is provided and link points to a file, make a copy
+    of the link file inside download_dir.
+    """
+    link_path = url_to_path(link.url_without_fragment)
+
+    # If it's a url to a local directory
+    if is_dir_url(link):
+        if os.path.isdir(location):
+            rmtree(location)
+        shutil.copytree(link_path, location, symlinks=True)
+        if download_dir:
+            logger.info('Link is a directory, ignoring download_dir')
+        return
+
+    # If --require-hashes is off, `hashes` is either empty, the
+    # link's embedded hash, or MissingHashes; it is required to
+    # match. If --require-hashes is on, we are satisfied by any
+    # hash in `hashes` matching: a URL-based or an option-based
+    # one; no internet-sourced hash will be in `hashes`.
+    if hashes:
+        hashes.check_against_path(link_path)
+
+    # If a download dir is specified, is the file already there and valid?
+    already_downloaded_path = None
+    if download_dir:
+        already_downloaded_path = _check_download_dir(link,
+                                                      download_dir,
+                                                      hashes)
+
+    if already_downloaded_path:
+        from_path = already_downloaded_path
+    else:
+        from_path = link_path
+
+    content_type = mimetypes.guess_type(from_path)[0]
+
+    # unpack the archive to the build dir location. even when only downloading
+    # archives, they have to be unpacked to parse dependencies
+    unpack_file(from_path, location, content_type, link)
+
+    # a download dir is specified and not already downloaded
+    if download_dir and not already_downloaded_path:
+        _copy_file(from_path, download_dir, link)
+
+
+def _copy_dist_from_dir(link_path, location):
+    """Copy distribution files in `link_path` to `location`.
+
+    Invoked when user requests to install a local directory. E.g.:
+
+        pip install .
+        pip install ~/dev/git-repos/python-prompt-toolkit
+
+    """
+
+    # Note: This is currently VERY SLOW if you have a lot of data in the
+    # directory, because it copies everything with `shutil.copytree`.
+    # What it should really do is build an sdist and install that.
+    # See https://github.com/pypa/pip/issues/2195
+
+    if os.path.isdir(location):
+        rmtree(location)
+
+    # build an sdist
+    setup_py = 'setup.py'
+    sdist_args = [sys.executable]
+    sdist_args.append('-c')
+    sdist_args.append(SETUPTOOLS_SHIM % setup_py)
+    sdist_args.append('sdist')
+    sdist_args += ['--dist-dir', location]
+    logger.info('Running setup.py sdist for %s', link_path)
+
+    with indent_log():
+        call_subprocess(sdist_args, cwd=link_path, show_stdout=False)
+
+    # unpack sdist into `location`
+    sdist = os.path.join(location, os.listdir(location)[0])
+    logger.info('Unpacking sdist %s into %s', sdist, location)
+    unpack_file(sdist, location, content_type=None, link=None)
+
+
+class PipXmlrpcTransport(xmlrpc_client.Transport):
+    """Provide a `xmlrpclib.Transport` implementation via a `PipSession`
+    object.
+    """
+
+    def __init__(self, index_url, session, use_datetime=False):
+        xmlrpc_client.Transport.__init__(self, use_datetime)
+        index_parts = urllib_parse.urlparse(index_url)
+        self._scheme = index_parts.scheme
+        self._session = session
+
+    def request(self, host, handler, request_body, verbose=False):
+        parts = (self._scheme, host, handler, None, None, None)
+        url = urllib_parse.urlunparse(parts)
+        try:
+            headers = {'Content-Type': 'text/xml'}
+            response = self._session.post(url, data=request_body,
+                                          headers=headers, stream=True)
+            response.raise_for_status()
+            self.verbose = verbose
+            return self.parse_response(response.raw)
+        except requests.HTTPError as exc:
+            logger.critical(
+                "HTTP error %s while getting %s",
+                exc.response.status_code, url,
+            )
+            raise
+
+
+def unpack_url(link, location, download_dir=None,
+               only_download=False, session=None, hashes=None):
+    """Unpack link.
+       If link is a VCS link:
+         if only_download, export into download_dir and ignore location
+          else unpack into location
+       for other types of link:
+         - unpack into location
+         - if download_dir, copy the file into download_dir
+         - if only_download, mark location for deletion
+
+    :param hashes: A Hashes object, one of whose embedded hashes must match,
+        or HashMismatch will be raised. If the Hashes is empty, no matches are
+        required, and unhashable types of requirements (like VCS ones, which
+        would ordinarily raise HashUnsupported) are allowed.
+    """
+    # non-editable vcs urls
+    if is_vcs_url(link):
+        unpack_vcs_link(link, location)
+
+    # file urls
+    elif is_file_url(link):
+        unpack_file_url(link, location, download_dir, hashes=hashes)
+
+    # http urls
+    else:
+        if session is None:
+            session = PipSession()
+
+        unpack_http_url(
+            link,
+            location,
+            download_dir,
+            session,
+            hashes=hashes
+        )
+    if only_download:
+        write_delete_marker_file(location)
+
+
+def _download_http_url(link, session, temp_dir, hashes):
+    """Download link url into temp_dir using provided session"""
+    target_url = link.url.split('#', 1)[0]
+    try:
+        resp = session.get(
+            target_url,
+            # We use Accept-Encoding: identity here because requests
+            # defaults to accepting compressed responses. This breaks in
+            # a variety of ways depending on how the server is configured.
+            # - Some servers will notice that the file isn't a compressible
+            #   file and will leave the file alone and with an empty
+            #   Content-Encoding
+            # - Some servers will notice that the file is already
+            #   compressed and will leave the file alone and will add a
+            #   Content-Encoding: gzip header
+            # - Some servers won't notice anything at all and will take
+            #   a file that's already been compressed and compress it again
+            #   and set the Content-Encoding: gzip header
+            # By setting this to request only the identity encoding We're
+            # hoping to eliminate the third case. Hopefully there does not
+            # exist a server which when given a file will notice it is
+            # already compressed and that you're not asking for a
+            # compressed file and will then decompress it before sending
+            # because if that's the case I don't think it'll ever be
+            # possible to make this work.
+            headers={"Accept-Encoding": "identity"},
+            stream=True,
+        )
+        resp.raise_for_status()
+    except requests.HTTPError as exc:
+        logger.critical(
+            "HTTP error %s while getting %s", exc.response.status_code, link,
+        )
+        raise
+
+    content_type = resp.headers.get('content-type', '')
+    filename = link.filename  # fallback
+    # Have a look at the Content-Disposition header for a better guess
+    content_disposition = resp.headers.get('content-disposition')
+    if content_disposition:
+        type, params = cgi.parse_header(content_disposition)
+        # We use ``or`` here because we don't want to use an "empty" value
+        # from the filename param.
+        filename = params.get('filename') or filename
+    ext = splitext(filename)[1]
+    if not ext:
+        ext = mimetypes.guess_extension(content_type)
+        if ext:
+            filename += ext
+    if not ext and link.url != resp.url:
+        ext = os.path.splitext(resp.url)[1]
+        if ext:
+            filename += ext
+    file_path = os.path.join(temp_dir, filename)
+    with open(file_path, 'wb') as content_file:
+        _download_url(resp, link, content_file, hashes)
+    return file_path, content_type
+
+
+def _check_download_dir(link, download_dir, hashes):
+    """ Check download_dir for previously downloaded file with correct hash
+        If a correct file is found return its path else None
+    """
+    download_path = os.path.join(download_dir, link.filename)
+    if os.path.exists(download_path):
+        # If already downloaded, does its hash match?
+        logger.info('File was already downloaded %s', download_path)
+        if hashes:
+            try:
+                hashes.check_against_path(download_path)
+            except HashMismatch:
+                logger.warning(
+                    'Previously-downloaded file %s has bad hash. '
+                    'Re-downloading.',
+                    download_path
+                )
+                os.unlink(download_path)
+                return None
+        return download_path
+    return None
diff --git a/vendor/pip-9.0.3/pip/exceptions.py b/vendor/pip-9.0.3/pip/exceptions.py
new file mode 100644
index 0000000000000000000000000000000000000000..50b527f90187ae7f2df69b822bf40f3069d3e6c2
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/exceptions.py
@@ -0,0 +1,244 @@
+"""Exceptions used throughout package"""
+from __future__ import absolute_import
+
+from itertools import chain, groupby, repeat
+
+from pip._vendor.six import iteritems
+
+
+class PipError(Exception):
+    """Base pip exception"""
+
+
+class InstallationError(PipError):
+    """General exception during installation"""
+
+
+class UninstallationError(PipError):
+    """General exception during uninstallation"""
+
+
+class DistributionNotFound(InstallationError):
+    """Raised when a distribution cannot be found to satisfy a requirement"""
+
+
+class RequirementsFileParseError(InstallationError):
+    """Raised when a general error occurs parsing a requirements file line."""
+
+
+class BestVersionAlreadyInstalled(PipError):
+    """Raised when the most up-to-date version of a package is already
+    installed."""
+
+
+class BadCommand(PipError):
+    """Raised when virtualenv or a command is not found"""
+
+
+class CommandError(PipError):
+    """Raised when there is an error in command-line arguments"""
+
+
+class PreviousBuildDirError(PipError):
+    """Raised when there's a previous conflicting build directory"""
+
+
+class InvalidWheelFilename(InstallationError):
+    """Invalid wheel filename."""
+
+
+class UnsupportedWheel(InstallationError):
+    """Unsupported wheel."""
+
+
+class HashErrors(InstallationError):
+    """Multiple HashError instances rolled into one for reporting"""
+
+    def __init__(self):
+        self.errors = []
+
+    def append(self, error):
+        self.errors.append(error)
+
+    def __str__(self):
+        lines = []
+        self.errors.sort(key=lambda e: e.order)
+        for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__):
+            lines.append(cls.head)
+            lines.extend(e.body() for e in errors_of_cls)
+        if lines:
+            return '\n'.join(lines)
+
+    def __nonzero__(self):
+        return bool(self.errors)
+
+    def __bool__(self):
+        return self.__nonzero__()
+
+
+class HashError(InstallationError):
+    """
+    A failure to verify a package against known-good hashes
+
+    :cvar order: An int sorting hash exception classes by difficulty of
+        recovery (lower being harder), so the user doesn't bother fretting
+        about unpinned packages when he has deeper issues, like VCS
+        dependencies, to deal with. Also keeps error reports in a
+        deterministic order.
+    :cvar head: A section heading for display above potentially many
+        exceptions of this kind
+    :ivar req: The InstallRequirement that triggered this error. This is
+        pasted on after the exception is instantiated, because it's not
+        typically available earlier.
+
+    """
+    req = None
+    head = ''
+
+    def body(self):
+        """Return a summary of me for display under the heading.
+
+        This default implementation simply prints a description of the
+        triggering requirement.
+
+        :param req: The InstallRequirement that provoked this error, with
+            populate_link() having already been called
+
+        """
+        return '    %s' % self._requirement_name()
+
+    def __str__(self):
+        return '%s\n%s' % (self.head, self.body())
+
+    def _requirement_name(self):
+        """Return a description of the requirement that triggered me.
+
+        This default implementation returns long description of the req, with
+        line numbers
+
+        """
+        return str(self.req) if self.req else 'unknown package'
+
+
+class VcsHashUnsupported(HashError):
+    """A hash was provided for a version-control-system-based requirement, but
+    we don't have a method for hashing those."""
+
+    order = 0
+    head = ("Can't verify hashes for these requirements because we don't "
+            "have a way to hash version control repositories:")
+
+
+class DirectoryUrlHashUnsupported(HashError):
+    """A hash was provided for a version-control-system-based requirement, but
+    we don't have a method for hashing those."""
+
+    order = 1
+    head = ("Can't verify hashes for these file:// requirements because they "
+            "point to directories:")
+
+
+class HashMissing(HashError):
+    """A hash was needed for a requirement but is absent."""
+
+    order = 2
+    head = ('Hashes are required in --require-hashes mode, but they are '
+            'missing from some requirements. Here is a list of those '
+            'requirements along with the hashes their downloaded archives '
+            'actually had. Add lines like these to your requirements files to '
+            'prevent tampering. (If you did not enable --require-hashes '
+            'manually, note that it turns on automatically when any package '
+            'has a hash.)')
+
+    def __init__(self, gotten_hash):
+        """
+        :param gotten_hash: The hash of the (possibly malicious) archive we
+            just downloaded
+        """
+        self.gotten_hash = gotten_hash
+
+    def body(self):
+        from pip.utils.hashes import FAVORITE_HASH  # Dodge circular import.
+
+        package = None
+        if self.req:
+            # In the case of URL-based requirements, display the original URL
+            # seen in the requirements file rather than the package name,
+            # so the output can be directly copied into the requirements file.
+            package = (self.req.original_link if self.req.original_link
+                       # In case someone feeds something downright stupid
+                       # to InstallRequirement's constructor.
+                       else getattr(self.req, 'req', None))
+        return '    %s --hash=%s:%s' % (package or 'unknown package',
+                                        FAVORITE_HASH,
+                                        self.gotten_hash)
+
+
+class HashUnpinned(HashError):
+    """A requirement had a hash specified but was not pinned to a specific
+    version."""
+
+    order = 3
+    head = ('In --require-hashes mode, all requirements must have their '
+            'versions pinned with ==. These do not:')
+
+
+class HashMismatch(HashError):
+    """
+    Distribution file hash values don't match.
+
+    :ivar package_name: The name of the package that triggered the hash
+        mismatch. Feel free to write to this after the exception is raise to
+        improve its error message.
+
+    """
+    order = 4
+    head = ('THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS '
+            'FILE. If you have updated the package versions, please update '
+            'the hashes. Otherwise, examine the package contents carefully; '
+            'someone may have tampered with them.')
+
+    def __init__(self, allowed, gots):
+        """
+        :param allowed: A dict of algorithm names pointing to lists of allowed
+            hex digests
+        :param gots: A dict of algorithm names pointing to hashes we
+            actually got from the files under suspicion
+        """
+        self.allowed = allowed
+        self.gots = gots
+
+    def body(self):
+        return '    %s:\n%s' % (self._requirement_name(),
+                                self._hash_comparison())
+
+    def _hash_comparison(self):
+        """
+        Return a comparison of actual and expected hash values.
+
+        Example::
+
+               Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde
+                            or 123451234512345123451234512345123451234512345
+                    Got        bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef
+
+        """
+        def hash_then_or(hash_name):
+            # For now, all the decent hashes have 6-char names, so we can get
+            # away with hard-coding space literals.
+            return chain([hash_name], repeat('    or'))
+
+        lines = []
+        for hash_name, expecteds in iteritems(self.allowed):
+            prefix = hash_then_or(hash_name)
+            lines.extend(('        Expected %s %s' % (next(prefix), e))
+                         for e in expecteds)
+            lines.append('             Got        %s\n' %
+                         self.gots[hash_name].hexdigest())
+            prefix = '    or'
+        return '\n'.join(lines)
+
+
+class UnsupportedPythonVersion(InstallationError):
+    """Unsupported python version according to Requires-Python package
+    metadata."""
diff --git a/vendor/pip-9.0.3/pip/index.py b/vendor/pip-9.0.3/pip/index.py
new file mode 100644
index 0000000000000000000000000000000000000000..f653f6e6a6e0845891e1e0d770ded6eb0d0b0039
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/index.py
@@ -0,0 +1,1102 @@
+"""Routines related to PyPI, indexes"""
+from __future__ import absolute_import
+
+import logging
+import cgi
+from collections import namedtuple
+import itertools
+import sys
+import os
+import re
+import mimetypes
+import posixpath
+import warnings
+
+from pip._vendor.six.moves.urllib import parse as urllib_parse
+from pip._vendor.six.moves.urllib import request as urllib_request
+
+from pip.compat import ipaddress
+from pip.utils import (
+    cached_property, splitext, normalize_path,
+    ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS,
+)
+from pip.utils.deprecation import RemovedInPip10Warning
+from pip.utils.logging import indent_log
+from pip.utils.packaging import check_requires_python
+from pip.exceptions import (
+    DistributionNotFound, BestVersionAlreadyInstalled, InvalidWheelFilename,
+    UnsupportedWheel,
+)
+from pip.download import HAS_TLS, is_url, path_to_url, url_to_path
+from pip.wheel import Wheel, wheel_ext
+from pip.pep425tags import get_supported
+from pip._vendor import html5lib, requests, six
+from pip._vendor.packaging.version import parse as parse_version
+from pip._vendor.packaging.utils import canonicalize_name
+from pip._vendor.packaging import specifiers
+from pip._vendor.requests.exceptions import SSLError
+from pip._vendor.distlib.compat import unescape
+
+
+__all__ = ['FormatControl', 'fmt_ctl_handle_mutual_exclude', 'PackageFinder']
+
+
+SECURE_ORIGINS = [
+    # protocol, hostname, port
+    # Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC)
+    ("https", "*", "*"),
+    ("*", "localhost", "*"),
+    ("*", "127.0.0.0/8", "*"),
+    ("*", "::1/128", "*"),
+    ("file", "*", None),
+    # ssh is always secure.
+    ("ssh", "*", "*"),
+]
+
+
+logger = logging.getLogger(__name__)
+
+
+class InstallationCandidate(object):
+
+    def __init__(self, project, version, location):
+        self.project = project
+        self.version = parse_version(version)
+        self.location = location
+        self._key = (self.project, self.version, self.location)
+
+    def __repr__(self):
+        return "<InstallationCandidate({0!r}, {1!r}, {2!r})>".format(
+            self.project, self.version, self.location,
+        )
+
+    def __hash__(self):
+        return hash(self._key)
+
+    def __lt__(self, other):
+        return self._compare(other, lambda s, o: s < o)
+
+    def __le__(self, other):
+        return self._compare(other, lambda s, o: s <= o)
+
+    def __eq__(self, other):
+        return self._compare(other, lambda s, o: s == o)
+
+    def __ge__(self, other):
+        return self._compare(other, lambda s, o: s >= o)
+
+    def __gt__(self, other):
+        return self._compare(other, lambda s, o: s > o)
+
+    def __ne__(self, other):
+        return self._compare(other, lambda s, o: s != o)
+
+    def _compare(self, other, method):
+        if not isinstance(other, InstallationCandidate):
+            return NotImplemented
+
+        return method(self._key, other._key)
+
+
+class PackageFinder(object):
+    """This finds packages.
+
+    This is meant to match easy_install's technique for looking for
+    packages, by reading pages and looking for appropriate links.
+    """
+
+    def __init__(self, find_links, index_urls, allow_all_prereleases=False,
+                 trusted_hosts=None, process_dependency_links=False,
+                 session=None, format_control=None, platform=None,
+                 versions=None, abi=None, implementation=None):
+        """Create a PackageFinder.
+
+        :param format_control: A FormatControl object or None. Used to control
+            the selection of source packages / binary packages when consulting
+            the index and links.
+        :param platform: A string or None. If None, searches for packages
+            that are supported by the current system. Otherwise, will find
+            packages that can be built on the platform passed in. These
+            packages will only be downloaded for distribution: they will
+            not be built locally.
+        :param versions: A list of strings or None. This is passed directly
+            to pep425tags.py in the get_supported() method.
+        :param abi: A string or None. This is passed directly
+            to pep425tags.py in the get_supported() method.
+        :param implementation: A string or None. This is passed directly
+            to pep425tags.py in the get_supported() method.
+        """
+        if session is None:
+            raise TypeError(
+                "PackageFinder() missing 1 required keyword argument: "
+                "'session'"
+            )
+
+        # Build find_links. If an argument starts with ~, it may be
+        # a local file relative to a home directory. So try normalizing
+        # it and if it exists, use the normalized version.
+        # This is deliberately conservative - it might be fine just to
+        # blindly normalize anything starting with a ~...
+        self.find_links = []
+        for link in find_links:
+            if link.startswith('~'):
+                new_link = normalize_path(link)
+                if os.path.exists(new_link):
+                    link = new_link
+            self.find_links.append(link)
+
+        self.index_urls = index_urls
+        self.dependency_links = []
+
+        # These are boring links that have already been logged somehow:
+        self.logged_links = set()
+
+        self.format_control = format_control or FormatControl(set(), set())
+
+        # Domains that we won't emit warnings for when not using HTTPS
+        self.secure_origins = [
+            ("*", host, "*")
+            for host in (trusted_hosts if trusted_hosts else [])
+        ]
+
+        # Do we want to allow _all_ pre-releases?
+        self.allow_all_prereleases = allow_all_prereleases
+
+        # Do we process dependency links?
+        self.process_dependency_links = process_dependency_links
+
+        # The Session we'll use to make requests
+        self.session = session
+
+        # The valid tags to check potential found wheel candidates against
+        self.valid_tags = get_supported(
+            versions=versions,
+            platform=platform,
+            abi=abi,
+            impl=implementation,
+        )
+
+        # If we don't have TLS enabled, then WARN if anyplace we're looking
+        # relies on TLS.
+        if not HAS_TLS:
+            for link in itertools.chain(self.index_urls, self.find_links):
+                parsed = urllib_parse.urlparse(link)
+                if parsed.scheme == "https":
+                    logger.warning(
+                        "pip is configured with locations that require "
+                        "TLS/SSL, however the ssl module in Python is not "
+                        "available."
+                    )
+                    break
+
+    def add_dependency_links(self, links):
+        # # FIXME: this shouldn't be global list this, it should only
+        # # apply to requirements of the package that specifies the
+        # # dependency_links value
+        # # FIXME: also, we should track comes_from (i.e., use Link)
+        if self.process_dependency_links:
+            warnings.warn(
+                "Dependency Links processing has been deprecated and will be "
+                "removed in a future release.",
+                RemovedInPip10Warning,
+            )
+            self.dependency_links.extend(links)
+
+    @staticmethod
+    def _sort_locations(locations, expand_dir=False):
+        """
+        Sort locations into "files" (archives) and "urls", and return
+        a pair of lists (files,urls)
+        """
+        files = []
+        urls = []
+
+        # puts the url for the given file path into the appropriate list
+        def sort_path(path):
+            url = path_to_url(path)
+            if mimetypes.guess_type(url, strict=False)[0] == 'text/html':
+                urls.append(url)
+            else:
+                files.append(url)
+
+        for url in locations:
+
+            is_local_path = os.path.exists(url)
+            is_file_url = url.startswith('file:')
+
+            if is_local_path or is_file_url:
+                if is_local_path:
+                    path = url
+                else:
+                    path = url_to_path(url)
+                if os.path.isdir(path):
+                    if expand_dir:
+                        path = os.path.realpath(path)
+                        for item in os.listdir(path):
+                            sort_path(os.path.join(path, item))
+                    elif is_file_url:
+                        urls.append(url)
+                elif os.path.isfile(path):
+                    sort_path(path)
+                else:
+                    logger.warning(
+                        "Url '%s' is ignored: it is neither a file "
+                        "nor a directory.", url)
+            elif is_url(url):
+                # Only add url with clear scheme
+                urls.append(url)
+            else:
+                logger.warning(
+                    "Url '%s' is ignored. It is either a non-existing "
+                    "path or lacks a specific scheme.", url)
+
+        return files, urls
+
+    def _candidate_sort_key(self, candidate):
+        """
+        Function used to generate link sort key for link tuples.
+        The greater the return value, the more preferred it is.
+        If not finding wheels, then sorted by version only.
+        If finding wheels, then the sort order is by version, then:
+          1. existing installs
+          2. wheels ordered via Wheel.support_index_min(self.valid_tags)
+          3. source archives
+        Note: it was considered to embed this logic into the Link
+              comparison operators, but then different sdist links
+              with the same version, would have to be considered equal
+        """
+        support_num = len(self.valid_tags)
+        if candidate.location.is_wheel:
+            # can raise InvalidWheelFilename
+            wheel = Wheel(candidate.location.filename)
+            if not wheel.supported(self.valid_tags):
+                raise UnsupportedWheel(
+                    "%s is not a supported wheel for this platform. It "
+                    "can't be sorted." % wheel.filename
+                )
+            pri = -(wheel.support_index_min(self.valid_tags))
+        else:  # sdist
+            pri = -(support_num)
+        return (candidate.version, pri)
+
+    def _validate_secure_origin(self, logger, location):
+        # Determine if this url used a secure transport mechanism
+        parsed = urllib_parse.urlparse(str(location))
+        origin = (parsed.scheme, parsed.hostname, parsed.port)
+
+        # The protocol to use to see if the protocol matches.
+        # Don't count the repository type as part of the protocol: in
+        # cases such as "git+ssh", only use "ssh". (I.e., Only verify against
+        # the last scheme.)
+        protocol = origin[0].rsplit('+', 1)[-1]
+
+        # Determine if our origin is a secure origin by looking through our
+        # hardcoded list of secure origins, as well as any additional ones
+        # configured on this PackageFinder instance.
+        for secure_origin in (SECURE_ORIGINS + self.secure_origins):
+            if protocol != secure_origin[0] and secure_origin[0] != "*":
+                continue
+
+            try:
+                # We need to do this decode dance to ensure that we have a
+                # unicode object, even on Python 2.x.
+                addr = ipaddress.ip_address(
+                    origin[1]
+                    if (
+                        isinstance(origin[1], six.text_type) or
+                        origin[1] is None
+                    )
+                    else origin[1].decode("utf8")
+                )
+                network = ipaddress.ip_network(
+                    secure_origin[1]
+                    if isinstance(secure_origin[1], six.text_type)
+                    else secure_origin[1].decode("utf8")
+                )
+            except ValueError:
+                # We don't have both a valid address or a valid network, so
+                # we'll check this origin against hostnames.
+                if (origin[1] and
+                        origin[1].lower() != secure_origin[1].lower() and
+                        secure_origin[1] != "*"):
+                    continue
+            else:
+                # We have a valid address and network, so see if the address
+                # is contained within the network.
+                if addr not in network:
+                    continue
+
+            # Check to see if the port patches
+            if (origin[2] != secure_origin[2] and
+                    secure_origin[2] != "*" and
+                    secure_origin[2] is not None):
+                continue
+
+            # If we've gotten here, then this origin matches the current
+            # secure origin and we should return True
+            return True
+
+        # If we've gotten to this point, then the origin isn't secure and we
+        # will not accept it as a valid location to search. We will however
+        # log a warning that we are ignoring it.
+        logger.warning(
+            "The repository located at %s is not a trusted or secure host and "
+            "is being ignored. If this repository is available via HTTPS it "
+            "is recommended to use HTTPS instead, otherwise you may silence "
+            "this warning and allow it anyways with '--trusted-host %s'.",
+            parsed.hostname,
+            parsed.hostname,
+        )
+
+        return False
+
+    def _get_index_urls_locations(self, project_name):
+        """Returns the locations found via self.index_urls
+
+        Checks the url_name on the main (first in the list) index and
+        use this url_name to produce all locations
+        """
+
+        def mkurl_pypi_url(url):
+            loc = posixpath.join(
+                url,
+                urllib_parse.quote(canonicalize_name(project_name)))
+            # For maximum compatibility with easy_install, ensure the path
+            # ends in a trailing slash.  Although this isn't in the spec
+            # (and PyPI can handle it without the slash) some other index
+            # implementations might break if they relied on easy_install's
+            # behavior.
+            if not loc.endswith('/'):
+                loc = loc + '/'
+            return loc
+
+        return [mkurl_pypi_url(url) for url in self.index_urls]
+
+    def find_all_candidates(self, project_name):
+        """Find all available InstallationCandidate for project_name
+
+        This checks index_urls, find_links and dependency_links.
+        All versions found are returned as an InstallationCandidate list.
+
+        See _link_package_versions for details on which files are accepted
+        """
+        index_locations = self._get_index_urls_locations(project_name)
+        index_file_loc, index_url_loc = self._sort_locations(index_locations)
+        fl_file_loc, fl_url_loc = self._sort_locations(
+            self.find_links, expand_dir=True)
+        dep_file_loc, dep_url_loc = self._sort_locations(self.dependency_links)
+
+        file_locations = (
+            Link(url) for url in itertools.chain(
+                index_file_loc, fl_file_loc, dep_file_loc)
+        )
+
+        # We trust every url that the user has given us whether it was given
+        #   via --index-url or --find-links
+        # We explicitly do not trust links that came from dependency_links
+        # We want to filter out any thing which does not have a secure origin.
+        url_locations = [
+            link for link in itertools.chain(
+                (Link(url) for url in index_url_loc),
+                (Link(url) for url in fl_url_loc),
+                (Link(url) for url in dep_url_loc),
+            )
+            if self._validate_secure_origin(logger, link)
+        ]
+
+        logger.debug('%d location(s) to search for versions of %s:',
+                     len(url_locations), project_name)
+
+        for location in url_locations:
+            logger.debug('* %s', location)
+
+        canonical_name = canonicalize_name(project_name)
+        formats = fmt_ctl_formats(self.format_control, canonical_name)
+        search = Search(project_name, canonical_name, formats)
+        find_links_versions = self._package_versions(
+            # We trust every directly linked archive in find_links
+            (Link(url, '-f') for url in self.find_links),
+            search
+        )
+
+        page_versions = []
+        for page in self._get_pages(url_locations, project_name):
+            logger.debug('Analyzing links from page %s', page.url)
+            with indent_log():
+                page_versions.extend(
+                    self._package_versions(page.links, search)
+                )
+
+        dependency_versions = self._package_versions(
+            (Link(url) for url in self.dependency_links), search
+        )
+        if dependency_versions:
+            logger.debug(
+                'dependency_links found: %s',
+                ', '.join([
+                    version.location.url for version in dependency_versions
+                ])
+            )
+
+        file_versions = self._package_versions(file_locations, search)
+        if file_versions:
+            file_versions.sort(reverse=True)
+            logger.debug(
+                'Local files found: %s',
+                ', '.join([
+                    url_to_path(candidate.location.url)
+                    for candidate in file_versions
+                ])
+            )
+
+        # This is an intentional priority ordering
+        return (
+            file_versions + find_links_versions + page_versions +
+            dependency_versions
+        )
+
+    def find_requirement(self, req, upgrade):
+        """Try to find a Link matching req
+
+        Expects req, an InstallRequirement and upgrade, a boolean
+        Returns a Link if found,
+        Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise
+        """
+        all_candidates = self.find_all_candidates(req.name)
+
+        # Filter out anything which doesn't match our specifier
+        compatible_versions = set(
+            req.specifier.filter(
+                # We turn the version object into a str here because otherwise
+                # when we're debundled but setuptools isn't, Python will see
+                # packaging.version.Version and
+                # pkg_resources._vendor.packaging.version.Version as different
+                # types. This way we'll use a str as a common data interchange
+                # format. If we stop using the pkg_resources provided specifier
+                # and start using our own, we can drop the cast to str().
+                [str(c.version) for c in all_candidates],
+                prereleases=(
+                    self.allow_all_prereleases
+                    if self.allow_all_prereleases else None
+                ),
+            )
+        )
+        applicable_candidates = [
+            # Again, converting to str to deal with debundling.
+            c for c in all_candidates if str(c.version) in compatible_versions
+        ]
+
+        if applicable_candidates:
+            best_candidate = max(applicable_candidates,
+                                 key=self._candidate_sort_key)
+        else:
+            best_candidate = None
+
+        if req.satisfied_by is not None:
+            installed_version = parse_version(req.satisfied_by.version)
+        else:
+            installed_version = None
+
+        if installed_version is None and best_candidate is None:
+            logger.critical(
+                'Could not find a version that satisfies the requirement %s '
+                '(from versions: %s)',
+                req,
+                ', '.join(
+                    sorted(
+                        set(str(c.version) for c in all_candidates),
+                        key=parse_version,
+                    )
+                )
+            )
+
+            raise DistributionNotFound(
+                'No matching distribution found for %s' % req
+            )
+
+        best_installed = False
+        if installed_version and (
+                best_candidate is None or
+                best_candidate.version <= installed_version):
+            best_installed = True
+
+        if not upgrade and installed_version is not None:
+            if best_installed:
+                logger.debug(
+                    'Existing installed version (%s) is most up-to-date and '
+                    'satisfies requirement',
+                    installed_version,
+                )
+            else:
+                logger.debug(
+                    'Existing installed version (%s) satisfies requirement '
+                    '(most up-to-date version is %s)',
+                    installed_version,
+                    best_candidate.version,
+                )
+            return None
+
+        if best_installed:
+            # We have an existing version, and its the best version
+            logger.debug(
+                'Installed version (%s) is most up-to-date (past versions: '
+                '%s)',
+                installed_version,
+                ', '.join(sorted(compatible_versions, key=parse_version)) or
+                "none",
+            )
+            raise BestVersionAlreadyInstalled
+
+        logger.debug(
+            'Using version %s (newest of versions: %s)',
+            best_candidate.version,
+            ', '.join(sorted(compatible_versions, key=parse_version))
+        )
+        return best_candidate.location
+
+    def _get_pages(self, locations, project_name):
+        """
+        Yields (page, page_url) from the given locations, skipping
+        locations that have errors.
+        """
+        seen = set()
+        for location in locations:
+            if location in seen:
+                continue
+            seen.add(location)
+
+            page = self._get_page(location)
+            if page is None:
+                continue
+
+            yield page
+
+    _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$')
+
+    def _sort_links(self, links):
+        """
+        Returns elements of links in order, non-egg links first, egg links
+        second, while eliminating duplicates
+        """
+        eggs, no_eggs = [], []
+        seen = set()
+        for link in links:
+            if link not in seen:
+                seen.add(link)
+                if link.egg_fragment:
+                    eggs.append(link)
+                else:
+                    no_eggs.append(link)
+        return no_eggs + eggs
+
+    def _package_versions(self, links, search):
+        result = []
+        for link in self._sort_links(links):
+            v = self._link_package_versions(link, search)
+            if v is not None:
+                result.append(v)
+        return result
+
+    def _log_skipped_link(self, link, reason):
+        if link not in self.logged_links:
+            logger.debug('Skipping link %s; %s', link, reason)
+            self.logged_links.add(link)
+
+    def _link_package_versions(self, link, search):
+        """Return an InstallationCandidate or None"""
+        version = None
+        if link.egg_fragment:
+            egg_info = link.egg_fragment
+            ext = link.ext
+        else:
+            egg_info, ext = link.splitext()
+            if not ext:
+                self._log_skipped_link(link, 'not a file')
+                return
+            if ext not in SUPPORTED_EXTENSIONS:
+                self._log_skipped_link(
+                    link, 'unsupported archive format: %s' % ext)
+                return
+            if "binary" not in search.formats and ext == wheel_ext:
+                self._log_skipped_link(
+                    link, 'No binaries permitted for %s' % search.supplied)
+                return
+            if "macosx10" in link.path and ext == '.zip':
+                self._log_skipped_link(link, 'macosx10 one')
+                return
+            if ext == wheel_ext:
+                try:
+                    wheel = Wheel(link.filename)
+                except InvalidWheelFilename:
+                    self._log_skipped_link(link, 'invalid wheel filename')
+                    return
+                if canonicalize_name(wheel.name) != search.canonical:
+                    self._log_skipped_link(
+                        link, 'wrong project name (not %s)' % search.supplied)
+                    return
+
+                if not wheel.supported(self.valid_tags):
+                    self._log_skipped_link(
+                        link, 'it is not compatible with this Python')
+                    return
+
+                version = wheel.version
+
+        # This should be up by the search.ok_binary check, but see issue 2700.
+        if "source" not in search.formats and ext != wheel_ext:
+            self._log_skipped_link(
+                link, 'No sources permitted for %s' % search.supplied)
+            return
+
+        if not version:
+            version = egg_info_matches(egg_info, search.supplied, link)
+        if version is None:
+            self._log_skipped_link(
+                link, 'wrong project name (not %s)' % search.supplied)
+            return
+
+        match = self._py_version_re.search(version)
+        if match:
+            version = version[:match.start()]
+            py_version = match.group(1)
+            if py_version != sys.version[:3]:
+                self._log_skipped_link(
+                    link, 'Python version is incorrect')
+                return
+        try:
+            support_this_python = check_requires_python(link.requires_python)
+        except specifiers.InvalidSpecifier:
+            logger.debug("Package %s has an invalid Requires-Python entry: %s",
+                         link.filename, link.requires_python)
+            support_this_python = True
+
+        if not support_this_python:
+            logger.debug("The package %s is incompatible with the python"
+                         "version in use. Acceptable python versions are:%s",
+                         link, link.requires_python)
+            return
+        logger.debug('Found link %s, version: %s', link, version)
+
+        return InstallationCandidate(search.supplied, version, link)
+
+    def _get_page(self, link):
+        return HTMLPage.get_page(link, session=self.session)
+
+
+def egg_info_matches(
+        egg_info, search_name, link,
+        _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)):
+    """Pull the version part out of a string.
+
+    :param egg_info: The string to parse. E.g. foo-2.1
+    :param search_name: The name of the package this belongs to. None to
+        infer the name. Note that this cannot unambiguously parse strings
+        like foo-2-2 which might be foo, 2-2 or foo-2, 2.
+    :param link: The link the string came from, for logging on failure.
+    """
+    match = _egg_info_re.search(egg_info)
+    if not match:
+        logger.debug('Could not parse version from link: %s', link)
+        return None
+    if search_name is None:
+        full_match = match.group(0)
+        return full_match[full_match.index('-'):]
+    name = match.group(0).lower()
+    # To match the "safe" name that pkg_resources creates:
+    name = name.replace('_', '-')
+    # project name and version must be separated by a dash
+    look_for = search_name.lower() + "-"
+    if name.startswith(look_for):
+        return match.group(0)[len(look_for):]
+    else:
+        return None
+
+
+class HTMLPage(object):
+    """Represents one page, along with its URL"""
+
+    def __init__(self, content, url, headers=None):
+        # Determine if we have any encoding information in our headers
+        encoding = None
+        if headers and "Content-Type" in headers:
+            content_type, params = cgi.parse_header(headers["Content-Type"])
+
+            if "charset" in params:
+                encoding = params['charset']
+
+        self.content = content
+        self.parsed = html5lib.parse(
+            self.content,
+            transport_encoding=encoding,
+            namespaceHTMLElements=False,
+        )
+        self.url = url
+        self.headers = headers
+
+    def __str__(self):
+        return self.url
+
+    @classmethod
+    def get_page(cls, link, skip_archives=True, session=None):
+        if session is None:
+            raise TypeError(
+                "get_page() missing 1 required keyword argument: 'session'"
+            )
+
+        url = link.url
+        url = url.split('#', 1)[0]
+
+        # Check for VCS schemes that do not support lookup as web pages.
+        from pip.vcs import VcsSupport
+        for scheme in VcsSupport.schemes:
+            if url.lower().startswith(scheme) and url[len(scheme)] in '+:':
+                logger.debug('Cannot look at %s URL %s', scheme, link)
+                return None
+
+        try:
+            if skip_archives:
+                filename = link.filename
+                for bad_ext in ARCHIVE_EXTENSIONS:
+                    if filename.endswith(bad_ext):
+                        content_type = cls._get_content_type(
+                            url, session=session,
+                        )
+                        if content_type.lower().startswith('text/html'):
+                            break
+                        else:
+                            logger.debug(
+                                'Skipping page %s because of Content-Type: %s',
+                                link,
+                                content_type,
+                            )
+                            return
+
+            logger.debug('Getting page %s', url)
+
+            # Tack index.html onto file:// URLs that point to directories
+            (scheme, netloc, path, params, query, fragment) = \
+                urllib_parse.urlparse(url)
+            if (scheme == 'file' and
+                    os.path.isdir(urllib_request.url2pathname(path))):
+                # add trailing slash if not present so urljoin doesn't trim
+                # final segment
+                if not url.endswith('/'):
+                    url += '/'
+                url = urllib_parse.urljoin(url, 'index.html')
+                logger.debug(' file: URL is directory, getting %s', url)
+
+            resp = session.get(
+                url,
+                headers={
+                    "Accept": "text/html",
+                    "Cache-Control": "max-age=600",
+                },
+            )
+            resp.raise_for_status()
+
+            # The check for archives above only works if the url ends with
+            # something that looks like an archive. However that is not a
+            # requirement of an url. Unless we issue a HEAD request on every
+            # url we cannot know ahead of time for sure if something is HTML
+            # or not. However we can check after we've downloaded it.
+            content_type = resp.headers.get('Content-Type', 'unknown')
+            if not content_type.lower().startswith("text/html"):
+                logger.debug(
+                    'Skipping page %s because of Content-Type: %s',
+                    link,
+                    content_type,
+                )
+                return
+
+            inst = cls(resp.content, resp.url, resp.headers)
+        except requests.HTTPError as exc:
+            cls._handle_fail(link, exc, url)
+        except SSLError as exc:
+            reason = ("There was a problem confirming the ssl certificate: "
+                      "%s" % exc)
+            cls._handle_fail(link, reason, url, meth=logger.info)
+        except requests.ConnectionError as exc:
+            cls._handle_fail(link, "connection error: %s" % exc, url)
+        except requests.Timeout:
+            cls._handle_fail(link, "timed out", url)
+        else:
+            return inst
+
+    @staticmethod
+    def _handle_fail(link, reason, url, meth=None):
+        if meth is None:
+            meth = logger.debug
+
+        meth("Could not fetch URL %s: %s - skipping", link, reason)
+
+    @staticmethod
+    def _get_content_type(url, session):
+        """Get the Content-Type of the given url, using a HEAD request"""
+        scheme, netloc, path, query, fragment = urllib_parse.urlsplit(url)
+        if scheme not in ('http', 'https'):
+            # FIXME: some warning or something?
+            # assertion error?
+            return ''
+
+        resp = session.head(url, allow_redirects=True)
+        resp.raise_for_status()
+
+        return resp.headers.get("Content-Type", "")
+
+    @cached_property
+    def base_url(self):
+        bases = [
+            x for x in self.parsed.findall(".//base")
+            if x.get("href") is not None
+        ]
+        if bases and bases[0].get("href"):
+            return bases[0].get("href")
+        else:
+            return self.url
+
+    @property
+    def links(self):
+        """Yields all links in the page"""
+        for anchor in self.parsed.findall(".//a"):
+            if anchor.get("href"):
+                href = anchor.get("href")
+                url = self.clean_link(
+                    urllib_parse.urljoin(self.base_url, href)
+                )
+                pyrequire = anchor.get('data-requires-python')
+                pyrequire = unescape(pyrequire) if pyrequire else None
+                yield Link(url, self, requires_python=pyrequire)
+
+    _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I)
+
+    def clean_link(self, url):
+        """Makes sure a link is fully encoded.  That is, if a ' ' shows up in
+        the link, it will be rewritten to %20 (while not over-quoting
+        % or other characters)."""
+        return self._clean_re.sub(
+            lambda match: '%%%2x' % ord(match.group(0)), url)
+
+
+class Link(object):
+
+    def __init__(self, url, comes_from=None, requires_python=None):
+        """
+        Object representing a parsed link from https://pypi.python.org/simple/*
+
+        url:
+            url of the resource pointed to (href of the link)
+        comes_from:
+            instance of HTMLPage where the link was found, or string.
+        requires_python:
+            String containing the `Requires-Python` metadata field, specified
+            in PEP 345. This may be specified by a data-requires-python
+            attribute in the HTML link tag, as described in PEP 503.
+        """
+
+        # url can be a UNC windows share
+        if url.startswith('\\\\'):
+            url = path_to_url(url)
+
+        self.url = url
+        self.comes_from = comes_from
+        self.requires_python = requires_python if requires_python else None
+
+    def __str__(self):
+        if self.requires_python:
+            rp = ' (requires-python:%s)' % self.requires_python
+        else:
+            rp = ''
+        if self.comes_from:
+            return '%s (from %s)%s' % (self.url, self.comes_from, rp)
+        else:
+            return str(self.url)
+
+    def __repr__(self):
+        return '<Link %s>' % self
+
+    def __eq__(self, other):
+        if not isinstance(other, Link):
+            return NotImplemented
+        return self.url == other.url
+
+    def __ne__(self, other):
+        if not isinstance(other, Link):
+            return NotImplemented
+        return self.url != other.url
+
+    def __lt__(self, other):
+        if not isinstance(other, Link):
+            return NotImplemented
+        return self.url < other.url
+
+    def __le__(self, other):
+        if not isinstance(other, Link):
+            return NotImplemented
+        return self.url <= other.url
+
+    def __gt__(self, other):
+        if not isinstance(other, Link):
+            return NotImplemented
+        return self.url > other.url
+
+    def __ge__(self, other):
+        if not isinstance(other, Link):
+            return NotImplemented
+        return self.url >= other.url
+
+    def __hash__(self):
+        return hash(self.url)
+
+    @property
+    def filename(self):
+        _, netloc, path, _, _ = urllib_parse.urlsplit(self.url)
+        name = posixpath.basename(path.rstrip('/')) or netloc
+        name = urllib_parse.unquote(name)
+        assert name, ('URL %r produced no filename' % self.url)
+        return name
+
+    @property
+    def scheme(self):
+        return urllib_parse.urlsplit(self.url)[0]
+
+    @property
+    def netloc(self):
+        return urllib_parse.urlsplit(self.url)[1]
+
+    @property
+    def path(self):
+        return urllib_parse.unquote(urllib_parse.urlsplit(self.url)[2])
+
+    def splitext(self):
+        return splitext(posixpath.basename(self.path.rstrip('/')))
+
+    @property
+    def ext(self):
+        return self.splitext()[1]
+
+    @property
+    def url_without_fragment(self):
+        scheme, netloc, path, query, fragment = urllib_parse.urlsplit(self.url)
+        return urllib_parse.urlunsplit((scheme, netloc, path, query, None))
+
+    _egg_fragment_re = re.compile(r'[#&]egg=([^&]*)')
+
+    @property
+    def egg_fragment(self):
+        match = self._egg_fragment_re.search(self.url)
+        if not match:
+            return None
+        return match.group(1)
+
+    _subdirectory_fragment_re = re.compile(r'[#&]subdirectory=([^&]*)')
+
+    @property
+    def subdirectory_fragment(self):
+        match = self._subdirectory_fragment_re.search(self.url)
+        if not match:
+            return None
+        return match.group(1)
+
+    _hash_re = re.compile(
+        r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)'
+    )
+
+    @property
+    def hash(self):
+        match = self._hash_re.search(self.url)
+        if match:
+            return match.group(2)
+        return None
+
+    @property
+    def hash_name(self):
+        match = self._hash_re.search(self.url)
+        if match:
+            return match.group(1)
+        return None
+
+    @property
+    def show_url(self):
+        return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0])
+
+    @property
+    def is_wheel(self):
+        return self.ext == wheel_ext
+
+    @property
+    def is_artifact(self):
+        """
+        Determines if this points to an actual artifact (e.g. a tarball) or if
+        it points to an "abstract" thing like a path or a VCS location.
+        """
+        from pip.vcs import vcs
+
+        if self.scheme in vcs.all_schemes:
+            return False
+
+        return True
+
+
+FormatControl = namedtuple('FormatControl', 'no_binary only_binary')
+"""This object has two fields, no_binary and only_binary.
+
+If a field is falsy, it isn't set. If it is {':all:'}, it should match all
+packages except those listed in the other field. Only one field can be set
+to {':all:'} at a time. The rest of the time exact package name matches
+are listed, with any given package only showing up in one field at a time.
+"""
+
+
+def fmt_ctl_handle_mutual_exclude(value, target, other):
+    new = value.split(',')
+    while ':all:' in new:
+        other.clear()
+        target.clear()
+        target.add(':all:')
+        del new[:new.index(':all:') + 1]
+        if ':none:' not in new:
+            # Without a none, we want to discard everything as :all: covers it
+            return
+    for name in new:
+        if name == ':none:':
+            target.clear()
+            continue
+        name = canonicalize_name(name)
+        other.discard(name)
+        target.add(name)
+
+
+def fmt_ctl_formats(fmt_ctl, canonical_name):
+    result = set(["binary", "source"])
+    if canonical_name in fmt_ctl.only_binary:
+        result.discard('source')
+    elif canonical_name in fmt_ctl.no_binary:
+        result.discard('binary')
+    elif ':all:' in fmt_ctl.only_binary:
+        result.discard('source')
+    elif ':all:' in fmt_ctl.no_binary:
+        result.discard('binary')
+    return frozenset(result)
+
+
+def fmt_ctl_no_binary(fmt_ctl):
+    fmt_ctl_handle_mutual_exclude(
+        ':all:', fmt_ctl.no_binary, fmt_ctl.only_binary)
+
+
+def fmt_ctl_no_use_wheel(fmt_ctl):
+    fmt_ctl_no_binary(fmt_ctl)
+    warnings.warn(
+        '--no-use-wheel is deprecated and will be removed in the future. '
+        ' Please use --no-binary :all: instead.', RemovedInPip10Warning,
+        stacklevel=2)
+
+
+Search = namedtuple('Search', 'supplied canonical formats')
+"""Capture key aspects of a search.
+
+:attribute supplied: The user supplied package.
+:attribute canonical: The canonical package name.
+:attribute formats: The formats allowed for this package. Should be a set
+    with 'binary' or 'source' or both in it.
+"""
diff --git a/vendor/pip-9.0.3/pip/locations.py b/vendor/pip-9.0.3/pip/locations.py
new file mode 100644
index 0000000000000000000000000000000000000000..e598ef105a440e371a9127da646ed1dcf877844f
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/locations.py
@@ -0,0 +1,182 @@
+"""Locations where we look for configs, install stuff, etc"""
+from __future__ import absolute_import
+
+import os
+import os.path
+import site
+import sys
+
+from distutils import sysconfig
+from distutils.command.install import install, SCHEME_KEYS  # noqa
+
+from pip.compat import WINDOWS, expanduser
+from pip.utils import appdirs
+
+
+# Application Directories
+USER_CACHE_DIR = appdirs.user_cache_dir("pip")
+
+
+DELETE_MARKER_MESSAGE = '''\
+This file is placed here by pip to indicate the source was put
+here by pip.
+
+Once this package is successfully installed this source code will be
+deleted (unless you remove this file).
+'''
+PIP_DELETE_MARKER_FILENAME = 'pip-delete-this-directory.txt'
+
+
+def write_delete_marker_file(directory):
+    """
+    Write the pip delete marker file into this directory.
+    """
+    filepath = os.path.join(directory, PIP_DELETE_MARKER_FILENAME)
+    with open(filepath, 'w') as marker_fp:
+        marker_fp.write(DELETE_MARKER_MESSAGE)
+
+
+def running_under_virtualenv():
+    """
+    Return True if we're running inside a virtualenv, False otherwise.
+
+    """
+    if hasattr(sys, 'real_prefix'):
+        return True
+    elif sys.prefix != getattr(sys, "base_prefix", sys.prefix):
+        return True
+
+    return False
+
+
+def virtualenv_no_global():
+    """
+    Return True if in a venv and no system site packages.
+    """
+    # this mirrors the logic in virtualenv.py for locating the
+    # no-global-site-packages.txt file
+    site_mod_dir = os.path.dirname(os.path.abspath(site.__file__))
+    no_global_file = os.path.join(site_mod_dir, 'no-global-site-packages.txt')
+    if running_under_virtualenv() and os.path.isfile(no_global_file):
+        return True
+
+
+if running_under_virtualenv():
+    src_prefix = os.path.join(sys.prefix, 'src')
+else:
+    # FIXME: keep src in cwd for now (it is not a temporary folder)
+    try:
+        src_prefix = os.path.join(os.getcwd(), 'src')
+    except OSError:
+        # In case the current working directory has been renamed or deleted
+        sys.exit(
+            "The folder you are executing pip from can no longer be found."
+        )
+
+# under macOS + virtualenv sys.prefix is not properly resolved
+# it is something like /path/to/python/bin/..
+# Note: using realpath due to tmp dirs on OSX being symlinks
+src_prefix = os.path.abspath(src_prefix)
+
+# FIXME doesn't account for venv linked to global site-packages
+
+site_packages = sysconfig.get_python_lib()
+user_site = site.USER_SITE
+user_dir = expanduser('~')
+if WINDOWS:
+    bin_py = os.path.join(sys.prefix, 'Scripts')
+    bin_user = os.path.join(user_site, 'Scripts')
+    # buildout uses 'bin' on Windows too?
+    if not os.path.exists(bin_py):
+        bin_py = os.path.join(sys.prefix, 'bin')
+        bin_user = os.path.join(user_site, 'bin')
+
+    config_basename = 'pip.ini'
+
+    legacy_storage_dir = os.path.join(user_dir, 'pip')
+    legacy_config_file = os.path.join(
+        legacy_storage_dir,
+        config_basename,
+    )
+else:
+    bin_py = os.path.join(sys.prefix, 'bin')
+    bin_user = os.path.join(user_site, 'bin')
+
+    config_basename = 'pip.conf'
+
+    legacy_storage_dir = os.path.join(user_dir, '.pip')
+    legacy_config_file = os.path.join(
+        legacy_storage_dir,
+        config_basename,
+    )
+
+    # Forcing to use /usr/local/bin for standard macOS framework installs
+    # Also log to ~/Library/Logs/ for use with the Console.app log viewer
+    if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/':
+        bin_py = '/usr/local/bin'
+
+site_config_files = [
+    os.path.join(path, config_basename)
+    for path in appdirs.site_config_dirs('pip')
+]
+
+
+def distutils_scheme(dist_name, user=False, home=None, root=None,
+                     isolated=False, prefix=None):
+    """
+    Return a distutils install scheme
+    """
+    from distutils.dist import Distribution
+
+    scheme = {}
+
+    if isolated:
+        extra_dist_args = {"script_args": ["--no-user-cfg"]}
+    else:
+        extra_dist_args = {}
+    dist_args = {'name': dist_name}
+    dist_args.update(extra_dist_args)
+
+    d = Distribution(dist_args)
+    d.parse_config_files()
+    i = d.get_command_obj('install', create=True)
+    # NOTE: setting user or home has the side-effect of creating the home dir
+    # or user base for installations during finalize_options()
+    # ideally, we'd prefer a scheme class that has no side-effects.
+    assert not (user and prefix), "user={0} prefix={1}".format(user, prefix)
+    i.user = user or i.user
+    if user:
+        i.prefix = ""
+    i.prefix = prefix or i.prefix
+    i.home = home or i.home
+    i.root = root or i.root
+    i.finalize_options()
+    for key in SCHEME_KEYS:
+        scheme[key] = getattr(i, 'install_' + key)
+
+    # install_lib specified in setup.cfg should install *everything*
+    # into there (i.e. it takes precedence over both purelib and
+    # platlib).  Note, i.install_lib is *always* set after
+    # finalize_options(); we only want to override here if the user
+    # has explicitly requested it hence going back to the config
+    if 'install_lib' in d.get_option_dict('install'):
+        scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib))
+
+    if running_under_virtualenv():
+        scheme['headers'] = os.path.join(
+            sys.prefix,
+            'include',
+            'site',
+            'python' + sys.version[:3],
+            dist_name,
+        )
+
+        if root is not None:
+            path_no_drive = os.path.splitdrive(
+                os.path.abspath(scheme["headers"]))[1]
+            scheme["headers"] = os.path.join(
+                root,
+                path_no_drive[1:],
+            )
+
+    return scheme
diff --git a/vendor/pip-9.0.3/pip/models/__init__.py b/vendor/pip-9.0.3/pip/models/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..1d727d7eea7ba617ebb5921be0c2f4d314cd06ed
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/models/__init__.py
@@ -0,0 +1,4 @@
+from pip.models.index import Index, PyPI
+
+
+__all__ = ["Index", "PyPI"]
diff --git a/vendor/pip-9.0.3/pip/models/index.py b/vendor/pip-9.0.3/pip/models/index.py
new file mode 100644
index 0000000000000000000000000000000000000000..be9911988cf7d7e4231ca7256f3e7311d8e8a5f5
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/models/index.py
@@ -0,0 +1,16 @@
+from pip._vendor.six.moves.urllib import parse as urllib_parse
+
+
+class Index(object):
+    def __init__(self, url):
+        self.url = url
+        self.netloc = urllib_parse.urlsplit(url).netloc
+        self.simple_url = self.url_to_path('simple')
+        self.pypi_url = self.url_to_path('pypi')
+        self.pip_json_url = self.url_to_path('pypi/pip/json')
+
+    def url_to_path(self, path):
+        return urllib_parse.urljoin(self.url, path)
+
+
+PyPI = Index('https://pypi.python.org/')
diff --git a/vendor/pip-9.0.3/pip/operations/__init__.py b/vendor/pip-9.0.3/pip/operations/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/vendor/pip-9.0.3/pip/operations/check.py b/vendor/pip-9.0.3/pip/operations/check.py
new file mode 100644
index 0000000000000000000000000000000000000000..2cf67aaeaf4023887e383482ef6086826caeb225
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/operations/check.py
@@ -0,0 +1,49 @@
+
+
+def check_requirements(installed_dists):
+    missing_reqs_dict = {}
+    incompatible_reqs_dict = {}
+
+    for dist in installed_dists:
+        key = '%s==%s' % (dist.project_name, dist.version)
+
+        missing_reqs = list(get_missing_reqs(dist, installed_dists))
+        if missing_reqs:
+            missing_reqs_dict[key] = missing_reqs
+
+        incompatible_reqs = list(get_incompatible_reqs(
+            dist, installed_dists))
+        if incompatible_reqs:
+            incompatible_reqs_dict[key] = incompatible_reqs
+
+    return (missing_reqs_dict, incompatible_reqs_dict)
+
+
+def get_missing_reqs(dist, installed_dists):
+    """Return all of the requirements of `dist` that aren't present in
+    `installed_dists`.
+
+    """
+    installed_names = set(d.project_name.lower() for d in installed_dists)
+    missing_requirements = set()
+
+    for requirement in dist.requires():
+        if requirement.project_name.lower() not in installed_names:
+            missing_requirements.add(requirement)
+            yield requirement
+
+
+def get_incompatible_reqs(dist, installed_dists):
+    """Return all of the requirements of `dist` that are present in
+    `installed_dists`, but have incompatible versions.
+
+    """
+    installed_dists_by_name = {}
+    for installed_dist in installed_dists:
+        installed_dists_by_name[installed_dist.project_name] = installed_dist
+
+    for requirement in dist.requires():
+        present_dist = installed_dists_by_name.get(requirement.project_name)
+
+        if present_dist and present_dist not in requirement:
+            yield (requirement, present_dist)
diff --git a/vendor/pip-9.0.3/pip/operations/freeze.py b/vendor/pip-9.0.3/pip/operations/freeze.py
new file mode 100644
index 0000000000000000000000000000000000000000..920c2c12848c31853af6cefc35efddc8e08d3b9e
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/operations/freeze.py
@@ -0,0 +1,132 @@
+from __future__ import absolute_import
+
+import logging
+import re
+
+import pip
+from pip.req import InstallRequirement
+from pip.req.req_file import COMMENT_RE
+from pip.utils import get_installed_distributions
+from pip._vendor import pkg_resources
+from pip._vendor.packaging.utils import canonicalize_name
+from pip._vendor.pkg_resources import RequirementParseError
+
+
+logger = logging.getLogger(__name__)
+
+
+def freeze(
+        requirement=None,
+        find_links=None, local_only=None, user_only=None, skip_regex=None,
+        default_vcs=None,
+        isolated=False,
+        wheel_cache=None,
+        skip=()):
+    find_links = find_links or []
+    skip_match = None
+
+    if skip_regex:
+        skip_match = re.compile(skip_regex).search
+
+    dependency_links = []
+
+    for dist in pkg_resources.working_set:
+        if dist.has_metadata('dependency_links.txt'):
+            dependency_links.extend(
+                dist.get_metadata_lines('dependency_links.txt')
+            )
+    for link in find_links:
+        if '#egg=' in link:
+            dependency_links.append(link)
+    for link in find_links:
+        yield '-f %s' % link
+    installations = {}
+    for dist in get_installed_distributions(local_only=local_only,
+                                            skip=(),
+                                            user_only=user_only):
+        try:
+            req = pip.FrozenRequirement.from_dist(
+                dist,
+                dependency_links
+            )
+        except RequirementParseError:
+            logger.warning(
+                "Could not parse requirement: %s",
+                dist.project_name
+            )
+            continue
+        installations[req.name] = req
+
+    if requirement:
+        # the options that don't get turned into an InstallRequirement
+        # should only be emitted once, even if the same option is in multiple
+        # requirements files, so we need to keep track of what has been emitted
+        # so that we don't emit it again if it's seen again
+        emitted_options = set()
+        for req_file_path in requirement:
+            with open(req_file_path) as req_file:
+                for line in req_file:
+                    if (not line.strip() or
+                            line.strip().startswith('#') or
+                            (skip_match and skip_match(line)) or
+                            line.startswith((
+                                '-r', '--requirement',
+                                '-Z', '--always-unzip',
+                                '-f', '--find-links',
+                                '-i', '--index-url',
+                                '--pre',
+                                '--trusted-host',
+                                '--process-dependency-links',
+                                '--extra-index-url'))):
+                        line = line.rstrip()
+                        if line not in emitted_options:
+                            emitted_options.add(line)
+                            yield line
+                        continue
+
+                    if line.startswith('-e') or line.startswith('--editable'):
+                        if line.startswith('-e'):
+                            line = line[2:].strip()
+                        else:
+                            line = line[len('--editable'):].strip().lstrip('=')
+                        line_req = InstallRequirement.from_editable(
+                            line,
+                            default_vcs=default_vcs,
+                            isolated=isolated,
+                            wheel_cache=wheel_cache,
+                        )
+                    else:
+                        line_req = InstallRequirement.from_line(
+                            COMMENT_RE.sub('', line).strip(),
+                            isolated=isolated,
+                            wheel_cache=wheel_cache,
+                        )
+
+                    if not line_req.name:
+                        logger.info(
+                            "Skipping line in requirement file [%s] because "
+                            "it's not clear what it would install: %s",
+                            req_file_path, line.strip(),
+                        )
+                        logger.info(
+                            "  (add #egg=PackageName to the URL to avoid"
+                            " this warning)"
+                        )
+                    elif line_req.name not in installations:
+                        logger.warning(
+                            "Requirement file [%s] contains %s, but that "
+                            "package is not installed",
+                            req_file_path, COMMENT_RE.sub('', line).strip(),
+                        )
+                    else:
+                        yield str(installations[line_req.name]).rstrip()
+                        del installations[line_req.name]
+
+        yield(
+            '## The following requirements were added by '
+            'pip freeze:'
+        )
+    for installation in sorted(
+            installations.values(), key=lambda x: x.name.lower()):
+        if canonicalize_name(installation.name) not in skip:
+            yield str(installation).rstrip()
diff --git a/vendor/pip-9.0.3/pip/pep425tags.py b/vendor/pip-9.0.3/pip/pep425tags.py
new file mode 100644
index 0000000000000000000000000000000000000000..ad202ef313f57697c79dc0a4802956d1d49a7b4e
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/pep425tags.py
@@ -0,0 +1,324 @@
+"""Generate and work with PEP 425 Compatibility Tags."""
+from __future__ import absolute_import
+
+import re
+import sys
+import warnings
+import platform
+import logging
+
+try:
+    import sysconfig
+except ImportError:  # pragma nocover
+    # Python < 2.7
+    import distutils.sysconfig as sysconfig
+import distutils.util
+
+from pip.compat import OrderedDict
+import pip.utils.glibc
+
+logger = logging.getLogger(__name__)
+
+_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)')
+
+
+def get_config_var(var):
+    try:
+        return sysconfig.get_config_var(var)
+    except IOError as e:  # Issue #1074
+        warnings.warn("{0}".format(e), RuntimeWarning)
+        return None
+
+
+def get_abbr_impl():
+    """Return abbreviated implementation name."""
+    if hasattr(sys, 'pypy_version_info'):
+        pyimpl = 'pp'
+    elif sys.platform.startswith('java'):
+        pyimpl = 'jy'
+    elif sys.platform == 'cli':
+        pyimpl = 'ip'
+    else:
+        pyimpl = 'cp'
+    return pyimpl
+
+
+def get_impl_ver():
+    """Return implementation version."""
+    impl_ver = get_config_var("py_version_nodot")
+    if not impl_ver or get_abbr_impl() == 'pp':
+        impl_ver = ''.join(map(str, get_impl_version_info()))
+    return impl_ver
+
+
+def get_impl_version_info():
+    """Return sys.version_info-like tuple for use in decrementing the minor
+    version."""
+    if get_abbr_impl() == 'pp':
+        # as per https://github.com/pypa/pip/issues/2882
+        return (sys.version_info[0], sys.pypy_version_info.major,
+                sys.pypy_version_info.minor)
+    else:
+        return sys.version_info[0], sys.version_info[1]
+
+
+def get_impl_tag():
+    """
+    Returns the Tag for this specific implementation.
+    """
+    return "{0}{1}".format(get_abbr_impl(), get_impl_ver())
+
+
+def get_flag(var, fallback, expected=True, warn=True):
+    """Use a fallback method for determining SOABI flags if the needed config
+    var is unset or unavailable."""
+    val = get_config_var(var)
+    if val is None:
+        if warn:
+            logger.debug("Config variable '%s' is unset, Python ABI tag may "
+                         "be incorrect", var)
+        return fallback()
+    return val == expected
+
+
+def get_abi_tag():
+    """Return the ABI tag based on SOABI (if available) or emulate SOABI
+    (CPython 2, PyPy)."""
+    soabi = get_config_var('SOABI')
+    impl = get_abbr_impl()
+    if not soabi and impl in ('cp', 'pp') and hasattr(sys, 'maxunicode'):
+        d = ''
+        m = ''
+        u = ''
+        if get_flag('Py_DEBUG',
+                    lambda: hasattr(sys, 'gettotalrefcount'),
+                    warn=(impl == 'cp')):
+            d = 'd'
+        if get_flag('WITH_PYMALLOC',
+                    lambda: impl == 'cp',
+                    warn=(impl == 'cp')):
+            m = 'm'
+        if get_flag('Py_UNICODE_SIZE',
+                    lambda: sys.maxunicode == 0x10ffff,
+                    expected=4,
+                    warn=(impl == 'cp' and
+                          sys.version_info < (3, 3))) \
+                and sys.version_info < (3, 3):
+            u = 'u'
+        abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u)
+    elif soabi and soabi.startswith('cpython-'):
+        abi = 'cp' + soabi.split('-')[1]
+    elif soabi:
+        abi = soabi.replace('.', '_').replace('-', '_')
+    else:
+        abi = None
+    return abi
+
+
+def _is_running_32bit():
+    return sys.maxsize == 2147483647
+
+
+def get_platform():
+    """Return our platform name 'win32', 'linux_x86_64'"""
+    if sys.platform == 'darwin':
+        # distutils.util.get_platform() returns the release based on the value
+        # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may
+        # be significantly older than the user's current machine.
+        release, _, machine = platform.mac_ver()
+        split_ver = release.split('.')
+
+        if machine == "x86_64" and _is_running_32bit():
+            machine = "i386"
+        elif machine == "ppc64" and _is_running_32bit():
+            machine = "ppc"
+
+        return 'macosx_{0}_{1}_{2}'.format(split_ver[0], split_ver[1], machine)
+
+    # XXX remove distutils dependency
+    result = distutils.util.get_platform().replace('.', '_').replace('-', '_')
+    if result == "linux_x86_64" and _is_running_32bit():
+        # 32 bit Python program (running on a 64 bit Linux): pip should only
+        # install and run 32 bit compiled extensions in that case.
+        result = "linux_i686"
+
+    return result
+
+
+def is_manylinux1_compatible():
+    # Only Linux, and only x86-64 / i686
+    if get_platform() not in ("linux_x86_64", "linux_i686"):
+        return False
+
+    # Check for presence of _manylinux module
+    try:
+        import _manylinux
+        return bool(_manylinux.manylinux1_compatible)
+    except (ImportError, AttributeError):
+        # Fall through to heuristic check below
+        pass
+
+    # Check glibc version. CentOS 5 uses glibc 2.5.
+    return pip.utils.glibc.have_compatible_glibc(2, 5)
+
+
+def get_darwin_arches(major, minor, machine):
+    """Return a list of supported arches (including group arches) for
+    the given major, minor and machine architecture of an macOS machine.
+    """
+    arches = []
+
+    def _supports_arch(major, minor, arch):
+        # Looking at the application support for macOS versions in the chart
+        # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears
+        # our timeline looks roughly like:
+        #
+        # 10.0 - Introduces ppc support.
+        # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64
+        #        and x86_64 support is CLI only, and cannot be used for GUI
+        #        applications.
+        # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications.
+        # 10.6 - Drops support for ppc64
+        # 10.7 - Drops support for ppc
+        #
+        # Given that we do not know if we're installing a CLI or a GUI
+        # application, we must be conservative and assume it might be a GUI
+        # application and behave as if ppc64 and x86_64 support did not occur
+        # until 10.5.
+        #
+        # Note: The above information is taken from the "Application support"
+        #       column in the chart not the "Processor support" since I believe
+        #       that we care about what instruction sets an application can use
+        #       not which processors the OS supports.
+        if arch == 'ppc':
+            return (major, minor) <= (10, 5)
+        if arch == 'ppc64':
+            return (major, minor) == (10, 5)
+        if arch == 'i386':
+            return (major, minor) >= (10, 4)
+        if arch == 'x86_64':
+            return (major, minor) >= (10, 5)
+        if arch in groups:
+            for garch in groups[arch]:
+                if _supports_arch(major, minor, garch):
+                    return True
+        return False
+
+    groups = OrderedDict([
+        ("fat", ("i386", "ppc")),
+        ("intel", ("x86_64", "i386")),
+        ("fat64", ("x86_64", "ppc64")),
+        ("fat32", ("x86_64", "i386", "ppc")),
+    ])
+
+    if _supports_arch(major, minor, machine):
+        arches.append(machine)
+
+    for garch in groups:
+        if machine in groups[garch] and _supports_arch(major, minor, garch):
+            arches.append(garch)
+
+    arches.append('universal')
+
+    return arches
+
+
+def get_supported(versions=None, noarch=False, platform=None,
+                  impl=None, abi=None):
+    """Return a list of supported tags for each version specified in
+    `versions`.
+
+    :param versions: a list of string versions, of the form ["33", "32"],
+        or None. The first version will be assumed to support our ABI.
+    :param platform: specify the exact platform you want valid
+        tags for, or None. If None, use the local system platform.
+    :param impl: specify the exact implementation you want valid
+        tags for, or None. If None, use the local interpreter impl.
+    :param abi: specify the exact abi you want valid
+        tags for, or None. If None, use the local interpreter abi.
+    """
+    supported = []
+
+    # Versions must be given with respect to the preference
+    if versions is None:
+        versions = []
+        version_info = get_impl_version_info()
+        major = version_info[:-1]
+        # Support all previous minor Python versions.
+        for minor in range(version_info[-1], -1, -1):
+            versions.append(''.join(map(str, major + (minor,))))
+
+    impl = impl or get_abbr_impl()
+
+    abis = []
+
+    abi = abi or get_abi_tag()
+    if abi:
+        abis[0:0] = [abi]
+
+    abi3s = set()
+    import imp
+    for suffix in imp.get_suffixes():
+        if suffix[0].startswith('.abi'):
+            abi3s.add(suffix[0].split('.', 2)[1])
+
+    abis.extend(sorted(list(abi3s)))
+
+    abis.append('none')
+
+    if not noarch:
+        arch = platform or get_platform()
+        if arch.startswith('macosx'):
+            # support macosx-10.6-intel on macosx-10.9-x86_64
+            match = _osx_arch_pat.match(arch)
+            if match:
+                name, major, minor, actual_arch = match.groups()
+                tpl = '{0}_{1}_%i_%s'.format(name, major)
+                arches = []
+                for m in reversed(range(int(minor) + 1)):
+                    for a in get_darwin_arches(int(major), m, actual_arch):
+                        arches.append(tpl % (m, a))
+            else:
+                # arch pattern didn't match (?!)
+                arches = [arch]
+        elif platform is None and is_manylinux1_compatible():
+            arches = [arch.replace('linux', 'manylinux1'), arch]
+        else:
+            arches = [arch]
+
+        # Current version, current API (built specifically for our Python):
+        for abi in abis:
+            for arch in arches:
+                supported.append(('%s%s' % (impl, versions[0]), abi, arch))
+
+        # abi3 modules compatible with older version of Python
+        for version in versions[1:]:
+            # abi3 was introduced in Python 3.2
+            if version in ('31', '30'):
+                break
+            for abi in abi3s:   # empty set if not Python 3
+                for arch in arches:
+                    supported.append(("%s%s" % (impl, version), abi, arch))
+
+        # Has binaries, does not use the Python API:
+        for arch in arches:
+            supported.append(('py%s' % (versions[0][0]), 'none', arch))
+
+    # No abi / arch, but requires our implementation:
+    supported.append(('%s%s' % (impl, versions[0]), 'none', 'any'))
+    # Tagged specifically as being cross-version compatible
+    # (with just the major version specified)
+    supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any'))
+
+    # No abi / arch, generic Python
+    for i, version in enumerate(versions):
+        supported.append(('py%s' % (version,), 'none', 'any'))
+        if i == 0:
+            supported.append(('py%s' % (version[0]), 'none', 'any'))
+
+    return supported
+
+supported_tags = get_supported()
+supported_tags_noarch = get_supported(noarch=True)
+
+implementation_tag = get_impl_tag()
diff --git a/vendor/pip-9.0.3/pip/req/__init__.py b/vendor/pip-9.0.3/pip/req/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..00185a4308337a11602f40dc238e93d9b3d47f2d
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/req/__init__.py
@@ -0,0 +1,10 @@
+from __future__ import absolute_import
+
+from .req_install import InstallRequirement
+from .req_set import RequirementSet, Requirements
+from .req_file import parse_requirements
+
+__all__ = [
+    "RequirementSet", "Requirements", "InstallRequirement",
+    "parse_requirements",
+]
diff --git a/vendor/pip-9.0.3/pip/req/req_file.py b/vendor/pip-9.0.3/pip/req/req_file.py
new file mode 100644
index 0000000000000000000000000000000000000000..821df2271db505f1f6cb4ad612868251361cb99b
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/req/req_file.py
@@ -0,0 +1,342 @@
+"""
+Requirements file parsing
+"""
+
+from __future__ import absolute_import
+
+import os
+import re
+import shlex
+import sys
+import optparse
+import warnings
+
+from pip._vendor.six.moves.urllib import parse as urllib_parse
+from pip._vendor.six.moves import filterfalse
+
+import pip
+from pip.download import get_file_content
+from pip.req.req_install import InstallRequirement
+from pip.exceptions import (RequirementsFileParseError)
+from pip.utils.deprecation import RemovedInPip10Warning
+from pip import cmdoptions
+
+__all__ = ['parse_requirements']
+
+SCHEME_RE = re.compile(r'^(http|https|file):', re.I)
+COMMENT_RE = re.compile(r'(^|\s)+#.*$')
+
+SUPPORTED_OPTIONS = [
+    cmdoptions.constraints,
+    cmdoptions.editable,
+    cmdoptions.requirements,
+    cmdoptions.no_index,
+    cmdoptions.index_url,
+    cmdoptions.find_links,
+    cmdoptions.extra_index_url,
+    cmdoptions.allow_external,
+    cmdoptions.allow_all_external,
+    cmdoptions.no_allow_external,
+    cmdoptions.allow_unsafe,
+    cmdoptions.no_allow_unsafe,
+    cmdoptions.use_wheel,
+    cmdoptions.no_use_wheel,
+    cmdoptions.always_unzip,
+    cmdoptions.no_binary,
+    cmdoptions.only_binary,
+    cmdoptions.pre,
+    cmdoptions.process_dependency_links,
+    cmdoptions.trusted_host,
+    cmdoptions.require_hashes,
+]
+
+# options to be passed to requirements
+SUPPORTED_OPTIONS_REQ = [
+    cmdoptions.install_options,
+    cmdoptions.global_options,
+    cmdoptions.hash,
+]
+
+# the 'dest' string values
+SUPPORTED_OPTIONS_REQ_DEST = [o().dest for o in SUPPORTED_OPTIONS_REQ]
+
+
+def parse_requirements(filename, finder=None, comes_from=None, options=None,
+                       session=None, constraint=False, wheel_cache=None):
+    """Parse a requirements file and yield InstallRequirement instances.
+
+    :param filename:    Path or url of requirements file.
+    :param finder:      Instance of pip.index.PackageFinder.
+    :param comes_from:  Origin description of requirements.
+    :param options:     cli options.
+    :param session:     Instance of pip.download.PipSession.
+    :param constraint:  If true, parsing a constraint file rather than
+        requirements file.
+    :param wheel_cache: Instance of pip.wheel.WheelCache
+    """
+    if session is None:
+        raise TypeError(
+            "parse_requirements() missing 1 required keyword argument: "
+            "'session'"
+        )
+
+    _, content = get_file_content(
+        filename, comes_from=comes_from, session=session
+    )
+
+    lines_enum = preprocess(content, options)
+
+    for line_number, line in lines_enum:
+        req_iter = process_line(line, filename, line_number, finder,
+                                comes_from, options, session, wheel_cache,
+                                constraint=constraint)
+        for req in req_iter:
+            yield req
+
+
+def preprocess(content, options):
+    """Split, filter, and join lines, and return a line iterator
+
+    :param content: the content of the requirements file
+    :param options: cli options
+    """
+    lines_enum = enumerate(content.splitlines(), start=1)
+    lines_enum = join_lines(lines_enum)
+    lines_enum = ignore_comments(lines_enum)
+    lines_enum = skip_regex(lines_enum, options)
+    return lines_enum
+
+
+def process_line(line, filename, line_number, finder=None, comes_from=None,
+                 options=None, session=None, wheel_cache=None,
+                 constraint=False):
+    """Process a single requirements line; This can result in creating/yielding
+    requirements, or updating the finder.
+
+    For lines that contain requirements, the only options that have an effect
+    are from SUPPORTED_OPTIONS_REQ, and they are scoped to the
+    requirement. Other options from SUPPORTED_OPTIONS may be present, but are
+    ignored.
+
+    For lines that do not contain requirements, the only options that have an
+    effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may
+    be present, but are ignored. These lines may contain multiple options
+    (although our docs imply only one is supported), and all our parsed and
+    affect the finder.
+
+    :param constraint: If True, parsing a constraints file.
+    :param options: OptionParser options that we may update
+    """
+    parser = build_parser()
+    defaults = parser.get_default_values()
+    defaults.index_url = None
+    if finder:
+        # `finder.format_control` will be updated during parsing
+        defaults.format_control = finder.format_control
+    args_str, options_str = break_args_options(line)
+    if sys.version_info < (2, 7, 3):
+        # Prior to 2.7.3, shlex cannot deal with unicode entries
+        options_str = options_str.encode('utf8')
+    opts, _ = parser.parse_args(shlex.split(options_str), defaults)
+
+    # preserve for the nested code path
+    line_comes_from = '%s %s (line %s)' % (
+        '-c' if constraint else '-r', filename, line_number)
+
+    # yield a line requirement
+    if args_str:
+        isolated = options.isolated_mode if options else False
+        if options:
+            cmdoptions.check_install_build_global(options, opts)
+        # get the options that apply to requirements
+        req_options = {}
+        for dest in SUPPORTED_OPTIONS_REQ_DEST:
+            if dest in opts.__dict__ and opts.__dict__[dest]:
+                req_options[dest] = opts.__dict__[dest]
+        yield InstallRequirement.from_line(
+            args_str, line_comes_from, constraint=constraint,
+            isolated=isolated, options=req_options, wheel_cache=wheel_cache
+        )
+
+    # yield an editable requirement
+    elif opts.editables:
+        isolated = options.isolated_mode if options else False
+        default_vcs = options.default_vcs if options else None
+        yield InstallRequirement.from_editable(
+            opts.editables[0], comes_from=line_comes_from,
+            constraint=constraint, default_vcs=default_vcs, isolated=isolated,
+            wheel_cache=wheel_cache
+        )
+
+    # parse a nested requirements file
+    elif opts.requirements or opts.constraints:
+        if opts.requirements:
+            req_path = opts.requirements[0]
+            nested_constraint = False
+        else:
+            req_path = opts.constraints[0]
+            nested_constraint = True
+        # original file is over http
+        if SCHEME_RE.search(filename):
+            # do a url join so relative paths work
+            req_path = urllib_parse.urljoin(filename, req_path)
+        # original file and nested file are paths
+        elif not SCHEME_RE.search(req_path):
+            # do a join so relative paths work
+            req_path = os.path.join(os.path.dirname(filename), req_path)
+        # TODO: Why not use `comes_from='-r {} (line {})'` here as well?
+        parser = parse_requirements(
+            req_path, finder, comes_from, options, session,
+            constraint=nested_constraint, wheel_cache=wheel_cache
+        )
+        for req in parser:
+            yield req
+
+    # percolate hash-checking option upward
+    elif opts.require_hashes:
+        options.require_hashes = opts.require_hashes
+
+    # set finder options
+    elif finder:
+        if opts.allow_external:
+            warnings.warn(
+                "--allow-external has been deprecated and will be removed in "
+                "the future. Due to changes in the repository protocol, it no "
+                "longer has any effect.",
+                RemovedInPip10Warning,
+            )
+
+        if opts.allow_all_external:
+            warnings.warn(
+                "--allow-all-external has been deprecated and will be removed "
+                "in the future. Due to changes in the repository protocol, it "
+                "no longer has any effect.",
+                RemovedInPip10Warning,
+            )
+
+        if opts.allow_unverified:
+            warnings.warn(
+                "--allow-unverified has been deprecated and will be removed "
+                "in the future. Due to changes in the repository protocol, it "
+                "no longer has any effect.",
+                RemovedInPip10Warning,
+            )
+
+        if opts.index_url:
+            finder.index_urls = [opts.index_url]
+        if opts.use_wheel is False:
+            finder.use_wheel = False
+            pip.index.fmt_ctl_no_use_wheel(finder.format_control)
+        if opts.no_index is True:
+            finder.index_urls = []
+        if opts.extra_index_urls:
+            finder.index_urls.extend(opts.extra_index_urls)
+        if opts.find_links:
+            # FIXME: it would be nice to keep track of the source
+            # of the find_links: support a find-links local path
+            # relative to a requirements file.
+            value = opts.find_links[0]
+            req_dir = os.path.dirname(os.path.abspath(filename))
+            relative_to_reqs_file = os.path.join(req_dir, value)
+            if os.path.exists(relative_to_reqs_file):
+                value = relative_to_reqs_file
+            finder.find_links.append(value)
+        if opts.pre:
+            finder.allow_all_prereleases = True
+        if opts.process_dependency_links:
+            finder.process_dependency_links = True
+        if opts.trusted_hosts:
+            finder.secure_origins.extend(
+                ("*", host, "*") for host in opts.trusted_hosts)
+
+
+def break_args_options(line):
+    """Break up the line into an args and options string.  We only want to shlex
+    (and then optparse) the options, not the args.  args can contain markers
+    which are corrupted by shlex.
+    """
+    tokens = line.split(' ')
+    args = []
+    options = tokens[:]
+    for token in tokens:
+        if token.startswith('-') or token.startswith('--'):
+            break
+        else:
+            args.append(token)
+            options.pop(0)
+    return ' '.join(args), ' '.join(options)
+
+
+def build_parser():
+    """
+    Return a parser for parsing requirement lines
+    """
+    parser = optparse.OptionParser(add_help_option=False)
+
+    option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ
+    for option_factory in option_factories:
+        option = option_factory()
+        parser.add_option(option)
+
+    # By default optparse sys.exits on parsing errors. We want to wrap
+    # that in our own exception.
+    def parser_exit(self, msg):
+        raise RequirementsFileParseError(msg)
+    parser.exit = parser_exit
+
+    return parser
+
+
+def join_lines(lines_enum):
+    """Joins a line ending in '\' with the previous line (except when following
+    comments).  The joined line takes on the index of the first line.
+    """
+    primary_line_number = None
+    new_line = []
+    for line_number, line in lines_enum:
+        if not line.endswith('\\') or COMMENT_RE.match(line):
+            if COMMENT_RE.match(line):
+                # this ensures comments are always matched later
+                line = ' ' + line
+            if new_line:
+                new_line.append(line)
+                yield primary_line_number, ''.join(new_line)
+                new_line = []
+            else:
+                yield line_number, line
+        else:
+            if not new_line:
+                primary_line_number = line_number
+            new_line.append(line.strip('\\'))
+
+    # last line contains \
+    if new_line:
+        yield primary_line_number, ''.join(new_line)
+
+    # TODO: handle space after '\'.
+
+
+def ignore_comments(lines_enum):
+    """
+    Strips comments and filter empty lines.
+    """
+    for line_number, line in lines_enum:
+        line = COMMENT_RE.sub('', line)
+        line = line.strip()
+        if line:
+            yield line_number, line
+
+
+def skip_regex(lines_enum, options):
+    """
+    Skip lines that match '--skip-requirements-regex' pattern
+
+    Note: the regex pattern is only built once
+    """
+    skip_regex = options.skip_requirements_regex if options else None
+    if skip_regex:
+        pattern = re.compile(skip_regex)
+        lines_enum = filterfalse(
+            lambda e: pattern.search(e[1]),
+            lines_enum)
+    return lines_enum
diff --git a/vendor/pip-9.0.3/pip/req/req_install.py b/vendor/pip-9.0.3/pip/req/req_install.py
new file mode 100644
index 0000000000000000000000000000000000000000..1a98f377b6f2a85cbf173b8a49027e51b8b79c7b
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/req/req_install.py
@@ -0,0 +1,1204 @@
+from __future__ import absolute_import
+
+import logging
+import os
+import re
+import shutil
+import sys
+import tempfile
+import traceback
+import warnings
+import zipfile
+
+from distutils import sysconfig
+from distutils.util import change_root
+from email.parser import FeedParser
+
+from pip._vendor import pkg_resources, six
+from pip._vendor.packaging import specifiers
+from pip._vendor.packaging.markers import Marker
+from pip._vendor.packaging.requirements import InvalidRequirement, Requirement
+from pip._vendor.packaging.utils import canonicalize_name
+from pip._vendor.packaging.version import Version, parse as parse_version
+from pip._vendor.six.moves import configparser
+
+import pip.wheel
+
+from pip.compat import native_str, get_stdlib, WINDOWS
+from pip.download import is_url, url_to_path, path_to_url, is_archive_file
+from pip.exceptions import (
+    InstallationError, UninstallationError,
+)
+from pip.locations import (
+    bin_py, running_under_virtualenv, PIP_DELETE_MARKER_FILENAME, bin_user,
+)
+from pip.utils import (
+    display_path, rmtree, ask_path_exists, backup_dir, is_installable_dir,
+    dist_in_usersite, dist_in_site_packages, egg_link_path,
+    call_subprocess, read_text_file, FakeFile, _make_build_dir, ensure_dir,
+    get_installed_version, normalize_path, dist_is_local,
+)
+
+from pip.utils.hashes import Hashes
+from pip.utils.deprecation import RemovedInPip10Warning
+from pip.utils.logging import indent_log
+from pip.utils.setuptools_build import SETUPTOOLS_SHIM
+from pip.utils.ui import open_spinner
+from pip.req.req_uninstall import UninstallPathSet
+from pip.vcs import vcs
+from pip.wheel import move_wheel_files, Wheel
+
+
+logger = logging.getLogger(__name__)
+
+operators = specifiers.Specifier._operators.keys()
+
+
+def _strip_extras(path):
+    m = re.match(r'^(.+)(\[[^\]]+\])$', path)
+    extras = None
+    if m:
+        path_no_extras = m.group(1)
+        extras = m.group(2)
+    else:
+        path_no_extras = path
+
+    return path_no_extras, extras
+
+
+def _safe_extras(extras):
+    return set(pkg_resources.safe_extra(extra) for extra in extras)
+
+
+class InstallRequirement(object):
+
+    def __init__(self, req, comes_from, source_dir=None, editable=False,
+                 link=None, as_egg=False, update=True,
+                 pycompile=True, markers=None, isolated=False, options=None,
+                 wheel_cache=None, constraint=False):
+        self.extras = ()
+        if isinstance(req, six.string_types):
+            try:
+                req = Requirement(req)
+            except InvalidRequirement:
+                if os.path.sep in req:
+                    add_msg = "It looks like a path. Does it exist ?"
+                elif '=' in req and not any(op in req for op in operators):
+                    add_msg = "= is not a valid operator. Did you mean == ?"
+                else:
+                    add_msg = traceback.format_exc()
+                raise InstallationError(
+                    "Invalid requirement: '%s'\n%s" % (req, add_msg))
+            self.extras = _safe_extras(req.extras)
+
+        self.req = req
+        self.comes_from = comes_from
+        self.constraint = constraint
+        self.source_dir = source_dir
+        self.editable = editable
+
+        self._wheel_cache = wheel_cache
+        self.link = self.original_link = link
+        self.as_egg = as_egg
+        if markers is not None:
+            self.markers = markers
+        else:
+            self.markers = req and req.marker
+        self._egg_info_path = None
+        # This holds the pkg_resources.Distribution object if this requirement
+        # is already available:
+        self.satisfied_by = None
+        # This hold the pkg_resources.Distribution object if this requirement
+        # conflicts with another installed distribution:
+        self.conflicts_with = None
+        # Temporary build location
+        self._temp_build_dir = None
+        # Used to store the global directory where the _temp_build_dir should
+        # have been created. Cf _correct_build_location method.
+        self._ideal_build_dir = None
+        # True if the editable should be updated:
+        self.update = update
+        # Set to True after successful installation
+        self.install_succeeded = None
+        # UninstallPathSet of uninstalled distribution (for possible rollback)
+        self.uninstalled = None
+        # Set True if a legitimate do-nothing-on-uninstall has happened - e.g.
+        # system site packages, stdlib packages.
+        self.nothing_to_uninstall = False
+        self.use_user_site = False
+        self.target_dir = None
+        self.options = options if options else {}
+        self.pycompile = pycompile
+        # Set to True after successful preparation of this requirement
+        self.prepared = False
+
+        self.isolated = isolated
+
+    @classmethod
+    def from_editable(cls, editable_req, comes_from=None, default_vcs=None,
+                      isolated=False, options=None, wheel_cache=None,
+                      constraint=False):
+        from pip.index import Link
+
+        name, url, extras_override = parse_editable(
+            editable_req, default_vcs)
+        if url.startswith('file:'):
+            source_dir = url_to_path(url)
+        else:
+            source_dir = None
+
+        res = cls(name, comes_from, source_dir=source_dir,
+                  editable=True,
+                  link=Link(url),
+                  constraint=constraint,
+                  isolated=isolated,
+                  options=options if options else {},
+                  wheel_cache=wheel_cache)
+
+        if extras_override is not None:
+            res.extras = _safe_extras(extras_override)
+
+        return res
+
+    @classmethod
+    def from_line(
+            cls, name, comes_from=None, isolated=False, options=None,
+            wheel_cache=None, constraint=False):
+        """Creates an InstallRequirement from a name, which might be a
+        requirement, directory containing 'setup.py', filename, or URL.
+        """
+        from pip.index import Link
+
+        if is_url(name):
+            marker_sep = '; '
+        else:
+            marker_sep = ';'
+        if marker_sep in name:
+            name, markers = name.split(marker_sep, 1)
+            markers = markers.strip()
+            if not markers:
+                markers = None
+            else:
+                markers = Marker(markers)
+        else:
+            markers = None
+        name = name.strip()
+        req = None
+        path = os.path.normpath(os.path.abspath(name))
+        link = None
+        extras = None
+
+        if is_url(name):
+            link = Link(name)
+        else:
+            p, extras = _strip_extras(path)
+            if (os.path.isdir(p) and
+                    (os.path.sep in name or name.startswith('.'))):
+
+                if not is_installable_dir(p):
+                    raise InstallationError(
+                        "Directory %r is not installable. File 'setup.py' "
+                        "not found." % name
+                    )
+                link = Link(path_to_url(p))
+            elif is_archive_file(p):
+                if not os.path.isfile(p):
+                    logger.warning(
+                        'Requirement %r looks like a filename, but the '
+                        'file does not exist',
+                        name
+                    )
+                link = Link(path_to_url(p))
+
+        # it's a local file, dir, or url
+        if link:
+            # Handle relative file URLs
+            if link.scheme == 'file' and re.search(r'\.\./', link.url):
+                link = Link(
+                    path_to_url(os.path.normpath(os.path.abspath(link.path))))
+            # wheel file
+            if link.is_wheel:
+                wheel = Wheel(link.filename)  # can raise InvalidWheelFilename
+                req = "%s==%s" % (wheel.name, wheel.version)
+            else:
+                # set the req to the egg fragment.  when it's not there, this
+                # will become an 'unnamed' requirement
+                req = link.egg_fragment
+
+        # a requirement specifier
+        else:
+            req = name
+
+        options = options if options else {}
+        res = cls(req, comes_from, link=link, markers=markers,
+                  isolated=isolated, options=options,
+                  wheel_cache=wheel_cache, constraint=constraint)
+
+        if extras:
+            res.extras = _safe_extras(
+                Requirement('placeholder' + extras).extras)
+
+        return res
+
+    def __str__(self):
+        if self.req:
+            s = str(self.req)
+            if self.link:
+                s += ' from %s' % self.link.url
+        else:
+            s = self.link.url if self.link else None
+        if self.satisfied_by is not None:
+            s += ' in %s' % display_path(self.satisfied_by.location)
+        if self.comes_from:
+            if isinstance(self.comes_from, six.string_types):
+                comes_from = self.comes_from
+            else:
+                comes_from = self.comes_from.from_path()
+            if comes_from:
+                s += ' (from %s)' % comes_from
+        return s
+
+    def __repr__(self):
+        return '<%s object: %s editable=%r>' % (
+            self.__class__.__name__, str(self), self.editable)
+
+    def populate_link(self, finder, upgrade, require_hashes):
+        """Ensure that if a link can be found for this, that it is found.
+
+        Note that self.link may still be None - if Upgrade is False and the
+        requirement is already installed.
+
+        If require_hashes is True, don't use the wheel cache, because cached
+        wheels, always built locally, have different hashes than the files
+        downloaded from the index server and thus throw false hash mismatches.
+        Furthermore, cached wheels at present have undeterministic contents due
+        to file modification times.
+        """
+        if self.link is None:
+            self.link = finder.find_requirement(self, upgrade)
+        if self._wheel_cache is not None and not require_hashes:
+            old_link = self.link
+            self.link = self._wheel_cache.cached_wheel(self.link, self.name)
+            if old_link != self.link:
+                logger.debug('Using cached wheel link: %s', self.link)
+
+    @property
+    def specifier(self):
+        return self.req.specifier
+
+    @property
+    def is_pinned(self):
+        """Return whether I am pinned to an exact version.
+
+        For example, some-package==1.2 is pinned; some-package>1.2 is not.
+        """
+        specifiers = self.specifier
+        return (len(specifiers) == 1 and
+                next(iter(specifiers)).operator in ('==', '==='))
+
+    def from_path(self):
+        if self.req is None:
+            return None
+        s = str(self.req)
+        if self.comes_from:
+            if isinstance(self.comes_from, six.string_types):
+                comes_from = self.comes_from
+            else:
+                comes_from = self.comes_from.from_path()
+            if comes_from:
+                s += '->' + comes_from
+        return s
+
+    def build_location(self, build_dir):
+        if self._temp_build_dir is not None:
+            return self._temp_build_dir
+        if self.req is None:
+            # for requirement via a path to a directory: the name of the
+            # package is not available yet so we create a temp directory
+            # Once run_egg_info will have run, we'll be able
+            # to fix it via _correct_build_location
+            # Some systems have /tmp as a symlink which confuses custom
+            # builds (such as numpy). Thus, we ensure that the real path
+            # is returned.
+            self._temp_build_dir = os.path.realpath(
+                tempfile.mkdtemp('-build', 'pip-')
+            )
+            self._ideal_build_dir = build_dir
+            return self._temp_build_dir
+        if self.editable:
+            name = self.name.lower()
+        else:
+            name = self.name
+        # FIXME: Is there a better place to create the build_dir? (hg and bzr
+        # need this)
+        if not os.path.exists(build_dir):
+            logger.debug('Creating directory %s', build_dir)
+            _make_build_dir(build_dir)
+        return os.path.join(build_dir, name)
+
+    def _correct_build_location(self):
+        """Move self._temp_build_dir to self._ideal_build_dir/self.req.name
+
+        For some requirements (e.g. a path to a directory), the name of the
+        package is not available until we run egg_info, so the build_location
+        will return a temporary directory and store the _ideal_build_dir.
+
+        This is only called by self.egg_info_path to fix the temporary build
+        directory.
+        """
+        if self.source_dir is not None:
+            return
+        assert self.req is not None
+        assert self._temp_build_dir
+        assert self._ideal_build_dir
+        old_location = self._temp_build_dir
+        self._temp_build_dir = None
+        new_location = self.build_location(self._ideal_build_dir)
+        if os.path.exists(new_location):
+            raise InstallationError(
+                'A package already exists in %s; please remove it to continue'
+                % display_path(new_location))
+        logger.debug(
+            'Moving package %s from %s to new location %s',
+            self, display_path(old_location), display_path(new_location),
+        )
+        shutil.move(old_location, new_location)
+        self._temp_build_dir = new_location
+        self._ideal_build_dir = None
+        self.source_dir = new_location
+        self._egg_info_path = None
+
+    @property
+    def name(self):
+        if self.req is None:
+            return None
+        return native_str(pkg_resources.safe_name(self.req.name))
+
+    @property
+    def setup_py_dir(self):
+        return os.path.join(
+            self.source_dir,
+            self.link and self.link.subdirectory_fragment or '')
+
+    @property
+    def setup_py(self):
+        assert self.source_dir, "No source dir for %s" % self
+        try:
+            import setuptools  # noqa
+        except ImportError:
+            if get_installed_version('setuptools') is None:
+                add_msg = "Please install setuptools."
+            else:
+                add_msg = traceback.format_exc()
+            # Setuptools is not available
+            raise InstallationError(
+                "Could not import setuptools which is required to "
+                "install from a source distribution.\n%s" % add_msg
+            )
+
+        setup_py = os.path.join(self.setup_py_dir, 'setup.py')
+
+        # Python2 __file__ should not be unicode
+        if six.PY2 and isinstance(setup_py, six.text_type):
+            setup_py = setup_py.encode(sys.getfilesystemencoding())
+
+        return setup_py
+
+    def run_egg_info(self):
+        assert self.source_dir
+        if self.name:
+            logger.debug(
+                'Running setup.py (path:%s) egg_info for package %s',
+                self.setup_py, self.name,
+            )
+        else:
+            logger.debug(
+                'Running setup.py (path:%s) egg_info for package from %s',
+                self.setup_py, self.link,
+            )
+
+        with indent_log():
+            script = SETUPTOOLS_SHIM % self.setup_py
+            base_cmd = [sys.executable, '-c', script]
+            if self.isolated:
+                base_cmd += ["--no-user-cfg"]
+            egg_info_cmd = base_cmd + ['egg_info']
+            # We can't put the .egg-info files at the root, because then the
+            # source code will be mistaken for an installed egg, causing
+            # problems
+            if self.editable:
+                egg_base_option = []
+            else:
+                egg_info_dir = os.path.join(self.setup_py_dir, 'pip-egg-info')
+                ensure_dir(egg_info_dir)
+                egg_base_option = ['--egg-base', 'pip-egg-info']
+            call_subprocess(
+                egg_info_cmd + egg_base_option,
+                cwd=self.setup_py_dir,
+                show_stdout=False,
+                command_desc='python setup.py egg_info')
+
+        if not self.req:
+            if isinstance(parse_version(self.pkg_info()["Version"]), Version):
+                op = "=="
+            else:
+                op = "==="
+            self.req = Requirement(
+                "".join([
+                    self.pkg_info()["Name"],
+                    op,
+                    self.pkg_info()["Version"],
+                ])
+            )
+            self._correct_build_location()
+        else:
+            metadata_name = canonicalize_name(self.pkg_info()["Name"])
+            if canonicalize_name(self.req.name) != metadata_name:
+                logger.warning(
+                    'Running setup.py (path:%s) egg_info for package %s '
+                    'produced metadata for project name %s. Fix your '
+                    '#egg=%s fragments.',
+                    self.setup_py, self.name, metadata_name, self.name
+                )
+                self.req = Requirement(metadata_name)
+
+    def egg_info_data(self, filename):
+        if self.satisfied_by is not None:
+            if not self.satisfied_by.has_metadata(filename):
+                return None
+            return self.satisfied_by.get_metadata(filename)
+        assert self.source_dir
+        filename = self.egg_info_path(filename)
+        if not os.path.exists(filename):
+            return None
+        data = read_text_file(filename)
+        return data
+
+    def egg_info_path(self, filename):
+        if self._egg_info_path is None:
+            if self.editable:
+                base = self.source_dir
+            else:
+                base = os.path.join(self.setup_py_dir, 'pip-egg-info')
+            filenames = os.listdir(base)
+            if self.editable:
+                filenames = []
+                for root, dirs, files in os.walk(base):
+                    for dir in vcs.dirnames:
+                        if dir in dirs:
+                            dirs.remove(dir)
+                    # Iterate over a copy of ``dirs``, since mutating
+                    # a list while iterating over it can cause trouble.
+                    # (See https://github.com/pypa/pip/pull/462.)
+                    for dir in list(dirs):
+                        # Don't search in anything that looks like a virtualenv
+                        # environment
+                        if (
+                                os.path.lexists(
+                                    os.path.join(root, dir, 'bin', 'python')
+                                ) or
+                                os.path.exists(
+                                    os.path.join(
+                                        root, dir, 'Scripts', 'Python.exe'
+                                    )
+                                )):
+                            dirs.remove(dir)
+                        # Also don't search through tests
+                        elif dir == 'test' or dir == 'tests':
+                            dirs.remove(dir)
+                    filenames.extend([os.path.join(root, dir)
+                                     for dir in dirs])
+                filenames = [f for f in filenames if f.endswith('.egg-info')]
+
+            if not filenames:
+                raise InstallationError(
+                    'No files/directories in %s (from %s)' % (base, filename)
+                )
+            assert filenames, \
+                "No files/directories in %s (from %s)" % (base, filename)
+
+            # if we have more than one match, we pick the toplevel one.  This
+            # can easily be the case if there is a dist folder which contains
+            # an extracted tarball for testing purposes.
+            if len(filenames) > 1:
+                filenames.sort(
+                    key=lambda x: x.count(os.path.sep) +
+                    (os.path.altsep and x.count(os.path.altsep) or 0)
+                )
+            self._egg_info_path = os.path.join(base, filenames[0])
+        return os.path.join(self._egg_info_path, filename)
+
+    def pkg_info(self):
+        p = FeedParser()
+        data = self.egg_info_data('PKG-INFO')
+        if not data:
+            logger.warning(
+                'No PKG-INFO file found in %s',
+                display_path(self.egg_info_path('PKG-INFO')),
+            )
+        p.feed(data or '')
+        return p.close()
+
+    _requirements_section_re = re.compile(r'\[(.*?)\]')
+
+    @property
+    def installed_version(self):
+        return get_installed_version(self.name)
+
+    def assert_source_matches_version(self):
+        assert self.source_dir
+        version = self.pkg_info()['version']
+        if self.req.specifier and version not in self.req.specifier:
+            logger.warning(
+                'Requested %s, but installing version %s',
+                self,
+                self.installed_version,
+            )
+        else:
+            logger.debug(
+                'Source in %s has version %s, which satisfies requirement %s',
+                display_path(self.source_dir),
+                version,
+                self,
+            )
+
+    def update_editable(self, obtain=True):
+        if not self.link:
+            logger.debug(
+                "Cannot update repository at %s; repository location is "
+                "unknown",
+                self.source_dir,
+            )
+            return
+        assert self.editable
+        assert self.source_dir
+        if self.link.scheme == 'file':
+            # Static paths don't get updated
+            return
+        assert '+' in self.link.url, "bad url: %r" % self.link.url
+        if not self.update:
+            return
+        vc_type, url = self.link.url.split('+', 1)
+        backend = vcs.get_backend(vc_type)
+        if backend:
+            vcs_backend = backend(self.link.url)
+            if obtain:
+                vcs_backend.obtain(self.source_dir)
+            else:
+                vcs_backend.export(self.source_dir)
+        else:
+            assert 0, (
+                'Unexpected version control type (in %s): %s'
+                % (self.link, vc_type))
+
+    def uninstall(self, auto_confirm=False):
+        """
+        Uninstall the distribution currently satisfying this requirement.
+
+        Prompts before removing or modifying files unless
+        ``auto_confirm`` is True.
+
+        Refuses to delete or modify files outside of ``sys.prefix`` -
+        thus uninstallation within a virtual environment can only
+        modify that virtual environment, even if the virtualenv is
+        linked to global site-packages.
+
+        """
+        if not self.check_if_exists():
+            raise UninstallationError(
+                "Cannot uninstall requirement %s, not installed" % (self.name,)
+            )
+        dist = self.satisfied_by or self.conflicts_with
+
+        dist_path = normalize_path(dist.location)
+        if not dist_is_local(dist):
+            logger.info(
+                "Not uninstalling %s at %s, outside environment %s",
+                dist.key,
+                dist_path,
+                sys.prefix,
+            )
+            self.nothing_to_uninstall = True
+            return
+
+        if dist_path in get_stdlib():
+            logger.info(
+                "Not uninstalling %s at %s, as it is in the standard library.",
+                dist.key,
+                dist_path,
+            )
+            self.nothing_to_uninstall = True
+            return
+
+        paths_to_remove = UninstallPathSet(dist)
+        develop_egg_link = egg_link_path(dist)
+        develop_egg_link_egg_info = '{0}.egg-info'.format(
+            pkg_resources.to_filename(dist.project_name))
+        egg_info_exists = dist.egg_info and os.path.exists(dist.egg_info)
+        # Special case for distutils installed package
+        distutils_egg_info = getattr(dist._provider, 'path', None)
+
+        # Uninstall cases order do matter as in the case of 2 installs of the
+        # same package, pip needs to uninstall the currently detected version
+        if (egg_info_exists and dist.egg_info.endswith('.egg-info') and
+                not dist.egg_info.endswith(develop_egg_link_egg_info)):
+            # if dist.egg_info.endswith(develop_egg_link_egg_info), we
+            # are in fact in the develop_egg_link case
+            paths_to_remove.add(dist.egg_info)
+            if dist.has_metadata('installed-files.txt'):
+                for installed_file in dist.get_metadata(
+                        'installed-files.txt').splitlines():
+                    path = os.path.normpath(
+                        os.path.join(dist.egg_info, installed_file)
+                    )
+                    paths_to_remove.add(path)
+            # FIXME: need a test for this elif block
+            # occurs with --single-version-externally-managed/--record outside
+            # of pip
+            elif dist.has_metadata('top_level.txt'):
+                if dist.has_metadata('namespace_packages.txt'):
+                    namespaces = dist.get_metadata('namespace_packages.txt')
+                else:
+                    namespaces = []
+                for top_level_pkg in [
+                        p for p
+                        in dist.get_metadata('top_level.txt').splitlines()
+                        if p and p not in namespaces]:
+                    path = os.path.join(dist.location, top_level_pkg)
+                    paths_to_remove.add(path)
+                    paths_to_remove.add(path + '.py')
+                    paths_to_remove.add(path + '.pyc')
+                    paths_to_remove.add(path + '.pyo')
+
+        elif distutils_egg_info:
+            warnings.warn(
+                "Uninstalling a distutils installed project ({0}) has been "
+                "deprecated and will be removed in a future version. This is "
+                "due to the fact that uninstalling a distutils project will "
+                "only partially uninstall the project.".format(self.name),
+                RemovedInPip10Warning,
+            )
+            paths_to_remove.add(distutils_egg_info)
+
+        elif dist.location.endswith('.egg'):
+            # package installed by easy_install
+            # We cannot match on dist.egg_name because it can slightly vary
+            # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg
+            paths_to_remove.add(dist.location)
+            easy_install_egg = os.path.split(dist.location)[1]
+            easy_install_pth = os.path.join(os.path.dirname(dist.location),
+                                            'easy-install.pth')
+            paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg)
+
+        elif egg_info_exists and dist.egg_info.endswith('.dist-info'):
+            for path in pip.wheel.uninstallation_paths(dist):
+                paths_to_remove.add(path)
+
+        elif develop_egg_link:
+            # develop egg
+            with open(develop_egg_link, 'r') as fh:
+                link_pointer = os.path.normcase(fh.readline().strip())
+            assert (link_pointer == dist.location), (
+                'Egg-link %s does not match installed location of %s '
+                '(at %s)' % (link_pointer, self.name, dist.location)
+            )
+            paths_to_remove.add(develop_egg_link)
+            easy_install_pth = os.path.join(os.path.dirname(develop_egg_link),
+                                            'easy-install.pth')
+            paths_to_remove.add_pth(easy_install_pth, dist.location)
+
+        else:
+            logger.debug(
+                'Not sure how to uninstall: %s - Check: %s',
+                dist, dist.location)
+
+        # find distutils scripts= scripts
+        if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'):
+            for script in dist.metadata_listdir('scripts'):
+                if dist_in_usersite(dist):
+                    bin_dir = bin_user
+                else:
+                    bin_dir = bin_py
+                paths_to_remove.add(os.path.join(bin_dir, script))
+                if WINDOWS:
+                    paths_to_remove.add(os.path.join(bin_dir, script) + '.bat')
+
+        # find console_scripts
+        if dist.has_metadata('entry_points.txt'):
+            if six.PY2:
+                options = {}
+            else:
+                options = {"delimiters": ('=', )}
+            config = configparser.SafeConfigParser(**options)
+            config.readfp(
+                FakeFile(dist.get_metadata_lines('entry_points.txt'))
+            )
+            if config.has_section('console_scripts'):
+                for name, value in config.items('console_scripts'):
+                    if dist_in_usersite(dist):
+                        bin_dir = bin_user
+                    else:
+                        bin_dir = bin_py
+                    paths_to_remove.add(os.path.join(bin_dir, name))
+                    if WINDOWS:
+                        paths_to_remove.add(
+                            os.path.join(bin_dir, name) + '.exe'
+                        )
+                        paths_to_remove.add(
+                            os.path.join(bin_dir, name) + '.exe.manifest'
+                        )
+                        paths_to_remove.add(
+                            os.path.join(bin_dir, name) + '-script.py'
+                        )
+
+        paths_to_remove.remove(auto_confirm)
+        self.uninstalled = paths_to_remove
+
+    def rollback_uninstall(self):
+        if self.uninstalled:
+            self.uninstalled.rollback()
+        else:
+            logger.error(
+                "Can't rollback %s, nothing uninstalled.", self.name,
+            )
+
+    def commit_uninstall(self):
+        if self.uninstalled:
+            self.uninstalled.commit()
+        elif not self.nothing_to_uninstall:
+            logger.error(
+                "Can't commit %s, nothing uninstalled.", self.name,
+            )
+
+    def archive(self, build_dir):
+        assert self.source_dir
+        create_archive = True
+        archive_name = '%s-%s.zip' % (self.name, self.pkg_info()["version"])
+        archive_path = os.path.join(build_dir, archive_name)
+        if os.path.exists(archive_path):
+            response = ask_path_exists(
+                'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)bort ' %
+                display_path(archive_path), ('i', 'w', 'b', 'a'))
+            if response == 'i':
+                create_archive = False
+            elif response == 'w':
+                logger.warning('Deleting %s', display_path(archive_path))
+                os.remove(archive_path)
+            elif response == 'b':
+                dest_file = backup_dir(archive_path)
+                logger.warning(
+                    'Backing up %s to %s',
+                    display_path(archive_path),
+                    display_path(dest_file),
+                )
+                shutil.move(archive_path, dest_file)
+            elif response == 'a':
+                sys.exit(-1)
+        if create_archive:
+            zip = zipfile.ZipFile(
+                archive_path, 'w', zipfile.ZIP_DEFLATED,
+                allowZip64=True
+            )
+            dir = os.path.normcase(os.path.abspath(self.setup_py_dir))
+            for dirpath, dirnames, filenames in os.walk(dir):
+                if 'pip-egg-info' in dirnames:
+                    dirnames.remove('pip-egg-info')
+                for dirname in dirnames:
+                    dirname = os.path.join(dirpath, dirname)
+                    name = self._clean_zip_name(dirname, dir)
+                    zipdir = zipfile.ZipInfo(self.name + '/' + name + '/')
+                    zipdir.external_attr = 0x1ED << 16  # 0o755
+                    zip.writestr(zipdir, '')
+                for filename in filenames:
+                    if filename == PIP_DELETE_MARKER_FILENAME:
+                        continue
+                    filename = os.path.join(dirpath, filename)
+                    name = self._clean_zip_name(filename, dir)
+                    zip.write(filename, self.name + '/' + name)
+            zip.close()
+            logger.info('Saved %s', display_path(archive_path))
+
+    def _clean_zip_name(self, name, prefix):
+        assert name.startswith(prefix + os.path.sep), (
+            "name %r doesn't start with prefix %r" % (name, prefix)
+        )
+        name = name[len(prefix) + 1:]
+        name = name.replace(os.path.sep, '/')
+        return name
+
+    def match_markers(self, extras_requested=None):
+        if not extras_requested:
+            # Provide an extra to safely evaluate the markers
+            # without matching any extra
+            extras_requested = ('',)
+        if self.markers is not None:
+            return any(
+                self.markers.evaluate({'extra': extra})
+                for extra in extras_requested)
+        else:
+            return True
+
+    def install(self, install_options, global_options=[], root=None,
+                prefix=None):
+        if self.editable:
+            self.install_editable(
+                install_options, global_options, prefix=prefix)
+            return
+        if self.is_wheel:
+            version = pip.wheel.wheel_version(self.source_dir)
+            pip.wheel.check_compatibility(version, self.name)
+
+            self.move_wheel_files(self.source_dir, root=root, prefix=prefix)
+            self.install_succeeded = True
+            return
+
+        # Extend the list of global and install options passed on to
+        # the setup.py call with the ones from the requirements file.
+        # Options specified in requirements file override those
+        # specified on the command line, since the last option given
+        # to setup.py is the one that is used.
+        global_options += self.options.get('global_options', [])
+        install_options += self.options.get('install_options', [])
+
+        if self.isolated:
+            global_options = list(global_options) + ["--no-user-cfg"]
+
+        temp_location = tempfile.mkdtemp('-record', 'pip-')
+        record_filename = os.path.join(temp_location, 'install-record.txt')
+        try:
+            install_args = self.get_install_args(
+                global_options, record_filename, root, prefix)
+            msg = 'Running setup.py install for %s' % (self.name,)
+            with open_spinner(msg) as spinner:
+                with indent_log():
+                    call_subprocess(
+                        install_args + install_options,
+                        cwd=self.setup_py_dir,
+                        show_stdout=False,
+                        spinner=spinner,
+                    )
+
+            if not os.path.exists(record_filename):
+                logger.debug('Record file %s not found', record_filename)
+                return
+            self.install_succeeded = True
+            if self.as_egg:
+                # there's no --always-unzip option we can pass to install
+                # command so we unable to save the installed-files.txt
+                return
+
+            def prepend_root(path):
+                if root is None or not os.path.isabs(path):
+                    return path
+                else:
+                    return change_root(root, path)
+
+            with open(record_filename) as f:
+                for line in f:
+                    directory = os.path.dirname(line)
+                    if directory.endswith('.egg-info'):
+                        egg_info_dir = prepend_root(directory)
+                        break
+                else:
+                    logger.warning(
+                        'Could not find .egg-info directory in install record'
+                        ' for %s',
+                        self,
+                    )
+                    # FIXME: put the record somewhere
+                    # FIXME: should this be an error?
+                    return
+            new_lines = []
+            with open(record_filename) as f:
+                for line in f:
+                    filename = line.strip()
+                    if os.path.isdir(filename):
+                        filename += os.path.sep
+                    new_lines.append(
+                        os.path.relpath(
+                            prepend_root(filename), egg_info_dir)
+                    )
+            inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt')
+            with open(inst_files_path, 'w') as f:
+                f.write('\n'.join(new_lines) + '\n')
+        finally:
+            if os.path.exists(record_filename):
+                os.remove(record_filename)
+            rmtree(temp_location)
+
+    def ensure_has_source_dir(self, parent_dir):
+        """Ensure that a source_dir is set.
+
+        This will create a temporary build dir if the name of the requirement
+        isn't known yet.
+
+        :param parent_dir: The ideal pip parent_dir for the source_dir.
+            Generally src_dir for editables and build_dir for sdists.
+        :return: self.source_dir
+        """
+        if self.source_dir is None:
+            self.source_dir = self.build_location(parent_dir)
+        return self.source_dir
+
+    def get_install_args(self, global_options, record_filename, root, prefix):
+        install_args = [sys.executable, "-u"]
+        install_args.append('-c')
+        install_args.append(SETUPTOOLS_SHIM % self.setup_py)
+        install_args += list(global_options) + \
+            ['install', '--record', record_filename]
+
+        if not self.as_egg:
+            install_args += ['--single-version-externally-managed']
+
+        if root is not None:
+            install_args += ['--root', root]
+        if prefix is not None:
+            install_args += ['--prefix', prefix]
+
+        if self.pycompile:
+            install_args += ["--compile"]
+        else:
+            install_args += ["--no-compile"]
+
+        if running_under_virtualenv():
+            py_ver_str = 'python' + sysconfig.get_python_version()
+            install_args += ['--install-headers',
+                             os.path.join(sys.prefix, 'include', 'site',
+                                          py_ver_str, self.name)]
+
+        return install_args
+
+    def remove_temporary_source(self):
+        """Remove the source files from this requirement, if they are marked
+        for deletion"""
+        if self.source_dir and os.path.exists(
+                os.path.join(self.source_dir, PIP_DELETE_MARKER_FILENAME)):
+            logger.debug('Removing source in %s', self.source_dir)
+            rmtree(self.source_dir)
+        self.source_dir = None
+        if self._temp_build_dir and os.path.exists(self._temp_build_dir):
+            rmtree(self._temp_build_dir)
+        self._temp_build_dir = None
+
+    def install_editable(self, install_options,
+                         global_options=(), prefix=None):
+        logger.info('Running setup.py develop for %s', self.name)
+
+        if self.isolated:
+            global_options = list(global_options) + ["--no-user-cfg"]
+
+        if prefix:
+            prefix_param = ['--prefix={0}'.format(prefix)]
+            install_options = list(install_options) + prefix_param
+
+        with indent_log():
+            # FIXME: should we do --install-headers here too?
+            call_subprocess(
+                [
+                    sys.executable,
+                    '-c',
+                    SETUPTOOLS_SHIM % self.setup_py
+                ] +
+                list(global_options) +
+                ['develop', '--no-deps'] +
+                list(install_options),
+
+                cwd=self.setup_py_dir,
+                show_stdout=False)
+
+        self.install_succeeded = True
+
+    def check_if_exists(self):
+        """Find an installed distribution that satisfies or conflicts
+        with this requirement, and set self.satisfied_by or
+        self.conflicts_with appropriately.
+        """
+        if self.req is None:
+            return False
+        try:
+            # get_distribution() will resolve the entire list of requirements
+            # anyway, and we've already determined that we need the requirement
+            # in question, so strip the marker so that we don't try to
+            # evaluate it.
+            no_marker = Requirement(str(self.req))
+            no_marker.marker = None
+            self.satisfied_by = pkg_resources.get_distribution(str(no_marker))
+            if self.editable and self.satisfied_by:
+                self.conflicts_with = self.satisfied_by
+                # when installing editables, nothing pre-existing should ever
+                # satisfy
+                self.satisfied_by = None
+                return True
+        except pkg_resources.DistributionNotFound:
+            return False
+        except pkg_resources.VersionConflict:
+            existing_dist = pkg_resources.get_distribution(
+                self.req.name
+            )
+            if self.use_user_site:
+                if dist_in_usersite(existing_dist):
+                    self.conflicts_with = existing_dist
+                elif (running_under_virtualenv() and
+                        dist_in_site_packages(existing_dist)):
+                    raise InstallationError(
+                        "Will not install to the user site because it will "
+                        "lack sys.path precedence to %s in %s" %
+                        (existing_dist.project_name, existing_dist.location)
+                    )
+            else:
+                self.conflicts_with = existing_dist
+        return True
+
+    @property
+    def is_wheel(self):
+        return self.link and self.link.is_wheel
+
+    def move_wheel_files(self, wheeldir, root=None, prefix=None):
+        move_wheel_files(
+            self.name, self.req, wheeldir,
+            user=self.use_user_site,
+            home=self.target_dir,
+            root=root,
+            prefix=prefix,
+            pycompile=self.pycompile,
+            isolated=self.isolated,
+        )
+
+    def get_dist(self):
+        """Return a pkg_resources.Distribution built from self.egg_info_path"""
+        egg_info = self.egg_info_path('').rstrip('/')
+        base_dir = os.path.dirname(egg_info)
+        metadata = pkg_resources.PathMetadata(base_dir, egg_info)
+        dist_name = os.path.splitext(os.path.basename(egg_info))[0]
+        return pkg_resources.Distribution(
+            os.path.dirname(egg_info),
+            project_name=dist_name,
+            metadata=metadata)
+
+    @property
+    def has_hash_options(self):
+        """Return whether any known-good hashes are specified as options.
+
+        These activate --require-hashes mode; hashes specified as part of a
+        URL do not.
+
+        """
+        return bool(self.options.get('hashes', {}))
+
+    def hashes(self, trust_internet=True):
+        """Return a hash-comparer that considers my option- and URL-based
+        hashes to be known-good.
+
+        Hashes in URLs--ones embedded in the requirements file, not ones
+        downloaded from an index server--are almost peers with ones from
+        flags. They satisfy --require-hashes (whether it was implicitly or
+        explicitly activated) but do not activate it. md5 and sha224 are not
+        allowed in flags, which should nudge people toward good algos. We
+        always OR all hashes together, even ones from URLs.
+
+        :param trust_internet: Whether to trust URL-based (#md5=...) hashes
+            downloaded from the internet, as by populate_link()
+
+        """
+        good_hashes = self.options.get('hashes', {}).copy()
+        link = self.link if trust_internet else self.original_link
+        if link and link.hash:
+            good_hashes.setdefault(link.hash_name, []).append(link.hash)
+        return Hashes(good_hashes)
+
+
+def _strip_postfix(req):
+    """
+        Strip req postfix ( -dev, 0.2, etc )
+    """
+    # FIXME: use package_to_requirement?
+    match = re.search(r'^(.*?)(?:-dev|-\d.*)$', req)
+    if match:
+        # Strip off -dev, -0.2, etc.
+        req = match.group(1)
+    return req
+
+
+def parse_editable(editable_req, default_vcs=None):
+    """Parses an editable requirement into:
+        - a requirement name
+        - an URL
+        - extras
+        - editable options
+    Accepted requirements:
+        svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir
+        .[some_extra]
+    """
+
+    from pip.index import Link
+
+    url = editable_req
+    extras = None
+
+    # If a file path is specified with extras, strip off the extras.
+    m = re.match(r'^(.+)(\[[^\]]+\])$', url)
+    if m:
+        url_no_extras = m.group(1)
+        extras = m.group(2)
+    else:
+        url_no_extras = url
+
+    if os.path.isdir(url_no_extras):
+        if not os.path.exists(os.path.join(url_no_extras, 'setup.py')):
+            raise InstallationError(
+                "Directory %r is not installable. File 'setup.py' not found." %
+                url_no_extras
+            )
+        # Treating it as code that has already been checked out
+        url_no_extras = path_to_url(url_no_extras)
+
+    if url_no_extras.lower().startswith('file:'):
+        package_name = Link(url_no_extras).egg_fragment
+        if extras:
+            return (
+                package_name,
+                url_no_extras,
+                Requirement("placeholder" + extras.lower()).extras,
+            )
+        else:
+            return package_name, url_no_extras, None
+
+    for version_control in vcs:
+        if url.lower().startswith('%s:' % version_control):
+            url = '%s+%s' % (version_control, url)
+            break
+
+    if '+' not in url:
+        if default_vcs:
+            warnings.warn(
+                "--default-vcs has been deprecated and will be removed in "
+                "the future.",
+                RemovedInPip10Warning,
+            )
+            url = default_vcs + '+' + url
+        else:
+            raise InstallationError(
+                '%s should either be a path to a local project or a VCS url '
+                'beginning with svn+, git+, hg+, or bzr+' %
+                editable_req
+            )
+
+    vc_type = url.split('+', 1)[0].lower()
+
+    if not vcs.get_backend(vc_type):
+        error_message = 'For --editable=%s only ' % editable_req + \
+            ', '.join([backend.name + '+URL' for backend in vcs.backends]) + \
+            ' is currently supported'
+        raise InstallationError(error_message)
+
+    package_name = Link(url).egg_fragment
+    if not package_name:
+        raise InstallationError(
+            "Could not detect requirement name, please specify one with #egg="
+        )
+    if not package_name:
+        raise InstallationError(
+            '--editable=%s is not the right format; it must have '
+            '#egg=Package' % editable_req
+        )
+    return _strip_postfix(package_name), url, None
diff --git a/vendor/pip-9.0.3/pip/req/req_set.py b/vendor/pip-9.0.3/pip/req/req_set.py
new file mode 100644
index 0000000000000000000000000000000000000000..76aec0616612e22f2864fe8dba13886c10b579bc
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/req/req_set.py
@@ -0,0 +1,798 @@
+from __future__ import absolute_import
+
+from collections import defaultdict
+from itertools import chain
+import logging
+import os
+
+from pip._vendor import pkg_resources
+from pip._vendor import requests
+
+from pip.compat import expanduser
+from pip.download import (is_file_url, is_dir_url, is_vcs_url, url_to_path,
+                          unpack_url)
+from pip.exceptions import (InstallationError, BestVersionAlreadyInstalled,
+                            DistributionNotFound, PreviousBuildDirError,
+                            HashError, HashErrors, HashUnpinned,
+                            DirectoryUrlHashUnsupported, VcsHashUnsupported,
+                            UnsupportedPythonVersion)
+from pip.req.req_install import InstallRequirement
+from pip.utils import (
+    display_path, dist_in_usersite, ensure_dir, normalize_path)
+from pip.utils.hashes import MissingHashes
+from pip.utils.logging import indent_log
+from pip.utils.packaging import check_dist_requires_python
+from pip.vcs import vcs
+from pip.wheel import Wheel
+
+logger = logging.getLogger(__name__)
+
+
+class Requirements(object):
+
+    def __init__(self):
+        self._keys = []
+        self._dict = {}
+
+    def keys(self):
+        return self._keys
+
+    def values(self):
+        return [self._dict[key] for key in self._keys]
+
+    def __contains__(self, item):
+        return item in self._keys
+
+    def __setitem__(self, key, value):
+        if key not in self._keys:
+            self._keys.append(key)
+        self._dict[key] = value
+
+    def __getitem__(self, key):
+        return self._dict[key]
+
+    def __repr__(self):
+        values = ['%s: %s' % (repr(k), repr(self[k])) for k in self.keys()]
+        return 'Requirements({%s})' % ', '.join(values)
+
+
+class DistAbstraction(object):
+    """Abstracts out the wheel vs non-wheel prepare_files logic.
+
+    The requirements for anything installable are as follows:
+     - we must be able to determine the requirement name
+       (or we can't correctly handle the non-upgrade case).
+     - we must be able to generate a list of run-time dependencies
+       without installing any additional packages (or we would
+       have to either burn time by doing temporary isolated installs
+       or alternatively violate pips 'don't start installing unless
+       all requirements are available' rule - neither of which are
+       desirable).
+     - for packages with setup requirements, we must also be able
+       to determine their requirements without installing additional
+       packages (for the same reason as run-time dependencies)
+     - we must be able to create a Distribution object exposing the
+       above metadata.
+    """
+
+    def __init__(self, req_to_install):
+        self.req_to_install = req_to_install
+
+    def dist(self, finder):
+        """Return a setuptools Dist object."""
+        raise NotImplementedError(self.dist)
+
+    def prep_for_dist(self):
+        """Ensure that we can get a Dist for this requirement."""
+        raise NotImplementedError(self.dist)
+
+
+def make_abstract_dist(req_to_install):
+    """Factory to make an abstract dist object.
+
+    Preconditions: Either an editable req with a source_dir, or satisfied_by or
+    a wheel link, or a non-editable req with a source_dir.
+
+    :return: A concrete DistAbstraction.
+    """
+    if req_to_install.editable:
+        return IsSDist(req_to_install)
+    elif req_to_install.link and req_to_install.link.is_wheel:
+        return IsWheel(req_to_install)
+    else:
+        return IsSDist(req_to_install)
+
+
+class IsWheel(DistAbstraction):
+
+    def dist(self, finder):
+        return list(pkg_resources.find_distributions(
+            self.req_to_install.source_dir))[0]
+
+    def prep_for_dist(self):
+        # FIXME:https://github.com/pypa/pip/issues/1112
+        pass
+
+
+class IsSDist(DistAbstraction):
+
+    def dist(self, finder):
+        dist = self.req_to_install.get_dist()
+        # FIXME: shouldn't be globally added:
+        if dist.has_metadata('dependency_links.txt'):
+            finder.add_dependency_links(
+                dist.get_metadata_lines('dependency_links.txt')
+            )
+        return dist
+
+    def prep_for_dist(self):
+        self.req_to_install.run_egg_info()
+        self.req_to_install.assert_source_matches_version()
+
+
+class Installed(DistAbstraction):
+
+    def dist(self, finder):
+        return self.req_to_install.satisfied_by
+
+    def prep_for_dist(self):
+        pass
+
+
+class RequirementSet(object):
+
+    def __init__(self, build_dir, src_dir, download_dir, upgrade=False,
+                 upgrade_strategy=None, ignore_installed=False, as_egg=False,
+                 target_dir=None, ignore_dependencies=False,
+                 force_reinstall=False, use_user_site=False, session=None,
+                 pycompile=True, isolated=False, wheel_download_dir=None,
+                 wheel_cache=None, require_hashes=False,
+                 ignore_requires_python=False):
+        """Create a RequirementSet.
+
+        :param wheel_download_dir: Where still-packed .whl files should be
+            written to. If None they are written to the download_dir parameter.
+            Separate to download_dir to permit only keeping wheel archives for
+            pip wheel.
+        :param download_dir: Where still packed archives should be written to.
+            If None they are not saved, and are deleted immediately after
+            unpacking.
+        :param wheel_cache: The pip wheel cache, for passing to
+            InstallRequirement.
+        """
+        if session is None:
+            raise TypeError(
+                "RequirementSet() missing 1 required keyword argument: "
+                "'session'"
+            )
+
+        self.build_dir = build_dir
+        self.src_dir = src_dir
+        # XXX: download_dir and wheel_download_dir overlap semantically and may
+        # be combined if we're willing to have non-wheel archives present in
+        # the wheelhouse output by 'pip wheel'.
+        self.download_dir = download_dir
+        self.upgrade = upgrade
+        self.upgrade_strategy = upgrade_strategy
+        self.ignore_installed = ignore_installed
+        self.force_reinstall = force_reinstall
+        self.requirements = Requirements()
+        # Mapping of alias: real_name
+        self.requirement_aliases = {}
+        self.unnamed_requirements = []
+        self.ignore_dependencies = ignore_dependencies
+        self.ignore_requires_python = ignore_requires_python
+        self.successfully_downloaded = []
+        self.successfully_installed = []
+        self.reqs_to_cleanup = []
+        self.as_egg = as_egg
+        self.use_user_site = use_user_site
+        self.target_dir = target_dir  # set from --target option
+        self.session = session
+        self.pycompile = pycompile
+        self.isolated = isolated
+        if wheel_download_dir:
+            wheel_download_dir = normalize_path(wheel_download_dir)
+        self.wheel_download_dir = wheel_download_dir
+        self._wheel_cache = wheel_cache
+        self.require_hashes = require_hashes
+        # Maps from install_req -> dependencies_of_install_req
+        self._dependencies = defaultdict(list)
+
+    def __str__(self):
+        reqs = [req for req in self.requirements.values()
+                if not req.comes_from]
+        reqs.sort(key=lambda req: req.name.lower())
+        return ' '.join([str(req.req) for req in reqs])
+
+    def __repr__(self):
+        reqs = [req for req in self.requirements.values()]
+        reqs.sort(key=lambda req: req.name.lower())
+        reqs_str = ', '.join([str(req.req) for req in reqs])
+        return ('<%s object; %d requirement(s): %s>'
+                % (self.__class__.__name__, len(reqs), reqs_str))
+
+    def add_requirement(self, install_req, parent_req_name=None,
+                        extras_requested=None):
+        """Add install_req as a requirement to install.
+
+        :param parent_req_name: The name of the requirement that needed this
+            added. The name is used because when multiple unnamed requirements
+            resolve to the same name, we could otherwise end up with dependency
+            links that point outside the Requirements set. parent_req must
+            already be added. Note that None implies that this is a user
+            supplied requirement, vs an inferred one.
+        :param extras_requested: an iterable of extras used to evaluate the
+            environement markers.
+        :return: Additional requirements to scan. That is either [] if
+            the requirement is not applicable, or [install_req] if the
+            requirement is applicable and has just been added.
+        """
+        name = install_req.name
+        if not install_req.match_markers(extras_requested):
+            logger.warning("Ignoring %s: markers '%s' don't match your "
+                           "environment", install_req.name,
+                           install_req.markers)
+            return []
+
+        # This check has to come after we filter requirements with the
+        # environment markers.
+        if install_req.link and install_req.link.is_wheel:
+            wheel = Wheel(install_req.link.filename)
+            if not wheel.supported():
+                raise InstallationError(
+                    "%s is not a supported wheel on this platform." %
+                    wheel.filename
+                )
+
+        install_req.as_egg = self.as_egg
+        install_req.use_user_site = self.use_user_site
+        install_req.target_dir = self.target_dir
+        install_req.pycompile = self.pycompile
+        install_req.is_direct = (parent_req_name is None)
+
+        if not name:
+            # url or path requirement w/o an egg fragment
+            self.unnamed_requirements.append(install_req)
+            return [install_req]
+        else:
+            try:
+                existing_req = self.get_requirement(name)
+            except KeyError:
+                existing_req = None
+            if (parent_req_name is None and existing_req and not
+                    existing_req.constraint and
+                    existing_req.extras == install_req.extras and not
+                    existing_req.req.specifier == install_req.req.specifier):
+                raise InstallationError(
+                    'Double requirement given: %s (already in %s, name=%r)'
+                    % (install_req, existing_req, name))
+            if not existing_req:
+                # Add requirement
+                self.requirements[name] = install_req
+                # FIXME: what about other normalizations?  E.g., _ vs. -?
+                if name.lower() != name:
+                    self.requirement_aliases[name.lower()] = name
+                result = [install_req]
+            else:
+                # Assume there's no need to scan, and that we've already
+                # encountered this for scanning.
+                result = []
+                if not install_req.constraint and existing_req.constraint:
+                    if (install_req.link and not (existing_req.link and
+                       install_req.link.path == existing_req.link.path)):
+                        self.reqs_to_cleanup.append(install_req)
+                        raise InstallationError(
+                            "Could not satisfy constraints for '%s': "
+                            "installation from path or url cannot be "
+                            "constrained to a version" % name)
+                    # If we're now installing a constraint, mark the existing
+                    # object for real installation.
+                    existing_req.constraint = False
+                    existing_req.extras = tuple(
+                        sorted(set(existing_req.extras).union(
+                               set(install_req.extras))))
+                    logger.debug("Setting %s extras to: %s",
+                                 existing_req, existing_req.extras)
+                    # And now we need to scan this.
+                    result = [existing_req]
+                # Canonicalise to the already-added object for the backref
+                # check below.
+                install_req = existing_req
+            if parent_req_name:
+                parent_req = self.get_requirement(parent_req_name)
+                self._dependencies[parent_req].append(install_req)
+            return result
+
+    def has_requirement(self, project_name):
+        name = project_name.lower()
+        if (name in self.requirements and
+           not self.requirements[name].constraint or
+           name in self.requirement_aliases and
+           not self.requirements[self.requirement_aliases[name]].constraint):
+            return True
+        return False
+
+    @property
+    def has_requirements(self):
+        return list(req for req in self.requirements.values() if not
+                    req.constraint) or self.unnamed_requirements
+
+    @property
+    def is_download(self):
+        if self.download_dir:
+            self.download_dir = expanduser(self.download_dir)
+            if os.path.exists(self.download_dir):
+                return True
+            else:
+                logger.critical('Could not find download directory')
+                raise InstallationError(
+                    "Could not find or access download directory '%s'"
+                    % display_path(self.download_dir))
+        return False
+
+    def get_requirement(self, project_name):
+        for name in project_name, project_name.lower():
+            if name in self.requirements:
+                return self.requirements[name]
+            if name in self.requirement_aliases:
+                return self.requirements[self.requirement_aliases[name]]
+        raise KeyError("No project with the name %r" % project_name)
+
+    def uninstall(self, auto_confirm=False):
+        for req in self.requirements.values():
+            if req.constraint:
+                continue
+            req.uninstall(auto_confirm=auto_confirm)
+            req.commit_uninstall()
+
+    def prepare_files(self, finder):
+        """
+        Prepare process. Create temp directories, download and/or unpack files.
+        """
+        # make the wheelhouse
+        if self.wheel_download_dir:
+            ensure_dir(self.wheel_download_dir)
+
+        # If any top-level requirement has a hash specified, enter
+        # hash-checking mode, which requires hashes from all.
+        root_reqs = self.unnamed_requirements + self.requirements.values()
+        require_hashes = (self.require_hashes or
+                          any(req.has_hash_options for req in root_reqs))
+        if require_hashes and self.as_egg:
+            raise InstallationError(
+                '--egg is not allowed with --require-hashes mode, since it '
+                'delegates dependency resolution to setuptools and could thus '
+                'result in installation of unhashed packages.')
+
+        # Actually prepare the files, and collect any exceptions. Most hash
+        # exceptions cannot be checked ahead of time, because
+        # req.populate_link() needs to be called before we can make decisions
+        # based on link type.
+        discovered_reqs = []
+        hash_errors = HashErrors()
+        for req in chain(root_reqs, discovered_reqs):
+            try:
+                discovered_reqs.extend(self._prepare_file(
+                    finder,
+                    req,
+                    require_hashes=require_hashes,
+                    ignore_dependencies=self.ignore_dependencies))
+            except HashError as exc:
+                exc.req = req
+                hash_errors.append(exc)
+
+        if hash_errors:
+            raise hash_errors
+
+    def _is_upgrade_allowed(self, req):
+        return self.upgrade and (
+            self.upgrade_strategy == "eager" or (
+                self.upgrade_strategy == "only-if-needed" and req.is_direct
+            )
+        )
+
+    def _check_skip_installed(self, req_to_install, finder):
+        """Check if req_to_install should be skipped.
+
+        This will check if the req is installed, and whether we should upgrade
+        or reinstall it, taking into account all the relevant user options.
+
+        After calling this req_to_install will only have satisfied_by set to
+        None if the req_to_install is to be upgraded/reinstalled etc. Any
+        other value will be a dist recording the current thing installed that
+        satisfies the requirement.
+
+        Note that for vcs urls and the like we can't assess skipping in this
+        routine - we simply identify that we need to pull the thing down,
+        then later on it is pulled down and introspected to assess upgrade/
+        reinstalls etc.
+
+        :return: A text reason for why it was skipped, or None.
+        """
+        # Check whether to upgrade/reinstall this req or not.
+        req_to_install.check_if_exists()
+        if req_to_install.satisfied_by:
+            upgrade_allowed = self._is_upgrade_allowed(req_to_install)
+
+            # Is the best version is installed.
+            best_installed = False
+
+            if upgrade_allowed:
+                # For link based requirements we have to pull the
+                # tree down and inspect to assess the version #, so
+                # its handled way down.
+                if not (self.force_reinstall or req_to_install.link):
+                    try:
+                        finder.find_requirement(
+                            req_to_install, upgrade_allowed)
+                    except BestVersionAlreadyInstalled:
+                        best_installed = True
+                    except DistributionNotFound:
+                        # No distribution found, so we squash the
+                        # error - it will be raised later when we
+                        # re-try later to do the install.
+                        # Why don't we just raise here?
+                        pass
+
+                if not best_installed:
+                    # don't uninstall conflict if user install and
+                    # conflict is not user install
+                    if not (self.use_user_site and not
+                            dist_in_usersite(req_to_install.satisfied_by)):
+                        req_to_install.conflicts_with = \
+                            req_to_install.satisfied_by
+                    req_to_install.satisfied_by = None
+
+            # Figure out a nice message to say why we're skipping this.
+            if best_installed:
+                skip_reason = 'already up-to-date'
+            elif self.upgrade_strategy == "only-if-needed":
+                skip_reason = 'not upgraded as not directly required'
+            else:
+                skip_reason = 'already satisfied'
+
+            return skip_reason
+        else:
+            return None
+
+    def _prepare_file(self,
+                      finder,
+                      req_to_install,
+                      require_hashes=False,
+                      ignore_dependencies=False):
+        """Prepare a single requirements file.
+
+        :return: A list of additional InstallRequirements to also install.
+        """
+        # Tell user what we are doing for this requirement:
+        # obtain (editable), skipping, processing (local url), collecting
+        # (remote url or package name)
+        if req_to_install.constraint or req_to_install.prepared:
+            return []
+
+        req_to_install.prepared = True
+
+        # ###################### #
+        # # print log messages # #
+        # ###################### #
+        if req_to_install.editable:
+            logger.info('Obtaining %s', req_to_install)
+        else:
+            # satisfied_by is only evaluated by calling _check_skip_installed,
+            # so it must be None here.
+            assert req_to_install.satisfied_by is None
+            if not self.ignore_installed:
+                skip_reason = self._check_skip_installed(
+                    req_to_install, finder)
+
+            if req_to_install.satisfied_by:
+                assert skip_reason is not None, (
+                    '_check_skip_installed returned None but '
+                    'req_to_install.satisfied_by is set to %r'
+                    % (req_to_install.satisfied_by,))
+                logger.info(
+                    'Requirement %s: %s', skip_reason,
+                    req_to_install)
+            else:
+                if (req_to_install.link and
+                        req_to_install.link.scheme == 'file'):
+                    path = url_to_path(req_to_install.link.url)
+                    logger.info('Processing %s', display_path(path))
+                else:
+                    logger.info('Collecting %s', req_to_install)
+
+        with indent_log():
+            # ################################ #
+            # # vcs update or unpack archive # #
+            # ################################ #
+            if req_to_install.editable:
+                if require_hashes:
+                    raise InstallationError(
+                        'The editable requirement %s cannot be installed when '
+                        'requiring hashes, because there is no single file to '
+                        'hash.' % req_to_install)
+                req_to_install.ensure_has_source_dir(self.src_dir)
+                req_to_install.update_editable(not self.is_download)
+                abstract_dist = make_abstract_dist(req_to_install)
+                abstract_dist.prep_for_dist()
+                if self.is_download:
+                    req_to_install.archive(self.download_dir)
+                req_to_install.check_if_exists()
+            elif req_to_install.satisfied_by:
+                if require_hashes:
+                    logger.debug(
+                        'Since it is already installed, we are trusting this '
+                        'package without checking its hash. To ensure a '
+                        'completely repeatable environment, install into an '
+                        'empty virtualenv.')
+                abstract_dist = Installed(req_to_install)
+            else:
+                # @@ if filesystem packages are not marked
+                # editable in a req, a non deterministic error
+                # occurs when the script attempts to unpack the
+                # build directory
+                req_to_install.ensure_has_source_dir(self.build_dir)
+                # If a checkout exists, it's unwise to keep going.  version
+                # inconsistencies are logged later, but do not fail the
+                # installation.
+                # FIXME: this won't upgrade when there's an existing
+                # package unpacked in `req_to_install.source_dir`
+                if os.path.exists(
+                        os.path.join(req_to_install.source_dir, 'setup.py')):
+                    raise PreviousBuildDirError(
+                        "pip can't proceed with requirements '%s' due to a"
+                        " pre-existing build directory (%s). This is "
+                        "likely due to a previous installation that failed"
+                        ". pip is being responsible and not assuming it "
+                        "can delete this. Please delete it and try again."
+                        % (req_to_install, req_to_install.source_dir)
+                    )
+                req_to_install.populate_link(
+                    finder,
+                    self._is_upgrade_allowed(req_to_install),
+                    require_hashes
+                )
+                # We can't hit this spot and have populate_link return None.
+                # req_to_install.satisfied_by is None here (because we're
+                # guarded) and upgrade has no impact except when satisfied_by
+                # is not None.
+                # Then inside find_requirement existing_applicable -> False
+                # If no new versions are found, DistributionNotFound is raised,
+                # otherwise a result is guaranteed.
+                assert req_to_install.link
+                link = req_to_install.link
+
+                # Now that we have the real link, we can tell what kind of
+                # requirements we have and raise some more informative errors
+                # than otherwise. (For example, we can raise VcsHashUnsupported
+                # for a VCS URL rather than HashMissing.)
+                if require_hashes:
+                    # We could check these first 2 conditions inside
+                    # unpack_url and save repetition of conditions, but then
+                    # we would report less-useful error messages for
+                    # unhashable requirements, complaining that there's no
+                    # hash provided.
+                    if is_vcs_url(link):
+                        raise VcsHashUnsupported()
+                    elif is_file_url(link) and is_dir_url(link):
+                        raise DirectoryUrlHashUnsupported()
+                    if (not req_to_install.original_link and
+                            not req_to_install.is_pinned):
+                        # Unpinned packages are asking for trouble when a new
+                        # version is uploaded. This isn't a security check, but
+                        # it saves users a surprising hash mismatch in the
+                        # future.
+                        #
+                        # file:/// URLs aren't pinnable, so don't complain
+                        # about them not being pinned.
+                        raise HashUnpinned()
+                hashes = req_to_install.hashes(
+                    trust_internet=not require_hashes)
+                if require_hashes and not hashes:
+                    # Known-good hashes are missing for this requirement, so
+                    # shim it with a facade object that will provoke hash
+                    # computation and then raise a HashMissing exception
+                    # showing the user what the hash should be.
+                    hashes = MissingHashes()
+
+                try:
+                    download_dir = self.download_dir
+                    # We always delete unpacked sdists after pip ran.
+                    autodelete_unpacked = True
+                    if req_to_install.link.is_wheel \
+                            and self.wheel_download_dir:
+                        # when doing 'pip wheel` we download wheels to a
+                        # dedicated dir.
+                        download_dir = self.wheel_download_dir
+                    if req_to_install.link.is_wheel:
+                        if download_dir:
+                            # When downloading, we only unpack wheels to get
+                            # metadata.
+                            autodelete_unpacked = True
+                        else:
+                            # When installing a wheel, we use the unpacked
+                            # wheel.
+                            autodelete_unpacked = False
+                    unpack_url(
+                        req_to_install.link, req_to_install.source_dir,
+                        download_dir, autodelete_unpacked,
+                        session=self.session, hashes=hashes)
+                except requests.HTTPError as exc:
+                    logger.critical(
+                        'Could not install requirement %s because '
+                        'of error %s',
+                        req_to_install,
+                        exc,
+                    )
+                    raise InstallationError(
+                        'Could not install requirement %s because '
+                        'of HTTP error %s for URL %s' %
+                        (req_to_install, exc, req_to_install.link)
+                    )
+                abstract_dist = make_abstract_dist(req_to_install)
+                abstract_dist.prep_for_dist()
+                if self.is_download:
+                    # Make a .zip of the source_dir we already created.
+                    if req_to_install.link.scheme in vcs.all_schemes:
+                        req_to_install.archive(self.download_dir)
+                # req_to_install.req is only avail after unpack for URL
+                # pkgs repeat check_if_exists to uninstall-on-upgrade
+                # (#14)
+                if not self.ignore_installed:
+                    req_to_install.check_if_exists()
+                if req_to_install.satisfied_by:
+                    if self.upgrade or self.ignore_installed:
+                        # don't uninstall conflict if user install and
+                        # conflict is not user install
+                        if not (self.use_user_site and not
+                                dist_in_usersite(
+                                    req_to_install.satisfied_by)):
+                            req_to_install.conflicts_with = \
+                                req_to_install.satisfied_by
+                        req_to_install.satisfied_by = None
+                    else:
+                        logger.info(
+                            'Requirement already satisfied (use '
+                            '--upgrade to upgrade): %s',
+                            req_to_install,
+                        )
+
+            # ###################### #
+            # # parse dependencies # #
+            # ###################### #
+            dist = abstract_dist.dist(finder)
+            try:
+                check_dist_requires_python(dist)
+            except UnsupportedPythonVersion as e:
+                if self.ignore_requires_python:
+                    logger.warning(e.args[0])
+                else:
+                    req_to_install.remove_temporary_source()
+                    raise
+            more_reqs = []
+
+            def add_req(subreq, extras_requested):
+                sub_install_req = InstallRequirement(
+                    str(subreq),
+                    req_to_install,
+                    isolated=self.isolated,
+                    wheel_cache=self._wheel_cache,
+                )
+                more_reqs.extend(self.add_requirement(
+                    sub_install_req, req_to_install.name,
+                    extras_requested=extras_requested))
+
+            # We add req_to_install before its dependencies, so that we
+            # can refer to it when adding dependencies.
+            if not self.has_requirement(req_to_install.name):
+                # 'unnamed' requirements will get added here
+                self.add_requirement(req_to_install, None)
+
+            if not ignore_dependencies:
+                if (req_to_install.extras):
+                    logger.debug(
+                        "Installing extra requirements: %r",
+                        ','.join(req_to_install.extras),
+                    )
+                missing_requested = sorted(
+                    set(req_to_install.extras) - set(dist.extras)
+                )
+                for missing in missing_requested:
+                    logger.warning(
+                        '%s does not provide the extra \'%s\'',
+                        dist, missing
+                    )
+
+                available_requested = sorted(
+                    set(dist.extras) & set(req_to_install.extras)
+                )
+                for subreq in dist.requires(available_requested):
+                    add_req(subreq, extras_requested=available_requested)
+
+            # cleanup tmp src
+            self.reqs_to_cleanup.append(req_to_install)
+
+            if not req_to_install.editable and not req_to_install.satisfied_by:
+                # XXX: --no-install leads this to report 'Successfully
+                # downloaded' for only non-editable reqs, even though we took
+                # action on them.
+                self.successfully_downloaded.append(req_to_install)
+
+        return more_reqs
+
+    def cleanup_files(self):
+        """Clean up files, remove builds."""
+        logger.debug('Cleaning up...')
+        with indent_log():
+            for req in self.reqs_to_cleanup:
+                req.remove_temporary_source()
+
+    def _to_install(self):
+        """Create the installation order.
+
+        The installation order is topological - requirements are installed
+        before the requiring thing. We break cycles at an arbitrary point,
+        and make no other guarantees.
+        """
+        # The current implementation, which we may change at any point
+        # installs the user specified things in the order given, except when
+        # dependencies must come earlier to achieve topological order.
+        order = []
+        ordered_reqs = set()
+
+        def schedule(req):
+            if req.satisfied_by or req in ordered_reqs:
+                return
+            if req.constraint:
+                return
+            ordered_reqs.add(req)
+            for dep in self._dependencies[req]:
+                schedule(dep)
+            order.append(req)
+        for install_req in self.requirements.values():
+            schedule(install_req)
+        return order
+
+    def install(self, install_options, global_options=(), *args, **kwargs):
+        """
+        Install everything in this set (after having downloaded and unpacked
+        the packages)
+        """
+        to_install = self._to_install()
+
+        if to_install:
+            logger.info(
+                'Installing collected packages: %s',
+                ', '.join([req.name for req in to_install]),
+            )
+
+        with indent_log():
+            for requirement in to_install:
+                if requirement.conflicts_with:
+                    logger.info(
+                        'Found existing installation: %s',
+                        requirement.conflicts_with,
+                    )
+                    with indent_log():
+                        requirement.uninstall(auto_confirm=True)
+                try:
+                    requirement.install(
+                        install_options,
+                        global_options,
+                        *args,
+                        **kwargs
+                    )
+                except:
+                    # if install did not succeed, rollback previous uninstall
+                    if (requirement.conflicts_with and not
+                            requirement.install_succeeded):
+                        requirement.rollback_uninstall()
+                    raise
+                else:
+                    if (requirement.conflicts_with and
+                            requirement.install_succeeded):
+                        requirement.commit_uninstall()
+                requirement.remove_temporary_source()
+
+        self.successfully_installed = to_install
diff --git a/vendor/pip-9.0.3/pip/req/req_uninstall.py b/vendor/pip-9.0.3/pip/req/req_uninstall.py
new file mode 100644
index 0000000000000000000000000000000000000000..5248430a9b17c102fcabe4f9ccbafd2a307f5701
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/req/req_uninstall.py
@@ -0,0 +1,195 @@
+from __future__ import absolute_import
+
+import logging
+import os
+import tempfile
+
+from pip.compat import uses_pycache, WINDOWS, cache_from_source
+from pip.exceptions import UninstallationError
+from pip.utils import rmtree, ask, is_local, renames, normalize_path
+from pip.utils.logging import indent_log
+
+
+logger = logging.getLogger(__name__)
+
+
+class UninstallPathSet(object):
+    """A set of file paths to be removed in the uninstallation of a
+    requirement."""
+    def __init__(self, dist):
+        self.paths = set()
+        self._refuse = set()
+        self.pth = {}
+        self.dist = dist
+        self.save_dir = None
+        self._moved_paths = []
+
+    def _permitted(self, path):
+        """
+        Return True if the given path is one we are permitted to
+        remove/modify, False otherwise.
+
+        """
+        return is_local(path)
+
+    def add(self, path):
+        head, tail = os.path.split(path)
+
+        # we normalize the head to resolve parent directory symlinks, but not
+        # the tail, since we only want to uninstall symlinks, not their targets
+        path = os.path.join(normalize_path(head), os.path.normcase(tail))
+
+        if not os.path.exists(path):
+            return
+        if self._permitted(path):
+            self.paths.add(path)
+        else:
+            self._refuse.add(path)
+
+        # __pycache__ files can show up after 'installed-files.txt' is created,
+        # due to imports
+        if os.path.splitext(path)[1] == '.py' and uses_pycache:
+            self.add(cache_from_source(path))
+
+    def add_pth(self, pth_file, entry):
+        pth_file = normalize_path(pth_file)
+        if self._permitted(pth_file):
+            if pth_file not in self.pth:
+                self.pth[pth_file] = UninstallPthEntries(pth_file)
+            self.pth[pth_file].add(entry)
+        else:
+            self._refuse.add(pth_file)
+
+    def compact(self, paths):
+        """Compact a path set to contain the minimal number of paths
+        necessary to contain all paths in the set. If /a/path/ and
+        /a/path/to/a/file.txt are both in the set, leave only the
+        shorter path."""
+        short_paths = set()
+        for path in sorted(paths, key=len):
+            if not any([
+                    (path.startswith(shortpath) and
+                     path[len(shortpath.rstrip(os.path.sep))] == os.path.sep)
+                    for shortpath in short_paths]):
+                short_paths.add(path)
+        return short_paths
+
+    def _stash(self, path):
+        return os.path.join(
+            self.save_dir, os.path.splitdrive(path)[1].lstrip(os.path.sep))
+
+    def remove(self, auto_confirm=False):
+        """Remove paths in ``self.paths`` with confirmation (unless
+        ``auto_confirm`` is True)."""
+        if not self.paths:
+            logger.info(
+                "Can't uninstall '%s'. No files were found to uninstall.",
+                self.dist.project_name,
+            )
+            return
+        logger.info(
+            'Uninstalling %s-%s:',
+            self.dist.project_name, self.dist.version
+        )
+
+        with indent_log():
+            paths = sorted(self.compact(self.paths))
+
+            if auto_confirm:
+                response = 'y'
+            else:
+                for path in paths:
+                    logger.info(path)
+                response = ask('Proceed (y/n)? ', ('y', 'n'))
+            if self._refuse:
+                logger.info('Not removing or modifying (outside of prefix):')
+                for path in self.compact(self._refuse):
+                    logger.info(path)
+            if response == 'y':
+                self.save_dir = tempfile.mkdtemp(suffix='-uninstall',
+                                                 prefix='pip-')
+                for path in paths:
+                    new_path = self._stash(path)
+                    logger.debug('Removing file or directory %s', path)
+                    self._moved_paths.append(path)
+                    renames(path, new_path)
+                for pth in self.pth.values():
+                    pth.remove()
+                logger.info(
+                    'Successfully uninstalled %s-%s',
+                    self.dist.project_name, self.dist.version
+                )
+
+    def rollback(self):
+        """Rollback the changes previously made by remove()."""
+        if self.save_dir is None:
+            logger.error(
+                "Can't roll back %s; was not uninstalled",
+                self.dist.project_name,
+            )
+            return False
+        logger.info('Rolling back uninstall of %s', self.dist.project_name)
+        for path in self._moved_paths:
+            tmp_path = self._stash(path)
+            logger.debug('Replacing %s', path)
+            renames(tmp_path, path)
+        for pth in self.pth.values():
+            pth.rollback()
+
+    def commit(self):
+        """Remove temporary save dir: rollback will no longer be possible."""
+        if self.save_dir is not None:
+            rmtree(self.save_dir)
+            self.save_dir = None
+            self._moved_paths = []
+
+
+class UninstallPthEntries(object):
+    def __init__(self, pth_file):
+        if not os.path.isfile(pth_file):
+            raise UninstallationError(
+                "Cannot remove entries from nonexistent file %s" % pth_file
+            )
+        self.file = pth_file
+        self.entries = set()
+        self._saved_lines = None
+
+    def add(self, entry):
+        entry = os.path.normcase(entry)
+        # On Windows, os.path.normcase converts the entry to use
+        # backslashes.  This is correct for entries that describe absolute
+        # paths outside of site-packages, but all the others use forward
+        # slashes.
+        if WINDOWS and not os.path.splitdrive(entry)[0]:
+            entry = entry.replace('\\', '/')
+        self.entries.add(entry)
+
+    def remove(self):
+        logger.debug('Removing pth entries from %s:', self.file)
+        with open(self.file, 'rb') as fh:
+            # windows uses '\r\n' with py3k, but uses '\n' with py2.x
+            lines = fh.readlines()
+            self._saved_lines = lines
+        if any(b'\r\n' in line for line in lines):
+            endline = '\r\n'
+        else:
+            endline = '\n'
+        for entry in self.entries:
+            try:
+                logger.debug('Removing entry: %s', entry)
+                lines.remove((entry + endline).encode("utf-8"))
+            except ValueError:
+                pass
+        with open(self.file, 'wb') as fh:
+            fh.writelines(lines)
+
+    def rollback(self):
+        if self._saved_lines is None:
+            logger.error(
+                'Cannot roll back changes to %s, none were made', self.file
+            )
+            return False
+        logger.debug('Rolling %s back to previous state', self.file)
+        with open(self.file, 'wb') as fh:
+            fh.writelines(self._saved_lines)
+        return True
diff --git a/vendor/pip-9.0.3/pip/status_codes.py b/vendor/pip-9.0.3/pip/status_codes.py
new file mode 100644
index 0000000000000000000000000000000000000000..275360a3175abaeab86148d61b735904f96d72f6
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/status_codes.py
@@ -0,0 +1,8 @@
+from __future__ import absolute_import
+
+SUCCESS = 0
+ERROR = 1
+UNKNOWN_ERROR = 2
+VIRTUALENV_NOT_FOUND = 3
+PREVIOUS_BUILD_DIR_ERROR = 4
+NO_MATCHES_FOUND = 23
diff --git a/vendor/pip-9.0.3/pip/utils/__init__.py b/vendor/pip-9.0.3/pip/utils/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..815bd33831d5b47490a07f89d7bcfc370c42e31a
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/utils/__init__.py
@@ -0,0 +1,852 @@
+from __future__ import absolute_import
+
+from collections import deque
+import contextlib
+import errno
+import io
+import locale
+# we have a submodule named 'logging' which would shadow this if we used the
+# regular name:
+import logging as std_logging
+import re
+import os
+import posixpath
+import shutil
+import stat
+import subprocess
+import sys
+import tarfile
+import zipfile
+
+from pip.exceptions import InstallationError
+from pip.compat import console_to_str, expanduser, stdlib_pkgs
+from pip.locations import (
+    site_packages, user_site, running_under_virtualenv, virtualenv_no_global,
+    write_delete_marker_file,
+)
+from pip._vendor import pkg_resources
+from pip._vendor.six.moves import input
+from pip._vendor.six import PY2
+from pip._vendor.retrying import retry
+
+if PY2:
+    from io import BytesIO as StringIO
+else:
+    from io import StringIO
+
+__all__ = ['rmtree', 'display_path', 'backup_dir',
+           'ask', 'splitext',
+           'format_size', 'is_installable_dir',
+           'is_svn_page', 'file_contents',
+           'split_leading_dir', 'has_leading_dir',
+           'normalize_path',
+           'renames', 'get_terminal_size', 'get_prog',
+           'unzip_file', 'untar_file', 'unpack_file', 'call_subprocess',
+           'captured_stdout', 'ensure_dir',
+           'ARCHIVE_EXTENSIONS', 'SUPPORTED_EXTENSIONS',
+           'get_installed_version']
+
+
+logger = std_logging.getLogger(__name__)
+
+BZ2_EXTENSIONS = ('.tar.bz2', '.tbz')
+XZ_EXTENSIONS = ('.tar.xz', '.txz', '.tlz', '.tar.lz', '.tar.lzma')
+ZIP_EXTENSIONS = ('.zip', '.whl')
+TAR_EXTENSIONS = ('.tar.gz', '.tgz', '.tar')
+ARCHIVE_EXTENSIONS = (
+    ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS)
+SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS
+try:
+    import bz2  # noqa
+    SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS
+except ImportError:
+    logger.debug('bz2 module is not available')
+
+try:
+    # Only for Python 3.3+
+    import lzma  # noqa
+    SUPPORTED_EXTENSIONS += XZ_EXTENSIONS
+except ImportError:
+    logger.debug('lzma module is not available')
+
+
+def import_or_raise(pkg_or_module_string, ExceptionType, *args, **kwargs):
+    try:
+        return __import__(pkg_or_module_string)
+    except ImportError:
+        raise ExceptionType(*args, **kwargs)
+
+
+def ensure_dir(path):
+    """os.path.makedirs without EEXIST."""
+    try:
+        os.makedirs(path)
+    except OSError as e:
+        if e.errno != errno.EEXIST:
+            raise
+
+
+def get_prog():
+    try:
+        if os.path.basename(sys.argv[0]) in ('__main__.py', '-c'):
+            return "%s -m pip" % sys.executable
+    except (AttributeError, TypeError, IndexError):
+        pass
+    return 'pip'
+
+
+# Retry every half second for up to 3 seconds
+@retry(stop_max_delay=3000, wait_fixed=500)
+def rmtree(dir, ignore_errors=False):
+    shutil.rmtree(dir, ignore_errors=ignore_errors,
+                  onerror=rmtree_errorhandler)
+
+
+def rmtree_errorhandler(func, path, exc_info):
+    """On Windows, the files in .svn are read-only, so when rmtree() tries to
+    remove them, an exception is thrown.  We catch that here, remove the
+    read-only attribute, and hopefully continue without problems."""
+    # if file type currently read only
+    if os.stat(path).st_mode & stat.S_IREAD:
+        # convert to read/write
+        os.chmod(path, stat.S_IWRITE)
+        # use the original function to repeat the operation
+        func(path)
+        return
+    else:
+        raise
+
+
+def display_path(path):
+    """Gives the display value for a given path, making it relative to cwd
+    if possible."""
+    path = os.path.normcase(os.path.abspath(path))
+    if sys.version_info[0] == 2:
+        path = path.decode(sys.getfilesystemencoding(), 'replace')
+        path = path.encode(sys.getdefaultencoding(), 'replace')
+    if path.startswith(os.getcwd() + os.path.sep):
+        path = '.' + path[len(os.getcwd()):]
+    return path
+
+
+def backup_dir(dir, ext='.bak'):
+    """Figure out the name of a directory to back up the given dir to
+    (adding .bak, .bak2, etc)"""
+    n = 1
+    extension = ext
+    while os.path.exists(dir + extension):
+        n += 1
+        extension = ext + str(n)
+    return dir + extension
+
+
+def ask_path_exists(message, options):
+    for action in os.environ.get('PIP_EXISTS_ACTION', '').split():
+        if action in options:
+            return action
+    return ask(message, options)
+
+
+def ask(message, options):
+    """Ask the message interactively, with the given possible responses"""
+    while 1:
+        if os.environ.get('PIP_NO_INPUT'):
+            raise Exception(
+                'No input was expected ($PIP_NO_INPUT set); question: %s' %
+                message
+            )
+        response = input(message)
+        response = response.strip().lower()
+        if response not in options:
+            print(
+                'Your response (%r) was not one of the expected responses: '
+                '%s' % (response, ', '.join(options))
+            )
+        else:
+            return response
+
+
+def format_size(bytes):
+    if bytes > 1000 * 1000:
+        return '%.1fMB' % (bytes / 1000.0 / 1000)
+    elif bytes > 10 * 1000:
+        return '%ikB' % (bytes / 1000)
+    elif bytes > 1000:
+        return '%.1fkB' % (bytes / 1000.0)
+    else:
+        return '%ibytes' % bytes
+
+
+def is_installable_dir(path):
+    """Return True if `path` is a directory containing a setup.py file."""
+    if not os.path.isdir(path):
+        return False
+    setup_py = os.path.join(path, 'setup.py')
+    if os.path.isfile(setup_py):
+        return True
+    return False
+
+
+def is_svn_page(html):
+    """
+    Returns true if the page appears to be the index page of an svn repository
+    """
+    return (re.search(r'<title>[^<]*Revision \d+:', html) and
+            re.search(r'Powered by (?:<a[^>]*?>)?Subversion', html, re.I))
+
+
+def file_contents(filename):
+    with open(filename, 'rb') as fp:
+        return fp.read().decode('utf-8')
+
+
+def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE):
+    """Yield pieces of data from a file-like object until EOF."""
+    while True:
+        chunk = file.read(size)
+        if not chunk:
+            break
+        yield chunk
+
+
+def split_leading_dir(path):
+    path = path.lstrip('/').lstrip('\\')
+    if '/' in path and (('\\' in path and path.find('/') < path.find('\\')) or
+                        '\\' not in path):
+        return path.split('/', 1)
+    elif '\\' in path:
+        return path.split('\\', 1)
+    else:
+        return path, ''
+
+
+def has_leading_dir(paths):
+    """Returns true if all the paths have the same leading path name
+    (i.e., everything is in one subdirectory in an archive)"""
+    common_prefix = None
+    for path in paths:
+        prefix, rest = split_leading_dir(path)
+        if not prefix:
+            return False
+        elif common_prefix is None:
+            common_prefix = prefix
+        elif prefix != common_prefix:
+            return False
+    return True
+
+
+def normalize_path(path, resolve_symlinks=True):
+    """
+    Convert a path to its canonical, case-normalized, absolute version.
+
+    """
+    path = expanduser(path)
+    if resolve_symlinks:
+        path = os.path.realpath(path)
+    else:
+        path = os.path.abspath(path)
+    return os.path.normcase(path)
+
+
+def splitext(path):
+    """Like os.path.splitext, but take off .tar too"""
+    base, ext = posixpath.splitext(path)
+    if base.lower().endswith('.tar'):
+        ext = base[-4:] + ext
+        base = base[:-4]
+    return base, ext
+
+
+def renames(old, new):
+    """Like os.renames(), but handles renaming across devices."""
+    # Implementation borrowed from os.renames().
+    head, tail = os.path.split(new)
+    if head and tail and not os.path.exists(head):
+        os.makedirs(head)
+
+    shutil.move(old, new)
+
+    head, tail = os.path.split(old)
+    if head and tail:
+        try:
+            os.removedirs(head)
+        except OSError:
+            pass
+
+
+def is_local(path):
+    """
+    Return True if path is within sys.prefix, if we're running in a virtualenv.
+
+    If we're not in a virtualenv, all paths are considered "local."
+
+    """
+    if not running_under_virtualenv():
+        return True
+    return normalize_path(path).startswith(normalize_path(sys.prefix))
+
+
+def dist_is_local(dist):
+    """
+    Return True if given Distribution object is installed locally
+    (i.e. within current virtualenv).
+
+    Always True if we're not in a virtualenv.
+
+    """
+    return is_local(dist_location(dist))
+
+
+def dist_in_usersite(dist):
+    """
+    Return True if given Distribution is installed in user site.
+    """
+    norm_path = normalize_path(dist_location(dist))
+    return norm_path.startswith(normalize_path(user_site))
+
+
+def dist_in_site_packages(dist):
+    """
+    Return True if given Distribution is installed in
+    distutils.sysconfig.get_python_lib().
+    """
+    return normalize_path(
+        dist_location(dist)
+    ).startswith(normalize_path(site_packages))
+
+
+def dist_is_editable(dist):
+    """Is distribution an editable install?"""
+    for path_item in sys.path:
+        egg_link = os.path.join(path_item, dist.project_name + '.egg-link')
+        if os.path.isfile(egg_link):
+            return True
+    return False
+
+
+def get_installed_distributions(local_only=True,
+                                skip=stdlib_pkgs,
+                                include_editables=True,
+                                editables_only=False,
+                                user_only=False):
+    """
+    Return a list of installed Distribution objects.
+
+    If ``local_only`` is True (default), only return installations
+    local to the current virtualenv, if in a virtualenv.
+
+    ``skip`` argument is an iterable of lower-case project names to
+    ignore; defaults to stdlib_pkgs
+
+    If ``editables`` is False, don't report editables.
+
+    If ``editables_only`` is True , only report editables.
+
+    If ``user_only`` is True , only report installations in the user
+    site directory.
+
+    """
+    if local_only:
+        local_test = dist_is_local
+    else:
+        def local_test(d):
+            return True
+
+    if include_editables:
+        def editable_test(d):
+            return True
+    else:
+        def editable_test(d):
+            return not dist_is_editable(d)
+
+    if editables_only:
+        def editables_only_test(d):
+            return dist_is_editable(d)
+    else:
+        def editables_only_test(d):
+            return True
+
+    if user_only:
+        user_test = dist_in_usersite
+    else:
+        def user_test(d):
+            return True
+
+    return [d for d in pkg_resources.working_set
+            if local_test(d) and
+            d.key not in skip and
+            editable_test(d) and
+            editables_only_test(d) and
+            user_test(d)
+            ]
+
+
+def egg_link_path(dist):
+    """
+    Return the path for the .egg-link file if it exists, otherwise, None.
+
+    There's 3 scenarios:
+    1) not in a virtualenv
+       try to find in site.USER_SITE, then site_packages
+    2) in a no-global virtualenv
+       try to find in site_packages
+    3) in a yes-global virtualenv
+       try to find in site_packages, then site.USER_SITE
+       (don't look in global location)
+
+    For #1 and #3, there could be odd cases, where there's an egg-link in 2
+    locations.
+
+    This method will just return the first one found.
+    """
+    sites = []
+    if running_under_virtualenv():
+        if virtualenv_no_global():
+            sites.append(site_packages)
+        else:
+            sites.append(site_packages)
+            if user_site:
+                sites.append(user_site)
+    else:
+        if user_site:
+            sites.append(user_site)
+        sites.append(site_packages)
+
+    for site in sites:
+        egglink = os.path.join(site, dist.project_name) + '.egg-link'
+        if os.path.isfile(egglink):
+            return egglink
+
+
+def dist_location(dist):
+    """
+    Get the site-packages location of this distribution. Generally
+    this is dist.location, except in the case of develop-installed
+    packages, where dist.location is the source code location, and we
+    want to know where the egg-link file is.
+
+    """
+    egg_link = egg_link_path(dist)
+    if egg_link:
+        return egg_link
+    return dist.location
+
+
+def get_terminal_size():
+    """Returns a tuple (x, y) representing the width(x) and the height(x)
+    in characters of the terminal window."""
+    def ioctl_GWINSZ(fd):
+        try:
+            import fcntl
+            import termios
+            import struct
+            cr = struct.unpack(
+                'hh',
+                fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')
+            )
+        except:
+            return None
+        if cr == (0, 0):
+            return None
+        return cr
+    cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2)
+    if not cr:
+        try:
+            fd = os.open(os.ctermid(), os.O_RDONLY)
+            cr = ioctl_GWINSZ(fd)
+            os.close(fd)
+        except:
+            pass
+    if not cr:
+        cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80))
+    return int(cr[1]), int(cr[0])
+
+
+def current_umask():
+    """Get the current umask which involves having to set it temporarily."""
+    mask = os.umask(0)
+    os.umask(mask)
+    return mask
+
+
+def unzip_file(filename, location, flatten=True):
+    """
+    Unzip the file (with path `filename`) to the destination `location`.  All
+    files are written based on system defaults and umask (i.e. permissions are
+    not preserved), except that regular file members with any execute
+    permissions (user, group, or world) have "chmod +x" applied after being
+    written. Note that for windows, any execute changes using os.chmod are
+    no-ops per the python docs.
+    """
+    ensure_dir(location)
+    zipfp = open(filename, 'rb')
+    try:
+        zip = zipfile.ZipFile(zipfp, allowZip64=True)
+        leading = has_leading_dir(zip.namelist()) and flatten
+        for info in zip.infolist():
+            name = info.filename
+            data = zip.read(name)
+            fn = name
+            if leading:
+                fn = split_leading_dir(name)[1]
+            fn = os.path.join(location, fn)
+            dir = os.path.dirname(fn)
+            if fn.endswith('/') or fn.endswith('\\'):
+                # A directory
+                ensure_dir(fn)
+            else:
+                ensure_dir(dir)
+                fp = open(fn, 'wb')
+                try:
+                    fp.write(data)
+                finally:
+                    fp.close()
+                    mode = info.external_attr >> 16
+                    # if mode and regular file and any execute permissions for
+                    # user/group/world?
+                    if mode and stat.S_ISREG(mode) and mode & 0o111:
+                        # make dest file have execute for user/group/world
+                        # (chmod +x) no-op on windows per python docs
+                        os.chmod(fn, (0o777 - current_umask() | 0o111))
+    finally:
+        zipfp.close()
+
+
+def untar_file(filename, location):
+    """
+    Untar the file (with path `filename`) to the destination `location`.
+    All files are written based on system defaults and umask (i.e. permissions
+    are not preserved), except that regular file members with any execute
+    permissions (user, group, or world) have "chmod +x" applied after being
+    written.  Note that for windows, any execute changes using os.chmod are
+    no-ops per the python docs.
+    """
+    ensure_dir(location)
+    if filename.lower().endswith('.gz') or filename.lower().endswith('.tgz'):
+        mode = 'r:gz'
+    elif filename.lower().endswith(BZ2_EXTENSIONS):
+        mode = 'r:bz2'
+    elif filename.lower().endswith(XZ_EXTENSIONS):
+        mode = 'r:xz'
+    elif filename.lower().endswith('.tar'):
+        mode = 'r'
+    else:
+        logger.warning(
+            'Cannot determine compression type for file %s', filename,
+        )
+        mode = 'r:*'
+    tar = tarfile.open(filename, mode)
+    try:
+        # note: python<=2.5 doesn't seem to know about pax headers, filter them
+        leading = has_leading_dir([
+            member.name for member in tar.getmembers()
+            if member.name != 'pax_global_header'
+        ])
+        for member in tar.getmembers():
+            fn = member.name
+            if fn == 'pax_global_header':
+                continue
+            if leading:
+                fn = split_leading_dir(fn)[1]
+            path = os.path.join(location, fn)
+            if member.isdir():
+                ensure_dir(path)
+            elif member.issym():
+                try:
+                    tar._extract_member(member, path)
+                except Exception as exc:
+                    # Some corrupt tar files seem to produce this
+                    # (specifically bad symlinks)
+                    logger.warning(
+                        'In the tar file %s the member %s is invalid: %s',
+                        filename, member.name, exc,
+                    )
+                    continue
+            else:
+                try:
+                    fp = tar.extractfile(member)
+                except (KeyError, AttributeError) as exc:
+                    # Some corrupt tar files seem to produce this
+                    # (specifically bad symlinks)
+                    logger.warning(
+                        'In the tar file %s the member %s is invalid: %s',
+                        filename, member.name, exc,
+                    )
+                    continue
+                ensure_dir(os.path.dirname(path))
+                with open(path, 'wb') as destfp:
+                    shutil.copyfileobj(fp, destfp)
+                fp.close()
+                # Update the timestamp (useful for cython compiled files)
+                tar.utime(member, path)
+                # member have any execute permissions for user/group/world?
+                if member.mode & 0o111:
+                    # make dest file have execute for user/group/world
+                    # no-op on windows per python docs
+                    os.chmod(path, (0o777 - current_umask() | 0o111))
+    finally:
+        tar.close()
+
+
+def unpack_file(filename, location, content_type, link):
+    filename = os.path.realpath(filename)
+    if (content_type == 'application/zip' or
+            filename.lower().endswith(ZIP_EXTENSIONS) or
+            zipfile.is_zipfile(filename)):
+        unzip_file(
+            filename,
+            location,
+            flatten=not filename.endswith('.whl')
+        )
+    elif (content_type == 'application/x-gzip' or
+            tarfile.is_tarfile(filename) or
+            filename.lower().endswith(
+                TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS)):
+        untar_file(filename, location)
+    elif (content_type and content_type.startswith('text/html') and
+            is_svn_page(file_contents(filename))):
+        # We don't really care about this
+        from pip.vcs.subversion import Subversion
+        Subversion('svn+' + link.url).unpack(location)
+    else:
+        # FIXME: handle?
+        # FIXME: magic signatures?
+        logger.critical(
+            'Cannot unpack file %s (downloaded from %s, content-type: %s); '
+            'cannot detect archive format',
+            filename, location, content_type,
+        )
+        raise InstallationError(
+            'Cannot determine archive format of %s' % location
+        )
+
+
+def call_subprocess(cmd, show_stdout=True, cwd=None,
+                    on_returncode='raise',
+                    command_desc=None,
+                    extra_environ=None, spinner=None):
+    # This function's handling of subprocess output is confusing and I
+    # previously broke it terribly, so as penance I will write a long comment
+    # explaining things.
+    #
+    # The obvious thing that affects output is the show_stdout=
+    # kwarg. show_stdout=True means, let the subprocess write directly to our
+    # stdout. Even though it is nominally the default, it is almost never used
+    # inside pip (and should not be used in new code without a very good
+    # reason); as of 2016-02-22 it is only used in a few places inside the VCS
+    # wrapper code. Ideally we should get rid of it entirely, because it
+    # creates a lot of complexity here for a rarely used feature.
+    #
+    # Most places in pip set show_stdout=False. What this means is:
+    # - We connect the child stdout to a pipe, which we read.
+    # - By default, we hide the output but show a spinner -- unless the
+    #   subprocess exits with an error, in which case we show the output.
+    # - If the --verbose option was passed (= loglevel is DEBUG), then we show
+    #   the output unconditionally. (But in this case we don't want to show
+    #   the output a second time if it turns out that there was an error.)
+    #
+    # stderr is always merged with stdout (even if show_stdout=True).
+    if show_stdout:
+        stdout = None
+    else:
+        stdout = subprocess.PIPE
+    if command_desc is None:
+        cmd_parts = []
+        for part in cmd:
+            if ' ' in part or '\n' in part or '"' in part or "'" in part:
+                part = '"%s"' % part.replace('"', '\\"')
+            cmd_parts.append(part)
+        command_desc = ' '.join(cmd_parts)
+    logger.debug("Running command %s", command_desc)
+    env = os.environ.copy()
+    if extra_environ:
+        env.update(extra_environ)
+    try:
+        proc = subprocess.Popen(
+            cmd, stderr=subprocess.STDOUT, stdin=None, stdout=stdout,
+            cwd=cwd, env=env)
+    except Exception as exc:
+        logger.critical(
+            "Error %s while executing command %s", exc, command_desc,
+        )
+        raise
+    if stdout is not None:
+        all_output = []
+        while True:
+            line = console_to_str(proc.stdout.readline())
+            if not line:
+                break
+            line = line.rstrip()
+            all_output.append(line + '\n')
+            if logger.getEffectiveLevel() <= std_logging.DEBUG:
+                # Show the line immediately
+                logger.debug(line)
+            else:
+                # Update the spinner
+                if spinner is not None:
+                    spinner.spin()
+    proc.wait()
+    if spinner is not None:
+        if proc.returncode:
+            spinner.finish("error")
+        else:
+            spinner.finish("done")
+    if proc.returncode:
+        if on_returncode == 'raise':
+            if (logger.getEffectiveLevel() > std_logging.DEBUG and
+                    not show_stdout):
+                logger.info(
+                    'Complete output from command %s:', command_desc,
+                )
+                logger.info(
+                    ''.join(all_output) +
+                    '\n----------------------------------------'
+                )
+            raise InstallationError(
+                'Command "%s" failed with error code %s in %s'
+                % (command_desc, proc.returncode, cwd))
+        elif on_returncode == 'warn':
+            logger.warning(
+                'Command "%s" had error code %s in %s',
+                command_desc, proc.returncode, cwd,
+            )
+        elif on_returncode == 'ignore':
+            pass
+        else:
+            raise ValueError('Invalid value: on_returncode=%s' %
+                             repr(on_returncode))
+    if not show_stdout:
+        return ''.join(all_output)
+
+
+def read_text_file(filename):
+    """Return the contents of *filename*.
+
+    Try to decode the file contents with utf-8, the preferred system encoding
+    (e.g., cp1252 on some Windows machines), and latin1, in that order.
+    Decoding a byte string with latin1 will never raise an error. In the worst
+    case, the returned string will contain some garbage characters.
+
+    """
+    with open(filename, 'rb') as fp:
+        data = fp.read()
+
+    encodings = ['utf-8', locale.getpreferredencoding(False), 'latin1']
+    for enc in encodings:
+        try:
+            data = data.decode(enc)
+        except UnicodeDecodeError:
+            continue
+        break
+
+    assert type(data) != bytes  # Latin1 should have worked.
+    return data
+
+
+def _make_build_dir(build_dir):
+    os.makedirs(build_dir)
+    write_delete_marker_file(build_dir)
+
+
+class FakeFile(object):
+    """Wrap a list of lines in an object with readline() to make
+    ConfigParser happy."""
+    def __init__(self, lines):
+        self._gen = (l for l in lines)
+
+    def readline(self):
+        try:
+            try:
+                return next(self._gen)
+            except NameError:
+                return self._gen.next()
+        except StopIteration:
+            return ''
+
+    def __iter__(self):
+        return self._gen
+
+
+class StreamWrapper(StringIO):
+
+    @classmethod
+    def from_stream(cls, orig_stream):
+        cls.orig_stream = orig_stream
+        return cls()
+
+    # compileall.compile_dir() needs stdout.encoding to print to stdout
+    @property
+    def encoding(self):
+        return self.orig_stream.encoding
+
+
+@contextlib.contextmanager
+def captured_output(stream_name):
+    """Return a context manager used by captured_stdout/stdin/stderr
+    that temporarily replaces the sys stream *stream_name* with a StringIO.
+
+    Taken from Lib/support/__init__.py in the CPython repo.
+    """
+    orig_stdout = getattr(sys, stream_name)
+    setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout))
+    try:
+        yield getattr(sys, stream_name)
+    finally:
+        setattr(sys, stream_name, orig_stdout)
+
+
+def captured_stdout():
+    """Capture the output of sys.stdout:
+
+       with captured_stdout() as stdout:
+           print('hello')
+       self.assertEqual(stdout.getvalue(), 'hello\n')
+
+    Taken from Lib/support/__init__.py in the CPython repo.
+    """
+    return captured_output('stdout')
+
+
+class cached_property(object):
+    """A property that is only computed once per instance and then replaces
+       itself with an ordinary attribute. Deleting the attribute resets the
+       property.
+
+       Source: https://github.com/bottlepy/bottle/blob/0.11.5/bottle.py#L175
+    """
+
+    def __init__(self, func):
+        self.__doc__ = getattr(func, '__doc__')
+        self.func = func
+
+    def __get__(self, obj, cls):
+        if obj is None:
+            # We're being accessed from the class itself, not from an object
+            return self
+        value = obj.__dict__[self.func.__name__] = self.func(obj)
+        return value
+
+
+def get_installed_version(dist_name, lookup_dirs=None):
+    """Get the installed version of dist_name avoiding pkg_resources cache"""
+    # Create a requirement that we'll look for inside of setuptools.
+    req = pkg_resources.Requirement.parse(dist_name)
+
+    # We want to avoid having this cached, so we need to construct a new
+    # working set each time.
+    if lookup_dirs is None:
+        working_set = pkg_resources.WorkingSet()
+    else:
+        working_set = pkg_resources.WorkingSet(lookup_dirs)
+
+    # Get the installed distribution from our working set
+    dist = working_set.find(req)
+
+    # Check to see if we got an installed distribution or not, if we did
+    # we want to return it's version.
+    return dist.version if dist else None
+
+
+def consume(iterator):
+    """Consume an iterable at C speed."""
+    deque(iterator, maxlen=0)
diff --git a/vendor/pip-9.0.3/pip/utils/appdirs.py b/vendor/pip-9.0.3/pip/utils/appdirs.py
new file mode 100644
index 0000000000000000000000000000000000000000..9b8280144d75690ed46f82dfcd961547f58cc1b1
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/utils/appdirs.py
@@ -0,0 +1,248 @@
+"""
+This code was taken from https://github.com/ActiveState/appdirs and modified
+to suit our purposes.
+"""
+from __future__ import absolute_import
+
+import os
+import sys
+
+from pip.compat import WINDOWS, expanduser
+from pip._vendor.six import PY2, text_type
+
+
+def user_cache_dir(appname):
+    r"""
+    Return full path to the user-specific cache dir for this application.
+
+        "appname" is the name of application.
+
+    Typical user cache directories are:
+        macOS:      ~/Library/Caches/<AppName>
+        Unix:       ~/.cache/<AppName> (XDG default)
+        Windows:    C:\Users\<username>\AppData\Local\<AppName>\Cache
+
+    On Windows the only suggestion in the MSDN docs is that local settings go
+    in the `CSIDL_LOCAL_APPDATA` directory. This is identical to the
+    non-roaming app data dir (the default returned by `user_data_dir`). Apps
+    typically put cache data somewhere *under* the given dir here. Some
+    examples:
+        ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache
+        ...\Acme\SuperApp\Cache\1.0
+
+    OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value.
+    """
+    if WINDOWS:
+        # Get the base path
+        path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA"))
+
+        # When using Python 2, return paths as bytes on Windows like we do on
+        # other operating systems. See helper function docs for more details.
+        if PY2 and isinstance(path, text_type):
+            path = _win_path_to_bytes(path)
+
+        # Add our app name and Cache directory to it
+        path = os.path.join(path, appname, "Cache")
+    elif sys.platform == "darwin":
+        # Get the base path
+        path = expanduser("~/Library/Caches")
+
+        # Add our app name to it
+        path = os.path.join(path, appname)
+    else:
+        # Get the base path
+        path = os.getenv("XDG_CACHE_HOME", expanduser("~/.cache"))
+
+        # Add our app name to it
+        path = os.path.join(path, appname)
+
+    return path
+
+
+def user_data_dir(appname, roaming=False):
+    """
+    Return full path to the user-specific data dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "roaming" (boolean, default False) can be set True to use the Windows
+            roaming appdata directory. That means that for users on a Windows
+            network setup for roaming profiles, this user data will be
+            sync'd on login. See
+            <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
+            for a discussion of issues.
+
+    Typical user data directories are:
+        macOS:                  ~/Library/Application Support/<AppName>
+        Unix:                   ~/.local/share/<AppName>    # or in
+                                $XDG_DATA_HOME, if defined
+        Win XP (not roaming):   C:\Documents and Settings\<username>\ ...
+                                ...Application Data\<AppName>
+        Win XP (roaming):       C:\Documents and Settings\<username>\Local ...
+                                ...Settings\Application Data\<AppName>
+        Win 7  (not roaming):   C:\\Users\<username>\AppData\Local\<AppName>
+        Win 7  (roaming):       C:\\Users\<username>\AppData\Roaming\<AppName>
+
+    For Unix, we follow the XDG spec and support $XDG_DATA_HOME.
+    That means, by default "~/.local/share/<AppName>".
+    """
+    if WINDOWS:
+        const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA"
+        path = os.path.join(os.path.normpath(_get_win_folder(const)), appname)
+    elif sys.platform == "darwin":
+        path = os.path.join(
+            expanduser('~/Library/Application Support/'),
+            appname,
+        )
+    else:
+        path = os.path.join(
+            os.getenv('XDG_DATA_HOME', expanduser("~/.local/share")),
+            appname,
+        )
+
+    return path
+
+
+def user_config_dir(appname, roaming=True):
+    """Return full path to the user-specific config dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "roaming" (boolean, default True) can be set False to not use the
+            Windows roaming appdata directory. That means that for users on a
+            Windows network setup for roaming profiles, this user data will be
+            sync'd on login. See
+            <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
+            for a discussion of issues.
+
+    Typical user data directories are:
+        macOS:                  same as user_data_dir
+        Unix:                   ~/.config/<AppName>
+        Win *:                  same as user_data_dir
+
+    For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME.
+    That means, by default "~/.config/<AppName>".
+    """
+    if WINDOWS:
+        path = user_data_dir(appname, roaming=roaming)
+    elif sys.platform == "darwin":
+        path = user_data_dir(appname)
+    else:
+        path = os.getenv('XDG_CONFIG_HOME', expanduser("~/.config"))
+        path = os.path.join(path, appname)
+
+    return path
+
+
+# for the discussion regarding site_config_dirs locations
+# see <https://github.com/pypa/pip/issues/1733>
+def site_config_dirs(appname):
+    """Return a list of potential user-shared config dirs for this application.
+
+        "appname" is the name of application.
+
+    Typical user config directories are:
+        macOS:      /Library/Application Support/<AppName>/
+        Unix:       /etc or $XDG_CONFIG_DIRS[i]/<AppName>/ for each value in
+                    $XDG_CONFIG_DIRS
+        Win XP:     C:\Documents and Settings\All Users\Application ...
+                    ...Data\<AppName>\
+        Vista:      (Fail! "C:\ProgramData" is a hidden *system* directory
+                    on Vista.)
+        Win 7:      Hidden, but writeable on Win 7:
+                    C:\ProgramData\<AppName>\
+    """
+    if WINDOWS:
+        path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA"))
+        pathlist = [os.path.join(path, appname)]
+    elif sys.platform == 'darwin':
+        pathlist = [os.path.join('/Library/Application Support', appname)]
+    else:
+        # try looking in $XDG_CONFIG_DIRS
+        xdg_config_dirs = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg')
+        if xdg_config_dirs:
+            pathlist = [
+                os.path.join(expanduser(x), appname)
+                for x in xdg_config_dirs.split(os.pathsep)
+            ]
+        else:
+            pathlist = []
+
+        # always look in /etc directly as well
+        pathlist.append('/etc')
+
+    return pathlist
+
+
+# -- Windows support functions --
+
+def _get_win_folder_from_registry(csidl_name):
+    """
+    This is a fallback technique at best. I'm not sure if using the
+    registry for this guarantees us the correct answer for all CSIDL_*
+    names.
+    """
+    import _winreg
+
+    shell_folder_name = {
+        "CSIDL_APPDATA": "AppData",
+        "CSIDL_COMMON_APPDATA": "Common AppData",
+        "CSIDL_LOCAL_APPDATA": "Local AppData",
+    }[csidl_name]
+
+    key = _winreg.OpenKey(
+        _winreg.HKEY_CURRENT_USER,
+        r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
+    )
+    directory, _type = _winreg.QueryValueEx(key, shell_folder_name)
+    return directory
+
+
+def _get_win_folder_with_ctypes(csidl_name):
+    csidl_const = {
+        "CSIDL_APPDATA": 26,
+        "CSIDL_COMMON_APPDATA": 35,
+        "CSIDL_LOCAL_APPDATA": 28,
+    }[csidl_name]
+
+    buf = ctypes.create_unicode_buffer(1024)
+    ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf)
+
+    # Downgrade to short path name if have highbit chars. See
+    # <http://bugs.activestate.com/show_bug.cgi?id=85099>.
+    has_high_char = False
+    for c in buf:
+        if ord(c) > 255:
+            has_high_char = True
+            break
+    if has_high_char:
+        buf2 = ctypes.create_unicode_buffer(1024)
+        if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024):
+            buf = buf2
+
+    return buf.value
+
+if WINDOWS:
+    try:
+        import ctypes
+        _get_win_folder = _get_win_folder_with_ctypes
+    except ImportError:
+        _get_win_folder = _get_win_folder_from_registry
+
+
+def _win_path_to_bytes(path):
+    """Encode Windows paths to bytes. Only used on Python 2.
+
+    Motivation is to be consistent with other operating systems where paths
+    are also returned as bytes. This avoids problems mixing bytes and Unicode
+    elsewhere in the codebase. For more details and discussion see
+    <https://github.com/pypa/pip/issues/3463>.
+
+    If encoding using ASCII and MBCS fails, return the original Unicode path.
+    """
+    for encoding in ('ASCII', 'MBCS'):
+        try:
+            return path.encode(encoding)
+        except (UnicodeEncodeError, LookupError):
+            pass
+    return path
diff --git a/vendor/pip-9.0.3/pip/utils/build.py b/vendor/pip-9.0.3/pip/utils/build.py
new file mode 100644
index 0000000000000000000000000000000000000000..fc65cfab3e01ec5c2a092dadb1ca9a05737225f9
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/utils/build.py
@@ -0,0 +1,42 @@
+from __future__ import absolute_import
+
+import os.path
+import tempfile
+
+from pip.utils import rmtree
+
+
+class BuildDirectory(object):
+
+    def __init__(self, name=None, delete=None):
+        # If we were not given an explicit directory, and we were not given an
+        # explicit delete option, then we'll default to deleting.
+        if name is None and delete is None:
+            delete = True
+
+        if name is None:
+            # We realpath here because some systems have their default tmpdir
+            # symlinked to another directory.  This tends to confuse build
+            # scripts, so we canonicalize the path by traversing potential
+            # symlinks here.
+            name = os.path.realpath(tempfile.mkdtemp(prefix="pip-build-"))
+            # If we were not given an explicit directory, and we were not given
+            # an explicit delete option, then we'll default to deleting.
+            if delete is None:
+                delete = True
+
+        self.name = name
+        self.delete = delete
+
+    def __repr__(self):
+        return "<{} {!r}>".format(self.__class__.__name__, self.name)
+
+    def __enter__(self):
+        return self.name
+
+    def __exit__(self, exc, value, tb):
+        self.cleanup()
+
+    def cleanup(self):
+        if self.delete:
+            rmtree(self.name)
diff --git a/vendor/pip-9.0.3/pip/utils/deprecation.py b/vendor/pip-9.0.3/pip/utils/deprecation.py
new file mode 100644
index 0000000000000000000000000000000000000000..c3f799e64a8a503accaf9923850db6e9883be5d6
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/utils/deprecation.py
@@ -0,0 +1,76 @@
+"""
+A module that implements tooling to enable easy warnings about deprecations.
+"""
+from __future__ import absolute_import
+
+import logging
+import warnings
+
+
+class PipDeprecationWarning(Warning):
+    pass
+
+
+class Pending(object):
+    pass
+
+
+class RemovedInPip10Warning(PipDeprecationWarning):
+    pass
+
+
+class RemovedInPip11Warning(PipDeprecationWarning, Pending):
+    pass
+
+
+class Python26DeprecationWarning(PipDeprecationWarning):
+    pass
+
+
+# Warnings <-> Logging Integration
+
+
+_warnings_showwarning = None
+
+
+def _showwarning(message, category, filename, lineno, file=None, line=None):
+    if file is not None:
+        if _warnings_showwarning is not None:
+            _warnings_showwarning(
+                message, category, filename, lineno, file, line,
+            )
+    else:
+        if issubclass(category, PipDeprecationWarning):
+            # We use a specially named logger which will handle all of the
+            # deprecation messages for pip.
+            logger = logging.getLogger("pip.deprecations")
+
+            # This is purposely using the % formatter here instead of letting
+            # the logging module handle the interpolation. This is because we
+            # want it to appear as if someone typed this entire message out.
+            log_message = "DEPRECATION: %s" % message
+
+            # PipDeprecationWarnings that are Pending still have at least 2
+            # versions to go until they are removed so they can just be
+            # warnings.  Otherwise, they will be removed in the very next
+            # version of pip. We want these to be more obvious so we use the
+            # ERROR logging level.
+            if issubclass(category, Pending):
+                logger.warning(log_message)
+            else:
+                logger.error(log_message)
+        else:
+            _warnings_showwarning(
+                message, category, filename, lineno, file, line,
+            )
+
+
+def install_warning_logger():
+    # Enable our Deprecation Warnings
+    warnings.simplefilter("default", PipDeprecationWarning, append=True)
+
+    global _warnings_showwarning
+
+    if _warnings_showwarning is None:
+        _warnings_showwarning = warnings.showwarning
+        warnings.showwarning = _showwarning
diff --git a/vendor/pip-9.0.3/pip/utils/encoding.py b/vendor/pip-9.0.3/pip/utils/encoding.py
new file mode 100644
index 0000000000000000000000000000000000000000..24831686cf4058c18e04eb2b1dc1201d22852cef
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/utils/encoding.py
@@ -0,0 +1,31 @@
+import codecs
+import locale
+import re
+
+
+BOMS = [
+    (codecs.BOM_UTF8, 'utf8'),
+    (codecs.BOM_UTF16, 'utf16'),
+    (codecs.BOM_UTF16_BE, 'utf16-be'),
+    (codecs.BOM_UTF16_LE, 'utf16-le'),
+    (codecs.BOM_UTF32, 'utf32'),
+    (codecs.BOM_UTF32_BE, 'utf32-be'),
+    (codecs.BOM_UTF32_LE, 'utf32-le'),
+]
+
+ENCODING_RE = re.compile(b'coding[:=]\s*([-\w.]+)')
+
+
+def auto_decode(data):
+    """Check a bytes string for a BOM to correctly detect the encoding
+
+    Fallback to locale.getpreferredencoding(False) like open() on Python3"""
+    for bom, encoding in BOMS:
+        if data.startswith(bom):
+            return data[len(bom):].decode(encoding)
+    # Lets check the first two lines as in PEP263
+    for line in data.split(b'\n')[:2]:
+        if line[0:1] == b'#' and ENCODING_RE.search(line):
+            encoding = ENCODING_RE.search(line).groups()[0].decode('ascii')
+            return data.decode(encoding)
+    return data.decode(locale.getpreferredencoding(False))
diff --git a/vendor/pip-9.0.3/pip/utils/filesystem.py b/vendor/pip-9.0.3/pip/utils/filesystem.py
new file mode 100644
index 0000000000000000000000000000000000000000..25ad51660d4b4d89d8d2c09e91b9516bb982a308
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/utils/filesystem.py
@@ -0,0 +1,28 @@
+import os
+import os.path
+
+from pip.compat import get_path_uid
+
+
+def check_path_owner(path):
+    # If we don't have a way to check the effective uid of this process, then
+    # we'll just assume that we own the directory.
+    if not hasattr(os, "geteuid"):
+        return True
+
+    previous = None
+    while path != previous:
+        if os.path.lexists(path):
+            # Check if path is writable by current user.
+            if os.geteuid() == 0:
+                # Special handling for root user in order to handle properly
+                # cases where users use sudo without -H flag.
+                try:
+                    path_uid = get_path_uid(path)
+                except OSError:
+                    return False
+                return path_uid == 0
+            else:
+                return os.access(path, os.W_OK)
+        else:
+            previous, path = path, os.path.dirname(path)
diff --git a/vendor/pip-9.0.3/pip/utils/glibc.py b/vendor/pip-9.0.3/pip/utils/glibc.py
new file mode 100644
index 0000000000000000000000000000000000000000..7847885c4f93946545549bb79e5989b83271a7e1
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/utils/glibc.py
@@ -0,0 +1,81 @@
+from __future__ import absolute_import
+
+import re
+import ctypes
+import platform
+import warnings
+
+
+def glibc_version_string():
+    "Returns glibc version string, or None if not using glibc."
+
+    # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen
+    # manpage says, "If filename is NULL, then the returned handle is for the
+    # main program". This way we can let the linker do the work to figure out
+    # which libc our process is actually using.
+    process_namespace = ctypes.CDLL(None)
+    try:
+        gnu_get_libc_version = process_namespace.gnu_get_libc_version
+    except AttributeError:
+        # Symbol doesn't exist -> therefore, we are not linked to
+        # glibc.
+        return None
+
+    # Call gnu_get_libc_version, which returns a string like "2.5"
+    gnu_get_libc_version.restype = ctypes.c_char_p
+    version_str = gnu_get_libc_version()
+    # py2 / py3 compatibility:
+    if not isinstance(version_str, str):
+        version_str = version_str.decode("ascii")
+
+    return version_str
+
+
+# Separated out from have_compatible_glibc for easier unit testing
+def check_glibc_version(version_str, required_major, minimum_minor):
+    # Parse string and check against requested version.
+    #
+    # We use a regexp instead of str.split because we want to discard any
+    # random junk that might come after the minor version -- this might happen
+    # in patched/forked versions of glibc (e.g. Linaro's version of glibc
+    # uses version strings like "2.20-2014.11"). See gh-3588.
+    m = re.match(r"(?P<major>[0-9]+)\.(?P<minor>[0-9]+)", version_str)
+    if not m:
+        warnings.warn("Expected glibc version with 2 components major.minor,"
+                      " got: %s" % version_str, RuntimeWarning)
+        return False
+    return (int(m.group("major")) == required_major and
+            int(m.group("minor")) >= minimum_minor)
+
+
+def have_compatible_glibc(required_major, minimum_minor):
+    version_str = glibc_version_string()
+    if version_str is None:
+        return False
+    return check_glibc_version(version_str, required_major, minimum_minor)
+
+
+# platform.libc_ver regularly returns completely nonsensical glibc
+# versions. E.g. on my computer, platform says:
+#
+#   ~$ python2.7 -c 'import platform; print(platform.libc_ver())'
+#   ('glibc', '2.7')
+#   ~$ python3.5 -c 'import platform; print(platform.libc_ver())'
+#   ('glibc', '2.9')
+#
+# But the truth is:
+#
+#   ~$ ldd --version
+#   ldd (Debian GLIBC 2.22-11) 2.22
+#
+# This is unfortunate, because it means that the linehaul data on libc
+# versions that was generated by pip 8.1.2 and earlier is useless and
+# misleading. Solution: instead of using platform, use our code that actually
+# works.
+def libc_ver():
+    glibc_version = glibc_version_string()
+    if glibc_version is None:
+        # For non-glibc platforms, fall back on platform.libc_ver
+        return platform.libc_ver()
+    else:
+        return ("glibc", glibc_version)
diff --git a/vendor/pip-9.0.3/pip/utils/hashes.py b/vendor/pip-9.0.3/pip/utils/hashes.py
new file mode 100644
index 0000000000000000000000000000000000000000..960297007ae54a8ff0316850f92c49437fe85c72
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/utils/hashes.py
@@ -0,0 +1,92 @@
+from __future__ import absolute_import
+
+import hashlib
+
+from pip.exceptions import HashMismatch, HashMissing, InstallationError
+from pip.utils import read_chunks
+from pip._vendor.six import iteritems, iterkeys, itervalues
+
+
+# The recommended hash algo of the moment. Change this whenever the state of
+# the art changes; it won't hurt backward compatibility.
+FAVORITE_HASH = 'sha256'
+
+
+# Names of hashlib algorithms allowed by the --hash option and ``pip hash``
+# Currently, those are the ones at least as collision-resistant as sha256.
+STRONG_HASHES = ['sha256', 'sha384', 'sha512']
+
+
+class Hashes(object):
+    """A wrapper that builds multiple hashes at once and checks them against
+    known-good values
+
+    """
+    def __init__(self, hashes=None):
+        """
+        :param hashes: A dict of algorithm names pointing to lists of allowed
+            hex digests
+        """
+        self._allowed = {} if hashes is None else hashes
+
+    def check_against_chunks(self, chunks):
+        """Check good hashes against ones built from iterable of chunks of
+        data.
+
+        Raise HashMismatch if none match.
+
+        """
+        gots = {}
+        for hash_name in iterkeys(self._allowed):
+            try:
+                gots[hash_name] = hashlib.new(hash_name)
+            except (ValueError, TypeError):
+                raise InstallationError('Unknown hash name: %s' % hash_name)
+
+        for chunk in chunks:
+            for hash in itervalues(gots):
+                hash.update(chunk)
+
+        for hash_name, got in iteritems(gots):
+            if got.hexdigest() in self._allowed[hash_name]:
+                return
+        self._raise(gots)
+
+    def _raise(self, gots):
+        raise HashMismatch(self._allowed, gots)
+
+    def check_against_file(self, file):
+        """Check good hashes against a file-like object
+
+        Raise HashMismatch if none match.
+
+        """
+        return self.check_against_chunks(read_chunks(file))
+
+    def check_against_path(self, path):
+        with open(path, 'rb') as file:
+            return self.check_against_file(file)
+
+    def __nonzero__(self):
+        """Return whether I know any known-good hashes."""
+        return bool(self._allowed)
+
+    def __bool__(self):
+        return self.__nonzero__()
+
+
+class MissingHashes(Hashes):
+    """A workalike for Hashes used when we're missing a hash for a requirement
+
+    It computes the actual hash of the requirement and raises a HashMissing
+    exception showing it to the user.
+
+    """
+    def __init__(self):
+        """Don't offer the ``hashes`` kwarg."""
+        # Pass our favorite hash in to generate a "gotten hash". With the
+        # empty list, it will never match, so an error will always raise.
+        super(MissingHashes, self).__init__(hashes={FAVORITE_HASH: []})
+
+    def _raise(self, gots):
+        raise HashMissing(gots[FAVORITE_HASH].hexdigest())
diff --git a/vendor/pip-9.0.3/pip/utils/logging.py b/vendor/pip-9.0.3/pip/utils/logging.py
new file mode 100644
index 0000000000000000000000000000000000000000..1c1053abfb4d2f086b2a94f7679a970a5bd269e2
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/utils/logging.py
@@ -0,0 +1,130 @@
+from __future__ import absolute_import
+
+import contextlib
+import logging
+import logging.handlers
+import os
+
+try:
+    import threading
+except ImportError:
+    import dummy_threading as threading
+
+from pip.compat import WINDOWS
+from pip.utils import ensure_dir
+
+try:
+    from pip._vendor import colorama
+# Lots of different errors can come from this, including SystemError and
+# ImportError.
+except Exception:
+    colorama = None
+
+
+_log_state = threading.local()
+_log_state.indentation = 0
+
+
+@contextlib.contextmanager
+def indent_log(num=2):
+    """
+    A context manager which will cause the log output to be indented for any
+    log messages emitted inside it.
+    """
+    _log_state.indentation += num
+    try:
+        yield
+    finally:
+        _log_state.indentation -= num
+
+
+def get_indentation():
+    return getattr(_log_state, 'indentation', 0)
+
+
+class IndentingFormatter(logging.Formatter):
+
+    def format(self, record):
+        """
+        Calls the standard formatter, but will indent all of the log messages
+        by our current indentation level.
+        """
+        formatted = logging.Formatter.format(self, record)
+        formatted = "".join([
+            (" " * get_indentation()) + line
+            for line in formatted.splitlines(True)
+        ])
+        return formatted
+
+
+def _color_wrap(*colors):
+    def wrapped(inp):
+        return "".join(list(colors) + [inp, colorama.Style.RESET_ALL])
+    return wrapped
+
+
+class ColorizedStreamHandler(logging.StreamHandler):
+
+    # Don't build up a list of colors if we don't have colorama
+    if colorama:
+        COLORS = [
+            # This needs to be in order from highest logging level to lowest.
+            (logging.ERROR, _color_wrap(colorama.Fore.RED)),
+            (logging.WARNING, _color_wrap(colorama.Fore.YELLOW)),
+        ]
+    else:
+        COLORS = []
+
+    def __init__(self, stream=None):
+        logging.StreamHandler.__init__(self, stream)
+
+        if WINDOWS and colorama:
+            self.stream = colorama.AnsiToWin32(self.stream)
+
+    def should_color(self):
+        # Don't colorize things if we do not have colorama
+        if not colorama:
+            return False
+
+        real_stream = (
+            self.stream if not isinstance(self.stream, colorama.AnsiToWin32)
+            else self.stream.wrapped
+        )
+
+        # If the stream is a tty we should color it
+        if hasattr(real_stream, "isatty") and real_stream.isatty():
+            return True
+
+        # If we have an ASNI term we should color it
+        if os.environ.get("TERM") == "ANSI":
+            return True
+
+        # If anything else we should not color it
+        return False
+
+    def format(self, record):
+        msg = logging.StreamHandler.format(self, record)
+
+        if self.should_color():
+            for level, color in self.COLORS:
+                if record.levelno >= level:
+                    msg = color(msg)
+                    break
+
+        return msg
+
+
+class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler):
+
+    def _open(self):
+        ensure_dir(os.path.dirname(self.baseFilename))
+        return logging.handlers.RotatingFileHandler._open(self)
+
+
+class MaxLevelFilter(logging.Filter):
+
+    def __init__(self, level):
+        self.level = level
+
+    def filter(self, record):
+        return record.levelno < self.level
diff --git a/vendor/pip-9.0.3/pip/utils/outdated.py b/vendor/pip-9.0.3/pip/utils/outdated.py
new file mode 100644
index 0000000000000000000000000000000000000000..2164cc3cc2f2eb53e954fb80281ccdc927d10600
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/utils/outdated.py
@@ -0,0 +1,162 @@
+from __future__ import absolute_import
+
+import datetime
+import json
+import logging
+import os.path
+import sys
+
+from pip._vendor import lockfile
+from pip._vendor.packaging import version as packaging_version
+
+from pip.compat import total_seconds, WINDOWS
+from pip.models import PyPI
+from pip.locations import USER_CACHE_DIR, running_under_virtualenv
+from pip.utils import ensure_dir, get_installed_version
+from pip.utils.filesystem import check_path_owner
+
+
+SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ"
+
+
+logger = logging.getLogger(__name__)
+
+
+class VirtualenvSelfCheckState(object):
+    def __init__(self):
+        self.statefile_path = os.path.join(sys.prefix, "pip-selfcheck.json")
+
+        # Load the existing state
+        try:
+            with open(self.statefile_path) as statefile:
+                self.state = json.load(statefile)
+        except (IOError, ValueError):
+            self.state = {}
+
+    def save(self, pypi_version, current_time):
+        # Attempt to write out our version check file
+        with open(self.statefile_path, "w") as statefile:
+            json.dump(
+                {
+                    "last_check": current_time.strftime(SELFCHECK_DATE_FMT),
+                    "pypi_version": pypi_version,
+                },
+                statefile,
+                sort_keys=True,
+                separators=(",", ":")
+            )
+
+
+class GlobalSelfCheckState(object):
+    def __init__(self):
+        self.statefile_path = os.path.join(USER_CACHE_DIR, "selfcheck.json")
+
+        # Load the existing state
+        try:
+            with open(self.statefile_path) as statefile:
+                self.state = json.load(statefile)[sys.prefix]
+        except (IOError, ValueError, KeyError):
+            self.state = {}
+
+    def save(self, pypi_version, current_time):
+        # Check to make sure that we own the directory
+        if not check_path_owner(os.path.dirname(self.statefile_path)):
+            return
+
+        # Now that we've ensured the directory is owned by this user, we'll go
+        # ahead and make sure that all our directories are created.
+        ensure_dir(os.path.dirname(self.statefile_path))
+
+        # Attempt to write out our version check file
+        with lockfile.LockFile(self.statefile_path):
+            if os.path.exists(self.statefile_path):
+                with open(self.statefile_path) as statefile:
+                    state = json.load(statefile)
+            else:
+                state = {}
+
+            state[sys.prefix] = {
+                "last_check": current_time.strftime(SELFCHECK_DATE_FMT),
+                "pypi_version": pypi_version,
+            }
+
+            with open(self.statefile_path, "w") as statefile:
+                json.dump(state, statefile, sort_keys=True,
+                          separators=(",", ":"))
+
+
+def load_selfcheck_statefile():
+    if running_under_virtualenv():
+        return VirtualenvSelfCheckState()
+    else:
+        return GlobalSelfCheckState()
+
+
+def pip_version_check(session):
+    """Check for an update for pip.
+
+    Limit the frequency of checks to once per week. State is stored either in
+    the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix
+    of the pip script path.
+    """
+    installed_version = get_installed_version("pip")
+    if installed_version is None:
+        return
+
+    pip_version = packaging_version.parse(installed_version)
+    pypi_version = None
+
+    try:
+        state = load_selfcheck_statefile()
+
+        current_time = datetime.datetime.utcnow()
+        # Determine if we need to refresh the state
+        if "last_check" in state.state and "pypi_version" in state.state:
+            last_check = datetime.datetime.strptime(
+                state.state["last_check"],
+                SELFCHECK_DATE_FMT
+            )
+            if total_seconds(current_time - last_check) < 7 * 24 * 60 * 60:
+                pypi_version = state.state["pypi_version"]
+
+        # Refresh the version if we need to or just see if we need to warn
+        if pypi_version is None:
+            resp = session.get(
+                PyPI.pip_json_url,
+                headers={"Accept": "application/json"},
+            )
+            resp.raise_for_status()
+            pypi_version = [
+                v for v in sorted(
+                    list(resp.json()["releases"]),
+                    key=packaging_version.parse,
+                )
+                if not packaging_version.parse(v).is_prerelease
+            ][-1]
+
+            # save that we've performed a check
+            state.save(pypi_version, current_time)
+
+        remote_version = packaging_version.parse(pypi_version)
+
+        # Determine if our pypi_version is older
+        if (pip_version < remote_version and
+                pip_version.base_version != remote_version.base_version):
+            # Advise "python -m pip" on Windows to avoid issues
+            # with overwriting pip.exe.
+            if WINDOWS:
+                pip_cmd = "python -m pip"
+            else:
+                pip_cmd = "pip"
+            logger.warning(
+                "You are using pip version %s, however version %s is "
+                "available.\nYou should consider upgrading via the "
+                "'%s install --upgrade pip' command.",
+                pip_version, pypi_version, pip_cmd
+            )
+
+    except Exception:
+        logger.debug(
+            "There was an error checking the latest version of pip",
+            exc_info=True,
+        )
diff --git a/vendor/pip-9.0.3/pip/utils/packaging.py b/vendor/pip-9.0.3/pip/utils/packaging.py
new file mode 100644
index 0000000000000000000000000000000000000000..e93b20d158d51265a4ed9178717061ad830b5112
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/utils/packaging.py
@@ -0,0 +1,63 @@
+from __future__ import absolute_import
+
+from email.parser import FeedParser
+
+import logging
+import sys
+
+from pip._vendor.packaging import specifiers
+from pip._vendor.packaging import version
+from pip._vendor import pkg_resources
+
+from pip import exceptions
+
+logger = logging.getLogger(__name__)
+
+
+def check_requires_python(requires_python):
+    """
+    Check if the python version in use match the `requires_python` specifier.
+
+    Returns `True` if the version of python in use matches the requirement.
+    Returns `False` if the version of python in use does not matches the
+    requirement.
+
+    Raises an InvalidSpecifier if `requires_python` have an invalid format.
+    """
+    if requires_python is None:
+        # The package provides no information
+        return True
+    requires_python_specifier = specifiers.SpecifierSet(requires_python)
+
+    # We only use major.minor.micro
+    python_version = version.parse('.'.join(map(str, sys.version_info[:3])))
+    return python_version in requires_python_specifier
+
+
+def get_metadata(dist):
+    if (isinstance(dist, pkg_resources.DistInfoDistribution) and
+            dist.has_metadata('METADATA')):
+        return dist.get_metadata('METADATA')
+    elif dist.has_metadata('PKG-INFO'):
+        return dist.get_metadata('PKG-INFO')
+
+
+def check_dist_requires_python(dist):
+    metadata = get_metadata(dist)
+    feed_parser = FeedParser()
+    feed_parser.feed(metadata)
+    pkg_info_dict = feed_parser.close()
+    requires_python = pkg_info_dict.get('Requires-Python')
+    try:
+        if not check_requires_python(requires_python):
+            raise exceptions.UnsupportedPythonVersion(
+                "%s requires Python '%s' but the running Python is %s" % (
+                    dist.project_name,
+                    requires_python,
+                    '.'.join(map(str, sys.version_info[:3])),)
+            )
+    except specifiers.InvalidSpecifier as e:
+        logger.warning(
+            "Package %s has an invalid Requires-Python entry %s - %s" % (
+                dist.project_name, requires_python, e))
+        return
diff --git a/vendor/pip-9.0.3/pip/utils/setuptools_build.py b/vendor/pip-9.0.3/pip/utils/setuptools_build.py
new file mode 100644
index 0000000000000000000000000000000000000000..03973e976cad1b9f3363fafb9f3513dffa1b2a5e
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/utils/setuptools_build.py
@@ -0,0 +1,8 @@
+# Shim to wrap setup.py invocation with setuptools
+SETUPTOOLS_SHIM = (
+    "import setuptools, tokenize;__file__=%r;"
+    "f=getattr(tokenize, 'open', open)(__file__);"
+    "code=f.read().replace('\\r\\n', '\\n');"
+    "f.close();"
+    "exec(compile(code, __file__, 'exec'))"
+)
diff --git a/vendor/pip-9.0.3/pip/utils/ui.py b/vendor/pip-9.0.3/pip/utils/ui.py
new file mode 100644
index 0000000000000000000000000000000000000000..bba73e3b13307dc4863740da67244f46d3e23ff6
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/utils/ui.py
@@ -0,0 +1,344 @@
+from __future__ import absolute_import
+from __future__ import division
+
+import itertools
+import sys
+from signal import signal, SIGINT, default_int_handler
+import time
+import contextlib
+import logging
+
+from pip.compat import WINDOWS
+from pip.utils import format_size
+from pip.utils.logging import get_indentation
+from pip._vendor import six
+from pip._vendor.progress.bar import Bar, IncrementalBar
+from pip._vendor.progress.helpers import (WritelnMixin,
+                                          HIDE_CURSOR, SHOW_CURSOR)
+from pip._vendor.progress.spinner import Spinner
+
+try:
+    from pip._vendor import colorama
+# Lots of different errors can come from this, including SystemError and
+# ImportError.
+except Exception:
+    colorama = None
+
+logger = logging.getLogger(__name__)
+
+
+def _select_progress_class(preferred, fallback):
+    encoding = getattr(preferred.file, "encoding", None)
+
+    # If we don't know what encoding this file is in, then we'll just assume
+    # that it doesn't support unicode and use the ASCII bar.
+    if not encoding:
+        return fallback
+
+    # Collect all of the possible characters we want to use with the preferred
+    # bar.
+    characters = [
+        getattr(preferred, "empty_fill", six.text_type()),
+        getattr(preferred, "fill", six.text_type()),
+    ]
+    characters += list(getattr(preferred, "phases", []))
+
+    # Try to decode the characters we're using for the bar using the encoding
+    # of the given file, if this works then we'll assume that we can use the
+    # fancier bar and if not we'll fall back to the plaintext bar.
+    try:
+        six.text_type().join(characters).encode(encoding)
+    except UnicodeEncodeError:
+        return fallback
+    else:
+        return preferred
+
+
+_BaseBar = _select_progress_class(IncrementalBar, Bar)
+
+
+class InterruptibleMixin(object):
+    """
+    Helper to ensure that self.finish() gets called on keyboard interrupt.
+
+    This allows downloads to be interrupted without leaving temporary state
+    (like hidden cursors) behind.
+
+    This class is similar to the progress library's existing SigIntMixin
+    helper, but as of version 1.2, that helper has the following problems:
+
+    1. It calls sys.exit().
+    2. It discards the existing SIGINT handler completely.
+    3. It leaves its own handler in place even after an uninterrupted finish,
+       which will have unexpected delayed effects if the user triggers an
+       unrelated keyboard interrupt some time after a progress-displaying
+       download has already completed, for example.
+    """
+
+    def __init__(self, *args, **kwargs):
+        """
+        Save the original SIGINT handler for later.
+        """
+        super(InterruptibleMixin, self).__init__(*args, **kwargs)
+
+        self.original_handler = signal(SIGINT, self.handle_sigint)
+
+        # If signal() returns None, the previous handler was not installed from
+        # Python, and we cannot restore it. This probably should not happen,
+        # but if it does, we must restore something sensible instead, at least.
+        # The least bad option should be Python's default SIGINT handler, which
+        # just raises KeyboardInterrupt.
+        if self.original_handler is None:
+            self.original_handler = default_int_handler
+
+    def finish(self):
+        """
+        Restore the original SIGINT handler after finishing.
+
+        This should happen regardless of whether the progress display finishes
+        normally, or gets interrupted.
+        """
+        super(InterruptibleMixin, self).finish()
+        signal(SIGINT, self.original_handler)
+
+    def handle_sigint(self, signum, frame):
+        """
+        Call self.finish() before delegating to the original SIGINT handler.
+
+        This handler should only be in place while the progress display is
+        active.
+        """
+        self.finish()
+        self.original_handler(signum, frame)
+
+
+class DownloadProgressMixin(object):
+
+    def __init__(self, *args, **kwargs):
+        super(DownloadProgressMixin, self).__init__(*args, **kwargs)
+        self.message = (" " * (get_indentation() + 2)) + self.message
+
+    @property
+    def downloaded(self):
+        return format_size(self.index)
+
+    @property
+    def download_speed(self):
+        # Avoid zero division errors...
+        if self.avg == 0.0:
+            return "..."
+        return format_size(1 / self.avg) + "/s"
+
+    @property
+    def pretty_eta(self):
+        if self.eta:
+            return "eta %s" % self.eta_td
+        return ""
+
+    def iter(self, it, n=1):
+        for x in it:
+            yield x
+            self.next(n)
+        self.finish()
+
+
+class WindowsMixin(object):
+
+    def __init__(self, *args, **kwargs):
+        # The Windows terminal does not support the hide/show cursor ANSI codes
+        # even with colorama. So we'll ensure that hide_cursor is False on
+        # Windows.
+        # This call neds to go before the super() call, so that hide_cursor
+        # is set in time. The base progress bar class writes the "hide cursor"
+        # code to the terminal in its init, so if we don't set this soon
+        # enough, we get a "hide" with no corresponding "show"...
+        if WINDOWS and self.hide_cursor:
+            self.hide_cursor = False
+
+        super(WindowsMixin, self).__init__(*args, **kwargs)
+
+        # Check if we are running on Windows and we have the colorama module,
+        # if we do then wrap our file with it.
+        if WINDOWS and colorama:
+            self.file = colorama.AnsiToWin32(self.file)
+            # The progress code expects to be able to call self.file.isatty()
+            # but the colorama.AnsiToWin32() object doesn't have that, so we'll
+            # add it.
+            self.file.isatty = lambda: self.file.wrapped.isatty()
+            # The progress code expects to be able to call self.file.flush()
+            # but the colorama.AnsiToWin32() object doesn't have that, so we'll
+            # add it.
+            self.file.flush = lambda: self.file.wrapped.flush()
+
+
+class DownloadProgressBar(WindowsMixin, InterruptibleMixin,
+                          DownloadProgressMixin, _BaseBar):
+
+    file = sys.stdout
+    message = "%(percent)d%%"
+    suffix = "%(downloaded)s %(download_speed)s %(pretty_eta)s"
+
+
+class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin,
+                              DownloadProgressMixin, WritelnMixin, Spinner):
+
+    file = sys.stdout
+    suffix = "%(downloaded)s %(download_speed)s"
+
+    def next_phase(self):
+        if not hasattr(self, "_phaser"):
+            self._phaser = itertools.cycle(self.phases)
+        return next(self._phaser)
+
+    def update(self):
+        message = self.message % self
+        phase = self.next_phase()
+        suffix = self.suffix % self
+        line = ''.join([
+            message,
+            " " if message else "",
+            phase,
+            " " if suffix else "",
+            suffix,
+        ])
+
+        self.writeln(line)
+
+
+################################################################
+# Generic "something is happening" spinners
+#
+# We don't even try using progress.spinner.Spinner here because it's actually
+# simpler to reimplement from scratch than to coerce their code into doing
+# what we need.
+################################################################
+
+@contextlib.contextmanager
+def hidden_cursor(file):
+    # The Windows terminal does not support the hide/show cursor ANSI codes,
+    # even via colorama. So don't even try.
+    if WINDOWS:
+        yield
+    # We don't want to clutter the output with control characters if we're
+    # writing to a file, or if the user is running with --quiet.
+    # See https://github.com/pypa/pip/issues/3418
+    elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO:
+        yield
+    else:
+        file.write(HIDE_CURSOR)
+        try:
+            yield
+        finally:
+            file.write(SHOW_CURSOR)
+
+
+class RateLimiter(object):
+    def __init__(self, min_update_interval_seconds):
+        self._min_update_interval_seconds = min_update_interval_seconds
+        self._last_update = 0
+
+    def ready(self):
+        now = time.time()
+        delta = now - self._last_update
+        return delta >= self._min_update_interval_seconds
+
+    def reset(self):
+        self._last_update = time.time()
+
+
+class InteractiveSpinner(object):
+    def __init__(self, message, file=None, spin_chars="-\\|/",
+                 # Empirically, 8 updates/second looks nice
+                 min_update_interval_seconds=0.125):
+        self._message = message
+        if file is None:
+            file = sys.stdout
+        self._file = file
+        self._rate_limiter = RateLimiter(min_update_interval_seconds)
+        self._finished = False
+
+        self._spin_cycle = itertools.cycle(spin_chars)
+
+        self._file.write(" " * get_indentation() + self._message + " ... ")
+        self._width = 0
+
+    def _write(self, status):
+        assert not self._finished
+        # Erase what we wrote before by backspacing to the beginning, writing
+        # spaces to overwrite the old text, and then backspacing again
+        backup = "\b" * self._width
+        self._file.write(backup + " " * self._width + backup)
+        # Now we have a blank slate to add our status
+        self._file.write(status)
+        self._width = len(status)
+        self._file.flush()
+        self._rate_limiter.reset()
+
+    def spin(self):
+        if self._finished:
+            return
+        if not self._rate_limiter.ready():
+            return
+        self._write(next(self._spin_cycle))
+
+    def finish(self, final_status):
+        if self._finished:
+            return
+        self._write(final_status)
+        self._file.write("\n")
+        self._file.flush()
+        self._finished = True
+
+
+# Used for dumb terminals, non-interactive installs (no tty), etc.
+# We still print updates occasionally (once every 60 seconds by default) to
+# act as a keep-alive for systems like Travis-CI that take lack-of-output as
+# an indication that a task has frozen.
+class NonInteractiveSpinner(object):
+    def __init__(self, message, min_update_interval_seconds=60):
+        self._message = message
+        self._finished = False
+        self._rate_limiter = RateLimiter(min_update_interval_seconds)
+        self._update("started")
+
+    def _update(self, status):
+        assert not self._finished
+        self._rate_limiter.reset()
+        logger.info("%s: %s", self._message, status)
+
+    def spin(self):
+        if self._finished:
+            return
+        if not self._rate_limiter.ready():
+            return
+        self._update("still running...")
+
+    def finish(self, final_status):
+        if self._finished:
+            return
+        self._update("finished with status '%s'" % (final_status,))
+        self._finished = True
+
+
+@contextlib.contextmanager
+def open_spinner(message):
+    # Interactive spinner goes directly to sys.stdout rather than being routed
+    # through the logging system, but it acts like it has level INFO,
+    # i.e. it's only displayed if we're at level INFO or better.
+    # Non-interactive spinner goes through the logging system, so it is always
+    # in sync with logging configuration.
+    if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO:
+        spinner = InteractiveSpinner(message)
+    else:
+        spinner = NonInteractiveSpinner(message)
+    try:
+        with hidden_cursor(sys.stdout):
+            yield spinner
+    except KeyboardInterrupt:
+        spinner.finish("canceled")
+        raise
+    except Exception:
+        spinner.finish("error")
+        raise
+    else:
+        spinner.finish("done")
diff --git a/vendor/pip-9.0.3/pip/vcs/__init__.py b/vendor/pip-9.0.3/pip/vcs/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..8d3dbb271d8ec0863629125ca9788a7b11e81b21
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/vcs/__init__.py
@@ -0,0 +1,366 @@
+"""Handles all VCS (version control) support"""
+from __future__ import absolute_import
+
+import errno
+import logging
+import os
+import shutil
+import sys
+
+from pip._vendor.six.moves.urllib import parse as urllib_parse
+
+from pip.exceptions import BadCommand
+from pip.utils import (display_path, backup_dir, call_subprocess,
+                       rmtree, ask_path_exists)
+
+
+__all__ = ['vcs', 'get_src_requirement']
+
+
+logger = logging.getLogger(__name__)
+
+
+class VcsSupport(object):
+    _registry = {}
+    schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn']
+
+    def __init__(self):
+        # Register more schemes with urlparse for various version control
+        # systems
+        urllib_parse.uses_netloc.extend(self.schemes)
+        # Python >= 2.7.4, 3.3 doesn't have uses_fragment
+        if getattr(urllib_parse, 'uses_fragment', None):
+            urllib_parse.uses_fragment.extend(self.schemes)
+        super(VcsSupport, self).__init__()
+
+    def __iter__(self):
+        return self._registry.__iter__()
+
+    @property
+    def backends(self):
+        return list(self._registry.values())
+
+    @property
+    def dirnames(self):
+        return [backend.dirname for backend in self.backends]
+
+    @property
+    def all_schemes(self):
+        schemes = []
+        for backend in self.backends:
+            schemes.extend(backend.schemes)
+        return schemes
+
+    def register(self, cls):
+        if not hasattr(cls, 'name'):
+            logger.warning('Cannot register VCS %s', cls.__name__)
+            return
+        if cls.name not in self._registry:
+            self._registry[cls.name] = cls
+            logger.debug('Registered VCS backend: %s', cls.name)
+
+    def unregister(self, cls=None, name=None):
+        if name in self._registry:
+            del self._registry[name]
+        elif cls in self._registry.values():
+            del self._registry[cls.name]
+        else:
+            logger.warning('Cannot unregister because no class or name given')
+
+    def get_backend_name(self, location):
+        """
+        Return the name of the version control backend if found at given
+        location, e.g. vcs.get_backend_name('/path/to/vcs/checkout')
+        """
+        for vc_type in self._registry.values():
+            if vc_type.controls_location(location):
+                logger.debug('Determine that %s uses VCS: %s',
+                             location, vc_type.name)
+                return vc_type.name
+        return None
+
+    def get_backend(self, name):
+        name = name.lower()
+        if name in self._registry:
+            return self._registry[name]
+
+    def get_backend_from_location(self, location):
+        vc_type = self.get_backend_name(location)
+        if vc_type:
+            return self.get_backend(vc_type)
+        return None
+
+
+vcs = VcsSupport()
+
+
+class VersionControl(object):
+    name = ''
+    dirname = ''
+    # List of supported schemes for this Version Control
+    schemes = ()
+
+    def __init__(self, url=None, *args, **kwargs):
+        self.url = url
+        super(VersionControl, self).__init__(*args, **kwargs)
+
+    def _is_local_repository(self, repo):
+        """
+           posix absolute paths start with os.path.sep,
+           win32 ones start with drive (like c:\\folder)
+        """
+        drive, tail = os.path.splitdrive(repo)
+        return repo.startswith(os.path.sep) or drive
+
+    # See issue #1083 for why this method was introduced:
+    # https://github.com/pypa/pip/issues/1083
+    def translate_egg_surname(self, surname):
+        # For example, Django has branches of the form "stable/1.7.x".
+        return surname.replace('/', '_')
+
+    def export(self, location):
+        """
+        Export the repository at the url to the destination location
+        i.e. only download the files, without vcs informations
+        """
+        raise NotImplementedError
+
+    def get_url_rev(self):
+        """
+        Returns the correct repository URL and revision by parsing the given
+        repository URL
+        """
+        error_message = (
+            "Sorry, '%s' is a malformed VCS url. "
+            "The format is <vcs>+<protocol>://<url>, "
+            "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp"
+        )
+        assert '+' in self.url, error_message % self.url
+        url = self.url.split('+', 1)[1]
+        scheme, netloc, path, query, frag = urllib_parse.urlsplit(url)
+        rev = None
+        if '@' in path:
+            path, rev = path.rsplit('@', 1)
+        url = urllib_parse.urlunsplit((scheme, netloc, path, query, ''))
+        return url, rev
+
+    def get_info(self, location):
+        """
+        Returns (url, revision), where both are strings
+        """
+        assert not location.rstrip('/').endswith(self.dirname), \
+            'Bad directory: %s' % location
+        return self.get_url(location), self.get_revision(location)
+
+    def normalize_url(self, url):
+        """
+        Normalize a URL for comparison by unquoting it and removing any
+        trailing slash.
+        """
+        return urllib_parse.unquote(url).rstrip('/')
+
+    def compare_urls(self, url1, url2):
+        """
+        Compare two repo URLs for identity, ignoring incidental differences.
+        """
+        return (self.normalize_url(url1) == self.normalize_url(url2))
+
+    def obtain(self, dest):
+        """
+        Called when installing or updating an editable package, takes the
+        source path of the checkout.
+        """
+        raise NotImplementedError
+
+    def switch(self, dest, url, rev_options):
+        """
+        Switch the repo at ``dest`` to point to ``URL``.
+        """
+        raise NotImplementedError
+
+    def update(self, dest, rev_options):
+        """
+        Update an already-existing repo to the given ``rev_options``.
+        """
+        raise NotImplementedError
+
+    def check_version(self, dest, rev_options):
+        """
+        Return True if the version is identical to what exists and
+        doesn't need to be updated.
+        """
+        raise NotImplementedError
+
+    def check_destination(self, dest, url, rev_options, rev_display):
+        """
+        Prepare a location to receive a checkout/clone.
+
+        Return True if the location is ready for (and requires) a
+        checkout/clone, False otherwise.
+        """
+        checkout = True
+        prompt = False
+        if os.path.exists(dest):
+            checkout = False
+            if os.path.exists(os.path.join(dest, self.dirname)):
+                existing_url = self.get_url(dest)
+                if self.compare_urls(existing_url, url):
+                    logger.debug(
+                        '%s in %s exists, and has correct URL (%s)',
+                        self.repo_name.title(),
+                        display_path(dest),
+                        url,
+                    )
+                    if not self.check_version(dest, rev_options):
+                        logger.info(
+                            'Updating %s %s%s',
+                            display_path(dest),
+                            self.repo_name,
+                            rev_display,
+                        )
+                        self.update(dest, rev_options)
+                    else:
+                        logger.info(
+                            'Skipping because already up-to-date.')
+                else:
+                    logger.warning(
+                        '%s %s in %s exists with URL %s',
+                        self.name,
+                        self.repo_name,
+                        display_path(dest),
+                        existing_url,
+                    )
+                    prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ',
+                              ('s', 'i', 'w', 'b'))
+            else:
+                logger.warning(
+                    'Directory %s already exists, and is not a %s %s.',
+                    dest,
+                    self.name,
+                    self.repo_name,
+                )
+                prompt = ('(i)gnore, (w)ipe, (b)ackup ', ('i', 'w', 'b'))
+        if prompt:
+            logger.warning(
+                'The plan is to install the %s repository %s',
+                self.name,
+                url,
+            )
+            response = ask_path_exists('What to do?  %s' % prompt[0],
+                                       prompt[1])
+
+            if response == 's':
+                logger.info(
+                    'Switching %s %s to %s%s',
+                    self.repo_name,
+                    display_path(dest),
+                    url,
+                    rev_display,
+                )
+                self.switch(dest, url, rev_options)
+            elif response == 'i':
+                # do nothing
+                pass
+            elif response == 'w':
+                logger.warning('Deleting %s', display_path(dest))
+                rmtree(dest)
+                checkout = True
+            elif response == 'b':
+                dest_dir = backup_dir(dest)
+                logger.warning(
+                    'Backing up %s to %s', display_path(dest), dest_dir,
+                )
+                shutil.move(dest, dest_dir)
+                checkout = True
+            elif response == 'a':
+                sys.exit(-1)
+        return checkout
+
+    def unpack(self, location):
+        """
+        Clean up current location and download the url repository
+        (and vcs infos) into location
+        """
+        if os.path.exists(location):
+            rmtree(location)
+        self.obtain(location)
+
+    def get_src_requirement(self, dist, location):
+        """
+        Return a string representing the requirement needed to
+        redownload the files currently present in location, something
+        like:
+          {repository_url}@{revision}#egg={project_name}-{version_identifier}
+        """
+        raise NotImplementedError
+
+    def get_url(self, location):
+        """
+        Return the url used at location
+        Used in get_info or check_destination
+        """
+        raise NotImplementedError
+
+    def get_revision(self, location):
+        """
+        Return the current revision of the files at location
+        Used in get_info
+        """
+        raise NotImplementedError
+
+    def run_command(self, cmd, show_stdout=True, cwd=None,
+                    on_returncode='raise',
+                    command_desc=None,
+                    extra_environ=None, spinner=None):
+        """
+        Run a VCS subcommand
+        This is simply a wrapper around call_subprocess that adds the VCS
+        command name, and checks that the VCS is available
+        """
+        cmd = [self.name] + cmd
+        try:
+            return call_subprocess(cmd, show_stdout, cwd,
+                                   on_returncode,
+                                   command_desc, extra_environ,
+                                   spinner)
+        except OSError as e:
+            # errno.ENOENT = no such file or directory
+            # In other words, the VCS executable isn't available
+            if e.errno == errno.ENOENT:
+                raise BadCommand('Cannot find command %r' % self.name)
+            else:
+                raise  # re-raise exception if a different error occurred
+
+    @classmethod
+    def controls_location(cls, location):
+        """
+        Check if a location is controlled by the vcs.
+        It is meant to be overridden to implement smarter detection
+        mechanisms for specific vcs.
+        """
+        logger.debug('Checking in %s for %s (%s)...',
+                     location, cls.dirname, cls.name)
+        path = os.path.join(location, cls.dirname)
+        return os.path.exists(path)
+
+
+def get_src_requirement(dist, location):
+    version_control = vcs.get_backend_from_location(location)
+    if version_control:
+        try:
+            return version_control().get_src_requirement(dist,
+                                                         location)
+        except BadCommand:
+            logger.warning(
+                'cannot determine version of editable source in %s '
+                '(%s command not found in path)',
+                location,
+                version_control.name,
+            )
+            return dist.as_requirement()
+    logger.warning(
+        'cannot determine version of editable source in %s (is not SVN '
+        'checkout, Git clone, Mercurial clone or Bazaar branch)',
+        location,
+    )
+    return dist.as_requirement()
diff --git a/vendor/pip-9.0.3/pip/vcs/bazaar.py b/vendor/pip-9.0.3/pip/vcs/bazaar.py
new file mode 100644
index 0000000000000000000000000000000000000000..0f095841d361f43925af6d766bf9ec3a86a4a22c
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/vcs/bazaar.py
@@ -0,0 +1,116 @@
+from __future__ import absolute_import
+
+import logging
+import os
+import tempfile
+
+# TODO: Get this into six.moves.urllib.parse
+try:
+    from urllib import parse as urllib_parse
+except ImportError:
+    import urlparse as urllib_parse
+
+from pip.utils import rmtree, display_path
+from pip.vcs import vcs, VersionControl
+from pip.download import path_to_url
+
+
+logger = logging.getLogger(__name__)
+
+
+class Bazaar(VersionControl):
+    name = 'bzr'
+    dirname = '.bzr'
+    repo_name = 'branch'
+    schemes = (
+        'bzr', 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp',
+        'bzr+lp',
+    )
+
+    def __init__(self, url=None, *args, **kwargs):
+        super(Bazaar, self).__init__(url, *args, **kwargs)
+        # Python >= 2.7.4, 3.3 doesn't have uses_fragment or non_hierarchical
+        # Register lp but do not expose as a scheme to support bzr+lp.
+        if getattr(urllib_parse, 'uses_fragment', None):
+            urllib_parse.uses_fragment.extend(['lp'])
+            urllib_parse.non_hierarchical.extend(['lp'])
+
+    def export(self, location):
+        """
+        Export the Bazaar repository at the url to the destination location
+        """
+        temp_dir = tempfile.mkdtemp('-export', 'pip-')
+        self.unpack(temp_dir)
+        if os.path.exists(location):
+            # Remove the location to make sure Bazaar can export it correctly
+            rmtree(location)
+        try:
+            self.run_command(['export', location], cwd=temp_dir,
+                             show_stdout=False)
+        finally:
+            rmtree(temp_dir)
+
+    def switch(self, dest, url, rev_options):
+        self.run_command(['switch', url], cwd=dest)
+
+    def update(self, dest, rev_options):
+        self.run_command(['pull', '-q'] + rev_options, cwd=dest)
+
+    def obtain(self, dest):
+        url, rev = self.get_url_rev()
+        if rev:
+            rev_options = ['-r', rev]
+            rev_display = ' (to revision %s)' % rev
+        else:
+            rev_options = []
+            rev_display = ''
+        if self.check_destination(dest, url, rev_options, rev_display):
+            logger.info(
+                'Checking out %s%s to %s',
+                url,
+                rev_display,
+                display_path(dest),
+            )
+            self.run_command(['branch', '-q'] + rev_options + [url, dest])
+
+    def get_url_rev(self):
+        # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it
+        url, rev = super(Bazaar, self).get_url_rev()
+        if url.startswith('ssh://'):
+            url = 'bzr+' + url
+        return url, rev
+
+    def get_url(self, location):
+        urls = self.run_command(['info'], show_stdout=False, cwd=location)
+        for line in urls.splitlines():
+            line = line.strip()
+            for x in ('checkout of branch: ',
+                      'parent branch: '):
+                if line.startswith(x):
+                    repo = line.split(x)[1]
+                    if self._is_local_repository(repo):
+                        return path_to_url(repo)
+                    return repo
+        return None
+
+    def get_revision(self, location):
+        revision = self.run_command(
+            ['revno'], show_stdout=False, cwd=location)
+        return revision.splitlines()[-1]
+
+    def get_src_requirement(self, dist, location):
+        repo = self.get_url(location)
+        if not repo:
+            return None
+        if not repo.lower().startswith('bzr:'):
+            repo = 'bzr+' + repo
+        egg_project_name = dist.egg_name().split('-', 1)[0]
+        current_rev = self.get_revision(location)
+        return '%s@%s#egg=%s' % (repo, current_rev, egg_project_name)
+
+    def check_version(self, dest, rev_options):
+        """Always assume the versions don't match"""
+        return False
+
+
+vcs.register(Bazaar)
diff --git a/vendor/pip-9.0.3/pip/vcs/git.py b/vendor/pip-9.0.3/pip/vcs/git.py
new file mode 100644
index 0000000000000000000000000000000000000000..2187dd84629b4cacc585ca019774764b81d30e4a
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/vcs/git.py
@@ -0,0 +1,300 @@
+from __future__ import absolute_import
+
+import logging
+import tempfile
+import os.path
+
+from pip.compat import samefile
+from pip.exceptions import BadCommand
+from pip._vendor.six.moves.urllib import parse as urllib_parse
+from pip._vendor.six.moves.urllib import request as urllib_request
+from pip._vendor.packaging.version import parse as parse_version
+
+from pip.utils import display_path, rmtree
+from pip.vcs import vcs, VersionControl
+
+
+urlsplit = urllib_parse.urlsplit
+urlunsplit = urllib_parse.urlunsplit
+
+
+logger = logging.getLogger(__name__)
+
+
+class Git(VersionControl):
+    name = 'git'
+    dirname = '.git'
+    repo_name = 'clone'
+    schemes = (
+        'git', 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file',
+    )
+
+    def __init__(self, url=None, *args, **kwargs):
+
+        # Works around an apparent Git bug
+        # (see http://article.gmane.org/gmane.comp.version-control.git/146500)
+        if url:
+            scheme, netloc, path, query, fragment = urlsplit(url)
+            if scheme.endswith('file'):
+                initial_slashes = path[:-len(path.lstrip('/'))]
+                newpath = (
+                    initial_slashes +
+                    urllib_request.url2pathname(path)
+                    .replace('\\', '/').lstrip('/')
+                )
+                url = urlunsplit((scheme, netloc, newpath, query, fragment))
+                after_plus = scheme.find('+') + 1
+                url = scheme[:after_plus] + urlunsplit(
+                    (scheme[after_plus:], netloc, newpath, query, fragment),
+                )
+
+        super(Git, self).__init__(url, *args, **kwargs)
+
+    def get_git_version(self):
+        VERSION_PFX = 'git version '
+        version = self.run_command(['version'], show_stdout=False)
+        if version.startswith(VERSION_PFX):
+            version = version[len(VERSION_PFX):]
+        else:
+            version = ''
+        # get first 3 positions of the git version becasue
+        # on windows it is x.y.z.windows.t, and this parses as
+        # LegacyVersion which always smaller than a Version.
+        version = '.'.join(version.split('.')[:3])
+        return parse_version(version)
+
+    def export(self, location):
+        """Export the Git repository at the url to the destination location"""
+        temp_dir = tempfile.mkdtemp('-export', 'pip-')
+        self.unpack(temp_dir)
+        try:
+            if not location.endswith('/'):
+                location = location + '/'
+            self.run_command(
+                ['checkout-index', '-a', '-f', '--prefix', location],
+                show_stdout=False, cwd=temp_dir)
+        finally:
+            rmtree(temp_dir)
+
+    def check_rev_options(self, rev, dest, rev_options):
+        """Check the revision options before checkout to compensate that tags
+        and branches may need origin/ as a prefix.
+        Returns the SHA1 of the branch or tag if found.
+        """
+        revisions = self.get_short_refs(dest)
+
+        origin_rev = 'origin/%s' % rev
+        if origin_rev in revisions:
+            # remote branch
+            return [revisions[origin_rev]]
+        elif rev in revisions:
+            # a local tag or branch name
+            return [revisions[rev]]
+        else:
+            logger.warning(
+                "Could not find a tag or branch '%s', assuming commit.", rev,
+            )
+            return rev_options
+
+    def check_version(self, dest, rev_options):
+        """
+        Compare the current sha to the ref. ref may be a branch or tag name,
+        but current rev will always point to a sha. This means that a branch
+        or tag will never compare as True. So this ultimately only matches
+        against exact shas.
+        """
+        return self.get_revision(dest).startswith(rev_options[0])
+
+    def switch(self, dest, url, rev_options):
+        self.run_command(['config', 'remote.origin.url', url], cwd=dest)
+        self.run_command(['checkout', '-q'] + rev_options, cwd=dest)
+
+        self.update_submodules(dest)
+
+    def update(self, dest, rev_options):
+        # First fetch changes from the default remote
+        if self.get_git_version() >= parse_version('1.9.0'):
+            # fetch tags in addition to everything else
+            self.run_command(['fetch', '-q', '--tags'], cwd=dest)
+        else:
+            self.run_command(['fetch', '-q'], cwd=dest)
+        # Then reset to wanted revision (maybe even origin/master)
+        if rev_options:
+            rev_options = self.check_rev_options(
+                rev_options[0], dest, rev_options,
+            )
+        self.run_command(['reset', '--hard', '-q'] + rev_options, cwd=dest)
+        #: update submodules
+        self.update_submodules(dest)
+
+    def obtain(self, dest):
+        url, rev = self.get_url_rev()
+        if rev:
+            rev_options = [rev]
+            rev_display = ' (to %s)' % rev
+        else:
+            rev_options = ['origin/master']
+            rev_display = ''
+        if self.check_destination(dest, url, rev_options, rev_display):
+            logger.info(
+                'Cloning %s%s to %s', url, rev_display, display_path(dest),
+            )
+            self.run_command(['clone', '-q', url, dest])
+
+            if rev:
+                rev_options = self.check_rev_options(rev, dest, rev_options)
+                # Only do a checkout if rev_options differs from HEAD
+                if not self.check_version(dest, rev_options):
+                    self.run_command(
+                        ['checkout', '-q'] + rev_options,
+                        cwd=dest,
+                    )
+            #: repo may contain submodules
+            self.update_submodules(dest)
+
+    def get_url(self, location):
+        """Return URL of the first remote encountered."""
+        remotes = self.run_command(
+            ['config', '--get-regexp', 'remote\..*\.url'],
+            show_stdout=False, cwd=location)
+        remotes = remotes.splitlines()
+        found_remote = remotes[0]
+        for remote in remotes:
+            if remote.startswith('remote.origin.url '):
+                found_remote = remote
+                break
+        url = found_remote.split(' ')[1]
+        return url.strip()
+
+    def get_revision(self, location):
+        current_rev = self.run_command(
+            ['rev-parse', 'HEAD'], show_stdout=False, cwd=location)
+        return current_rev.strip()
+
+    def get_full_refs(self, location):
+        """Yields tuples of (commit, ref) for branches and tags"""
+        output = self.run_command(['show-ref'],
+                                  show_stdout=False, cwd=location)
+        for line in output.strip().splitlines():
+            commit, ref = line.split(' ', 1)
+            yield commit.strip(), ref.strip()
+
+    def is_ref_remote(self, ref):
+        return ref.startswith('refs/remotes/')
+
+    def is_ref_branch(self, ref):
+        return ref.startswith('refs/heads/')
+
+    def is_ref_tag(self, ref):
+        return ref.startswith('refs/tags/')
+
+    def is_ref_commit(self, ref):
+        """A ref is a commit sha if it is not anything else"""
+        return not any((
+            self.is_ref_remote(ref),
+            self.is_ref_branch(ref),
+            self.is_ref_tag(ref),
+        ))
+
+    # Should deprecate `get_refs` since it's ambiguous
+    def get_refs(self, location):
+        return self.get_short_refs(location)
+
+    def get_short_refs(self, location):
+        """Return map of named refs (branches or tags) to commit hashes."""
+        rv = {}
+        for commit, ref in self.get_full_refs(location):
+            ref_name = None
+            if self.is_ref_remote(ref):
+                ref_name = ref[len('refs/remotes/'):]
+            elif self.is_ref_branch(ref):
+                ref_name = ref[len('refs/heads/'):]
+            elif self.is_ref_tag(ref):
+                ref_name = ref[len('refs/tags/'):]
+            if ref_name is not None:
+                rv[ref_name] = commit
+        return rv
+
+    def _get_subdirectory(self, location):
+        """Return the relative path of setup.py to the git repo root."""
+        # find the repo root
+        git_dir = self.run_command(['rev-parse', '--git-dir'],
+                                   show_stdout=False, cwd=location).strip()
+        if not os.path.isabs(git_dir):
+            git_dir = os.path.join(location, git_dir)
+        root_dir = os.path.join(git_dir, '..')
+        # find setup.py
+        orig_location = location
+        while not os.path.exists(os.path.join(location, 'setup.py')):
+            last_location = location
+            location = os.path.dirname(location)
+            if location == last_location:
+                # We've traversed up to the root of the filesystem without
+                # finding setup.py
+                logger.warning(
+                    "Could not find setup.py for directory %s (tried all "
+                    "parent directories)",
+                    orig_location,
+                )
+                return None
+        # relative path of setup.py to repo root
+        if samefile(root_dir, location):
+            return None
+        return os.path.relpath(location, root_dir)
+
+    def get_src_requirement(self, dist, location):
+        repo = self.get_url(location)
+        if not repo.lower().startswith('git:'):
+            repo = 'git+' + repo
+        egg_project_name = dist.egg_name().split('-', 1)[0]
+        if not repo:
+            return None
+        current_rev = self.get_revision(location)
+        req = '%s@%s#egg=%s' % (repo, current_rev, egg_project_name)
+        subdirectory = self._get_subdirectory(location)
+        if subdirectory:
+            req += '&subdirectory=' + subdirectory
+        return req
+
+    def get_url_rev(self):
+        """
+        Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'.
+        That's required because although they use SSH they sometimes doesn't
+        work with a ssh:// scheme (e.g. Github). But we need a scheme for
+        parsing. Hence we remove it again afterwards and return it as a stub.
+        """
+        if '://' not in self.url:
+            assert 'file:' not in self.url
+            self.url = self.url.replace('git+', 'git+ssh://')
+            url, rev = super(Git, self).get_url_rev()
+            url = url.replace('ssh://', '')
+        else:
+            url, rev = super(Git, self).get_url_rev()
+
+        return url, rev
+
+    def update_submodules(self, location):
+        if not os.path.exists(os.path.join(location, '.gitmodules')):
+            return
+        self.run_command(
+            ['submodule', 'update', '--init', '--recursive', '-q'],
+            cwd=location,
+        )
+
+    @classmethod
+    def controls_location(cls, location):
+        if super(Git, cls).controls_location(location):
+            return True
+        try:
+            r = cls().run_command(['rev-parse'],
+                                  cwd=location,
+                                  show_stdout=False,
+                                  on_returncode='ignore')
+            return not r
+        except BadCommand:
+            logger.debug("could not determine if %s is under git control "
+                         "because git is not available", location)
+            return False
+
+
+vcs.register(Git)
diff --git a/vendor/pip-9.0.3/pip/vcs/mercurial.py b/vendor/pip-9.0.3/pip/vcs/mercurial.py
new file mode 100644
index 0000000000000000000000000000000000000000..1aa83b914523839c133adf1649a913e8e94b14ef
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/vcs/mercurial.py
@@ -0,0 +1,103 @@
+from __future__ import absolute_import
+
+import logging
+import os
+import tempfile
+
+from pip.utils import display_path, rmtree
+from pip.vcs import vcs, VersionControl
+from pip.download import path_to_url
+from pip._vendor.six.moves import configparser
+
+
+logger = logging.getLogger(__name__)
+
+
+class Mercurial(VersionControl):
+    name = 'hg'
+    dirname = '.hg'
+    repo_name = 'clone'
+    schemes = ('hg', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http')
+
+    def export(self, location):
+        """Export the Hg repository at the url to the destination location"""
+        temp_dir = tempfile.mkdtemp('-export', 'pip-')
+        self.unpack(temp_dir)
+        try:
+            self.run_command(
+                ['archive', location], show_stdout=False, cwd=temp_dir)
+        finally:
+            rmtree(temp_dir)
+
+    def switch(self, dest, url, rev_options):
+        repo_config = os.path.join(dest, self.dirname, 'hgrc')
+        config = configparser.SafeConfigParser()
+        try:
+            config.read(repo_config)
+            config.set('paths', 'default', url)
+            with open(repo_config, 'w') as config_file:
+                config.write(config_file)
+        except (OSError, configparser.NoSectionError) as exc:
+            logger.warning(
+                'Could not switch Mercurial repository to %s: %s', url, exc,
+            )
+        else:
+            self.run_command(['update', '-q'] + rev_options, cwd=dest)
+
+    def update(self, dest, rev_options):
+        self.run_command(['pull', '-q'], cwd=dest)
+        self.run_command(['update', '-q'] + rev_options, cwd=dest)
+
+    def obtain(self, dest):
+        url, rev = self.get_url_rev()
+        if rev:
+            rev_options = [rev]
+            rev_display = ' (to revision %s)' % rev
+        else:
+            rev_options = []
+            rev_display = ''
+        if self.check_destination(dest, url, rev_options, rev_display):
+            logger.info(
+                'Cloning hg %s%s to %s',
+                url,
+                rev_display,
+                display_path(dest),
+            )
+            self.run_command(['clone', '--noupdate', '-q', url, dest])
+            self.run_command(['update', '-q'] + rev_options, cwd=dest)
+
+    def get_url(self, location):
+        url = self.run_command(
+            ['showconfig', 'paths.default'],
+            show_stdout=False, cwd=location).strip()
+        if self._is_local_repository(url):
+            url = path_to_url(url)
+        return url.strip()
+
+    def get_revision(self, location):
+        current_revision = self.run_command(
+            ['parents', '--template={rev}'],
+            show_stdout=False, cwd=location).strip()
+        return current_revision
+
+    def get_revision_hash(self, location):
+        current_rev_hash = self.run_command(
+            ['parents', '--template={node}'],
+            show_stdout=False, cwd=location).strip()
+        return current_rev_hash
+
+    def get_src_requirement(self, dist, location):
+        repo = self.get_url(location)
+        if not repo.lower().startswith('hg:'):
+            repo = 'hg+' + repo
+        egg_project_name = dist.egg_name().split('-', 1)[0]
+        if not repo:
+            return None
+        current_rev_hash = self.get_revision_hash(location)
+        return '%s@%s#egg=%s' % (repo, current_rev_hash, egg_project_name)
+
+    def check_version(self, dest, rev_options):
+        """Always assume the versions don't match"""
+        return False
+
+vcs.register(Mercurial)
diff --git a/vendor/pip-9.0.3/pip/vcs/subversion.py b/vendor/pip-9.0.3/pip/vcs/subversion.py
new file mode 100644
index 0000000000000000000000000000000000000000..4b2315667af539f0fc7dd87a3ce38699632f5d2a
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/vcs/subversion.py
@@ -0,0 +1,269 @@
+from __future__ import absolute_import
+
+import logging
+import os
+import re
+
+from pip._vendor.six.moves.urllib import parse as urllib_parse
+
+from pip.index import Link
+from pip.utils import rmtree, display_path
+from pip.utils.logging import indent_log
+from pip.vcs import vcs, VersionControl
+
+_svn_xml_url_re = re.compile('url="([^"]+)"')
+_svn_rev_re = re.compile('committed-rev="(\d+)"')
+_svn_url_re = re.compile(r'URL: (.+)')
+_svn_revision_re = re.compile(r'Revision: (.+)')
+_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"')
+_svn_info_xml_url_re = re.compile(r'<url>(.*)</url>')
+
+
+logger = logging.getLogger(__name__)
+
+
+class Subversion(VersionControl):
+    name = 'svn'
+    dirname = '.svn'
+    repo_name = 'checkout'
+    schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn')
+
+    def get_info(self, location):
+        """Returns (url, revision), where both are strings"""
+        assert not location.rstrip('/').endswith(self.dirname), \
+            'Bad directory: %s' % location
+        output = self.run_command(
+            ['info', location],
+            show_stdout=False,
+            extra_environ={'LANG': 'C'},
+        )
+        match = _svn_url_re.search(output)
+        if not match:
+            logger.warning(
+                'Cannot determine URL of svn checkout %s',
+                display_path(location),
+            )
+            logger.debug('Output that cannot be parsed: \n%s', output)
+            return None, None
+        url = match.group(1).strip()
+        match = _svn_revision_re.search(output)
+        if not match:
+            logger.warning(
+                'Cannot determine revision of svn checkout %s',
+                display_path(location),
+            )
+            logger.debug('Output that cannot be parsed: \n%s', output)
+            return url, None
+        return url, match.group(1)
+
+    def export(self, location):
+        """Export the svn repository at the url to the destination location"""
+        url, rev = self.get_url_rev()
+        rev_options = get_rev_options(url, rev)
+        url = self.remove_auth_from_url(url)
+        logger.info('Exporting svn repository %s to %s', url, location)
+        with indent_log():
+            if os.path.exists(location):
+                # Subversion doesn't like to check out over an existing
+                # directory --force fixes this, but was only added in svn 1.5
+                rmtree(location)
+            self.run_command(
+                ['export'] + rev_options + [url, location],
+                show_stdout=False)
+
+    def switch(self, dest, url, rev_options):
+        self.run_command(['switch'] + rev_options + [url, dest])
+
+    def update(self, dest, rev_options):
+        self.run_command(['update'] + rev_options + [dest])
+
+    def obtain(self, dest):
+        url, rev = self.get_url_rev()
+        rev_options = get_rev_options(url, rev)
+        url = self.remove_auth_from_url(url)
+        if rev:
+            rev_display = ' (to revision %s)' % rev
+        else:
+            rev_display = ''
+        if self.check_destination(dest, url, rev_options, rev_display):
+            logger.info(
+                'Checking out %s%s to %s',
+                url,
+                rev_display,
+                display_path(dest),
+            )
+            self.run_command(['checkout', '-q'] + rev_options + [url, dest])
+
+    def get_location(self, dist, dependency_links):
+        for url in dependency_links:
+            egg_fragment = Link(url).egg_fragment
+            if not egg_fragment:
+                continue
+            if '-' in egg_fragment:
+                # FIXME: will this work when a package has - in the name?
+                key = '-'.join(egg_fragment.split('-')[:-1]).lower()
+            else:
+                key = egg_fragment
+            if key == dist.key:
+                return url.split('#', 1)[0]
+        return None
+
+    def get_revision(self, location):
+        """
+        Return the maximum revision for all files under a given location
+        """
+        # Note: taken from setuptools.command.egg_info
+        revision = 0
+
+        for base, dirs, files in os.walk(location):
+            if self.dirname not in dirs:
+                dirs[:] = []
+                continue    # no sense walking uncontrolled subdirs
+            dirs.remove(self.dirname)
+            entries_fn = os.path.join(base, self.dirname, 'entries')
+            if not os.path.exists(entries_fn):
+                # FIXME: should we warn?
+                continue
+
+            dirurl, localrev = self._get_svn_url_rev(base)
+
+            if base == location:
+                base_url = dirurl + '/'   # save the root url
+            elif not dirurl or not dirurl.startswith(base_url):
+                dirs[:] = []
+                continue    # not part of the same svn tree, skip it
+            revision = max(revision, localrev)
+        return revision
+
+    def get_url_rev(self):
+        # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it
+        url, rev = super(Subversion, self).get_url_rev()
+        if url.startswith('ssh://'):
+            url = 'svn+' + url
+        return url, rev
+
+    def get_url(self, location):
+        # In cases where the source is in a subdirectory, not alongside
+        # setup.py we have to look up in the location until we find a real
+        # setup.py
+        orig_location = location
+        while not os.path.exists(os.path.join(location, 'setup.py')):
+            last_location = location
+            location = os.path.dirname(location)
+            if location == last_location:
+                # We've traversed up to the root of the filesystem without
+                # finding setup.py
+                logger.warning(
+                    "Could not find setup.py for directory %s (tried all "
+                    "parent directories)",
+                    orig_location,
+                )
+                return None
+
+        return self._get_svn_url_rev(location)[0]
+
+    def _get_svn_url_rev(self, location):
+        from pip.exceptions import InstallationError
+
+        entries_path = os.path.join(location, self.dirname, 'entries')
+        if os.path.exists(entries_path):
+            with open(entries_path) as f:
+                data = f.read()
+        else:  # subversion >= 1.7 does not have the 'entries' file
+            data = ''
+
+        if (data.startswith('8') or
+                data.startswith('9') or
+                data.startswith('10')):
+            data = list(map(str.splitlines, data.split('\n\x0c\n')))
+            del data[0][0]  # get rid of the '8'
+            url = data[0][3]
+            revs = [int(d[9]) for d in data if len(d) > 9 and d[9]] + [0]
+        elif data.startswith('<?xml'):
+            match = _svn_xml_url_re.search(data)
+            if not match:
+                raise ValueError('Badly formatted data: %r' % data)
+            url = match.group(1)    # get repository URL
+            revs = [int(m.group(1)) for m in _svn_rev_re.finditer(data)] + [0]
+        else:
+            try:
+                # subversion >= 1.7
+                xml = self.run_command(
+                    ['info', '--xml', location],
+                    show_stdout=False,
+                )
+                url = _svn_info_xml_url_re.search(xml).group(1)
+                revs = [
+                    int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml)
+                ]
+            except InstallationError:
+                url, revs = None, []
+
+        if revs:
+            rev = max(revs)
+        else:
+            rev = 0
+
+        return url, rev
+
+    def get_src_requirement(self, dist, location):
+        repo = self.get_url(location)
+        if repo is None:
+            return None
+        # FIXME: why not project name?
+        egg_project_name = dist.egg_name().split('-', 1)[0]
+        rev = self.get_revision(location)
+        return 'svn+%s@%s#egg=%s' % (repo, rev, egg_project_name)
+
+    def check_version(self, dest, rev_options):
+        """Always assume the versions don't match"""
+        return False
+
+    @staticmethod
+    def remove_auth_from_url(url):
+        # Return a copy of url with 'username:password@' removed.
+        # username/pass params are passed to subversion through flags
+        # and are not recognized in the url.
+
+        # parsed url
+        purl = urllib_parse.urlsplit(url)
+        stripped_netloc = \
+            purl.netloc.split('@')[-1]
+
+        # stripped url
+        url_pieces = (
+            purl.scheme, stripped_netloc, purl.path, purl.query, purl.fragment
+        )
+        surl = urllib_parse.urlunsplit(url_pieces)
+        return surl
+
+
+def get_rev_options(url, rev):
+    if rev:
+        rev_options = ['-r', rev]
+    else:
+        rev_options = []
+
+    r = urllib_parse.urlsplit(url)
+    if hasattr(r, 'username'):
+        # >= Python-2.5
+        username, password = r.username, r.password
+    else:
+        netloc = r[1]
+        if '@' in netloc:
+            auth = netloc.split('@')[0]
+            if ':' in auth:
+                username, password = auth.split(':', 1)
+            else:
+                username, password = auth, None
+        else:
+            username, password = None, None
+
+    if username:
+        rev_options += ['--username', username]
+    if password:
+        rev_options += ['--password', password]
+    return rev_options
+
+
+vcs.register(Subversion)
diff --git a/vendor/pip-9.0.3/pip/wheel.py b/vendor/pip-9.0.3/pip/wheel.py
new file mode 100644
index 0000000000000000000000000000000000000000..9ac9dffed6a13d59c439941552d06c537b3aff51
--- /dev/null
+++ b/vendor/pip-9.0.3/pip/wheel.py
@@ -0,0 +1,853 @@
+"""
+Support for installing and building the "wheel" binary package format.
+"""
+from __future__ import absolute_import
+
+import compileall
+import csv
+import errno
+import functools
+import hashlib
+import logging
+import os
+import os.path
+import re
+import shutil
+import stat
+import sys
+import tempfile
+import warnings
+
+from base64 import urlsafe_b64encode
+from email.parser import Parser
+
+from pip._vendor.six import StringIO
+
+import pip
+from pip.compat import expanduser
+from pip.download import path_to_url, unpack_url
+from pip.exceptions import (
+    InstallationError, InvalidWheelFilename, UnsupportedWheel)
+from pip.locations import distutils_scheme, PIP_DELETE_MARKER_FILENAME
+from pip import pep425tags
+from pip.utils import (
+    call_subprocess, ensure_dir, captured_stdout, rmtree, read_chunks,
+)
+from pip.utils.ui import open_spinner
+from pip.utils.logging import indent_log
+from pip.utils.setuptools_build import SETUPTOOLS_SHIM
+from pip._vendor.distlib.scripts import ScriptMaker
+from pip._vendor import pkg_resources
+from pip._vendor.packaging.utils import canonicalize_name
+from pip._vendor.six.moves import configparser
+
+
+wheel_ext = '.whl'
+
+VERSION_COMPATIBLE = (1, 0)
+
+
+logger = logging.getLogger(__name__)
+
+
+class WheelCache(object):
+    """A cache of wheels for future installs."""
+
+    def __init__(self, cache_dir, format_control):
+        """Create a wheel cache.
+
+        :param cache_dir: The root of the cache.
+        :param format_control: A pip.index.FormatControl object to limit
+            binaries being read from the cache.
+        """
+        self._cache_dir = expanduser(cache_dir) if cache_dir else None
+        self._format_control = format_control
+
+    def cached_wheel(self, link, package_name):
+        return cached_wheel(
+            self._cache_dir, link, self._format_control, package_name)
+
+
+def _cache_for_link(cache_dir, link):
+    """
+    Return a directory to store cached wheels in for link.
+
+    Because there are M wheels for any one sdist, we provide a directory
+    to cache them in, and then consult that directory when looking up
+    cache hits.
+
+    We only insert things into the cache if they have plausible version
+    numbers, so that we don't contaminate the cache with things that were not
+    unique. E.g. ./package might have dozens of installs done for it and build
+    a version of 0.0...and if we built and cached a wheel, we'd end up using
+    the same wheel even if the source has been edited.
+
+    :param cache_dir: The cache_dir being used by pip.
+    :param link: The link of the sdist for which this will cache wheels.
+    """
+
+    # We want to generate an url to use as our cache key, we don't want to just
+    # re-use the URL because it might have other items in the fragment and we
+    # don't care about those.
+    key_parts = [link.url_without_fragment]
+    if link.hash_name is not None and link.hash is not None:
+        key_parts.append("=".join([link.hash_name, link.hash]))
+    key_url = "#".join(key_parts)
+
+    # Encode our key url with sha224, we'll use this because it has similar
+    # security properties to sha256, but with a shorter total output (and thus
+    # less secure). However the differences don't make a lot of difference for
+    # our use case here.
+    hashed = hashlib.sha224(key_url.encode()).hexdigest()
+
+    # We want to nest the directories some to prevent having a ton of top level
+    # directories where we might run out of sub directories on some FS.
+    parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]]
+
+    # Inside of the base location for cached wheels, expand our parts and join
+    # them all together.
+    return os.path.join(cache_dir, "wheels", *parts)
+
+
+def cached_wheel(cache_dir, link, format_control, package_name):
+    if not cache_dir:
+        return link
+    if not link:
+        return link
+    if link.is_wheel:
+        return link
+    if not link.is_artifact:
+        return link
+    if not package_name:
+        return link
+    canonical_name = canonicalize_name(package_name)
+    formats = pip.index.fmt_ctl_formats(format_control, canonical_name)
+    if "binary" not in formats:
+        return link
+    root = _cache_for_link(cache_dir, link)
+    try:
+        wheel_names = os.listdir(root)
+    except OSError as e:
+        if e.errno in (errno.ENOENT, errno.ENOTDIR):
+            return link
+        raise
+    candidates = []
+    for wheel_name in wheel_names:
+        try:
+            wheel = Wheel(wheel_name)
+        except InvalidWheelFilename:
+            continue
+        if not wheel.supported():
+            # Built for a different python/arch/etc
+            continue
+        candidates.append((wheel.support_index_min(), wheel_name))
+    if not candidates:
+        return link
+    candidates.sort()
+    path = os.path.join(root, candidates[0][1])
+    return pip.index.Link(path_to_url(path))
+
+
+def rehash(path, algo='sha256', blocksize=1 << 20):
+    """Return (hash, length) for path using hashlib.new(algo)"""
+    h = hashlib.new(algo)
+    length = 0
+    with open(path, 'rb') as f:
+        for block in read_chunks(f, size=blocksize):
+            length += len(block)
+            h.update(block)
+    digest = 'sha256=' + urlsafe_b64encode(
+        h.digest()
+    ).decode('latin1').rstrip('=')
+    return (digest, length)
+
+
+def open_for_csv(name, mode):
+    if sys.version_info[0] < 3:
+        nl = {}
+        bin = 'b'
+    else:
+        nl = {'newline': ''}
+        bin = ''
+    return open(name, mode + bin, **nl)
+
+
+def fix_script(path):
+    """Replace #!python with #!/path/to/python
+    Return True if file was changed."""
+    # XXX RECORD hashes will need to be updated
+    if os.path.isfile(path):
+        with open(path, 'rb') as script:
+            firstline = script.readline()
+            if not firstline.startswith(b'#!python'):
+                return False
+            exename = sys.executable.encode(sys.getfilesystemencoding())
+            firstline = b'#!' + exename + os.linesep.encode("ascii")
+            rest = script.read()
+        with open(path, 'wb') as script:
+            script.write(firstline)
+            script.write(rest)
+        return True
+
+dist_info_re = re.compile(r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>\d.+?))?)
+                                \.dist-info$""", re.VERBOSE)
+
+
+def root_is_purelib(name, wheeldir):
+    """
+    Return True if the extracted wheel in wheeldir should go into purelib.
+    """
+    name_folded = name.replace("-", "_")
+    for item in os.listdir(wheeldir):
+        match = dist_info_re.match(item)
+        if match and match.group('name') == name_folded:
+            with open(os.path.join(wheeldir, item, 'WHEEL')) as wheel:
+                for line in wheel:
+                    line = line.lower().rstrip()
+                    if line == "root-is-purelib: true":
+                        return True
+    return False
+
+
+def get_entrypoints(filename):
+    if not os.path.exists(filename):
+        return {}, {}
+
+    # This is done because you can pass a string to entry_points wrappers which
+    # means that they may or may not be valid INI files. The attempt here is to
+    # strip leading and trailing whitespace in order to make them valid INI
+    # files.
+    with open(filename) as fp:
+        data = StringIO()
+        for line in fp:
+            data.write(line.strip())
+            data.write("\n")
+        data.seek(0)
+
+    cp = configparser.RawConfigParser()
+    cp.optionxform = lambda option: option
+    cp.readfp(data)
+
+    console = {}
+    gui = {}
+    if cp.has_section('console_scripts'):
+        console = dict(cp.items('console_scripts'))
+    if cp.has_section('gui_scripts'):
+        gui = dict(cp.items('gui_scripts'))
+    return console, gui
+
+
+def move_wheel_files(name, req, wheeldir, user=False, home=None, root=None,
+                     pycompile=True, scheme=None, isolated=False, prefix=None):
+    """Install a wheel"""
+
+    if not scheme:
+        scheme = distutils_scheme(
+            name, user=user, home=home, root=root, isolated=isolated,
+            prefix=prefix,
+        )
+
+    if root_is_purelib(name, wheeldir):
+        lib_dir = scheme['purelib']
+    else:
+        lib_dir = scheme['platlib']
+
+    info_dir = []
+    data_dirs = []
+    source = wheeldir.rstrip(os.path.sep) + os.path.sep
+
+    # Record details of the files moved
+    #   installed = files copied from the wheel to the destination
+    #   changed = files changed while installing (scripts #! line typically)
+    #   generated = files newly generated during the install (script wrappers)
+    installed = {}
+    changed = set()
+    generated = []
+
+    # Compile all of the pyc files that we're going to be installing
+    if pycompile:
+        with captured_stdout() as stdout:
+            with warnings.catch_warnings():
+                warnings.filterwarnings('ignore')
+                compileall.compile_dir(source, force=True, quiet=True)
+        logger.debug(stdout.getvalue())
+
+    def normpath(src, p):
+        return os.path.relpath(src, p).replace(os.path.sep, '/')
+
+    def record_installed(srcfile, destfile, modified=False):
+        """Map archive RECORD paths to installation RECORD paths."""
+        oldpath = normpath(srcfile, wheeldir)
+        newpath = normpath(destfile, lib_dir)
+        installed[oldpath] = newpath
+        if modified:
+            changed.add(destfile)
+
+    def clobber(source, dest, is_base, fixer=None, filter=None):
+        ensure_dir(dest)  # common for the 'include' path
+
+        for dir, subdirs, files in os.walk(source):
+            basedir = dir[len(source):].lstrip(os.path.sep)
+            destdir = os.path.join(dest, basedir)
+            if is_base and basedir.split(os.path.sep, 1)[0].endswith('.data'):
+                continue
+            for s in subdirs:
+                destsubdir = os.path.join(dest, basedir, s)
+                if is_base and basedir == '' and destsubdir.endswith('.data'):
+                    data_dirs.append(s)
+                    continue
+                elif (is_base and
+                        s.endswith('.dist-info') and
+                        canonicalize_name(s).startswith(
+                            canonicalize_name(req.name))):
+                    assert not info_dir, ('Multiple .dist-info directories: ' +
+                                          destsubdir + ', ' +
+                                          ', '.join(info_dir))
+                    info_dir.append(destsubdir)
+            for f in files:
+                # Skip unwanted files
+                if filter and filter(f):
+                    continue
+                srcfile = os.path.join(dir, f)
+                destfile = os.path.join(dest, basedir, f)
+                # directory creation is lazy and after the file filtering above
+                # to ensure we don't install empty dirs; empty dirs can't be
+                # uninstalled.
+                ensure_dir(destdir)
+
+                # We use copyfile (not move, copy, or copy2) to be extra sure
+                # that we are not moving directories over (copyfile fails for
+                # directories) as well as to ensure that we are not copying
+                # over any metadata because we want more control over what
+                # metadata we actually copy over.
+                shutil.copyfile(srcfile, destfile)
+
+                # Copy over the metadata for the file, currently this only
+                # includes the atime and mtime.
+                st = os.stat(srcfile)
+                if hasattr(os, "utime"):
+                    os.utime(destfile, (st.st_atime, st.st_mtime))
+
+                # If our file is executable, then make our destination file
+                # executable.
+                if os.access(srcfile, os.X_OK):
+                    st = os.stat(srcfile)
+                    permissions = (
+                        st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
+                    )
+                    os.chmod(destfile, permissions)
+
+                changed = False
+                if fixer:
+                    changed = fixer(destfile)
+                record_installed(srcfile, destfile, changed)
+
+    clobber(source, lib_dir, True)
+
+    assert info_dir, "%s .dist-info directory not found" % req
+
+    # Get the defined entry points
+    ep_file = os.path.join(info_dir[0], 'entry_points.txt')
+    console, gui = get_entrypoints(ep_file)
+
+    def is_entrypoint_wrapper(name):
+        # EP, EP.exe and EP-script.py are scripts generated for
+        # entry point EP by setuptools
+        if name.lower().endswith('.exe'):
+            matchname = name[:-4]
+        elif name.lower().endswith('-script.py'):
+            matchname = name[:-10]
+        elif name.lower().endswith(".pya"):
+            matchname = name[:-4]
+        else:
+            matchname = name
+        # Ignore setuptools-generated scripts
+        return (matchname in console or matchname in gui)
+
+    for datadir in data_dirs:
+        fixer = None
+        filter = None
+        for subdir in os.listdir(os.path.join(wheeldir, datadir)):
+            fixer = None
+            if subdir == 'scripts':
+                fixer = fix_script
+                filter = is_entrypoint_wrapper
+            source = os.path.join(wheeldir, datadir, subdir)
+            dest = scheme[subdir]
+            clobber(source, dest, False, fixer=fixer, filter=filter)
+
+    maker = ScriptMaker(None, scheme['scripts'])
+
+    # Ensure old scripts are overwritten.
+    # See https://github.com/pypa/pip/issues/1800
+    maker.clobber = True
+
+    # Ensure we don't generate any variants for scripts because this is almost
+    # never what somebody wants.
+    # See https://bitbucket.org/pypa/distlib/issue/35/
+    maker.variants = set(('', ))
+
+    # This is required because otherwise distlib creates scripts that are not
+    # executable.
+    # See https://bitbucket.org/pypa/distlib/issue/32/
+    maker.set_mode = True
+
+    # Simplify the script and fix the fact that the default script swallows
+    # every single stack trace.
+    # See https://bitbucket.org/pypa/distlib/issue/34/
+    # See https://bitbucket.org/pypa/distlib/issue/33/
+    def _get_script_text(entry):
+        if entry.suffix is None:
+            raise InstallationError(
+                "Invalid script entry point: %s for req: %s - A callable "
+                "suffix is required. Cf https://packaging.python.org/en/"
+                "latest/distributing.html#console-scripts for more "
+                "information." % (entry, req)
+            )
+        return maker.script_template % {
+            "module": entry.prefix,
+            "import_name": entry.suffix.split(".")[0],
+            "func": entry.suffix,
+        }
+
+    maker._get_script_text = _get_script_text
+    maker.script_template = """# -*- coding: utf-8 -*-
+import re
+import sys
+
+from %(module)s import %(import_name)s
+
+if __name__ == '__main__':
+    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
+    sys.exit(%(func)s())
+"""
+
+    # Special case pip and setuptools to generate versioned wrappers
+    #
+    # The issue is that some projects (specifically, pip and setuptools) use
+    # code in setup.py to create "versioned" entry points - pip2.7 on Python
+    # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into
+    # the wheel metadata at build time, and so if the wheel is installed with
+    # a *different* version of Python the entry points will be wrong. The
+    # correct fix for this is to enhance the metadata to be able to describe
+    # such versioned entry points, but that won't happen till Metadata 2.0 is
+    # available.
+    # In the meantime, projects using versioned entry points will either have
+    # incorrect versioned entry points, or they will not be able to distribute
+    # "universal" wheels (i.e., they will need a wheel per Python version).
+    #
+    # Because setuptools and pip are bundled with _ensurepip and virtualenv,
+    # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we
+    # override the versioned entry points in the wheel and generate the
+    # correct ones. This code is purely a short-term measure until Metadata 2.0
+    # is available.
+    #
+    # To add the level of hack in this section of code, in order to support
+    # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment
+    # variable which will control which version scripts get installed.
+    #
+    # ENSUREPIP_OPTIONS=altinstall
+    #   - Only pipX.Y and easy_install-X.Y will be generated and installed
+    # ENSUREPIP_OPTIONS=install
+    #   - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note
+    #     that this option is technically if ENSUREPIP_OPTIONS is set and is
+    #     not altinstall
+    # DEFAULT
+    #   - The default behavior is to install pip, pipX, pipX.Y, easy_install
+    #     and easy_install-X.Y.
+    pip_script = console.pop('pip', None)
+    if pip_script:
+        if "ENSUREPIP_OPTIONS" not in os.environ:
+            spec = 'pip = ' + pip_script
+            generated.extend(maker.make(spec))
+
+        if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall":
+            spec = 'pip%s = %s' % (sys.version[:1], pip_script)
+            generated.extend(maker.make(spec))
+
+        spec = 'pip%s = %s' % (sys.version[:3], pip_script)
+        generated.extend(maker.make(spec))
+        # Delete any other versioned pip entry points
+        pip_ep = [k for k in console if re.match(r'pip(\d(\.\d)?)?$', k)]
+        for k in pip_ep:
+            del console[k]
+    easy_install_script = console.pop('easy_install', None)
+    if easy_install_script:
+        if "ENSUREPIP_OPTIONS" not in os.environ:
+            spec = 'easy_install = ' + easy_install_script
+            generated.extend(maker.make(spec))
+
+        spec = 'easy_install-%s = %s' % (sys.version[:3], easy_install_script)
+        generated.extend(maker.make(spec))
+        # Delete any other versioned easy_install entry points
+        easy_install_ep = [
+            k for k in console if re.match(r'easy_install(-\d\.\d)?$', k)
+        ]
+        for k in easy_install_ep:
+            del console[k]
+
+    # Generate the console and GUI entry points specified in the wheel
+    if len(console) > 0:
+        generated.extend(
+            maker.make_multiple(['%s = %s' % kv for kv in console.items()])
+        )
+    if len(gui) > 0:
+        generated.extend(
+            maker.make_multiple(
+                ['%s = %s' % kv for kv in gui.items()],
+                {'gui': True}
+            )
+        )
+
+    # Record pip as the installer
+    installer = os.path.join(info_dir[0], 'INSTALLER')
+    temp_installer = os.path.join(info_dir[0], 'INSTALLER.pip')
+    with open(temp_installer, 'wb') as installer_file:
+        installer_file.write(b'pip\n')
+    shutil.move(temp_installer, installer)
+    generated.append(installer)
+
+    # Record details of all files installed
+    record = os.path.join(info_dir[0], 'RECORD')
+    temp_record = os.path.join(info_dir[0], 'RECORD.pip')
+    with open_for_csv(record, 'r') as record_in:
+        with open_for_csv(temp_record, 'w+') as record_out:
+            reader = csv.reader(record_in)
+            writer = csv.writer(record_out)
+            for row in reader:
+                row[0] = installed.pop(row[0], row[0])
+                if row[0] in changed:
+                    row[1], row[2] = rehash(row[0])
+                writer.writerow(row)
+            for f in generated:
+                h, l = rehash(f)
+                writer.writerow((normpath(f, lib_dir), h, l))
+            for f in installed:
+                writer.writerow((installed[f], '', ''))
+    shutil.move(temp_record, record)
+
+
+def _unique(fn):
+    @functools.wraps(fn)
+    def unique(*args, **kw):
+        seen = set()
+        for item in fn(*args, **kw):
+            if item not in seen:
+                seen.add(item)
+                yield item
+    return unique
+
+
+# TODO: this goes somewhere besides the wheel module
+@_unique
+def uninstallation_paths(dist):
+    """
+    Yield all the uninstallation paths for dist based on RECORD-without-.pyc
+
+    Yield paths to all the files in RECORD. For each .py file in RECORD, add
+    the .pyc in the same directory.
+
+    UninstallPathSet.add() takes care of the __pycache__ .pyc.
+    """
+    from pip.utils import FakeFile  # circular import
+    r = csv.reader(FakeFile(dist.get_metadata_lines('RECORD')))
+    for row in r:
+        path = os.path.join(dist.location, row[0])
+        yield path
+        if path.endswith('.py'):
+            dn, fn = os.path.split(path)
+            base = fn[:-3]
+            path = os.path.join(dn, base + '.pyc')
+            yield path
+
+
+def wheel_version(source_dir):
+    """
+    Return the Wheel-Version of an extracted wheel, if possible.
+
+    Otherwise, return False if we couldn't parse / extract it.
+    """
+    try:
+        dist = [d for d in pkg_resources.find_on_path(None, source_dir)][0]
+
+        wheel_data = dist.get_metadata('WHEEL')
+        wheel_data = Parser().parsestr(wheel_data)
+
+        version = wheel_data['Wheel-Version'].strip()
+        version = tuple(map(int, version.split('.')))
+        return version
+    except:
+        return False
+
+
+def check_compatibility(version, name):
+    """
+    Raises errors or warns if called with an incompatible Wheel-Version.
+
+    Pip should refuse to install a Wheel-Version that's a major series
+    ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when
+    installing a version only minor version ahead (e.g 1.2 > 1.1).
+
+    version: a 2-tuple representing a Wheel-Version (Major, Minor)
+    name: name of wheel or package to raise exception about
+
+    :raises UnsupportedWheel: when an incompatible Wheel-Version is given
+    """
+    if not version:
+        raise UnsupportedWheel(
+            "%s is in an unsupported or invalid wheel" % name
+        )
+    if version[0] > VERSION_COMPATIBLE[0]:
+        raise UnsupportedWheel(
+            "%s's Wheel-Version (%s) is not compatible with this version "
+            "of pip" % (name, '.'.join(map(str, version)))
+        )
+    elif version > VERSION_COMPATIBLE:
+        logger.warning(
+            'Installing from a newer Wheel-Version (%s)',
+            '.'.join(map(str, version)),
+        )
+
+
+class Wheel(object):
+    """A wheel file"""
+
+    # TODO: maybe move the install code into this class
+
+    wheel_file_re = re.compile(
+        r"""^(?P<namever>(?P<name>.+?)-(?P<ver>\d.*?))
+        ((-(?P<build>\d.*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?)
+        \.whl|\.dist-info)$""",
+        re.VERBOSE
+    )
+
+    def __init__(self, filename):
+        """
+        :raises InvalidWheelFilename: when the filename is invalid for a wheel
+        """
+        wheel_info = self.wheel_file_re.match(filename)
+        if not wheel_info:
+            raise InvalidWheelFilename(
+                "%s is not a valid wheel filename." % filename
+            )
+        self.filename = filename
+        self.name = wheel_info.group('name').replace('_', '-')
+        # we'll assume "_" means "-" due to wheel naming scheme
+        # (https://github.com/pypa/pip/issues/1150)
+        self.version = wheel_info.group('ver').replace('_', '-')
+        self.pyversions = wheel_info.group('pyver').split('.')
+        self.abis = wheel_info.group('abi').split('.')
+        self.plats = wheel_info.group('plat').split('.')
+
+        # All the tag combinations from this file
+        self.file_tags = set(
+            (x, y, z) for x in self.pyversions
+            for y in self.abis for z in self.plats
+        )
+
+    def support_index_min(self, tags=None):
+        """
+        Return the lowest index that one of the wheel's file_tag combinations
+        achieves in the supported_tags list e.g. if there are 8 supported tags,
+        and one of the file tags is first in the list, then return 0.  Returns
+        None is the wheel is not supported.
+        """
+        if tags is None:  # for mock
+            tags = pep425tags.supported_tags
+        indexes = [tags.index(c) for c in self.file_tags if c in tags]
+        return min(indexes) if indexes else None
+
+    def supported(self, tags=None):
+        """Is this wheel supported on this system?"""
+        if tags is None:  # for mock
+            tags = pep425tags.supported_tags
+        return bool(set(tags).intersection(self.file_tags))
+
+
+class WheelBuilder(object):
+    """Build wheels from a RequirementSet."""
+
+    def __init__(self, requirement_set, finder, build_options=None,
+                 global_options=None):
+        self.requirement_set = requirement_set
+        self.finder = finder
+        self._cache_root = requirement_set._wheel_cache._cache_dir
+        self._wheel_dir = requirement_set.wheel_download_dir
+        self.build_options = build_options or []
+        self.global_options = global_options or []
+
+    def _build_one(self, req, output_dir, python_tag=None):
+        """Build one wheel.
+
+        :return: The filename of the built wheel, or None if the build failed.
+        """
+        tempd = tempfile.mkdtemp('pip-wheel-')
+        try:
+            if self.__build_one(req, tempd, python_tag=python_tag):
+                try:
+                    wheel_name = os.listdir(tempd)[0]
+                    wheel_path = os.path.join(output_dir, wheel_name)
+                    shutil.move(os.path.join(tempd, wheel_name), wheel_path)
+                    logger.info('Stored in directory: %s', output_dir)
+                    return wheel_path
+                except:
+                    pass
+            # Ignore return, we can't do anything else useful.
+            self._clean_one(req)
+            return None
+        finally:
+            rmtree(tempd)
+
+    def _base_setup_args(self, req):
+        return [
+            sys.executable, "-u", '-c',
+            SETUPTOOLS_SHIM % req.setup_py
+        ] + list(self.global_options)
+
+    def __build_one(self, req, tempd, python_tag=None):
+        base_args = self._base_setup_args(req)
+
+        spin_message = 'Running setup.py bdist_wheel for %s' % (req.name,)
+        with open_spinner(spin_message) as spinner:
+            logger.debug('Destination directory: %s', tempd)
+            wheel_args = base_args + ['bdist_wheel', '-d', tempd] \
+                + self.build_options
+
+            if python_tag is not None:
+                wheel_args += ["--python-tag", python_tag]
+
+            try:
+                call_subprocess(wheel_args, cwd=req.setup_py_dir,
+                                show_stdout=False, spinner=spinner)
+                return True
+            except:
+                spinner.finish("error")
+                logger.error('Failed building wheel for %s', req.name)
+                return False
+
+    def _clean_one(self, req):
+        base_args = self._base_setup_args(req)
+
+        logger.info('Running setup.py clean for %s', req.name)
+        clean_args = base_args + ['clean', '--all']
+        try:
+            call_subprocess(clean_args, cwd=req.source_dir, show_stdout=False)
+            return True
+        except:
+            logger.error('Failed cleaning build dir for %s', req.name)
+            return False
+
+    def build(self, autobuilding=False):
+        """Build wheels.
+
+        :param unpack: If True, replace the sdist we built from with the
+            newly built wheel, in preparation for installation.
+        :return: True if all the wheels built correctly.
+        """
+        assert self._wheel_dir or (autobuilding and self._cache_root)
+        # unpack sdists and constructs req set
+        self.requirement_set.prepare_files(self.finder)
+
+        reqset = self.requirement_set.requirements.values()
+
+        buildset = []
+        for req in reqset:
+            if req.constraint:
+                continue
+            if req.is_wheel:
+                if not autobuilding:
+                    logger.info(
+                        'Skipping %s, due to already being wheel.', req.name)
+            elif autobuilding and req.editable:
+                pass
+            elif autobuilding and req.link and not req.link.is_artifact:
+                pass
+            elif autobuilding and not req.source_dir:
+                pass
+            else:
+                if autobuilding:
+                    link = req.link
+                    base, ext = link.splitext()
+                    if pip.index.egg_info_matches(base, None, link) is None:
+                        # Doesn't look like a package - don't autobuild a wheel
+                        # because we'll have no way to lookup the result sanely
+                        continue
+                    if "binary" not in pip.index.fmt_ctl_formats(
+                            self.finder.format_control,
+                            canonicalize_name(req.name)):
+                        logger.info(
+                            "Skipping bdist_wheel for %s, due to binaries "
+                            "being disabled for it.", req.name)
+                        continue
+                buildset.append(req)
+
+        if not buildset:
+            return True
+
+        # Build the wheels.
+        logger.info(
+            'Building wheels for collected packages: %s',
+            ', '.join([req.name for req in buildset]),
+        )
+        with indent_log():
+            build_success, build_failure = [], []
+            for req in buildset:
+                python_tag = None
+                if autobuilding:
+                    python_tag = pep425tags.implementation_tag
+                    output_dir = _cache_for_link(self._cache_root, req.link)
+                    try:
+                        ensure_dir(output_dir)
+                    except OSError as e:
+                        logger.warning("Building wheel for %s failed: %s",
+                                       req.name, e)
+                        build_failure.append(req)
+                        continue
+                else:
+                    output_dir = self._wheel_dir
+                wheel_file = self._build_one(
+                    req, output_dir,
+                    python_tag=python_tag,
+                )
+                if wheel_file:
+                    build_success.append(req)
+                    if autobuilding:
+                        # XXX: This is mildly duplicative with prepare_files,
+                        # but not close enough to pull out to a single common
+                        # method.
+                        # The code below assumes temporary source dirs -
+                        # prevent it doing bad things.
+                        if req.source_dir and not os.path.exists(os.path.join(
+                                req.source_dir, PIP_DELETE_MARKER_FILENAME)):
+                            raise AssertionError(
+                                "bad source dir - missing marker")
+                        # Delete the source we built the wheel from
+                        req.remove_temporary_source()
+                        # set the build directory again - name is known from
+                        # the work prepare_files did.
+                        req.source_dir = req.build_location(
+                            self.requirement_set.build_dir)
+                        # Update the link for this.
+                        req.link = pip.index.Link(
+                            path_to_url(wheel_file))
+                        assert req.link.is_wheel
+                        # extract the wheel into the dir
+                        unpack_url(
+                            req.link, req.source_dir, None, False,
+                            session=self.requirement_set.session)
+                else:
+                    build_failure.append(req)
+
+        # notify success/failure
+        if build_success:
+            logger.info(
+                'Successfully built %s',
+                ' '.join([req.name for req in build_success]),
+            )
+        if build_failure:
+            logger.info(
+                'Failed to build %s',
+                ' '.join([req.name for req in build_failure]),
+            )
+        # Return True if all builds were successful
+        return len(build_failure) == 0
diff --git a/vendor/pip-9.0.3/setup.cfg b/vendor/pip-9.0.3/setup.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..d9f3c26b6074f8fc64035541cf535cfc659e1ff1
--- /dev/null
+++ b/vendor/pip-9.0.3/setup.cfg
@@ -0,0 +1,10 @@
+[pytest]
+addopts = --ignore pip/_vendor --ignore tests/tests_cache
+
+[bdist_wheel]
+universal = 1
+
+[egg_info]
+tag_build = 
+tag_date = 0
+
diff --git a/vendor/pip-9.0.3/setup.py b/vendor/pip-9.0.3/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..6de49987ec9b77b479300f27e3f7cf0968fff8a5
--- /dev/null
+++ b/vendor/pip-9.0.3/setup.py
@@ -0,0 +1,93 @@
+import codecs
+import os
+import re
+import sys
+
+from setuptools import setup, find_packages
+from setuptools.command.test import test as TestCommand
+
+
+here = os.path.abspath(os.path.dirname(__file__))
+
+
+class PyTest(TestCommand):
+
+    def finalize_options(self):
+        TestCommand.finalize_options(self)
+
+        self.test_args = []
+        self.test_suite = True
+
+    def run_tests(self):
+        # import here, cause outside the eggs aren't loaded
+        import pytest
+
+        sys.exit(pytest.main(self.test_args))
+
+
+def read(*parts):
+    # intentionally *not* adding an encoding option to open, See:
+    #   https://github.com/pypa/virtualenv/issues/201#issuecomment-3145690
+    return codecs.open(os.path.join(here, *parts), 'r').read()
+
+
+def find_version(*file_paths):
+    version_file = read(*file_paths)
+    version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]",
+                              version_file, re.M)
+    if version_match:
+        return version_match.group(1)
+    raise RuntimeError("Unable to find version string.")
+
+long_description = read('README.rst')
+
+tests_require = ['pytest', 'virtualenv>=1.10', 'scripttest>=1.3', 'mock',
+                 'pretend']
+
+
+setup(
+    name="pip",
+    version=find_version("pip", "__init__.py"),
+    description="The PyPA recommended tool for installing Python packages.",
+    long_description=long_description,
+    classifiers=[
+        "Development Status :: 5 - Production/Stable",
+        "Intended Audience :: Developers",
+        "License :: OSI Approved :: MIT License",
+        "Topic :: Software Development :: Build Tools",
+        "Programming Language :: Python :: 2",
+        "Programming Language :: Python :: 2.6",
+        "Programming Language :: Python :: 2.7",
+        "Programming Language :: Python :: 3",
+        "Programming Language :: Python :: 3.3",
+        "Programming Language :: Python :: 3.4",
+        "Programming Language :: Python :: 3.5",
+        "Programming Language :: Python :: Implementation :: PyPy"
+    ],
+    keywords='easy_install distutils setuptools egg virtualenv',
+    author='The pip developers',
+    author_email='python-virtualenv@groups.google.com',
+    url='https://pip.pypa.io/',
+    license='MIT',
+    packages=find_packages(exclude=["contrib", "docs", "tests*", "tasks"]),
+    package_data={
+        "pip._vendor.certifi": ["*.pem"],
+        "pip._vendor.requests": ["*.pem"],
+        "pip._vendor.distlib._backport": ["sysconfig.cfg"],
+        "pip._vendor.distlib": ["t32.exe", "t64.exe", "w32.exe", "w64.exe"],
+    },
+    entry_points={
+        "console_scripts": [
+            "pip=pip:main",
+            "pip%s=pip:main" % sys.version[:1],
+            "pip%s=pip:main" % sys.version[:3],
+        ],
+    },
+    tests_require=tests_require,
+    zip_safe=False,
+    python_requires='>=2.6,!=3.0.*,!=3.1.*,!=3.2.*',
+    extras_require={
+        'testing': tests_require,
+    },
+    cmdclass={'test': PyTest},
+)